@venizia/dev-configs 0.4.7 → 0.4.8-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/checks/catalog.js.map +1 -1
- package/dist/checks/module-cycles.js.map +1 -1
- package/dist/checks/purity/manifest.js.map +1 -1
- package/dist/checks/purity/probe.js.map +1 -1
- package/dist/checks/purity/run.js.map +1 -1
- package/dist/checks/split-report.js.map +1 -1
- package/dist/checks/test-controls.js.map +1 -1
- package/dist/checks/test-dead-code.js.map +1 -1
- package/dist/checks/test-mutate.js.map +1 -1
- package/dist/checks/test-weight.js.map +1 -1
- package/dist/cli/check.js.map +1 -1
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/codemod/async-style.d.ts +1 -1
- package/dist/cli/codemod/async-style.js +3 -3
- package/dist/cli/codemod/async-style.js.map +1 -1
- package/dist/cli/codemod/connector-imports.js.map +1 -1
- package/dist/cli/codemod/const-classes.js.map +1 -1
- package/dist/cli/codemod/drop-redundant-casts.js.map +1 -1
- package/dist/cli/codemod/files.js.map +1 -1
- package/dist/cli/codemod/index.js.map +1 -1
- package/dist/cli/codemod/namespace-functions/index.js.map +1 -1
- package/dist/cli/codemod/namespace-functions/logger-scope.js.map +1 -1
- package/dist/cli/codemod/namespace-functions/mapping.js.map +1 -1
- package/dist/cli/codemod/namespace-functions/rewriter.js.map +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lint.js.map +1 -1
- package/dist/linters/eslint.js +7 -5
- package/dist/linters/eslint.js.map +1 -1
- package/dist/linters/house/async-rules.d.ts +10 -0
- package/dist/linters/house/async-rules.js +29 -0
- package/dist/linters/house/async-rules.js.map +1 -0
- package/dist/linters/house/await-support.d.ts +2 -0
- package/dist/linters/house/await-support.js +15 -10
- package/dist/linters/house/await-support.js.map +1 -1
- package/dist/linters/house/common.d.ts +2 -0
- package/dist/linters/house/common.js +2 -0
- package/dist/linters/house/common.js.map +1 -1
- package/dist/linters/house/configs.d.ts +3 -29
- package/dist/linters/house/configs.js +24 -51
- package/dist/linters/house/configs.js.map +1 -1
- package/dist/linters/house/const-class-values.rule.js.map +1 -1
- package/dist/linters/house/effect-cleanup-consistency.rule.js +2 -1
- package/dist/linters/house/effect-cleanup-consistency.rule.js.map +1 -1
- package/dist/linters/house/hook-support.js.map +1 -1
- package/dist/linters/house/index.d.ts +2 -1
- package/dist/linters/house/index.js +4 -1
- package/dist/linters/house/index.js.map +1 -1
- package/dist/linters/house/max-params-own.rule.js.map +1 -1
- package/dist/linters/house/no-async-hook-callback.rule.js.map +1 -1
- package/dist/linters/house/no-await-promise-chain.rule.js +2 -3
- package/dist/linters/house/no-await-promise-chain.rule.js.map +1 -1
- package/dist/linters/house/no-leaked-render.rule.js.map +1 -1
- package/dist/linters/house/no-return-await.rule.js +2 -8
- package/dist/linters/house/no-return-await.rule.js.map +1 -1
- package/dist/linters/house/no-silent-catch.rule.js +1 -1
- package/dist/linters/house/no-silent-catch.rule.js.map +1 -1
- package/dist/linters/house/no-unbraced-case.rule.d.ts +15 -0
- package/dist/linters/house/no-unbraced-case.rule.js +45 -0
- package/dist/linters/house/no-unbraced-case.rule.js.map +1 -0
- package/dist/linters/house/plugin.js +2 -0
- package/dist/linters/house/plugin.js.map +1 -1
- package/dist/linters/house/promise-chain-support.js.map +1 -1
- package/dist/linters/ignore.js.map +1 -1
- package/dist/linters/index.d.ts +1 -0
- package/dist/linters/index.js +1 -0
- package/dist/linters/index.js.map +1 -1
- package/dist/linters/padding.d.ts +8 -0
- package/dist/linters/padding.js +25 -0
- package/dist/linters/padding.js.map +1 -0
- package/dist/linters/rules/eqeqeq.rule.js.map +1 -1
- package/dist/linters/rules/index.d.ts +2 -0
- package/dist/linters/rules/index.js +2 -0
- package/dist/linters/rules/index.js.map +1 -1
- package/dist/linters/rules/lines-between-class-members.rule.d.ts +14 -0
- package/dist/linters/rules/lines-between-class-members.rule.js +17 -0
- package/dist/linters/rules/lines-between-class-members.rule.js.map +1 -0
- package/dist/linters/rules/naming-convention.rule.js.map +1 -1
- package/dist/linters/rules/no-restricted-imports.rule.js.map +1 -1
- package/dist/linters/rules/no-restricted-properties.rule.js.map +1 -1
- package/dist/linters/rules/no-unused-vars.rule.js.map +1 -1
- package/dist/linters/rules/padding-line-between-statements.rule.d.ts +16 -0
- package/dist/linters/rules/padding-line-between-statements.rule.js +25 -0
- package/dist/linters/rules/padding-line-between-statements.rule.js.map +1 -0
- package/dist/linters/rules/prefer-nullish-coalescing.rule.js.map +1 -1
- package/dist/linters/rules/switch-case-braces.rule.js.map +1 -1
- package/dist/testing/repo-tmp.js.map +1 -1
- package/package.json +3 -5
- package/dist/checks/catalog.d.ts.map +0 -1
- package/dist/checks/index.d.ts.map +0 -1
- package/dist/checks/module-cycles.d.ts.map +0 -1
- package/dist/checks/purity/manifest.d.ts.map +0 -1
- package/dist/checks/purity/probe.d.ts.map +0 -1
- package/dist/checks/purity/run.d.ts.map +0 -1
- package/dist/checks/split-report.d.ts.map +0 -1
- package/dist/checks/test-controls.d.ts.map +0 -1
- package/dist/checks/test-dead-code.d.ts.map +0 -1
- package/dist/checks/test-mutate.d.ts.map +0 -1
- package/dist/checks/test-weight.d.ts.map +0 -1
- package/dist/cli/check.d.ts.map +0 -1
- package/dist/cli/clean.d.ts.map +0 -1
- package/dist/cli/codemod/async-style.d.ts.map +0 -1
- package/dist/cli/codemod/connector-imports.d.ts.map +0 -1
- package/dist/cli/codemod/const-classes.d.ts.map +0 -1
- package/dist/cli/codemod/drop-redundant-casts.d.ts.map +0 -1
- package/dist/cli/codemod/files.d.ts.map +0 -1
- package/dist/cli/codemod/index.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/index.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/logger-scope.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mapping.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/boot.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/connectors.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/core-server.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/core-worker.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/dev-configs.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/filter.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/helpers.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/index.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/inversion.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/mappings/kernel.d.ts.map +0 -1
- package/dist/cli/codemod/namespace-functions/rewriter.d.ts.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/lint.d.ts.map +0 -1
- package/dist/compilers/bun.d.ts.map +0 -1
- package/dist/compilers/index.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/linters/browser.d.ts.map +0 -1
- package/dist/linters/eslint.d.ts.map +0 -1
- package/dist/linters/house/await-support.d.ts.map +0 -1
- package/dist/linters/house/common.d.ts.map +0 -1
- package/dist/linters/house/configs.d.ts.map +0 -1
- package/dist/linters/house/const-class-values.rule.d.ts.map +0 -1
- package/dist/linters/house/effect-cleanup-consistency.rule.d.ts.map +0 -1
- package/dist/linters/house/hook-support.d.ts.map +0 -1
- package/dist/linters/house/index.d.ts.map +0 -1
- package/dist/linters/house/max-params-own.rule.d.ts.map +0 -1
- package/dist/linters/house/no-async-hook-callback.rule.d.ts.map +0 -1
- package/dist/linters/house/no-await-promise-chain.rule.d.ts.map +0 -1
- package/dist/linters/house/no-inline-await.rule.d.ts.map +0 -1
- package/dist/linters/house/no-leaked-render.rule.d.ts.map +0 -1
- package/dist/linters/house/no-new-error.rule.d.ts.map +0 -1
- package/dist/linters/house/no-return-await.rule.d.ts.map +0 -1
- package/dist/linters/house/no-silent-catch.rule.d.ts.map +0 -1
- package/dist/linters/house/plugin.d.ts.map +0 -1
- package/dist/linters/house/promise-chain-support.d.ts.map +0 -1
- package/dist/linters/ignore.d.ts.map +0 -1
- package/dist/linters/index.d.ts.map +0 -1
- package/dist/linters/jsx-files.d.ts.map +0 -1
- package/dist/linters/oxlint-presets.d.ts.map +0 -1
- package/dist/linters/oxlint.d.ts.map +0 -1
- package/dist/linters/react-eslint.d.ts.map +0 -1
- package/dist/linters/react-oxlint.d.ts.map +0 -1
- package/dist/linters/rules/common.d.ts.map +0 -1
- package/dist/linters/rules/eqeqeq.rule.d.ts.map +0 -1
- package/dist/linters/rules/index.d.ts.map +0 -1
- package/dist/linters/rules/naming-convention.rule.d.ts.map +0 -1
- package/dist/linters/rules/no-restricted-imports.rule.d.ts.map +0 -1
- package/dist/linters/rules/no-restricted-properties.rule.d.ts.map +0 -1
- package/dist/linters/rules/no-unused-vars.rule.d.ts.map +0 -1
- package/dist/linters/rules/prefer-nullish-coalescing.rule.d.ts.map +0 -1
- package/dist/linters/rules/switch-case-braces.rule.d.ts.map +0 -1
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/rejection.helper.d.ts.map +0 -1
- package/dist/testing/repo-tmp.d.ts.map +0 -1
- package/dist/testing/spawn.helper.d.ts.map +0 -1
- package/dist/testing/tmpdir-preload.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/cli/codemod/files.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/cli/codemod/files.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFileSync } from 'node:child_process';\nimport { existsSync, readdirSync, statSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nconst SKIPPED_DIRECTORIES = new Set(['node_modules', 'dist', 'build', '.git']);\nconst SOURCE_PATTERN = /\\.(?:ts|tsx|mts|cts)$/;\n\n/**\n * The source files a codemod may touch. Inside a git repository the list comes from git, so a\n * `.gitignore`d folder (a worktree, a clone, a build output) is never entered. Outside git there is\n * no ignore file to read, so the walk skips every dot-directory as well as `node_modules`, `dist`,\n * `build` and `.git`.\n */\nexport class CodemodFiles {\n /** Every `.ts`, `.tsx`, `.mts` or `.cts` file (declaration files excluded) the codemod may touch under `target`; a file target is returned as it is. */\n static collect(opts: { target: string }): string[] {\n const { target } = opts;\n\n if (statSync(target).isFile()) {\n return [target];\n }\n\n return CodemodFiles.fromGit({ target }) ?? CodemodFiles.fromWalk({ target });\n }\n\n /**\n * Why a call must be refused, or `undefined` when it may go on. `--write` with no path rewrote every source\n * file under the working directory, which is how one command typed without a path changed 134 clean files: a\n * codemod that rewrites broadly needs a path or an explicit `--all`. A dry run (and `--check`) with no path still\n * lists the whole tree.\n */\n static refusal(opts: {\n command: string;\n isWrite: boolean;\n isAll: boolean;\n paths: ReadonlyArray<string>;\n }): string | undefined {\n const { command, isWrite, isAll, paths } = opts;\n\n if (isAll && paths.length > 0) {\n return `devz codemod ${command}: --all and a path contradict each other (--all means the whole working tree)`;\n }\n\n if (isWrite && !isAll && paths.length === 0) {\n return `devz codemod ${command}: --write needs a path, or --all to rewrite every source file under the working directory (nothing was written)`;\n }\n\n return undefined;\n }\n\n /** Tracked files plus untracked files git does not ignore; `undefined` outside a repository or without git. */\n static fromGit(opts: { target: string }): string[] | undefined {\n const { target } = opts;\n let output: string;\n\n try {\n output = execFileSync(\n 'git',\n ['ls-files', '--cached', '--others', '--exclude-standard', '-z'],\n {\n cwd: target,\n encoding: 'utf8',\n maxBuffer: 256 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'ignore'],\n },\n );\n // eslint-disable-next-line venizia/no-silent-catch -- not a git repository or no git: the caller falls back to the directory walk; the git error text is lost\n } catch {\n return undefined;\n }\n\n return output\n .split('\\0')\n .filter((path) => path !== '' && CodemodFiles.isSource({ name: path }))\n .filter((path) => !path.split('/').some((segment) => SKIPPED_DIRECTORIES.has(segment)))\n .map((path) => join(target, path))\n .filter((path) => existsSync(path) && statSync(path).isFile());\n }\n\n /**\n * The files under `target` that a write could not be undone with git: changed in the working tree,\n * staged, or untracked. `undefined` outside a repository or without git, where there is nothing to check.\n */\n static dirty(opts: { target: string }): Set<string> | undefined {\n const { target } = opts;\n const cwd = statSync(target).isFile() ? dirname(target) : target;\n const queries = [\n ['ls-files', '--modified', '--others', '--exclude-standard', '-z'],\n ['diff', '--cached', '--name-only', '--relative', '-z'],\n ];\n const paths = new Set<string>();\n\n for (const query of queries) {\n let output: string;\n\n try {\n output = execFileSync('git', query, {\n cwd,\n encoding: 'utf8',\n maxBuffer: 256 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n // eslint-disable-next-line venizia/no-silent-catch -- not a git repository or no git: nothing to check, so no dirty set; the git error text is lost\n } catch {\n return undefined;\n }\n\n for (const path of output.split('\\0')) {\n if (path !== '') {\n paths.add(join(cwd, path));\n }\n }\n }\n\n return paths;\n }\n\n /** The directory walk used outside git: skips dot-directories and the build folders. */\n static fromWalk(opts: { target: string }): string[] {\n const { target } = opts;\n const files: string[] = [];\n\n for (const entry of readdirSync(target, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n if (!SKIPPED_DIRECTORIES.has(entry.name) && !entry.name.startsWith('.')) {\n files.push(...CodemodFiles.fromWalk({ target: join(target, entry.name) }));\n }\n\n continue;\n }\n\n if (CodemodFiles.isSource({ name: entry.name })) {\n files.push(join(target, entry.name));\n }\n }\n\n return files;\n }\n\n private static isSource(opts: { name: string }): boolean {\n return SOURCE_PATTERN.test(opts.name) && !opts.name.endsWith('.d.ts');\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/codemod/index.ts"],"names":[],"mappings":";;;AAAA,+CAAkD;AAClD,2DAA8D;AAC9D,mDAAsD;AACtD,iEAAmE;AACnE,+DAAkE;AAElE,MAAM,KAAK,GAAG;IACZ,gDAAyB,CAAC,KAAK;IAC/B,mCAAmB,CAAC,KAAK;IACzB,+BAAiB,CAAC,KAAK;IACvB,+CAAyB,CAAC,KAAK;IAC/B,2CAAuB,CAAC,KAAK;CAC9B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEf,+CAA+C;AAC/C,MAAM,KAAK,GAAG;IACZ,sBAAsB;IACtB,eAAe;IACf,aAAa;IACb,qBAAqB;IACrB,mBAAmB;CACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,kDAAkD;AAClD,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,sFAAsF;AACtF,MAAa,cAAc;IACzB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAsC;QACrD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAE7B,IAAI,IAAI,KAAK,sBAAsB,EAAE,CAAC;YACpC,OAAO,gDAAyB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7B,OAAO,mCAAmB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,OAAO,+BAAiB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACnC,OAAO,+CAAyB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACjC,OAAO,2CAAuB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/codemod/index.ts"],"names":[],"mappings":";;;AAAA,+CAAkD;AAClD,2DAA8D;AAC9D,mDAAsD;AACtD,iEAAmE;AACnE,+DAAkE;AAElE,MAAM,KAAK,GAAG;IACZ,gDAAyB,CAAC,KAAK;IAC/B,mCAAmB,CAAC,KAAK;IACzB,+BAAiB,CAAC,KAAK;IACvB,+CAAyB,CAAC,KAAK;IAC/B,2CAAuB,CAAC,KAAK;CAC9B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEf,+CAA+C;AAC/C,MAAM,KAAK,GAAG;IACZ,sBAAsB;IACtB,eAAe;IACf,aAAa;IACb,qBAAqB;IACrB,mBAAmB;CACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,kDAAkD;AAClD,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,sFAAsF;AACtF,MAAa,cAAc;IACzB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAsC;QACrD,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAE7B,IAAI,IAAI,KAAK,sBAAsB,EAAE,CAAC;YACpC,OAAO,gDAAyB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7B,OAAO,mCAAmB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,OAAO,+BAAiB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACnC,OAAO,+CAAyB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACjC,OAAO,2CAAuB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEnB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,CAAC,KAAK,CACX,kCAAkC,IAAI,IAAI,EAAE,yBAAyB,KAAK,OAAO,KAAK,EAAE,CACzF,CAAC;QAEF,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF;AArCD,wCAqCC","sourcesContent":["import { AsyncStyleCommand } from './async-style';\nimport { ConnectorImportsCommand } from './connector-imports';\nimport { ConstClassesCommand } from './const-classes';\nimport { DropRedundantCastsCommand } from './drop-redundant-casts';\nimport { NamespaceFunctionsCommand } from './namespace-functions';\n\nconst USAGE = [\n DropRedundantCastsCommand.USAGE,\n ConstClassesCommand.USAGE,\n AsyncStyleCommand.USAGE,\n NamespaceFunctionsCommand.USAGE,\n ConnectorImportsCommand.USAGE,\n].join('\\n\\n');\n\n/** The codemods `devz codemod <name>` runs. */\nconst NAMES = [\n 'drop-redundant-casts',\n 'const-classes',\n 'async-style',\n 'namespace-functions',\n 'connector-imports',\n].join(', ');\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\n/** `devz codemod <name> [args]`: hands the arguments to the codemod called `name`. */\nexport class CodemodCommand {\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { args } = opts;\n const [name, ...rest] = args;\n\n if (name === 'drop-redundant-casts') {\n return DropRedundantCastsCommand.run({ root: opts.root, args: rest });\n }\n\n if (name === 'const-classes') {\n return ConstClassesCommand.run({ root: opts.root, args: rest });\n }\n\n if (name === 'async-style') {\n return AsyncStyleCommand.run({ root: opts.root, args: rest });\n }\n\n if (name === 'namespace-functions') {\n return NamespaceFunctionsCommand.run({ root: opts.root, args: rest });\n }\n\n if (name === 'connector-imports') {\n return ConnectorImportsCommand.run({ root: opts.root, args: rest });\n }\n\n if (args.includes('--help') || args.includes('-h')) {\n console.log(USAGE);\n\n return 0;\n }\n\n console.error(\n `devz codemod: unknown codemod \"${name ?? ''}\" | the codemods are: ${NAMES}\\n\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/codemod/namespace-functions/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport { CodemodFiles } from '../files';\nimport { type INamespaceMapping, NamespaceMappings } from './mapping';\nimport { ALL_MAPPINGS } from './mappings';\nimport { LoggerScopeRewriter } from './logger-scope';\nimport { NamespaceFunctions } from './rewriter';\n\nexport * from './logger-scope';\nexport * from './mapping';\nexport * from './mappings';\nexport * from './rewriter';\n\nconst USAGE = `Usage: devz codemod namespace-functions [paths...] [--write | --check]\n\nMoves calls of an IGNIS function that now lives in a class to the class form, with one options\nobject: \\`oldName(a, b)\\` becomes \\`ClassName.method({ first: a, second: b })\\`, and an argument named\nlike its key is written short (\\`{ first }\\`). The old names are removed from the packages, so run it\nonce after you upgrade. A table in @venizia/dev-configs names each moved function.\n\nIt follows a named import (aliased too) and a namespace import (\\`ns.oldName(...)\\`) from a module the\ntable lists, adds the class to that import, and drops the old name once nothing else uses it. It lists\nwith its file and line, and leaves for you: a call with a spread argument or the wrong number of\narguments, the old name used as a value (passed, stored, exported, in typeof), a re-export, a type-only\nimport, and a file that declares a name the rewrite would collide with.\n\nIt also moves the removed \\`ApplicationLogger\\`: \\`ApplicationLogger.get('scope')\\`, \\`.get(NAME)\\` and\n\\`.get({ scope: NAME })\\` become \\`LoggerFactory.getLogger(['scope'])\\`, \\`([NAME])\\`, and the import follows, when\n\\`ApplicationLogger\\` comes from \\`@venizia/ignis-helpers\\` or \\`@venizia/ignis\\`. \\`Logger.get\\` and\n\\`HfLogger.get\\` are not touched, and a call it cannot decide is listed, as is any other use of\n\\`ApplicationLogger\\` (a type, a re-export, a value). An identifier argument is taken for a scope: run your\ntypecheck afterwards.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a call can be rewritten or is left untouched (for CI)\n --help print this text and exit\n\nWith no flag it lists what would change and writes nothing. Inside a git repository it reads the\nfiles git knows (tracked, or untracked and not ignored), and --write refuses a file with local changes\n(changed, staged or untracked): commit or stash it first, so git can undo the codemod.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nclass NamespaceFunctionsFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly HELP = '--help';\n static readonly HELP_SHORT = '-h';\n\n static readonly SCHEME_SET = new Set<string>([\n this.WRITE,\n this.CHECK,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\n/**\n * `devz codemod namespace-functions [paths...] [--write | --check]`: rewrites the calls of the\n * functions the mapping table lists to their class form. It is a dry run unless `--write` is given.\n * `--check` is the same dry run, and exits 1 while a call can be rewritten or is left untouched.\n */\nexport class NamespaceFunctionsCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: {\n root: string;\n args: string[];\n /** The table to apply; the one this package ships by default. */\n mappings?: ReadonlyArray<INamespaceMapping>;\n }): Promise<number> {\n const { root, args, mappings = ALL_MAPPINGS } = opts;\n\n if (\n args.includes(NamespaceFunctionsFlags.HELP) ||\n args.includes(NamespaceFunctionsFlags.HELP_SHORT)\n ) {\n console.log(USAGE);\n return 0;\n }\n\n const flags = args.filter((argument) => argument.startsWith('-'));\n const paths = args.filter((argument) => !argument.startsWith('-'));\n\n const unknown = flags.filter((flag) => !NamespaceFunctionsFlags.isValid(flag));\n if (unknown.length > 0) {\n console.error(\n `devz codemod: unknown option ${unknown.map((flag) => `\"${flag}\"`).join(', ')}\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n const isWrite = flags.includes(NamespaceFunctionsFlags.WRITE);\n const isCheck = flags.includes(NamespaceFunctionsFlags.CHECK);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${NamespaceFunctionsFlags.WRITE} and ${NamespaceFunctionsFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n const problems = NamespaceMappings.validate({ mappings });\n if (problems.length > 0) {\n console.error(\n `devz codemod namespace-functions: the mapping table is broken:\\n${problems.map((problem) => ` ${problem}`).join('\\n')}`,\n );\n return 1;\n }\n\n if (mappings.length === 0) {\n console.log(\n 'devz codemod namespace-functions: the mapping table of this version is empty, so there is nothing to rewrite',\n );\n return 0;\n }\n\n let typescript: typeof import('typescript');\n try {\n const result2 = await import('typescript');\n typescript = result2.default;\n } catch {\n console.error('devz codemod: the \"typescript\" package is required to read your sources');\n return 1;\n }\n\n // Identifiers only (the table is validated), so the names need no escaping.\n const nameText = new RegExp(\n `\\\\b(?:${[...new Set(mappings.map((mapping) => mapping.oldName))].join('|')})\\\\b`,\n );\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n let changedCount = 0;\n let callCount = 0;\n let reportCount = 0;\n let refusedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\n const dirty = isWrite ? CodemodFiles.dirty({ target }) : undefined;\n\n if (files.length === 0 && paths.length > 0) {\n console.warn(\n `devz codemod: no source files under \"${relative(root, target) || target}\" (git ignores the path, or it holds none): nothing was read`,\n );\n }\n\n for (const file of files) {\n const source = readFileSync(file, 'utf8');\n\n if (!nameText.test(source) && !LoggerScopeRewriter.mentions({ source })) {\n continue;\n }\n\n const shown = relative(root, file).split('\\\\').join('/') || file;\n // The call-shape rule goes first, and its edits are inside one call, so the lines the table pass reports stay\n // those of the file unless a multi-line `ApplicationLogger.get({ ... })` collapsed onto one line.\n const scoped = LoggerScopeRewriter.rewrite({ typescript, fileName: file, source });\n const tabled = NamespaceFunctions.rewrite({\n typescript,\n fileName: file,\n source: scoped.output,\n mappings,\n });\n const result = {\n output: tabled.output,\n changed: scoped.changed || tabled.changed,\n rewritten: scoped.rewritten + tabled.rewritten,\n reports: [...scoped.reports, ...tabled.reports],\n };\n\n for (const report of result.reports) {\n reportCount += 1;\n console.warn(`${shown}:${report.line}:${report.column} ${report.reason}`);\n }\n\n if (!result.changed) {\n continue;\n }\n\n if (dirty?.has(file)) {\n refusedCount += 1;\n console.warn(\n `refused ${shown} has local changes (commit or stash them, then run again)`,\n );\n continue;\n }\n\n changedCount += 1;\n callCount += result.rewritten;\n console.log(\n `${isWrite ? 'changed' : 'would change'} ${shown} (${result.rewritten} call(s))`,\n );\n\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n\n console.log(\n `devz codemod namespace-functions: ${changedCount} file(s) ${isWrite ? 'changed' : 'would change'}, ${callCount} call(s) ${isWrite ? 'rewritten' : 'would be rewritten'}, ${reportCount} left untouched` +\n (refusedCount > 0 ? `, ${refusedCount} refused` : ''),\n );\n\n if (!isWrite && changedCount > 0) {\n console.log(\n `Nothing was written. Run again with ${NamespaceFunctionsFlags.WRITE} to apply, then run your typecheck and formatter.`,\n );\n }\n\n if (isWrite && refusedCount > 0) {\n return 1;\n }\n\n return isCheck && (changedCount > 0 || reportCount > 0) ? 1 : 0;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/codemod/namespace-functions/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport { CodemodFiles } from '../files';\nimport { type INamespaceMapping, NamespaceMappings } from './mapping';\nimport { ALL_MAPPINGS } from './mappings';\nimport { LoggerScopeRewriter } from './logger-scope';\nimport { NamespaceFunctions } from './rewriter';\n\nexport * from './logger-scope';\nexport * from './mapping';\nexport * from './mappings';\nexport * from './rewriter';\n\nconst USAGE = `Usage: devz codemod namespace-functions [paths...] [--write | --check]\n\nMoves calls of an IGNIS function that now lives in a class to the class form, with one options\nobject: \\`oldName(a, b)\\` becomes \\`ClassName.method({ first: a, second: b })\\`, and an argument named\nlike its key is written short (\\`{ first }\\`). The old names are removed from the packages, so run it\nonce after you upgrade. A table in @venizia/dev-configs names each moved function.\n\nIt follows a named import (aliased too) and a namespace import (\\`ns.oldName(...)\\`) from a module the\ntable lists, adds the class to that import, and drops the old name once nothing else uses it. It lists\nwith its file and line, and leaves for you: a call with a spread argument or the wrong number of\narguments, the old name used as a value (passed, stored, exported, in typeof), a re-export, a type-only\nimport, and a file that declares a name the rewrite would collide with.\n\nIt also moves the removed \\`ApplicationLogger\\`: \\`ApplicationLogger.get('scope')\\`, \\`.get(NAME)\\` and\n\\`.get({ scope: NAME })\\` become \\`LoggerFactory.getLogger(['scope'])\\`, \\`([NAME])\\`, and the import follows, when\n\\`ApplicationLogger\\` comes from \\`@venizia/ignis-helpers\\` or \\`@venizia/ignis\\`. \\`Logger.get\\` and\n\\`HfLogger.get\\` are not touched, and a call it cannot decide is listed, as is any other use of\n\\`ApplicationLogger\\` (a type, a re-export, a value). An identifier argument is taken for a scope: run your\ntypecheck afterwards.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a call can be rewritten or is left untouched (for CI)\n --help print this text and exit\n\nWith no flag it lists what would change and writes nothing. Inside a git repository it reads the\nfiles git knows (tracked, or untracked and not ignored), and --write refuses a file with local changes\n(changed, staged or untracked): commit or stash it first, so git can undo the codemod.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nclass NamespaceFunctionsFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly HELP = '--help';\n static readonly HELP_SHORT = '-h';\n\n static readonly SCHEME_SET = new Set<string>([\n this.WRITE,\n this.CHECK,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\n/**\n * `devz codemod namespace-functions [paths...] [--write | --check]`: rewrites the calls of the\n * functions the mapping table lists to their class form. It is a dry run unless `--write` is given.\n * `--check` is the same dry run, and exits 1 while a call can be rewritten or is left untouched.\n */\nexport class NamespaceFunctionsCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: {\n root: string;\n args: string[];\n /** The table to apply; the one this package ships by default. */\n mappings?: ReadonlyArray<INamespaceMapping>;\n }): Promise<number> {\n const { root, args, mappings = ALL_MAPPINGS } = opts;\n\n if (\n args.includes(NamespaceFunctionsFlags.HELP) ||\n args.includes(NamespaceFunctionsFlags.HELP_SHORT)\n ) {\n console.log(USAGE);\n\n return 0;\n }\n\n const flags = args.filter((argument) => argument.startsWith('-'));\n const paths = args.filter((argument) => !argument.startsWith('-'));\n\n const unknown = flags.filter((flag) => !NamespaceFunctionsFlags.isValid(flag));\n\n if (unknown.length > 0) {\n console.error(\n `devz codemod: unknown option ${unknown.map((flag) => `\"${flag}\"`).join(', ')}\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n const isWrite = flags.includes(NamespaceFunctionsFlags.WRITE);\n const isCheck = flags.includes(NamespaceFunctionsFlags.CHECK);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${NamespaceFunctionsFlags.WRITE} and ${NamespaceFunctionsFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n\n return USAGE_ERROR_CODE;\n }\n\n const problems = NamespaceMappings.validate({ mappings });\n\n if (problems.length > 0) {\n console.error(\n `devz codemod namespace-functions: the mapping table is broken:\\n${problems.map((problem) => ` ${problem}`).join('\\n')}`,\n );\n\n return 1;\n }\n\n if (mappings.length === 0) {\n console.log(\n 'devz codemod namespace-functions: the mapping table of this version is empty, so there is nothing to rewrite',\n );\n\n return 0;\n }\n\n let typescript: typeof import('typescript');\n\n try {\n const result2 = await import('typescript');\n typescript = result2.default;\n } catch {\n console.error('devz codemod: the \"typescript\" package is required to read your sources');\n\n return 1;\n }\n\n // Identifiers only (the table is validated), so the names need no escaping.\n const nameText = new RegExp(\n `\\\\b(?:${[...new Set(mappings.map((mapping) => mapping.oldName))].join('|')})\\\\b`,\n );\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n let changedCount = 0;\n let callCount = 0;\n let reportCount = 0;\n let refusedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\n const dirty = isWrite ? CodemodFiles.dirty({ target }) : undefined;\n\n if (files.length === 0 && paths.length > 0) {\n console.warn(\n `devz codemod: no source files under \"${relative(root, target) || target}\" (git ignores the path, or it holds none): nothing was read`,\n );\n }\n\n for (const file of files) {\n const source = readFileSync(file, 'utf8');\n\n if (!nameText.test(source) && !LoggerScopeRewriter.mentions({ source })) {\n continue;\n }\n\n const shown = relative(root, file).split('\\\\').join('/') || file;\n // The call-shape rule goes first, and its edits are inside one call, so the lines the table pass reports stay\n // those of the file unless a multi-line `ApplicationLogger.get({ ... })` collapsed onto one line.\n const scoped = LoggerScopeRewriter.rewrite({ typescript, fileName: file, source });\n const tabled = NamespaceFunctions.rewrite({\n typescript,\n fileName: file,\n source: scoped.output,\n mappings,\n });\n const result = {\n output: tabled.output,\n changed: scoped.changed || tabled.changed,\n rewritten: scoped.rewritten + tabled.rewritten,\n reports: [...scoped.reports, ...tabled.reports],\n };\n\n for (const report of result.reports) {\n reportCount += 1;\n console.warn(`${shown}:${report.line}:${report.column} ${report.reason}`);\n }\n\n if (!result.changed) {\n continue;\n }\n\n if (dirty?.has(file)) {\n refusedCount += 1;\n console.warn(\n `refused ${shown} has local changes (commit or stash them, then run again)`,\n );\n continue;\n }\n\n changedCount += 1;\n callCount += result.rewritten;\n console.log(\n `${isWrite ? 'changed' : 'would change'} ${shown} (${result.rewritten} call(s))`,\n );\n\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n\n console.log(\n `devz codemod namespace-functions: ${changedCount} file(s) ${isWrite ? 'changed' : 'would change'}, ${callCount} call(s) ${isWrite ? 'rewritten' : 'would be rewritten'}, ${reportCount} left untouched` +\n (refusedCount > 0 ? `, ${refusedCount} refused` : ''),\n );\n\n if (!isWrite && changedCount > 0) {\n console.log(\n `Nothing was written. Run again with ${NamespaceFunctionsFlags.WRITE} to apply, then run your typecheck and formatter.`,\n );\n }\n\n if (isWrite && refusedCount > 0) {\n return 1;\n }\n\n return isCheck && (changedCount > 0 || reportCount > 0) ? 1 : 0;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-scope.js","sourceRoot":"","sources":["../../../../src/cli/codemod/namespace-functions/logger-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import type ts from 'typescript';\nimport type { INamespaceFunctionsReport, INamespaceFunctionsResult } from './rewriter';\n\ntype TTypeScript = typeof ts;\n\ninterface IEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** How a file reaches `ApplicationLogger`: by a named import (aliased too), or through a namespace import. */\ninterface ILocals {\n /** Local name -> the import specifier that declares it. */\n named: Map<string, ts.ImportSpecifier>;\n /** Local name of `import * as name`. */\n namespaces: Set<string>;\n /** The import declarations of the listed modules, in order. */\n declarations: ts.ImportDeclaration[];\n}\n\n/**\n * The call-shape rule that goes with the table. `ApplicationLogger` is removed: every form of it becomes\n * `LoggerFactory.getLogger([scope])`, so `ApplicationLogger.get('scope')`, `ApplicationLogger.get(NAME)` and\n * `ApplicationLogger.get({ scope: NAME })` all become `LoggerFactory.getLogger(['scope'])`, `...([NAME])`. The call is on a\n * class, not a function in a table, so the table cannot carry it.\n *\n * It follows `ApplicationLogger` imported by name (aliased too) or reached through a namespace import from\n * `@venizia/ignis-helpers` or `@venizia/ignis`, adds `LoggerFactory` to that import and drops `ApplicationLogger` once\n * nothing else uses it. The argument may be a string literal, a template, an identifier, a property access, or an\n * object literal that holds only `scope`. It never touches `Logger.get` or `HfLogger.get`, and it lists a call it cannot\n * decide with file and line.\n */\nexport class LoggerScopeRewriter {\n static readonly CLASS_NAME = 'ApplicationLogger';\n static readonly TARGET_NAME = 'LoggerFactory';\n static readonly MODULES: ReadonlyArray<string> = ['@venizia/ignis-helpers', '@venizia/ignis'];\n\n /** Whether the file can hold such a call, so a file without it is not parsed. */\n static mentions(opts: { source: string }): boolean {\n return opts.source.includes(LoggerScopeRewriter.CLASS_NAME);\n }\n\n static rewrite(opts: {\n typescript: TTypeScript;\n fileName: string;\n source: string;\n }): INamespaceFunctionsResult {\n const { typescript, fileName, source } = opts;\n const reports: INamespaceFunctionsReport[] = [];\n const unchanged = { output: source, changed: false, rewritten: 0, reports };\n\n if (!LoggerScopeRewriter.mentions({ source })) {\n return unchanged;\n }\n\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n typescript.ScriptTarget.Latest,\n true,\n );\n\n const report = (node: ts.Node, reason: string) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n );\n reports.push({ line: line + 1, column: character + 1, reason });\n };\n\n // A re-export or a type-only import of the removed class is not a call: it is listed, never silently kept.\n LoggerScopeRewriter.reportDeclarations({ typescript, sourceFile, report });\n\n const locals = LoggerScopeRewriter.findLocals({ typescript, sourceFile });\n if (locals.named.size === 0 && locals.namespaces.size === 0) {\n return unchanged;\n }\n\n const factory = LoggerScopeRewriter.findFactory({ typescript, sourceFile });\n if (factory.collision) {\n report(\n factory.collision,\n '`LoggerFactory` is already declared in this file (or imported from another module): rewrite `ApplicationLogger` by hand as `LoggerFactory.getLogger([scope])`',\n );\n return unchanged;\n }\n\n const factoryName = factory.local ?? LoggerScopeRewriter.TARGET_NAME;\n const edits: IEdit[] = [];\n /** Identifiers of the old class that a rewritten call replaced: what is left after them keeps the import. */\n const rewrittenOwners = new Set<ts.Node>();\n\n const visit = (node: ts.Node): void => {\n if (typescript.isCallExpression(node)) {\n const owner = LoggerScopeRewriter.loggerOwnerOf({ typescript, call: node, locals });\n\n if (owner) {\n LoggerScopeRewriter.plan({\n typescript,\n sourceFile,\n call: node,\n owner,\n factoryName,\n edits,\n rewrittenOwners,\n report,\n });\n }\n }\n\n typescript.forEachChild(node, visit);\n };\n visit(sourceFile);\n\n if (edits.length === 0) {\n return unchanged;\n }\n\n LoggerScopeRewriter.planImports({\n typescript,\n sourceFile,\n locals,\n rewrittenOwners,\n hasFactory: factory.local !== undefined,\n edits,\n });\n LoggerScopeRewriter.reportLeftovers({\n typescript,\n sourceFile,\n locals,\n rewrittenOwners,\n report,\n });\n\n let output = source;\n for (const edit of [...edits].sort((first, second) => second.start - first.start)) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n\n return { output, changed: true, rewritten: rewrittenOwners.size, reports };\n }\n\n private static findLocals(opts: { typescript: TTypeScript; sourceFile: ts.SourceFile }): ILocals {\n const { typescript, sourceFile } = opts;\n const locals: ILocals = { named: new Map(), namespaces: new Set(), declarations: [] };\n\n for (const statement of sourceFile.statements) {\n if (\n !typescript.isImportDeclaration(statement) ||\n !typescript.isStringLiteral(statement.moduleSpecifier) ||\n !LoggerScopeRewriter.MODULES.includes(statement.moduleSpecifier.text)\n ) {\n continue;\n }\n\n const bindings = statement.importClause?.namedBindings;\n if (!bindings || statement.importClause?.isTypeOnly) {\n continue;\n }\n\n locals.declarations.push(statement);\n\n if (typescript.isNamespaceImport(bindings)) {\n locals.namespaces.add(bindings.name.text);\n continue;\n }\n\n for (const specifier of bindings.elements) {\n if (specifier.isTypeOnly) {\n continue;\n }\n\n if ((specifier.propertyName ?? specifier.name).text === LoggerScopeRewriter.CLASS_NAME) {\n locals.named.set(specifier.name.text, specifier);\n }\n }\n }\n\n return locals;\n }\n\n /** The node that names the class in `<ApplicationLogger>.get(...)` or `<namespace>.ApplicationLogger.get(...)`, else undefined. */\n private static loggerOwnerOf(opts: {\n typescript: TTypeScript;\n call: ts.CallExpression;\n locals: ILocals;\n }): ts.Identifier | ts.PropertyAccessExpression | undefined {\n const { typescript, call, locals } = opts;\n const callee = call.expression;\n\n if (!typescript.isPropertyAccessExpression(callee) || callee.name.text !== 'get') {\n return undefined;\n }\n\n const owner = callee.expression;\n if (typescript.isIdentifier(owner) && locals.named.has(owner.text)) {\n return owner;\n }\n\n if (\n typescript.isPropertyAccessExpression(owner) &&\n owner.name.text === LoggerScopeRewriter.CLASS_NAME &&\n typescript.isIdentifier(owner.expression) &&\n locals.namespaces.has(owner.expression.text)\n ) {\n return owner;\n }\n\n return undefined;\n }\n\n /** The scope expression of the call, as text, or a reason it cannot be decided. */\n private static scopeOf(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n call: ts.CallExpression;\n }): { text: string } | { reason: string } {\n const { typescript, sourceFile, call } = opts;\n const [argument] = call.arguments;\n\n if (call.arguments.length !== 1 || !argument) {\n return {\n reason:\n '`ApplicationLogger.get` is called with no argument or more than one: rewrite it by hand as `LoggerFactory.getLogger([scope])`',\n };\n }\n\n if (typescript.isObjectLiteralExpression(argument)) {\n const [property, ...rest] = argument.properties;\n const isOnlyScope =\n rest.length === 0 &&\n property !== undefined &&\n (typescript.isShorthandPropertyAssignment(property) ||\n typescript.isPropertyAssignment(property)) &&\n typescript.isIdentifier(property.name) &&\n property.name.text === 'scope';\n\n if (!isOnlyScope) {\n return {\n reason:\n '`ApplicationLogger.get` gets an object that is not `{ scope: <expression> }`: rewrite it by hand as `LoggerFactory.getLogger([scope])`',\n };\n }\n\n return {\n text: typescript.isShorthandPropertyAssignment(property)\n ? property.name.text\n : property.initializer.getText(sourceFile),\n };\n }\n\n const isDecidable =\n typescript.isStringLiteral(argument) ||\n typescript.isNoSubstitutionTemplateLiteral(argument) ||\n typescript.isTemplateExpression(argument) ||\n typescript.isIdentifier(argument) ||\n typescript.isPropertyAccessExpression(argument);\n\n if (!isDecidable) {\n return {\n reason:\n '`ApplicationLogger.get` gets an argument whose type the codemod cannot tell (a call, a spread or another expression): rewrite it by hand as `LoggerFactory.getLogger([<argument>])`',\n };\n }\n\n return { text: argument.getText(sourceFile) };\n }\n\n /** One edit for a call whose scope is decided: the whole call text becomes `<owner replaced>.getLogger([scope])`. */\n private static plan(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n call: ts.CallExpression;\n owner: ts.Identifier | ts.PropertyAccessExpression;\n factoryName: string;\n edits: IEdit[];\n rewrittenOwners: Set<ts.Node>;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, sourceFile, call, owner, factoryName, edits, rewrittenOwners, report } =\n opts;\n const scope = LoggerScopeRewriter.scopeOf({ typescript, sourceFile, call });\n\n if ('reason' in scope) {\n report(call, scope.reason);\n return;\n }\n\n // `<namespace>.ApplicationLogger` keeps its namespace: `helpers.LoggerFactory.getLogger([...])`.\n const ownerText = typescript.isIdentifier(owner)\n ? factoryName\n : `${owner.expression.getText(sourceFile)}.${LoggerScopeRewriter.TARGET_NAME}`;\n\n edits.push({\n start: call.getStart(sourceFile),\n end: call.getEnd(),\n text: `${ownerText}.getLogger([${scope.text}])`,\n });\n rewrittenOwners.add(owner);\n }\n\n /**\n * `LoggerFactory` is added to the import that carried `ApplicationLogger`, and `ApplicationLogger` leaves it when no\n * other use of it remains.\n */\n private static planImports(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n locals: ILocals;\n rewrittenOwners: Set<ts.Node>;\n /** `LoggerFactory` is already imported from a listed module (maybe under another name). */\n hasFactory: boolean;\n edits: IEdit[];\n }): void {\n const { typescript, sourceFile, locals, rewrittenOwners, hasFactory, edits } = opts;\n\n for (const [local, specifier] of locals.named) {\n const used = LoggerScopeRewriter.countReferences({ typescript, sourceFile, name: local });\n const replaced = [...rewrittenOwners].filter(\n (owner) => typescript.isIdentifier(owner) && owner.text === local,\n ).length;\n const declaration = specifier.parent.parent.parent;\n const imported = declaration.importClause?.namedBindings;\n\n if (!imported || !typescript.isNamedImports(imported)) {\n continue;\n }\n\n const hasTarget = hasFactory;\n const isLeft = used - replaced > 1; // the import specifier itself is one reference\n\n if (isLeft) {\n if (!hasTarget) {\n edits.push({\n start: specifier.getEnd(),\n end: specifier.getEnd(),\n text: `, ${LoggerScopeRewriter.TARGET_NAME}`,\n });\n }\n continue;\n }\n\n if (hasTarget) {\n LoggerScopeRewriter.dropSpecifier({\n sourceFile,\n specifier,\n elements: imported.elements,\n edits,\n });\n } else {\n edits.push({\n start: specifier.getStart(sourceFile),\n end: specifier.getEnd(),\n text: LoggerScopeRewriter.TARGET_NAME,\n });\n }\n }\n }\n\n /** A re-export of the removed class from a listed module, or a type-only import of it, is listed. */\n private static reportDeclarations(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, sourceFile, report } = opts;\n const named = (element: { propertyName?: ts.ModuleExportName; name: ts.ModuleExportName }) =>\n (element.propertyName ?? element.name).text === LoggerScopeRewriter.CLASS_NAME;\n\n for (const statement of sourceFile.statements) {\n if (\n typescript.isExportDeclaration(statement) &&\n statement.moduleSpecifier &&\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n LoggerScopeRewriter.MODULES.includes(statement.moduleSpecifier.text) &&\n statement.exportClause &&\n typescript.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.some(named)\n ) {\n report(\n statement,\n '`ApplicationLogger` no longer exists: this re-export has no replacement, remove it (`LoggerFactory` is the class)',\n );\n }\n\n if (\n typescript.isImportDeclaration(statement) &&\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n LoggerScopeRewriter.MODULES.includes(statement.moduleSpecifier.text)\n ) {\n const bindings = statement.importClause?.namedBindings;\n const isNamed = bindings && typescript.isNamedImports(bindings);\n const isTypeImport = statement.importClause?.isTypeOnly === true;\n const typed =\n isNamed &&\n bindings.elements.some(\n (element) => named(element) && (isTypeImport || element.isTypeOnly),\n );\n\n if (typed) {\n report(\n statement,\n '`ApplicationLogger` no longer exists: this type-only import has no replacement, use the type of what `LoggerFactory.getLogger` returns (`ILogger`)',\n );\n }\n }\n }\n }\n\n /** Where `LoggerFactory` stands in the file: imported from a listed module (under which local name), or a name clash. */\n private static findFactory(opts: { typescript: TTypeScript; sourceFile: ts.SourceFile }): {\n local?: string;\n collision?: ts.Node;\n } {\n const { typescript, sourceFile } = opts;\n const found: { local?: string; collision?: ts.Node } = {};\n\n for (const statement of sourceFile.statements) {\n if (typescript.isImportDeclaration(statement)) {\n const bindings = statement.importClause?.namedBindings;\n if (!bindings || !typescript.isNamedImports(bindings)) {\n continue;\n }\n\n for (const element of bindings.elements) {\n if ((element.propertyName ?? element.name).text !== LoggerScopeRewriter.TARGET_NAME) {\n continue;\n }\n\n const isListed =\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n LoggerScopeRewriter.MODULES.includes(statement.moduleSpecifier.text);\n if (isListed) {\n found.local = element.name.text;\n } else {\n found.collision = element;\n }\n }\n continue;\n }\n\n const isNamedDeclaration =\n (typescript.isClassDeclaration(statement) ||\n typescript.isFunctionDeclaration(statement) ||\n typescript.isInterfaceDeclaration(statement) ||\n typescript.isTypeAliasDeclaration(statement)) &&\n statement.name?.text === LoggerScopeRewriter.TARGET_NAME;\n const isNamedVariable =\n typescript.isVariableStatement(statement) &&\n statement.declarationList.declarations.some(\n (declaration) =>\n typescript.isIdentifier(declaration.name) &&\n declaration.name.text === LoggerScopeRewriter.TARGET_NAME,\n );\n\n if (isNamedDeclaration || isNamedVariable) {\n found.collision = statement;\n }\n }\n\n return found;\n }\n\n /** Every use of the removed class that is not a call this run rewrote (a type, a value, an export) is listed. */\n private static reportLeftovers(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n locals: ILocals;\n rewrittenOwners: Set<ts.Node>;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, sourceFile, locals, rewrittenOwners, report } = opts;\n\n const visit = (node: ts.Node): void => {\n if (typescript.isIdentifier(node) && !rewrittenOwners.has(node)) {\n const parent = node.parent;\n const isImportName = typescript.isImportSpecifier(parent);\n const isProperty = typescript.isPropertyAccessExpression(parent) && parent.name === node;\n const isLocal = locals.named.has(node.text);\n\n if (isLocal && !isImportName && !isProperty) {\n report(\n node,\n '`ApplicationLogger` no longer exists and this use is not a call the codemod rewrites: change it by hand (`LoggerFactory` is the class, `ILogger` the type of a logger)',\n );\n }\n }\n\n if (\n typescript.isPropertyAccessExpression(node) &&\n node.name.text === LoggerScopeRewriter.CLASS_NAME &&\n typescript.isIdentifier(node.expression) &&\n locals.namespaces.has(node.expression.text) &&\n !rewrittenOwners.has(node)\n ) {\n report(\n node,\n '`ApplicationLogger` no longer exists and this use is not a call the codemod rewrites: change it by hand',\n );\n }\n\n typescript.forEachChild(node, visit);\n };\n visit(sourceFile);\n }\n\n /** How many identifiers named `name` the file holds, the import specifier included. */\n private static countReferences(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n name: string;\n }): number {\n const { typescript, sourceFile, name } = opts;\n let count = 0;\n\n const visit = (node: ts.Node): void => {\n if (typescript.isIdentifier(node) && node.text === name) {\n // A property name (`x.name`) is not a reference to the import.\n const parent = node.parent;\n const isProperty = typescript.isPropertyAccessExpression(parent) && parent.name === node;\n if (!isProperty) {\n count += 1;\n }\n }\n typescript.forEachChild(node, visit);\n };\n visit(sourceFile);\n\n return count;\n }\n\n /** Removes one specifier from a named import together with its comma. */\n private static dropSpecifier(opts: {\n sourceFile: ts.SourceFile;\n specifier: ts.ImportSpecifier;\n elements: ts.NodeArray<ts.ImportSpecifier>;\n edits: IEdit[];\n }): void {\n const { sourceFile, specifier, elements, edits } = opts;\n const index = elements.indexOf(specifier);\n const next = elements[index + 1];\n const previous = elements[index - 1];\n\n if (next) {\n edits.push({\n start: specifier.getStart(sourceFile),\n end: next.getStart(sourceFile),\n text: '',\n });\n } else if (previous) {\n edits.push({ start: previous.getEnd(), end: specifier.getEnd(), text: '' });\n } else {\n edits.push({ start: specifier.getStart(sourceFile), end: specifier.getEnd(), text: '' });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"logger-scope.js","sourceRoot":"","sources":["../../../../src/cli/codemod/namespace-functions/logger-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import type ts from 'typescript';\nimport type { INamespaceFunctionsReport, INamespaceFunctionsResult } from './rewriter';\n\ntype TTypeScript = typeof ts;\n\ninterface IEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** How a file reaches `ApplicationLogger`: by a named import (aliased too), or through a namespace import. */\ninterface ILocals {\n /** Local name -> the import specifier that declares it. */\n named: Map<string, ts.ImportSpecifier>;\n /** Local name of `import * as name`. */\n namespaces: Set<string>;\n /** The import declarations of the listed modules, in order. */\n declarations: ts.ImportDeclaration[];\n}\n\n/**\n * The call-shape rule that goes with the table. `ApplicationLogger` is removed: every form of it becomes\n * `LoggerFactory.getLogger([scope])`, so `ApplicationLogger.get('scope')`, `ApplicationLogger.get(NAME)` and\n * `ApplicationLogger.get({ scope: NAME })` all become `LoggerFactory.getLogger(['scope'])`, `...([NAME])`. The call is on a\n * class, not a function in a table, so the table cannot carry it.\n *\n * It follows `ApplicationLogger` imported by name (aliased too) or reached through a namespace import from\n * `@venizia/ignis-helpers` or `@venizia/ignis`, adds `LoggerFactory` to that import and drops `ApplicationLogger` once\n * nothing else uses it. The argument may be a string literal, a template, an identifier, a property access, or an\n * object literal that holds only `scope`. It never touches `Logger.get` or `HfLogger.get`, and it lists a call it cannot\n * decide with file and line.\n */\nexport class LoggerScopeRewriter {\n static readonly CLASS_NAME = 'ApplicationLogger';\n static readonly TARGET_NAME = 'LoggerFactory';\n static readonly MODULES: ReadonlyArray<string> = ['@venizia/ignis-helpers', '@venizia/ignis'];\n\n /** Whether the file can hold such a call, so a file without it is not parsed. */\n static mentions(opts: { source: string }): boolean {\n return opts.source.includes(LoggerScopeRewriter.CLASS_NAME);\n }\n\n static rewrite(opts: {\n typescript: TTypeScript;\n fileName: string;\n source: string;\n }): INamespaceFunctionsResult {\n const { typescript, fileName, source } = opts;\n const reports: INamespaceFunctionsReport[] = [];\n const unchanged = { output: source, changed: false, rewritten: 0, reports };\n\n if (!LoggerScopeRewriter.mentions({ source })) {\n return unchanged;\n }\n\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n typescript.ScriptTarget.Latest,\n true,\n );\n\n const report = (node: ts.Node, reason: string) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n );\n reports.push({ line: line + 1, column: character + 1, reason });\n };\n\n // A re-export or a type-only import of the removed class is not a call: it is listed, never silently kept.\n LoggerScopeRewriter.reportDeclarations({ typescript, sourceFile, report });\n\n const locals = LoggerScopeRewriter.findLocals({ typescript, sourceFile });\n\n if (locals.named.size === 0 && locals.namespaces.size === 0) {\n return unchanged;\n }\n\n const factory = LoggerScopeRewriter.findFactory({ typescript, sourceFile });\n\n if (factory.collision) {\n report(\n factory.collision,\n '`LoggerFactory` is already declared in this file (or imported from another module): rewrite `ApplicationLogger` by hand as `LoggerFactory.getLogger([scope])`',\n );\n\n return unchanged;\n }\n\n const factoryName = factory.local ?? LoggerScopeRewriter.TARGET_NAME;\n const edits: IEdit[] = [];\n /** Identifiers of the old class that a rewritten call replaced: what is left after them keeps the import. */\n const rewrittenOwners = new Set<ts.Node>();\n\n const visit = (node: ts.Node): void => {\n if (typescript.isCallExpression(node)) {\n const owner = LoggerScopeRewriter.loggerOwnerOf({ typescript, call: node, locals });\n\n if (owner) {\n LoggerScopeRewriter.plan({\n typescript,\n sourceFile,\n call: node,\n owner,\n factoryName,\n edits,\n rewrittenOwners,\n report,\n });\n }\n }\n\n typescript.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n\n if (edits.length === 0) {\n return unchanged;\n }\n\n LoggerScopeRewriter.planImports({\n typescript,\n sourceFile,\n locals,\n rewrittenOwners,\n hasFactory: factory.local !== undefined,\n edits,\n });\n LoggerScopeRewriter.reportLeftovers({\n typescript,\n sourceFile,\n locals,\n rewrittenOwners,\n report,\n });\n\n let output = source;\n\n for (const edit of [...edits].sort((first, second) => second.start - first.start)) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n\n return { output, changed: true, rewritten: rewrittenOwners.size, reports };\n }\n\n private static findLocals(opts: { typescript: TTypeScript; sourceFile: ts.SourceFile }): ILocals {\n const { typescript, sourceFile } = opts;\n const locals: ILocals = { named: new Map(), namespaces: new Set(), declarations: [] };\n\n for (const statement of sourceFile.statements) {\n if (\n !typescript.isImportDeclaration(statement) ||\n !typescript.isStringLiteral(statement.moduleSpecifier) ||\n !LoggerScopeRewriter.MODULES.includes(statement.moduleSpecifier.text)\n ) {\n continue;\n }\n\n const bindings = statement.importClause?.namedBindings;\n\n if (!bindings || statement.importClause?.isTypeOnly) {\n continue;\n }\n\n locals.declarations.push(statement);\n\n if (typescript.isNamespaceImport(bindings)) {\n locals.namespaces.add(bindings.name.text);\n continue;\n }\n\n for (const specifier of bindings.elements) {\n if (specifier.isTypeOnly) {\n continue;\n }\n\n if ((specifier.propertyName ?? specifier.name).text === LoggerScopeRewriter.CLASS_NAME) {\n locals.named.set(specifier.name.text, specifier);\n }\n }\n }\n\n return locals;\n }\n\n /** The node that names the class in `<ApplicationLogger>.get(...)` or `<namespace>.ApplicationLogger.get(...)`, else undefined. */\n private static loggerOwnerOf(opts: {\n typescript: TTypeScript;\n call: ts.CallExpression;\n locals: ILocals;\n }): ts.Identifier | ts.PropertyAccessExpression | undefined {\n const { typescript, call, locals } = opts;\n const callee = call.expression;\n\n if (!typescript.isPropertyAccessExpression(callee) || callee.name.text !== 'get') {\n return undefined;\n }\n\n const owner = callee.expression;\n\n if (typescript.isIdentifier(owner) && locals.named.has(owner.text)) {\n return owner;\n }\n\n if (\n typescript.isPropertyAccessExpression(owner) &&\n owner.name.text === LoggerScopeRewriter.CLASS_NAME &&\n typescript.isIdentifier(owner.expression) &&\n locals.namespaces.has(owner.expression.text)\n ) {\n return owner;\n }\n\n return undefined;\n }\n\n /** The scope expression of the call, as text, or a reason it cannot be decided. */\n private static scopeOf(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n call: ts.CallExpression;\n }): { text: string } | { reason: string } {\n const { typescript, sourceFile, call } = opts;\n const [argument] = call.arguments;\n\n if (call.arguments.length !== 1 || !argument) {\n return {\n reason:\n '`ApplicationLogger.get` is called with no argument or more than one: rewrite it by hand as `LoggerFactory.getLogger([scope])`',\n };\n }\n\n if (typescript.isObjectLiteralExpression(argument)) {\n const [property, ...rest] = argument.properties;\n const isOnlyScope =\n rest.length === 0 &&\n property !== undefined &&\n (typescript.isShorthandPropertyAssignment(property) ||\n typescript.isPropertyAssignment(property)) &&\n typescript.isIdentifier(property.name) &&\n property.name.text === 'scope';\n\n if (!isOnlyScope) {\n return {\n reason:\n '`ApplicationLogger.get` gets an object that is not `{ scope: <expression> }`: rewrite it by hand as `LoggerFactory.getLogger([scope])`',\n };\n }\n\n return {\n text: typescript.isShorthandPropertyAssignment(property)\n ? property.name.text\n : property.initializer.getText(sourceFile),\n };\n }\n\n const isDecidable =\n typescript.isStringLiteral(argument) ||\n typescript.isNoSubstitutionTemplateLiteral(argument) ||\n typescript.isTemplateExpression(argument) ||\n typescript.isIdentifier(argument) ||\n typescript.isPropertyAccessExpression(argument);\n\n if (!isDecidable) {\n return {\n reason:\n '`ApplicationLogger.get` gets an argument whose type the codemod cannot tell (a call, a spread or another expression): rewrite it by hand as `LoggerFactory.getLogger([<argument>])`',\n };\n }\n\n return { text: argument.getText(sourceFile) };\n }\n\n /** One edit for a call whose scope is decided: the whole call text becomes `<owner replaced>.getLogger([scope])`. */\n private static plan(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n call: ts.CallExpression;\n owner: ts.Identifier | ts.PropertyAccessExpression;\n factoryName: string;\n edits: IEdit[];\n rewrittenOwners: Set<ts.Node>;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, sourceFile, call, owner, factoryName, edits, rewrittenOwners, report } =\n opts;\n const scope = LoggerScopeRewriter.scopeOf({ typescript, sourceFile, call });\n\n if ('reason' in scope) {\n report(call, scope.reason);\n\n return;\n }\n\n // `<namespace>.ApplicationLogger` keeps its namespace: `helpers.LoggerFactory.getLogger([...])`.\n const ownerText = typescript.isIdentifier(owner)\n ? factoryName\n : `${owner.expression.getText(sourceFile)}.${LoggerScopeRewriter.TARGET_NAME}`;\n\n edits.push({\n start: call.getStart(sourceFile),\n end: call.getEnd(),\n text: `${ownerText}.getLogger([${scope.text}])`,\n });\n rewrittenOwners.add(owner);\n }\n\n /**\n * `LoggerFactory` is added to the import that carried `ApplicationLogger`, and `ApplicationLogger` leaves it when no\n * other use of it remains.\n */\n private static planImports(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n locals: ILocals;\n rewrittenOwners: Set<ts.Node>;\n /** `LoggerFactory` is already imported from a listed module (maybe under another name). */\n hasFactory: boolean;\n edits: IEdit[];\n }): void {\n const { typescript, sourceFile, locals, rewrittenOwners, hasFactory, edits } = opts;\n\n for (const [local, specifier] of locals.named) {\n const used = LoggerScopeRewriter.countReferences({ typescript, sourceFile, name: local });\n const replaced = [...rewrittenOwners].filter(\n (owner) => typescript.isIdentifier(owner) && owner.text === local,\n ).length;\n const declaration = specifier.parent.parent.parent;\n const imported = declaration.importClause?.namedBindings;\n\n if (!imported || !typescript.isNamedImports(imported)) {\n continue;\n }\n\n const hasTarget = hasFactory;\n const isLeft = used - replaced > 1; // the import specifier itself is one reference\n\n if (isLeft) {\n if (!hasTarget) {\n edits.push({\n start: specifier.getEnd(),\n end: specifier.getEnd(),\n text: `, ${LoggerScopeRewriter.TARGET_NAME}`,\n });\n }\n\n continue;\n }\n\n if (hasTarget) {\n LoggerScopeRewriter.dropSpecifier({\n sourceFile,\n specifier,\n elements: imported.elements,\n edits,\n });\n } else {\n edits.push({\n start: specifier.getStart(sourceFile),\n end: specifier.getEnd(),\n text: LoggerScopeRewriter.TARGET_NAME,\n });\n }\n }\n }\n\n /** A re-export of the removed class from a listed module, or a type-only import of it, is listed. */\n private static reportDeclarations(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, sourceFile, report } = opts;\n const named = (element: { propertyName?: ts.ModuleExportName; name: ts.ModuleExportName }) =>\n (element.propertyName ?? element.name).text === LoggerScopeRewriter.CLASS_NAME;\n\n for (const statement of sourceFile.statements) {\n if (\n typescript.isExportDeclaration(statement) &&\n statement.moduleSpecifier &&\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n LoggerScopeRewriter.MODULES.includes(statement.moduleSpecifier.text) &&\n statement.exportClause &&\n typescript.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.some(named)\n ) {\n report(\n statement,\n '`ApplicationLogger` no longer exists: this re-export has no replacement, remove it (`LoggerFactory` is the class)',\n );\n }\n\n if (\n typescript.isImportDeclaration(statement) &&\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n LoggerScopeRewriter.MODULES.includes(statement.moduleSpecifier.text)\n ) {\n const bindings = statement.importClause?.namedBindings;\n const isNamed = bindings && typescript.isNamedImports(bindings);\n const isTypeImport = statement.importClause?.isTypeOnly === true;\n const typed =\n isNamed &&\n bindings.elements.some(\n (element) => named(element) && (isTypeImport || element.isTypeOnly),\n );\n\n if (typed) {\n report(\n statement,\n '`ApplicationLogger` no longer exists: this type-only import has no replacement, use the type of what `LoggerFactory.getLogger` returns (`ILogger`)',\n );\n }\n }\n }\n }\n\n /** Where `LoggerFactory` stands in the file: imported from a listed module (under which local name), or a name clash. */\n private static findFactory(opts: { typescript: TTypeScript; sourceFile: ts.SourceFile }): {\n local?: string;\n collision?: ts.Node;\n } {\n const { typescript, sourceFile } = opts;\n const found: { local?: string; collision?: ts.Node } = {};\n\n for (const statement of sourceFile.statements) {\n if (typescript.isImportDeclaration(statement)) {\n const bindings = statement.importClause?.namedBindings;\n\n if (!bindings || !typescript.isNamedImports(bindings)) {\n continue;\n }\n\n for (const element of bindings.elements) {\n if ((element.propertyName ?? element.name).text !== LoggerScopeRewriter.TARGET_NAME) {\n continue;\n }\n\n const isListed =\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n LoggerScopeRewriter.MODULES.includes(statement.moduleSpecifier.text);\n\n if (isListed) {\n found.local = element.name.text;\n } else {\n found.collision = element;\n }\n }\n\n continue;\n }\n\n const isNamedDeclaration =\n (typescript.isClassDeclaration(statement) ||\n typescript.isFunctionDeclaration(statement) ||\n typescript.isInterfaceDeclaration(statement) ||\n typescript.isTypeAliasDeclaration(statement)) &&\n statement.name?.text === LoggerScopeRewriter.TARGET_NAME;\n const isNamedVariable =\n typescript.isVariableStatement(statement) &&\n statement.declarationList.declarations.some(\n (declaration) =>\n typescript.isIdentifier(declaration.name) &&\n declaration.name.text === LoggerScopeRewriter.TARGET_NAME,\n );\n\n if (isNamedDeclaration || isNamedVariable) {\n found.collision = statement;\n }\n }\n\n return found;\n }\n\n /** Every use of the removed class that is not a call this run rewrote (a type, a value, an export) is listed. */\n private static reportLeftovers(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n locals: ILocals;\n rewrittenOwners: Set<ts.Node>;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, sourceFile, locals, rewrittenOwners, report } = opts;\n\n const visit = (node: ts.Node): void => {\n if (typescript.isIdentifier(node) && !rewrittenOwners.has(node)) {\n const parent = node.parent;\n const isImportName = typescript.isImportSpecifier(parent);\n const isProperty = typescript.isPropertyAccessExpression(parent) && parent.name === node;\n const isLocal = locals.named.has(node.text);\n\n if (isLocal && !isImportName && !isProperty) {\n report(\n node,\n '`ApplicationLogger` no longer exists and this use is not a call the codemod rewrites: change it by hand (`LoggerFactory` is the class, `ILogger` the type of a logger)',\n );\n }\n }\n\n if (\n typescript.isPropertyAccessExpression(node) &&\n node.name.text === LoggerScopeRewriter.CLASS_NAME &&\n typescript.isIdentifier(node.expression) &&\n locals.namespaces.has(node.expression.text) &&\n !rewrittenOwners.has(node)\n ) {\n report(\n node,\n '`ApplicationLogger` no longer exists and this use is not a call the codemod rewrites: change it by hand',\n );\n }\n\n typescript.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n }\n\n /** How many identifiers named `name` the file holds, the import specifier included. */\n private static countReferences(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n name: string;\n }): number {\n const { typescript, sourceFile, name } = opts;\n let count = 0;\n\n const visit = (node: ts.Node): void => {\n if (typescript.isIdentifier(node) && node.text === name) {\n // A property name (`x.name`) is not a reference to the import.\n const parent = node.parent;\n const isProperty = typescript.isPropertyAccessExpression(parent) && parent.name === node;\n\n if (!isProperty) {\n count += 1;\n }\n }\n\n typescript.forEachChild(node, visit);\n };\n\n visit(sourceFile);\n\n return count;\n }\n\n /** Removes one specifier from a named import together with its comma. */\n private static dropSpecifier(opts: {\n sourceFile: ts.SourceFile;\n specifier: ts.ImportSpecifier;\n elements: ts.NodeArray<ts.ImportSpecifier>;\n edits: IEdit[];\n }): void {\n const { sourceFile, specifier, elements, edits } = opts;\n const index = elements.indexOf(specifier);\n const next = elements[index + 1];\n const previous = elements[index - 1];\n\n if (next) {\n edits.push({\n start: specifier.getStart(sourceFile),\n end: next.getStart(sourceFile),\n text: '',\n });\n } else if (previous) {\n edits.push({ start: previous.getEnd(), end: specifier.getEnd(), text: '' });\n } else {\n edits.push({ start: specifier.getStart(sourceFile), end: specifier.getEnd(), text: '' });\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../../../src/cli/codemod/namespace-functions/mapping.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;;;AA8BH,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,8BAA8B;AAC9B,MAAa,iBAAiB;IAC5B,4FAA4F;IAC5F,MAAM,CAAC,QAAQ,CAAC,IAAoD;QAClE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,OAAO,OAAO,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAE7E,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;gBAC3B,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC;gBAC5B,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC;gBAChC,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;aAClB,EAAE,CAAC;gBACX,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,wBAAwB,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC3F,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,+DAA+D,CAAC,CAAC;YACzF,CAAC;YAED,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,+DAA+D,CAAC,CAAC;YACzF,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,IAAI,cAAc,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../../../src/cli/codemod/namespace-functions/mapping.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The table behind `devz codemod namespace-functions`. One entry per public function that moved into\n * a class: the old name is no longer exported, and the codemod moves callers to the class form, so an\n * entry is the only upgrade path for that name.\n *\n * How an entry is written, in the file of the package that exports the old name\n * (`mappings/<package-dir>.ts`):\n *\n * ```ts\n * {\n * // Every module specifier the old name can be imported from: the root, a subpath, a re-export.\n * modules: ['@venizia/ignis-helpers', '@venizia/ignis-helpers/core'],\n * oldName: 'float',\n * className: 'ParseUtility',\n * method: 'toFloat',\n * // Where the class is imported from, when that is not where the old name came from. Optional.\n * newModules: ['@venizia/ignis-helpers'],\n * // The old positional parameters in order; each becomes a key of the options object. A parameter\n * // that has a default value in the old function is `optional`, and an optional one is never\n * // followed by a required one.\n * params: [{ key: 'input' }, { key: 'digit', optional: true }],\n * // The old rest parameter, if any (`float` has none): its arguments go under this key as one\n * // array, `[]` when the call passes none. Optional.\n * // restKey: 'values',\n * }\n * ```\n *\n * So `float(value, 3)` becomes `ParseUtility.toFloat({ input: value, digit: 3 })`, and `float(input)`\n * becomes `ParseUtility.toFloat({ input })`. Add the entry in the pull request that adds the class\n * and removes the old export, never before: the codemod would rewrite callers to a method that does not\n * exist yet. `NamespaceMappings.validate` checks every entry in the test suite.\n */\n\n/** One old positional parameter, and the key it becomes in the options object. */\nexport interface INamespaceMappingParameter {\n key: string;\n /** The old parameter has a default value: a call may leave it out, and then the key is left out. */\n optional?: boolean;\n}\n\n/** One function that moved into a class. */\nexport interface INamespaceMapping {\n /** Every module specifier the old name can be imported from. */\n modules: string[];\n oldName: string;\n className: string;\n method: string;\n /** Where the class is imported from; without it, from the module the old name was imported from. */\n newModules?: string[];\n /** The old positional parameters, in order. */\n params: INamespaceMappingParameter[];\n /** The old rest parameter: its arguments are passed as one array under this key. */\n restKey?: string;\n /**\n * The old function already takes ONE options object and the method takes the same one, so a call\n * keeps its arguments and only the callee changes: `isEmpty({ value })` becomes\n * `ObjectUtility.isEmpty({ value })`. `params` is empty and `restKey` unset for such an entry.\n */\n keepsOptions?: boolean;\n}\n\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\n\n/** Checks a mapping table. */\nexport class NamespaceMappings {\n /** What is wrong with the table, one line per problem; empty when every entry is usable. */\n static validate(opts: { mappings: ReadonlyArray<INamespaceMapping> }): string[] {\n const { mappings } = opts;\n const problems: string[] = [];\n const seen = new Set<string>();\n\n for (const mapping of mappings) {\n const label = `${mapping.oldName} -> ${mapping.className}.${mapping.method}`;\n\n for (const [field, value] of [\n ['oldName', mapping.oldName],\n ['className', mapping.className],\n ['method', mapping.method],\n ] as const) {\n if (!IDENTIFIER.test(value)) {\n problems.push(`${label}: ${field} \"${value}\" is not an identifier`);\n }\n }\n\n if (mapping.modules.length === 0 || mapping.modules.some((module) => module.trim() === '')) {\n problems.push(`${label}: modules must list at least one module specifier, none empty`);\n }\n\n if (mapping.newModules?.length === 0) {\n problems.push(`${label}: newModules, when given, lists at least one module specifier`);\n }\n\n const keys = new Set<string>();\n let isOptionalSeen = false;\n\n for (const parameter of mapping.params) {\n if (!IDENTIFIER.test(parameter.key)) {\n problems.push(`${label}: the parameter key \"${parameter.key}\" is not an identifier`);\n }\n\n if (keys.has(parameter.key)) {\n problems.push(`${label}: the parameter key \"${parameter.key}\" is listed twice`);\n }\n\n keys.add(parameter.key);\n\n if (isOptionalSeen && !parameter.optional) {\n problems.push(\n `${label}: the required parameter \"${parameter.key}\" follows an optional one`,\n );\n }\n\n isOptionalSeen = isOptionalSeen || parameter.optional === true;\n }\n\n if (mapping.restKey !== undefined) {\n if (!IDENTIFIER.test(mapping.restKey)) {\n problems.push(`${label}: restKey \"${mapping.restKey}\" is not an identifier`);\n }\n\n if (keys.has(mapping.restKey)) {\n problems.push(`${label}: restKey \"${mapping.restKey}\" is also a parameter key`);\n }\n }\n\n if (mapping.keepsOptions && (mapping.params.length > 0 || mapping.restKey !== undefined)) {\n problems.push(`${label}: keepsOptions leaves params empty and restKey unset`);\n }\n\n for (const module of mapping.modules) {\n const id = `${module}#${mapping.oldName}`;\n\n if (seen.has(id)) {\n problems.push(`${label}: ${mapping.oldName} from ${module} has two entries`);\n }\n\n seen.add(id);\n }\n }\n\n return problems;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rewriter.js","sourceRoot":"","sources":["../../../../src/cli/codemod/namespace-functions/rewriter.ts"],"names":[],"mappings":"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","sourcesContent":["import type ts from 'typescript';\nimport type { INamespaceMapping } from './mapping';\n\ntype TTypeScript = typeof ts;\n\nexport interface INamespaceFunctionsReport {\n line: number;\n column: number;\n reason: string;\n}\n\nexport interface INamespaceFunctionsResult {\n output: string;\n changed: boolean;\n /** How many calls were rewritten. */\n rewritten: number;\n /** What the codemod found and left for a person, with where. */\n reports: INamespaceFunctionsReport[];\n}\n\ninterface IEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** One way the file reaches an old name: a named import of it, or a namespace import of its module. */\ninterface IBinding {\n mapping: INamespaceMapping;\n declaration: ts.ImportDeclaration;\n module: string;\n /** The local name: of the imported function, or of the namespace. */\n local: string;\n /** The identifier that declares `local`. */\n declarationName: ts.Identifier;\n /** The named import; `undefined` for `import * as name`. */\n specifier?: ts.ImportSpecifier;\n}\n\n/** A matched use of an old name: a call to rewrite, or any other use, which is reported. */\ninterface IUses {\n calls: ts.CallExpression[];\n values: ts.Node[];\n}\n\n/**\n * Rewrites the calls of functions that moved into a class, `oldName(a, b)` to\n * `ClassName.method({ first: a, second: b })`, from a mapping table. Syntactic: it reads one file and\n * needs no type checker, so it only follows names imported from a module the table lists. Every edit\n * is a text edit by position: the argument text, its comments and the untouched code stay as they are.\n */\nexport class NamespaceFunctions {\n static rewrite(opts: {\n typescript: TTypeScript;\n fileName: string;\n source: string;\n mappings: ReadonlyArray<INamespaceMapping>;\n }): INamespaceFunctionsResult {\n const { typescript, fileName, source, mappings } = opts;\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n typescript.ScriptTarget.Latest,\n true,\n );\n const reports: INamespaceFunctionsReport[] = [];\n\n const report = (reportOpts: { node: ts.Node; reason: string }) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n reportOpts.node.getStart(sourceFile),\n );\n reports.push({ line: line + 1, column: character + 1, reason: reportOpts.reason });\n };\n\n const lineOf = (node: ts.Node) =>\n sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n\n const byModule = new Map<string, INamespaceMapping[]>();\n for (const mapping of mappings) {\n for (const module of mapping.modules) {\n byModule.set(module, [...(byModule.get(module) ?? []), mapping]);\n }\n }\n\n const bindings = NamespaceFunctions.findBindings({\n typescript,\n sourceFile,\n byModule,\n report,\n });\n if (bindings.length === 0) {\n return { output: source, changed: false, rewritten: 0, reports };\n }\n\n const identifiers = NamespaceFunctions.collectIdentifiers({ typescript, sourceFile });\n const declarationsOf = (name: string) =>\n (identifiers.get(name) ?? []).filter((identifier) =>\n NamespaceFunctions.isDeclarationName({ typescript, identifier }),\n );\n\n const edits: IEdit[] = [];\n const removals = new Set<ts.ImportSpecifier>();\n /** The imports that lose an old name. */\n const trimmed = new Set<ts.ImportDeclaration>();\n const additions = new Map<ts.ImportDeclaration, Set<string>>();\n const newImports = new Map<string, { anchor: ts.ImportDeclaration; names: Set<string> }>();\n /** The class names this run imports, and from which module. */\n const planned = new Map<string, string>();\n let rewritten = 0;\n\n for (const binding of bindings) {\n const { mapping } = binding;\n const uses = NamespaceFunctions.findUses({ typescript, binding, identifiers });\n if (uses.calls.length === 0 && uses.values.length === 0) {\n continue;\n }\n\n const target = NamespaceFunctions.describeTarget({ mapping });\n\n for (const value of uses.values) {\n report({\n node: value,\n reason: `\\`${mapping.oldName}\\` is used as a value (passed, stored, exported or in typeof), so its import stays; change it by hand to ${mapping.className}.${mapping.method}`,\n });\n }\n\n if (uses.calls.length === 0) {\n continue;\n }\n\n const shadow = declarationsOf(binding.local).find(\n (identifier) => identifier !== binding.declarationName,\n );\n if (shadow) {\n report({\n node: shadow,\n reason: `\\`${binding.local}\\` is declared again in this file, so a call cannot be told apart from the import; rewrite the calls of \\`${mapping.oldName}\\` by hand as ${target}`,\n });\n continue;\n }\n\n const classModules = mapping.newModules ?? [binding.module];\n const isNamespaceReach = !binding.specifier && classModules.includes(binding.module);\n let classReference = `${binding.local}.${mapping.className}`;\n let needsImport = false;\n\n if (!isNamespaceReach) {\n const existing = NamespaceFunctions.findClassImport({\n typescript,\n sourceFile,\n className: mapping.className,\n modules: classModules,\n });\n const plannedModule = planned.get(mapping.className);\n const conflict = existing\n ? declarationsOf(existing.text).find((identifier) => identifier !== existing)\n : plannedModule === undefined\n ? declarationsOf(mapping.className)[0]\n : undefined;\n\n if (conflict) {\n report({\n node: uses.calls[0] ?? conflict,\n reason: `the name \\`${conflict.text}\\` is already declared in this file (line ${lineOf(conflict)}), so \\`${mapping.oldName}\\` is left; rewrite its calls by hand as ${target}`,\n });\n continue;\n }\n\n if (!existing && plannedModule !== undefined && !classModules.includes(plannedModule)) {\n report({\n node: uses.calls[0] ?? binding.declaration,\n reason: `\\`${mapping.className}\\` would be imported from both ${plannedModule} and ${classModules[0]}; rewrite the calls of \\`${mapping.oldName}\\` by hand as ${target}`,\n });\n continue;\n }\n\n classReference = existing?.text ?? mapping.className;\n needsImport = !existing && plannedModule === undefined;\n }\n\n let count = 0;\n let left = uses.values.length;\n\n for (const call of uses.calls) {\n const problem = NamespaceFunctions.checkCall({ typescript, call, mapping });\n if (problem) {\n left += 1;\n report({ node: call, reason: `${problem}; rewrite it by hand as ${target}` });\n continue;\n }\n\n edits.push(\n ...NamespaceFunctions.planCall({\n typescript,\n sourceFile,\n call,\n mapping,\n callee: `${classReference}.${mapping.method}`,\n }),\n );\n count += 1;\n }\n\n rewritten += count;\n if (count === 0) {\n continue;\n }\n\n if (needsImport) {\n const sameDeclaration =\n binding.specifier && classModules.includes(binding.module)\n ? binding.declaration\n : undefined;\n const declaration =\n sameDeclaration ??\n NamespaceFunctions.findNamedImport({ typescript, sourceFile, modules: classModules });\n\n if (declaration) {\n additions.set(\n declaration,\n new Set([...(additions.get(declaration) ?? []), mapping.className]),\n );\n planned.set(\n mapping.className,\n sameDeclaration ? binding.module : NamespaceFunctions.moduleOf({ declaration }),\n );\n } else {\n const module = classModules[0] ?? binding.module;\n const entry = newImports.get(module) ?? {\n anchor: binding.declaration,\n names: new Set<string>(),\n };\n entry.names.add(mapping.className);\n newImports.set(module, entry);\n planned.set(mapping.className, module);\n }\n }\n\n if (binding.specifier && left === 0) {\n removals.add(binding.specifier);\n trimmed.add(binding.declaration);\n }\n }\n\n if (rewritten === 0) {\n return { output: source, changed: false, rewritten: 0, reports };\n }\n\n for (const declaration of new Set([...additions.keys(), ...trimmed])) {\n edits.push(\n ...NamespaceFunctions.planImport({\n typescript,\n sourceFile,\n declaration,\n removals,\n additions: [...(additions.get(declaration) ?? [])],\n report,\n }),\n );\n }\n\n for (const [module, { anchor, names }] of newImports) {\n const quote = source.charAt(anchor.moduleSpecifier.getStart(sourceFile));\n edits.push({\n start: anchor.getStart(sourceFile),\n end: anchor.getStart(sourceFile),\n text: `import { ${[...names].join(', ')} } from ${quote}${module}${quote};\\n`,\n });\n }\n\n // At one position a replacement (the longer range) is applied before an insertion, so the\n // inserted key of an outer call lands in front of the rewritten callee of an inner one.\n let output = source;\n for (const edit of edits.sort((a, b) => b.start - a.start || b.end - a.end)) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n\n return { output, changed: output !== source, rewritten, reports };\n }\n\n /** The named and namespace imports of an old name; reports the type-only imports and the re-exports. */\n private static findBindings(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n byModule: Map<string, INamespaceMapping[]>;\n report: (reportOpts: { node: ts.Node; reason: string }) => void;\n }): IBinding[] {\n const { typescript, sourceFile, byModule, report } = opts;\n const bindings: IBinding[] = [];\n\n for (const statement of sourceFile.statements) {\n if (\n typescript.isExportDeclaration(statement) &&\n statement.moduleSpecifier &&\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n statement.exportClause &&\n typescript.isNamedExports(statement.exportClause)\n ) {\n const candidates = byModule.get(statement.moduleSpecifier.text) ?? [];\n for (const element of statement.exportClause.elements) {\n const name = (element.propertyName ?? element.name).text;\n const mapping = candidates.find((candidate) => candidate.oldName === name);\n if (mapping) {\n report({\n node: element,\n reason: `re-exports \\`${name}\\`; re-export ${mapping.className} as well, by hand (the old name goes away in 0.5)`,\n });\n }\n }\n continue;\n }\n\n if (\n !typescript.isImportDeclaration(statement) ||\n !typescript.isStringLiteral(statement.moduleSpecifier) ||\n !statement.importClause\n ) {\n continue;\n }\n\n const module = statement.moduleSpecifier.text;\n const candidates = byModule.get(module);\n const clause = statement.importClause;\n const named = clause.namedBindings;\n if (!candidates || !named) {\n continue;\n }\n\n if (typescript.isNamespaceImport(named)) {\n if (clause.isTypeOnly) {\n continue;\n }\n\n for (const mapping of candidates) {\n bindings.push({\n mapping,\n declaration: statement,\n module,\n local: named.name.text,\n declarationName: named.name,\n });\n }\n continue;\n }\n\n for (const element of named.elements) {\n const imported = (element.propertyName ?? element.name).text;\n const mapping = candidates.find((candidate) => candidate.oldName === imported);\n if (!mapping) {\n continue;\n }\n\n if (clause.isTypeOnly || element.isTypeOnly) {\n report({\n node: element,\n reason: `\\`${imported}\\` is imported as a type only; change it by hand to \\`typeof ${mapping.className}.${mapping.method}\\``,\n });\n continue;\n }\n\n bindings.push({\n mapping,\n declaration: statement,\n module,\n local: element.name.text,\n declarationName: element.name,\n specifier: element,\n });\n }\n }\n\n return bindings;\n }\n\n /** Every identifier of the file by its text; JSDoc is not walked, so a `{@link name}` never counts. */\n private static collectIdentifiers(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n }): Map<string, ts.Identifier[]> {\n const { typescript, sourceFile } = opts;\n const identifiers = new Map<string, ts.Identifier[]>();\n\n const walk = (node: ts.Node): void => {\n if (typescript.isIdentifier(node)) {\n identifiers.set(node.text, [...(identifiers.get(node.text) ?? []), node]);\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(sourceFile);\n return identifiers;\n }\n\n /** The calls of the old name, and every other use of it. */\n private static findUses(opts: {\n typescript: TTypeScript;\n binding: IBinding;\n identifiers: Map<string, ts.Identifier[]>;\n }): IUses {\n const { typescript, binding, identifiers } = opts;\n const uses: IUses = { calls: [], values: [] };\n\n for (const identifier of identifiers.get(binding.local) ?? []) {\n if (\n identifier === binding.declarationName ||\n !NamespaceFunctions.isReference({ typescript, identifier })\n ) {\n continue;\n }\n\n if (!binding.specifier) {\n const parent = identifier.parent;\n const isMember =\n typescript.isPropertyAccessExpression(parent) &&\n parent.expression === identifier &&\n parent.name.text === binding.mapping.oldName;\n\n if (isMember) {\n const call = parent.parent;\n if (typescript.isCallExpression(call) && call.expression === parent) {\n uses.calls.push(call);\n } else {\n uses.values.push(parent);\n }\n continue;\n }\n\n if (\n typescript.isQualifiedName(parent) &&\n parent.left === identifier &&\n parent.right.text === binding.mapping.oldName\n ) {\n uses.values.push(parent);\n }\n continue;\n }\n\n const parent = identifier.parent;\n if (typescript.isCallExpression(parent) && parent.expression === identifier) {\n uses.calls.push(parent);\n continue;\n }\n\n uses.values.push(identifier);\n }\n\n return uses;\n }\n\n /** The identifier names a declaration: a variable, a parameter, a function, a class, an import, a type. */\n private static isDeclarationName(opts: {\n typescript: TTypeScript;\n identifier: ts.Identifier;\n }): boolean {\n const { typescript, identifier } = opts;\n const parent = identifier.parent;\n\n if (\n typescript.isVariableDeclaration(parent) ||\n typescript.isParameter(parent) ||\n typescript.isBindingElement(parent) ||\n typescript.isFunctionDeclaration(parent) ||\n typescript.isFunctionExpression(parent) ||\n typescript.isClassDeclaration(parent) ||\n typescript.isClassExpression(parent) ||\n typescript.isEnumDeclaration(parent) ||\n typescript.isInterfaceDeclaration(parent) ||\n typescript.isTypeAliasDeclaration(parent) ||\n typescript.isModuleDeclaration(parent) ||\n typescript.isImportSpecifier(parent) ||\n typescript.isImportClause(parent) ||\n typescript.isNamespaceImport(parent) ||\n typescript.isImportEqualsDeclaration(parent) ||\n typescript.isTypeParameterDeclaration(parent)\n ) {\n return parent.name === identifier;\n }\n\n return false;\n }\n\n /** The identifier reads a binding: not a property name, a label, a declaration or a lowercase JSX tag. */\n private static isReference(opts: {\n typescript: TTypeScript;\n identifier: ts.Identifier;\n }): boolean {\n const { typescript, identifier } = opts;\n const parent = identifier.parent;\n\n if (NamespaceFunctions.isDeclarationName({ typescript, identifier })) {\n return false;\n }\n\n if (typescript.isPropertyAccessExpression(parent) || typescript.isQualifiedName(parent)) {\n return typescript.isPropertyAccessExpression(parent)\n ? parent.name !== identifier\n : parent.right !== identifier;\n }\n\n if (\n typescript.isPropertyAssignment(parent) ||\n typescript.isPropertyDeclaration(parent) ||\n typescript.isPropertySignature(parent) ||\n typescript.isMethodDeclaration(parent) ||\n typescript.isMethodSignature(parent) ||\n typescript.isGetAccessorDeclaration(parent) ||\n typescript.isSetAccessorDeclaration(parent) ||\n typescript.isEnumMember(parent) ||\n typescript.isJsxAttribute(parent)\n ) {\n return parent.name !== identifier;\n }\n\n if (typescript.isBindingElement(parent)) {\n return parent.propertyName !== identifier;\n }\n\n if (typescript.isExportSpecifier(parent)) {\n return (\n !parent.parent.parent.moduleSpecifier && (parent.propertyName ?? parent.name) === identifier\n );\n }\n\n if (\n typescript.isLabeledStatement(parent) ||\n typescript.isBreakOrContinueStatement(parent) ||\n typescript.isMetaProperty(parent)\n ) {\n return false;\n }\n\n if (\n (typescript.isJsxOpeningElement(parent) ||\n typescript.isJsxSelfClosingElement(parent) ||\n typescript.isJsxClosingElement(parent)) &&\n parent.tagName === identifier\n ) {\n return !/^[a-z]/.test(identifier.text);\n }\n\n return true;\n }\n\n /** Why a call cannot be rewritten, or `undefined` when it can. */\n private static checkCall(opts: {\n typescript: TTypeScript;\n call: ts.CallExpression;\n mapping: INamespaceMapping;\n }): string | undefined {\n const { typescript, call, mapping } = opts;\n const { params, restKey, oldName } = mapping;\n const count = call.arguments.length;\n\n if (mapping.keepsOptions) {\n return undefined;\n }\n\n if (call.arguments.some((argument) => typescript.isSpreadElement(argument))) {\n return `this call of \\`${oldName}\\` has a spread argument`;\n }\n\n const required = params.reduce(\n (last, parameter, index) => (parameter.optional ? last : index + 1),\n 0,\n );\n if (count < required) {\n return `this call of \\`${oldName}\\` passes ${count} argument(s), fewer than the ${required} it needs`;\n }\n\n if (restKey === undefined && count > params.length) {\n return `this call of \\`${oldName}\\` passes ${count} argument(s), more than its ${params.length} parameter(s)`;\n }\n\n return undefined;\n }\n\n /** The edits that turn one call into the class form; the arguments keep their text and comments. */\n private static planCall(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n call: ts.CallExpression;\n mapping: INamespaceMapping;\n callee: string;\n }): IEdit[] {\n const { typescript, sourceFile, call, mapping, callee } = opts;\n const { params, restKey } = mapping;\n const edits: IEdit[] = [\n { start: call.expression.getStart(sourceFile), end: call.expression.end, text: callee },\n ];\n\n if (call.questionDotToken) {\n edits.push({\n start: call.questionDotToken.getStart(sourceFile),\n end: call.questionDotToken.end,\n text: '',\n });\n }\n\n if (mapping.keepsOptions) {\n return edits;\n }\n\n const argumentList = [...call.arguments];\n if (argumentList.length === 0) {\n if (params.length > 0 || restKey !== undefined) {\n const text = restKey === undefined ? '{}' : `{ ${restKey}: [] }`;\n edits.push({ start: call.arguments.pos, end: call.arguments.pos, text });\n }\n return edits;\n }\n\n const insert = (insertOpts: { at: number; text: string }) => {\n if (insertOpts.text !== '') {\n edits.push({ start: insertOpts.at, end: insertOpts.at, text: insertOpts.text });\n }\n };\n\n const positional = argumentList.slice(0, params.length);\n const rest = argumentList.slice(params.length);\n\n positional.forEach((argument, index) => {\n const key = params[index]?.key ?? '';\n const isShorthand = typescript.isIdentifier(argument) && argument.text === key;\n insert({\n at: argument.getStart(sourceFile),\n text: `${index === 0 ? '{ ' : ''}${isShorthand ? '' : `${key}: `}`,\n });\n });\n\n const first = rest[0];\n const last = argumentList[argumentList.length - 1];\n let suffix = ' }';\n\n if (first && restKey !== undefined) {\n insert({\n at: first.getStart(sourceFile),\n text: `${positional.length === 0 ? '{ ' : ''}${restKey}: [`,\n });\n suffix = '] }';\n } else if (restKey !== undefined) {\n suffix = `, ${restKey}: [] }`;\n }\n\n insert({ at: last?.end ?? call.arguments.end, text: suffix });\n return edits;\n }\n\n /** The local name of a value import of the class from one of `modules`. */\n private static findClassImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n className: string;\n modules: string[];\n }): ts.Identifier | undefined {\n const { typescript, sourceFile, className, modules } = opts;\n\n for (const statement of sourceFile.statements) {\n const declaration = NamespaceFunctions.asValueImport({ typescript, statement, modules });\n const named = declaration?.importClause?.namedBindings;\n if (!named || !typescript.isNamedImports(named)) {\n continue;\n }\n\n const element = named.elements.find(\n (candidate) =>\n !candidate.isTypeOnly && (candidate.propertyName ?? candidate.name).text === className,\n );\n if (element) {\n return element.name;\n }\n }\n\n return undefined;\n }\n\n /** The first value import with braces from one of `modules`, to add a class to. */\n private static findNamedImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n modules: string[];\n }): ts.ImportDeclaration | undefined {\n const { typescript, sourceFile, modules } = opts;\n\n for (const statement of sourceFile.statements) {\n const declaration = NamespaceFunctions.asValueImport({ typescript, statement, modules });\n const named = declaration?.importClause?.namedBindings;\n if (declaration && named && typescript.isNamedImports(named)) {\n return declaration;\n }\n }\n\n return undefined;\n }\n\n /** `statement` as an import that is not `import type`, from one of `modules`. */\n private static asValueImport(opts: {\n typescript: TTypeScript;\n statement: ts.Statement;\n modules: string[];\n }): ts.ImportDeclaration | undefined {\n const { typescript, statement, modules } = opts;\n\n if (\n typescript.isImportDeclaration(statement) &&\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n modules.includes(statement.moduleSpecifier.text) &&\n statement.importClause &&\n !statement.importClause.isTypeOnly\n ) {\n return statement;\n }\n\n return undefined;\n }\n\n private static moduleOf(opts: { declaration: ts.ImportDeclaration }): string {\n const specifier = opts.declaration.moduleSpecifier;\n return 'text' in specifier && typeof specifier.text === 'string' ? specifier.text : '';\n }\n\n /**\n * The edit of one import's braces: the removed old names go, the added classes take the place of\n * the first removed one. Braces that hold a comment are not rewritten: the classes are appended\n * and the old names stay, reported. An import left with nothing is removed.\n */\n private static planImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n declaration: ts.ImportDeclaration;\n removals: Set<ts.ImportSpecifier>;\n additions: string[];\n report: (reportOpts: { node: ts.Node; reason: string }) => void;\n }): IEdit[] {\n const { typescript, sourceFile, declaration, removals, additions, report } = opts;\n const clause = declaration.importClause;\n const named = clause?.namedBindings;\n if (!clause || !named || !typescript.isNamedImports(named)) {\n return [];\n }\n\n const source = sourceFile.text;\n const elements = [...named.elements];\n const braces = source.slice(named.getStart(sourceFile), named.end);\n\n if (/\\/\\*|\\/\\//.test(braces)) {\n for (const element of elements.filter((candidate) => removals.has(candidate))) {\n report({\n node: element,\n reason: `the braces of this import hold a comment, so \\`${element.name.text}\\` stays imported; remove it by hand`,\n });\n }\n\n const last = elements[elements.length - 1];\n if (!last || additions.length === 0) {\n return [];\n }\n\n return [{ start: last.end, end: last.end, text: `, ${additions.join(', ')}` }];\n }\n\n const items: string[] = [];\n let isPlaced = false;\n for (const element of elements) {\n if (!removals.has(element)) {\n items.push(element.getText(sourceFile));\n continue;\n }\n\n if (!isPlaced) {\n items.push(...additions);\n isPlaced = true;\n }\n }\n\n if (!isPlaced) {\n items.push(...additions);\n }\n\n if (items.length > 0) {\n const start = named.getStart(sourceFile);\n const lineStart = source.lastIndexOf('\\n', declaration.getStart(sourceFile)) + 1;\n const indent = /^[ \\t]*/.exec(source.slice(lineStart))?.[0] ?? '';\n const text = braces.includes('\\n')\n ? `{\\n${indent} ${items.join(`,\\n${indent} `)},\\n${indent}}`\n : `{ ${items.join(', ')} }`;\n\n return [{ start, end: named.end, text }];\n }\n\n if (clause.name) {\n return [{ start: clause.name.end, end: named.end, text: '' }];\n }\n\n const start = declaration.getStart(sourceFile);\n const newline = /^\\r?\\n/.exec(source.slice(declaration.end))?.[0] ?? '';\n return [{ start, end: declaration.end + newline.length, text: '' }];\n }\n\n /** The call the old one becomes, for a report: `ParseUtility.toFloat({ input, digit })`. */\n private static describeTarget(opts: { mapping: INamespaceMapping }): string {\n const { className, method, params, restKey } = opts.mapping;\n const keys = [...params.map((parameter) => parameter.key), ...(restKey ? [restKey] : [])];\n return keys.length === 0\n ? `${className}.${method}()`\n : `${className}.${method}({ ${keys.join(', ')} })`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rewriter.js","sourceRoot":"","sources":["../../../../src/cli/codemod/namespace-functions/rewriter.ts"],"names":[],"mappings":"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","sourcesContent":["import type ts from 'typescript';\nimport type { INamespaceMapping } from './mapping';\n\ntype TTypeScript = typeof ts;\n\nexport interface INamespaceFunctionsReport {\n line: number;\n column: number;\n reason: string;\n}\n\nexport interface INamespaceFunctionsResult {\n output: string;\n changed: boolean;\n /** How many calls were rewritten. */\n rewritten: number;\n /** What the codemod found and left for a person, with where. */\n reports: INamespaceFunctionsReport[];\n}\n\ninterface IEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** One way the file reaches an old name: a named import of it, or a namespace import of its module. */\ninterface IBinding {\n mapping: INamespaceMapping;\n declaration: ts.ImportDeclaration;\n module: string;\n /** The local name: of the imported function, or of the namespace. */\n local: string;\n /** The identifier that declares `local`. */\n declarationName: ts.Identifier;\n /** The named import; `undefined` for `import * as name`. */\n specifier?: ts.ImportSpecifier;\n}\n\n/** A matched use of an old name: a call to rewrite, or any other use, which is reported. */\ninterface IUses {\n calls: ts.CallExpression[];\n values: ts.Node[];\n}\n\n/**\n * Rewrites the calls of functions that moved into a class, `oldName(a, b)` to\n * `ClassName.method({ first: a, second: b })`, from a mapping table. Syntactic: it reads one file and\n * needs no type checker, so it only follows names imported from a module the table lists. Every edit\n * is a text edit by position: the argument text, its comments and the untouched code stay as they are.\n */\nexport class NamespaceFunctions {\n static rewrite(opts: {\n typescript: TTypeScript;\n fileName: string;\n source: string;\n mappings: ReadonlyArray<INamespaceMapping>;\n }): INamespaceFunctionsResult {\n const { typescript, fileName, source, mappings } = opts;\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n typescript.ScriptTarget.Latest,\n true,\n );\n const reports: INamespaceFunctionsReport[] = [];\n\n const report = (reportOpts: { node: ts.Node; reason: string }) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n reportOpts.node.getStart(sourceFile),\n );\n reports.push({ line: line + 1, column: character + 1, reason: reportOpts.reason });\n };\n\n const lineOf = (node: ts.Node) =>\n sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n\n const byModule = new Map<string, INamespaceMapping[]>();\n\n for (const mapping of mappings) {\n for (const module of mapping.modules) {\n byModule.set(module, [...(byModule.get(module) ?? []), mapping]);\n }\n }\n\n const bindings = NamespaceFunctions.findBindings({\n typescript,\n sourceFile,\n byModule,\n report,\n });\n\n if (bindings.length === 0) {\n return { output: source, changed: false, rewritten: 0, reports };\n }\n\n const identifiers = NamespaceFunctions.collectIdentifiers({ typescript, sourceFile });\n const declarationsOf = (name: string) =>\n (identifiers.get(name) ?? []).filter((identifier) =>\n NamespaceFunctions.isDeclarationName({ typescript, identifier }),\n );\n\n const edits: IEdit[] = [];\n const removals = new Set<ts.ImportSpecifier>();\n /** The imports that lose an old name. */\n const trimmed = new Set<ts.ImportDeclaration>();\n const additions = new Map<ts.ImportDeclaration, Set<string>>();\n const newImports = new Map<string, { anchor: ts.ImportDeclaration; names: Set<string> }>();\n /** The class names this run imports, and from which module. */\n const planned = new Map<string, string>();\n let rewritten = 0;\n\n for (const binding of bindings) {\n const { mapping } = binding;\n const uses = NamespaceFunctions.findUses({ typescript, binding, identifiers });\n\n if (uses.calls.length === 0 && uses.values.length === 0) {\n continue;\n }\n\n const target = NamespaceFunctions.describeTarget({ mapping });\n\n for (const value of uses.values) {\n report({\n node: value,\n reason: `\\`${mapping.oldName}\\` is used as a value (passed, stored, exported or in typeof), so its import stays; change it by hand to ${mapping.className}.${mapping.method}`,\n });\n }\n\n if (uses.calls.length === 0) {\n continue;\n }\n\n const shadow = declarationsOf(binding.local).find(\n (identifier) => identifier !== binding.declarationName,\n );\n\n if (shadow) {\n report({\n node: shadow,\n reason: `\\`${binding.local}\\` is declared again in this file, so a call cannot be told apart from the import; rewrite the calls of \\`${mapping.oldName}\\` by hand as ${target}`,\n });\n continue;\n }\n\n const classModules = mapping.newModules ?? [binding.module];\n const isNamespaceReach = !binding.specifier && classModules.includes(binding.module);\n let classReference = `${binding.local}.${mapping.className}`;\n let needsImport = false;\n\n if (!isNamespaceReach) {\n const existing = NamespaceFunctions.findClassImport({\n typescript,\n sourceFile,\n className: mapping.className,\n modules: classModules,\n });\n const plannedModule = planned.get(mapping.className);\n const conflict = existing\n ? declarationsOf(existing.text).find((identifier) => identifier !== existing)\n : plannedModule === undefined\n ? declarationsOf(mapping.className)[0]\n : undefined;\n\n if (conflict) {\n report({\n node: uses.calls[0] ?? conflict,\n reason: `the name \\`${conflict.text}\\` is already declared in this file (line ${lineOf(conflict)}), so \\`${mapping.oldName}\\` is left; rewrite its calls by hand as ${target}`,\n });\n continue;\n }\n\n if (!existing && plannedModule !== undefined && !classModules.includes(plannedModule)) {\n report({\n node: uses.calls[0] ?? binding.declaration,\n reason: `\\`${mapping.className}\\` would be imported from both ${plannedModule} and ${classModules[0]}; rewrite the calls of \\`${mapping.oldName}\\` by hand as ${target}`,\n });\n continue;\n }\n\n classReference = existing?.text ?? mapping.className;\n needsImport = !existing && plannedModule === undefined;\n }\n\n let count = 0;\n let left = uses.values.length;\n\n for (const call of uses.calls) {\n const problem = NamespaceFunctions.checkCall({ typescript, call, mapping });\n\n if (problem) {\n left += 1;\n report({ node: call, reason: `${problem}; rewrite it by hand as ${target}` });\n continue;\n }\n\n edits.push(\n ...NamespaceFunctions.planCall({\n typescript,\n sourceFile,\n call,\n mapping,\n callee: `${classReference}.${mapping.method}`,\n }),\n );\n count += 1;\n }\n\n rewritten += count;\n\n if (count === 0) {\n continue;\n }\n\n if (needsImport) {\n const sameDeclaration =\n binding.specifier && classModules.includes(binding.module)\n ? binding.declaration\n : undefined;\n const declaration =\n sameDeclaration ??\n NamespaceFunctions.findNamedImport({ typescript, sourceFile, modules: classModules });\n\n if (declaration) {\n additions.set(\n declaration,\n new Set([...(additions.get(declaration) ?? []), mapping.className]),\n );\n planned.set(\n mapping.className,\n sameDeclaration ? binding.module : NamespaceFunctions.moduleOf({ declaration }),\n );\n } else {\n const module = classModules[0] ?? binding.module;\n const entry = newImports.get(module) ?? {\n anchor: binding.declaration,\n names: new Set<string>(),\n };\n entry.names.add(mapping.className);\n newImports.set(module, entry);\n planned.set(mapping.className, module);\n }\n }\n\n if (binding.specifier && left === 0) {\n removals.add(binding.specifier);\n trimmed.add(binding.declaration);\n }\n }\n\n if (rewritten === 0) {\n return { output: source, changed: false, rewritten: 0, reports };\n }\n\n for (const declaration of new Set([...additions.keys(), ...trimmed])) {\n edits.push(\n ...NamespaceFunctions.planImport({\n typescript,\n sourceFile,\n declaration,\n removals,\n additions: [...(additions.get(declaration) ?? [])],\n report,\n }),\n );\n }\n\n for (const [module, { anchor, names }] of newImports) {\n const quote = source.charAt(anchor.moduleSpecifier.getStart(sourceFile));\n edits.push({\n start: anchor.getStart(sourceFile),\n end: anchor.getStart(sourceFile),\n text: `import { ${[...names].join(', ')} } from ${quote}${module}${quote};\\n`,\n });\n }\n\n // At one position a replacement (the longer range) is applied before an insertion, so the\n // inserted key of an outer call lands in front of the rewritten callee of an inner one.\n let output = source;\n\n for (const edit of edits.sort((a, b) => b.start - a.start || b.end - a.end)) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n\n return { output, changed: output !== source, rewritten, reports };\n }\n\n /** The named and namespace imports of an old name; reports the type-only imports and the re-exports. */\n private static findBindings(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n byModule: Map<string, INamespaceMapping[]>;\n report: (reportOpts: { node: ts.Node; reason: string }) => void;\n }): IBinding[] {\n const { typescript, sourceFile, byModule, report } = opts;\n const bindings: IBinding[] = [];\n\n for (const statement of sourceFile.statements) {\n if (\n typescript.isExportDeclaration(statement) &&\n statement.moduleSpecifier &&\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n statement.exportClause &&\n typescript.isNamedExports(statement.exportClause)\n ) {\n const candidates = byModule.get(statement.moduleSpecifier.text) ?? [];\n\n for (const element of statement.exportClause.elements) {\n const name = (element.propertyName ?? element.name).text;\n const mapping = candidates.find((candidate) => candidate.oldName === name);\n\n if (mapping) {\n report({\n node: element,\n reason: `re-exports \\`${name}\\`; re-export ${mapping.className} as well, by hand (the old name goes away in 0.5)`,\n });\n }\n }\n\n continue;\n }\n\n if (\n !typescript.isImportDeclaration(statement) ||\n !typescript.isStringLiteral(statement.moduleSpecifier) ||\n !statement.importClause\n ) {\n continue;\n }\n\n const module = statement.moduleSpecifier.text;\n const candidates = byModule.get(module);\n const clause = statement.importClause;\n const named = clause.namedBindings;\n\n if (!candidates || !named) {\n continue;\n }\n\n if (typescript.isNamespaceImport(named)) {\n if (clause.isTypeOnly) {\n continue;\n }\n\n for (const mapping of candidates) {\n bindings.push({\n mapping,\n declaration: statement,\n module,\n local: named.name.text,\n declarationName: named.name,\n });\n }\n\n continue;\n }\n\n for (const element of named.elements) {\n const imported = (element.propertyName ?? element.name).text;\n const mapping = candidates.find((candidate) => candidate.oldName === imported);\n\n if (!mapping) {\n continue;\n }\n\n if (clause.isTypeOnly || element.isTypeOnly) {\n report({\n node: element,\n reason: `\\`${imported}\\` is imported as a type only; change it by hand to \\`typeof ${mapping.className}.${mapping.method}\\``,\n });\n continue;\n }\n\n bindings.push({\n mapping,\n declaration: statement,\n module,\n local: element.name.text,\n declarationName: element.name,\n specifier: element,\n });\n }\n }\n\n return bindings;\n }\n\n /** Every identifier of the file by its text; JSDoc is not walked, so a `{@link name}` never counts. */\n private static collectIdentifiers(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n }): Map<string, ts.Identifier[]> {\n const { typescript, sourceFile } = opts;\n const identifiers = new Map<string, ts.Identifier[]>();\n\n const walk = (node: ts.Node): void => {\n if (typescript.isIdentifier(node)) {\n identifiers.set(node.text, [...(identifiers.get(node.text) ?? []), node]);\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(sourceFile);\n\n return identifiers;\n }\n\n /** The calls of the old name, and every other use of it. */\n private static findUses(opts: {\n typescript: TTypeScript;\n binding: IBinding;\n identifiers: Map<string, ts.Identifier[]>;\n }): IUses {\n const { typescript, binding, identifiers } = opts;\n const uses: IUses = { calls: [], values: [] };\n\n for (const identifier of identifiers.get(binding.local) ?? []) {\n if (\n identifier === binding.declarationName ||\n !NamespaceFunctions.isReference({ typescript, identifier })\n ) {\n continue;\n }\n\n if (!binding.specifier) {\n const parent = identifier.parent;\n const isMember =\n typescript.isPropertyAccessExpression(parent) &&\n parent.expression === identifier &&\n parent.name.text === binding.mapping.oldName;\n\n if (isMember) {\n const call = parent.parent;\n\n if (typescript.isCallExpression(call) && call.expression === parent) {\n uses.calls.push(call);\n } else {\n uses.values.push(parent);\n }\n\n continue;\n }\n\n if (\n typescript.isQualifiedName(parent) &&\n parent.left === identifier &&\n parent.right.text === binding.mapping.oldName\n ) {\n uses.values.push(parent);\n }\n\n continue;\n }\n\n const parent = identifier.parent;\n\n if (typescript.isCallExpression(parent) && parent.expression === identifier) {\n uses.calls.push(parent);\n continue;\n }\n\n uses.values.push(identifier);\n }\n\n return uses;\n }\n\n /** The identifier names a declaration: a variable, a parameter, a function, a class, an import, a type. */\n private static isDeclarationName(opts: {\n typescript: TTypeScript;\n identifier: ts.Identifier;\n }): boolean {\n const { typescript, identifier } = opts;\n const parent = identifier.parent;\n\n if (\n typescript.isVariableDeclaration(parent) ||\n typescript.isParameter(parent) ||\n typescript.isBindingElement(parent) ||\n typescript.isFunctionDeclaration(parent) ||\n typescript.isFunctionExpression(parent) ||\n typescript.isClassDeclaration(parent) ||\n typescript.isClassExpression(parent) ||\n typescript.isEnumDeclaration(parent) ||\n typescript.isInterfaceDeclaration(parent) ||\n typescript.isTypeAliasDeclaration(parent) ||\n typescript.isModuleDeclaration(parent) ||\n typescript.isImportSpecifier(parent) ||\n typescript.isImportClause(parent) ||\n typescript.isNamespaceImport(parent) ||\n typescript.isImportEqualsDeclaration(parent) ||\n typescript.isTypeParameterDeclaration(parent)\n ) {\n return parent.name === identifier;\n }\n\n return false;\n }\n\n /** The identifier reads a binding: not a property name, a label, a declaration or a lowercase JSX tag. */\n private static isReference(opts: {\n typescript: TTypeScript;\n identifier: ts.Identifier;\n }): boolean {\n const { typescript, identifier } = opts;\n const parent = identifier.parent;\n\n if (NamespaceFunctions.isDeclarationName({ typescript, identifier })) {\n return false;\n }\n\n if (typescript.isPropertyAccessExpression(parent) || typescript.isQualifiedName(parent)) {\n return typescript.isPropertyAccessExpression(parent)\n ? parent.name !== identifier\n : parent.right !== identifier;\n }\n\n if (\n typescript.isPropertyAssignment(parent) ||\n typescript.isPropertyDeclaration(parent) ||\n typescript.isPropertySignature(parent) ||\n typescript.isMethodDeclaration(parent) ||\n typescript.isMethodSignature(parent) ||\n typescript.isGetAccessorDeclaration(parent) ||\n typescript.isSetAccessorDeclaration(parent) ||\n typescript.isEnumMember(parent) ||\n typescript.isJsxAttribute(parent)\n ) {\n return parent.name !== identifier;\n }\n\n if (typescript.isBindingElement(parent)) {\n return parent.propertyName !== identifier;\n }\n\n if (typescript.isExportSpecifier(parent)) {\n return (\n !parent.parent.parent.moduleSpecifier && (parent.propertyName ?? parent.name) === identifier\n );\n }\n\n if (\n typescript.isLabeledStatement(parent) ||\n typescript.isBreakOrContinueStatement(parent) ||\n typescript.isMetaProperty(parent)\n ) {\n return false;\n }\n\n if (\n (typescript.isJsxOpeningElement(parent) ||\n typescript.isJsxSelfClosingElement(parent) ||\n typescript.isJsxClosingElement(parent)) &&\n parent.tagName === identifier\n ) {\n return !/^[a-z]/.test(identifier.text);\n }\n\n return true;\n }\n\n /** Why a call cannot be rewritten, or `undefined` when it can. */\n private static checkCall(opts: {\n typescript: TTypeScript;\n call: ts.CallExpression;\n mapping: INamespaceMapping;\n }): string | undefined {\n const { typescript, call, mapping } = opts;\n const { params, restKey, oldName } = mapping;\n const count = call.arguments.length;\n\n if (mapping.keepsOptions) {\n return undefined;\n }\n\n if (call.arguments.some((argument) => typescript.isSpreadElement(argument))) {\n return `this call of \\`${oldName}\\` has a spread argument`;\n }\n\n const required = params.reduce(\n (last, parameter, index) => (parameter.optional ? last : index + 1),\n 0,\n );\n\n if (count < required) {\n return `this call of \\`${oldName}\\` passes ${count} argument(s), fewer than the ${required} it needs`;\n }\n\n if (restKey === undefined && count > params.length) {\n return `this call of \\`${oldName}\\` passes ${count} argument(s), more than its ${params.length} parameter(s)`;\n }\n\n return undefined;\n }\n\n /** The edits that turn one call into the class form; the arguments keep their text and comments. */\n private static planCall(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n call: ts.CallExpression;\n mapping: INamespaceMapping;\n callee: string;\n }): IEdit[] {\n const { typescript, sourceFile, call, mapping, callee } = opts;\n const { params, restKey } = mapping;\n const edits: IEdit[] = [\n { start: call.expression.getStart(sourceFile), end: call.expression.end, text: callee },\n ];\n\n if (call.questionDotToken) {\n edits.push({\n start: call.questionDotToken.getStart(sourceFile),\n end: call.questionDotToken.end,\n text: '',\n });\n }\n\n if (mapping.keepsOptions) {\n return edits;\n }\n\n const argumentList = [...call.arguments];\n\n if (argumentList.length === 0) {\n if (params.length > 0 || restKey !== undefined) {\n const text = restKey === undefined ? '{}' : `{ ${restKey}: [] }`;\n edits.push({ start: call.arguments.pos, end: call.arguments.pos, text });\n }\n\n return edits;\n }\n\n const insert = (insertOpts: { at: number; text: string }) => {\n if (insertOpts.text !== '') {\n edits.push({ start: insertOpts.at, end: insertOpts.at, text: insertOpts.text });\n }\n };\n\n const positional = argumentList.slice(0, params.length);\n const rest = argumentList.slice(params.length);\n\n positional.forEach((argument, index) => {\n const key = params[index]?.key ?? '';\n const isShorthand = typescript.isIdentifier(argument) && argument.text === key;\n insert({\n at: argument.getStart(sourceFile),\n text: `${index === 0 ? '{ ' : ''}${isShorthand ? '' : `${key}: `}`,\n });\n });\n\n const first = rest[0];\n const last = argumentList[argumentList.length - 1];\n let suffix = ' }';\n\n if (first && restKey !== undefined) {\n insert({\n at: first.getStart(sourceFile),\n text: `${positional.length === 0 ? '{ ' : ''}${restKey}: [`,\n });\n suffix = '] }';\n } else if (restKey !== undefined) {\n suffix = `, ${restKey}: [] }`;\n }\n\n insert({ at: last?.end ?? call.arguments.end, text: suffix });\n\n return edits;\n }\n\n /** The local name of a value import of the class from one of `modules`. */\n private static findClassImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n className: string;\n modules: string[];\n }): ts.Identifier | undefined {\n const { typescript, sourceFile, className, modules } = opts;\n\n for (const statement of sourceFile.statements) {\n const declaration = NamespaceFunctions.asValueImport({ typescript, statement, modules });\n const named = declaration?.importClause?.namedBindings;\n\n if (!named || !typescript.isNamedImports(named)) {\n continue;\n }\n\n const element = named.elements.find(\n (candidate) =>\n !candidate.isTypeOnly && (candidate.propertyName ?? candidate.name).text === className,\n );\n\n if (element) {\n return element.name;\n }\n }\n\n return undefined;\n }\n\n /** The first value import with braces from one of `modules`, to add a class to. */\n private static findNamedImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n modules: string[];\n }): ts.ImportDeclaration | undefined {\n const { typescript, sourceFile, modules } = opts;\n\n for (const statement of sourceFile.statements) {\n const declaration = NamespaceFunctions.asValueImport({ typescript, statement, modules });\n const named = declaration?.importClause?.namedBindings;\n\n if (declaration && named && typescript.isNamedImports(named)) {\n return declaration;\n }\n }\n\n return undefined;\n }\n\n /** `statement` as an import that is not `import type`, from one of `modules`. */\n private static asValueImport(opts: {\n typescript: TTypeScript;\n statement: ts.Statement;\n modules: string[];\n }): ts.ImportDeclaration | undefined {\n const { typescript, statement, modules } = opts;\n\n if (\n typescript.isImportDeclaration(statement) &&\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n modules.includes(statement.moduleSpecifier.text) &&\n statement.importClause &&\n !statement.importClause.isTypeOnly\n ) {\n return statement;\n }\n\n return undefined;\n }\n\n private static moduleOf(opts: { declaration: ts.ImportDeclaration }): string {\n const specifier = opts.declaration.moduleSpecifier;\n\n return 'text' in specifier && typeof specifier.text === 'string' ? specifier.text : '';\n }\n\n /**\n * The edit of one import's braces: the removed old names go, the added classes take the place of\n * the first removed one. Braces that hold a comment are not rewritten: the classes are appended\n * and the old names stay, reported. An import left with nothing is removed.\n */\n private static planImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n declaration: ts.ImportDeclaration;\n removals: Set<ts.ImportSpecifier>;\n additions: string[];\n report: (reportOpts: { node: ts.Node; reason: string }) => void;\n }): IEdit[] {\n const { typescript, sourceFile, declaration, removals, additions, report } = opts;\n const clause = declaration.importClause;\n const named = clause?.namedBindings;\n\n if (!clause || !named || !typescript.isNamedImports(named)) {\n return [];\n }\n\n const source = sourceFile.text;\n const elements = [...named.elements];\n const braces = source.slice(named.getStart(sourceFile), named.end);\n\n if (/\\/\\*|\\/\\//.test(braces)) {\n for (const element of elements.filter((candidate) => removals.has(candidate))) {\n report({\n node: element,\n reason: `the braces of this import hold a comment, so \\`${element.name.text}\\` stays imported; remove it by hand`,\n });\n }\n\n const last = elements[elements.length - 1];\n\n if (!last || additions.length === 0) {\n return [];\n }\n\n return [{ start: last.end, end: last.end, text: `, ${additions.join(', ')}` }];\n }\n\n const items: string[] = [];\n let isPlaced = false;\n\n for (const element of elements) {\n if (!removals.has(element)) {\n items.push(element.getText(sourceFile));\n continue;\n }\n\n if (!isPlaced) {\n items.push(...additions);\n isPlaced = true;\n }\n }\n\n if (!isPlaced) {\n items.push(...additions);\n }\n\n if (items.length > 0) {\n const start = named.getStart(sourceFile);\n const lineStart = source.lastIndexOf('\\n', declaration.getStart(sourceFile)) + 1;\n const indent = /^[ \\t]*/.exec(source.slice(lineStart))?.[0] ?? '';\n const text = braces.includes('\\n')\n ? `{\\n${indent} ${items.join(`,\\n${indent} `)},\\n${indent}}`\n : `{ ${items.join(', ')} }`;\n\n return [{ start, end: named.end, text }];\n }\n\n if (clause.name) {\n return [{ start: clause.name.end, end: named.end, text: '' }];\n }\n\n const start = declaration.getStart(sourceFile);\n const newline = /^\\r?\\n/.exec(source.slice(declaration.end))?.[0] ?? '';\n\n return [{ start, end: declaration.end + newline.length, text: '' }];\n }\n\n /** The call the old one becomes, for a report: `ParseUtility.toFloat({ input, digit })`. */\n private static describeTarget(opts: { mapping: INamespaceMapping }): string {\n const { className, method, params, restKey } = opts.mapping;\n const keys = [...params.map((parameter) => parameter.key), ...(restKey ? [restKey] : [])];\n\n return keys.length === 0\n ? `${className}.${method}()`\n : `${className}.${method}({ ${keys.join(', ')} })`;\n }\n}\n"]}
|