@venizia/dev-configs 0.4.6-0 → 0.4.7-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.
Files changed (68) hide show
  1. package/dist/checks/catalog.d.ts.map +1 -1
  2. package/dist/checks/catalog.js +4 -2
  3. package/dist/checks/catalog.js.map +1 -1
  4. package/dist/checks/purity/probe.d.ts.map +1 -1
  5. package/dist/checks/purity/probe.js +2 -1
  6. package/dist/checks/purity/probe.js.map +1 -1
  7. package/dist/checks/test-controls.d.ts.map +1 -1
  8. package/dist/checks/test-controls.js +2 -1
  9. package/dist/checks/test-controls.js.map +1 -1
  10. package/dist/cli/codemod/async-style.d.ts +41 -0
  11. package/dist/cli/codemod/async-style.d.ts.map +1 -0
  12. package/dist/cli/codemod/async-style.js +166 -0
  13. package/dist/cli/codemod/async-style.js.map +1 -0
  14. package/dist/cli/codemod/const-classes.d.ts.map +1 -1
  15. package/dist/cli/codemod/const-classes.js +2 -1
  16. package/dist/cli/codemod/const-classes.js.map +1 -1
  17. package/dist/cli/codemod/drop-redundant-casts.d.ts.map +1 -1
  18. package/dist/cli/codemod/drop-redundant-casts.js +2 -1
  19. package/dist/cli/codemod/drop-redundant-casts.js.map +1 -1
  20. package/dist/cli/codemod/files.d.ts +7 -0
  21. package/dist/cli/codemod/files.d.ts.map +1 -1
  22. package/dist/cli/codemod/files.js +33 -0
  23. package/dist/cli/codemod/files.js.map +1 -1
  24. package/dist/cli/codemod/index.d.ts.map +1 -1
  25. package/dist/cli/codemod/index.js +7 -2
  26. package/dist/cli/codemod/index.js.map +1 -1
  27. package/dist/cli/index.js +1 -0
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/linters/house/await-support.d.ts +60 -0
  30. package/dist/linters/house/await-support.d.ts.map +1 -0
  31. package/dist/linters/house/await-support.js +209 -0
  32. package/dist/linters/house/await-support.js.map +1 -0
  33. package/dist/linters/house/common.d.ts +2 -0
  34. package/dist/linters/house/common.d.ts.map +1 -1
  35. package/dist/linters/house/common.js +2 -0
  36. package/dist/linters/house/common.js.map +1 -1
  37. package/dist/linters/house/configs.d.ts +23 -0
  38. package/dist/linters/house/configs.d.ts.map +1 -1
  39. package/dist/linters/house/configs.js +46 -1
  40. package/dist/linters/house/configs.js.map +1 -1
  41. package/dist/linters/house/effect-cleanup-consistency.rule.d.ts +17 -0
  42. package/dist/linters/house/effect-cleanup-consistency.rule.d.ts.map +1 -0
  43. package/dist/linters/house/effect-cleanup-consistency.rule.js +87 -0
  44. package/dist/linters/house/effect-cleanup-consistency.rule.js.map +1 -0
  45. package/dist/linters/house/hook-support.d.ts +29 -0
  46. package/dist/linters/house/hook-support.d.ts.map +1 -0
  47. package/dist/linters/house/hook-support.js +69 -0
  48. package/dist/linters/house/hook-support.js.map +1 -0
  49. package/dist/linters/house/index.d.ts +6 -0
  50. package/dist/linters/house/index.d.ts.map +1 -1
  51. package/dist/linters/house/index.js +6 -0
  52. package/dist/linters/house/index.js.map +1 -1
  53. package/dist/linters/house/no-async-hook-callback.rule.d.ts +18 -0
  54. package/dist/linters/house/no-async-hook-callback.rule.d.ts.map +1 -0
  55. package/dist/linters/house/no-async-hook-callback.rule.js +50 -0
  56. package/dist/linters/house/no-async-hook-callback.rule.js.map +1 -0
  57. package/dist/linters/house/no-inline-await.rule.d.ts +20 -0
  58. package/dist/linters/house/no-inline-await.rule.d.ts.map +1 -0
  59. package/dist/linters/house/no-inline-await.rule.js +76 -0
  60. package/dist/linters/house/no-inline-await.rule.js.map +1 -0
  61. package/dist/linters/house/no-return-await.rule.d.ts +15 -0
  62. package/dist/linters/house/no-return-await.rule.d.ts.map +1 -0
  63. package/dist/linters/house/no-return-await.rule.js +92 -0
  64. package/dist/linters/house/no-return-await.rule.js.map +1 -0
  65. package/dist/linters/house/plugin.d.ts.map +1 -1
  66. package/dist/linters/house/plugin.js +8 -0
  67. package/dist/linters/house/plugin.js.map +1 -1
  68. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"const-classes.js","sourceRoot":"","sources":["../../../src/cli/codemod/const-classes.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport type ts from 'typescript';\nimport { CodemodFiles } from './files';\n\ntype TTypeScript = typeof ts;\n\nconst DEFAULT_IMPORT_FROM = '@venizia/ignis-helpers/common';\nconst TEST_FILE_PATTERN = /(?:^|\\/)__tests__\\/|\\.(?:test|spec)\\.[cm]?tsx?$/;\n/** Utility types whose type argument is a set of keys, not an enumerable value. */\nconst KEY_SET_TYPES = new Set(['Pick', 'Omit', 'Extract', 'Exclude', 'Record']);\n/** A file that can hold a string-literal union: a quote beside a `|`. */\nconst UNION_TEXT = /\\|\\s*['\"]|['\"]\\s*\\|/;\nconst RESERVED_KEYS = new Set(['SCHEME_SET']);\n\n/** What the user may change for one declaration, from the mapping file. */\nexport interface IConstClassOverride {\n /** The class name. */\n class?: string;\n /** The type name; only a property of an interface or object type gets a new one. */\n type?: string;\n /** A member key per literal value: `{ \"read-only\": \"READ_ONLY\" }`. */\n members?: Record<string, string>;\n /** Leave this declaration alone. */\n skip?: boolean;\n}\n\nexport type TConstClassMap = Record<string, IConstClassOverride>;\n\nexport interface IConstClassProposal {\n /** The key of the mapping file: `path/to/file.ts#TName` or `path/to/file.ts#IContainer.property`. */\n id: string;\n line: number;\n className: string;\n typeName: string;\n /** The literal values and the member key each one gets, in order. */\n members: Array<{ value: string; key: string }>;\n /** What the union also held: `null` or `undefined`. */\n nullish: string[];\n}\n\nexport interface IConstClassUntouched {\n line: number;\n column: number;\n reason: string;\n}\n\nexport interface IConstClassResult {\n output: string;\n changed: boolean;\n proposals: IConstClassProposal[];\n untouched: IConstClassUntouched[];\n}\n\ninterface IEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** The plural of a PascalCase word, for the class that holds its values. */\nconst pluralize = (word: string): string => {\n const alreadyPlural = /[^uis]s$/.test(word) || /ings$/.test(word);\n if (alreadyPlural) {\n return word;\n }\n\n if (/(s|x|z|ch|sh)$/.test(word)) {\n return `${word}es`;\n }\n\n if (/[^aeiou]y$/.test(word)) {\n return `${word.slice(0, -1)}ies`;\n }\n\n return `${word}s`;\n};\n\n/** `read-only`, `readOnly` and `string[]` become `READ_ONLY`, `READ_ONLY` and `STRING_ARRAY`; `undefined` when nothing is left. */\nconst toKey = (value: string): string | undefined => {\n const key = value\n .replace(/\\[\\]/g, '_ARRAY_')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^A-Za-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase();\n\n if (key === '') {\n return undefined;\n }\n\n return /^[0-9]/.test(key) ? `_${key}` : key;\n};\n\nconst pascal = (word: string): string => `${word.charAt(0).toUpperCase()}${word.slice(1)}`;\n\n/**\n * Turns the string-literal unions of exported declarations into const classes: an exported type\n * alias, and a property of an exported interface or object type. The values stay the same, so every\n * existing literal still type-checks and no call site changes. A union it cannot name is reported.\n */\nexport class ConstClasses {\n static convert(opts: {\n typescript: TTypeScript;\n fileName: string;\n source: string;\n /** The id prefix of the mapping file: the path of the file relative to the project root. */\n relativePath?: string;\n overrides?: TConstClassMap;\n importFrom?: string;\n }): IConstClassResult {\n const { typescript, fileName, source, overrides = {}, importFrom = DEFAULT_IMPORT_FROM } = opts;\n const relativePath = opts.relativePath ?? fileName;\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n typescript.ScriptTarget.Latest,\n true,\n );\n const taken = ConstClasses.declaredNames({ typescript, sourceFile });\n const proposals: IConstClassProposal[] = [];\n const untouched: IConstClassUntouched[] = [];\n const edits: IEdit[] = [];\n const insertions = new Map<number, string[]>();\n const handled = new Set<ts.Node>();\n\n const report = (node: ts.Node, reason: string) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n );\n untouched.push({ line: line + 1, column: character + 1, reason });\n };\n\n const lineOf = (node: ts.Node) =>\n sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n\n /** Plans one conversion; `undefined` and a report when the names or the members do not work. */\n const plan = (planOpts: {\n node: ts.UnionTypeNode;\n id: string;\n className: string;\n typeName: string;\n anchor: ts.Node;\n mayRenameType: boolean;\n }): void => {\n const { node, id, anchor } = planOpts;\n const override = overrides[id] ?? {};\n const union = ConstClasses.readUnion({ typescript, node });\n\n if (override.skip) {\n handled.add(node);\n return;\n }\n\n const className = override.class ?? planOpts.className;\n const typeName = planOpts.mayRenameType\n ? (override.type ?? planOpts.typeName)\n : planOpts.typeName;\n const members = union.values.map((value) => ({\n value,\n key: override.members?.[value] ?? toKey(value) ?? '',\n }));\n\n const problem = ConstClasses.checkPlan({\n className,\n typeName,\n members,\n taken,\n mayRenameType: planOpts.mayRenameType,\n });\n if (problem) {\n report(node, `${problem}; left untouched (name it in the mapping file: ${id})`);\n handled.add(node);\n return;\n }\n\n taken.add(className);\n if (planOpts.mayRenameType) {\n taken.add(typeName);\n }\n\n handled.add(node);\n proposals.push({\n id,\n line: lineOf(node),\n className,\n typeName,\n members,\n nullish: union.nullish,\n });\n\n const classText = ConstClasses.renderClass({ className, typeName, members });\n const reference = `TConstValue<typeof ${className}>`;\n const nullishText = union.nullish.map((member) => ` | ${member}`).join('');\n\n if (planOpts.mayRenameType) {\n const aliasText = `export type ${typeName} = ${reference};\\n\\n`;\n const at = anchor.getStart(sourceFile, true);\n insertions.set(at, [...(insertions.get(at) ?? []), `${classText}\\n\\n${aliasText}`]);\n edits.push({\n start: node.getStart(sourceFile),\n end: node.end,\n text: `${typeName}${nullishText}`,\n });\n return;\n }\n\n const at = anchor.getStart(sourceFile, true);\n insertions.set(at, [...(insertions.get(at) ?? []), `${classText}\\n\\n`]);\n edits.push({\n start: node.getStart(sourceFile),\n end: node.end,\n text: `${reference}${nullishText}`,\n });\n };\n\n for (const statement of sourceFile.statements) {\n if (!ConstClasses.isExported({ typescript, node: statement })) {\n continue;\n }\n\n if (typescript.isTypeAliasDeclaration(statement)) {\n const union = typescript.isUnionTypeNode(statement.type) ? statement.type : undefined;\n if (union && ConstClasses.isEnumerable({ typescript, node: union })) {\n const base = statement.name.text.replace(/^T(?=[A-Z])/, '');\n plan({\n node: union,\n id: `${relativePath}#${statement.name.text}`,\n className: pluralize(base),\n typeName: statement.name.text,\n anchor: statement,\n mayRenameType: false,\n });\n continue;\n }\n\n if (typescript.isTypeLiteralNode(statement.type)) {\n ConstClasses.planMembers({\n typescript,\n container: statement,\n members: statement.type.members,\n relativePath,\n plan,\n });\n }\n }\n\n if (typescript.isInterfaceDeclaration(statement)) {\n ConstClasses.planMembers({\n typescript,\n container: statement,\n members: statement.members,\n relativePath,\n plan,\n });\n }\n\n ConstClasses.findStrays({ typescript, statement, handled, report });\n }\n\n if (proposals.length === 0) {\n return { output: source, changed: false, proposals, untouched };\n }\n\n for (const [at, texts] of insertions) {\n edits.push({ start: at, end: at, text: texts.join('') });\n }\n\n // Last, so that at the top of a file the import lands above the class inserted at the same place.\n const importEdit = ConstClasses.planImport({ typescript, sourceFile, importFrom });\n if (importEdit) {\n edits.push(importEdit);\n }\n\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, proposals, untouched };\n }\n\n private static planMembers(opts: {\n typescript: TTypeScript;\n container: ts.InterfaceDeclaration | ts.TypeAliasDeclaration;\n members: ts.NodeArray<ts.TypeElement>;\n relativePath: string;\n plan: (planOpts: {\n node: ts.UnionTypeNode;\n id: string;\n className: string;\n typeName: string;\n anchor: ts.Node;\n mayRenameType: boolean;\n }) => void;\n }): void {\n const { typescript, container, members, relativePath, plan } = opts;\n const containerName = container.name.text;\n const base = containerName.replace(/^[IT](?=[A-Z])/, '');\n\n for (const member of members) {\n if (!typescript.isPropertySignature(member) || !member.type) {\n continue;\n }\n\n if (\n !typescript.isUnionTypeNode(member.type) ||\n !ConstClasses.isEnumerable({ typescript, node: member.type })\n ) {\n continue;\n }\n\n const property = typescript.isIdentifier(member.name) ? member.name.text : undefined;\n if (!property) {\n continue;\n }\n\n plan({\n node: member.type,\n id: `${relativePath}#${containerName}.${property}`,\n className: pluralize(`${base}${pascal(property)}`),\n typeName: `T${base}${pascal(property)}`,\n anchor: container,\n mayRenameType: true,\n });\n }\n }\n\n /** Every top-level name the file declares or imports. */\n private static declaredNames(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n }): Set<string> {\n const { typescript, sourceFile } = opts;\n const names = new Set<string>();\n\n for (const statement of sourceFile.statements) {\n if (typescript.isImportDeclaration(statement) && statement.importClause) {\n const { name, namedBindings } = statement.importClause;\n if (name) {\n names.add(name.text);\n }\n\n if (namedBindings && typescript.isNamespaceImport(namedBindings)) {\n names.add(namedBindings.name.text);\n }\n\n if (namedBindings && typescript.isNamedImports(namedBindings)) {\n for (const element of namedBindings.elements) {\n names.add(element.name.text);\n }\n }\n continue;\n }\n\n if (typescript.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (typescript.isIdentifier(declaration.name)) {\n names.add(declaration.name.text);\n }\n }\n continue;\n }\n\n if (\n (typescript.isClassDeclaration(statement) ||\n typescript.isFunctionDeclaration(statement) ||\n typescript.isInterfaceDeclaration(statement) ||\n typescript.isTypeAliasDeclaration(statement) ||\n typescript.isEnumDeclaration(statement) ||\n typescript.isModuleDeclaration(statement)) &&\n statement.name &&\n typescript.isIdentifier(statement.name)\n ) {\n names.add(statement.name.text);\n }\n }\n\n return names;\n }\n\n private static isExported(opts: { typescript: TTypeScript; node: ts.Node }): boolean {\n const { typescript, node } = opts;\n const modifiers = typescript.canHaveModifiers(node) ? typescript.getModifiers(node) : undefined;\n return (\n modifiers?.some((modifier) => modifier.kind === typescript.SyntaxKind.ExportKeyword) === true\n );\n }\n\n /** The string values of a union, and its `null` or `undefined` members; the union must be string literals (and nullish) only. */\n private static readUnion(opts: { typescript: TTypeScript; node: ts.UnionTypeNode }): {\n values: string[];\n nullish: string[];\n } {\n const { typescript, node } = opts;\n const values: string[] = [];\n const nullish: string[] = [];\n\n for (const member of node.types) {\n if (typescript.isLiteralTypeNode(member) && typescript.isStringLiteral(member.literal)) {\n if (!values.includes(member.literal.text)) {\n values.push(member.literal.text);\n }\n continue;\n }\n\n if (member.kind === typescript.SyntaxKind.NullKeyword) {\n nullish.push('null');\n } else if (member.kind === typescript.SyntaxKind.UndefinedKeyword) {\n nullish.push('undefined');\n } else if (\n typescript.isLiteralTypeNode(member) &&\n member.literal.kind === typescript.SyntaxKind.NullKeyword\n ) {\n nullish.push('null');\n }\n }\n\n return { values, nullish };\n }\n\n /** At least two string literals, and nothing else but `null` or `undefined`. */\n private static isEnumerable(opts: { typescript: TTypeScript; node: ts.UnionTypeNode }): boolean {\n const { typescript, node } = opts;\n let literals = 0;\n\n for (const member of node.types) {\n if (typescript.isLiteralTypeNode(member) && typescript.isStringLiteral(member.literal)) {\n literals += 1;\n continue;\n }\n\n const isNullish =\n member.kind === typescript.SyntaxKind.UndefinedKeyword ||\n member.kind === typescript.SyntaxKind.NullKeyword ||\n (typescript.isLiteralTypeNode(member) &&\n member.literal.kind === typescript.SyntaxKind.NullKeyword);\n if (!isNullish) {\n return false;\n }\n }\n\n return literals >= 2;\n }\n\n private static checkPlan(opts: {\n className: string;\n typeName: string;\n members: Array<{ value: string; key: string }>;\n taken: Set<string>;\n mayRenameType: boolean;\n }): string | undefined {\n const { className, typeName, members, taken, mayRenameType } = opts;\n\n if (taken.has(className)) {\n return `the name ${className} is already used in this file`;\n }\n\n if (mayRenameType && taken.has(typeName)) {\n return `the name ${typeName} is already used in this file`;\n }\n\n const keys = new Set<string>();\n for (const { value, key } of members) {\n if (key === '') {\n return `no member name can be made from ${JSON.stringify(value)}`;\n }\n\n if (RESERVED_KEYS.has(key)) {\n return `${JSON.stringify(value)} would become the reserved member ${key}`;\n }\n\n if (keys.has(key)) {\n return `two values give the member ${key}`;\n }\n\n keys.add(key);\n }\n\n return undefined;\n }\n\n private static renderClass(opts: {\n className: string;\n typeName: string;\n members: Array<{ value: string; key: string }>;\n }): string {\n const { className, typeName, members } = opts;\n const quote = (value: string) => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n const lines = [\n `/** The values of \\`${typeName}\\`. */`,\n `export class ${className} {`,\n ...members.map(({ value, key }) => ` static readonly ${key} = ${quote(value)};`),\n '',\n ` static readonly SCHEME_SET = new Set<string>([${members.map(({ key }) => `this.${key}`).join(', ')}]);`,\n '',\n ` static isValid(value: string): value is ${typeName} {`,\n ' return this.SCHEME_SET.has(value);',\n ' }',\n '}',\n ];\n\n return lines.join('\\n');\n }\n\n /** Reports every string-literal union of an exported declaration the codemod did not handle: it cannot name those. */\n private static findStrays(opts: {\n typescript: TTypeScript;\n statement: ts.Statement;\n handled: Set<ts.Node>;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, statement, handled, report } = opts;\n\n const walk = (node: ts.Node): void => {\n if (typescript.isVariableDeclaration(node) && node.type) {\n // The annotation of an exported constant is not what the lint rule asks to name.\n if (node.initializer) {\n walk(node.initializer);\n }\n return;\n }\n\n if (typescript.isUnionTypeNode(node) && ConstClasses.isEnumerable({ typescript, node })) {\n if (!handled.has(node) && !ConstClasses.isKeySet({ typescript, node })) {\n report(\n node,\n 'a string-literal union in this position (a parameter, a return type, a generic or a nested type) has no name to give it; write the const class by hand',\n );\n }\n\n return;\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(statement);\n }\n\n private static isKeySet(opts: { typescript: TTypeScript; node: ts.Node }): boolean {\n const { typescript, node } = opts;\n const parent = node.parent;\n\n if (typescript.isMappedTypeNode(parent) || typescript.isTypeOperatorNode(parent)) {\n return true;\n }\n\n if (\n typescript.isTypeParameterDeclaration(parent) &&\n typescript.isMappedTypeNode(parent.parent)\n ) {\n return true;\n }\n\n if (\n parent &&\n typescript.isTypeReferenceNode(parent) &&\n typescript.isIdentifier(parent.typeName) &&\n KEY_SET_TYPES.has(parent.typeName.text)\n ) {\n return true;\n }\n\n return false;\n }\n\n /** The edit that makes `TConstValue` available: nothing when the file has it, a specifier on an import from the same module, else a new import line. */\n private static planImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n importFrom: string;\n }): IEdit | undefined {\n const { typescript, sourceFile, importFrom } = opts;\n let lastImportEnd = 0;\n let sameModule: ts.ImportDeclaration | undefined;\n\n for (const statement of sourceFile.statements) {\n if (!typescript.isImportDeclaration(statement)) {\n continue;\n }\n\n lastImportEnd = statement.end;\n const bindings = statement.importClause?.namedBindings;\n if (bindings && typescript.isNamedImports(bindings)) {\n if (bindings.elements.some((element) => element.name.text === 'TConstValue')) {\n return undefined;\n }\n\n if (\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n statement.moduleSpecifier.text === importFrom\n ) {\n sameModule = statement;\n }\n }\n }\n\n const bindings = sameModule?.importClause?.namedBindings;\n if (\n sameModule &&\n bindings &&\n typescript.isNamedImports(bindings) &&\n bindings.elements.length > 0\n ) {\n const last = bindings.elements[bindings.elements.length - 1];\n const typeOnly = sameModule.importClause?.isTypeOnly === true;\n return {\n start: last?.end ?? bindings.end,\n end: last?.end ?? bindings.end,\n text: typeOnly ? ', TConstValue' : ', type TConstValue',\n };\n }\n\n const line = `import type { TConstValue } from '${importFrom}';`;\n if (lastImportEnd > 0) {\n return { start: lastImportEnd, end: lastImportEnd, text: `\\n${line}` };\n }\n\n return { start: 0, end: 0, text: `${line}\\n\\n` };\n }\n}\n\nconst USAGE = `Usage: devz codemod const-classes [paths...] [--write | --check] [--map <file>] [--emit-map <file>] [--import-from <module>] [--include-tests]\n\nTurns a string-literal union in an exported declaration into a const class (SCHEME_SET, isValid) plus\n\\`TConstValue<typeof X>\\`, the shape the venizia/const-class-values lint rule asks for. It handles an\nexported type alias and a property of an exported interface or object type. The values stay the same,\nso every existing literal still type-checks and no call site changes.\n\nIt has to choose names: the class is the type name without its leading T, in the plural; a member is\nthe value in upper snake case. The dry run prints every proposal.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a union can be converted or is left untouched (for CI)\n --map <file> a JSON file of overrides, keyed by the id the dry run prints\n --emit-map <file> write the proposals as a mapping file to edit, then pass it with --map\n --import-from <m> where TConstValue is imported from (default ${DEFAULT_IMPORT_FROM})\n --include-tests also convert test files (skipped by default)\n --help print this text and exit\n\nA mapping entry: { \"src/a.ts#TMode\": { \"class\": \"Modes\", \"members\": { \"read-only\": \"READ_ONLY\" } } },\nor { \"skip\": true }. A union in a parameter, a return type, a generic or a nested type is reported as\nleft untouched: it has no name, so write that class by hand. Key sets (Pick, Omit, Extract, Exclude,\nRecord, mapped types) are not enumerable values and are never touched.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nclass ConstClassFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly MAP = '--map';\n static readonly EMIT_MAP = '--emit-map';\n static readonly IMPORT_FROM = '--import-from';\n static readonly INCLUDE_TESTS = '--include-tests';\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.MAP,\n this.EMIT_MAP,\n this.IMPORT_FROM,\n this.INCLUDE_TESTS,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n /** The flags that take a value. */\n static readonly WITH_VALUE = new Set<string>([this.MAP, this.EMIT_MAP, this.IMPORT_FROM]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\n/** `devz codemod const-classes [paths...] [--write | --check]`. */\nexport class ConstClassesCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (args.includes(ConstClassFlags.HELP) || args.includes(ConstClassFlags.HELP_SHORT)) {\n console.log(USAGE);\n return 0;\n }\n\n const flags: string[] = [];\n const paths: string[] = [];\n const values = new Map<string, string>();\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index] ?? '';\n const [name, inline] = argument.startsWith('--') ? argument.split(/=(.*)/s) : [argument];\n\n if (name !== undefined && ConstClassFlags.WITH_VALUE.has(name)) {\n const value = inline ?? args[index + 1];\n if (inline === undefined) {\n index += 1;\n }\n\n if (!value || value.startsWith('-')) {\n console.error(`devz codemod: ${name} needs a value\\n${USAGE}`);\n return USAGE_ERROR_CODE;\n }\n\n values.set(name, value);\n continue;\n }\n\n if (argument.startsWith('-')) {\n flags.push(argument);\n } else {\n paths.push(argument);\n }\n }\n\n const unknown = flags.filter((flag) => !ConstClassFlags.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(ConstClassFlags.WRITE);\n const isCheck = flags.includes(ConstClassFlags.CHECK);\n const includeTests = flags.includes(ConstClassFlags.INCLUDE_TESTS);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${ConstClassFlags.WRITE} and ${ConstClassFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n let overrides: TConstClassMap = {};\n const mapPath = values.get(ConstClassFlags.MAP);\n if (mapPath) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(resolve(root, mapPath), 'utf8'));\n } catch (error) {\n console.error(\n `devz codemod: cannot read the mapping file ${mapPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n console.error(\n `devz codemod: cannot read the mapping file ${mapPath}: the file must hold one JSON object`,\n );\n return USAGE_ERROR_CODE;\n }\n\n overrides = Object.fromEntries(Object.entries(parsed));\n }\n\n let typescript: TTypeScript;\n try {\n typescript = (await import('typescript')).default;\n } catch {\n console.error('devz codemod: the \"typescript\" package is required to read your sources');\n return 1;\n }\n\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n const importFrom = values.get(ConstClassFlags.IMPORT_FROM);\n const emitted: TConstClassMap = {};\n let changedFiles = 0;\n let converted = 0;\n let untouchedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\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 relativePath = relative(root, file).split('\\\\').join('/');\n if (!includeTests && TEST_FILE_PATTERN.test(relativePath)) {\n continue;\n }\n\n const source = readFileSync(file, 'utf8');\n if (!UNION_TEXT.test(source)) {\n continue;\n }\n\n const result = ConstClasses.convert({\n typescript,\n fileName: file,\n source,\n relativePath,\n overrides,\n importFrom,\n });\n\n for (const item of result.untouched) {\n untouchedCount += 1;\n console.warn(`${relativePath}:${item.line}:${item.column} ${item.reason}`);\n }\n\n for (const proposal of result.proposals) {\n converted += 1;\n emitted[proposal.id] = {\n class: proposal.className,\n ...(proposal.id.split('#')[1]?.includes('.') ? { type: proposal.typeName } : {}),\n members: Object.fromEntries(proposal.members.map(({ value, key }) => [value, key])),\n };\n console.log(\n `${isWrite ? 'converted' : 'would convert'} ${relativePath}:${proposal.line} ${proposal.typeName} -> class ${proposal.className} { ${proposal.members.map(({ key, value }) => `${key} = '${value}'`).join(', ')} }` +\n ` [${proposal.id}]`,\n );\n }\n\n if (result.changed) {\n changedFiles += 1;\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n }\n\n const emitPath = values.get(ConstClassFlags.EMIT_MAP);\n if (emitPath) {\n writeFileSync(resolve(root, emitPath), `${JSON.stringify(emitted, null, 2)}\\n`);\n console.log(\n `Wrote ${Object.keys(emitted).length} proposal(s) to ${emitPath}; edit it, then pass --map ${emitPath}.`,\n );\n }\n\n console.log(\n `devz codemod const-classes: ${converted} union(s) ${isWrite ? 'converted' : 'would be converted'} in ${changedFiles} file(s), ${untouchedCount} left untouched`,\n );\n\n if (!isWrite && changedFiles > 0) {\n console.log(\n `Nothing was written. Run again with ${ConstClassFlags.WRITE} to apply (add --map to rename), then run your typecheck and lint.`,\n );\n }\n\n return isCheck && (converted > 0 || untouchedCount > 0) ? 1 : 0;\n }\n}\n"]}
