diff --git a/build-plugins/add-cli-entry.js b/build-plugins/add-cli-entry.ts similarity index 83% rename from build-plugins/add-cli-entry.js rename to build-plugins/add-cli-entry.ts index dbb8446c8f6..07b6d7599e1 100644 --- a/build-plugins/add-cli-entry.js +++ b/build-plugins/add-cli-entry.ts @@ -1,6 +1,7 @@ import MagicString from 'magic-string'; +import { Plugin } from 'rollup'; -export default function addCliEntry() { +export default function addCliEntry(): Plugin { return { buildStart() { this.emitFile({ @@ -17,6 +18,7 @@ export default function addCliEntry() { magicString.prepend('#!/usr/bin/env node\n\n'); return { code: magicString.toString(), map: magicString.generateMap({ hires: true }) }; } + return null; } }; } diff --git a/build-plugins/conditional-fsevents-import.js b/build-plugins/conditional-fsevents-import.ts similarity index 91% rename from build-plugins/conditional-fsevents-import.js rename to build-plugins/conditional-fsevents-import.ts index d4acf2bd3c9..5378269cf20 100644 --- a/build-plugins/conditional-fsevents-import.js +++ b/build-plugins/conditional-fsevents-import.ts @@ -1,9 +1,10 @@ import MagicString from 'magic-string'; +import { Plugin } from 'rollup'; const FSEVENTS_REQUIRE = "require('fsevents')"; const REPLACEMENT = "require('../../../src/watch/fsevents-importer').getFsEvents()"; -export default function conditionalFsEventsImport() { +export default function conditionalFsEventsImport(): Plugin { let transformed = false; return { buildEnd(error) { diff --git a/build-plugins/emit-module-package-file.js b/build-plugins/emit-module-package-file.ts similarity index 64% rename from build-plugins/emit-module-package-file.js rename to build-plugins/emit-module-package-file.ts index c6a41ddfd04..cdf5dffaff0 100644 --- a/build-plugins/emit-module-package-file.js +++ b/build-plugins/emit-module-package-file.ts @@ -1,4 +1,6 @@ -export default function emitModulePackageFile() { +import { Plugin } from 'rollup'; + +export default function emitModulePackageFile(): Plugin { return { generateBundle() { this.emitFile({ fileName: 'package.json', source: `{"type":"module"}`, type: 'asset' }); diff --git a/build-plugins/esm-dynamic-import.js b/build-plugins/esm-dynamic-import.ts similarity index 80% rename from build-plugins/esm-dynamic-import.js rename to build-plugins/esm-dynamic-import.ts index 0e2a8e63478..3a2cfc6f18c 100644 --- a/build-plugins/esm-dynamic-import.js +++ b/build-plugins/esm-dynamic-import.ts @@ -1,4 +1,6 @@ -export default function addBinShebangAndEsmImport() { +import { Plugin } from 'rollup'; + +export default function addBinShebangAndEsmImport(): Plugin { let importFound = false; return { generateBundle() { diff --git a/build-plugins/generate-license-file.js b/build-plugins/generate-license-file.ts similarity index 73% rename from build-plugins/generate-license-file.js rename to build-plugins/generate-license-file.ts index 8073cf1476e..e64391c9617 100644 --- a/build-plugins/generate-license-file.js +++ b/build-plugins/generate-license-file.ts @@ -1,11 +1,12 @@ import fs from 'fs'; -import license from 'rollup-plugin-license'; +import { PluginImpl } from 'rollup'; +import license, { Dependency, Person } from 'rollup-plugin-license'; -function generateLicenseFile(dependencies) { +function generateLicenseFile(dependencies: Dependency[]) { const coreLicense = fs.readFileSync('LICENSE-CORE.md'); const licenses = new Set(); const dependencyLicenseTexts = dependencies - .sort(({ name: nameA }, { name: nameB }) => (nameA > nameB ? 1 : -1)) + .sort(({ name: nameA }, { name: nameB }) => (nameA! > nameB! ? 1 : -1)) .map(({ name, license, licenseText, author, maintainers, contributors, repository }) => { let text = `## ${name}\n`; if (license) { @@ -15,7 +16,8 @@ function generateLicenseFile(dependencies) { if (author && author.name) { names.add(author.name); } - for (const person of maintainers.concat(contributors)) { + // TODO there is an inconsistency in the rollup-plugin-license types + for (const person of contributors.concat(maintainers as unknown as Person[])) { if (person && person.name) { names.add(person.name); } @@ -24,7 +26,7 @@ function generateLicenseFile(dependencies) { text += `By: ${Array.from(names).join(', ')}\n`; } if (repository) { - text += `Repository: ${repository.url || repository}\n`; + text += `Repository: ${(typeof repository === 'object' && repository.url) || repository}\n`; } if (licenseText) { text += @@ -57,11 +59,14 @@ function generateLicenseFile(dependencies) { } } -export default function getLicenseHandler() { +export default function getLicenseHandler(): { + collectLicenses: PluginImpl; + writeLicense: PluginImpl; +} { const licenses = new Map(); return { collectLicenses() { - function addLicenses(dependencies) { + function addLicenses(dependencies: Dependency[]) { for (const dependency of dependencies) { licenses.set(dependency.name, dependency); } @@ -71,6 +76,7 @@ export default function getLicenseHandler() { }, writeLicense() { return { + name: 'write-license', writeBundle() { generateLicenseFile(Array.from(licenses.values())); } diff --git a/build-plugins/replace-browser-modules.js b/build-plugins/replace-browser-modules.ts similarity index 88% rename from build-plugins/replace-browser-modules.js rename to build-plugins/replace-browser-modules.ts index 9e004c5ffd9..9ffb7a8cc07 100644 --- a/build-plugins/replace-browser-modules.js +++ b/build-plugins/replace-browser-modules.ts @@ -1,11 +1,12 @@ import path from 'path'; +import { Plugin } from 'rollup'; const ID_CRYPTO = path.resolve('src/utils/crypto'); const ID_FS = path.resolve('src/utils/fs'); const ID_PATH = path.resolve('src/utils/path'); const ID_RESOLVEID = path.resolve('src/utils/resolveId'); -export default function replaceBrowserModules() { +export default function replaceBrowserModules(): Plugin { return { name: 'replace-browser-modules', resolveId: (source, importee) => { diff --git a/package-lock.json b/package-lock.json index aeba1730073..9b46f6a86e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -545,16 +545,6 @@ "magic-string": "^0.25.7" } }, - "@rollup/plugin-typescript": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.1.tgz", - "integrity": "sha512-Qd2E1pleDR4bwyFxqbjt4eJf+wB0UKVMLc7/BAFDGVdAXQMCsD4DUv5/7/ww47BZCYxWtJqe1Lo0KVNswBJlRw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "resolve": "^1.17.0" - } - }, "@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", @@ -4243,12 +4233,12 @@ } }, "rollup": { - "version": "2.51.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.51.2.tgz", - "integrity": "sha512-ReV2eGEadA7hmXSzjxdDKs10neqH2QURf2RxJ6ayAlq93ugy6qIvXMmbc5cWMGCDh1h5T4thuWO1e2VNbMq8FA==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.52.0.tgz", + "integrity": "sha512-lSkBDGsVoXjqaBf7dsHwxBJz+p+hJEP72P+LOitA0yVs+Nzxj76FidkZE2thrmhjwGqLYiJo39opi7mAfaQ/Vg==", "dev": true, "requires": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "rollup-plugin-license": { diff --git a/package.json b/package.json index 1fa51617430..7546091d891 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,9 @@ "rollup": "dist/bin/rollup" }, "scripts": { - "build": "shx rm -rf dist && git rev-parse HEAD > .commithash && rollup -c && shx cp src/rollup/types.d.ts dist/rollup.d.ts && shx chmod a+x dist/bin/rollup", - "build:cjs": "shx rm -rf dist && rollup -c --configTest && shx cp src/rollup/types.d.ts dist/rollup.d.ts && shx chmod a+x dist/bin/rollup", - "build:bootstrap": "dist/bin/rollup -c && shx cp src/rollup/types.d.ts dist/rollup.d.ts && shx chmod a+x dist/bin/rollup", + "build": "shx rm -rf dist && git rev-parse HEAD > .commithash && rollup --config rollup.config.ts --configPlugin typescript && shx cp src/rollup/types.d.ts dist/rollup.d.ts && shx chmod a+x dist/bin/rollup", + "build:cjs": "shx rm -rf dist && rollup --config rollup.config.ts --configPlugin typescript --configTest && shx cp src/rollup/types.d.ts dist/rollup.d.ts && shx chmod a+x dist/bin/rollup", + "build:bootstrap": "dist/bin/rollup --config rollup.config.ts --configPlugin typescript && shx cp src/rollup/types.d.ts dist/rollup.d.ts && shx chmod a+x dist/bin/rollup", "ci:lint": "npm run lint:nofix", "ci:test": "npm run build:cjs && npm run build:bootstrap && npm run test:all", "ci:test:only": "npm run build:cjs && npm run build:bootstrap && npm run test:only", @@ -38,7 +38,7 @@ "test:only": "mocha test/test.js", "test:typescript": "shx rm -rf test/typescript/dist && shx cp -r dist test/typescript/ && tsc --noEmit -p test/typescript && tsc --noEmit", "test:browser": "mocha test/browser/index.js", - "watch": "rollup -cw" + "watch": "rollup --config rollup.config.ts --configPlugin typescript --watch" }, "repository": "rollup/rollup", "keywords": [ @@ -64,7 +64,6 @@ "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^13.0.0", "@rollup/plugin-replace": "^2.4.2", - "@rollup/plugin-typescript": "^8.2.1", "@types/micromatch": "^4.0.1", "@types/node": "^10.17.60", "@types/require-relative": "^0.8.0", @@ -104,7 +103,7 @@ "pretty-ms": "^7.0.1", "require-relative": "^0.8.7", "requirejs": "^2.3.6", - "rollup": "^2.51.2", + "rollup": "^2.52.0", "rollup-plugin-license": "^2.5.0", "rollup-plugin-string": "^3.0.0", "rollup-plugin-terser": "^7.0.2", diff --git a/rollup.config.js b/rollup.config.ts similarity index 86% rename from rollup.config.js rename to rollup.config.ts index 110e503a0ca..c8bedf94311 100644 --- a/rollup.config.js +++ b/rollup.config.ts @@ -4,15 +4,16 @@ import alias from '@rollup/plugin-alias'; import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; import resolve from '@rollup/plugin-node-resolve'; +import { RollupOptions, WarningHandlerWithDefault } from 'rollup'; import { string } from 'rollup-plugin-string'; import { terser } from 'rollup-plugin-terser'; import typescript from 'rollup-plugin-typescript'; -import addCliEntry from './build-plugins/add-cli-entry.js'; +import addCliEntry from './build-plugins/add-cli-entry'; import conditionalFsEventsImport from './build-plugins/conditional-fsevents-import'; -import emitModulePackageFile from './build-plugins/emit-module-package-file.js'; -import esmDynamicImport from './build-plugins/esm-dynamic-import.js'; +import emitModulePackageFile from './build-plugins/emit-module-package-file'; +import esmDynamicImport from './build-plugins/esm-dynamic-import'; import getLicenseHandler from './build-plugins/generate-license-file'; -import replaceBrowserModules from './build-plugins/replace-browser-modules.js'; +import replaceBrowserModules from './build-plugins/replace-browser-modules'; import pkg from './package.json'; const commitHash = (function () { @@ -24,7 +25,9 @@ const commitHash = (function () { })(); const now = new Date( - process.env.SOURCE_DATE_EPOCH ? process.env.SOURCE_DATE_EPOCH * 1000 : new Date().getTime() + process.env.SOURCE_DATE_EPOCH + ? 1000 * parseInt(process.env.SOURCE_DATE_EPOCH) + : new Date().getTime() ).toUTCString(); const banner = `/* @@ -37,7 +40,7 @@ const banner = `/* Released under the MIT License. */`; -const onwarn = warning => { +const onwarn: WarningHandlerWithDefault = warning => { // eslint-disable-next-line no-console console.error( 'Building Rollup produced warnings that need to be resolved. ' + @@ -71,9 +74,9 @@ const nodePlugins = [ typescript() ]; -export default command => { +export default (command: Record): RollupOptions | RollupOptions[] => { const { collectLicenses, writeLicense } = getLicenseHandler(); - const commonJSBuild = { + const commonJSBuild: RollupOptions = { // fsevents is a dependency of chokidar that cannot be bundled as it contains binary code external: [ 'buffer', @@ -118,7 +121,8 @@ export default command => { ...nodePlugins, addCliEntry(), esmDynamicImport(), - !command.configTest && collectLicenses() + // TODO this relied on an unpublished type update + (!command.configTest && collectLicenses()) as Plugin ], strictDeprecations: true, treeshake @@ -128,7 +132,7 @@ export default command => { return commonJSBuild; } - const esmBuild = { + const esmBuild: RollupOptions = { ...commonJSBuild, input: { 'rollup.js': 'src/node-entry.ts' }, output: { @@ -141,7 +145,7 @@ export default command => { plugins: [...nodePlugins, emitModulePackageFile(), collectLicenses()] }; - const browserBuilds = { + const browserBuilds: RollupOptions = { input: 'src/browser-entry.ts', onwarn, output: [ diff --git a/src/utils/ensureArray.ts b/src/utils/ensureArray.ts index f108c6b3454..080d73ae226 100644 --- a/src/utils/ensureArray.ts +++ b/src/utils/ensureArray.ts @@ -1,4 +1,6 @@ -export function ensureArray(items: (T | null | undefined)[] | T | null | undefined): T[] { +export function ensureArray( + items: (T | false | null | undefined)[] | T | false | null | undefined +): T[] { if (Array.isArray(items)) { return items.filter(Boolean) as T[]; } diff --git a/src/utils/renderChunk.ts b/src/utils/renderChunk.ts index 08a979bf61f..ac0c63e62a5 100644 --- a/src/utils/renderChunk.ts +++ b/src/utils/renderChunk.ts @@ -23,7 +23,7 @@ export default function renderChunk({ }): Promise { const renderChunkReducer = ( code: string, - result: { code: string; map?: SourceMapInput } | string | null, + result: { code: string; map?: SourceMapInput } | string | null | undefined, plugin: Plugin ): string => { if (result == null) return code; diff --git a/tsconfig.json b/tsconfig.json index 94397632d03..bbbd924248b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,10 +9,11 @@ "noUnusedLocals": true, "noUnusedParameters": true, "pretty": true, + "resolveJsonModule": true, "skipLibCheck": true, "strict": true, "target": "es2018" }, - "include": ["typings/**/*.d.ts", "src", "cli", "browser"], + "include": ["typings/**/*.d.ts", "src", "cli", "browser", "rollup.config.ts"], "exclude": ["dist", "node_modules", "test/typescript"] } diff --git a/typings/declarations.d.ts b/typings/declarations.d.ts index c32c42312d7..7e9fe302618 100644 --- a/typings/declarations.d.ts +++ b/typings/declarations.d.ts @@ -5,6 +5,15 @@ declare module 'help.md' { } // external libs +declare module 'rollup-plugin-string' { + export const string: import('rollup').PluginImpl; +} + +declare module 'rollup-plugin-typescript' { + const typescript: import('rollup').PluginImpl; + export default typescript; +} + declare module 'acorn-class-fields' { const plugin: (BaseParser: typeof acorn.Parser) => typeof acorn.Parser; export default plugin;