ts-ag 1.1.5 → 1.1.6

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.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bun
2
2
  import { t as colorText } from "../cli-DIua8C8m.mjs";
3
- import { dirname, join, relative, resolve } from "path";
3
+ import { dirname, isAbsolute, join, relative, resolve } from "path";
4
4
  import { parseArgs } from "util";
5
5
  import console from "console";
6
6
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -251,7 +251,7 @@ async function main() {
251
251
  dryRun,
252
252
  force,
253
253
  verbose: values.verbose === true,
254
- remove: values.remove?.split(" ") ?? []
254
+ remove: (values.remove?.split(" ") ?? []).map((path) => isAbsolute(path) ? path : resolve(process.cwd(), path))
255
255
  });
256
256
  await regenerator.run("initial run");
257
257
  if (!watchMode) return;
@@ -1 +1 @@
1
- {"version":3,"file":"ts-build-config.mjs","names":["formatWithOxfmt"],"sources":["../../src/scripts/ts-build-config.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport console from 'console';\nimport { mkdirSync, writeFileSync, existsSync, readFileSync } from 'fs';\nimport { dirname, join, resolve, relative } from 'path';\nimport { parseArgs } from 'util';\n\nimport type { FSWatcher } from 'chokidar';\nimport { watch } from 'chokidar';\nimport { type TsConfigResult, type TsConfigJson, parseTsconfig } from 'get-tsconfig';\nimport { format as formatWithOxfmt } from 'oxfmt';\n\nimport { colorText } from '../utils/cli.js';\n\n// TODO on startup check cwd for oxfmt config and use that instead of my default\n\nconst DEFAULT_TEST_EXCLUDES = [\n '**/*.test.ts',\n '**/*.test.tsx',\n '**/*.spec.ts',\n '**/*.spec.tsx',\n '**/__tests__/**',\n '**/tests/**'\n];\nconst GENERATED_FILE_HEADER = '// generated by ts-build-config';\n\nconst LABEL = colorText('cyan', '[ts-build-config]');\nconst formatPath = (filePath: string): string => colorText('dim', relative(process.cwd(), filePath));\nconst logInfo = (message: string): void => console.log(`${LABEL} ${message}`);\nconst logWarn = (message: string): void => console.warn(`${LABEL} ${colorText('yellow', message)}`);\nconst logError = (message: string): void => console.error(`${LABEL} ${colorText('red', message)}`);\n\nfunction unique(items: string[]): string[] {\n return Array.from(new Set(items));\n}\n\n/**\n * If the path refers to a file then it returns it otherwise joins tsconfig.json\n */\nfunction resolveTsConfigPath(refAbsPath: string): string {\n if (refAbsPath.endsWith('.json')) return refAbsPath;\n else return join(refAbsPath, 'tsconfig.json');\n}\n\n/**\n * Excludes extra paths from the include list that contain test patterns\n */\nfunction computeExtraExcludes(config: TsConfigJson): string[] {\n const extra: string[] = [...DEFAULT_TEST_EXCLUDES];\n\n // If the tsconfig includes ./tests (or tests) explicitly, ensure it is excluded in build config.\n for (const inc of config.include ?? []) {\n const norm = inc.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (norm === './tests' || norm === 'tests' || norm.startsWith('./tests/') || norm.startsWith('tests/')) {\n extra.push('./tests/**');\n break;\n }\n }\n\n return unique(extra);\n}\n\nfunction withTrailingNewline(value: string): string {\n return value.endsWith('\\n') ? value : `${value}\\n`;\n}\n\nasync function formatBuildTsconfigJson(config: TsConfigJson): Promise<string> {\n const fallback = JSON.stringify(config, null, 2);\n\n try {\n const result = await formatWithOxfmt('tsconfig.build.json', fallback, {\n useTabs: false,\n singleQuote: true,\n trailingComma: 'none',\n printWidth: 120,\n objectWrap: 'collapse',\n semi: true,\n proseWrap: 'always',\n sortPackageJson: { sortScripts: true },\n sortImports: {}\n });\n if (!result.errors.length && typeof result.code === 'string' && result.code.length > 0) {\n return withTrailingNewline(result.code);\n }\n } catch {\n // Fallback to plain JSON below.\n }\n\n return withTrailingNewline(fallback);\n}\n\nasync function writeBuildTsconfig(tsconfigPath: string, config: TsConfigJson, dryRun: boolean): Promise<string> {\n const dir = dirname(tsconfigPath);\n const outPath = join(dir, 'tsconfig.build.json');\n\n const mergedExclude = unique([...(config.exclude ?? []), ...computeExtraExcludes(config)]);\n\n const buildConfig: TsConfigJson = { extends: './tsconfig.json', compilerOptions: {}, exclude: mergedExclude };\n\n if (config.references && config.references.length > 0) buildConfig.references = config.references;\n\n // If original compilerOptions exists, keep build-specific overrides minimal.\n // But ensure emit is enabled if base tsconfig has noEmit: true (common for editor configs).\n if (config.compilerOptions?.noEmit === true) buildConfig.compilerOptions!.noEmit = false;\n\n // Keep outDir/rootDir if already set in base; do not guess.\n // If you want to force them, do it in the base tsconfig.json or pass flags later.\n\n if (!dryRun) {\n mkdirSync(dir, { recursive: true });\n const formattedJson = await formatBuildTsconfigJson(buildConfig);\n writeFileSync(outPath, `${GENERATED_FILE_HEADER}\\n${formattedJson}`, 'utf8');\n }\n\n return outPath;\n}\n\nfunction isGeneratedByThisScript(filePath: string): boolean {\n try {\n const contents = readFileSync(filePath, 'utf8');\n const firstLine = contents.split(/\\r?\\n/, 1)[0]?.trim() ?? '';\n\n return firstLine === GENERATED_FILE_HEADER;\n } catch {\n return false;\n }\n}\n\n/**\n * @returns true if the tsconfig path should have a build config generated for it\n */\nfunction shouldUseBuildConfig(tsconfigPath: string, force: boolean): boolean {\n const buildPath = join(dirname(tsconfigPath), 'tsconfig.build.json');\n if (!existsSync(buildPath)) return true;\n if (force) return true;\n return isGeneratedByThisScript(buildPath);\n}\n\nfunction ensureDotRelative(filePath: string): string {\n if (filePath.startsWith('.')) return filePath;\n return `./${filePath}`;\n}\n\n/**\n * Returns the modified tsconfig where the references point to the build configs\n * (that we are going to build)\n */\nfunction replaceRefsWithBuildConfigs(res: TsConfigResult, buildConfigSet: Set<string>, remove: string[]): TsConfigJson {\n const refs = res.config.references;\n if (!refs || refs.length === 0) return res.config;\n\n // console.log('refs', res.path, refs);\n const baseDir = dirname(res.path);\n const mapped: TsConfigJson.References[] = refs\n .map((ref) => {\n const refPath = ensureDotRelative(ref.path);\n const absPath = resolve(dirname(res.path), refPath);\n const resolvedRefPath = resolveTsConfigPath(absPath);\n\n if (remove.includes(resolvedRefPath)) {\n return undefined;\n }\n\n if (!buildConfigSet.has(resolvedRefPath)) {\n // We're not going to build this one so use it plain\n return { ...ref, path: refPath };\n }\n\n const buildRefPath = join(dirname(resolvedRefPath), 'tsconfig.build.json');\n const relativeBuildRef = ensureDotRelative(relative(baseDir, buildRefPath));\n return { ...ref, path: relativeBuildRef };\n })\n .filter((v) => v !== undefined);\n\n return { ...res.config, references: mapped };\n}\n\ntype GenerateOptions = { dryRun: boolean; force: boolean; verbose: boolean; remove: string[] };\n\nasync function generateBuildConfigs(\n entry: string,\n options: GenerateOptions\n): Promise<{ created: { src: string; out: string }[]; visitedConfigs: string[] }> {\n const { dryRun, force, verbose } = options;\n\n const loadedConfigs = new Map<string, TsConfigResult>();\n const visited = new Set<string>();\n const queue: string[] = [entry];\n const created: { src: string; out: string }[] = [];\n\n // First pass: discover the full referenced tsconfig graph and load configs.\n while (queue.length) {\n const tsconfigPath = queue.shift()!;\n if (visited.has(tsconfigPath)) continue;\n visited.add(tsconfigPath);\n\n let res: TsConfigResult;\n\n try {\n const config = parseTsconfig(tsconfigPath);\n if (config) res = { path: tsconfigPath, config };\n else throw new Error('Null returned from getTsConfig');\n } catch (e) {\n logWarn(`Skipping unreadable config: ${formatPath(tsconfigPath)}`);\n if (verbose) console.warn(e);\n continue;\n }\n\n loadedConfigs.set(res.path, res);\n\n const refs = unique(\n (res.config.references ?? []).map((ref) => {\n const abs = resolve(dirname(res.path), ref.path);\n return resolveTsConfigPath(abs);\n })\n );\n for (const r of refs) queue.push(r);\n }\n\n const discoveredConfigs = Array.from(loadedConfigs.keys()).filter((path) => !isGeneratedByThisScript(path));\n const buildConfigSet = new Set(discoveredConfigs.filter((path) => shouldUseBuildConfig(path, force)));\n\n // Second pass: write build configs with rewritten references.\n for (const tsconfigPath of discoveredConfigs) {\n const res = loadedConfigs.get(tsconfigPath)!;\n const buildPath = join(dirname(tsconfigPath), 'tsconfig.build.json');\n\n if (!buildConfigSet.has(tsconfigPath)) {\n if (verbose) {\n logInfo(`Skip ${formatPath(buildPath)} (manual file, use ${colorText('bold', '--force')})`);\n }\n } else {\n const rewrittenCfg = replaceRefsWithBuildConfigs(res, buildConfigSet, options.remove);\n const written = await writeBuildTsconfig(tsconfigPath, rewrittenCfg, dryRun);\n created.push({ src: tsconfigPath, out: written });\n if (verbose || dryRun) {\n const verb = dryRun ? colorText('yellow', '[dry-run] write') : colorText('green', 'write');\n logInfo(`${verb} ${formatPath(written)} <- ${formatPath(tsconfigPath)}`);\n }\n }\n }\n\n if (!verbose && !dryRun) {\n logInfo(`${colorText('green', 'updated')} ${created.length} tsconfig.build.json file(s)`);\n }\n\n return { created, visitedConfigs: Array.from(visited) };\n}\n\nfunction createRegenerator(\n entry: string,\n options: GenerateOptions\n): { run: (reason?: string) => Promise<void>; syncWatchedConfigs: (watcher: FSWatcher) => void } {\n let isRunning = false;\n let rerunRequested = false;\n let watchedConfigs = new Set<string>();\n\n const syncWatchedConfigs = (watcher: FSWatcher): void => {\n if (watchedConfigs.size === 0) return;\n watcher.add(Array.from(watchedConfigs));\n };\n\n const run = async (reason?: string): Promise<void> => {\n if (isRunning) {\n rerunRequested = true;\n return;\n }\n isRunning = true;\n\n try {\n do {\n rerunRequested = false;\n if (reason) {\n logInfo(`${colorText('cyan', 'regenerate')} (${reason})`);\n reason = undefined;\n }\n const result = await generateBuildConfigs(entry, options);\n watchedConfigs = new Set(result.visitedConfigs);\n } while (rerunRequested);\n } finally {\n isRunning = false;\n }\n };\n\n return { run, syncWatchedConfigs };\n}\n\nasync function main(): Promise<void> {\n const { values } = parseArgs({\n args: process.argv.slice(2),\n options: {\n config: { type: 'string', short: 'c' },\n dryRun: { type: 'boolean' },\n force: { type: 'boolean' }, // overwrite files not generated by this script\n watch: { type: 'boolean', short: 'w' },\n verbose: { type: 'boolean', short: 'v' },\n remove: { type: 'string' } // abs paths to tsconfig refs to remove\n }\n });\n\n const entry = values.config ? resolve(values.config) : null;\n if (!entry) {\n logError('Missing required flag: --config <path/to/tsconfig.json>');\n process.exit(1);\n }\n if (!existsSync(entry)) {\n logError(`Config file not found: ${formatPath(entry)}`);\n process.exit(1);\n }\n\n const dryRun = values.dryRun === true;\n const force = values.force === true;\n const watchMode = values.watch === true;\n const verbose = values.verbose === true;\n const options: GenerateOptions = { dryRun, force, verbose, remove: values.remove?.split(' ') ?? [] };\n\n const regenerator = createRegenerator(entry, options);\n await regenerator.run('initial run');\n\n if (!watchMode) return;\n\n logInfo(`watching ${colorText('cyan', 'tsconfig')} changes...`);\n const watcher = watch([], {\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 300, pollInterval: 100 }\n });\n regenerator.syncWatchedConfigs(watcher);\n\n watcher.on('change', async (filePath) => {\n logInfo(`${colorText('cyan', 'change')} ${formatPath(filePath)}`);\n await regenerator.run(`changed ${relative(process.cwd(), filePath)}`);\n regenerator.syncWatchedConfigs(watcher);\n });\n\n watcher.on('add', async (filePath) => {\n logInfo(`${colorText('cyan', 'add')} ${formatPath(filePath)}`);\n await regenerator.run(`added ${relative(process.cwd(), filePath)}`);\n regenerator.syncWatchedConfigs(watcher);\n });\n\n watcher.on('unlink', async (filePath) => {\n logInfo(`${colorText('yellow', 'remove')} ${formatPath(filePath)}`);\n await regenerator.run(`removed ${relative(process.cwd(), filePath)}`);\n regenerator.syncWatchedConfigs(watcher);\n });\n}\n\nmain().catch((err) => {\n logError('Unhandled error');\n console.error(err);\n process.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"ts-build-config.mjs","names":["formatWithOxfmt"],"sources":["../../src/scripts/ts-build-config.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport console from 'console';\nimport { mkdirSync, writeFileSync, existsSync, readFileSync } from 'fs';\nimport { dirname, join, resolve, relative, isAbsolute } from 'path';\nimport { parseArgs } from 'util';\n\nimport type { FSWatcher } from 'chokidar';\nimport { watch } from 'chokidar';\nimport { type TsConfigResult, type TsConfigJson, parseTsconfig } from 'get-tsconfig';\nimport { format as formatWithOxfmt } from 'oxfmt';\n\nimport { colorText } from '../utils/cli.js';\n\n// TODO on startup check cwd for oxfmt config and use that instead of my default\n\nconst DEFAULT_TEST_EXCLUDES = [\n '**/*.test.ts',\n '**/*.test.tsx',\n '**/*.spec.ts',\n '**/*.spec.tsx',\n '**/__tests__/**',\n '**/tests/**'\n];\nconst GENERATED_FILE_HEADER = '// generated by ts-build-config';\n\nconst LABEL = colorText('cyan', '[ts-build-config]');\nconst formatPath = (filePath: string): string => colorText('dim', relative(process.cwd(), filePath));\nconst logInfo = (message: string): void => console.log(`${LABEL} ${message}`);\nconst logWarn = (message: string): void => console.warn(`${LABEL} ${colorText('yellow', message)}`);\nconst logError = (message: string): void => console.error(`${LABEL} ${colorText('red', message)}`);\n\nfunction unique(items: string[]): string[] {\n return Array.from(new Set(items));\n}\n\n/**\n * If the path refers to a file then it returns it otherwise joins tsconfig.json\n */\nfunction resolveTsConfigPath(refAbsPath: string): string {\n if (refAbsPath.endsWith('.json')) return refAbsPath;\n else return join(refAbsPath, 'tsconfig.json');\n}\n\n/**\n * Excludes extra paths from the include list that contain test patterns\n */\nfunction computeExtraExcludes(config: TsConfigJson): string[] {\n const extra: string[] = [...DEFAULT_TEST_EXCLUDES];\n\n // If the tsconfig includes ./tests (or tests) explicitly, ensure it is excluded in build config.\n for (const inc of config.include ?? []) {\n const norm = inc.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n if (norm === './tests' || norm === 'tests' || norm.startsWith('./tests/') || norm.startsWith('tests/')) {\n extra.push('./tests/**');\n break;\n }\n }\n\n return unique(extra);\n}\n\nfunction withTrailingNewline(value: string): string {\n return value.endsWith('\\n') ? value : `${value}\\n`;\n}\n\nasync function formatBuildTsconfigJson(config: TsConfigJson): Promise<string> {\n const fallback = JSON.stringify(config, null, 2);\n\n try {\n const result = await formatWithOxfmt('tsconfig.build.json', fallback, {\n useTabs: false,\n singleQuote: true,\n trailingComma: 'none',\n printWidth: 120,\n objectWrap: 'collapse',\n semi: true,\n proseWrap: 'always',\n sortPackageJson: { sortScripts: true },\n sortImports: {}\n });\n if (!result.errors.length && typeof result.code === 'string' && result.code.length > 0) {\n return withTrailingNewline(result.code);\n }\n } catch {\n // Fallback to plain JSON below.\n }\n\n return withTrailingNewline(fallback);\n}\n\nasync function writeBuildTsconfig(tsconfigPath: string, config: TsConfigJson, dryRun: boolean): Promise<string> {\n const dir = dirname(tsconfigPath);\n const outPath = join(dir, 'tsconfig.build.json');\n\n const mergedExclude = unique([...(config.exclude ?? []), ...computeExtraExcludes(config)]);\n\n const buildConfig: TsConfigJson = { extends: './tsconfig.json', compilerOptions: {}, exclude: mergedExclude };\n\n if (config.references && config.references.length > 0) buildConfig.references = config.references;\n\n // If original compilerOptions exists, keep build-specific overrides minimal.\n // But ensure emit is enabled if base tsconfig has noEmit: true (common for editor configs).\n if (config.compilerOptions?.noEmit === true) buildConfig.compilerOptions!.noEmit = false;\n\n // Keep outDir/rootDir if already set in base; do not guess.\n // If you want to force them, do it in the base tsconfig.json or pass flags later.\n\n if (!dryRun) {\n mkdirSync(dir, { recursive: true });\n const formattedJson = await formatBuildTsconfigJson(buildConfig);\n writeFileSync(outPath, `${GENERATED_FILE_HEADER}\\n${formattedJson}`, 'utf8');\n }\n\n return outPath;\n}\n\nfunction isGeneratedByThisScript(filePath: string): boolean {\n try {\n const contents = readFileSync(filePath, 'utf8');\n const firstLine = contents.split(/\\r?\\n/, 1)[0]?.trim() ?? '';\n\n return firstLine === GENERATED_FILE_HEADER;\n } catch {\n return false;\n }\n}\n\n/**\n * @returns true if the tsconfig path should have a build config generated for it\n */\nfunction shouldUseBuildConfig(tsconfigPath: string, force: boolean): boolean {\n const buildPath = join(dirname(tsconfigPath), 'tsconfig.build.json');\n if (!existsSync(buildPath)) return true;\n if (force) return true;\n return isGeneratedByThisScript(buildPath);\n}\n\nfunction ensureDotRelative(filePath: string): string {\n if (filePath.startsWith('.')) return filePath;\n return `./${filePath}`;\n}\n\n/**\n * Returns the modified tsconfig where the references point to the build configs\n * (that we are going to build)\n */\nfunction replaceRefsWithBuildConfigs(res: TsConfigResult, buildConfigSet: Set<string>, remove: string[]): TsConfigJson {\n const refs = res.config.references;\n if (!refs || refs.length === 0) return res.config;\n\n // console.log('refs', res.path, refs);\n const baseDir = dirname(res.path);\n const mapped: TsConfigJson.References[] = refs\n .map((ref) => {\n const refPath = ensureDotRelative(ref.path);\n const absPath = resolve(dirname(res.path), refPath);\n const resolvedRefPath = resolveTsConfigPath(absPath);\n\n if (remove.includes(resolvedRefPath)) {\n return undefined;\n }\n\n if (!buildConfigSet.has(resolvedRefPath)) {\n // We're not going to build this one so use it plain\n return { ...ref, path: refPath };\n }\n\n const buildRefPath = join(dirname(resolvedRefPath), 'tsconfig.build.json');\n const relativeBuildRef = ensureDotRelative(relative(baseDir, buildRefPath));\n return { ...ref, path: relativeBuildRef };\n })\n .filter((v) => v !== undefined);\n\n return { ...res.config, references: mapped };\n}\n\ntype GenerateOptions = { dryRun: boolean; force: boolean; verbose: boolean; remove: string[] };\n\nasync function generateBuildConfigs(\n entry: string,\n options: GenerateOptions\n): Promise<{ created: { src: string; out: string }[]; visitedConfigs: string[] }> {\n const { dryRun, force, verbose } = options;\n\n const loadedConfigs = new Map<string, TsConfigResult>();\n const visited = new Set<string>();\n const queue: string[] = [entry];\n const created: { src: string; out: string }[] = [];\n\n // First pass: discover the full referenced tsconfig graph and load configs.\n while (queue.length) {\n const tsconfigPath = queue.shift()!;\n if (visited.has(tsconfigPath)) continue;\n visited.add(tsconfigPath);\n\n let res: TsConfigResult;\n\n try {\n const config = parseTsconfig(tsconfigPath);\n if (config) res = { path: tsconfigPath, config };\n else throw new Error('Null returned from getTsConfig');\n } catch (e) {\n logWarn(`Skipping unreadable config: ${formatPath(tsconfigPath)}`);\n if (verbose) console.warn(e);\n continue;\n }\n\n loadedConfigs.set(res.path, res);\n\n const refs = unique(\n (res.config.references ?? []).map((ref) => {\n const abs = resolve(dirname(res.path), ref.path);\n return resolveTsConfigPath(abs);\n })\n );\n for (const r of refs) queue.push(r);\n }\n\n const discoveredConfigs = Array.from(loadedConfigs.keys()).filter((path) => !isGeneratedByThisScript(path));\n const buildConfigSet = new Set(discoveredConfigs.filter((path) => shouldUseBuildConfig(path, force)));\n\n // Second pass: write build configs with rewritten references.\n for (const tsconfigPath of discoveredConfigs) {\n const res = loadedConfigs.get(tsconfigPath)!;\n const buildPath = join(dirname(tsconfigPath), 'tsconfig.build.json');\n\n if (!buildConfigSet.has(tsconfigPath)) {\n if (verbose) {\n logInfo(`Skip ${formatPath(buildPath)} (manual file, use ${colorText('bold', '--force')})`);\n }\n } else {\n const rewrittenCfg = replaceRefsWithBuildConfigs(res, buildConfigSet, options.remove);\n const written = await writeBuildTsconfig(tsconfigPath, rewrittenCfg, dryRun);\n created.push({ src: tsconfigPath, out: written });\n if (verbose || dryRun) {\n const verb = dryRun ? colorText('yellow', '[dry-run] write') : colorText('green', 'write');\n logInfo(`${verb} ${formatPath(written)} <- ${formatPath(tsconfigPath)}`);\n }\n }\n }\n\n if (!verbose && !dryRun) {\n logInfo(`${colorText('green', 'updated')} ${created.length} tsconfig.build.json file(s)`);\n }\n\n return { created, visitedConfigs: Array.from(visited) };\n}\n\nfunction createRegenerator(\n entry: string,\n options: GenerateOptions\n): { run: (reason?: string) => Promise<void>; syncWatchedConfigs: (watcher: FSWatcher) => void } {\n let isRunning = false;\n let rerunRequested = false;\n let watchedConfigs = new Set<string>();\n\n const syncWatchedConfigs = (watcher: FSWatcher): void => {\n if (watchedConfigs.size === 0) return;\n watcher.add(Array.from(watchedConfigs));\n };\n\n const run = async (reason?: string): Promise<void> => {\n if (isRunning) {\n rerunRequested = true;\n return;\n }\n isRunning = true;\n\n try {\n do {\n rerunRequested = false;\n if (reason) {\n logInfo(`${colorText('cyan', 'regenerate')} (${reason})`);\n reason = undefined;\n }\n const result = await generateBuildConfigs(entry, options);\n watchedConfigs = new Set(result.visitedConfigs);\n } while (rerunRequested);\n } finally {\n isRunning = false;\n }\n };\n\n return { run, syncWatchedConfigs };\n}\n\nasync function main(): Promise<void> {\n const { values } = parseArgs({\n args: process.argv.slice(2),\n options: {\n config: { type: 'string', short: 'c' },\n dryRun: { type: 'boolean' },\n force: { type: 'boolean' }, // overwrite files not generated by this script\n watch: { type: 'boolean', short: 'w' },\n verbose: { type: 'boolean', short: 'v' },\n remove: { type: 'string' } // abs paths to tsconfig refs to remove\n }\n });\n\n const entry = values.config ? resolve(values.config) : null;\n if (!entry) {\n logError('Missing required flag: --config <path/to/tsconfig.json>');\n process.exit(1);\n }\n if (!existsSync(entry)) {\n logError(`Config file not found: ${formatPath(entry)}`);\n process.exit(1);\n }\n\n const dryRun = values.dryRun === true;\n const force = values.force === true;\n const watchMode = values.watch === true;\n const verbose = values.verbose === true;\n const remove = (values.remove?.split(' ') ?? []).map((path) =>\n isAbsolute(path) ? path : resolve(process.cwd(), path)\n );\n const options: GenerateOptions = { dryRun, force, verbose, remove };\n\n const regenerator = createRegenerator(entry, options);\n await regenerator.run('initial run');\n\n if (!watchMode) return;\n\n logInfo(`watching ${colorText('cyan', 'tsconfig')} changes...`);\n const watcher = watch([], {\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 300, pollInterval: 100 }\n });\n regenerator.syncWatchedConfigs(watcher);\n\n watcher.on('change', async (filePath) => {\n logInfo(`${colorText('cyan', 'change')} ${formatPath(filePath)}`);\n await regenerator.run(`changed ${relative(process.cwd(), filePath)}`);\n regenerator.syncWatchedConfigs(watcher);\n });\n\n watcher.on('add', async (filePath) => {\n logInfo(`${colorText('cyan', 'add')} ${formatPath(filePath)}`);\n await regenerator.run(`added ${relative(process.cwd(), filePath)}`);\n regenerator.syncWatchedConfigs(watcher);\n });\n\n watcher.on('unlink', async (filePath) => {\n logInfo(`${colorText('yellow', 'remove')} ${formatPath(filePath)}`);\n await regenerator.run(`removed ${relative(process.cwd(), filePath)}`);\n regenerator.syncWatchedConfigs(watcher);\n });\n}\n\nmain().catch((err) => {\n logError('Unhandled error');\n console.error(err);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;AAgBA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACD;AACD,MAAM,wBAAwB;AAE9B,MAAM,QAAQ,UAAU,QAAQ,oBAAoB;AACpD,MAAM,cAAc,aAA6B,UAAU,OAAO,SAAS,QAAQ,KAAK,EAAE,SAAS,CAAC;AACpG,MAAM,WAAW,YAA0B,QAAQ,IAAI,GAAG,MAAM,GAAG,UAAU;AAC7E,MAAM,WAAW,YAA0B,QAAQ,KAAK,GAAG,MAAM,GAAG,UAAU,UAAU,QAAQ,GAAG;AACnG,MAAM,YAAY,YAA0B,QAAQ,MAAM,GAAG,MAAM,GAAG,UAAU,OAAO,QAAQ,GAAG;AAElG,SAAS,OAAO,OAA2B;AACzC,QAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC;;;;;AAMnC,SAAS,oBAAoB,YAA4B;AACvD,KAAI,WAAW,SAAS,QAAQ,CAAE,QAAO;KACpC,QAAO,KAAK,YAAY,gBAAgB;;;;;AAM/C,SAAS,qBAAqB,QAAgC;CAC5D,MAAM,QAAkB,CAAC,GAAG,sBAAsB;AAGlD,MAAK,MAAM,OAAO,OAAO,WAAW,EAAE,EAAE;EACtC,MAAM,OAAO,IAAI,QAAQ,OAAO,IAAI,CAAC,QAAQ,QAAQ,GAAG;AACxD,MAAI,SAAS,aAAa,SAAS,WAAW,KAAK,WAAW,WAAW,IAAI,KAAK,WAAW,SAAS,EAAE;AACtG,SAAM,KAAK,aAAa;AACxB;;;AAIJ,QAAO,OAAO,MAAM;;AAGtB,SAAS,oBAAoB,OAAuB;AAClD,QAAO,MAAM,SAAS,KAAK,GAAG,QAAQ,GAAG,MAAM;;AAGjD,eAAe,wBAAwB,QAAuC;CAC5E,MAAM,WAAW,KAAK,UAAU,QAAQ,MAAM,EAAE;AAEhD,KAAI;EACF,MAAM,SAAS,MAAMA,OAAgB,uBAAuB,UAAU;GACpE,SAAS;GACT,aAAa;GACb,eAAe;GACf,YAAY;GACZ,YAAY;GACZ,MAAM;GACN,WAAW;GACX,iBAAiB,EAAE,aAAa,MAAM;GACtC,aAAa,EAAE;GAChB,CAAC;AACF,MAAI,CAAC,OAAO,OAAO,UAAU,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS,EACnF,QAAO,oBAAoB,OAAO,KAAK;SAEnC;AAIR,QAAO,oBAAoB,SAAS;;AAGtC,eAAe,mBAAmB,cAAsB,QAAsB,QAAkC;CAC9G,MAAM,MAAM,QAAQ,aAAa;CACjC,MAAM,UAAU,KAAK,KAAK,sBAAsB;CAIhD,MAAM,cAA4B;EAAE,SAAS;EAAmB,iBAAiB,EAAE;EAAE,SAF/D,OAAO,CAAC,GAAI,OAAO,WAAW,EAAE,EAAG,GAAG,qBAAqB,OAAO,CAAC,CAAC;EAEmB;AAE7G,KAAI,OAAO,cAAc,OAAO,WAAW,SAAS,EAAG,aAAY,aAAa,OAAO;AAIvF,KAAI,OAAO,iBAAiB,WAAW,KAAM,aAAY,gBAAiB,SAAS;AAKnF,KAAI,CAAC,QAAQ;AACX,YAAU,KAAK,EAAE,WAAW,MAAM,CAAC;AAEnC,gBAAc,SAAS,GAAG,sBAAsB,IAD1B,MAAM,wBAAwB,YAAY,IACK,OAAO;;AAG9E,QAAO;;AAGT,SAAS,wBAAwB,UAA2B;AAC1D,KAAI;AAIF,UAHiB,aAAa,UAAU,OAAO,CACpB,MAAM,SAAS,EAAE,CAAC,IAAI,MAAM,IAAI,QAEtC;SACf;AACN,SAAO;;;;;;AAOX,SAAS,qBAAqB,cAAsB,OAAyB;CAC3E,MAAM,YAAY,KAAK,QAAQ,aAAa,EAAE,sBAAsB;AACpE,KAAI,CAAC,WAAW,UAAU,CAAE,QAAO;AACnC,KAAI,MAAO,QAAO;AAClB,QAAO,wBAAwB,UAAU;;AAG3C,SAAS,kBAAkB,UAA0B;AACnD,KAAI,SAAS,WAAW,IAAI,CAAE,QAAO;AACrC,QAAO,KAAK;;;;;;AAOd,SAAS,4BAA4B,KAAqB,gBAA6B,QAAgC;CACrH,MAAM,OAAO,IAAI,OAAO;AACxB,KAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO,IAAI;CAG3C,MAAM,UAAU,QAAQ,IAAI,KAAK;CACjC,MAAM,SAAoC,KACvC,KAAK,QAAQ;EACZ,MAAM,UAAU,kBAAkB,IAAI,KAAK;EAE3C,MAAM,kBAAkB,oBADR,QAAQ,QAAQ,IAAI,KAAK,EAAE,QAAQ,CACC;AAEpD,MAAI,OAAO,SAAS,gBAAgB,CAClC;AAGF,MAAI,CAAC,eAAe,IAAI,gBAAgB,CAEtC,QAAO;GAAE,GAAG;GAAK,MAAM;GAAS;EAIlC,MAAM,mBAAmB,kBAAkB,SAAS,SAD/B,KAAK,QAAQ,gBAAgB,EAAE,sBAAsB,CACA,CAAC;AAC3E,SAAO;GAAE,GAAG;GAAK,MAAM;GAAkB;GACzC,CACD,QAAQ,MAAM,MAAM,KAAA,EAAU;AAEjC,QAAO;EAAE,GAAG,IAAI;EAAQ,YAAY;EAAQ;;AAK9C,eAAe,qBACb,OACA,SACgF;CAChF,MAAM,EAAE,QAAQ,OAAO,YAAY;CAEnC,MAAM,gCAAgB,IAAI,KAA6B;CACvD,MAAM,0BAAU,IAAI,KAAa;CACjC,MAAM,QAAkB,CAAC,MAAM;CAC/B,MAAM,UAA0C,EAAE;AAGlD,QAAO,MAAM,QAAQ;EACnB,MAAM,eAAe,MAAM,OAAO;AAClC,MAAI,QAAQ,IAAI,aAAa,CAAE;AAC/B,UAAQ,IAAI,aAAa;EAEzB,IAAI;AAEJ,MAAI;GACF,MAAM,SAAS,cAAc,aAAa;AAC1C,OAAI,OAAQ,OAAM;IAAE,MAAM;IAAc;IAAQ;OAC3C,OAAM,IAAI,MAAM,iCAAiC;WAC/C,GAAG;AACV,WAAQ,+BAA+B,WAAW,aAAa,GAAG;AAClE,OAAI,QAAS,SAAQ,KAAK,EAAE;AAC5B;;AAGF,gBAAc,IAAI,IAAI,MAAM,IAAI;EAEhC,MAAM,OAAO,QACV,IAAI,OAAO,cAAc,EAAE,EAAE,KAAK,QAAQ;AAEzC,UAAO,oBADK,QAAQ,QAAQ,IAAI,KAAK,EAAE,IAAI,KAAK,CACjB;IAC/B,CACH;AACD,OAAK,MAAM,KAAK,KAAM,OAAM,KAAK,EAAE;;CAGrC,MAAM,oBAAoB,MAAM,KAAK,cAAc,MAAM,CAAC,CAAC,QAAQ,SAAS,CAAC,wBAAwB,KAAK,CAAC;CAC3G,MAAM,iBAAiB,IAAI,IAAI,kBAAkB,QAAQ,SAAS,qBAAqB,MAAM,MAAM,CAAC,CAAC;AAGrG,MAAK,MAAM,gBAAgB,mBAAmB;EAC5C,MAAM,MAAM,cAAc,IAAI,aAAa;EAC3C,MAAM,YAAY,KAAK,QAAQ,aAAa,EAAE,sBAAsB;AAEpE,MAAI,CAAC,eAAe,IAAI,aAAa;OAC/B,QACF,SAAQ,QAAQ,WAAW,UAAU,CAAC,qBAAqB,UAAU,QAAQ,UAAU,CAAC,GAAG;SAExF;GAEL,MAAM,UAAU,MAAM,mBAAmB,cADpB,4BAA4B,KAAK,gBAAgB,QAAQ,OAAO,EAChB,OAAO;AAC5E,WAAQ,KAAK;IAAE,KAAK;IAAc,KAAK;IAAS,CAAC;AACjD,OAAI,WAAW,OAEb,SAAQ,GADK,SAAS,UAAU,UAAU,kBAAkB,GAAG,UAAU,SAAS,QAAQ,CAC1E,GAAG,WAAW,QAAQ,CAAC,MAAM,WAAW,aAAa,GAAG;;;AAK9E,KAAI,CAAC,WAAW,CAAC,OACf,SAAQ,GAAG,UAAU,SAAS,UAAU,CAAC,GAAG,QAAQ,OAAO,8BAA8B;AAG3F,QAAO;EAAE;EAAS,gBAAgB,MAAM,KAAK,QAAQ;EAAE;;AAGzD,SAAS,kBACP,OACA,SAC+F;CAC/F,IAAI,YAAY;CAChB,IAAI,iBAAiB;CACrB,IAAI,iCAAiB,IAAI,KAAa;CAEtC,MAAM,sBAAsB,YAA6B;AACvD,MAAI,eAAe,SAAS,EAAG;AAC/B,UAAQ,IAAI,MAAM,KAAK,eAAe,CAAC;;CAGzC,MAAM,MAAM,OAAO,WAAmC;AACpD,MAAI,WAAW;AACb,oBAAiB;AACjB;;AAEF,cAAY;AAEZ,MAAI;AACF,MAAG;AACD,qBAAiB;AACjB,QAAI,QAAQ;AACV,aAAQ,GAAG,UAAU,QAAQ,aAAa,CAAC,IAAI,OAAO,GAAG;AACzD,cAAS,KAAA;;IAEX,MAAM,SAAS,MAAM,qBAAqB,OAAO,QAAQ;AACzD,qBAAiB,IAAI,IAAI,OAAO,eAAe;YACxC;YACD;AACR,eAAY;;;AAIhB,QAAO;EAAE;EAAK;EAAoB;;AAGpC,eAAe,OAAsB;CACnC,MAAM,EAAE,WAAW,UAAU;EAC3B,MAAM,QAAQ,KAAK,MAAM,EAAE;EAC3B,SAAS;GACP,QAAQ;IAAE,MAAM;IAAU,OAAO;IAAK;GACtC,QAAQ,EAAE,MAAM,WAAW;GAC3B,OAAO,EAAE,MAAM,WAAW;GAC1B,OAAO;IAAE,MAAM;IAAW,OAAO;IAAK;GACtC,SAAS;IAAE,MAAM;IAAW,OAAO;IAAK;GACxC,QAAQ,EAAE,MAAM,UAAU;GAC3B;EACF,CAAC;CAEF,MAAM,QAAQ,OAAO,SAAS,QAAQ,OAAO,OAAO,GAAG;AACvD,KAAI,CAAC,OAAO;AACV,WAAS,0DAA0D;AACnE,UAAQ,KAAK,EAAE;;AAEjB,KAAI,CAAC,WAAW,MAAM,EAAE;AACtB,WAAS,0BAA0B,WAAW,MAAM,GAAG;AACvD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,SAAS,OAAO,WAAW;CACjC,MAAM,QAAQ,OAAO,UAAU;CAC/B,MAAM,YAAY,OAAO,UAAU;CAOnC,MAAM,cAAc,kBAAkB,OAFL;EAAE;EAAQ;EAAO,SAJlC,OAAO,YAAY;EAIwB,SAH3C,OAAO,QAAQ,MAAM,IAAI,IAAI,EAAE,EAAE,KAAK,SACpD,WAAW,KAAK,GAAG,OAAO,QAAQ,QAAQ,KAAK,EAAE,KAAK,CACvD;EACkE,CAEd;AACrD,OAAM,YAAY,IAAI,cAAc;AAEpC,KAAI,CAAC,UAAW;AAEhB,SAAQ,YAAY,UAAU,QAAQ,WAAW,CAAC,aAAa;CAC/D,MAAM,UAAU,MAAM,EAAE,EAAE;EACxB,YAAY;EACZ,eAAe;EACf,kBAAkB;GAAE,oBAAoB;GAAK,cAAc;GAAK;EACjE,CAAC;AACF,aAAY,mBAAmB,QAAQ;AAEvC,SAAQ,GAAG,UAAU,OAAO,aAAa;AACvC,UAAQ,GAAG,UAAU,QAAQ,SAAS,CAAC,GAAG,WAAW,SAAS,GAAG;AACjE,QAAM,YAAY,IAAI,WAAW,SAAS,QAAQ,KAAK,EAAE,SAAS,GAAG;AACrE,cAAY,mBAAmB,QAAQ;GACvC;AAEF,SAAQ,GAAG,OAAO,OAAO,aAAa;AACpC,UAAQ,GAAG,UAAU,QAAQ,MAAM,CAAC,GAAG,WAAW,SAAS,GAAG;AAC9D,QAAM,YAAY,IAAI,SAAS,SAAS,QAAQ,KAAK,EAAE,SAAS,GAAG;AACnE,cAAY,mBAAmB,QAAQ;GACvC;AAEF,SAAQ,GAAG,UAAU,OAAO,aAAa;AACvC,UAAQ,GAAG,UAAU,UAAU,SAAS,CAAC,GAAG,WAAW,SAAS,GAAG;AACnE,QAAM,YAAY,IAAI,WAAW,SAAS,QAAQ,KAAK,EAAE,SAAS,GAAG;AACrE,cAAY,mBAAmB,QAAQ;GACvC;;AAGJ,MAAM,CAAC,OAAO,QAAQ;AACpB,UAAS,kBAAkB;AAC3B,SAAQ,MAAM,IAAI;AAClB,SAAQ,KAAK,EAAE;EACf"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ag",
3
- "version": "1.1.5",
3
+ "version": "1.1.6",
4
4
  "description": "Useful TS stuff",
5
5
  "bugs": "https://github.com/ageorgeh/ts-ag/issues",
6
6
  "author": "Alexander Hornung",