1
+ {"version":3,"file":"const-classes.js","sourceRoot":"","sources":["../../../src/cli/codemod/const-classes.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\nimport { relative, resolve } from 'node:path';\nimport type ts from 'typescript';\nimport { CodemodFiles } from './files';\n\ntype TTypeScript = typeof ts;\n\nconst DEFAULT_IMPORT_FROM = '@venizia/ignis-helpers/common';\nconst TEST_FILE_PATTERN = /(?:^|\\/)__tests__\\/|\\.(?:test|spec)\\.[cm]?tsx?$/;\n/** Utility types whose type argument is a set of keys, not an enumerable value. */\nconst KEY_SET_TYPES = new Set(['Pick', 'Omit', 'Extract', 'Exclude', 'Record']);\n/** A file that can hold a string-literal union: a quote beside a `|`. */\nconst UNION_TEXT = /\\|\\s*['\"]|['\"]\\s*\\|/;\nconst RESERVED_KEYS = new Set(['SCHEME_SET']);\n\n/** What the user may change for one declaration, from the mapping file. */\nexport interface IConstClassOverride {\n /** The class name. */\n class?: string;\n /** The type name; only a property of an interface or object type gets a new one. */\n type?: string;\n /** A member key per literal value: `{ \"read-only\": \"READ_ONLY\" }`. */\n members?: Record<string, string>;\n /** Leave this declaration alone. */\n skip?: boolean;\n}\n\nexport type TConstClassMap = Record<string, IConstClassOverride>;\n\nexport interface IConstClassProposal {\n /** The key of the mapping file: `path/to/file.ts#TName` or `path/to/file.ts#IContainer.property`. */\n id: string;\n line: number;\n className: string;\n typeName: string;\n /** The literal values and the member key each one gets, in order. */\n members: Array<{ value: string; key: string }>;\n /** What the union also held: `null` or `undefined`. */\n nullish: string[];\n}\n\nexport interface IConstClassUntouched {\n line: number;\n column: number;\n reason: string;\n}\n\nexport interface IConstClassResult {\n output: string;\n changed: boolean;\n proposals: IConstClassProposal[];\n untouched: IConstClassUntouched[];\n}\n\ninterface IEdit {\n start: number;\n end: number;\n text: string;\n}\n\n/** The plural of a PascalCase word, for the class that holds its values. */\nconst pluralize = (word: string): string => {\n const alreadyPlural = /[^uis]s$/.test(word) || /ings$/.test(word);\n if (alreadyPlural) {\n return word;\n }\n\n if (/(s|x|z|ch|sh)$/.test(word)) {\n return `${word}es`;\n }\n\n if (/[^aeiou]y$/.test(word)) {\n return `${word.slice(0, -1)}ies`;\n }\n\n return `${word}s`;\n};\n\n/** `read-only`, `readOnly` and `string[]` become `READ_ONLY`, `READ_ONLY` and `STRING_ARRAY`; `undefined` when nothing is left. */\nconst toKey = (value: string): string | undefined => {\n const key = value\n .replace(/\\[\\]/g, '_ARRAY_')\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^A-Za-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toUpperCase();\n\n if (key === '') {\n return undefined;\n }\n\n return /^[0-9]/.test(key) ? `_${key}` : key;\n};\n\nconst pascal = (word: string): string => `${word.charAt(0).toUpperCase()}${word.slice(1)}`;\n\n/**\n * Turns the string-literal unions of exported declarations into const classes: an exported type\n * alias, and a property of an exported interface or object type. The values stay the same, so every\n * existing literal still type-checks and no call site changes. A union it cannot name is reported.\n */\nexport class ConstClasses {\n static convert(opts: {\n typescript: TTypeScript;\n fileName: string;\n source: string;\n /** The id prefix of the mapping file: the path of the file relative to the project root. */\n relativePath?: string;\n overrides?: TConstClassMap;\n importFrom?: string;\n }): IConstClassResult {\n const { typescript, fileName, source, overrides = {}, importFrom = DEFAULT_IMPORT_FROM } = opts;\n const relativePath = opts.relativePath ?? fileName;\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n typescript.ScriptTarget.Latest,\n true,\n );\n const taken = ConstClasses.declaredNames({ typescript, sourceFile });\n const proposals: IConstClassProposal[] = [];\n const untouched: IConstClassUntouched[] = [];\n const edits: IEdit[] = [];\n const insertions = new Map<number, string[]>();\n const handled = new Set<ts.Node>();\n\n const report = (node: ts.Node, reason: string) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n );\n untouched.push({ line: line + 1, column: character + 1, reason });\n };\n\n const lineOf = (node: ts.Node) =>\n sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;\n\n /** Plans one conversion; `undefined` and a report when the names or the members do not work. */\n const plan = (planOpts: {\n node: ts.UnionTypeNode;\n id: string;\n className: string;\n typeName: string;\n anchor: ts.Node;\n mayRenameType: boolean;\n }): void => {\n const { node, id, anchor } = planOpts;\n const override = overrides[id] ?? {};\n const union = ConstClasses.readUnion({ typescript, node });\n\n if (override.skip) {\n handled.add(node);\n return;\n }\n\n const className = override.class ?? planOpts.className;\n const typeName = planOpts.mayRenameType\n ? (override.type ?? planOpts.typeName)\n : planOpts.typeName;\n const members = union.values.map((value) => ({\n value,\n key: override.members?.[value] ?? toKey(value) ?? '',\n }));\n\n const problem = ConstClasses.checkPlan({\n className,\n typeName,\n members,\n taken,\n mayRenameType: planOpts.mayRenameType,\n });\n if (problem) {\n report(node, `${problem}; left untouched (name it in the mapping file: ${id})`);\n handled.add(node);\n return;\n }\n\n taken.add(className);\n if (planOpts.mayRenameType) {\n taken.add(typeName);\n }\n\n handled.add(node);\n proposals.push({\n id,\n line: lineOf(node),\n className,\n typeName,\n members,\n nullish: union.nullish,\n });\n\n const classText = ConstClasses.renderClass({ className, typeName, members });\n const reference = `TConstValue<typeof ${className}>`;\n const nullishText = union.nullish.map((member) => ` | ${member}`).join('');\n\n if (planOpts.mayRenameType) {\n const aliasText = `export type ${typeName} = ${reference};\\n\\n`;\n const at = anchor.getStart(sourceFile, true);\n insertions.set(at, [...(insertions.get(at) ?? []), `${classText}\\n\\n${aliasText}`]);\n edits.push({\n start: node.getStart(sourceFile),\n end: node.end,\n text: `${typeName}${nullishText}`,\n });\n return;\n }\n\n const at = anchor.getStart(sourceFile, true);\n insertions.set(at, [...(insertions.get(at) ?? []), `${classText}\\n\\n`]);\n edits.push({\n start: node.getStart(sourceFile),\n end: node.end,\n text: `${reference}${nullishText}`,\n });\n };\n\n for (const statement of sourceFile.statements) {\n if (!ConstClasses.isExported({ typescript, node: statement })) {\n continue;\n }\n\n if (typescript.isTypeAliasDeclaration(statement)) {\n const union = typescript.isUnionTypeNode(statement.type) ? statement.type : undefined;\n if (union && ConstClasses.isEnumerable({ typescript, node: union })) {\n const base = statement.name.text.replace(/^T(?=[A-Z])/, '');\n plan({\n node: union,\n id: `${relativePath}#${statement.name.text}`,\n className: pluralize(base),\n typeName: statement.name.text,\n anchor: statement,\n mayRenameType: false,\n });\n continue;\n }\n\n if (typescript.isTypeLiteralNode(statement.type)) {\n ConstClasses.planMembers({\n typescript,\n container: statement,\n members: statement.type.members,\n relativePath,\n plan,\n });\n }\n }\n\n if (typescript.isInterfaceDeclaration(statement)) {\n ConstClasses.planMembers({\n typescript,\n container: statement,\n members: statement.members,\n relativePath,\n plan,\n });\n }\n\n ConstClasses.findStrays({ typescript, statement, handled, report });\n }\n\n if (proposals.length === 0) {\n return { output: source, changed: false, proposals, untouched };\n }\n\n for (const [at, texts] of insertions) {\n edits.push({ start: at, end: at, text: texts.join('') });\n }\n\n // Last, so that at the top of a file the import lands above the class inserted at the same place.\n const importEdit = ConstClasses.planImport({ typescript, sourceFile, importFrom });\n if (importEdit) {\n edits.push(importEdit);\n }\n\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, proposals, untouched };\n }\n\n private static planMembers(opts: {\n typescript: TTypeScript;\n container: ts.InterfaceDeclaration | ts.TypeAliasDeclaration;\n members: ts.NodeArray<ts.TypeElement>;\n relativePath: string;\n plan: (planOpts: {\n node: ts.UnionTypeNode;\n id: string;\n className: string;\n typeName: string;\n anchor: ts.Node;\n mayRenameType: boolean;\n }) => void;\n }): void {\n const { typescript, container, members, relativePath, plan } = opts;\n const containerName = container.name.text;\n const base = containerName.replace(/^[IT](?=[A-Z])/, '');\n\n for (const member of members) {\n if (!typescript.isPropertySignature(member) || !member.type) {\n continue;\n }\n\n if (\n !typescript.isUnionTypeNode(member.type) ||\n !ConstClasses.isEnumerable({ typescript, node: member.type })\n ) {\n continue;\n }\n\n const property = typescript.isIdentifier(member.name) ? member.name.text : undefined;\n if (!property) {\n continue;\n }\n\n plan({\n node: member.type,\n id: `${relativePath}#${containerName}.${property}`,\n className: pluralize(`${base}${pascal(property)}`),\n typeName: `T${base}${pascal(property)}`,\n anchor: container,\n mayRenameType: true,\n });\n }\n }\n\n /** Every top-level name the file declares or imports. */\n private static declaredNames(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n }): Set<string> {\n const { typescript, sourceFile } = opts;\n const names = new Set<string>();\n\n for (const statement of sourceFile.statements) {\n if (typescript.isImportDeclaration(statement) && statement.importClause) {\n const { name, namedBindings } = statement.importClause;\n if (name) {\n names.add(name.text);\n }\n\n if (namedBindings && typescript.isNamespaceImport(namedBindings)) {\n names.add(namedBindings.name.text);\n }\n\n if (namedBindings && typescript.isNamedImports(namedBindings)) {\n for (const element of namedBindings.elements) {\n names.add(element.name.text);\n }\n }\n continue;\n }\n\n if (typescript.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (typescript.isIdentifier(declaration.name)) {\n names.add(declaration.name.text);\n }\n }\n continue;\n }\n\n if (\n (typescript.isClassDeclaration(statement) ||\n typescript.isFunctionDeclaration(statement) ||\n typescript.isInterfaceDeclaration(statement) ||\n typescript.isTypeAliasDeclaration(statement) ||\n typescript.isEnumDeclaration(statement) ||\n typescript.isModuleDeclaration(statement)) &&\n statement.name &&\n typescript.isIdentifier(statement.name)\n ) {\n names.add(statement.name.text);\n }\n }\n\n return names;\n }\n\n private static isExported(opts: { typescript: TTypeScript; node: ts.Node }): boolean {\n const { typescript, node } = opts;\n const modifiers = typescript.canHaveModifiers(node) ? typescript.getModifiers(node) : undefined;\n return (\n modifiers?.some((modifier) => modifier.kind === typescript.SyntaxKind.ExportKeyword) === true\n );\n }\n\n /** The string values of a union, and its `null` or `undefined` members; the union must be string literals (and nullish) only. */\n private static readUnion(opts: { typescript: TTypeScript; node: ts.UnionTypeNode }): {\n values: string[];\n nullish: string[];\n } {\n const { typescript, node } = opts;\n const values: string[] = [];\n const nullish: string[] = [];\n\n for (const member of node.types) {\n if (typescript.isLiteralTypeNode(member) && typescript.isStringLiteral(member.literal)) {\n if (!values.includes(member.literal.text)) {\n values.push(member.literal.text);\n }\n continue;\n }\n\n if (member.kind === typescript.SyntaxKind.NullKeyword) {\n nullish.push('null');\n } else if (member.kind === typescript.SyntaxKind.UndefinedKeyword) {\n nullish.push('undefined');\n } else if (\n typescript.isLiteralTypeNode(member) &&\n member.literal.kind === typescript.SyntaxKind.NullKeyword\n ) {\n nullish.push('null');\n }\n }\n\n return { values, nullish };\n }\n\n /** At least two string literals, and nothing else but `null` or `undefined`. */\n private static isEnumerable(opts: { typescript: TTypeScript; node: ts.UnionTypeNode }): boolean {\n const { typescript, node } = opts;\n let literals = 0;\n\n for (const member of node.types) {\n if (typescript.isLiteralTypeNode(member) && typescript.isStringLiteral(member.literal)) {\n literals += 1;\n continue;\n }\n\n const isNullish =\n member.kind === typescript.SyntaxKind.UndefinedKeyword ||\n member.kind === typescript.SyntaxKind.NullKeyword ||\n (typescript.isLiteralTypeNode(member) &&\n member.literal.kind === typescript.SyntaxKind.NullKeyword);\n if (!isNullish) {\n return false;\n }\n }\n\n return literals >= 2;\n }\n\n private static checkPlan(opts: {\n className: string;\n typeName: string;\n members: Array<{ value: string; key: string }>;\n taken: Set<string>;\n mayRenameType: boolean;\n }): string | undefined {\n const { className, typeName, members, taken, mayRenameType } = opts;\n\n if (taken.has(className)) {\n return `the name ${className} is already used in this file`;\n }\n\n if (mayRenameType && taken.has(typeName)) {\n return `the name ${typeName} is already used in this file`;\n }\n\n const keys = new Set<string>();\n for (const { value, key } of members) {\n if (key === '') {\n return `no member name can be made from ${JSON.stringify(value)}`;\n }\n\n if (RESERVED_KEYS.has(key)) {\n return `${JSON.stringify(value)} would become the reserved member ${key}`;\n }\n\n if (keys.has(key)) {\n return `two values give the member ${key}`;\n }\n\n keys.add(key);\n }\n\n return undefined;\n }\n\n private static renderClass(opts: {\n className: string;\n typeName: string;\n members: Array<{ value: string; key: string }>;\n }): string {\n const { className, typeName, members } = opts;\n const quote = (value: string) => `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n const lines = [\n `/** The values of \\`${typeName}\\`. */`,\n `export class ${className} {`,\n ...members.map(({ value, key }) => ` static readonly ${key} = ${quote(value)};`),\n '',\n ` static readonly SCHEME_SET = new Set<string>([${members.map(({ key }) => `this.${key}`).join(', ')}]);`,\n '',\n ` static isValid(value: string): value is ${typeName} {`,\n ' return this.SCHEME_SET.has(value);',\n ' }',\n '}',\n ];\n\n return lines.join('\\n');\n }\n\n /** Reports every string-literal union of an exported declaration the codemod did not handle: it cannot name those. */\n private static findStrays(opts: {\n typescript: TTypeScript;\n statement: ts.Statement;\n handled: Set<ts.Node>;\n report: (node: ts.Node, reason: string) => void;\n }): void {\n const { typescript, statement, handled, report } = opts;\n\n const walk = (node: ts.Node): void => {\n if (typescript.isVariableDeclaration(node) && node.type) {\n // The annotation of an exported constant is not what the lint rule asks to name.\n if (node.initializer) {\n walk(node.initializer);\n }\n return;\n }\n\n if (typescript.isUnionTypeNode(node) && ConstClasses.isEnumerable({ typescript, node })) {\n if (!handled.has(node) && !ConstClasses.isKeySet({ typescript, node })) {\n report(\n node,\n 'a string-literal union in this position (a parameter, a return type, a generic or a nested type) has no name to give it; write the const class by hand',\n );\n }\n\n return;\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(statement);\n }\n\n private static isKeySet(opts: { typescript: TTypeScript; node: ts.Node }): boolean {\n const { typescript, node } = opts;\n const parent = node.parent;\n\n if (typescript.isMappedTypeNode(parent) || typescript.isTypeOperatorNode(parent)) {\n return true;\n }\n\n if (\n typescript.isTypeParameterDeclaration(parent) &&\n typescript.isMappedTypeNode(parent.parent)\n ) {\n return true;\n }\n\n if (\n parent &&\n typescript.isTypeReferenceNode(parent) &&\n typescript.isIdentifier(parent.typeName) &&\n KEY_SET_TYPES.has(parent.typeName.text)\n ) {\n return true;\n }\n\n return false;\n }\n\n /** The edit that makes `TConstValue` available: nothing when the file has it, a specifier on an import from the same module, else a new import line. */\n private static planImport(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n importFrom: string;\n }): IEdit | undefined {\n const { typescript, sourceFile, importFrom } = opts;\n let lastImportEnd = 0;\n let sameModule: ts.ImportDeclaration | undefined;\n\n for (const statement of sourceFile.statements) {\n if (!typescript.isImportDeclaration(statement)) {\n continue;\n }\n\n lastImportEnd = statement.end;\n const bindings = statement.importClause?.namedBindings;\n if (bindings && typescript.isNamedImports(bindings)) {\n if (bindings.elements.some((element) => element.name.text === 'TConstValue')) {\n return undefined;\n }\n\n if (\n typescript.isStringLiteral(statement.moduleSpecifier) &&\n statement.moduleSpecifier.text === importFrom\n ) {\n sameModule = statement;\n }\n }\n }\n\n const bindings = sameModule?.importClause?.namedBindings;\n if (\n sameModule &&\n bindings &&\n typescript.isNamedImports(bindings) &&\n bindings.elements.length > 0\n ) {\n const last = bindings.elements[bindings.elements.length - 1];\n const typeOnly = sameModule.importClause?.isTypeOnly === true;\n return {\n start: last?.end ?? bindings.end,\n end: last?.end ?? bindings.end,\n text: typeOnly ? ', TConstValue' : ', type TConstValue',\n };\n }\n\n const line = `import type { TConstValue } from '${importFrom}';`;\n if (lastImportEnd > 0) {\n return { start: lastImportEnd, end: lastImportEnd, text: `\\n${line}` };\n }\n\n return { start: 0, end: 0, text: `${line}\\n\\n` };\n }\n}\n\nconst USAGE = `Usage: devz codemod const-classes [paths...] [--write | --check] [--map <file>] [--emit-map <file>] [--import-from <module>] [--include-tests]\n\nTurns a string-literal union in an exported declaration into a const class (SCHEME_SET, isValid) plus\n\\`TConstValue<typeof X>\\`, the shape the venizia/const-class-values lint rule asks for. It handles an\nexported type alias and a property of an exported interface or object type. The values stay the same,\nso every existing literal still type-checks and no call site changes.\n\nIt has to choose names: the class is the type name without its leading T, in the plural; a member is\nthe value in upper snake case. The dry run prints every proposal.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a union can be converted or is left untouched (for CI)\n --map <file> a JSON file of overrides, keyed by the id the dry run prints\n --emit-map <file> write the proposals as a mapping file to edit, then pass it with --map\n --import-from <m> where TConstValue is imported from (default ${DEFAULT_IMPORT_FROM})\n --include-tests also convert test files (skipped by default)\n --help print this text and exit\n\nA mapping entry: { \"src/a.ts#TMode\": { \"class\": \"Modes\", \"members\": { \"read-only\": \"READ_ONLY\" } } },\nor { \"skip\": true }. A union in a parameter, a return type, a generic or a nested type is reported as\nleft untouched: it has no name, so write that class by hand. Key sets (Pick, Omit, Extract, Exclude,\nRecord, mapped types) are not enumerable values and are never touched.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nclass ConstClassFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly MAP = '--map';\n static readonly EMIT_MAP = '--emit-map';\n static readonly IMPORT_FROM = '--import-from';\n static readonly INCLUDE_TESTS = '--include-tests';\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.MAP,\n this.EMIT_MAP,\n this.IMPORT_FROM,\n this.INCLUDE_TESTS,\n this.HELP,\n this.HELP_SHORT,\n ]);\n\n /** The flags that take a value. */\n static readonly WITH_VALUE = new Set<string>([this.MAP, this.EMIT_MAP, this.IMPORT_FROM]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\n/** `devz codemod const-classes [paths...] [--write | --check]`. */\nexport class ConstClassesCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (args.includes(ConstClassFlags.HELP) || args.includes(ConstClassFlags.HELP_SHORT)) {\n console.log(USAGE);\n return 0;\n }\n\n const flags: string[] = [];\n const paths: string[] = [];\n const values = new Map<string, string>();\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index] ?? '';\n const [name, inline] = argument.startsWith('--') ? argument.split(/=(.*)/s) : [argument];\n\n if (name !== undefined && ConstClassFlags.WITH_VALUE.has(name)) {\n const value = inline ?? args[index + 1];\n if (inline === undefined) {\n index += 1;\n }\n\n if (!value || value.startsWith('-')) {\n console.error(`devz codemod: ${name} needs a value\\n${USAGE}`);\n return USAGE_ERROR_CODE;\n }\n\n values.set(name, value);\n continue;\n }\n\n if (argument.startsWith('-')) {\n flags.push(argument);\n } else {\n paths.push(argument);\n }\n }\n\n const unknown = flags.filter((flag) => !ConstClassFlags.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(ConstClassFlags.WRITE);\n const isCheck = flags.includes(ConstClassFlags.CHECK);\n const includeTests = flags.includes(ConstClassFlags.INCLUDE_TESTS);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${ConstClassFlags.WRITE} and ${ConstClassFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n let overrides: TConstClassMap = {};\n const mapPath = values.get(ConstClassFlags.MAP);\n if (mapPath) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(resolve(root, mapPath), 'utf8'));\n } catch (error) {\n console.error(\n `devz codemod: cannot read the mapping file ${mapPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n console.error(\n `devz codemod: cannot read the mapping file ${mapPath}: the file must hold one JSON object`,\n );\n return USAGE_ERROR_CODE;\n }\n\n overrides = Object.fromEntries(Object.entries(parsed));\n }\n\n let typescript: TTypeScript;\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 const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n const importFrom = values.get(ConstClassFlags.IMPORT_FROM);\n const emitted: TConstClassMap = {};\n let changedFiles = 0;\n let converted = 0;\n let untouchedCount = 0;\n\n for (const target of targets) {\n const files = CodemodFiles.collect({ target });\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 relativePath = relative(root, file).split('\\\\').join('/');\n if (!includeTests && TEST_FILE_PATTERN.test(relativePath)) {\n continue;\n }\n\n const source = readFileSync(file, 'utf8');\n if (!UNION_TEXT.test(source)) {\n continue;\n }\n\n const result = ConstClasses.convert({\n typescript,\n fileName: file,\n source,\n relativePath,\n overrides,\n importFrom,\n });\n\n for (const item of result.untouched) {\n untouchedCount += 1;\n console.warn(`${relativePath}:${item.line}:${item.column} ${item.reason}`);\n }\n\n for (const proposal of result.proposals) {\n converted += 1;\n emitted[proposal.id] = {\n class: proposal.className,\n ...(proposal.id.split('#')[1]?.includes('.') ? { type: proposal.typeName } : {}),\n members: Object.fromEntries(proposal.members.map(({ value, key }) => [value, key])),\n };\n console.log(\n `${isWrite ? 'converted' : 'would convert'} ${relativePath}:${proposal.line} ${proposal.typeName} -> class ${proposal.className} { ${proposal.members.map(({ key, value }) => `${key} = '${value}'`).join(', ')} }` +\n ` [${proposal.id}]`,\n );\n }\n\n if (result.changed) {\n changedFiles += 1;\n if (isWrite) {\n writeFileSync(file, result.output);\n }\n }\n }\n }\n\n const emitPath = values.get(ConstClassFlags.EMIT_MAP);\n if (emitPath) {\n writeFileSync(resolve(root, emitPath), `${JSON.stringify(emitted, null, 2)}\\n`);\n console.log(\n `Wrote ${Object.keys(emitted).length} proposal(s) to ${emitPath}; edit it, then pass --map ${emitPath}.`,\n );\n }\n\n console.log(\n `devz codemod const-classes: ${converted} union(s) ${isWrite ? 'converted' : 'would be converted'} in ${changedFiles} file(s), ${untouchedCount} left untouched`,\n );\n\n if (!isWrite && changedFiles > 0) {\n console.log(\n `Nothing was written. Run again with ${ConstClassFlags.WRITE} to apply (add --map to rename), then run your typecheck and lint.`,\n );\n }\n\n return isCheck && (converted > 0 || untouchedCount > 0) ? 1 : 0;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"drop-redundant-casts.d.ts","sourceRoot":"","sources":["../../../src/cli/codemod/drop-redundant-casts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drop-redundant-casts.d.ts","sourceRoot":"","sources":["../../../src/cli/codemod/drop-redundant-casts.ts"],"names":[],"mappings":"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"}
@@ -690,7 +690,8 @@ class DropRedundantCastsCommand {
690
690
  }
691
691
  let typescript;
692
692
  try {
693
- typescript = (await import('typescript')).default;
693
+ const result2 = await import('typescript');
694
+ typescript = result2.default;
694
695
  }
695
696
  catch {
696
697
  console.error('devz codemod: the "typescript" package is required to check your sources');
@@ -1 +1 @@
1
- {"version":3,"file":"drop-redundant-casts.js","sourceRoot":"","sources":["../../../src/cli/codemod/drop-redundant-casts.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport type ts from 'typescript';\nimport type { TConstValue } from '../../linters/rules/common';\nimport { CodemodFiles } from './files';\n\ntype TTypeScript = typeof ts;\n\n/** Why a cast is still there after the codemod ran. */\nexport class CastKeepReasons {\n /** Taking it out makes the package fail its typecheck. */\n static readonly NEEDED = 'needed';\n /** `as const` is a narrowing the codemod never touches. */\n static readonly AS_CONST = 'as-const';\n /** `x as unknown as T`: a deliberate escape that only a person can judge. */\n static readonly DOUBLE_CAST = 'double-cast';\n /** `x as unknown` widens on purpose. */\n static readonly UNKNOWN_TARGET = 'unknown-target';\n /** The expression is `any`: the cast is the only type it has, so it is not redundant. */\n static readonly ANY_EXPRESSION = 'any-expression';\n /** The expression is `unknown`: the cast is the only type it has. */\n static readonly UNKNOWN_EXPRESSION = 'unknown-expression';\n /** Test files are skipped unless `--include-tests` is given. */\n static readonly TEST_FILE = 'test-file';\n /** The file is not part of the package's tsconfig, so nothing can check it. */\n static readonly NOT_IN_PROJECT = 'not-in-project';\n\n static readonly SCHEME_SET = new Set<string>([\n this.NEEDED,\n this.AS_CONST,\n this.DOUBLE_CAST,\n this.UNKNOWN_TARGET,\n this.ANY_EXPRESSION,\n this.UNKNOWN_EXPRESSION,\n this.TEST_FILE,\n this.NOT_IN_PROJECT,\n ]);\n\n static isValid(value: string): value is TCastKeepReason {\n return this.SCHEME_SET.has(value);\n }\n}\n\nexport type TCastKeepReason = TConstValue<typeof CastKeepReasons>;\n\nexport interface IKeptCast {\n /** Line and column in the output text (the file after the removals). */\n line: number;\n column: number;\n reason: TCastKeepReason;\n}\n\nexport interface IFileCastResult {\n file: string;\n /** The file text after the removals and the imports they left unused. */\n output: string;\n changed: boolean;\n removed: number;\n importsRemoved: number;\n kept: IKeptCast[];\n}\n\nexport interface IProjectCastResult {\n files: IFileCastResult[];\n /** How many times the package was typechecked (the baseline run included). */\n checks: number;\n /** Errors the package already had before any removal; they are not counted against a removal. */\n baselineErrors: number;\n}\n\n/** One error of a check: its message key (file, code, text) and where it points. */\ninterface IFoundError {\n key: string;\n file: string;\n start: number;\n}\n\ninterface IDiagnosticReport {\n counts: Map<string, number>;\n items: IFoundError[];\n}\n\ninterface ICastCandidate {\n file: string;\n start: number;\n end: number;\n replacement: string;\n /** The cast as written, used to remember a rejected cast across rounds. */\n key: string;\n}\n\nconst MAX_ROUNDS = 50;\n/** How many times the new errors are used to name culprits before the rest is halved. */\nconst MAX_NAMED_ATTEMPTS = 8;\n/** A file that can hold a cast: `as`, or an angle-bracket assertion. */\nconst CAST_TEXT = /\\bas\\b|<[A-Za-z_$][^<>]*>\\s*[A-Za-z_$(]/;\nconst TEST_FILE_PATTERN = /(?:^|\\/)__tests__\\/|\\.(?:test|spec)\\.[cm]?tsx?$/;\n\n/**\n * The compiler's own view of a package, with the text of some files replaced in memory. It uses the\n * compiler's incremental builder: a check after an edit revisits only the files whose exported types\n * changed and the files that import them, and the parsed files are kept between checks.\n */\nclass TypecheckSession {\n private readonly parsed = new Map<string, ts.SourceFile>();\n private readonly disk = new Map<string, string | undefined>();\n private reference: ts.SemanticDiagnosticsBuilderProgram | undefined;\n private program: ts.Program | undefined;\n checks = 0;\n\n constructor(\n private readonly typescript: TTypeScript,\n private readonly options: ts.CompilerOptions,\n private readonly rootNames: string[],\n private readonly root: string,\n ) {}\n\n /**\n * Typechecks the package with `texts` replacing the files on disk and returns the errors as a count\n * per message key. With `asReference`, the result becomes the state later checks are measured from.\n */\n check(texts: Map<string, string>, opts: { asReference?: boolean } = {}): IDiagnosticReport {\n const { typescript, options, rootNames } = this;\n const host = typescript.createCompilerHost(options, true);\n\n host.getSourceFile = (fileName, languageVersionOrOptions) => {\n const key = resolve(fileName);\n let source = texts.get(key);\n if (source === undefined) {\n if (!this.disk.has(key)) {\n this.disk.set(key, typescript.sys.readFile(fileName));\n }\n source = this.disk.get(key);\n }\n\n if (source === undefined) {\n return undefined;\n }\n\n const version = typescript.sys.createHash?.(source) ?? `${source.length}`;\n const cacheKey = `${key}\\0${version}`;\n const cached = this.parsed.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n languageVersionOrOptions,\n true,\n );\n // The builder reads a file's version to tell a changed file from an unchanged one; the type leaves it out.\n Object.assign(sourceFile, { version });\n this.parsed.set(cacheKey, sourceFile);\n return sourceFile;\n };\n\n const builder = typescript.createSemanticDiagnosticsBuilderProgram(\n rootNames,\n options,\n host,\n this.reference,\n );\n this.program = builder.getProgram();\n this.checks += 1;\n\n if (opts.asReference) {\n this.reference = builder;\n }\n\n const counts = new Map<string, number>();\n const items: IFoundError[] = [];\n const diagnostics = [\n ...builder.getOptionsDiagnostics(),\n ...builder.getGlobalDiagnostics(),\n ...builder.getSyntacticDiagnostics(),\n ...builder.getSemanticDiagnostics(),\n ];\n for (const diagnostic of diagnostics) {\n if (diagnostic.category !== typescript.DiagnosticCategory.Error) {\n continue;\n }\n\n const where = diagnostic.file ? relative(this.root, diagnostic.file.fileName) : '';\n const message = typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n const key = `${where}|${diagnostic.code}|${message}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n items.push({\n key,\n file: diagnostic.file ? resolve(diagnostic.file.fileName) : '',\n start: diagnostic.start ?? 0,\n });\n }\n\n return { counts, items };\n }\n\n getProgram(): ts.Program {\n if (!this.program) {\n // eslint-disable-next-line venizia/no-new-error -- getError would be a dev-configs -> inversion cycle\n throw new Error('[TypecheckSession][getProgram] check() has not run yet');\n }\n\n return this.program;\n }\n}\n\n/**\n * Removes the `as X` casts a package no longer needs. Every removal of a package is tried together\n * in memory and compared with the errors the package had before; when new errors appear, the\n * candidates are halved until the ones that break the typecheck are found, so the cost is a handful\n * of checks, not one per cast.\n */\nexport class RedundantCasts {\n /** The casts of one project: which are removed, which stay and why. */\n static run(opts: {\n typescript: TTypeScript;\n tsconfigPath: string;\n root: string;\n files: string[];\n includeTests?: boolean;\n }): IProjectCastResult {\n const { typescript, tsconfigPath, root, files, includeTests = false } = opts;\n const loaded = RedundantCasts.loadProject({ typescript, tsconfigPath });\n const session = new TypecheckSession(typescript, loaded.options, loaded.fileNames, root);\n const original = new Map<string, string>();\n const current = new Map<string, string>();\n const results = new Map<string, IFileCastResult>();\n const members = new Set(loaded.fileNames.map((name) => resolve(name)));\n\n for (const file of files.map((name) => resolve(name))) {\n if (!members.has(file)) {\n results.set(file, {\n file,\n output: readFileSync(file, 'utf8'),\n changed: false,\n removed: 0,\n importsRemoved: 0,\n kept: [{ line: 0, column: 0, reason: CastKeepReasons.NOT_IN_PROJECT }],\n });\n continue;\n }\n\n const text = readFileSync(file, 'utf8');\n original.set(file, text);\n current.set(file, text);\n }\n\n const baseline = session.check(new Map(), { asReference: true }).counts;\n const baselineErrors = [...baseline.values()].reduce((sum, count) => sum + count, 0);\n const rejected = new Set<string>();\n const removedPerFile = new Map<string, number>();\n\n /** The errors `texts` adds to what the package already had. */\n const newErrors = (texts: Map<string, string>): IFoundError[] => {\n const report = session.check(texts);\n const budget = new Map(baseline);\n const added: IFoundError[] = [];\n\n for (const item of report.items) {\n const left = budget.get(item.key) ?? 0;\n if (left > 0) {\n budget.set(item.key, left - 1);\n continue;\n }\n\n added.push(item);\n }\n\n return added;\n };\n const isBroken = (texts: Map<string, string>): boolean => newErrors(texts).length > 0;\n\n for (let round = 0; round < MAX_ROUNDS; round += 1) {\n session.check(current, { asReference: true });\n const candidates = RedundantCasts.collectCandidates({\n typescript,\n program: session.getProgram(),\n texts: current,\n includeTests,\n rejected,\n });\n\n if (candidates.length === 0) {\n break;\n }\n\n const accepted = RedundantCasts.search({\n candidates,\n base: [],\n newErrors: (chosen) => newErrors(RedundantCasts.apply({ texts: current, chosen })),\n suspectsOf: (chosen, found) =>\n RedundantCasts.suspectsOf({ typescript, program: session.getProgram(), chosen, found }),\n });\n const acceptedKeys = new Set(accepted);\n\n for (const candidate of candidates) {\n if (!acceptedKeys.has(candidate)) {\n rejected.add(`${candidate.file}|${candidate.key}`);\n }\n }\n\n for (const candidate of accepted) {\n removedPerFile.set(candidate.file, (removedPerFile.get(candidate.file) ?? 0) + 1);\n }\n\n const next = RedundantCasts.apply({ texts: current, chosen: accepted });\n for (const [file, text] of next) {\n current.set(file, text);\n }\n }\n\n const cleaned = RedundantCasts.dropUnusedImports({ typescript, original, current });\n const finalTexts = isBroken(cleaned.texts) ? current : cleaned.texts;\n const importsRemoved =\n finalTexts === cleaned.texts ? cleaned.removed : new Map<string, number>();\n\n session.check(finalTexts);\n const program = session.getProgram();\n for (const [file, text] of original) {\n const output = finalTexts.get(file) ?? text;\n const sourceFile = program.getSourceFile(file);\n const kept = sourceFile\n ? RedundantCasts.describeKept({\n typescript,\n sourceFile,\n checker: program.getTypeChecker(),\n includeTests,\n rejected,\n })\n : [];\n\n results.set(file, {\n file,\n output,\n changed: output !== text,\n removed: removedPerFile.get(file) ?? 0,\n importsRemoved: importsRemoved.get(file) ?? 0,\n kept,\n });\n }\n\n return { files: [...results.values()], checks: session.checks, baselineErrors };\n }\n\n private static loadProject(opts: { typescript: TTypeScript; tsconfigPath: string }) {\n const { typescript, tsconfigPath } = opts;\n const read = typescript.readConfigFile(tsconfigPath, typescript.sys.readFile);\n\n if (read.error) {\n // eslint-disable-next-line venizia/no-new-error -- getError would be a dev-configs -> inversion cycle\n throw new Error(\n `[loadProject] cannot read ${tsconfigPath} | ${typescript.flattenDiagnosticMessageText(read.error.messageText, '\\n')}`,\n );\n }\n\n const parsed = typescript.parseJsonConfigFileContent(\n read.config,\n typescript.sys,\n dirname(tsconfigPath),\n undefined,\n tsconfigPath,\n );\n\n return {\n fileNames: parsed.fileNames,\n options: {\n ...parsed.options,\n noEmit: true,\n incremental: false,\n composite: false,\n emitDeclarationOnly: false,\n declaration: false,\n declarationMap: false,\n tsBuildInfoFile: undefined,\n } satisfies ts.CompilerOptions,\n };\n }\n\n /**\n * Finds the casts worth trying: not `as const`, not a double cast, not a cast of `any` or\n * `unknown`, and not one already rejected. A cast inside another candidate waits for the next\n * round, so the edits of one round never overlap.\n */\n private static collectCandidates(opts: {\n typescript: TTypeScript;\n program: ts.Program;\n texts: Map<string, string>;\n includeTests: boolean;\n rejected: Set<string>;\n }): ICastCandidate[] {\n const { typescript, program, texts, includeTests, rejected } = opts;\n const checker = program.getTypeChecker();\n const found: ICastCandidate[] = [];\n\n for (const [file, text] of texts) {\n if (!includeTests && TEST_FILE_PATTERN.test(file)) {\n continue;\n }\n\n const sourceFile = program.getSourceFile(file);\n if (!sourceFile) {\n continue;\n }\n\n RedundantCasts.walkCasts({\n typescript,\n sourceFile,\n visit: (node) => {\n if (RedundantCasts.classify({ typescript, node, checker }) !== undefined) {\n return;\n }\n\n const inner = node.expression;\n const key = text.slice(node.getStart(sourceFile), node.end);\n if (rejected.has(`${file}|${key}`)) {\n return;\n }\n\n found.push({\n file,\n start: node.getStart(sourceFile),\n end: node.end,\n replacement: text.slice(inner.getStart(sourceFile), inner.end),\n key,\n });\n },\n });\n }\n\n found.sort((a, b) => a.file.localeCompare(b.file) || a.start - b.start || b.end - a.end);\n\n const outermost: ICastCandidate[] = [];\n let last: ICastCandidate | undefined;\n for (const candidate of found) {\n const isInside =\n last !== undefined &&\n last.file === candidate.file &&\n candidate.start >= last.start &&\n candidate.end <= last.end;\n if (isInside) {\n continue;\n }\n\n outermost.push(candidate);\n last = candidate;\n }\n\n return outermost;\n }\n\n /** The reason a cast is never tried, or `undefined` when it is worth trying. */\n private static classify(opts: {\n typescript: TTypeScript;\n node: ts.AsExpression | ts.TypeAssertion;\n checker: ts.TypeChecker;\n }): TCastKeepReason | undefined {\n const { typescript, node, checker } = opts;\n const target = node.type;\n\n if (\n typescript.isTypeReferenceNode(target) &&\n typescript.isIdentifier(target.typeName) &&\n target.typeName.text === 'const'\n ) {\n return CastKeepReasons.AS_CONST;\n }\n\n if (target.kind === typescript.SyntaxKind.UnknownKeyword) {\n return CastKeepReasons.UNKNOWN_TARGET;\n }\n\n let inner: ts.Expression = node.expression;\n while (typescript.isParenthesizedExpression(inner)) {\n inner = inner.expression;\n }\n\n if (typescript.isAsExpression(inner) || typescript.isTypeAssertionExpression(inner)) {\n return CastKeepReasons.DOUBLE_CAST;\n }\n\n const flags = checker.getTypeAtLocation(node.expression).flags;\n if (flags & typescript.TypeFlags.Any) {\n return CastKeepReasons.ANY_EXPRESSION;\n }\n\n if (flags & typescript.TypeFlags.Unknown) {\n return CastKeepReasons.UNKNOWN_EXPRESSION;\n }\n\n return undefined;\n }\n\n private static walkCasts(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n visit: (node: ts.AsExpression | ts.TypeAssertion) => void;\n }): void {\n const { typescript, sourceFile, visit } = opts;\n const walk = (node: ts.Node): void => {\n if (typescript.isAsExpression(node) || typescript.isTypeAssertionExpression(node)) {\n visit(node);\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(sourceFile);\n }\n\n /** The casts that remain in a file, each with the reason it stayed. */\n private static describeKept(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n checker: ts.TypeChecker;\n includeTests: boolean;\n rejected: Set<string>;\n }): IKeptCast[] {\n const { typescript, sourceFile, checker, includeTests, rejected } = opts;\n const kept: IKeptCast[] = [];\n const isTest = TEST_FILE_PATTERN.test(sourceFile.fileName);\n\n RedundantCasts.walkCasts({\n typescript,\n sourceFile,\n visit: (node) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n );\n const text = sourceFile.text.slice(node.getStart(sourceFile), node.end);\n const reason =\n (isTest && !includeTests ? CastKeepReasons.TEST_FILE : undefined) ??\n RedundantCasts.classify({ typescript, node, checker }) ??\n (rejected.has(`${resolve(sourceFile.fileName)}|${text}`)\n ? CastKeepReasons.NEEDED\n : undefined);\n\n if (reason !== undefined) {\n kept.push({ line: line + 1, column: character + 1, reason });\n }\n },\n });\n\n return kept;\n }\n\n /**\n * The candidates whose removal, together with `base`, adds no error. When a try fails, the places\n * of the new errors name the casts most likely to blame; those are set aside and the rest is tried\n * again. What cannot be named is halved until the breaking casts stand alone. Whatever is accepted\n * was checked together with everything else accepted, so a wrong guess can only keep a cast.\n */\n private static search(opts: {\n candidates: ICastCandidate[];\n base: ICastCandidate[];\n newErrors: (chosen: ICastCandidate[]) => IFoundError[];\n suspectsOf: (chosen: ICastCandidate[], found: IFoundError[]) => ICastCandidate[];\n }): ICastCandidate[] {\n const { base, newErrors, suspectsOf } = opts;\n let remaining = [...opts.candidates];\n\n for (let attempt = 0; attempt < MAX_NAMED_ATTEMPTS && remaining.length > 0; attempt += 1) {\n const chosen = [...base, ...remaining];\n const found = newErrors(chosen);\n if (found.length === 0) {\n return remaining;\n }\n\n const suspects = suspectsOf(chosen, found);\n if (suspects.length === 0) {\n break;\n }\n\n const named = new Set(suspects);\n remaining = remaining.filter((candidate) => !named.has(candidate));\n }\n\n return RedundantCasts.halve({ candidates: remaining, base, newErrors });\n }\n\n private static halve(opts: {\n candidates: ICastCandidate[];\n base: ICastCandidate[];\n newErrors: (chosen: ICastCandidate[]) => IFoundError[];\n }): ICastCandidate[] {\n const { candidates, base, newErrors } = opts;\n\n if (candidates.length === 0) {\n return [];\n }\n\n if (newErrors([...base, ...candidates]).length === 0) {\n return candidates;\n }\n\n if (candidates.length === 1) {\n return [];\n }\n\n const middle = Math.ceil(candidates.length / 2);\n const first = RedundantCasts.halve({\n candidates: candidates.slice(0, middle),\n base,\n newErrors,\n });\n const second = RedundantCasts.halve({\n candidates: candidates.slice(middle),\n base: [...base, ...first],\n newErrors,\n });\n\n return [...first, ...second];\n }\n\n /**\n * The casts a set of new errors most likely comes from: for each error, the chosen cast nearest to\n * it inside the same statement, else the nearest one before it in the same file. An error in a file\n * with no chosen cast (an importer) names nothing; the halving deals with what stays.\n */\n private static suspectsOf(opts: {\n typescript: TTypeScript;\n program: ts.Program;\n chosen: ICastCandidate[];\n found: IFoundError[];\n }): ICastCandidate[] {\n const { typescript, program, chosen, found } = opts;\n const suspects = new Set<ICastCandidate>();\n\n for (const error of found) {\n const inFile = chosen\n .filter((candidate) => candidate.file === error.file)\n .sort((a, b) => a.start - b.start);\n const sourceFile = program.getSourceFile(error.file);\n if (inFile.length === 0 || !sourceFile) {\n continue;\n }\n\n let shift = 0;\n const placed = inFile.map((candidate) => {\n const start = candidate.start - shift;\n shift += candidate.end - candidate.start - candidate.replacement.length;\n return { candidate, start, end: start + candidate.replacement.length };\n });\n const statement = RedundantCasts.enclosingStatement({\n typescript,\n sourceFile,\n position: error.start,\n });\n const distance = (item: { start: number; end: number }) =>\n error.start < item.start\n ? item.start - error.start\n : error.start > item.end\n ? error.start - item.end\n : 0;\n const inside = placed.filter(\n (item) => statement && item.start >= statement.pos && item.end <= statement.end,\n );\n const before = placed.filter((item) => item.start <= error.start);\n const pool = inside.length > 0 ? inside : before;\n const nearest = [...pool].sort((a, b) => distance(a) - distance(b))[0];\n\n if (nearest) {\n suspects.add(nearest.candidate);\n }\n }\n\n return [...suspects];\n }\n\n /** The smallest statement that holds `position`. */\n private static enclosingStatement(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n position: number;\n }): ts.Node | undefined {\n const { typescript, sourceFile, position } = opts;\n let found: ts.Node | undefined;\n\n const walk = (node: ts.Node): void => {\n if (position < node.pos || position >= node.end) {\n return;\n }\n\n const parent = node.parent;\n const isStatement =\n parent !== undefined &&\n (typescript.isSourceFile(parent) ||\n typescript.isBlock(parent) ||\n typescript.isModuleBlock(parent) ||\n typescript.isCaseClause(parent) ||\n typescript.isDefaultClause(parent));\n if (isStatement) {\n found = node;\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(sourceFile);\n return found;\n }\n\n /** The texts with `chosen` removed, each file edited from the end so earlier offsets stay valid. */\n private static apply(opts: {\n texts: Map<string, string>;\n chosen: ICastCandidate[];\n }): Map<string, string> {\n const { texts, chosen } = opts;\n const output = new Map(texts);\n const byFile = new Map<string, ICastCandidate[]>();\n\n for (const candidate of chosen) {\n byFile.set(candidate.file, [...(byFile.get(candidate.file) ?? []), candidate]);\n }\n\n for (const [file, edits] of byFile) {\n let text = output.get(file) ?? '';\n for (const edit of [...edits].sort((a, b) => b.start - a.start)) {\n text = text.slice(0, edit.start) + edit.replacement + text.slice(edit.end);\n }\n\n output.set(file, text);\n }\n\n return output;\n }\n\n /** Removes a named import the removals left unused; an import that was already unused is left alone. */\n private static dropUnusedImports(opts: {\n typescript: TTypeScript;\n original: Map<string, string>;\n current: Map<string, string>;\n }): { texts: Map<string, string>; removed: Map<string, number> } {\n const { typescript, original, current } = opts;\n const texts = new Map(current);\n const removed = new Map<string, number>();\n\n for (const [file, after] of current) {\n const before = original.get(file);\n if (before === undefined || before === after) {\n continue;\n }\n\n const usedBefore = RedundantCasts.identifiersOutsideImports({\n typescript,\n text: before,\n file,\n });\n const usedAfter = RedundantCasts.identifiersOutsideImports({ typescript, text: after, file });\n const sourceFile = typescript.createSourceFile(\n file,\n after,\n typescript.ScriptTarget.Latest,\n true,\n );\n const edits: Array<{ start: number; end: number; text: string }> = [];\n let count = 0;\n\n for (const statement of sourceFile.statements) {\n if (!typescript.isImportDeclaration(statement)) {\n continue;\n }\n\n const clause = statement.importClause;\n const bindings = clause?.namedBindings;\n if (!clause || !bindings || !typescript.isNamedImports(bindings)) {\n continue;\n }\n\n const stale = bindings.elements.filter(\n (element) => usedBefore.has(element.name.text) && !usedAfter.has(element.name.text),\n );\n if (stale.length === 0) {\n continue;\n }\n\n count += stale.length;\n const remaining = bindings.elements.filter((element) => !stale.includes(element));\n const start = statement.getStart(sourceFile);\n\n if (remaining.length === 0 && !clause.name) {\n const lineEnd = after.indexOf('\\n', statement.end);\n edits.push({ start, end: lineEnd === -1 ? statement.end : lineEnd + 1, text: '' });\n continue;\n }\n\n const typeKeyword = clause.isTypeOnly ? 'type ' : '';\n const names = remaining.map((element) =>\n after.slice(element.getStart(sourceFile), element.end),\n );\n const head = clause.name ? `${clause.name.text}${names.length > 0 ? ', ' : ''}` : '';\n const named = names.length > 0 ? `{ ${names.join(', ')} }` : '';\n const from = after.slice(statement.moduleSpecifier.getStart(sourceFile), statement.end);\n edits.push({\n start,\n end: statement.end,\n text: `import ${typeKeyword}${head}${named} from ${from}`,\n });\n }\n\n if (edits.length === 0) {\n continue;\n }\n\n let text = after;\n for (const edit of edits.sort((a, b) => b.start - a.start)) {\n text = text.slice(0, edit.start) + edit.text + text.slice(edit.end);\n }\n\n texts.set(file, text);\n removed.set(file, count);\n }\n\n return { texts, removed };\n }\n\n /** Every identifier text outside the import declarations: a name that appears here is in use. */\n private static identifiersOutsideImports(opts: {\n typescript: TTypeScript;\n text: string;\n file: string;\n }): Set<string> {\n const { typescript, text, file } = opts;\n const sourceFile = typescript.createSourceFile(\n file,\n text,\n typescript.ScriptTarget.Latest,\n true,\n );\n const names = new Set<string>();\n const walk = (node: ts.Node): void => {\n if (typescript.isImportDeclaration(node)) {\n return;\n }\n\n if (typescript.isIdentifier(node)) {\n names.add(node.text);\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(sourceFile);\n return names;\n }\n\n /** The nearest `tsconfig.json` at or above `file`, stopping at `root`. */\n static findTsconfig(opts: { file: string; root: string }): string | undefined {\n const { root } = opts;\n let directory = dirname(resolve(opts.file));\n const top = resolve(root);\n\n for (;;) {\n const candidate = join(directory, 'tsconfig.json');\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parent = dirname(directory);\n if (directory === top || parent === directory) {\n return undefined;\n }\n\n directory = parent;\n }\n }\n}\n\nconst USAGE = `Usage: devz codemod drop-redundant-casts [paths...] [--write | --check] [--project <tsconfig>] [--include-tests]\n\nRemoves \\`as X\\` casts the compiler no longer needs. A removal is kept only if the package still\ntypechecks: all removals of a package are tried together in memory and the failing ones are found\nby halving, so the package is checked a handful of times, not once per cast.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a removable cast remains (for CI)\n --project <file> the tsconfig to check against (default: the nearest tsconfig.json of each file)\n --include-tests also try casts in test files (skipped by default)\n --help print this text and exit\n\nA cast stays when its removal breaks the typecheck, and always for \\`as const\\`, \\`as unknown\\`,\n\\`x as unknown as T\\` and a cast of an \\`any\\` or \\`unknown\\` expression: the cast is the only type\nthere. The report lists how many casts stayed and why. Run your own typecheck after --write.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nclass CastFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly PROJECT = '--project';\n static readonly INCLUDE_TESTS = '--include-tests';\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.PROJECT,\n this.INCLUDE_TESTS,\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/** `devz codemod drop-redundant-casts [paths...] [--write | --check]`. */\nexport class DropRedundantCastsCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (args.includes(CastFlags.HELP) || args.includes(CastFlags.HELP_SHORT)) {\n console.log(USAGE);\n return 0;\n }\n\n const flags: string[] = [];\n const paths: string[] = [];\n let project: string | undefined;\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index] ?? '';\n\n if (argument === CastFlags.PROJECT) {\n project = args[index + 1];\n index += 1;\n if (!project || project.startsWith('-')) {\n console.error(`devz codemod: ${CastFlags.PROJECT} needs a tsconfig path\\n${USAGE}`);\n return USAGE_ERROR_CODE;\n }\n continue;\n }\n\n if (argument.startsWith(`${CastFlags.PROJECT}=`)) {\n project = argument.slice(CastFlags.PROJECT.length + 1);\n continue;\n }\n\n if (argument.startsWith('-')) {\n flags.push(argument);\n } else {\n paths.push(argument);\n }\n }\n\n const unknown = flags.filter((flag) => !CastFlags.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(CastFlags.WRITE);\n const isCheck = flags.includes(CastFlags.CHECK);\n const includeTests = flags.includes(CastFlags.INCLUDE_TESTS);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${CastFlags.WRITE} and ${CastFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n let typescript: TTypeScript;\n try {\n typescript = (await import('typescript')).default;\n } catch {\n console.error('devz codemod: the \"typescript\" package is required to check your sources');\n return 1;\n }\n\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n const byProject = new Map<string, string[]>();\n\n for (const target of targets) {\n const collected = CodemodFiles.collect({ target });\n\n if (collected.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 collected) {\n if (!CAST_TEXT.test(readFileSync(file, 'utf8'))) {\n continue;\n }\n\n const tsconfig = project\n ? resolve(root, project)\n : RedundantCasts.findTsconfig({ file, root });\n\n if (!tsconfig) {\n console.warn(`${relative(root, file)} no tsconfig.json at or above this file; skipped`);\n continue;\n }\n\n byProject.set(tsconfig, [...(byProject.get(tsconfig) ?? []), file]);\n }\n }\n\n let removed = 0;\n let kept = 0;\n let importsRemoved = 0;\n let changedFiles = 0;\n const reasons = new Map<string, number>();\n const verb = isWrite ? 'removed' : 'would remove';\n\n for (const [tsconfig, files] of byProject) {\n let result: IProjectCastResult;\n try {\n result = RedundantCasts.run({\n typescript,\n tsconfigPath: tsconfig,\n root,\n files,\n includeTests,\n });\n } catch (error) {\n console.error(\n `devz codemod: ${relative(root, tsconfig)}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return 1;\n }\n\n console.log(\n `${relative(root, tsconfig)}: ${files.length} file(s) read, typechecked ${result.checks} time(s)` +\n (result.baselineErrors > 0\n ? `, ${result.baselineErrors} error(s) were there before and are ignored`\n : ''),\n );\n\n for (const file of result.files) {\n removed += file.removed;\n importsRemoved += file.importsRemoved;\n kept += file.kept.length;\n for (const entry of file.kept) {\n reasons.set(entry.reason, (reasons.get(entry.reason) ?? 0) + 1);\n }\n\n if (file.removed === 0 && file.kept.length === 0) {\n continue;\n }\n\n const shown = relative(root, file.file);\n const detail = [...new Set(file.kept.map((entry) => entry.reason))]\n .map(\n (reason) => `${file.kept.filter((entry) => entry.reason === reason).length} ${reason}`,\n )\n .join(', ');\n console.log(\n `${file.removed > 0 ? verb : 'unchanged'} ${shown} (${file.removed} removed, ${file.kept.length} kept${detail ? `: ${detail}` : ''}${file.importsRemoved > 0 ? `, ${file.importsRemoved} import(s) dropped` : ''})`,\n );\n\n if (file.changed) {\n changedFiles += 1;\n if (isWrite) {\n writeFileSync(file.file, file.output);\n }\n }\n }\n }\n\n console.log(\n `devz codemod drop-redundant-casts: ${removed} cast(s) ${isWrite ? 'removed' : 'would be removed'} in ${changedFiles} file(s), ${kept} kept` +\n (reasons.size > 0\n ? ` (${[...reasons].map(([reason, count]) => `${count} ${reason}`).join(', ')})`\n : '') +\n (importsRemoved > 0 ? `, ${importsRemoved} unused import(s) dropped` : ''),\n );\n\n if (!isWrite && changedFiles > 0) {\n console.log(\n `Nothing was written. Run again with ${CastFlags.WRITE} to apply, then run your typecheck.`,\n );\n }\n\n return isCheck && removed > 0 ? 1 : 0;\n }\n}\n"]}
1
+ {"version":3,"file":"drop-redundant-casts.js","sourceRoot":"","sources":["../../../src/cli/codemod/drop-redundant-casts.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport type ts from 'typescript';\nimport type { TConstValue } from '../../linters/rules/common';\nimport { CodemodFiles } from './files';\n\ntype TTypeScript = typeof ts;\n\n/** Why a cast is still there after the codemod ran. */\nexport class CastKeepReasons {\n /** Taking it out makes the package fail its typecheck. */\n static readonly NEEDED = 'needed';\n /** `as const` is a narrowing the codemod never touches. */\n static readonly AS_CONST = 'as-const';\n /** `x as unknown as T`: a deliberate escape that only a person can judge. */\n static readonly DOUBLE_CAST = 'double-cast';\n /** `x as unknown` widens on purpose. */\n static readonly UNKNOWN_TARGET = 'unknown-target';\n /** The expression is `any`: the cast is the only type it has, so it is not redundant. */\n static readonly ANY_EXPRESSION = 'any-expression';\n /** The expression is `unknown`: the cast is the only type it has. */\n static readonly UNKNOWN_EXPRESSION = 'unknown-expression';\n /** Test files are skipped unless `--include-tests` is given. */\n static readonly TEST_FILE = 'test-file';\n /** The file is not part of the package's tsconfig, so nothing can check it. */\n static readonly NOT_IN_PROJECT = 'not-in-project';\n\n static readonly SCHEME_SET = new Set<string>([\n this.NEEDED,\n this.AS_CONST,\n this.DOUBLE_CAST,\n this.UNKNOWN_TARGET,\n this.ANY_EXPRESSION,\n this.UNKNOWN_EXPRESSION,\n this.TEST_FILE,\n this.NOT_IN_PROJECT,\n ]);\n\n static isValid(value: string): value is TCastKeepReason {\n return this.SCHEME_SET.has(value);\n }\n}\n\nexport type TCastKeepReason = TConstValue<typeof CastKeepReasons>;\n\nexport interface IKeptCast {\n /** Line and column in the output text (the file after the removals). */\n line: number;\n column: number;\n reason: TCastKeepReason;\n}\n\nexport interface IFileCastResult {\n file: string;\n /** The file text after the removals and the imports they left unused. */\n output: string;\n changed: boolean;\n removed: number;\n importsRemoved: number;\n kept: IKeptCast[];\n}\n\nexport interface IProjectCastResult {\n files: IFileCastResult[];\n /** How many times the package was typechecked (the baseline run included). */\n checks: number;\n /** Errors the package already had before any removal; they are not counted against a removal. */\n baselineErrors: number;\n}\n\n/** One error of a check: its message key (file, code, text) and where it points. */\ninterface IFoundError {\n key: string;\n file: string;\n start: number;\n}\n\ninterface IDiagnosticReport {\n counts: Map<string, number>;\n items: IFoundError[];\n}\n\ninterface ICastCandidate {\n file: string;\n start: number;\n end: number;\n replacement: string;\n /** The cast as written, used to remember a rejected cast across rounds. */\n key: string;\n}\n\nconst MAX_ROUNDS = 50;\n/** How many times the new errors are used to name culprits before the rest is halved. */\nconst MAX_NAMED_ATTEMPTS = 8;\n/** A file that can hold a cast: `as`, or an angle-bracket assertion. */\nconst CAST_TEXT = /\\bas\\b|<[A-Za-z_$][^<>]*>\\s*[A-Za-z_$(]/;\nconst TEST_FILE_PATTERN = /(?:^|\\/)__tests__\\/|\\.(?:test|spec)\\.[cm]?tsx?$/;\n\n/**\n * The compiler's own view of a package, with the text of some files replaced in memory. It uses the\n * compiler's incremental builder: a check after an edit revisits only the files whose exported types\n * changed and the files that import them, and the parsed files are kept between checks.\n */\nclass TypecheckSession {\n private readonly parsed = new Map<string, ts.SourceFile>();\n private readonly disk = new Map<string, string | undefined>();\n private reference: ts.SemanticDiagnosticsBuilderProgram | undefined;\n private program: ts.Program | undefined;\n checks = 0;\n\n constructor(\n private readonly typescript: TTypeScript,\n private readonly options: ts.CompilerOptions,\n private readonly rootNames: string[],\n private readonly root: string,\n ) {}\n\n /**\n * Typechecks the package with `texts` replacing the files on disk and returns the errors as a count\n * per message key. With `asReference`, the result becomes the state later checks are measured from.\n */\n check(texts: Map<string, string>, opts: { asReference?: boolean } = {}): IDiagnosticReport {\n const { typescript, options, rootNames } = this;\n const host = typescript.createCompilerHost(options, true);\n\n host.getSourceFile = (fileName, languageVersionOrOptions) => {\n const key = resolve(fileName);\n let source = texts.get(key);\n if (source === undefined) {\n if (!this.disk.has(key)) {\n this.disk.set(key, typescript.sys.readFile(fileName));\n }\n source = this.disk.get(key);\n }\n\n if (source === undefined) {\n return undefined;\n }\n\n const version = typescript.sys.createHash?.(source) ?? `${source.length}`;\n const cacheKey = `${key}\\0${version}`;\n const cached = this.parsed.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const sourceFile = typescript.createSourceFile(\n fileName,\n source,\n languageVersionOrOptions,\n true,\n );\n // The builder reads a file's version to tell a changed file from an unchanged one; the type leaves it out.\n Object.assign(sourceFile, { version });\n this.parsed.set(cacheKey, sourceFile);\n return sourceFile;\n };\n\n const builder = typescript.createSemanticDiagnosticsBuilderProgram(\n rootNames,\n options,\n host,\n this.reference,\n );\n this.program = builder.getProgram();\n this.checks += 1;\n\n if (opts.asReference) {\n this.reference = builder;\n }\n\n const counts = new Map<string, number>();\n const items: IFoundError[] = [];\n const diagnostics = [\n ...builder.getOptionsDiagnostics(),\n ...builder.getGlobalDiagnostics(),\n ...builder.getSyntacticDiagnostics(),\n ...builder.getSemanticDiagnostics(),\n ];\n for (const diagnostic of diagnostics) {\n if (diagnostic.category !== typescript.DiagnosticCategory.Error) {\n continue;\n }\n\n const where = diagnostic.file ? relative(this.root, diagnostic.file.fileName) : '';\n const message = typescript.flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n const key = `${where}|${diagnostic.code}|${message}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n items.push({\n key,\n file: diagnostic.file ? resolve(diagnostic.file.fileName) : '',\n start: diagnostic.start ?? 0,\n });\n }\n\n return { counts, items };\n }\n\n getProgram(): ts.Program {\n if (!this.program) {\n // eslint-disable-next-line venizia/no-new-error -- getError would be a dev-configs -> inversion cycle\n throw new Error('[TypecheckSession][getProgram] check() has not run yet');\n }\n\n return this.program;\n }\n}\n\n/**\n * Removes the `as X` casts a package no longer needs. Every removal of a package is tried together\n * in memory and compared with the errors the package had before; when new errors appear, the\n * candidates are halved until the ones that break the typecheck are found, so the cost is a handful\n * of checks, not one per cast.\n */\nexport class RedundantCasts {\n /** The casts of one project: which are removed, which stay and why. */\n static run(opts: {\n typescript: TTypeScript;\n tsconfigPath: string;\n root: string;\n files: string[];\n includeTests?: boolean;\n }): IProjectCastResult {\n const { typescript, tsconfigPath, root, files, includeTests = false } = opts;\n const loaded = RedundantCasts.loadProject({ typescript, tsconfigPath });\n const session = new TypecheckSession(typescript, loaded.options, loaded.fileNames, root);\n const original = new Map<string, string>();\n const current = new Map<string, string>();\n const results = new Map<string, IFileCastResult>();\n const members = new Set(loaded.fileNames.map((name) => resolve(name)));\n\n for (const file of files.map((name) => resolve(name))) {\n if (!members.has(file)) {\n results.set(file, {\n file,\n output: readFileSync(file, 'utf8'),\n changed: false,\n removed: 0,\n importsRemoved: 0,\n kept: [{ line: 0, column: 0, reason: CastKeepReasons.NOT_IN_PROJECT }],\n });\n continue;\n }\n\n const text = readFileSync(file, 'utf8');\n original.set(file, text);\n current.set(file, text);\n }\n\n const baseline = session.check(new Map(), { asReference: true }).counts;\n const baselineErrors = [...baseline.values()].reduce((sum, count) => sum + count, 0);\n const rejected = new Set<string>();\n const removedPerFile = new Map<string, number>();\n\n /** The errors `texts` adds to what the package already had. */\n const newErrors = (texts: Map<string, string>): IFoundError[] => {\n const report = session.check(texts);\n const budget = new Map(baseline);\n const added: IFoundError[] = [];\n\n for (const item of report.items) {\n const left = budget.get(item.key) ?? 0;\n if (left > 0) {\n budget.set(item.key, left - 1);\n continue;\n }\n\n added.push(item);\n }\n\n return added;\n };\n const isBroken = (texts: Map<string, string>): boolean => newErrors(texts).length > 0;\n\n for (let round = 0; round < MAX_ROUNDS; round += 1) {\n session.check(current, { asReference: true });\n const candidates = RedundantCasts.collectCandidates({\n typescript,\n program: session.getProgram(),\n texts: current,\n includeTests,\n rejected,\n });\n\n if (candidates.length === 0) {\n break;\n }\n\n const accepted = RedundantCasts.search({\n candidates,\n base: [],\n newErrors: (chosen) => newErrors(RedundantCasts.apply({ texts: current, chosen })),\n suspectsOf: (chosen, found) =>\n RedundantCasts.suspectsOf({ typescript, program: session.getProgram(), chosen, found }),\n });\n const acceptedKeys = new Set(accepted);\n\n for (const candidate of candidates) {\n if (!acceptedKeys.has(candidate)) {\n rejected.add(`${candidate.file}|${candidate.key}`);\n }\n }\n\n for (const candidate of accepted) {\n removedPerFile.set(candidate.file, (removedPerFile.get(candidate.file) ?? 0) + 1);\n }\n\n const next = RedundantCasts.apply({ texts: current, chosen: accepted });\n for (const [file, text] of next) {\n current.set(file, text);\n }\n }\n\n const cleaned = RedundantCasts.dropUnusedImports({ typescript, original, current });\n const finalTexts = isBroken(cleaned.texts) ? current : cleaned.texts;\n const importsRemoved =\n finalTexts === cleaned.texts ? cleaned.removed : new Map<string, number>();\n\n session.check(finalTexts);\n const program = session.getProgram();\n for (const [file, text] of original) {\n const output = finalTexts.get(file) ?? text;\n const sourceFile = program.getSourceFile(file);\n const kept = sourceFile\n ? RedundantCasts.describeKept({\n typescript,\n sourceFile,\n checker: program.getTypeChecker(),\n includeTests,\n rejected,\n })\n : [];\n\n results.set(file, {\n file,\n output,\n changed: output !== text,\n removed: removedPerFile.get(file) ?? 0,\n importsRemoved: importsRemoved.get(file) ?? 0,\n kept,\n });\n }\n\n return { files: [...results.values()], checks: session.checks, baselineErrors };\n }\n\n private static loadProject(opts: { typescript: TTypeScript; tsconfigPath: string }) {\n const { typescript, tsconfigPath } = opts;\n const read = typescript.readConfigFile(tsconfigPath, typescript.sys.readFile);\n\n if (read.error) {\n // eslint-disable-next-line venizia/no-new-error -- getError would be a dev-configs -> inversion cycle\n throw new Error(\n `[loadProject] cannot read ${tsconfigPath} | ${typescript.flattenDiagnosticMessageText(read.error.messageText, '\\n')}`,\n );\n }\n\n const parsed = typescript.parseJsonConfigFileContent(\n read.config,\n typescript.sys,\n dirname(tsconfigPath),\n undefined,\n tsconfigPath,\n );\n\n return {\n fileNames: parsed.fileNames,\n options: {\n ...parsed.options,\n noEmit: true,\n incremental: false,\n composite: false,\n emitDeclarationOnly: false,\n declaration: false,\n declarationMap: false,\n tsBuildInfoFile: undefined,\n } satisfies ts.CompilerOptions,\n };\n }\n\n /**\n * Finds the casts worth trying: not `as const`, not a double cast, not a cast of `any` or\n * `unknown`, and not one already rejected. A cast inside another candidate waits for the next\n * round, so the edits of one round never overlap.\n */\n private static collectCandidates(opts: {\n typescript: TTypeScript;\n program: ts.Program;\n texts: Map<string, string>;\n includeTests: boolean;\n rejected: Set<string>;\n }): ICastCandidate[] {\n const { typescript, program, texts, includeTests, rejected } = opts;\n const checker = program.getTypeChecker();\n const found: ICastCandidate[] = [];\n\n for (const [file, text] of texts) {\n if (!includeTests && TEST_FILE_PATTERN.test(file)) {\n continue;\n }\n\n const sourceFile = program.getSourceFile(file);\n if (!sourceFile) {\n continue;\n }\n\n RedundantCasts.walkCasts({\n typescript,\n sourceFile,\n visit: (node) => {\n if (RedundantCasts.classify({ typescript, node, checker }) !== undefined) {\n return;\n }\n\n const inner = node.expression;\n const key = text.slice(node.getStart(sourceFile), node.end);\n if (rejected.has(`${file}|${key}`)) {\n return;\n }\n\n found.push({\n file,\n start: node.getStart(sourceFile),\n end: node.end,\n replacement: text.slice(inner.getStart(sourceFile), inner.end),\n key,\n });\n },\n });\n }\n\n found.sort((a, b) => a.file.localeCompare(b.file) || a.start - b.start || b.end - a.end);\n\n const outermost: ICastCandidate[] = [];\n let last: ICastCandidate | undefined;\n for (const candidate of found) {\n const isInside =\n last !== undefined &&\n last.file === candidate.file &&\n candidate.start >= last.start &&\n candidate.end <= last.end;\n if (isInside) {\n continue;\n }\n\n outermost.push(candidate);\n last = candidate;\n }\n\n return outermost;\n }\n\n /** The reason a cast is never tried, or `undefined` when it is worth trying. */\n private static classify(opts: {\n typescript: TTypeScript;\n node: ts.AsExpression | ts.TypeAssertion;\n checker: ts.TypeChecker;\n }): TCastKeepReason | undefined {\n const { typescript, node, checker } = opts;\n const target = node.type;\n\n if (\n typescript.isTypeReferenceNode(target) &&\n typescript.isIdentifier(target.typeName) &&\n target.typeName.text === 'const'\n ) {\n return CastKeepReasons.AS_CONST;\n }\n\n if (target.kind === typescript.SyntaxKind.UnknownKeyword) {\n return CastKeepReasons.UNKNOWN_TARGET;\n }\n\n let inner: ts.Expression = node.expression;\n while (typescript.isParenthesizedExpression(inner)) {\n inner = inner.expression;\n }\n\n if (typescript.isAsExpression(inner) || typescript.isTypeAssertionExpression(inner)) {\n return CastKeepReasons.DOUBLE_CAST;\n }\n\n const flags = checker.getTypeAtLocation(node.expression).flags;\n if (flags & typescript.TypeFlags.Any) {\n return CastKeepReasons.ANY_EXPRESSION;\n }\n\n if (flags & typescript.TypeFlags.Unknown) {\n return CastKeepReasons.UNKNOWN_EXPRESSION;\n }\n\n return undefined;\n }\n\n private static walkCasts(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n visit: (node: ts.AsExpression | ts.TypeAssertion) => void;\n }): void {\n const { typescript, sourceFile, visit } = opts;\n const walk = (node: ts.Node): void => {\n if (typescript.isAsExpression(node) || typescript.isTypeAssertionExpression(node)) {\n visit(node);\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(sourceFile);\n }\n\n /** The casts that remain in a file, each with the reason it stayed. */\n private static describeKept(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n checker: ts.TypeChecker;\n includeTests: boolean;\n rejected: Set<string>;\n }): IKeptCast[] {\n const { typescript, sourceFile, checker, includeTests, rejected } = opts;\n const kept: IKeptCast[] = [];\n const isTest = TEST_FILE_PATTERN.test(sourceFile.fileName);\n\n RedundantCasts.walkCasts({\n typescript,\n sourceFile,\n visit: (node) => {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n );\n const text = sourceFile.text.slice(node.getStart(sourceFile), node.end);\n const reason =\n (isTest && !includeTests ? CastKeepReasons.TEST_FILE : undefined) ??\n RedundantCasts.classify({ typescript, node, checker }) ??\n (rejected.has(`${resolve(sourceFile.fileName)}|${text}`)\n ? CastKeepReasons.NEEDED\n : undefined);\n\n if (reason !== undefined) {\n kept.push({ line: line + 1, column: character + 1, reason });\n }\n },\n });\n\n return kept;\n }\n\n /**\n * The candidates whose removal, together with `base`, adds no error. When a try fails, the places\n * of the new errors name the casts most likely to blame; those are set aside and the rest is tried\n * again. What cannot be named is halved until the breaking casts stand alone. Whatever is accepted\n * was checked together with everything else accepted, so a wrong guess can only keep a cast.\n */\n private static search(opts: {\n candidates: ICastCandidate[];\n base: ICastCandidate[];\n newErrors: (chosen: ICastCandidate[]) => IFoundError[];\n suspectsOf: (chosen: ICastCandidate[], found: IFoundError[]) => ICastCandidate[];\n }): ICastCandidate[] {\n const { base, newErrors, suspectsOf } = opts;\n let remaining = [...opts.candidates];\n\n for (let attempt = 0; attempt < MAX_NAMED_ATTEMPTS && remaining.length > 0; attempt += 1) {\n const chosen = [...base, ...remaining];\n const found = newErrors(chosen);\n if (found.length === 0) {\n return remaining;\n }\n\n const suspects = suspectsOf(chosen, found);\n if (suspects.length === 0) {\n break;\n }\n\n const named = new Set(suspects);\n remaining = remaining.filter((candidate) => !named.has(candidate));\n }\n\n return RedundantCasts.halve({ candidates: remaining, base, newErrors });\n }\n\n private static halve(opts: {\n candidates: ICastCandidate[];\n base: ICastCandidate[];\n newErrors: (chosen: ICastCandidate[]) => IFoundError[];\n }): ICastCandidate[] {\n const { candidates, base, newErrors } = opts;\n\n if (candidates.length === 0) {\n return [];\n }\n\n if (newErrors([...base, ...candidates]).length === 0) {\n return candidates;\n }\n\n if (candidates.length === 1) {\n return [];\n }\n\n const middle = Math.ceil(candidates.length / 2);\n const first = RedundantCasts.halve({\n candidates: candidates.slice(0, middle),\n base,\n newErrors,\n });\n const second = RedundantCasts.halve({\n candidates: candidates.slice(middle),\n base: [...base, ...first],\n newErrors,\n });\n\n return [...first, ...second];\n }\n\n /**\n * The casts a set of new errors most likely comes from: for each error, the chosen cast nearest to\n * it inside the same statement, else the nearest one before it in the same file. An error in a file\n * with no chosen cast (an importer) names nothing; the halving deals with what stays.\n */\n private static suspectsOf(opts: {\n typescript: TTypeScript;\n program: ts.Program;\n chosen: ICastCandidate[];\n found: IFoundError[];\n }): ICastCandidate[] {\n const { typescript, program, chosen, found } = opts;\n const suspects = new Set<ICastCandidate>();\n\n for (const error of found) {\n const inFile = chosen\n .filter((candidate) => candidate.file === error.file)\n .sort((a, b) => a.start - b.start);\n const sourceFile = program.getSourceFile(error.file);\n if (inFile.length === 0 || !sourceFile) {\n continue;\n }\n\n let shift = 0;\n const placed = inFile.map((candidate) => {\n const start = candidate.start - shift;\n shift += candidate.end - candidate.start - candidate.replacement.length;\n return { candidate, start, end: start + candidate.replacement.length };\n });\n const statement = RedundantCasts.enclosingStatement({\n typescript,\n sourceFile,\n position: error.start,\n });\n const distance = (item: { start: number; end: number }) =>\n error.start < item.start\n ? item.start - error.start\n : error.start > item.end\n ? error.start - item.end\n : 0;\n const inside = placed.filter(\n (item) => statement && item.start >= statement.pos && item.end <= statement.end,\n );\n const before = placed.filter((item) => item.start <= error.start);\n const pool = inside.length > 0 ? inside : before;\n const nearest = [...pool].sort((a, b) => distance(a) - distance(b))[0];\n\n if (nearest) {\n suspects.add(nearest.candidate);\n }\n }\n\n return [...suspects];\n }\n\n /** The smallest statement that holds `position`. */\n private static enclosingStatement(opts: {\n typescript: TTypeScript;\n sourceFile: ts.SourceFile;\n position: number;\n }): ts.Node | undefined {\n const { typescript, sourceFile, position } = opts;\n let found: ts.Node | undefined;\n\n const walk = (node: ts.Node): void => {\n if (position < node.pos || position >= node.end) {\n return;\n }\n\n const parent = node.parent;\n const isStatement =\n parent !== undefined &&\n (typescript.isSourceFile(parent) ||\n typescript.isBlock(parent) ||\n typescript.isModuleBlock(parent) ||\n typescript.isCaseClause(parent) ||\n typescript.isDefaultClause(parent));\n if (isStatement) {\n found = node;\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(sourceFile);\n return found;\n }\n\n /** The texts with `chosen` removed, each file edited from the end so earlier offsets stay valid. */\n private static apply(opts: {\n texts: Map<string, string>;\n chosen: ICastCandidate[];\n }): Map<string, string> {\n const { texts, chosen } = opts;\n const output = new Map(texts);\n const byFile = new Map<string, ICastCandidate[]>();\n\n for (const candidate of chosen) {\n byFile.set(candidate.file, [...(byFile.get(candidate.file) ?? []), candidate]);\n }\n\n for (const [file, edits] of byFile) {\n let text = output.get(file) ?? '';\n for (const edit of [...edits].sort((a, b) => b.start - a.start)) {\n text = text.slice(0, edit.start) + edit.replacement + text.slice(edit.end);\n }\n\n output.set(file, text);\n }\n\n return output;\n }\n\n /** Removes a named import the removals left unused; an import that was already unused is left alone. */\n private static dropUnusedImports(opts: {\n typescript: TTypeScript;\n original: Map<string, string>;\n current: Map<string, string>;\n }): { texts: Map<string, string>; removed: Map<string, number> } {\n const { typescript, original, current } = opts;\n const texts = new Map(current);\n const removed = new Map<string, number>();\n\n for (const [file, after] of current) {\n const before = original.get(file);\n if (before === undefined || before === after) {\n continue;\n }\n\n const usedBefore = RedundantCasts.identifiersOutsideImports({\n typescript,\n text: before,\n file,\n });\n const usedAfter = RedundantCasts.identifiersOutsideImports({ typescript, text: after, file });\n const sourceFile = typescript.createSourceFile(\n file,\n after,\n typescript.ScriptTarget.Latest,\n true,\n );\n const edits: Array<{ start: number; end: number; text: string }> = [];\n let count = 0;\n\n for (const statement of sourceFile.statements) {\n if (!typescript.isImportDeclaration(statement)) {\n continue;\n }\n\n const clause = statement.importClause;\n const bindings = clause?.namedBindings;\n if (!clause || !bindings || !typescript.isNamedImports(bindings)) {\n continue;\n }\n\n const stale = bindings.elements.filter(\n (element) => usedBefore.has(element.name.text) && !usedAfter.has(element.name.text),\n );\n if (stale.length === 0) {\n continue;\n }\n\n count += stale.length;\n const remaining = bindings.elements.filter((element) => !stale.includes(element));\n const start = statement.getStart(sourceFile);\n\n if (remaining.length === 0 && !clause.name) {\n const lineEnd = after.indexOf('\\n', statement.end);\n edits.push({ start, end: lineEnd === -1 ? statement.end : lineEnd + 1, text: '' });\n continue;\n }\n\n const typeKeyword = clause.isTypeOnly ? 'type ' : '';\n const names = remaining.map((element) =>\n after.slice(element.getStart(sourceFile), element.end),\n );\n const head = clause.name ? `${clause.name.text}${names.length > 0 ? ', ' : ''}` : '';\n const named = names.length > 0 ? `{ ${names.join(', ')} }` : '';\n const from = after.slice(statement.moduleSpecifier.getStart(sourceFile), statement.end);\n edits.push({\n start,\n end: statement.end,\n text: `import ${typeKeyword}${head}${named} from ${from}`,\n });\n }\n\n if (edits.length === 0) {\n continue;\n }\n\n let text = after;\n for (const edit of edits.sort((a, b) => b.start - a.start)) {\n text = text.slice(0, edit.start) + edit.text + text.slice(edit.end);\n }\n\n texts.set(file, text);\n removed.set(file, count);\n }\n\n return { texts, removed };\n }\n\n /** Every identifier text outside the import declarations: a name that appears here is in use. */\n private static identifiersOutsideImports(opts: {\n typescript: TTypeScript;\n text: string;\n file: string;\n }): Set<string> {\n const { typescript, text, file } = opts;\n const sourceFile = typescript.createSourceFile(\n file,\n text,\n typescript.ScriptTarget.Latest,\n true,\n );\n const names = new Set<string>();\n const walk = (node: ts.Node): void => {\n if (typescript.isImportDeclaration(node)) {\n return;\n }\n\n if (typescript.isIdentifier(node)) {\n names.add(node.text);\n }\n\n typescript.forEachChild(node, walk);\n };\n\n walk(sourceFile);\n return names;\n }\n\n /** The nearest `tsconfig.json` at or above `file`, stopping at `root`. */\n static findTsconfig(opts: { file: string; root: string }): string | undefined {\n const { root } = opts;\n let directory = dirname(resolve(opts.file));\n const top = resolve(root);\n\n for (;;) {\n const candidate = join(directory, 'tsconfig.json');\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parent = dirname(directory);\n if (directory === top || parent === directory) {\n return undefined;\n }\n\n directory = parent;\n }\n }\n}\n\nconst USAGE = `Usage: devz codemod drop-redundant-casts [paths...] [--write | --check] [--project <tsconfig>] [--include-tests]\n\nRemoves \\`as X\\` casts the compiler no longer needs. A removal is kept only if the package still\ntypechecks: all removals of a package are tried together in memory and the failing ones are found\nby halving, so the package is checked a handful of times, not once per cast.\n\n --write write the changed files (without it, nothing is written)\n --check dry run that exits 1 while a removable cast remains (for CI)\n --project <file> the tsconfig to check against (default: the nearest tsconfig.json of each file)\n --include-tests also try casts in test files (skipped by default)\n --help print this text and exit\n\nA cast stays when its removal breaks the typecheck, and always for \\`as const\\`, \\`as unknown\\`,\n\\`x as unknown as T\\` and a cast of an \\`any\\` or \\`unknown\\` expression: the cast is the only type\nthere. The report lists how many casts stayed and why. Run your own typecheck after --write.`;\n\n/** A usage error: nothing was read or written. */\nconst USAGE_ERROR_CODE = 2;\n\nclass CastFlags {\n static readonly WRITE = '--write';\n static readonly CHECK = '--check';\n static readonly PROJECT = '--project';\n static readonly INCLUDE_TESTS = '--include-tests';\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.PROJECT,\n this.INCLUDE_TESTS,\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/** `devz codemod drop-redundant-casts [paths...] [--write | --check]`. */\nexport class DropRedundantCastsCommand {\n static readonly USAGE = USAGE;\n\n static async run(opts: { root: string; args: string[] }): Promise<number> {\n const { root, args } = opts;\n\n if (args.includes(CastFlags.HELP) || args.includes(CastFlags.HELP_SHORT)) {\n console.log(USAGE);\n return 0;\n }\n\n const flags: string[] = [];\n const paths: string[] = [];\n let project: string | undefined;\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index] ?? '';\n\n if (argument === CastFlags.PROJECT) {\n project = args[index + 1];\n index += 1;\n if (!project || project.startsWith('-')) {\n console.error(`devz codemod: ${CastFlags.PROJECT} needs a tsconfig path\\n${USAGE}`);\n return USAGE_ERROR_CODE;\n }\n continue;\n }\n\n if (argument.startsWith(`${CastFlags.PROJECT}=`)) {\n project = argument.slice(CastFlags.PROJECT.length + 1);\n continue;\n }\n\n if (argument.startsWith('-')) {\n flags.push(argument);\n } else {\n paths.push(argument);\n }\n }\n\n const unknown = flags.filter((flag) => !CastFlags.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(CastFlags.WRITE);\n const isCheck = flags.includes(CastFlags.CHECK);\n const includeTests = flags.includes(CastFlags.INCLUDE_TESTS);\n\n if (isWrite && isCheck) {\n console.error(\n `devz codemod: ${CastFlags.WRITE} and ${CastFlags.CHECK} contradict each other\\n${USAGE}`,\n );\n return USAGE_ERROR_CODE;\n }\n\n let typescript: TTypeScript;\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 check your sources');\n return 1;\n }\n\n const targets = (paths.length > 0 ? paths : ['.']).map((path) => resolve(root, path));\n const byProject = new Map<string, string[]>();\n\n for (const target of targets) {\n const collected = CodemodFiles.collect({ target });\n\n if (collected.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 collected) {\n if (!CAST_TEXT.test(readFileSync(file, 'utf8'))) {\n continue;\n }\n\n const tsconfig = project\n ? resolve(root, project)\n : RedundantCasts.findTsconfig({ file, root });\n\n if (!tsconfig) {\n console.warn(`${relative(root, file)} no tsconfig.json at or above this file; skipped`);\n continue;\n }\n\n byProject.set(tsconfig, [...(byProject.get(tsconfig) ?? []), file]);\n }\n }\n\n let removed = 0;\n let kept = 0;\n let importsRemoved = 0;\n let changedFiles = 0;\n const reasons = new Map<string, number>();\n const verb = isWrite ? 'removed' : 'would remove';\n\n for (const [tsconfig, files] of byProject) {\n let result: IProjectCastResult;\n try {\n result = RedundantCasts.run({\n typescript,\n tsconfigPath: tsconfig,\n root,\n files,\n includeTests,\n });\n } catch (error) {\n console.error(\n `devz codemod: ${relative(root, tsconfig)}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return 1;\n }\n\n console.log(\n `${relative(root, tsconfig)}: ${files.length} file(s) read, typechecked ${result.checks} time(s)` +\n (result.baselineErrors > 0\n ? `, ${result.baselineErrors} error(s) were there before and are ignored`\n : ''),\n );\n\n for (const file of result.files) {\n removed += file.removed;\n importsRemoved += file.importsRemoved;\n kept += file.kept.length;\n for (const entry of file.kept) {\n reasons.set(entry.reason, (reasons.get(entry.reason) ?? 0) + 1);\n }\n\n if (file.removed === 0 && file.kept.length === 0) {\n continue;\n }\n\n const shown = relative(root, file.file);\n const detail = [...new Set(file.kept.map((entry) => entry.reason))]\n .map(\n (reason) => `${file.kept.filter((entry) => entry.reason === reason).length} ${reason}`,\n )\n .join(', ');\n console.log(\n `${file.removed > 0 ? verb : 'unchanged'} ${shown} (${file.removed} removed, ${file.kept.length} kept${detail ? `: ${detail}` : ''}${file.importsRemoved > 0 ? `, ${file.importsRemoved} import(s) dropped` : ''})`,\n );\n\n if (file.changed) {\n changedFiles += 1;\n if (isWrite) {\n writeFileSync(file.file, file.output);\n }\n }\n }\n }\n\n console.log(\n `devz codemod drop-redundant-casts: ${removed} cast(s) ${isWrite ? 'removed' : 'would be removed'} in ${changedFiles} file(s), ${kept} kept` +\n (reasons.size > 0\n ? ` (${[...reasons].map(([reason, count]) => `${count} ${reason}`).join(', ')})`\n : '') +\n (importsRemoved > 0 ? `, ${importsRemoved} unused import(s) dropped` : ''),\n );\n\n if (!isWrite && changedFiles > 0) {\n console.log(\n `Nothing was written. Run again with ${CastFlags.WRITE} to apply, then run your typecheck.`,\n );\n }\n\n return isCheck && removed > 0 ? 1 : 0;\n }\n}\n"]}