@inlang/paraglide-js 2.26.0 → 2.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -1
- package/dist/bundler-plugins/per-locale-build/index.js +14 -7
- package/dist/bundler-plugins/per-locale-build/index.js.map +1 -1
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.js +237 -4
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.js.map +1 -1
- package/dist/bundler-plugins/unplugin.d.ts +1 -1
- package/dist/bundler-plugins/unplugin.js +79 -10
- package/dist/bundler-plugins/unplugin.js.map +1 -1
- package/dist/bundler-plugins/unplugin.test.js +334 -1
- package/dist/bundler-plugins/unplugin.test.js.map +1 -1
- package/dist/bundler-plugins/vite.js +2 -1
- package/dist/bundler-plugins/vite.js.map +1 -1
- package/dist/bundler-plugins/vite.test.js +1 -1
- package/dist/bundler-plugins/vite.test.js.map +1 -1
- package/dist/cli/commands/compile/command.js +13 -0
- package/dist/cli/commands/compile/command.js.map +1 -1
- package/dist/cli/commands/compile/command.test.js +87 -3
- package/dist/cli/commands/compile/command.test.js.map +1 -1
- package/dist/cli/commands/init/command.d.ts +5 -0
- package/dist/cli/commands/init/command.js +216 -44
- package/dist/cli/commands/init/command.js.map +1 -1
- package/dist/cli/commands/init/command.test.d.ts +1 -0
- package/dist/cli/commands/init/command.test.js +123 -0
- package/dist/cli/commands/init/command.test.js.map +1 -0
- package/dist/cli/defaults.js +2 -2
- package/dist/cli/defaults.js.map +1 -1
- package/dist/cli/init-options.d.ts +11 -0
- package/dist/cli/init-options.js +2 -0
- package/dist/cli/init-options.js.map +1 -0
- package/dist/cli/steps/add-inlang-check.d.ts +19 -0
- package/dist/cli/steps/add-inlang-check.js +60 -0
- package/dist/cli/steps/add-inlang-check.js.map +1 -0
- package/dist/cli/steps/add-inlang-check.test.d.ts +1 -0
- package/dist/cli/steps/add-inlang-check.test.js +88 -0
- package/dist/cli/steps/add-inlang-check.test.js.map +1 -0
- package/dist/cli/steps/add-message-lint.d.ts +34 -0
- package/dist/cli/steps/add-message-lint.js +105 -0
- package/dist/cli/steps/add-message-lint.js.map +1 -0
- package/dist/cli/steps/add-message-lint.test.d.ts +1 -0
- package/dist/cli/steps/add-message-lint.test.js +74 -0
- package/dist/cli/steps/add-message-lint.test.js.map +1 -0
- package/dist/cli/steps/add-vite-plugin.d.ts +18 -0
- package/dist/cli/steps/add-vite-plugin.js +34 -6
- package/dist/cli/steps/add-vite-plugin.js.map +1 -1
- package/dist/cli/steps/add-vite-plugin.test.js +25 -9
- package/dist/cli/steps/add-vite-plugin.test.js.map +1 -1
- package/dist/cli/steps/agents-md-suggestion.d.ts +11 -0
- package/dist/cli/steps/agents-md-suggestion.js +19 -0
- package/dist/cli/steps/agents-md-suggestion.js.map +1 -0
- package/dist/cli/steps/agents-md-suggestion.test.d.ts +1 -0
- package/dist/cli/steps/agents-md-suggestion.test.js +36 -0
- package/dist/cli/steps/agents-md-suggestion.test.js.map +1 -0
- package/dist/cli/steps/check-for-uncomitted-changes.d.ts +3 -0
- package/dist/cli/steps/check-for-uncomitted-changes.js +15 -3
- package/dist/cli/steps/check-for-uncomitted-changes.js.map +1 -1
- package/dist/cli/steps/detect-bundler.d.ts +1 -0
- package/dist/cli/steps/detect-bundler.js +7 -1
- package/dist/cli/steps/detect-bundler.js.map +1 -1
- package/dist/cli/steps/initialize-inlang-project.d.ts +4 -3
- package/dist/cli/steps/initialize-inlang-project.js +60 -157
- package/dist/cli/steps/initialize-inlang-project.js.map +1 -1
- package/dist/cli/steps/maybe-add-machine-translation.d.ts +4 -0
- package/dist/cli/steps/maybe-add-machine-translation.js +14 -8
- package/dist/cli/steps/maybe-add-machine-translation.js.map +1 -1
- package/dist/cli/steps/maybe-add-sherlock.d.ts +2 -0
- package/dist/cli/steps/maybe-add-sherlock.js +13 -7
- package/dist/cli/steps/maybe-add-sherlock.js.map +1 -1
- package/dist/cli/steps/maybe-add-sherlock.test.d.ts +1 -0
- package/dist/cli/steps/maybe-add-sherlock.test.js +44 -0
- package/dist/cli/steps/maybe-add-sherlock.test.js.map +1 -0
- package/dist/cli/steps/prompt-for-outdir.d.ts +2 -0
- package/dist/cli/steps/prompt-for-outdir.js +4 -0
- package/dist/cli/steps/prompt-for-outdir.js.map +1 -1
- package/dist/cli/steps/update-package-json.js +8 -13
- package/dist/cli/steps/update-package-json.js.map +1 -1
- package/dist/cli/steps/update-ts-config.d.ts +6 -0
- package/dist/cli/steps/update-ts-config.js +27 -4
- package/dist/cli/steps/update-ts-config.js.map +1 -1
- package/dist/cli/utils.d.ts +11 -0
- package/dist/cli/utils.js +21 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/cli/utils.test.d.ts +1 -0
- package/dist/cli/utils.test.js +16 -0
- package/dist/cli/utils.test.js.map +1 -0
- package/dist/compiler/compile-annotation.d.ts +48 -1
- package/dist/compiler/compile-annotation.js +243 -10
- package/dist/compiler/compile-annotation.js.map +1 -1
- package/dist/compiler/compile-bundle.d.ts +7 -2
- package/dist/compiler/compile-bundle.js +97 -3
- package/dist/compiler/compile-bundle.js.map +1 -1
- package/dist/compiler/compile-bundle.test.js +232 -19
- package/dist/compiler/compile-bundle.test.js.map +1 -1
- package/dist/compiler/compile-lifecycle.test.d.ts +1 -0
- package/dist/compiler/compile-lifecycle.test.js +69 -0
- package/dist/compiler/compile-lifecycle.test.js.map +1 -0
- package/dist/compiler/compile-local-variable.d.ts +3 -0
- package/dist/compiler/compile-local-variable.js +5 -2
- package/dist/compiler/compile-local-variable.js.map +1 -1
- package/dist/compiler/compile-local-variable.test.js +55 -15
- package/dist/compiler/compile-local-variable.test.js.map +1 -1
- package/dist/compiler/compile-message.d.ts +29 -1
- package/dist/compiler/compile-message.exact-number.test.d.ts +1 -0
- package/dist/compiler/compile-message.exact-number.test.js +786 -0
- package/dist/compiler/compile-message.exact-number.test.js.map +1 -0
- package/dist/compiler/compile-message.js +162 -66
- package/dist/compiler/compile-message.js.map +1 -1
- package/dist/compiler/compile-message.locals.test.d.ts +1 -0
- package/dist/compiler/compile-message.locals.test.js +498 -0
- package/dist/compiler/compile-message.locals.test.js.map +1 -0
- package/dist/compiler/compile-message.test.js +113 -22
- package/dist/compiler/compile-message.test.js.map +1 -1
- package/dist/compiler/compile-pattern.d.ts +5 -0
- package/dist/compiler/compile-pattern.js +6 -18
- package/dist/compiler/compile-pattern.js.map +1 -1
- package/dist/compiler/compile-pattern.test.js +169 -5
- package/dist/compiler/compile-pattern.test.js.map +1 -1
- package/dist/compiler/compile-project.js +5 -1
- package/dist/compiler/compile-project.js.map +1 -1
- package/dist/compiler/compile-project.test.js +1260 -185
- package/dist/compiler/compile-project.test.js.map +1 -1
- package/dist/compiler/compile.js +36 -17
- package/dist/compiler/compile.js.map +1 -1
- package/dist/compiler/compile.test.js +71 -1
- package/dist/compiler/compile.test.js.map +1 -1
- package/dist/compiler/compiler-options.d.ts +41 -0
- package/dist/compiler/compiler-options.js.map +1 -1
- package/dist/compiler/create-readme.d.ts +4 -1
- package/dist/compiler/create-readme.js +33 -125
- package/dist/compiler/create-readme.js.map +1 -1
- package/dist/compiler/emit-ts-declarations.interop.test.js +2 -2
- package/dist/compiler/emit-ts-declarations.interop.test.js.map +1 -1
- package/dist/compiler/emit-ts-declarations.test.js +4 -4
- package/dist/compiler/emit-ts-declarations.test.js.map +1 -1
- package/dist/compiler/index.d.ts +1 -1
- package/dist/compiler/index.js +1 -1
- package/dist/compiler/index.js.map +1 -1
- package/dist/compiler/input-alias.d.ts +21 -0
- package/dist/compiler/input-alias.js +42 -0
- package/dist/compiler/input-alias.js.map +1 -0
- package/dist/compiler/input-alias.test.d.ts +1 -0
- package/dist/compiler/input-alias.test.js +58 -0
- package/dist/compiler/input-alias.test.js.map +1 -0
- package/dist/compiler/message-locals.d.ts +46 -0
- package/dist/compiler/message-locals.js +129 -0
- package/dist/compiler/message-locals.js.map +1 -0
- package/dist/compiler/output-structure/locale-modules.js +7 -1
- package/dist/compiler/output-structure/locale-modules.js.map +1 -1
- package/dist/compiler/output-structure/locale-modules.test.js +35 -0
- package/dist/compiler/output-structure/locale-modules.test.js.map +1 -1
- package/dist/compiler/output-structure/message-modules.js +6 -4
- package/dist/compiler/output-structure/message-modules.js.map +1 -1
- package/dist/compiler/output-structure/message-modules.test.js +35 -0
- package/dist/compiler/output-structure/message-modules.test.js.map +1 -1
- package/dist/compiler/registry.d.ts +12 -0
- package/dist/compiler/registry.js +158 -31
- package/dist/compiler/registry.js.map +1 -1
- package/dist/compiler/registry.test.d.ts +1 -0
- package/dist/compiler/registry.test.js +291 -0
- package/dist/compiler/registry.test.js.map +1 -0
- package/dist/compiler/runtime/create-runtime.d.ts +2 -0
- package/dist/compiler/runtime/create-runtime.js +9 -0
- package/dist/compiler/runtime/create-runtime.js.map +1 -1
- package/dist/compiler/runtime/extract-locale-from-cookie.js +8 -1
- package/dist/compiler/runtime/extract-locale-from-cookie.js.map +1 -1
- package/dist/compiler/runtime/extract-locale-from-cookie.test.js +26 -0
- package/dist/compiler/runtime/extract-locale-from-cookie.test.js.map +1 -1
- package/dist/compiler/runtime/extract-locale-from-header.js +47 -5
- package/dist/compiler/runtime/extract-locale-from-header.js.map +1 -1
- package/dist/compiler/runtime/extract-locale-from-header.test.js +58 -0
- package/dist/compiler/runtime/extract-locale-from-header.test.js.map +1 -1
- package/dist/compiler/runtime/get-locale.js +7 -1
- package/dist/compiler/runtime/get-locale.js.map +1 -1
- package/dist/compiler/runtime/get-locale.test.js +95 -0
- package/dist/compiler/runtime/get-locale.test.js.map +1 -1
- package/dist/compiler/runtime/localize-href.d.ts +8 -0
- package/dist/compiler/runtime/localize-href.js +60 -0
- package/dist/compiler/runtime/localize-href.js.map +1 -1
- package/dist/compiler/runtime/localize-href.test.js +227 -1
- package/dist/compiler/runtime/localize-href.test.js.map +1 -1
- package/dist/compiler/runtime/set-locale.js +24 -6
- package/dist/compiler/runtime/set-locale.js.map +1 -1
- package/dist/compiler/runtime/set-locale.test.js +182 -0
- package/dist/compiler/runtime/set-locale.test.js.map +1 -1
- package/dist/compiler/runtime/type.d.ts +2 -0
- package/dist/compiler/runtime/type.js.map +1 -1
- package/dist/compiler/runtime/type.test.js +34 -0
- package/dist/compiler/runtime/type.test.js.map +1 -1
- package/dist/compiler/runtime/variables.d.ts +2 -0
- package/dist/compiler/runtime/variables.js +7 -0
- package/dist/compiler/runtime/variables.js.map +1 -1
- package/dist/compiler/server/create-server-file.js +24 -0
- package/dist/compiler/server/create-server-file.js.map +1 -1
- package/dist/compiler/server/create-server-file.test.js +8 -2
- package/dist/compiler/server/create-server-file.test.js.map +1 -1
- package/dist/compiler/server/middleware.d.ts +8 -2
- package/dist/compiler/server/middleware.js +204 -11
- package/dist/compiler/server/middleware.js.map +1 -1
- package/dist/compiler/server/middleware.test.js +750 -3
- package/dist/compiler/server/middleware.test.js.map +1 -1
- package/dist/eslint/index.d.ts +4 -0
- package/dist/eslint/index.js +8 -0
- package/dist/eslint/index.js.map +1 -0
- package/dist/eslint/no-dynamic-message-access.d.ts +3 -0
- package/dist/eslint/no-dynamic-message-access.js +150 -0
- package/dist/eslint/no-dynamic-message-access.js.map +1 -0
- package/dist/eslint/no-dynamic-message-access.test.d.ts +1 -0
- package/dist/eslint/no-dynamic-message-access.test.js +126 -0
- package/dist/eslint/no-dynamic-message-access.test.js.map +1 -0
- package/dist/eslint/oxlint.test.d.ts +1 -0
- package/dist/eslint/oxlint.test.js +64 -0
- package/dist/eslint/oxlint.test.js.map +1 -0
- package/dist/services/config/config-schema.d.ts +2 -0
- package/dist/services/config/config-schema.js +2 -0
- package/dist/services/config/config-schema.js.map +1 -1
- package/dist/services/config/load-paraglide-config.test.js +12 -0
- package/dist/services/config/load-paraglide-config.test.js.map +1 -1
- package/dist/services/env-variables/index.js +1 -1
- package/dist/services/env-variables/index.js.map +1 -1
- package/dist/services/file-handling/write-output.bench.js +51 -11
- package/dist/services/file-handling/write-output.bench.js.map +1 -1
- package/dist/services/file-handling/write-output.js +60 -20
- package/dist/services/file-handling/write-output.js.map +1 -1
- package/dist/services/file-handling/write-output.test.js +175 -0
- package/dist/services/file-handling/write-output.test.js.map +1 -1
- package/package.json +15 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../../src/cli/commands/compile/command.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, InvalidArgumentError } from \"commander\";\nimport fs from \"node:fs\";\nimport { resolve, relative } from \"node:path\";\nimport { Logger } from \"../../../services/logger/index.js\";\nimport {\n\tDEFAULT_OUTDIR,\n\tDEFAULT_PROJECT_PATH,\n} from \"../../../services/config/defaults.js\";\nimport { compile, type CompilationResult } from \"../../../compiler/compile.js\";\nimport { defaultCompilerOptions } from \"../../../compiler/compiler-options.js\";\nimport { seedPreviousCompilationFromOutdir } from \"../../../compiler/seed-previous-compilation.js\";\nimport {\n\tcreateTrackedFs,\n\tgetWatchTargets,\n} from \"../../../services/file-watching/tracked-fs.js\";\nimport * as v from \"valibot\";\nimport {\n\tclearParaglideConfigCache,\n\tisConfigFileName,\n\tloadParaglideConfig,\n\tresolveCompilerOptions,\n\tresolveConfigCandidate,\n\tstrategyNameSchema,\n\ttype LoadedParaglideConfig,\n\ttype ParaglideConfig,\n} from \"../../../services/config/index.js\";\nimport { nodeNormalizePath } from \"../../../utilities/node-normalize-path.js\";\nimport type { CompilerOptions } from \"../../../compiler/compiler-options.js\";\n\ntype OutputStructure = NonNullable<CompilerOptions[\"outputStructure\"]>;\n\nconst errorMessage = (error: unknown): string =>\n\terror instanceof Error ? error.message : String(error);\n\nconst parseOutputStructure = (value: string): OutputStructure => {\n\tif (value === \"message-modules\" || value === \"locale-modules\") {\n\t\treturn value;\n\t}\n\tthrow new InvalidArgumentError(\n\t\t`Invalid output structure \"${value}\". Expected \"message-modules\" or \"locale-modules\".`\n\t);\n};\n\nexport const compileCommand = new Command()\n\t.name(\"compile\")\n\t.summary(\"Compiles inlang Paraglide-JS\")\n\t.option(\n\t\t\"--project <path>\",\n\t\t`The path to the inlang project. Example: \"./project.inlang\". Defaults to \"${DEFAULT_PROJECT_PATH}\".`\n\t)\n\t.option(\n\t\t\"--outdir <path>\",\n\t\t`The path to the output directory. Example: \"./src/paraglide\". Defaults to \"${DEFAULT_OUTDIR}\".`\n\t)\n\t.option(\n\t\t\"--strategy <items...>\",\n\t\t[\n\t\t\t\"The strategy to be used.\",\n\t\t\t\"\",\n\t\t\t\"Example: --strategy cookie globalVariable baseLocale\",\n\t\t\t\"Read more on https://paraglidejs.com/strategy\",\n\t\t].join(\"\\n\")\n\t)\n\t.requiredOption(\"--silent\", \"Only log errors to the console\", false)\n\t.option(\n\t\t\"--emit-ts-declarations\",\n\t\t`Emit .d.ts files for the generated output (requires the typescript package) (default: ${defaultCompilerOptions.emitTsDeclarations})`\n\t)\n\t.option(\n\t\t\"--no-emit-ts-declarations\",\n\t\t\"Do not emit .d.ts files for the generated output\"\n\t)\n\t.option(\n\t\t\"--emit-git-ignore\",\n\t\t`Emit a .gitignore in the output directory (default: ${defaultCompilerOptions.emitGitIgnore})`\n\t)\n\t.option(\n\t\t\"--no-emit-git-ignore\",\n\t\t\"Do not emit a .gitignore in the output directory\"\n\t)\n\t.option(\n\t\t\"--emit-prettier-ignore\",\n\t\t`Emit a .prettierignore in the output directory (default: ${defaultCompilerOptions.emitPrettierIgnore})`\n\t)\n\t.option(\n\t\t\"--no-emit-prettier-ignore\",\n\t\t\"Do not emit a .prettierignore in the output directory\"\n\t)\n\t.option(\n\t\t\"--emit-readme\",\n\t\t`Emit a README.md in the output directory (helps LLMs understand the generated code) (default: ${defaultCompilerOptions.emitReadme})`\n\t)\n\t.option(\"--no-emit-readme\", \"Do not emit README.md in the output directory\")\n\t.option(\n\t\t\"--is-server <expression>\",\n\t\t[\n\t\t\t\"JavaScript expression for runtime `isServer` (enables server/client tree-shaking).\",\n\t\t\t\"Quote if the expression contains spaces, e.g. --is-server 'typeof window === \\\"undefined\\\"'.\",\n\t\t\t\"Vite SSR example: --is-server 'import.meta.env.SSR'\",\n\t\t].join(\" \")\n\t)\n\t.option(\n\t\t\"--clean-outdir\",\n\t\t\"Remove files in the output directory that are not generated by this compile\",\n\t\tdefaultCompilerOptions.cleanOutdir\n\t)\n\t.option(\n\t\t\"--no-clean-outdir\",\n\t\t\"Preserve files in the output directory that are not generated by this compile\"\n\t)\n\t.option(\n\t\t\"--experimental-static-locale <expression>\",\n\t\t[\n\t\t\t\"JavaScript expression for a compile-time locale constant (experimental).\",\n\t\t\t\"For a literal locale, include the JavaScript quotes, e.g. --experimental-static-locale '\\\"de\\\"'.\",\n\t\t].join(\" \")\n\t)\n\t.option(\n\t\t\"--disable-async-local-storage\",\n\t\t\"Use the synchronous request-locale fallback instead of AsyncLocalStorage\",\n\t\tdefaultCompilerOptions.disableAsyncLocalStorage\n\t)\n\t.option(\n\t\t\"--output-structure <structure>\",\n\t\t[\n\t\t\t`The output structure for compiled messages. Either \"message-modules\" or \"locale-modules\" (default: \"${defaultCompilerOptions.outputStructure}\").`,\n\t\t\t\"\",\n\t\t\t'\"message-modules\" gives each message its own module (better tree-shaking).',\n\t\t\t'\"locale-modules\" bundles messages per locale (fewer files, better for large projects in dev).',\n\t\t].join(\"\\n\"),\n\t\tparseOutputStructure\n\t)\n\t.option(\"--watch\", \"Watch project files and recompile on change\", false)\n\t.action(\n\t\tasync (options: {\n\t\t\tsilent: boolean;\n\t\t\tproject?: string;\n\t\t\toutdir?: string;\n\t\t\tstrategy?: string[];\n\t\t\temitTsDeclarations?: boolean;\n\t\t\temitGitIgnore?: boolean;\n\t\t\temitPrettierIgnore?: boolean;\n\t\t\temitReadme?: boolean;\n\t\t\tisServer?: string;\n\t\t\tcleanOutdir?: CompilerOptions[\"cleanOutdir\"];\n\t\t\texperimentalStaticLocale?: CompilerOptions[\"experimentalStaticLocale\"];\n\t\t\tdisableAsyncLocalStorage?: CompilerOptions[\"disableAsyncLocalStorage\"];\n\t\t\toutputStructure?: OutputStructure;\n\t\t\twatch?: boolean;\n\t\t}) => {\n\t\t\tconst logger = new Logger({ silent: options.silent, prefix: true });\n\n\t\t\tconst projectDir = nodeNormalizePath(\n\t\t\t\tresolve(process.cwd(), options.project ?? DEFAULT_PROJECT_PATH)\n\t\t\t);\n\n\t\t\tconst loadConfig = () => loadParaglideConfig({ projectDir, logger });\n\n\t\t\tlet projectOverride = options.project;\n\t\t\tif (projectOverride === undefined) {\n\t\t\t\tprojectOverride = DEFAULT_PROJECT_PATH;\n\t\t\t\tlogger.info(\n\t\t\t\t\t`--project was not provided, using \"${DEFAULT_PROJECT_PATH}\".`\n\t\t\t\t);\n\t\t\t}\n\n\n\t\t\tconst buildCompileOptions = () => {\n\t\t\t\tlet validatedStrategy: ParaglideConfig[\"strategy\"] | undefined;\n\t\t\t\tif (options.strategy !== undefined) {\n\t\t\t\t\tconst parsed = v.safeParse(\n\t\t\t\t\t\tv.array(strategyNameSchema),\n\t\t\t\t\t\toptions.strategy\n\t\t\t\t\t);\n\t\t\t\t\tif (!parsed.success) {\n\t\t\t\t\t\tconst details = parsed.issues\n\t\t\t\t\t\t\t.map((i) => `\"${v.getDotPath(i) ?? \"(root)\"}\": ${i.message}`)\n\t\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\t\tthrow new Error(`Invalid --strategy: ${details}`);\n\t\t\t\t\t}\n\t\t\t\t\tvalidatedStrategy = parsed.output;\n\t\t\t\t}\n\t\t\t\tlet outdirOverride: string | undefined = options.outdir;\n\t\t\t\tif (\n\t\t\t\t\toutdirOverride === undefined &&\n\t\t\t\t\tloadedConfig?.config.outdir === undefined\n\t\t\t\t) {\n\t\t\t\t\toutdirOverride = DEFAULT_OUTDIR;\n\t\t\t\t}\n\t\t\t\treturn resolveCompilerOptions({\n\t\t\t\t\tconfig: loadedConfig?.config,\n\t\t\t\t\toverrides: {\n\t\t\t\t\t\tproject: projectOverride,\n\t\t\t\t\t\toutdir: outdirOverride,\n\t\t\t\t\t\tstrategy: validatedStrategy,\n\t\t\t\t\t\temitTsDeclarations: options.emitTsDeclarations,\n\t\t\t\t\t\temitGitIgnore: options.emitGitIgnore,\n\t\t\t\t\t\temitPrettierIgnore: options.emitPrettierIgnore,\n\t\t\t\t\t\temitReadme: options.emitReadme,\n\t\t\t\t\t\tisServer: options.isServer,\n\t\t\t\t\t\tcleanOutdir: options.cleanOutdir,\n\t\t\t\t\t\texperimentalStaticLocale: options.experimentalStaticLocale,\n\t\t\t\t\t\tdisableAsyncLocalStorage: options.disableAsyncLocalStorage,\n\t\t\t\t\t\t// The CLI always uses message-modules unless told otherwise\n\t\t\t\t\t\t// (plugins apply their own development default).\n\t\t\t\t\t\toutputStructure:\n\t\t\t\t\t\t\toptions.outputStructure ?? defaultCompilerOptions.outputStructure,\n\t\t\t\t\t},\n\t\t\t\t\troot: process.cwd(),\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tlet loadedConfig: LoadedParaglideConfig | undefined;\n\t\t\tlet compileOptions: CompilerOptions;\n\n\t\t\ttry {\n\t\t\t\tloadedConfig = await loadConfig();\n\t\t\t\tcompileOptions = buildCompileOptions();\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(errorMessage(error));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tif (!options.watch) {\n\t\t\t\tlogger.info(`Compiling inlang project ...`);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst previousCompilation = compileOptions.cleanOutdir\n\t\t\t\t\t\t? await seedPreviousCompilationFromOutdir({\n\t\t\t\t\t\t\t\toutdir: compileOptions.outdir,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\tawait compile({\n\t\t\t\t\t\t...compileOptions,\n\t\t\t\t\t\tpreviousCompilation,\n\t\t\t\t\t\tcleanOutdir: false,\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlogger.error(\"Error while compiling inlang project.\");\n\t\t\t\t\tlogger.error(e);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tlogger.success(`Successfully compiled inlang project.`);\n\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tconst { fs: trackedFs, readFiles, clearReadFiles } = createTrackedFs();\n\t\t\tconst fileWatchers = new Map<string, fs.FSWatcher>();\n\t\t\tconst directoryWatchers = new Map<string, fs.FSWatcher>();\n\t\t\tlet previousCompilation: CompilationResult | undefined;\n\t\t\tlet compileTimer: NodeJS.Timeout | undefined;\n\t\t\tlet compileInProgress = false;\n\t\t\tlet compileRequested = false;\n\t\t\t// Set by the project-directory watcher when a config-named file\n\t\t\t// changes — survives debounced coalescing with unrelated events.\n\t\t\tlet configChangedSinceLastBuild = false;\n\n\t\t\t/**\n\t\t\t * Reacts to a config-named event in the project directory:\n\t\t\t * rescans the candidate winner and reloads. A missing config\n\t\t\t * falls back to the built-in defaults; an invalid one fails the\n\t\t\t * reload (caller skips the compilation).\n\t\t\t */\n\t\t\tconst refreshConfig = async (): Promise<boolean> => {\n\t\t\t\tconst winner = await resolveConfigCandidate(projectDir);\n\t\t\t\tif (winner === undefined) {\n\t\t\t\t\tif (loadedConfig !== undefined) {\n\t\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\t\"Paraglide config file was removed, compiling with default options.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tloadedConfig = undefined;\n\t\t\t\t\tcompileOptions = buildCompileOptions();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tclearParaglideConfigCache({ projectDir });\n\t\t\t\t\tconst nextLoadedConfig = await loadConfig();\n\t\t\t\t\tif (nextLoadedConfig === undefined) return true; // raced deletion\n\t\t\t\t\tloadedConfig = nextLoadedConfig;\n\t\t\t\t\tcompileOptions = buildCompileOptions();\n\t\t\t\t\treturn true;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(errorMessage(error));\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\"Skipping compilation because of the invalid paraglide config.\"\n\t\t\t\t\t);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst updateWatchers = (files: Set<string>) => {\n\t\t\t\tconst {\n\t\t\t\t\tfiles: nextFiles,\n\t\t\t\t\tdirectories: nextDirectories,\n\t\t\t\t\tisIgnoredPath,\n\t\t\t\t} = getWatchTargets(files, { outdir: compileOptions.outdir });\n\n\t\t\t\tfor (const [filePath, watcher] of fileWatchers) {\n\t\t\t\t\tif (!nextFiles.has(filePath)) {\n\t\t\t\t\t\twatcher.close();\n\t\t\t\t\t\tfileWatchers.delete(filePath);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// The project directory is always watched: it hosts the config\n\t\t\t\t// file, and its other contents (settings.json, messages/) are\n\t\t\t\t// compile inputs anyway.\n\t\t\t\tnextDirectories.add(projectDir);\n\n\t\t\t\tfor (const [directoryPath, watcher] of directoryWatchers) {\n\t\t\t\t\tif (!nextDirectories.has(directoryPath)) {\n\t\t\t\t\t\twatcher.close();\n\t\t\t\t\t\tdirectoryWatchers.delete(directoryPath);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst attachWatcherErrorHandler = (\n\t\t\t\t\twatcher: fs.FSWatcher,\n\t\t\t\t\ttargetPath: string,\n\t\t\t\t\ttargetType: \"file\" | \"directory\"\n\t\t\t\t) => {\n\t\t\t\t\twatcher.on(\"error\", (error) => {\n\t\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\t`Watch ${targetType} error for ${targetPath}: ${errorMessage(error)}`\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tfor (const filePath of nextFiles) {\n\t\t\t\t\tif (fileWatchers.has(filePath)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst watcher = fs.watch(filePath, () => {\n\t\t\t\t\t\t\tscheduleCompile(filePath);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tattachWatcherErrorHandler(watcher, filePath, \"file\");\n\t\t\t\t\t\tfileWatchers.set(filePath, watcher);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tlogger.warn(`Failed to watch file: ${filePath}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (const directoryPath of nextDirectories) {\n\t\t\t\t\tif (directoryWatchers.has(directoryPath)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst watcher = fs.watch(directoryPath, (eventType, filename) => {\n\t\t\t\t\t\t\tconst isProjectDir = directoryPath === projectDir;\n\n\t\t\t\t\t\t\tif (!filename) {\n\t\t\t\t\t\t\t\tif (isProjectDir) {\n\t\t\t\t\t\t\t\t\tconfigChangedSinceLastBuild = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tscheduleCompile(directoryPath);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst changedPath = resolve(directoryPath, filename.toString());\n\t\t\t\t\t\t\tif (isIgnoredPath(changedPath)) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Config-named events must not be lost to debounce\n\t\t\t\t\t\t\t// coalescing with unrelated files. Ordinary files are\n\t\t\t\t\t\t\t// still scheduled: new inputs can appear directly in\n\t\t\t\t\t\t\t// the project directory (e.g. a locale file matching\n\t\t\t\t\t\t\t// ./messages/{locale}.json patterns rooted there).\n\t\t\t\t\t\t\tif (isProjectDir && isConfigFileName(changedPath)) {\n\t\t\t\t\t\t\t\tconfigChangedSinceLastBuild = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tscheduleCompile(changedPath);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tattachWatcherErrorHandler(watcher, directoryPath, \"directory\");\n\t\t\t\t\t\tdirectoryWatchers.set(directoryPath, watcher);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tlogger.warn(`Failed to watch directory: ${directoryPath}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst runCompile = async (changedPath?: string) => {\n\t\t\t\tif (compileInProgress) {\n\t\t\t\t\tcompileRequested = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcompileInProgress = true;\n\t\t\t\tconst previouslyReadFiles = new Set(readFiles);\n\t\t\t\tclearReadFiles();\n\n\t\t\t\tif (configChangedSinceLastBuild) {\n\t\t\t\t\tconfigChangedSinceLastBuild = false;\n\t\t\t\t\tconst succeeded = await refreshConfig();\n\t\t\t\t\tif (!succeeded) {\n\t\t\t\t\t\t// Invalid config: skip this compilation entirely — the\n\t\t\t\t\t\t// previously compiled output stays on disk untouched.\n\t\t\t\t\t\tcompileInProgress = false;\n\t\t\t\t\t\tupdateWatchers(new Set(readFiles));\n\t\t\t\t\t\tif (compileRequested) {\n\t\t\t\t\t\t\tcompileRequested = false;\n\t\t\t\t\t\t\trunCompile();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (changedPath) {\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t`Re-compiling inlang project... File \"${relative(process.cwd(), changedPath)}\" has changed.`\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.info(\"Compiling inlang project ...\");\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst seededPrevious =\n\t\t\t\t\t\tpreviousCompilation ??\n\t\t\t\t\t\t(compileOptions.cleanOutdir\n\t\t\t\t\t\t\t? await seedPreviousCompilationFromOutdir({\n\t\t\t\t\t\t\t\t\toutdir: compileOptions.outdir,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: undefined);\n\n\t\t\t\t\tpreviousCompilation = await compile({\n\t\t\t\t\t\t...compileOptions,\n\t\t\t\t\t\tfs: trackedFs,\n\t\t\t\t\t\tpreviousCompilation: seededPrevious,\n\t\t\t\t\t\tcleanOutdir: false,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (changedPath) {\n\t\t\t\t\t\tlogger.success(\"Re-compilation complete.\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.success(\"Successfully compiled inlang project.\");\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (previouslyReadFiles.size > 0) {\n\t\t\t\t\t\tclearReadFiles();\n\t\t\t\t\t\tfor (const filePath of previouslyReadFiles) {\n\t\t\t\t\t\t\treadFiles.add(filePath);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpreviousCompilation = undefined;\n\t\t\t\t\tlogger.error(\"Error while compiling inlang project.\");\n\t\t\t\t\tlogger.error(e);\n\t\t\t\t} finally {\n\t\t\t\t\tupdateWatchers(new Set(readFiles));\n\t\t\t\t\tcompileInProgress = false;\n\t\t\t\t\tif (compileRequested) {\n\t\t\t\t\t\tcompileRequested = false;\n\t\t\t\t\t\trunCompile();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst scheduleCompile = (changedPath?: string) => {\n\t\t\t\tif (compileTimer) {\n\t\t\t\t\tclearTimeout(compileTimer);\n\t\t\t\t}\n\t\t\t\tcompileTimer = setTimeout(() => {\n\t\t\t\t\trunCompile(changedPath);\n\t\t\t\t}, 100);\n\t\t\t};\n\n\t\t\tconst closeWatchers = () => {\n\t\t\t\tfor (const watcher of fileWatchers.values()) {\n\t\t\t\t\twatcher.close();\n\t\t\t\t}\n\t\t\t\tfor (const watcher of directoryWatchers.values()) {\n\t\t\t\t\twatcher.close();\n\t\t\t\t}\n\t\t\t\tfileWatchers.clear();\n\t\t\t\tdirectoryWatchers.clear();\n\t\t\t};\n\n\t\t\tprocess.on(\"SIGINT\", () => {\n\t\t\t\tcloseWatchers();\n\t\t\t\tprocess.exit(0);\n\t\t\t});\n\n\t\t\tawait runCompile();\n\t\t\tlogger.info(\"Watching for changes...\");\n\t\t}\n\t);\n"]}
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../../src/cli/commands/compile/command.ts"],"names":[],"mappings":"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","sourcesContent":["import { Command, InvalidArgumentError } from \"commander\";\nimport fs from \"node:fs\";\nimport { resolve, relative } from \"node:path\";\nimport { Logger } from \"../../../services/logger/index.js\";\nimport {\n\tDEFAULT_OUTDIR,\n\tDEFAULT_PROJECT_PATH,\n} from \"../../../services/config/defaults.js\";\nimport { compile, type CompilationResult } from \"../../../compiler/compile.js\";\nimport { defaultCompilerOptions } from \"../../../compiler/compiler-options.js\";\nimport { seedPreviousCompilationFromOutdir } from \"../../../compiler/seed-previous-compilation.js\";\nimport {\n\tcreateTrackedFs,\n\tgetWatchTargets,\n} from \"../../../services/file-watching/tracked-fs.js\";\nimport * as v from \"valibot\";\nimport {\n\tclearParaglideConfigCache,\n\tisConfigFileName,\n\tloadParaglideConfig,\n\tresolveCompilerOptions,\n\tresolveConfigCandidate,\n\tstrategyNameSchema,\n\ttype LoadedParaglideConfig,\n\ttype ParaglideConfig,\n} from \"../../../services/config/index.js\";\nimport { nodeNormalizePath } from \"../../../utilities/node-normalize-path.js\";\nimport type { CompilerOptions } from \"../../../compiler/compiler-options.js\";\n\ntype OutputStructure = NonNullable<CompilerOptions[\"outputStructure\"]>;\n\nconst errorMessage = (error: unknown): string =>\n\terror instanceof Error ? error.message : String(error);\n\nconst parseOutputStructure = (value: string): OutputStructure => {\n\tif (value === \"message-modules\" || value === \"locale-modules\") {\n\t\treturn value;\n\t}\n\tthrow new InvalidArgumentError(\n\t\t`Invalid output structure \"${value}\". Expected \"message-modules\" or \"locale-modules\".`\n\t);\n};\n\nexport const compileCommand = new Command()\n\t.name(\"compile\")\n\t.summary(\"Compiles inlang Paraglide-JS\")\n\t.option(\n\t\t\"--project <path>\",\n\t\t`The path to the inlang project. Example: \"./project.inlang\". Defaults to \"${DEFAULT_PROJECT_PATH}\".`\n\t)\n\t.option(\n\t\t\"--outdir <path>\",\n\t\t`The path to the output directory. Example: \"./src/paraglide\". Defaults to \"${DEFAULT_OUTDIR}\".`\n\t)\n\t.option(\n\t\t\"--strategy <items...>\",\n\t\t[\n\t\t\t\"The strategy to be used.\",\n\t\t\t\"\",\n\t\t\t\"Example: --strategy cookie globalVariable baseLocale\",\n\t\t\t\"Read more on https://paraglidejs.com/strategy\",\n\t\t].join(\"\\n\")\n\t)\n\t.requiredOption(\"--silent\", \"Only log errors to the console\", false)\n\t.option(\n\t\t\"--emit-ts-declarations\",\n\t\t`Emit .d.ts files for the generated output (requires the typescript package) (default: ${defaultCompilerOptions.emitTsDeclarations})`\n\t)\n\t.option(\n\t\t\"--no-emit-ts-declarations\",\n\t\t\"Do not emit .d.ts files for the generated output\"\n\t)\n\t.option(\n\t\t\"--emit-git-ignore\",\n\t\t`Emit a .gitignore in the output directory (default: ${defaultCompilerOptions.emitGitIgnore})`\n\t)\n\t.option(\n\t\t\"--no-emit-git-ignore\",\n\t\t\"Do not emit a .gitignore in the output directory\"\n\t)\n\t.option(\n\t\t\"--emit-prettier-ignore\",\n\t\t`Emit a .prettierignore in the output directory (default: ${defaultCompilerOptions.emitPrettierIgnore})`\n\t)\n\t.option(\n\t\t\"--no-emit-prettier-ignore\",\n\t\t\"Do not emit a .prettierignore in the output directory\"\n\t)\n\t.option(\n\t\t\"--emit-readme\",\n\t\t`Emit a README.md in the output directory (helps LLMs understand the generated code) (default: ${defaultCompilerOptions.emitReadme})`\n\t)\n\t.option(\"--no-emit-readme\", \"Do not emit README.md in the output directory\")\n\t.option(\n\t\t\"--is-server <expression>\",\n\t\t[\n\t\t\t\"JavaScript expression for runtime `isServer` (enables server/client tree-shaking).\",\n\t\t\t\"Quote if the expression contains spaces, e.g. --is-server 'typeof window === \\\"undefined\\\"'.\",\n\t\t\t\"Vite SSR example: --is-server 'import.meta.env.SSR'\",\n\t\t].join(\" \")\n\t)\n\t.option(\n\t\t\"--clean-outdir\",\n\t\t\"Remove files in the output directory that are not generated by this compile\",\n\t\tdefaultCompilerOptions.cleanOutdir\n\t)\n\t.option(\n\t\t\"--no-clean-outdir\",\n\t\t\"Preserve files in the output directory that are not generated by this compile\"\n\t)\n\t.option(\n\t\t\"--experimental-static-locale <expression>\",\n\t\t[\n\t\t\t\"JavaScript expression for a compile-time locale constant (experimental).\",\n\t\t\t\"For a literal locale, include the JavaScript quotes, e.g. --experimental-static-locale '\\\"de\\\"'.\",\n\t\t].join(\" \")\n\t)\n\t.option(\n\t\t\"--disable-async-local-storage\",\n\t\t\"Use the synchronous request-locale fallback instead of AsyncLocalStorage\",\n\t\tdefaultCompilerOptions.disableAsyncLocalStorage\n\t)\n\t.option(\n\t\t\"--output-structure <structure>\",\n\t\t[\n\t\t\t`The output structure for compiled messages. Either \"message-modules\" or \"locale-modules\" (default: \"${defaultCompilerOptions.outputStructure}\").`,\n\t\t\t\"\",\n\t\t\t'\"message-modules\" gives each message its own module (better tree-shaking).',\n\t\t\t'\"locale-modules\" bundles messages per locale (fewer files, better for large projects in dev).',\n\t\t].join(\"\\n\"),\n\t\tparseOutputStructure\n\t)\n\t.option(\"--watch\", \"Watch project files and recompile on change\", false)\n\t.action(\n\t\tasync (options: {\n\t\t\tsilent: boolean;\n\t\t\tproject?: string;\n\t\t\toutdir?: string;\n\t\t\tstrategy?: string[];\n\t\t\temitTsDeclarations?: boolean;\n\t\t\temitGitIgnore?: boolean;\n\t\t\temitPrettierIgnore?: boolean;\n\t\t\temitReadme?: boolean;\n\t\t\tisServer?: string;\n\t\t\tcleanOutdir?: CompilerOptions[\"cleanOutdir\"];\n\t\t\texperimentalStaticLocale?: CompilerOptions[\"experimentalStaticLocale\"];\n\t\t\tdisableAsyncLocalStorage?: CompilerOptions[\"disableAsyncLocalStorage\"];\n\t\t\toutputStructure?: OutputStructure;\n\t\t\twatch?: boolean;\n\t\t}) => {\n\t\t\tconst logger = new Logger({ silent: options.silent, prefix: true });\n\n\t\t\tconst projectDir = nodeNormalizePath(\n\t\t\t\tresolve(process.cwd(), options.project ?? DEFAULT_PROJECT_PATH)\n\t\t\t);\n\n\t\t\tconst loadConfig = () => loadParaglideConfig({ projectDir, logger });\n\n\t\t\tlet projectOverride = options.project;\n\t\t\tif (projectOverride === undefined) {\n\t\t\t\tprojectOverride = DEFAULT_PROJECT_PATH;\n\t\t\t\tlogger.info(\n\t\t\t\t\t`--project was not provided, using \"${DEFAULT_PROJECT_PATH}\".`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst buildCompileOptions = () => {\n\t\t\t\tlet validatedStrategy: ParaglideConfig[\"strategy\"] | undefined;\n\t\t\t\tif (options.strategy !== undefined) {\n\t\t\t\t\tconst parsed = v.safeParse(\n\t\t\t\t\t\tv.array(strategyNameSchema),\n\t\t\t\t\t\toptions.strategy\n\t\t\t\t\t);\n\t\t\t\t\tif (!parsed.success) {\n\t\t\t\t\t\tconst details = parsed.issues\n\t\t\t\t\t\t\t.map((i) => `\"${v.getDotPath(i) ?? \"(root)\"}\": ${i.message}`)\n\t\t\t\t\t\t\t.join(\", \");\n\t\t\t\t\t\tthrow new Error(`Invalid --strategy: ${details}`);\n\t\t\t\t\t}\n\t\t\t\t\tvalidatedStrategy = parsed.output;\n\t\t\t\t}\n\t\t\t\tlet outdirOverride: string | undefined = options.outdir;\n\t\t\t\tif (\n\t\t\t\t\toutdirOverride === undefined &&\n\t\t\t\t\tloadedConfig?.config.outdir === undefined\n\t\t\t\t) {\n\t\t\t\t\toutdirOverride = DEFAULT_OUTDIR;\n\t\t\t\t}\n\t\t\t\treturn resolveCompilerOptions({\n\t\t\t\t\tconfig: loadedConfig?.config,\n\t\t\t\t\toverrides: {\n\t\t\t\t\t\tproject: projectOverride,\n\t\t\t\t\t\toutdir: outdirOverride,\n\t\t\t\t\t\tstrategy: validatedStrategy,\n\t\t\t\t\t\temitTsDeclarations: options.emitTsDeclarations,\n\t\t\t\t\t\temitGitIgnore: options.emitGitIgnore,\n\t\t\t\t\t\temitPrettierIgnore: options.emitPrettierIgnore,\n\t\t\t\t\t\temitReadme: options.emitReadme,\n\t\t\t\t\t\tisServer: options.isServer,\n\t\t\t\t\t\tcleanOutdir: options.cleanOutdir,\n\t\t\t\t\t\texperimentalStaticLocale: options.experimentalStaticLocale,\n\t\t\t\t\t\tdisableAsyncLocalStorage: options.disableAsyncLocalStorage,\n\t\t\t\t\t\t// The CLI always uses message-modules unless told otherwise\n\t\t\t\t\t\t// (plugins apply their own development default).\n\t\t\t\t\t\toutputStructure:\n\t\t\t\t\t\t\toptions.outputStructure ?? defaultCompilerOptions.outputStructure,\n\t\t\t\t\t},\n\t\t\t\t\troot: process.cwd(),\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tlet loadedConfig: LoadedParaglideConfig | undefined;\n\t\t\tlet compileOptions: CompilerOptions;\n\n\t\t\ttry {\n\t\t\t\tloadedConfig = await loadConfig();\n\t\t\t\tcompileOptions = buildCompileOptions();\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(errorMessage(error));\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\n\t\t\tif (!options.watch) {\n\t\t\t\tlogger.info(`Compiling inlang project ...`);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst previousCompilation = compileOptions.cleanOutdir\n\t\t\t\t\t\t? await seedPreviousCompilationFromOutdir({\n\t\t\t\t\t\t\t\toutdir: compileOptions.outdir,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\tawait compile({\n\t\t\t\t\t\t...compileOptions,\n\t\t\t\t\t\tpreviousCompilation,\n\t\t\t\t\t\tcleanOutdir: false,\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlogger.error(\"Error while compiling inlang project.\");\n\t\t\t\t\tlogger.error(e);\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\n\t\t\t\tlogger.success(`Successfully compiled inlang project.`);\n\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tconst { fs: trackedFs, readFiles, clearReadFiles } = createTrackedFs();\n\t\t\tconst fileWatchers = new Map<string, fs.FSWatcher>();\n\t\t\tconst directoryWatchers = new Map<string, fs.FSWatcher>();\n\t\t\tlet previousCompilation: CompilationResult | undefined;\n\t\t\tlet compileTimer: NodeJS.Timeout | undefined;\n\t\t\tlet compileInProgress = false;\n\t\t\tlet compileRequested = false;\n\t\t\tlet watching = true;\n\t\t\t// Set by the project-directory watcher when a config-named file\n\t\t\t// changes — survives debounced coalescing with unrelated events.\n\t\t\tlet configChangedSinceLastBuild = false;\n\n\t\t\t/**\n\t\t\t * Reacts to a config-named event in the project directory:\n\t\t\t * rescans the candidate winner and reloads. A missing config\n\t\t\t * falls back to the built-in defaults; an invalid one fails the\n\t\t\t * reload (caller skips the compilation).\n\t\t\t */\n\t\t\tconst refreshConfig = async (): Promise<boolean> => {\n\t\t\t\tconst winner = await resolveConfigCandidate(projectDir);\n\t\t\t\tif (winner === undefined) {\n\t\t\t\t\tif (loadedConfig !== undefined) {\n\t\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\t\"Paraglide config file was removed, compiling with default options.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tloadedConfig = undefined;\n\t\t\t\t\tcompileOptions = buildCompileOptions();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tclearParaglideConfigCache({ projectDir });\n\t\t\t\t\tconst nextLoadedConfig = await loadConfig();\n\t\t\t\t\tif (nextLoadedConfig === undefined) return true; // raced deletion\n\t\t\t\t\tloadedConfig = nextLoadedConfig;\n\t\t\t\t\tcompileOptions = buildCompileOptions();\n\t\t\t\t\treturn true;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(errorMessage(error));\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\"Skipping compilation because of the invalid paraglide config.\"\n\t\t\t\t\t);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst updateWatchers = (files: Set<string>) => {\n\t\t\t\tif (!watching) return;\n\t\t\t\tconst {\n\t\t\t\t\tfiles: nextFiles,\n\t\t\t\t\tdirectories: nextDirectories,\n\t\t\t\t\tisIgnoredPath,\n\t\t\t\t} = getWatchTargets(files, { outdir: compileOptions.outdir });\n\n\t\t\t\tfor (const [filePath, watcher] of fileWatchers) {\n\t\t\t\t\tif (!nextFiles.has(filePath)) {\n\t\t\t\t\t\twatcher.close();\n\t\t\t\t\t\tfileWatchers.delete(filePath);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// The project directory is always watched: it hosts the config\n\t\t\t\t// file, and its other contents (settings.json, messages/) are\n\t\t\t\t// compile inputs anyway.\n\t\t\t\tnextDirectories.add(projectDir);\n\n\t\t\t\tfor (const [directoryPath, watcher] of directoryWatchers) {\n\t\t\t\t\tif (!nextDirectories.has(directoryPath)) {\n\t\t\t\t\t\twatcher.close();\n\t\t\t\t\t\tdirectoryWatchers.delete(directoryPath);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst attachWatcherErrorHandler = (\n\t\t\t\t\twatcher: fs.FSWatcher,\n\t\t\t\t\ttargetPath: string,\n\t\t\t\t\ttargetType: \"file\" | \"directory\"\n\t\t\t\t) => {\n\t\t\t\t\twatcher.on(\"error\", (error) => {\n\t\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t\t`Watch ${targetType} error for ${targetPath}: ${errorMessage(error)}`\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tfor (const filePath of nextFiles) {\n\t\t\t\t\tif (fileWatchers.has(filePath)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst watcher = fs.watch(filePath, () => {\n\t\t\t\t\t\t\tscheduleCompile(filePath);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tattachWatcherErrorHandler(watcher, filePath, \"file\");\n\t\t\t\t\t\tfileWatchers.set(filePath, watcher);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tlogger.warn(`Failed to watch file: ${filePath}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (const directoryPath of nextDirectories) {\n\t\t\t\t\tif (directoryWatchers.has(directoryPath)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst watcher = fs.watch(directoryPath, (eventType, filename) => {\n\t\t\t\t\t\t\tconst isProjectDir = directoryPath === projectDir;\n\n\t\t\t\t\t\t\tif (!filename) {\n\t\t\t\t\t\t\t\tif (isProjectDir) {\n\t\t\t\t\t\t\t\t\tconfigChangedSinceLastBuild = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tscheduleCompile(directoryPath);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst changedPath = resolve(directoryPath, filename.toString());\n\t\t\t\t\t\t\tif (isIgnoredPath(changedPath)) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Config-named events must not be lost to debounce\n\t\t\t\t\t\t\t// coalescing with unrelated files. Ordinary files are\n\t\t\t\t\t\t\t// still scheduled: new inputs can appear directly in\n\t\t\t\t\t\t\t// the project directory (e.g. a locale file matching\n\t\t\t\t\t\t\t// ./messages/{locale}.json patterns rooted there).\n\t\t\t\t\t\t\tif (isProjectDir && isConfigFileName(changedPath)) {\n\t\t\t\t\t\t\t\tconfigChangedSinceLastBuild = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tscheduleCompile(changedPath);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tattachWatcherErrorHandler(watcher, directoryPath, \"directory\");\n\t\t\t\t\t\tdirectoryWatchers.set(directoryPath, watcher);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tlogger.warn(`Failed to watch directory: ${directoryPath}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst runCompile = async (changedPath?: string) => {\n\t\t\t\tif (!watching) return;\n\t\t\t\tif (compileInProgress) {\n\t\t\t\t\tcompileRequested = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcompileInProgress = true;\n\t\t\t\tconst previouslyReadFiles = new Set(readFiles);\n\t\t\t\tclearReadFiles();\n\n\t\t\t\tif (configChangedSinceLastBuild) {\n\t\t\t\t\tconfigChangedSinceLastBuild = false;\n\t\t\t\t\tconst succeeded = await refreshConfig();\n\t\t\t\t\tif (!succeeded) {\n\t\t\t\t\t\t// Invalid config: skip this compilation entirely — the\n\t\t\t\t\t\t// previously compiled output stays on disk untouched.\n\t\t\t\t\t\tcompileInProgress = false;\n\t\t\t\t\t\tupdateWatchers(new Set(readFiles));\n\t\t\t\t\t\tif (compileRequested) {\n\t\t\t\t\t\t\tcompileRequested = false;\n\t\t\t\t\t\t\trunCompile();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (changedPath) {\n\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t`Re-compiling inlang project... File \"${relative(process.cwd(), changedPath)}\" has changed.`\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.info(\"Compiling inlang project ...\");\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst seededPrevious =\n\t\t\t\t\t\tpreviousCompilation ??\n\t\t\t\t\t\t(compileOptions.cleanOutdir\n\t\t\t\t\t\t\t? await seedPreviousCompilationFromOutdir({\n\t\t\t\t\t\t\t\t\toutdir: compileOptions.outdir,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: undefined);\n\n\t\t\t\t\tpreviousCompilation = await compile({\n\t\t\t\t\t\t...compileOptions,\n\t\t\t\t\t\tfs: trackedFs,\n\t\t\t\t\t\tpreviousCompilation: seededPrevious,\n\t\t\t\t\t\tcleanOutdir: false,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (changedPath) {\n\t\t\t\t\t\tlogger.success(\"Re-compilation complete.\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.success(\"Successfully compiled inlang project.\");\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (previouslyReadFiles.size > 0) {\n\t\t\t\t\t\tclearReadFiles();\n\t\t\t\t\t\tfor (const filePath of previouslyReadFiles) {\n\t\t\t\t\t\t\treadFiles.add(filePath);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpreviousCompilation = undefined;\n\t\t\t\t\tlogger.error(\"Error while compiling inlang project.\");\n\t\t\t\t\tlogger.error(e);\n\t\t\t\t} finally {\n\t\t\t\t\tupdateWatchers(new Set(readFiles));\n\t\t\t\t\tcompileInProgress = false;\n\t\t\t\t\tif (compileRequested) {\n\t\t\t\t\t\tcompileRequested = false;\n\t\t\t\t\t\trunCompile();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst scheduleCompile = (changedPath?: string) => {\n\t\t\t\tif (!watching) return;\n\t\t\t\tif (compileTimer) {\n\t\t\t\t\tclearTimeout(compileTimer);\n\t\t\t\t}\n\t\t\t\tcompileTimer = setTimeout(() => {\n\t\t\t\t\trunCompile(changedPath);\n\t\t\t\t}, 100);\n\t\t\t};\n\n\t\t\tconst closeWatchers = () => {\n\t\t\t\twatching = false;\n\t\t\t\tcompileRequested = false;\n\t\t\t\tif (compileTimer) {\n\t\t\t\t\tclearTimeout(compileTimer);\n\t\t\t\t\tcompileTimer = undefined;\n\t\t\t\t}\n\t\t\t\tfor (const watcher of fileWatchers.values()) {\n\t\t\t\t\twatcher.close();\n\t\t\t\t}\n\t\t\t\tfor (const watcher of directoryWatchers.values()) {\n\t\t\t\t\twatcher.close();\n\t\t\t\t}\n\t\t\t\tfileWatchers.clear();\n\t\t\t\tdirectoryWatchers.clear();\n\t\t\t};\n\n\t\t\tprocess.on(\"SIGINT\", () => {\n\t\t\t\tcloseWatchers();\n\t\t\t\tprocess.exit(0);\n\t\t\t});\n\n\t\t\tawait runCompile();\n\t\t\tlogger.info(\"Watching for changes...\");\n\t\t}\n\t);\n"]}
|
|
@@ -1,23 +1,71 @@
|
|
|
1
1
|
import { mkdtemp, rm, writeFile, mkdir } from "node:fs/promises";
|
|
2
2
|
import * as nodeFs from "node:fs/promises";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { EventEmitter } from "node:events";
|
|
3
5
|
import { tmpdir } from "node:os";
|
|
4
6
|
import consola from "consola";
|
|
5
7
|
import path, { resolve } from "node:path";
|
|
6
8
|
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
7
9
|
let testDirectories = [];
|
|
8
10
|
let initialSigintListeners = [];
|
|
11
|
+
let watchers = new Map();
|
|
12
|
+
// Test CLI event handling with real config files and controlled watch delivery.
|
|
13
|
+
// fs.watch does not guarantee event timing, filenames, or one event per write.
|
|
14
|
+
class TestWatcher extends EventEmitter {
|
|
15
|
+
onClose;
|
|
16
|
+
constructor(onClose) {
|
|
17
|
+
super();
|
|
18
|
+
this.onClose = onClose;
|
|
19
|
+
}
|
|
20
|
+
close() {
|
|
21
|
+
this.onClose();
|
|
22
|
+
this.removeAllListeners();
|
|
23
|
+
}
|
|
24
|
+
ref() {
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
unref() {
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function notifyChange(directory, filename, event = "change") {
|
|
32
|
+
const current = watchers.get(path.resolve(directory));
|
|
33
|
+
expect(current?.size).toBeGreaterThan(0);
|
|
34
|
+
for (const watcher of current ?? [])
|
|
35
|
+
watcher.emit("change", event, filename);
|
|
36
|
+
}
|
|
9
37
|
beforeEach(() => {
|
|
10
38
|
vi.resetModules();
|
|
11
39
|
testDirectories = [];
|
|
12
40
|
initialSigintListeners = process.listeners("SIGINT");
|
|
41
|
+
watchers = new Map();
|
|
42
|
+
vi.spyOn(fs, "watch").mockImplementation((filename, options, listener) => {
|
|
43
|
+
const target = path.resolve(String(filename));
|
|
44
|
+
const current = watchers.get(target) ?? new Set();
|
|
45
|
+
watchers.set(target, current);
|
|
46
|
+
const watcher = new TestWatcher(() => current.delete(watcher));
|
|
47
|
+
const callback = typeof options === "function" ? options : listener;
|
|
48
|
+
if (callback)
|
|
49
|
+
watcher.on("change", callback);
|
|
50
|
+
current.add(watcher);
|
|
51
|
+
return watcher;
|
|
52
|
+
});
|
|
13
53
|
});
|
|
14
54
|
afterEach(async () => {
|
|
15
|
-
|
|
55
|
+
// Stop each CLI instance before deleting fixtures or restoring its mocks.
|
|
56
|
+
vi.spyOn(process, "exit").mockImplementation(() => undefined);
|
|
16
57
|
for (const listener of process.listeners("SIGINT")) {
|
|
17
58
|
if (!initialSigintListeners.includes(listener)) {
|
|
59
|
+
listener("SIGINT");
|
|
18
60
|
process.removeListener("SIGINT", listener);
|
|
19
61
|
}
|
|
20
62
|
}
|
|
63
|
+
for (const current of watchers.values()) {
|
|
64
|
+
for (const watcher of current)
|
|
65
|
+
watcher.close();
|
|
66
|
+
}
|
|
67
|
+
vi.useRealTimers();
|
|
68
|
+
vi.restoreAllMocks();
|
|
21
69
|
for (const directory of testDirectories) {
|
|
22
70
|
await rm(directory, { recursive: true, force: true });
|
|
23
71
|
}
|
|
@@ -279,6 +327,7 @@ describe("config file integration", () => {
|
|
|
279
327
|
expect(compileMock).toHaveBeenCalledTimes(1);
|
|
280
328
|
expect(compileMock.mock.calls[0][0].outdir).toBe(outdir);
|
|
281
329
|
await rm(configPath);
|
|
330
|
+
notifyChange(projectDir, "paraglide.config.ts", "rename");
|
|
282
331
|
const deadline = Date.now() + 10_000;
|
|
283
332
|
while (compileMock.mock.calls.length < 2 && Date.now() < deadline) {
|
|
284
333
|
await new Promise((r) => setTimeout(r, 50));
|
|
@@ -291,6 +340,7 @@ describe("config file integration", () => {
|
|
|
291
340
|
}
|
|
292
341
|
// Recreating the config with a different outdir is picked up again.
|
|
293
342
|
await writeConfig(projectDir, path.join(workspace, "recreated"));
|
|
343
|
+
notifyChange(projectDir, "paraglide.config.ts", "rename");
|
|
294
344
|
const recreateDeadline = Date.now() + 10_000;
|
|
295
345
|
while (Date.now() < recreateDeadline &&
|
|
296
346
|
!compileMock.mock.calls.some((c) => String(c[0].outdir).endsWith("recreated"))) {
|
|
@@ -313,6 +363,7 @@ describe("config file integration", () => {
|
|
|
313
363
|
await compileCommand.parseAsync(["--project", projectDir, "--watch", "--silent"], { from: "user" });
|
|
314
364
|
expect(compileMock).toHaveBeenCalledTimes(1);
|
|
315
365
|
await writeFile(path.join(projectDir, "es.json"), "{}");
|
|
366
|
+
notifyChange(projectDir, "es.json", "rename");
|
|
316
367
|
const deadline = Date.now() + 10_000;
|
|
317
368
|
while (compileMock.mock.calls.length < 2 && Date.now() < deadline) {
|
|
318
369
|
await new Promise((r) => setTimeout(r, 50));
|
|
@@ -336,6 +387,8 @@ describe("config file integration", () => {
|
|
|
336
387
|
// Format switch: delete .ts, add .js.
|
|
337
388
|
await rm(tsPath);
|
|
338
389
|
await writeFile(jsPath, ["export default {", ` outdir: ${JSON.stringify(outdirB)},`, "}"].join("\n"));
|
|
390
|
+
notifyChange(projectDir, "paraglide.config.ts", "rename");
|
|
391
|
+
notifyChange(projectDir, "paraglide.config.js", "rename");
|
|
339
392
|
const deadline = Date.now() + 10_000;
|
|
340
393
|
while (Date.now() < deadline &&
|
|
341
394
|
!compileMock.mock.calls.some((c) => c[0].outdir === outdirB)) {
|
|
@@ -369,17 +422,48 @@ describe("config file integration", () => {
|
|
|
369
422
|
expect(compileModule.compile).toHaveBeenCalledTimes(1);
|
|
370
423
|
expect(loadCount).toBe(1);
|
|
371
424
|
await writeFile(path.join(projectDir, "README.md"), "hello");
|
|
372
|
-
|
|
425
|
+
notifyChange(projectDir, "README.md");
|
|
426
|
+
await vi.waitFor(() => expect(compileModule.compile).toHaveBeenCalledTimes(2));
|
|
373
427
|
await writeFile(path.join(projectDir, "notes.txt"), "world");
|
|
374
|
-
|
|
428
|
+
notifyChange(projectDir, "notes.txt");
|
|
429
|
+
await vi.waitFor(() => expect(compileModule.compile).toHaveBeenCalledTimes(3));
|
|
375
430
|
expect(compileModule.compile.mock.calls.length).toBeGreaterThanOrEqual(3);
|
|
376
431
|
expect(loadCount).toBe(1);
|
|
432
|
+
// A missing filename is ambiguous and must conservatively refresh config.
|
|
433
|
+
notifyChange(projectDir, null);
|
|
434
|
+
await vi.waitFor(() => expect(compileModule.compile).toHaveBeenCalledTimes(4));
|
|
435
|
+
expect(loadCount).toBe(2);
|
|
377
436
|
}
|
|
378
437
|
finally {
|
|
379
438
|
vi.doUnmock("../../../services/config/index.js");
|
|
380
439
|
}
|
|
381
440
|
});
|
|
382
441
|
});
|
|
442
|
+
test("watch shutdown cancels queued rebuilds and ignores late events", async () => {
|
|
443
|
+
const { workspace, projectDir } = await createWorkspace();
|
|
444
|
+
await writeConfig(projectDir, path.join(workspace, "output"));
|
|
445
|
+
const compileMock = vi.fn().mockResolvedValue({ outputHashes: {} });
|
|
446
|
+
vi.doMock("../../../compiler/compile.js", () => ({ compile: compileMock }));
|
|
447
|
+
const { compileCommand } = await import("./command.js");
|
|
448
|
+
await compileCommand.parseAsync(["--project", projectDir, "--watch", "--silent", "--no-clean-outdir"], { from: "user" });
|
|
449
|
+
const watcher = [...watchers.get(path.resolve(projectDir))][0];
|
|
450
|
+
const lateEvent = watcher.listeners("change")[0];
|
|
451
|
+
vi.useFakeTimers();
|
|
452
|
+
notifyChange(projectDir, "notes.txt");
|
|
453
|
+
const exit = vi
|
|
454
|
+
.spyOn(process, "exit")
|
|
455
|
+
.mockImplementation(() => undefined);
|
|
456
|
+
const stop = process
|
|
457
|
+
.listeners("SIGINT")
|
|
458
|
+
.find((listener) => !initialSigintListeners.includes(listener));
|
|
459
|
+
expect(stop).toBeDefined();
|
|
460
|
+
stop("SIGINT");
|
|
461
|
+
lateEvent("change", "notes.txt");
|
|
462
|
+
await vi.advanceTimersByTimeAsync(500);
|
|
463
|
+
expect(exit).toHaveBeenCalledWith(0);
|
|
464
|
+
expect(compileMock).toHaveBeenCalledTimes(1);
|
|
465
|
+
expect([...watchers.values()].every((current) => current.size === 0)).toBe(true);
|
|
466
|
+
});
|
|
383
467
|
test("compile --watch forwards the newly exposed compiler options (#757)", async () => {
|
|
384
468
|
const testDirectory = await mkdtemp(path.join(tmpdir(), "paraglide-cli-"));
|
|
385
469
|
testDirectories.push(testDirectory);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/compile/command.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdtemp, rm, writeFile, mkdir } from \"node:fs/promises\";\nimport * as nodeFs from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport consola from \"consola\";\nimport path, { resolve } from \"node:path\";\nimport { afterEach, beforeEach, describe, expect, test, vi } from \"vitest\";\n\nlet testDirectories: string[] = [];\nlet initialSigintListeners: NodeJS.SignalsListener[] = [];\n\nbeforeEach(() => {\n\tvi.resetModules();\n\ttestDirectories = [];\n\tinitialSigintListeners = process.listeners(\"SIGINT\");\n});\n\nafterEach(async () => {\n\tvi.restoreAllMocks();\n\tfor (const listener of process.listeners(\"SIGINT\")) {\n\t\tif (!initialSigintListeners.includes(listener)) {\n\t\t\tprocess.removeListener(\"SIGINT\", listener);\n\t\t}\n\t}\n\tfor (const directory of testDirectories) {\n\t\tawait rm(directory, { recursive: true, force: true });\n\t}\n});\n\n/**\n * Creates `<dir>/project.inlang/paraglide.config.ts` with the given\n * outdir — the layout of the new config-in-project model.\n */\nasync function writeConfig(\n\tprojectDir: string,\n\toutdir: string,\n\tfileName = \"paraglide.config.ts\"\n) {\n\tawait mkdir(projectDir, { recursive: true });\n\tawait writeFile(\n\t\tpath.join(projectDir, fileName),\n\t\t[\"export default {\", ` outdir: ${JSON.stringify(outdir)},`, \"}\"].join(\"\\n\")\n\t);\n}\n\nasync function createWorkspace() {\n\tconst workspace = await mkdtemp(path.join(tmpdir(), \"paraglide-cli-\"));\n\ttestDirectories.push(workspace);\n\tconst projectDir = path.join(workspace, \"project.inlang\");\n\treturn { workspace, projectDir };\n}\n\ntest(\"compile seeds existing outdir and disables cleaning (#743)\", async () => {\n\tconst { workspace } = await createWorkspace();\n\tconst outdir = path.join(workspace, \"output\");\n\tconst { writeOutput } =\n\t\tawait import(\"../../../services/file-handling/write-output.js\");\n\tawait writeOutput({\n\t\tdirectory: outdir,\n\t\toutput: {\n\t\t\t\"runtime.js\": \"export const runtime = true;\",\n\t\t},\n\t\tfs: nodeFs,\n\t});\n\n\tconst compileMock = vi.fn().mockResolvedValue({\n\t\toutputHashes: {\n\t\t\t\"runtime.js\": \"next-hash\",\n\t\t},\n\t});\n\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\tcompile: compileMock,\n\t}));\n\tconst exitError = new Error(\"process.exit\");\n\tconst exitMock = vi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\tthrow exitError;\n\t});\n\n\tconst { compileCommand } = await import(\"./command.js\");\n\n\tawait expect(\n\t\tcompileCommand.parseAsync(\n\t\t\t[\n\t\t\t\t\"--project\",\n\t\t\t\tpath.join(workspace, \"project.inlang\"),\n\t\t\t\t\"--outdir\",\n\t\t\t\toutdir,\n\t\t\t\t\"--silent\",\n\t\t\t],\n\t\t\t{ from: \"user\" }\n\t\t)\n\t).rejects.toBe(exitError);\n\n\texpect(compileMock).toHaveBeenCalledTimes(1);\n\texpect(compileMock).toHaveBeenCalledWith(\n\t\texpect.objectContaining({\n\t\t\toutdir,\n\t\t\tcleanOutdir: false,\n\t\t\tpreviousCompilation: {\n\t\t\t\toutputHashes: {\n\t\t\t\t\t\"runtime.js\": expect.any(String),\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t);\n\texpect(exitMock).toHaveBeenCalledWith(0);\n});\n\ntest(\"compile exposes and forwards compiler options missing from the CLI (#757)\", async () => {\n\tconst testDirectory = await mkdtemp(path.join(tmpdir(), \"paraglide-cli-\"));\n\ttestDirectories.push(testDirectory);\n\tconst outdir = path.join(testDirectory, \"output\");\n\tawait nodeFs.mkdir(outdir, { recursive: true });\n\tawait nodeFs.writeFile(path.join(outdir, \"custom.txt\"), \"keep me\");\n\n\tconst compileMock = vi.fn().mockResolvedValue({ outputHashes: {} });\n\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\tcompile: compileMock,\n\t}));\n\tconst exitError = new Error(\"process.exit\");\n\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\tthrow exitError;\n\t});\n\n\tconst { compileCommand } = await import(\"./command.js\");\n\tconst help = compileCommand.helpInformation();\n\n\texpect(help).toContain(\"--clean-outdir\");\n\texpect(help).toContain(\"--no-clean-outdir\");\n\texpect(help).toContain(\"--experimental-static-locale <expression>\");\n\texpect(help).toContain(\"--disable-async-local-storage\");\n\n\tawait expect(\n\t\tcompileCommand.parseAsync(\n\t\t\t[\n\t\t\t\t\"--project\",\n\t\t\t\tpath.join(testDirectory, \"project.inlang\"),\n\t\t\t\t\"--outdir\",\n\t\t\t\toutdir,\n\t\t\t\t\"--no-clean-outdir\",\n\t\t\t\t\"--experimental-static-locale\",\n\t\t\t\t'import.meta.env.PARAGLIDE_LOCALE ?? \"en\"',\n\t\t\t\t\"--disable-async-local-storage\",\n\t\t\t\t\"--silent\",\n\t\t\t],\n\t\t\t{ from: \"user\" }\n\t\t)\n\t).rejects.toBe(exitError);\n\n\texpect(compileMock).toHaveBeenCalledTimes(1);\n\texpect(compileMock).toHaveBeenCalledWith(\n\t\texpect.objectContaining({\n\t\t\tcleanOutdir: false,\n\t\t\tdisableAsyncLocalStorage: true,\n\t\t\texperimentalStaticLocale: 'import.meta.env.PARAGLIDE_LOCALE ?? \"en\"',\n\t\t\tpreviousCompilation: undefined,\n\t\t})\n\t);\n});\n\ntest(\"compile --watch seeds existing outdir and disables cleaning on first compile (#688)\", async () => {\n\tconst testDirectory = await mkdtemp(path.join(tmpdir(), \"paraglide-cli-\"));\n\ttestDirectories.push(testDirectory);\n\tconst outdir = path.join(testDirectory, \"output\");\n\tconst { writeOutput } = await import(\n\t\t\"../../../services/file-handling/write-output.js\"\n\t);\n\tawait writeOutput({\n\t\tdirectory: outdir,\n\t\toutput: {\n\t\t\t\"runtime.js\": \"export const runtime = true;\",\n\t\t},\n\t\tfs: nodeFs,\n\t});\n\n\tconst compileMock = vi.fn().mockResolvedValue({\n\t\toutputHashes: {\n\t\t\t\"runtime.js\": \"next-hash\",\n\t\t},\n\t});\n\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\tcompile: compileMock,\n\t}));\n\n\tconst { compileCommand } = await import(\"./command.js\");\n\n\tawait compileCommand.parseAsync(\n\t\t[\n\t\t\t\"--project\",\n\t\t\tpath.join(testDirectory, \"project.inlang\"),\n\t\t\t\"--outdir\",\n\t\t\toutdir,\n\t\t\t\"--watch\",\n\t\t\t\"--silent\",\n\t\t],\n\t\t{ from: \"user\" }\n\t);\n\n\texpect(compileMock).toHaveBeenCalledTimes(1);\n\texpect(compileMock).toHaveBeenCalledWith(\n\t\texpect.objectContaining({\n\t\t\toutdir,\n\t\t\tcleanOutdir: false,\n\t\t\tpreviousCompilation: {\n\t\t\t\toutputHashes: {\n\t\t\t\t\t\"runtime.js\": expect.any(String),\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t);\n});\n\ndescribe(\"config file integration\", () => {\n\ttest(\"compile reads options from a config file inside --project\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst outdir = path.join(workspace, \"from-config\");\n\t\tawait writeConfig(projectDir, outdir);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\t\tconst exitError = new Error(\"process.exit\");\n\t\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\t\tthrow exitError;\n\t\t});\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait expect(\n\t\t\tcompileCommand.parseAsync([\"--project\", projectDir, \"--silent\"], {\n\t\t\t\tfrom: \"user\",\n\t\t\t})\n\t\t).rejects.toBe(exitError);\n\n\t\texpect(compileMock).toHaveBeenCalledWith(\n\t\t\texpect.objectContaining({\n\t\t\t\tproject: projectDir,\n\t\t\t\toutdir,\n\t\t\t\tstrategy: [\"cookie\", \"globalVariable\", \"baseLocale\"],\n\t\t\t\temitReadme: true,\n\t\t\t})\n\t\t);\n\t});\n\n\ttest(\"discovers the conventional ./project.inlang without flags\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst outdir = path.join(workspace, \"from-config\");\n\t\tawait writeConfig(projectDir, outdir);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\t\tconst exitError = new Error(\"process.exit\");\n\t\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\t\tthrow exitError;\n\t\t});\n\t\tconst cwdMock = vi.spyOn(process, \"cwd\").mockReturnValue(workspace);\n\n\t\ttry {\n\t\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\t\tawait expect(\n\t\t\t\tcompileCommand.parseAsync([\"--silent\"], { from: \"user\" })\n\t\t\t).rejects.toBe(exitError);\n\n\t\t\texpect(compileMock).toHaveBeenCalledWith(\n\t\t\t\texpect.objectContaining({\n\t\t\t\t\tproject: projectDir,\n\t\t\t\t\toutdir,\n\t\t\t\t})\n\t\t\t);\n\t\t} finally {\n\t\t\tcwdMock.mockRestore();\n\t\t}\n\t});\n\n\ttest(\"announces the conventional project default when --project is omitted\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst outdir = path.join(workspace, \"from-config\");\n\t\tawait writeConfig(projectDir, outdir);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\t\tconst exitError = new Error(\"process.exit\");\n\t\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\t\tthrow exitError;\n\t\t});\n\t\tconst infoSpy = vi.spyOn(consola, \"info\").mockImplementation(() => {});\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\t\tconst cwdMock = vi.spyOn(process, \"cwd\").mockReturnValue(workspace);\n\n\t\ttry {\n\t\t\tawait expect(\n\t\t\t\tcompileCommand.parseAsync(\n\t\t\t\t\t[\"--outdir\", outdir], // no --project, no --silent\n\t\t\t\t\t{ from: \"user\" }\n\t\t\t\t)\n\t\t\t).rejects.toBe(exitError);\n\n\t\t\texpect(compileMock).toHaveBeenCalledWith(\n\t\t\t\texpect.objectContaining({\n\t\t\t\t\tproject: projectDir,\n\t\t\t\t\toutdir,\n\t\t\t\t})\n\t\t\t);\n\t\t\texpect(\n\t\t\t\tinfoSpy.mock.calls.some((call) =>\n\t\t\t\t\tString(call[0]).includes(\"--project was not provided\")\n\t\t\t\t)\n\t\t\t).toBe(true);\n\t\t} finally {\n\t\t\tcwdMock.mockRestore();\n\t\t}\n\t});\n\n\ttest(\"command line flags override config file values\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tawait writeConfig(projectDir, path.join(workspace, \"from-config\"));\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\t\tconst exitError = new Error(\"process.exit\");\n\t\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\t\tthrow exitError;\n\t\t});\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait expect(\n\t\t\tcompileCommand.parseAsync(\n\t\t\t\t[\n\t\t\t\t\t\"--project\",\n\t\t\t\t\tprojectDir,\n\t\t\t\t\t\"--outdir\",\n\t\t\t\t\t\"./from-flag\",\n\t\t\t\t\t\"--strategy\",\n\t\t\t\t\t\"cookie\",\n\t\t\t\t\t\"baseLocale\",\n\t\t\t\t\t\"--silent\",\n\t\t\t\t],\n\t\t\t\t{ from: \"user\" }\n\t\t\t)\n\t\t).rejects.toBe(exitError);\n\n\t\texpect(compileMock).toHaveBeenCalledWith(\n\t\t\texpect.objectContaining({\n\t\t\t\tproject: projectDir,\n\t\t\t\toutdir: resolve(process.cwd(), \"./from-flag\"),\n\t\t\t\tstrategy: [\"cookie\", \"baseLocale\"],\n\t\t\t})\n\t\t);\n\t});\n\n\t// Deleting the config file mid-watch falls back to the built-in\n\t// defaults (same as never having a config); recreating it is picked up.\n\ttest(\"watch falls back to defaults when the config is deleted\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst configPath = path.join(projectDir, \"paraglide.config.ts\");\n\t\tconst outdir = path.join(workspace, \"from-config\");\n\t\tawait writeConfig(projectDir, outdir);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait compileCommand.parseAsync(\n\t\t\t[\"--project\", projectDir, \"--watch\", \"--silent\"],\n\t\t\t{ from: \"user\" }\n\t\t);\n\t\texpect(compileMock).toHaveBeenCalledTimes(1);\n\t\texpect(compileMock.mock.calls[0]![0].outdir).toBe(outdir);\n\n\t\tawait rm(configPath);\n\n\t\tconst deadline = Date.now() + 10_000;\n\t\twhile (compileMock.mock.calls.length < 2 && Date.now() < deadline) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\n\t\texpect(compileMock.mock.calls.length).toBeGreaterThanOrEqual(2);\n\t\tfor (const call of compileMock.mock.calls.slice(1)) {\n\t\t\t// Default outdir, resolved against the working directory.\n\t\t\texpect(\n\t\t\t\tString(call[0].outdir).endsWith(path.join(\"src\", \"paraglide\"))\n\t\t\t).toBe(true);\n\t\t\texpect(call[0].project).toBe(projectDir);\n\t\t}\n\n\t\t// Recreating the config with a different outdir is picked up again.\n\t\tawait writeConfig(projectDir, path.join(workspace, \"recreated\"));\n\t\tconst recreateDeadline = Date.now() + 10_000;\n\t\twhile (\n\t\t\tDate.now() < recreateDeadline &&\n\t\t\t!compileMock.mock.calls.some((c) =>\n\t\t\t\tString(c[0].outdir).endsWith(\"recreated\")\n\t\t\t)\n\t\t) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\t\texpect(\n\t\t\tcompileMock.mock.calls.some((c) =>\n\t\t\t\tString(c[0].outdir).endsWith(\"recreated\")\n\t\t\t)\n\t\t).toBe(true);\n\t});\n\n\t// Renaming the config between formats switches to the new winner.\n\t// A NEW non-config file appearing directly in the project directory (e.g.\n\t// a locale JSON for a freshly added locale) must schedule a rebuild even\n\t// though no per-file watcher exists for it yet.\n\ttest(\"watch recompiles when a new input appears in the project directory\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tawait writeConfig(projectDir, path.join(workspace, \"from-config\"));\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait compileCommand.parseAsync(\n\t\t\t[\"--project\", projectDir, \"--watch\", \"--silent\"],\n\t\t\t{ from: \"user\" }\n\t\t);\n\t\texpect(compileMock).toHaveBeenCalledTimes(1);\n\n\t\tawait writeFile(path.join(projectDir, \"es.json\"), \"{}\");\n\n\t\tconst deadline = Date.now() + 10_000;\n\t\twhile (compileMock.mock.calls.length < 2 && Date.now() < deadline) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\t\texpect(compileMock.mock.calls.length).toBeGreaterThanOrEqual(2);\n\t});\n\n\ttest(\"watch follows config renames between formats\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst tsPath = path.join(projectDir, \"paraglide.config.ts\");\n\t\tconst jsPath = path.join(projectDir, \"paraglide.config.js\");\n\t\tconst outdirA = path.join(workspace, \"out-ts\");\n\t\tconst outdirB = path.join(workspace, \"out-js\");\n\t\tawait writeConfig(projectDir, outdirA);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait compileCommand.parseAsync(\n\t\t\t[\"--project\", projectDir, \"--watch\", \"--silent\"],\n\t\t\t{ from: \"user\" }\n\t\t);\n\t\texpect(compileMock.mock.calls[0]![0].outdir).toBe(outdirA);\n\n\t\t// Format switch: delete .ts, add .js.\n\t\tawait rm(tsPath);\n\t\tawait writeFile(\n\t\t\tjsPath,\n\t\t\t[\"export default {\", ` outdir: ${JSON.stringify(outdirB)},`, \"}\"].join(\n\t\t\t\t\"\\n\"\n\t\t\t)\n\t\t);\n\n\t\tconst deadline = Date.now() + 10_000;\n\t\twhile (\n\t\t\tDate.now() < deadline &&\n\t\t\t!compileMock.mock.calls.some((c) => c[0].outdir === outdirB)\n\t\t) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\t\texpect(compileMock.mock.calls.some((c) => c[0].outdir === outdirB)).toBe(\n\t\t\ttrue\n\t\t);\n\t});\n\n\t// Non-config changes inside the project directory DO rebuild (new\n\t// inputs can appear there) but must NOT reload the config.\n\ttest(\"watch recompiles without reloading config for non-config changes\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tawait writeConfig(projectDir, path.join(workspace, \"from-config\"));\n\n\t\tlet loadCount = 0;\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: vi.fn().mockResolvedValue({}),\n\t\t}));\n\t\tvi.doMock(\"../../../services/config/index.js\", async (importActual) => {\n\t\t\tconst actual =\n\t\t\t\tawait importActual<\n\t\t\t\t\ttypeof import(\"../../../services/config/index.js\")\n\t\t\t\t>();\n\t\t\treturn {\n\t\t\t\t...actual,\n\t\t\t\tloadParaglideConfig: (\n\t\t\t\t\t...args: Parameters<typeof actual.loadParaglideConfig>\n\t\t\t\t) => {\n\t\t\t\t\tloadCount++;\n\t\t\t\t\treturn actual.loadParaglideConfig(...args);\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\ttry {\n\t\t\tconst { compileCommand } = await import(\"./command.js\");\n\t\t\tconst compileModule = (await import(\"../../../compiler/compile.js\")) as {\n\t\t\t\tcompile: ReturnType<typeof vi.fn>;\n\t\t\t};\n\n\t\t\tawait compileCommand.parseAsync(\n\t\t\t\t[\"--project\", projectDir, \"--watch\", \"--silent\"],\n\t\t\t\t{ from: \"user\" }\n\t\t\t);\n\t\t\texpect(compileModule.compile).toHaveBeenCalledTimes(1);\n\t\t\texpect(loadCount).toBe(1);\n\n\t\t\tawait writeFile(path.join(projectDir, \"README.md\"), \"hello\");\n\t\t\tawait new Promise((r) => setTimeout(r, 1_000));\n\t\t\tawait writeFile(path.join(projectDir, \"notes.txt\"), \"world\");\n\t\t\tawait new Promise((r) => setTimeout(r, 1_500));\n\n\t\t\texpect(compileModule.compile.mock.calls.length).toBeGreaterThanOrEqual(3);\n\t\t\texpect(loadCount).toBe(1);\n\t\t} finally {\n\t\t\tvi.doUnmock(\"../../../services/config/index.js\");\n\t\t}\n\t});\n});\n\ntest(\"compile --watch forwards the newly exposed compiler options (#757)\", async () => {\n\tconst testDirectory = await mkdtemp(path.join(tmpdir(), \"paraglide-cli-\"));\n\ttestDirectories.push(testDirectory);\n\tconst outdir = path.join(testDirectory, \"output\");\n\n\tconst compileMock = vi.fn().mockResolvedValue({ outputHashes: {} });\n\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\tcompile: compileMock,\n\t}));\n\n\tconst { compileCommand } = await import(\"./command.js\");\n\n\tawait compileCommand.parseAsync(\n\t\t[\n\t\t\t\"--project\",\n\t\t\tpath.join(testDirectory, \"project.inlang\"),\n\t\t\t\"--outdir\",\n\t\t\toutdir,\n\t\t\t\"--watch\",\n\t\t\t\"--no-clean-outdir\",\n\t\t\t\"--experimental-static-locale\",\n\t\t\t'\"de\"',\n\t\t\t\"--disable-async-local-storage\",\n\t\t\t\"--silent\",\n\t\t],\n\t\t{ from: \"user\" }\n\t);\n\n\texpect(compileMock).toHaveBeenCalledTimes(1);\n\texpect(compileMock).toHaveBeenCalledWith(\n\t\texpect.objectContaining({\n\t\t\tcleanOutdir: false,\n\t\t\tdisableAsyncLocalStorage: true,\n\t\t\texperimentalStaticLocale: '\"de\"',\n\t\t\tpreviousCompilation: undefined,\n\t\t})\n\t);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"command.test.js","sourceRoot":"","sources":["../../../../src/cli/commands/compile/command.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdtemp, rm, writeFile, mkdir } from \"node:fs/promises\";\nimport * as nodeFs from \"node:fs/promises\";\nimport fs from \"node:fs\";\nimport { EventEmitter } from \"node:events\";\nimport { tmpdir } from \"node:os\";\nimport consola from \"consola\";\nimport path, { resolve } from \"node:path\";\nimport { afterEach, beforeEach, describe, expect, test, vi } from \"vitest\";\n\nlet testDirectories: string[] = [];\nlet initialSigintListeners: NodeJS.SignalsListener[] = [];\nlet watchers = new Map<string, Set<TestWatcher>>();\n\n// Test CLI event handling with real config files and controlled watch delivery.\n// fs.watch does not guarantee event timing, filenames, or one event per write.\nclass TestWatcher extends EventEmitter implements fs.FSWatcher {\n\tconstructor(private readonly onClose: () => void) {\n\t\tsuper();\n\t}\n\tclose() {\n\t\tthis.onClose();\n\t\tthis.removeAllListeners();\n\t}\n\tref() {\n\t\treturn this;\n\t}\n\tunref() {\n\t\treturn this;\n\t}\n}\n\nfunction notifyChange(\n\tdirectory: string,\n\tfilename: string | null,\n\tevent: \"change\" | \"rename\" = \"change\"\n) {\n\tconst current = watchers.get(path.resolve(directory));\n\texpect(current?.size).toBeGreaterThan(0);\n\tfor (const watcher of current ?? []) watcher.emit(\"change\", event, filename);\n}\n\nbeforeEach(() => {\n\tvi.resetModules();\n\ttestDirectories = [];\n\tinitialSigintListeners = process.listeners(\"SIGINT\");\n\twatchers = new Map();\n\tvi.spyOn(fs, \"watch\").mockImplementation(\n\t\t(\n\t\t\tfilename: fs.PathLike,\n\t\t\toptions?:\n\t\t\t\t| fs.WatchOptions\n\t\t\t\t| BufferEncoding\n\t\t\t\t| fs.WatchListener<string>\n\t\t\t\t| fs.WatchListener<Buffer>\n\t\t\t\t| null,\n\t\t\tlistener?: fs.WatchListener<string> | fs.WatchListener<Buffer>\n\t\t) => {\n\t\t\tconst target = path.resolve(String(filename));\n\t\t\tconst current = watchers.get(target) ?? new Set<TestWatcher>();\n\t\t\twatchers.set(target, current);\n\t\t\tconst watcher = new TestWatcher(() => current.delete(watcher));\n\t\t\tconst callback = typeof options === \"function\" ? options : listener;\n\t\t\tif (callback) watcher.on(\"change\", callback);\n\t\t\tcurrent.add(watcher);\n\t\t\treturn watcher;\n\t\t}\n\t);\n});\n\nafterEach(async () => {\n\t// Stop each CLI instance before deleting fixtures or restoring its mocks.\n\tvi.spyOn(process, \"exit\").mockImplementation(() => undefined as never);\n\tfor (const listener of process.listeners(\"SIGINT\")) {\n\t\tif (!initialSigintListeners.includes(listener)) {\n\t\t\tlistener(\"SIGINT\");\n\t\t\tprocess.removeListener(\"SIGINT\", listener);\n\t\t}\n\t}\n\tfor (const current of watchers.values()) {\n\t\tfor (const watcher of current) watcher.close();\n\t}\n\tvi.useRealTimers();\n\tvi.restoreAllMocks();\n\tfor (const directory of testDirectories) {\n\t\tawait rm(directory, { recursive: true, force: true });\n\t}\n});\n\n/**\n * Creates `<dir>/project.inlang/paraglide.config.ts` with the given\n * outdir — the layout of the new config-in-project model.\n */\nasync function writeConfig(\n\tprojectDir: string,\n\toutdir: string,\n\tfileName = \"paraglide.config.ts\"\n) {\n\tawait mkdir(projectDir, { recursive: true });\n\tawait writeFile(\n\t\tpath.join(projectDir, fileName),\n\t\t[\"export default {\", ` outdir: ${JSON.stringify(outdir)},`, \"}\"].join(\"\\n\")\n\t);\n}\n\nasync function createWorkspace() {\n\tconst workspace = await mkdtemp(path.join(tmpdir(), \"paraglide-cli-\"));\n\ttestDirectories.push(workspace);\n\tconst projectDir = path.join(workspace, \"project.inlang\");\n\treturn { workspace, projectDir };\n}\n\ntest(\"compile seeds existing outdir and disables cleaning (#743)\", async () => {\n\tconst { workspace } = await createWorkspace();\n\tconst outdir = path.join(workspace, \"output\");\n\tconst { writeOutput } =\n\t\tawait import(\"../../../services/file-handling/write-output.js\");\n\tawait writeOutput({\n\t\tdirectory: outdir,\n\t\toutput: {\n\t\t\t\"runtime.js\": \"export const runtime = true;\",\n\t\t},\n\t\tfs: nodeFs,\n\t});\n\n\tconst compileMock = vi.fn().mockResolvedValue({\n\t\toutputHashes: {\n\t\t\t\"runtime.js\": \"next-hash\",\n\t\t},\n\t});\n\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\tcompile: compileMock,\n\t}));\n\tconst exitError = new Error(\"process.exit\");\n\tconst exitMock = vi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\tthrow exitError;\n\t});\n\n\tconst { compileCommand } = await import(\"./command.js\");\n\n\tawait expect(\n\t\tcompileCommand.parseAsync(\n\t\t\t[\n\t\t\t\t\"--project\",\n\t\t\t\tpath.join(workspace, \"project.inlang\"),\n\t\t\t\t\"--outdir\",\n\t\t\t\toutdir,\n\t\t\t\t\"--silent\",\n\t\t\t],\n\t\t\t{ from: \"user\" }\n\t\t)\n\t).rejects.toBe(exitError);\n\n\texpect(compileMock).toHaveBeenCalledTimes(1);\n\texpect(compileMock).toHaveBeenCalledWith(\n\t\texpect.objectContaining({\n\t\t\toutdir,\n\t\t\tcleanOutdir: false,\n\t\t\tpreviousCompilation: {\n\t\t\t\toutputHashes: {\n\t\t\t\t\t\"runtime.js\": expect.any(String),\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t);\n\texpect(exitMock).toHaveBeenCalledWith(0);\n});\n\ntest(\"compile exposes and forwards compiler options missing from the CLI (#757)\", async () => {\n\tconst testDirectory = await mkdtemp(path.join(tmpdir(), \"paraglide-cli-\"));\n\ttestDirectories.push(testDirectory);\n\tconst outdir = path.join(testDirectory, \"output\");\n\tawait nodeFs.mkdir(outdir, { recursive: true });\n\tawait nodeFs.writeFile(path.join(outdir, \"custom.txt\"), \"keep me\");\n\n\tconst compileMock = vi.fn().mockResolvedValue({ outputHashes: {} });\n\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\tcompile: compileMock,\n\t}));\n\tconst exitError = new Error(\"process.exit\");\n\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\tthrow exitError;\n\t});\n\n\tconst { compileCommand } = await import(\"./command.js\");\n\tconst help = compileCommand.helpInformation();\n\n\texpect(help).toContain(\"--clean-outdir\");\n\texpect(help).toContain(\"--no-clean-outdir\");\n\texpect(help).toContain(\"--experimental-static-locale <expression>\");\n\texpect(help).toContain(\"--disable-async-local-storage\");\n\n\tawait expect(\n\t\tcompileCommand.parseAsync(\n\t\t\t[\n\t\t\t\t\"--project\",\n\t\t\t\tpath.join(testDirectory, \"project.inlang\"),\n\t\t\t\t\"--outdir\",\n\t\t\t\toutdir,\n\t\t\t\t\"--no-clean-outdir\",\n\t\t\t\t\"--experimental-static-locale\",\n\t\t\t\t'import.meta.env.PARAGLIDE_LOCALE ?? \"en\"',\n\t\t\t\t\"--disable-async-local-storage\",\n\t\t\t\t\"--silent\",\n\t\t\t],\n\t\t\t{ from: \"user\" }\n\t\t)\n\t).rejects.toBe(exitError);\n\n\texpect(compileMock).toHaveBeenCalledTimes(1);\n\texpect(compileMock).toHaveBeenCalledWith(\n\t\texpect.objectContaining({\n\t\t\tcleanOutdir: false,\n\t\t\tdisableAsyncLocalStorage: true,\n\t\t\texperimentalStaticLocale: 'import.meta.env.PARAGLIDE_LOCALE ?? \"en\"',\n\t\t\tpreviousCompilation: undefined,\n\t\t})\n\t);\n});\n\ntest(\"compile --watch seeds existing outdir and disables cleaning on first compile (#688)\", async () => {\n\tconst testDirectory = await mkdtemp(path.join(tmpdir(), \"paraglide-cli-\"));\n\ttestDirectories.push(testDirectory);\n\tconst outdir = path.join(testDirectory, \"output\");\n\tconst { writeOutput } =\n\t\tawait import(\"../../../services/file-handling/write-output.js\");\n\tawait writeOutput({\n\t\tdirectory: outdir,\n\t\toutput: {\n\t\t\t\"runtime.js\": \"export const runtime = true;\",\n\t\t},\n\t\tfs: nodeFs,\n\t});\n\n\tconst compileMock = vi.fn().mockResolvedValue({\n\t\toutputHashes: {\n\t\t\t\"runtime.js\": \"next-hash\",\n\t\t},\n\t});\n\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\tcompile: compileMock,\n\t}));\n\n\tconst { compileCommand } = await import(\"./command.js\");\n\n\tawait compileCommand.parseAsync(\n\t\t[\n\t\t\t\"--project\",\n\t\t\tpath.join(testDirectory, \"project.inlang\"),\n\t\t\t\"--outdir\",\n\t\t\toutdir,\n\t\t\t\"--watch\",\n\t\t\t\"--silent\",\n\t\t],\n\t\t{ from: \"user\" }\n\t);\n\n\texpect(compileMock).toHaveBeenCalledTimes(1);\n\texpect(compileMock).toHaveBeenCalledWith(\n\t\texpect.objectContaining({\n\t\t\toutdir,\n\t\t\tcleanOutdir: false,\n\t\t\tpreviousCompilation: {\n\t\t\t\toutputHashes: {\n\t\t\t\t\t\"runtime.js\": expect.any(String),\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t);\n});\n\ndescribe(\"config file integration\", () => {\n\ttest(\"compile reads options from a config file inside --project\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst outdir = path.join(workspace, \"from-config\");\n\t\tawait writeConfig(projectDir, outdir);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\t\tconst exitError = new Error(\"process.exit\");\n\t\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\t\tthrow exitError;\n\t\t});\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait expect(\n\t\t\tcompileCommand.parseAsync([\"--project\", projectDir, \"--silent\"], {\n\t\t\t\tfrom: \"user\",\n\t\t\t})\n\t\t).rejects.toBe(exitError);\n\n\t\texpect(compileMock).toHaveBeenCalledWith(\n\t\t\texpect.objectContaining({\n\t\t\t\tproject: projectDir,\n\t\t\t\toutdir,\n\t\t\t\tstrategy: [\"cookie\", \"globalVariable\", \"baseLocale\"],\n\t\t\t\temitReadme: true,\n\t\t\t})\n\t\t);\n\t});\n\n\ttest(\"discovers the conventional ./project.inlang without flags\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst outdir = path.join(workspace, \"from-config\");\n\t\tawait writeConfig(projectDir, outdir);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\t\tconst exitError = new Error(\"process.exit\");\n\t\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\t\tthrow exitError;\n\t\t});\n\t\tconst cwdMock = vi.spyOn(process, \"cwd\").mockReturnValue(workspace);\n\n\t\ttry {\n\t\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\t\tawait expect(\n\t\t\t\tcompileCommand.parseAsync([\"--silent\"], { from: \"user\" })\n\t\t\t).rejects.toBe(exitError);\n\n\t\t\texpect(compileMock).toHaveBeenCalledWith(\n\t\t\t\texpect.objectContaining({\n\t\t\t\t\tproject: projectDir,\n\t\t\t\t\toutdir,\n\t\t\t\t})\n\t\t\t);\n\t\t} finally {\n\t\t\tcwdMock.mockRestore();\n\t\t}\n\t});\n\n\ttest(\"announces the conventional project default when --project is omitted\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst outdir = path.join(workspace, \"from-config\");\n\t\tawait writeConfig(projectDir, outdir);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\t\tconst exitError = new Error(\"process.exit\");\n\t\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\t\tthrow exitError;\n\t\t});\n\t\tconst infoSpy = vi.spyOn(consola, \"info\").mockImplementation(() => {});\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\t\tconst cwdMock = vi.spyOn(process, \"cwd\").mockReturnValue(workspace);\n\n\t\ttry {\n\t\t\tawait expect(\n\t\t\t\tcompileCommand.parseAsync(\n\t\t\t\t\t[\"--outdir\", outdir], // no --project, no --silent\n\t\t\t\t\t{ from: \"user\" }\n\t\t\t\t)\n\t\t\t).rejects.toBe(exitError);\n\n\t\t\texpect(compileMock).toHaveBeenCalledWith(\n\t\t\t\texpect.objectContaining({\n\t\t\t\t\tproject: projectDir,\n\t\t\t\t\toutdir,\n\t\t\t\t})\n\t\t\t);\n\t\t\texpect(\n\t\t\t\tinfoSpy.mock.calls.some((call) =>\n\t\t\t\t\tString(call[0]).includes(\"--project was not provided\")\n\t\t\t\t)\n\t\t\t).toBe(true);\n\t\t} finally {\n\t\t\tcwdMock.mockRestore();\n\t\t}\n\t});\n\n\ttest(\"command line flags override config file values\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tawait writeConfig(projectDir, path.join(workspace, \"from-config\"));\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\t\tconst exitError = new Error(\"process.exit\");\n\t\tvi.spyOn(process, \"exit\").mockImplementation(() => {\n\t\t\tthrow exitError;\n\t\t});\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait expect(\n\t\t\tcompileCommand.parseAsync(\n\t\t\t\t[\n\t\t\t\t\t\"--project\",\n\t\t\t\t\tprojectDir,\n\t\t\t\t\t\"--outdir\",\n\t\t\t\t\t\"./from-flag\",\n\t\t\t\t\t\"--strategy\",\n\t\t\t\t\t\"cookie\",\n\t\t\t\t\t\"baseLocale\",\n\t\t\t\t\t\"--silent\",\n\t\t\t\t],\n\t\t\t\t{ from: \"user\" }\n\t\t\t)\n\t\t).rejects.toBe(exitError);\n\n\t\texpect(compileMock).toHaveBeenCalledWith(\n\t\t\texpect.objectContaining({\n\t\t\t\tproject: projectDir,\n\t\t\t\toutdir: resolve(process.cwd(), \"./from-flag\"),\n\t\t\t\tstrategy: [\"cookie\", \"baseLocale\"],\n\t\t\t})\n\t\t);\n\t});\n\n\t// Deleting the config file mid-watch falls back to the built-in\n\t// defaults (same as never having a config); recreating it is picked up.\n\ttest(\"watch falls back to defaults when the config is deleted\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst configPath = path.join(projectDir, \"paraglide.config.ts\");\n\t\tconst outdir = path.join(workspace, \"from-config\");\n\t\tawait writeConfig(projectDir, outdir);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait compileCommand.parseAsync(\n\t\t\t[\"--project\", projectDir, \"--watch\", \"--silent\"],\n\t\t\t{ from: \"user\" }\n\t\t);\n\t\texpect(compileMock).toHaveBeenCalledTimes(1);\n\t\texpect(compileMock.mock.calls[0]![0].outdir).toBe(outdir);\n\n\t\tawait rm(configPath);\n\t\tnotifyChange(projectDir, \"paraglide.config.ts\", \"rename\");\n\n\t\tconst deadline = Date.now() + 10_000;\n\t\twhile (compileMock.mock.calls.length < 2 && Date.now() < deadline) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\n\t\texpect(compileMock.mock.calls.length).toBeGreaterThanOrEqual(2);\n\t\tfor (const call of compileMock.mock.calls.slice(1)) {\n\t\t\t// Default outdir, resolved against the working directory.\n\t\t\texpect(\n\t\t\t\tString(call[0].outdir).endsWith(path.join(\"src\", \"paraglide\"))\n\t\t\t).toBe(true);\n\t\t\texpect(call[0].project).toBe(projectDir);\n\t\t}\n\n\t\t// Recreating the config with a different outdir is picked up again.\n\t\tawait writeConfig(projectDir, path.join(workspace, \"recreated\"));\n\t\tnotifyChange(projectDir, \"paraglide.config.ts\", \"rename\");\n\t\tconst recreateDeadline = Date.now() + 10_000;\n\t\twhile (\n\t\t\tDate.now() < recreateDeadline &&\n\t\t\t!compileMock.mock.calls.some((c) =>\n\t\t\t\tString(c[0].outdir).endsWith(\"recreated\")\n\t\t\t)\n\t\t) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\t\texpect(\n\t\t\tcompileMock.mock.calls.some((c) =>\n\t\t\t\tString(c[0].outdir).endsWith(\"recreated\")\n\t\t\t)\n\t\t).toBe(true);\n\t});\n\n\t// Renaming the config between formats switches to the new winner.\n\t// A NEW non-config file appearing directly in the project directory (e.g.\n\t// a locale JSON for a freshly added locale) must schedule a rebuild even\n\t// though no per-file watcher exists for it yet.\n\ttest(\"watch recompiles when a new input appears in the project directory\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tawait writeConfig(projectDir, path.join(workspace, \"from-config\"));\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait compileCommand.parseAsync(\n\t\t\t[\"--project\", projectDir, \"--watch\", \"--silent\"],\n\t\t\t{ from: \"user\" }\n\t\t);\n\t\texpect(compileMock).toHaveBeenCalledTimes(1);\n\n\t\tawait writeFile(path.join(projectDir, \"es.json\"), \"{}\");\n\t\tnotifyChange(projectDir, \"es.json\", \"rename\");\n\n\t\tconst deadline = Date.now() + 10_000;\n\t\twhile (compileMock.mock.calls.length < 2 && Date.now() < deadline) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\t\texpect(compileMock.mock.calls.length).toBeGreaterThanOrEqual(2);\n\t});\n\n\ttest(\"watch follows config renames between formats\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tconst tsPath = path.join(projectDir, \"paraglide.config.ts\");\n\t\tconst jsPath = path.join(projectDir, \"paraglide.config.js\");\n\t\tconst outdirA = path.join(workspace, \"out-ts\");\n\t\tconst outdirB = path.join(workspace, \"out-js\");\n\t\tawait writeConfig(projectDir, outdirA);\n\n\t\tconst compileMock = vi.fn().mockResolvedValue({});\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: compileMock,\n\t\t}));\n\n\t\tconst { compileCommand } = await import(\"./command.js\");\n\n\t\tawait compileCommand.parseAsync(\n\t\t\t[\"--project\", projectDir, \"--watch\", \"--silent\"],\n\t\t\t{ from: \"user\" }\n\t\t);\n\t\texpect(compileMock.mock.calls[0]![0].outdir).toBe(outdirA);\n\n\t\t// Format switch: delete .ts, add .js.\n\t\tawait rm(tsPath);\n\t\tawait writeFile(\n\t\t\tjsPath,\n\t\t\t[\"export default {\", ` outdir: ${JSON.stringify(outdirB)},`, \"}\"].join(\n\t\t\t\t\"\\n\"\n\t\t\t)\n\t\t);\n\t\tnotifyChange(projectDir, \"paraglide.config.ts\", \"rename\");\n\t\tnotifyChange(projectDir, \"paraglide.config.js\", \"rename\");\n\n\t\tconst deadline = Date.now() + 10_000;\n\t\twhile (\n\t\t\tDate.now() < deadline &&\n\t\t\t!compileMock.mock.calls.some((c) => c[0].outdir === outdirB)\n\t\t) {\n\t\t\tawait new Promise((r) => setTimeout(r, 50));\n\t\t}\n\t\texpect(compileMock.mock.calls.some((c) => c[0].outdir === outdirB)).toBe(\n\t\t\ttrue\n\t\t);\n\t});\n\n\t// Non-config changes inside the project directory DO rebuild (new\n\t// inputs can appear there) but must NOT reload the config.\n\ttest(\"watch recompiles without reloading config for non-config changes\", async () => {\n\t\tconst { workspace, projectDir } = await createWorkspace();\n\t\tawait writeConfig(projectDir, path.join(workspace, \"from-config\"));\n\n\t\tlet loadCount = 0;\n\t\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\t\tcompile: vi.fn().mockResolvedValue({}),\n\t\t}));\n\t\tvi.doMock(\"../../../services/config/index.js\", async (importActual) => {\n\t\t\tconst actual =\n\t\t\t\tawait importActual<\n\t\t\t\t\ttypeof import(\"../../../services/config/index.js\")\n\t\t\t\t>();\n\t\t\treturn {\n\t\t\t\t...actual,\n\t\t\t\tloadParaglideConfig: (\n\t\t\t\t\t...args: Parameters<typeof actual.loadParaglideConfig>\n\t\t\t\t) => {\n\t\t\t\t\tloadCount++;\n\t\t\t\t\treturn actual.loadParaglideConfig(...args);\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\ttry {\n\t\t\tconst { compileCommand } = await import(\"./command.js\");\n\t\t\tconst compileModule = (await import(\"../../../compiler/compile.js\")) as {\n\t\t\t\tcompile: ReturnType<typeof vi.fn>;\n\t\t\t};\n\n\t\t\tawait compileCommand.parseAsync(\n\t\t\t\t[\"--project\", projectDir, \"--watch\", \"--silent\"],\n\t\t\t\t{ from: \"user\" }\n\t\t\t);\n\t\t\texpect(compileModule.compile).toHaveBeenCalledTimes(1);\n\t\t\texpect(loadCount).toBe(1);\n\n\t\t\tawait writeFile(path.join(projectDir, \"README.md\"), \"hello\");\n\t\t\tnotifyChange(projectDir, \"README.md\");\n\t\t\tawait vi.waitFor(() =>\n\t\t\t\texpect(compileModule.compile).toHaveBeenCalledTimes(2)\n\t\t\t);\n\t\t\tawait writeFile(path.join(projectDir, \"notes.txt\"), \"world\");\n\t\t\tnotifyChange(projectDir, \"notes.txt\");\n\t\t\tawait vi.waitFor(() =>\n\t\t\t\texpect(compileModule.compile).toHaveBeenCalledTimes(3)\n\t\t\t);\n\n\t\t\texpect(compileModule.compile.mock.calls.length).toBeGreaterThanOrEqual(3);\n\t\t\texpect(loadCount).toBe(1);\n\n\t\t\t// A missing filename is ambiguous and must conservatively refresh config.\n\t\t\tnotifyChange(projectDir, null);\n\t\t\tawait vi.waitFor(() =>\n\t\t\t\texpect(compileModule.compile).toHaveBeenCalledTimes(4)\n\t\t\t);\n\t\t\texpect(loadCount).toBe(2);\n\t\t} finally {\n\t\t\tvi.doUnmock(\"../../../services/config/index.js\");\n\t\t}\n\t});\n});\n\ntest(\"watch shutdown cancels queued rebuilds and ignores late events\", async () => {\n\tconst { workspace, projectDir } = await createWorkspace();\n\tawait writeConfig(projectDir, path.join(workspace, \"output\"));\n\tconst compileMock = vi.fn().mockResolvedValue({ outputHashes: {} });\n\tvi.doMock(\"../../../compiler/compile.js\", () => ({ compile: compileMock }));\n\tconst { compileCommand } = await import(\"./command.js\");\n\tawait compileCommand.parseAsync(\n\t\t[\"--project\", projectDir, \"--watch\", \"--silent\", \"--no-clean-outdir\"],\n\t\t{ from: \"user\" }\n\t);\n\tconst watcher = [...watchers.get(path.resolve(projectDir))!][0]!;\n\tconst lateEvent = watcher.listeners(\"change\")[0]!;\n\tvi.useFakeTimers();\n\tnotifyChange(projectDir, \"notes.txt\");\n\tconst exit = vi\n\t\t.spyOn(process, \"exit\")\n\t\t.mockImplementation(() => undefined as never);\n\tconst stop = process\n\t\t.listeners(\"SIGINT\")\n\t\t.find((listener) => !initialSigintListeners.includes(listener));\n\texpect(stop).toBeDefined();\n\tstop!(\"SIGINT\");\n\tlateEvent(\"change\", \"notes.txt\");\n\tawait vi.advanceTimersByTimeAsync(500);\n\texpect(exit).toHaveBeenCalledWith(0);\n\texpect(compileMock).toHaveBeenCalledTimes(1);\n\texpect([...watchers.values()].every((current) => current.size === 0)).toBe(\n\t\ttrue\n\t);\n});\n\ntest(\"compile --watch forwards the newly exposed compiler options (#757)\", async () => {\n\tconst testDirectory = await mkdtemp(path.join(tmpdir(), \"paraglide-cli-\"));\n\ttestDirectories.push(testDirectory);\n\tconst outdir = path.join(testDirectory, \"output\");\n\n\tconst compileMock = vi.fn().mockResolvedValue({ outputHashes: {} });\n\tvi.doMock(\"../../../compiler/compile.js\", () => ({\n\t\tcompile: compileMock,\n\t}));\n\n\tconst { compileCommand } = await import(\"./command.js\");\n\n\tawait compileCommand.parseAsync(\n\t\t[\n\t\t\t\"--project\",\n\t\t\tpath.join(testDirectory, \"project.inlang\"),\n\t\t\t\"--outdir\",\n\t\t\toutdir,\n\t\t\t\"--watch\",\n\t\t\t\"--no-clean-outdir\",\n\t\t\t\"--experimental-static-locale\",\n\t\t\t'\"de\"',\n\t\t\t\"--disable-async-local-storage\",\n\t\t\t\"--silent\",\n\t\t],\n\t\t{ from: \"user\" }\n\t);\n\n\texpect(compileMock).toHaveBeenCalledTimes(1);\n\texpect(compileMock).toHaveBeenCalledWith(\n\t\texpect.objectContaining({\n\t\t\tcleanOutdir: false,\n\t\t\tdisableAsyncLocalStorage: true,\n\t\t\texperimentalStaticLocale: '\"de\"',\n\t\t\tpreviousCompilation: undefined,\n\t\t})\n\t);\n});\n"]}
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
+
import type { InitOptions } from "../../init-options.js";
|
|
3
|
+
export declare function createInitCommand(): Command;
|
|
2
4
|
export declare const initCommand: Command;
|
|
5
|
+
export declare function runInit(options: InitOptions & {
|
|
6
|
+
compile?: boolean;
|
|
7
|
+
}): Promise<void>;
|