diff --git a/packages/alias/package.json b/packages/alias/package.json index 192dfbeeb..c78496ed9 100755 --- a/packages/alias/package.json +++ b/packages/alias/package.json @@ -11,6 +11,9 @@ "homepage": "https://github.com/rollup/plugins/tree/master/packages/alias#readme", "bugs": "https://github.com/rollup/plugins/issues", "main": "dist/index.js", + "engines": { + "node": ">=8.0.0" + }, "scripts": { "build": "rollup -c", "ci:coverage": "nyc pnpm run test && nyc report --reporter=text-lcov > coverage.lcov", @@ -19,7 +22,7 @@ "ci:test": "pnpm run test -- --verbose", "lint": "pnpm run lint:js && pnpm run lint:docs && pnpm run lint:package", "lint:docs": "prettier --single-quote --write README.md", - "lint:js": "eslint --fix --cache src test", + "lint:js": "eslint --fix --cache src test --ext .js,.ts", "lint:package": "prettier --write package.json --plugin=prettier-plugin-package", "prebuild": "del-cli dist", "prepare": "pnpm run build", @@ -29,7 +32,7 @@ }, "files": [ "dist", - "src", + "types", "README.md", "LICENSE" ], @@ -47,16 +50,26 @@ }, "devDependencies": { "@rollup/plugin-node-resolve": "^7.0.0", + "@rollup/plugin-typescript": "^3.0.0", "del-cli": "^3.0.0", "rollup": "^1.27.14" }, "ava": { + "compileEnhancements": false, + "extensions": [ + "ts" + ], + "require": [ + "ts-node/register" + ], "files": [ "!**/fixtures/**", + "!**/output/**", "!**/helpers/**", "!**/recipes/**", "!**/types.ts" ] }, - "module": "dist/index.es2015.js" + "module": "dist/index.es.js", + "types": "types/index.d.ts" } diff --git a/packages/alias/rollup.config.js b/packages/alias/rollup.config.js index 4474606f1..576f0790e 100755 --- a/packages/alias/rollup.config.js +++ b/packages/alias/rollup.config.js @@ -1,10 +1,13 @@ +import typescript from '@rollup/plugin-typescript'; + import pkg from './package.json'; export default { - input: 'src/index.js', - external: [...Object.keys(pkg.dependencies), 'path', 'fs', 'os'], + input: 'src/index.ts', + external: [...Object.keys(pkg.dependencies), 'os'], output: [ { file: pkg.main, format: 'cjs' }, { file: pkg.module, format: 'es' } - ] + ], + plugins: [typescript()] }; diff --git a/packages/alias/src/index.js b/packages/alias/src/index.ts similarity index 63% rename from packages/alias/src/index.js rename to packages/alias/src/index.ts index c02eec113..adf322406 100755 --- a/packages/alias/src/index.js +++ b/packages/alias/src/index.ts @@ -1,13 +1,16 @@ import { platform } from 'os'; +import { PartialResolvedId, Plugin } from 'rollup'; import slash from 'slash'; +import { Alias, ResolverFunction, RollupAliasOptions } from '../types'; + const VOLUME = /^([A-Z]:)/i; const IS_WINDOWS = platform() === 'win32'; // Helper functions const noop = () => null; -const matches = (pattern, importee) => { +function matches(pattern: string | RegExp, importee: string) { if (pattern instanceof RegExp) { return pattern.test(importee); } @@ -20,16 +23,18 @@ const matches = (pattern, importee) => { const importeeStartsWithKey = importee.indexOf(pattern) === 0; const importeeHasSlashAfterKey = importee.substring(pattern.length)[0] === '/'; return importeeStartsWithKey && importeeHasSlashAfterKey; -}; +} -const normalizeId = (id) => { - if ((IS_WINDOWS && typeof id === 'string') || VOLUME.test(id)) { +function normalizeId(id: string): string; +function normalizeId(id: string | undefined): string | undefined; +function normalizeId(id: string | undefined) { + if (typeof id === 'string' && (IS_WINDOWS || VOLUME.test(id))) { return slash(id.replace(VOLUME, '')); } return id; -}; +} -const getEntries = ({ entries }) => { +function getEntries({ entries }: RollupAliasOptions): Alias[] { if (!entries) { return []; } @@ -38,17 +43,18 @@ const getEntries = ({ entries }) => { return entries; } - return Object.keys(entries).map((key) => { - return { find: key, replacement: entries[key] }; + return Object.entries(entries).map(([key, value]) => { + return { find: key, replacement: value }; }); -}; +} -export default function alias(options = {}) { +export default function alias(options: RollupAliasOptions = {}): Plugin { const entries = getEntries(options); // No aliases? if (entries.length === 0) { return { + name: 'alias', resolveId: noop }; } @@ -69,29 +75,29 @@ export default function alias(options = {}) { importeeId.replace(matchedEntry.find, matchedEntry.replacement) ); - let customResolver = null; + let customResolver: ResolverFunction | null = null; if (typeof matchedEntry.customResolver === 'function') { ({ customResolver } = matchedEntry); } else if ( typeof matchedEntry.customResolver === 'object' && - typeof matchedEntry.customResolver.resolveId === 'function' + typeof matchedEntry.customResolver!.resolveId === 'function' ) { - customResolver = matchedEntry.customResolver.resolveId; + customResolver = matchedEntry.customResolver!.resolveId; } else if (typeof options.customResolver === 'function') { ({ customResolver } = options); } else if ( typeof options.customResolver === 'object' && - typeof options.customResolver.resolveId === 'function' + typeof options.customResolver!.resolveId === 'function' ) { - customResolver = options.customResolver.resolveId; + customResolver = options.customResolver!.resolveId; } if (customResolver) { return customResolver(updatedId, importerId); } - return this.resolve(updatedId, importer, { skipSelf: true }).then((resolved) => { - let finalResult = resolved; + return this.resolve(updatedId, importer!, { skipSelf: true }).then((resolved) => { + let finalResult: PartialResolvedId | null = resolved; if (!finalResult) { finalResult = { id: updatedId }; } diff --git a/packages/alias/tsconfig.json b/packages/alias/tsconfig.json new file mode 100644 index 000000000..11a2c4d75 --- /dev/null +++ b/packages/alias/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "lib": ["es6"], + "module": "esnext" + }, + "include": [ + "src/**/*", + "types/**/*" + ] +} diff --git a/packages/alias/types/index.d.ts b/packages/alias/types/index.d.ts new file mode 100644 index 000000000..701286855 --- /dev/null +++ b/packages/alias/types/index.d.ts @@ -0,0 +1,38 @@ +import { Plugin, ResolveIdResult } from 'rollup'; + +export interface Alias { + find: string | RegExp; + replacement: string; + customResolver?: ResolverFunction | ResolverObject | null; +} + +export type ResolverFunction = ( + source: string, + importer: string | undefined +) => Promise | ResolveIdResult; + +export interface ResolverObject { + resolveId: ResolverFunction; +} + +export interface RollupAliasOptions { + /** + * Instructs the plugin to use an alternative resolving algorithm, + * rather than the Rollup's resolver. + * @default null + */ + customResolver?: ResolverFunction | ResolverObject | null; + + /** + * Specifies an `Object`, or an `Array` of `Object`, + * which defines aliases used to replace values in `import` or `require` statements. + * With either format, the order of the entries is important, + * in that the first defined rules are applied first. + */ + entries?: readonly Alias[] | { [find: string]: string }; +} + +/** + * 🍣 A Rollup plugin for defining aliases when bundling packages. + */ +export default function alias(options?: RollupAliasOptions): Plugin; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 713f2534b..5a43cf721 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,10 +56,12 @@ importers: slash: 3.0.0 devDependencies: '@rollup/plugin-node-resolve': 7.1.1_rollup@1.29.0 + '@rollup/plugin-typescript': 3.0.0_rollup@1.29.0 del-cli: 3.0.0 rollup: 1.29.0 specifiers: '@rollup/plugin-node-resolve': ^7.0.0 + '@rollup/plugin-typescript': ^3.0.0 del-cli: ^3.0.0 rollup: ^1.27.14 slash: ^3.0.0 @@ -1434,7 +1436,7 @@ packages: integrity: sha512-14ddhD7TnemeHE97a4rLOhobfYvUVcaYuqTnL8Ti7Jxi9V9Jr5LY7Gko4HZ5k4h4vqQM0gBQt6tsp9xXW94WPA== /@rollup/plugin-typescript/3.0.0_a8ccbbb8df3d541f86d9e2f77577b79b: dependencies: - '@rollup/pluginutils': 3.0.6_rollup@1.29.0 + '@rollup/pluginutils': 3.0.8_rollup@1.29.0 resolve: 1.15.0 rollup: 1.29.0 tslib: 1.10.0 @@ -1448,9 +1450,23 @@ packages: typescript: '>=2.1.0' resolution: integrity: sha512-O6915Ril3+Q0B4P898PULAcPFZfPuatEB/4nox7bnK48ekGrmamMYhMB5tOqWjihEWrw4oz/NL+c+/kS3Fk95g== + /@rollup/plugin-typescript/3.0.0_rollup@1.29.0: + dependencies: + '@rollup/pluginutils': 3.0.8_rollup@1.29.0 + resolve: 1.15.0 + rollup: 1.29.0 + dev: true + engines: + node: '>=8.0.0' + peerDependencies: + rollup: ^1.20.0 + tslib: '*' + typescript: '>=2.1.0' + resolution: + integrity: sha512-O6915Ril3+Q0B4P898PULAcPFZfPuatEB/4nox7bnK48ekGrmamMYhMB5tOqWjihEWrw4oz/NL+c+/kS3Fk95g== /@rollup/plugin-typescript/3.0.0_rollup@1.29.0+typescript@3.7.5: dependencies: - '@rollup/pluginutils': 3.0.6_rollup@1.29.0 + '@rollup/pluginutils': 3.0.8_rollup@1.29.0 resolve: 1.15.0 rollup: 1.29.0 typescript: 3.7.5 @@ -1465,7 +1481,7 @@ packages: integrity: sha512-O6915Ril3+Q0B4P898PULAcPFZfPuatEB/4nox7bnK48ekGrmamMYhMB5tOqWjihEWrw4oz/NL+c+/kS3Fk95g== /@rollup/plugin-typescript/3.0.0_typescript@3.7.5: dependencies: - '@rollup/pluginutils': 3.0.6 + '@rollup/pluginutils': 3.0.8 resolve: 1.15.0 typescript: 3.7.5 dev: true @@ -1498,27 +1514,6 @@ packages: rollup: ^1.20.0 resolution: integrity: sha512-buc0oeq2zqQu2mpMyvZgAaQvitikYjT/4JYhA4EXwxX8/g0ZGHoGiX+0AwmfhrNqH4oJv67gn80sTZFQ/jL1bw== - /@rollup/pluginutils/3.0.6: - dependencies: - estree-walker: 1.0.1 - dev: true - engines: - node: '>= 8.0.0' - peerDependencies: - rollup: ^1.20.0 - resolution: - integrity: sha512-Nb6U7sg11v8D+E4mxRxwT+UumUL7MSnwI8V1SJB3THyW2MOGD/Q6GyxLtpnjrbT3zTRPSozzDMyVZwemgldO3w== - /@rollup/pluginutils/3.0.6_rollup@1.29.0: - dependencies: - estree-walker: 1.0.1 - rollup: 1.29.0 - dev: true - engines: - node: '>= 8.0.0' - peerDependencies: - rollup: ^1.20.0 - resolution: - integrity: sha512-Nb6U7sg11v8D+E4mxRxwT+UumUL7MSnwI8V1SJB3THyW2MOGD/Q6GyxLtpnjrbT3zTRPSozzDMyVZwemgldO3w== /@rollup/pluginutils/3.0.8: dependencies: estree-walker: 1.0.1