@inlang/paraglide-js 2.27.0 → 2.29.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 +9 -0
- 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 +235 -2
- package/dist/bundler-plugins/per-locale-build/vite-environments.test.js.map +1 -1
- package/dist/bundler-plugins/unplugin.d.ts +4 -1
- package/dist/bundler-plugins/unplugin.js +134 -22
- package/dist/bundler-plugins/unplugin.js.map +1 -1
- package/dist/bundler-plugins/unplugin.test.js +490 -1
- package/dist/bundler-plugins/unplugin.test.js.map +1 -1
- package/dist/bundler-plugins/vite-error-response.test.d.ts +1 -0
- package/dist/bundler-plugins/vite-error-response.test.js +171 -0
- package/dist/bundler-plugins/vite-error-response.test.js.map +1 -0
- package/dist/bundler-plugins/vite.d.ts +8 -0
- package/dist/bundler-plugins/vite.js +14 -4
- 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 +213 -59
- 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/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.js +2 -2
- package/dist/cli/steps/add-inlang-check.js.map +1 -1
- 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/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 +11 -6
- 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 +12 -6
- 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 +2 -0
- package/dist/cli/utils.js +6 -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.js +6 -1
- package/dist/compiler/compile-annotation.js.map +1 -1
- package/dist/compiler/compile-bundle.d.ts +4 -0
- package/dist/compiler/compile-bundle.js +67 -2
- package/dist/compiler/compile-bundle.js.map +1 -1
- package/dist/compiler/compile-bundle.test.js +214 -1
- 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.test.js +14 -14
- package/dist/compiler/compile-local-variable.test.js.map +1 -1
- package/dist/compiler/compile-message.exact-number.test.js +1 -1
- package/dist/compiler/compile-message.exact-number.test.js.map +1 -1
- package/dist/compiler/compile-message.locals.test.js +1 -1
- package/dist/compiler/compile-message.locals.test.js.map +1 -1
- package/dist/compiler/compile-message.test.js +2 -2
- package/dist/compiler/compile-message.test.js.map +1 -1
- package/dist/compiler/compile-pattern.test.js +5 -5
- package/dist/compiler/compile-pattern.test.js.map +1 -1
- package/dist/compiler/compile-project.js +1 -0
- package/dist/compiler/compile-project.js.map +1 -1
- package/dist/compiler/compile-project.test.js +94 -1
- 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 +70 -0
- 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/output-structure/message-modules.js +1 -1
- package/dist/compiler/output-structure/message-modules.js.map +1 -1
- package/dist/compiler/registry.js +71 -13
- 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/localize-url.d.ts +8 -4
- package/dist/compiler/runtime/localize-url.js +12 -8
- package/dist/compiler/runtime/localize-url.js.map +1 -1
- package/dist/compiler/runtime/localize-url.test.js +45 -0
- package/dist/compiler/runtime/localize-url.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 +75 -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/middleware.d.ts +8 -2
- package/dist/compiler/server/middleware.js +175 -7
- 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 +14 -4
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { Plugin } from "vite";
|
|
2
2
|
import type { ParaglidePluginOptions } from "./unplugin.js";
|
|
3
3
|
export type ParaglideVitePluginOptions = ParaglidePluginOptions & {
|
|
4
|
+
/**
|
|
5
|
+
* Respond with HTTP 500 while the development compiler or its config is
|
|
6
|
+
* invalid, instead of serving the last successful output. Error overlays
|
|
7
|
+
* remain enabled. Set this on the Vite plugin, not in paraglide.config.
|
|
8
|
+
*
|
|
9
|
+
* @default false
|
|
10
|
+
*/
|
|
11
|
+
devErrorResponse?: boolean;
|
|
4
12
|
/**
|
|
5
13
|
* Emit one compiler-specialized client asset tree per project locale.
|
|
6
14
|
*
|
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
import { createVitePlugin } from "unplugin";
|
|
2
2
|
import { createPerLocaleBuildPlugins } from "./per-locale-build/index.js";
|
|
3
3
|
import { unpluginFactory } from "./unplugin.js";
|
|
4
|
-
const createCompilerVitePlugin = createVitePlugin(unpluginFactory);
|
|
4
|
+
const createCompilerVitePlugin = createVitePlugin(({ devErrorResponse, ...options }, meta) => unpluginFactory(options, meta, { devErrorResponse }));
|
|
5
|
+
const createPerLocaleCompilerVitePlugin = createVitePlugin(({ devErrorResponse, ...options }, meta) => unpluginFactory(options, meta, {
|
|
6
|
+
outputStructure: "locale-modules",
|
|
7
|
+
devErrorResponse,
|
|
8
|
+
}));
|
|
5
9
|
export function paraglideVitePlugin(options) {
|
|
6
|
-
const { experimentalPerLocaleBuild, ...compilerOptions } = options;
|
|
10
|
+
const { experimentalPerLocaleBuild, devErrorResponse, ...compilerOptions } = options;
|
|
7
11
|
if (!experimentalPerLocaleBuild) {
|
|
8
|
-
return createCompilerVitePlugin(
|
|
12
|
+
return createCompilerVitePlugin({
|
|
13
|
+
...compilerOptions,
|
|
14
|
+
devErrorResponse,
|
|
15
|
+
});
|
|
9
16
|
}
|
|
10
17
|
return createPerLocaleBuildPlugins({
|
|
11
18
|
compilerOptions,
|
|
12
|
-
createCompilerPlugin: (options) =>
|
|
19
|
+
createCompilerPlugin: (options) => createPerLocaleCompilerVitePlugin({
|
|
20
|
+
...options,
|
|
21
|
+
devErrorResponse,
|
|
22
|
+
}),
|
|
13
23
|
});
|
|
14
24
|
}
|
|
15
25
|
//# sourceMappingURL=vite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../../src/bundler-plugins/vite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../../src/bundler-plugins/vite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA8BhD,MAAM,wBAAwB,GAAG,gBAAgB,CAChD,CAAC,EAAE,gBAAgB,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,CAC1C,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,gBAAgB,EAAE,CAAC,CACrD,CAAC;AACF,MAAM,iCAAiC,GACtC,gBAAgB,CACf,CAAC,EAAE,gBAAgB,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,CAC1C,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE;IAC9B,eAAe,EAAE,gBAAgB;IACjC,gBAAgB;CAChB,CAAC,CACH,CAAC;AAEH,MAAM,UAAU,mBAAmB,CAClC,OAAmC;IAEnC,MAAM,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,GAAG,eAAe,EAAE,GACzE,OAAO,CAAC;IACT,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACjC,OAAO,wBAAwB,CAAC;YAC/B,GAAG,eAAe;YAClB,gBAAgB;SAChB,CAAW,CAAC;IACd,CAAC;IAED,OAAO,2BAA2B,CAAC;QAClC,eAAe;QACf,oBAAoB,EAAE,CAAC,OAAO,EAAE,EAAE,CACjC,iCAAiC,CAAC;YACjC,GAAG,OAAO;YACV,gBAAgB;SAChB,CAAW;KACb,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { createVitePlugin } from \"unplugin\";\nimport type { Plugin } from \"vite\";\nimport type { ParaglidePluginOptions } from \"./unplugin.js\";\nimport { createPerLocaleBuildPlugins } from \"./per-locale-build/index.js\";\nimport { unpluginFactory } from \"./unplugin.js\";\n\nexport type ParaglideVitePluginOptions = ParaglidePluginOptions & {\n\t/**\n\t * Respond with HTTP 500 while the development compiler or its config is\n\t * invalid, instead of serving the last successful output. Error overlays\n\t * remain enabled. Set this on the Vite plugin, not in paraglide.config.\n\t *\n\t * @default false\n\t */\n\tdevErrorResponse?: boolean;\n\t/**\n\t * Emit one compiler-specialized client asset tree per project locale.\n\t *\n\t * Requires Vite 8+. Builds one untouched Rolldown client environment per\n\t * locale and emits `paraglide-vite-locales.json`. Locale changes need to use\n\t * full-document navigation. Framework SSR graph selection requires a public\n\t * framework integration API.\n\t *\n\t * @experimental\n\t * @default false\n\t */\n\texperimentalPerLocaleBuild?: boolean;\n};\n\ntype CompilerVitePluginOptions = Omit<\n\tParaglideVitePluginOptions,\n\t\"experimentalPerLocaleBuild\"\n>;\n\nconst createCompilerVitePlugin = createVitePlugin<CompilerVitePluginOptions>(\n\t({ devErrorResponse, ...options }, meta) =>\n\t\tunpluginFactory(options, meta, { devErrorResponse })\n);\nconst createPerLocaleCompilerVitePlugin =\n\tcreateVitePlugin<CompilerVitePluginOptions>(\n\t\t({ devErrorResponse, ...options }, meta) =>\n\t\t\tunpluginFactory(options, meta, {\n\t\t\t\toutputStructure: \"locale-modules\",\n\t\t\t\tdevErrorResponse,\n\t\t\t})\n\t);\n\nexport function paraglideVitePlugin(\n\toptions: ParaglideVitePluginOptions\n): Plugin | Plugin[] {\n\tconst { experimentalPerLocaleBuild, devErrorResponse, ...compilerOptions } =\n\t\toptions;\n\tif (!experimentalPerLocaleBuild) {\n\t\treturn createCompilerVitePlugin({\n\t\t\t...compilerOptions,\n\t\t\tdevErrorResponse,\n\t\t}) as Plugin;\n\t}\n\n\treturn createPerLocaleBuildPlugins({\n\t\tcompilerOptions,\n\t\tcreateCompilerPlugin: (options) =>\n\t\t\tcreatePerLocaleCompilerVitePlugin({\n\t\t\t\t...options,\n\t\t\t\tdevErrorResponse,\n\t\t\t}) as Plugin,\n\t});\n}\n"]}
|
|
@@ -58,7 +58,7 @@ test("experimentalPerLocaleBuild rejects conflicting compiler options", () => {
|
|
|
58
58
|
...common,
|
|
59
59
|
experimentalPerLocaleBuild: true,
|
|
60
60
|
outputStructure: "message-modules",
|
|
61
|
-
})).toThrow(
|
|
61
|
+
})).not.toThrow();
|
|
62
62
|
expect(() => paraglideVitePlugin({
|
|
63
63
|
...common,
|
|
64
64
|
experimentalPerLocaleBuild: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/vite.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"vite.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/vite.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tloadProjectInMemory,\n\tnewProject,\n\tsaveProjectToDirectory,\n} from \"@inlang/sdk\";\nimport { memfs } from \"memfs\";\nimport { expect, test } from \"vitest\";\nimport { perLocaleBuildStaticLocaleExpression } from \"../compiler/per-locale-build.js\";\nimport { paraglideVitePlugin } from \"./vite.js\";\n\ntest(\"experimentalPerLocaleBuild generates locale source modules and installs the Vite environment orchestrator\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\"] },\n\t\t}),\n\t});\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tconst plugins = paraglideVitePlugin({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/src/paraglide\",\n\t\tfs,\n\t\texperimentalPerLocaleBuild: true,\n\t\tstrategy: [\"preferredLanguage\", \"baseLocale\"],\n\t\tadditionalFiles: { \"custom.js\": \"export const custom = true;\\n\" },\n\t});\n\tif (!Array.isArray(plugins)) {\n\t\tthrow new Error(\"Expected multiple Vite plugins\");\n\t}\n\texpect(plugins.map((plugin) => plugin.name)).toEqual([\n\t\t\"paraglide-config-discovery-root\",\n\t\t\"unplugin-paraglide-js\",\n\t\t\"paraglide-vite-locale-environments\",\n\t]);\n\n\tconst compiler = plugins[1]!;\n\tif (typeof compiler.buildStart !== \"function\") {\n\t\tthrow new Error(\"Expected the compiler buildStart hook\");\n\t}\n\tawait compiler.buildStart.call({ addWatchFile() {} } as never, {} as never);\n\n\texpect(\n\t\tawait fs.promises.readFile(\"/src/paraglide/messages/en.js\", \"utf8\")\n\t).toBeDefined();\n\texpect(\n\t\tawait fs.promises.readFile(\"/src/paraglide/messages/de.js\", \"utf8\")\n\t).toBeDefined();\n\texpect(\n\t\tawait fs.promises.readFile(\"/src/paraglide/runtime.js\", \"utf8\")\n\t).toContain(perLocaleBuildStaticLocaleExpression);\n\texpect(\n\t\tawait fs.promises.readFile(\"/src/paraglide/custom.js\", \"utf8\")\n\t).toContain(\"export const custom = true;\");\n\tawait expect(\n\t\tfs.promises.readFile(\"/src/paraglide/tanstack-start.server.js\", \"utf8\")\n\t).rejects.toThrow();\n});\n\ntest(\"experimentalPerLocaleBuild rejects conflicting compiler options\", () => {\n\tconst common = { project: \"/project.inlang\", outdir: \"/src/paraglide\" };\n\texpect(() =>\n\t\tparaglideVitePlugin({\n\t\t\t...common,\n\t\t\texperimentalPerLocaleBuild: true,\n\t\t\texperimentalStaticLocale: '\"de\"',\n\t\t})\n\t).toThrow(\"cannot be combined with experimentalStaticLocale\");\n\texpect(() =>\n\t\tparaglideVitePlugin({\n\t\t\t...common,\n\t\t\texperimentalPerLocaleBuild: true,\n\t\t\texperimentalMiddlewareLocaleSplitting: true,\n\t\t})\n\t).toThrow(\"cannot be combined with experimentalMiddlewareLocaleSplitting\");\n\texpect(() =>\n\t\tparaglideVitePlugin({\n\t\t\t...common,\n\t\t\texperimentalPerLocaleBuild: true,\n\t\t\toutputStructure: \"message-modules\",\n\t\t})\n\t).not.toThrow();\n\texpect(() =>\n\t\tparaglideVitePlugin({\n\t\t\t...common,\n\t\t\texperimentalPerLocaleBuild: true,\n\t\t\trouteStrategies: [\n\t\t\t\t{\n\t\t\t\t\tmatch: \"/api/:path(.*)?\",\n\t\t\t\t\texclude: true,\n\t\t\t\t},\n\t\t\t],\n\t\t})\n\t).not.toThrow();\n});\n"]}
|
|
@@ -142,6 +142,7 @@ export const compileCommand = new Command()
|
|
|
142
142
|
let compileTimer;
|
|
143
143
|
let compileInProgress = false;
|
|
144
144
|
let compileRequested = false;
|
|
145
|
+
let watching = true;
|
|
145
146
|
// Set by the project-directory watcher when a config-named file
|
|
146
147
|
// changes — survives debounced coalescing with unrelated events.
|
|
147
148
|
let configChangedSinceLastBuild = false;
|
|
@@ -177,6 +178,8 @@ export const compileCommand = new Command()
|
|
|
177
178
|
}
|
|
178
179
|
};
|
|
179
180
|
const updateWatchers = (files) => {
|
|
181
|
+
if (!watching)
|
|
182
|
+
return;
|
|
180
183
|
const { files: nextFiles, directories: nextDirectories, isIgnoredPath, } = getWatchTargets(files, { outdir: compileOptions.outdir });
|
|
181
184
|
for (const [filePath, watcher] of fileWatchers) {
|
|
182
185
|
if (!nextFiles.has(filePath)) {
|
|
@@ -251,6 +254,8 @@ export const compileCommand = new Command()
|
|
|
251
254
|
}
|
|
252
255
|
};
|
|
253
256
|
const runCompile = async (changedPath) => {
|
|
257
|
+
if (!watching)
|
|
258
|
+
return;
|
|
254
259
|
if (compileInProgress) {
|
|
255
260
|
compileRequested = true;
|
|
256
261
|
return;
|
|
@@ -320,6 +325,8 @@ export const compileCommand = new Command()
|
|
|
320
325
|
}
|
|
321
326
|
};
|
|
322
327
|
const scheduleCompile = (changedPath) => {
|
|
328
|
+
if (!watching)
|
|
329
|
+
return;
|
|
323
330
|
if (compileTimer) {
|
|
324
331
|
clearTimeout(compileTimer);
|
|
325
332
|
}
|
|
@@ -328,6 +335,12 @@ export const compileCommand = new Command()
|
|
|
328
335
|
}, 100);
|
|
329
336
|
};
|
|
330
337
|
const closeWatchers = () => {
|
|
338
|
+
watching = false;
|
|
339
|
+
compileRequested = false;
|
|
340
|
+
if (compileTimer) {
|
|
341
|
+
clearTimeout(compileTimer);
|
|
342
|
+
compileTimer = undefined;
|
|
343
|
+
}
|
|
331
344
|
for (const watcher of fileWatchers.values()) {
|
|
332
345
|
watcher.close();
|
|
333
346
|
}
|
|
@@ -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);
|