@inlang/paraglide-js 2.23.2 → 2.24.1
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/dist/bundler-plugins/per-locale-build/vite-environments.js +12 -7
- package/dist/bundler-plugins/per-locale-build/vite-environments.js.map +1 -1
- package/dist/bundler-plugins/unplugin.js +134 -4
- package/dist/bundler-plugins/unplugin.js.map +1 -1
- package/dist/bundler-plugins/unplugin.test.js +77 -0
- package/dist/bundler-plugins/unplugin.test.js.map +1 -1
- package/dist/cli/commands/compile/command.js +8 -1
- package/dist/cli/commands/compile/command.js.map +1 -1
- package/dist/cli/commands/compile/command.test.js +45 -0
- package/dist/cli/commands/compile/command.test.js.map +1 -1
- package/dist/compiler/compile.js +0 -15
- package/dist/compiler/compile.js.map +1 -1
- package/dist/compiler/compile.test.js +0 -52
- package/dist/compiler/compile.test.js.map +1 -1
- package/dist/compiler/compiler-options.d.ts +8 -0
- package/dist/compiler/compiler-options.js.map +1 -1
- package/dist/compiler/runtime/create-runtime.d.ts +1 -0
- package/dist/compiler/runtime/create-runtime.js +11 -0
- package/dist/compiler/runtime/create-runtime.js.map +1 -1
- package/dist/compiler/runtime/exec-url-pattern.d.ts +9 -0
- package/dist/compiler/runtime/exec-url-pattern.js +31 -0
- package/dist/compiler/runtime/exec-url-pattern.js.map +1 -0
- package/dist/compiler/runtime/extract-locale-from-url.js +8 -3
- package/dist/compiler/runtime/extract-locale-from-url.js.map +1 -1
- package/dist/compiler/runtime/generate-static-localized-urls.js +12 -6
- package/dist/compiler/runtime/generate-static-localized-urls.js.map +1 -1
- package/dist/compiler/runtime/generate-static-localized-urls.test.js +46 -0
- package/dist/compiler/runtime/generate-static-localized-urls.test.js.map +1 -1
- package/dist/compiler/runtime/localize-href.bench.d.ts +1 -0
- package/dist/compiler/runtime/localize-href.bench.js +77 -0
- package/dist/compiler/runtime/localize-href.bench.js.map +1 -0
- package/dist/compiler/runtime/localize-href.test.js +43 -0
- package/dist/compiler/runtime/localize-href.test.js.map +1 -1
- package/dist/compiler/runtime/localize-url.d.ts +14 -0
- package/dist/compiler/runtime/localize-url.js +376 -18
- package/dist/compiler/runtime/localize-url.js.map +1 -1
- package/dist/compiler/runtime/localize-url.test.js +163 -0
- package/dist/compiler/runtime/localize-url.test.js.map +1 -1
- package/dist/compiler/runtime/normalize-trailing-slash.d.ts +10 -0
- package/dist/compiler/runtime/normalize-trailing-slash.js +23 -0
- package/dist/compiler/runtime/normalize-trailing-slash.js.map +1 -0
- package/dist/compiler/runtime/route-strategy.js +4 -2
- package/dist/compiler/runtime/route-strategy.js.map +1 -1
- package/dist/compiler/runtime/should-redirect.js +4 -1
- package/dist/compiler/runtime/should-redirect.js.map +1 -1
- package/dist/compiler/runtime/should-redirect.test.js +30 -2
- package/dist/compiler/runtime/should-redirect.test.js.map +1 -1
- package/dist/compiler/runtime/type.d.ts +1 -0
- package/dist/compiler/runtime/type.js.map +1 -1
- package/dist/compiler/runtime/variables.d.ts +6 -0
- package/dist/compiler/runtime/variables.js +6 -0
- package/dist/compiler/runtime/variables.js.map +1 -1
- package/dist/compiler/server/middleware.js +6 -2
- package/dist/compiler/server/middleware.js.map +1 -1
- package/dist/compiler/server/middleware.test.js +34 -0
- package/dist/compiler/server/middleware.test.js.map +1 -1
- package/dist/index.test.d.ts +1 -0
- package/dist/index.test.js +9 -0
- package/dist/index.test.js.map +1 -0
- 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.d.ts +1 -0
- package/dist/services/file-handling/write-output.bench.js +24 -0
- package/dist/services/file-handling/write-output.bench.js.map +1 -0
- package/dist/services/file-handling/write-output.js +16 -20
- package/dist/services/file-handling/write-output.js.map +1 -1
- package/dist/services/file-handling/write-output.test.js +27 -0
- package/dist/services/file-handling/write-output.test.js.map +1 -1
- package/package.json +2 -2
- package/dist/services/account/index.d.ts +0 -14
- package/dist/services/account/index.js +0 -43
- package/dist/services/account/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unplugin.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/unplugin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect, beforeEach, afterEach, vi } from \"vitest\";\nimport consola from \"consola\";\nimport { memfs } from \"memfs\";\nimport {\n\tloadProjectInMemory,\n\tnewProject,\n\tsaveProjectToDirectory,\n} from \"@inlang/sdk\";\n\nlet originalNodeEnv: string | undefined;\n\nbeforeEach(() => {\n\toriginalNodeEnv = process.env.NODE_ENV;\n\n\t// Reset module state between tests so the module-scoped\n\t// `previousCompilation` doesn't leak across tests.\n\tvi.resetModules();\n\n\t// Mock logging methods to suppress error messages in tests\n\tconsola.mockTypes(() => vi.fn());\n});\n\nafterEach(() => {\n\tif (originalNodeEnv !== undefined) {\n\t\tprocess.env.NODE_ENV = originalNodeEnv;\n\t} else {\n\t\tdelete process.env.NODE_ENV;\n\t}\n});\n\ntest(\"vite plugin does not throw when compilation is successful\", async () => {\n\t// Dynamic import so beforeEach's vi.resetModules() yields a fresh module\n\t// (a static import would share module state across tests).\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\t// Create and save a viable project to the virtual file system\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tconst plugin = paraglideVitePlugin({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\tawait expect(plugin.buildStart?.call(mockContext)).resolves.toBeUndefined();\n});\n\ntest(\"vite plugin does not throw on compilation errors in development\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\tprocess.env.NODE_ENV = \"development\";\n\n\t// Use memfs with no project (simulates missing project)\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst plugin = paraglideVitePlugin({\n\t\tproject: \"/non-existent-project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\t// In development mode - should catch errors and NOT throw\n\tawait expect(plugin.buildStart?.call(mockContext)).resolves.toBeUndefined();\n});\n\ntest(\"vite plugin throws on compilation errors at build time\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\tprocess.env.NODE_ENV = \"production\";\n\n\t// Use memfs with no project (simulates missing project)\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst plugin = paraglideVitePlugin({\n\t\tproject: \"/non-existent-project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\t// In production mode - should throw the error\n\tawait expect(plugin.buildStart?.call(mockContext)).rejects.toThrow();\n});\n\n// Regression test for https://github.com/opral/inlang-paraglide-js/issues/659:\n// the bundler plugins used to wipe `outdir` on every fresh process, racing\n// concurrent reads (SSR/prerender modules, sibling Vite processes, the\n// config-watcher reload) and producing ENOENT/MISSING_EXPORT/ERR_LOAD_URL.\ntest(\"vite plugin does not wipe outdir during first buildStart (#659)\", async () => {\n\tconst { paraglideVitePlugin: vitePlugin } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\t// Pre-seed outdir with a sentinel file mimicking a prior compilation\n\t// still on disk from an earlier process.\n\tawait fs.promises.mkdir(\"/test-output\", { recursive: true });\n\tawait fs.promises.writeFile(\"/test-output/__sentinel__.txt\", \"kept\");\n\n\tconst rmSpy = vi.spyOn(fs.promises, \"rm\");\n\n\tconst plugin = vitePlugin({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tcleanOutdir: true,\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = { addWatchFile: () => {} };\n\tawait plugin.buildStart?.call(mockContext);\n\n\t// The plugin must not recursively remove the outdir during the first\n\t// compile, even though previousCompilation is undefined. Concurrent\n\t// readers may be holding file handles into outdir.\n\tfor (const call of rmSpy.mock.calls) {\n\t\texpect(call[0]).not.toBe(\"/test-output\");\n\t}\n});\n\ntest(\"vite plugin warm-restart writes nothing when inputs unchanged (#659)\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tconst mockContext = { addWatchFile: () => {} };\n\n\t// First process: compile and persist files to outdir.\n\t{\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\t\tconst plugin = vitePlugin({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\t\tawait plugin.buildStart?.call(mockContext);\n\t}\n\n\t// Second process: simulate a fresh node process by resetting modules so\n\t// the module-scoped `previousCompilation` is undefined again. The plugin\n\t// should seed from on-disk hashes and write zero files (no race window).\n\tvi.resetModules();\n\tconst { paraglideVitePlugin: vitePluginFresh } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\tconst plugin2 = vitePluginFresh({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst writeFileSpy = vi.spyOn(fs.promises, \"writeFile\");\n\tawait plugin2.buildStart?.call(mockContext);\n\n\texpect(writeFileSpy).not.toHaveBeenCalled();\n});\n\n// Regression test for https://github.com/opral/paraglide-js/issues/693:\n// `vite build` fires buildStart once per environment (client, ssr) and each\n// run used to do a full compile() — project loading + message compilation —\n// even though the inputs hadn't changed.\ntest(\"vite plugin skips compile() when buildStart fires again with unchanged inputs (#693)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst project = await loadProjectInMemory({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: {\n\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\n\t\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t\tawait saveProjectToDirectory({\n\t\t\tproject,\n\t\t\tpath: \"/project.inlang\",\n\t\t\tfs: fs.promises,\n\t\t});\n\n\t\tconst plugin = vitePlugin({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\t// First environment (e.g. client) compiles.\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// Second environment (e.g. ssr) — inputs unchanged, compile skipped.\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// Changing an input file invalidates the digest and recompiles.\n\t\tconst settingsPath = \"/project.inlang/settings.json\";\n\t\tconst settings = JSON.parse(\n\t\t\tawait fs.promises.readFile(settingsPath, \"utf-8\")\n\t\t);\n\t\tsettings.locales = [\"en\", \"de\", \"fr\", \"es\"];\n\t\tawait fs.promises.writeFile(settingsPath, JSON.stringify(settings));\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// A new file added next to tracked inputs must invalidate the digest via\n// the directory-listing part of the hash, not only edits to known files.\ntest(\"vite plugin recompiles when a file is added to a tracked directory (#693)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst project = await loadProjectInMemory({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\"] },\n\t\t\t}),\n\t\t});\n\n\t\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t\tawait saveProjectToDirectory({\n\t\t\tproject,\n\t\t\tpath: \"/project.inlang\",\n\t\t\tfs: fs.promises,\n\t\t});\n\n\t\tconst plugin = vitePlugin({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// No tracked file changed, but the listing of a tracked directory did.\n\t\tawait fs.promises.writeFile(\"/project.inlang/added-later.txt\", \"new\");\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// After a failed compile the stored digest must not be reused: restoring an\n// input to its previous content has to trigger a real recompile, because the\n// failed attempt may have left no (or partial) output.\ntest(\"vite plugin does not reuse a digest from before a failed compile (#693)\", async () => {\n\tprocess.env.NODE_ENV = \"development\";\n\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst project = await loadProjectInMemory({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\"] },\n\t\t\t}),\n\t\t});\n\n\t\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t\tawait saveProjectToDirectory({\n\t\t\tproject,\n\t\t\tpath: \"/project.inlang\",\n\t\t\tfs: fs.promises,\n\t\t});\n\n\t\tconst plugin = vitePlugin({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\tconst settingsPath = \"/project.inlang/settings.json\";\n\t\tconst originalSettings = await fs.promises.readFile(settingsPath, \"utf-8\");\n\n\t\t// Break the settings file — the compile attempt fails (dev mode\n\t\t// swallows the error) and must clear the stored digest.\n\t\tawait fs.promises.writeFile(settingsPath, \"{ not json\");\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\n\t\t// Restore the exact original content. The digest now matches the one\n\t\t// from before the failure — it must have been cleared, so this\n\t\t// buildStart has to compile again instead of skipping.\n\t\tawait fs.promises.writeFile(settingsPath, originalSettings);\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(3);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// Two plugin instances with different filesystems must not share the tracked\n// fs wrapper or cached compilation state — each compiles into its own fs.\ntest(\"vite plugin instances with different fs compile against their own fs (#693)\", async () => {\n\tconst { paraglideVitePlugin: vitePlugin } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\tconst makeProjectFs = async () => {\n\t\tconst project = await loadProjectInMemory({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\"] },\n\t\t\t}),\n\t\t});\n\t\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\t\tawait saveProjectToDirectory({\n\t\t\tproject,\n\t\t\tpath: \"/project.inlang\",\n\t\t\tfs: fs.promises,\n\t\t});\n\t\treturn fs;\n\t};\n\n\tconst fsA = await makeProjectFs();\n\tconst fsB = await makeProjectFs();\n\n\tconst mockContext = { addWatchFile: () => {} };\n\n\tconst pluginA = vitePlugin({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fsA,\n\t}) as any;\n\tawait pluginA.buildStart?.call(mockContext);\n\n\tconst pluginB = vitePlugin({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fsB,\n\t}) as any;\n\tawait pluginB.buildStart?.call(mockContext);\n\n\t// B's output must exist in B's filesystem — with a shared tracked fs it\n\t// would have been read from and written into A's filesystem instead.\n\tconst outputB = await fsB.promises.readdir(\"/test-output\");\n\texpect(outputB.length).toBeGreaterThan(0);\n});\n"]}
|
|
1
|
+
{"version":3,"file":"unplugin.test.js","sourceRoot":"","sources":["../../src/bundler-plugins/unplugin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect, beforeEach, afterEach, vi } from \"vitest\";\nimport consola from \"consola\";\nimport { memfs } from \"memfs\";\nimport {\n\tloadProjectInMemory,\n\tnewProject,\n\tsaveProjectToDirectory,\n} from \"@inlang/sdk\";\n\nlet originalNodeEnv: string | undefined;\n\nbeforeEach(() => {\n\toriginalNodeEnv = process.env.NODE_ENV;\n\n\t// Reset module state between tests so the module-scoped\n\t// `previousCompilation` doesn't leak across tests.\n\tvi.resetModules();\n\n\t// Mock logging methods to suppress error messages in tests\n\tconsola.mockTypes(() => vi.fn());\n});\n\nafterEach(() => {\n\tif (originalNodeEnv !== undefined) {\n\t\tprocess.env.NODE_ENV = originalNodeEnv;\n\t} else {\n\t\tdelete process.env.NODE_ENV;\n\t}\n});\n\ntest(\"vite plugin does not throw when compilation is successful\", async () => {\n\t// Dynamic import so beforeEach's vi.resetModules() yields a fresh module\n\t// (a static import would share module state across tests).\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\t// Create and save a viable project to the virtual file system\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tconst plugin = paraglideVitePlugin({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\tawait expect(plugin.buildStart?.call(mockContext)).resolves.toBeUndefined();\n});\n\ntest(\"vite plugin does not throw on compilation errors in development\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\tprocess.env.NODE_ENV = \"development\";\n\n\t// Use memfs with no project (simulates missing project)\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst plugin = paraglideVitePlugin({\n\t\tproject: \"/non-existent-project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\t// In development mode - should catch errors and NOT throw\n\tawait expect(plugin.buildStart?.call(mockContext)).resolves.toBeUndefined();\n});\n\ntest(\"vite plugin throws on compilation errors at build time\", async () => {\n\tconst { paraglideVitePlugin } = await import(\"../bundler-plugins/vite.js\");\n\n\tprocess.env.NODE_ENV = \"production\";\n\n\t// Use memfs with no project (simulates missing project)\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst plugin = paraglideVitePlugin({\n\t\tproject: \"/non-existent-project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = {\n\t\taddWatchFile: () => {},\n\t};\n\n\t// In production mode - should throw the error\n\tawait expect(plugin.buildStart?.call(mockContext)).rejects.toThrow();\n});\n\n// Regression test for https://github.com/opral/inlang-paraglide-js/issues/659:\n// the bundler plugins used to wipe `outdir` on every fresh process, racing\n// concurrent reads (SSR/prerender modules, sibling Vite processes, the\n// config-watcher reload) and producing ENOENT/MISSING_EXPORT/ERR_LOAD_URL.\ntest(\"vite plugin does not wipe outdir during first buildStart (#659)\", async () => {\n\tconst { paraglideVitePlugin: vitePlugin } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\t// Pre-seed outdir with a sentinel file mimicking a prior compilation\n\t// still on disk from an earlier process.\n\tawait fs.promises.mkdir(\"/test-output\", { recursive: true });\n\tawait fs.promises.writeFile(\"/test-output/__sentinel__.txt\", \"kept\");\n\n\tconst rmSpy = vi.spyOn(fs.promises, \"rm\");\n\n\tconst plugin = vitePlugin({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tcleanOutdir: true,\n\t\tfs: fs,\n\t}) as any;\n\n\tconst mockContext = { addWatchFile: () => {} };\n\tawait plugin.buildStart?.call(mockContext);\n\n\t// The plugin must not recursively remove the outdir during the first\n\t// compile, even though previousCompilation is undefined. Concurrent\n\t// readers may be holding file handles into outdir.\n\tfor (const call of rmSpy.mock.calls) {\n\t\texpect(call[0]).not.toBe(\"/test-output\");\n\t}\n});\n\ntest(\"vite plugin warm-restart writes nothing when inputs unchanged (#659)\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tconst mockContext = { addWatchFile: () => {} };\n\n\t// First process: compile and persist files to outdir.\n\t{\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\t\tconst plugin = vitePlugin({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\t\tawait plugin.buildStart?.call(mockContext);\n\t}\n\n\t// Second process: simulate a fresh node process by resetting modules so\n\t// the module-scoped `previousCompilation` is undefined again. The plugin\n\t// should seed from on-disk hashes and write zero files (no race window).\n\tvi.resetModules();\n\tconst { paraglideVitePlugin: vitePluginFresh } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\tconst plugin2 = vitePluginFresh({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fs,\n\t}) as any;\n\n\tconst writeFileSpy = vi.spyOn(fs.promises, \"writeFile\");\n\tawait plugin2.buildStart?.call(mockContext);\n\n\texpect(writeFileSpy).not.toHaveBeenCalled();\n});\n\n// Regression test for https://github.com/opral/paraglide-js/issues/741:\n// a new Vite process should validate the persisted inputs and output instead\n// of loading the project and compiling every message again.\ntest(\"vite plugin skips compile on an unchanged fresh process (#741)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst project = await loadProjectInMemory({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\"] },\n\t\t\t}),\n\t\t});\n\t\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\t\tawait saveProjectToDirectory({\n\t\t\tproject,\n\t\t\tpath: \"/project.inlang\",\n\t\t\tfs: fs.promises,\n\t\t});\n\n\t\tconst options = {\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/test-output\",\n\t\t\temitReadme: true,\n\t\t\tfs,\n\t\t};\n\t\tconst mockContext = { addWatchFile: () => {} };\n\t\tconst startFreshProcess = async () => {\n\t\t\tvi.resetModules();\n\t\t\tconst { paraglideVitePlugin } =\n\t\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\t\t\tconst plugin = paraglideVitePlugin(options) as any;\n\t\t\tawait plugin.buildStart?.call(mockContext);\n\t\t};\n\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// The persisted cache makes the unchanged cold restart skip compile().\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// A file added beside a tracked project input invalidates the cache.\n\t\tawait fs.promises.writeFile(\"/project.inlang/new-project-input.txt\", \"new\");\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\n\t\t// Compiler options are part of the cache key.\n\t\toptions.emitReadme = false;\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(3);\n\n\t\t// Generated output is validated too, so edited output self-repairs.\n\t\tawait fs.promises.writeFile(\"/test-output/runtime.js\", \"tampered\");\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(4);\n\t\texpect(\n\t\t\tawait fs.promises.readFile(\"/test-output/runtime.js\", \"utf8\")\n\t\t).not.toBe(\"tampered\");\n\n\t\t// A compiler version change invalidates the persisted cache.\n\t\tconst cacheDirectory = \"/project.inlang/cache/paraglide-js\";\n\t\tfor (const cacheFile of await fs.promises.readdir(cacheDirectory)) {\n\t\t\tconst cachePath = `${cacheDirectory}/${cacheFile}`;\n\t\t\tconst cache = JSON.parse(await fs.promises.readFile(cachePath, \"utf8\"));\n\t\t\tcache.compilerVersion = \"0.0.0-stale\";\n\t\t\tawait fs.promises.writeFile(cachePath, JSON.stringify(cache));\n\t\t}\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(5);\n\n\t\t// A syntactically valid but malformed cache is treated as a miss.\n\t\tfor (const cacheFile of await fs.promises.readdir(cacheDirectory)) {\n\t\t\tconst cachePath = `${cacheDirectory}/${cacheFile}`;\n\t\t\tconst cache = JSON.parse(await fs.promises.readFile(cachePath, \"utf8\"));\n\t\t\tcache.outputHashes = null;\n\t\t\tawait fs.promises.writeFile(cachePath, JSON.stringify(cache));\n\t\t}\n\t\tawait startFreshProcess();\n\t\texpect(compileSpy).toHaveBeenCalledTimes(6);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// Regression test for https://github.com/opral/paraglide-js/issues/693:\n// `vite build` fires buildStart once per environment (client, ssr) and each\n// run used to do a full compile() — project loading + message compilation —\n// even though the inputs hadn't changed.\ntest(\"vite plugin skips compile() when buildStart fires again with unchanged inputs (#693)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst project = await loadProjectInMemory({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: {\n\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\n\t\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t\tawait saveProjectToDirectory({\n\t\t\tproject,\n\t\t\tpath: \"/project.inlang\",\n\t\t\tfs: fs.promises,\n\t\t});\n\n\t\tconst plugin = vitePlugin({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\t// First environment (e.g. client) compiles.\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// Second environment (e.g. ssr) — inputs unchanged, compile skipped.\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// Changing an input file invalidates the digest and recompiles.\n\t\tconst settingsPath = \"/project.inlang/settings.json\";\n\t\tconst settings = JSON.parse(\n\t\t\tawait fs.promises.readFile(settingsPath, \"utf-8\")\n\t\t);\n\t\tsettings.locales = [\"en\", \"de\", \"fr\", \"es\"];\n\t\tawait fs.promises.writeFile(settingsPath, JSON.stringify(settings));\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// A new file added next to tracked inputs must invalidate the digest via\n// the directory-listing part of the hash, not only edits to known files.\ntest(\"vite plugin recompiles when a file is added to a tracked directory (#693)\", async () => {\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst project = await loadProjectInMemory({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\"] },\n\t\t\t}),\n\t\t});\n\n\t\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t\tawait saveProjectToDirectory({\n\t\t\tproject,\n\t\t\tpath: \"/project.inlang\",\n\t\t\tfs: fs.promises,\n\t\t});\n\n\t\tconst plugin = vitePlugin({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\t// No tracked file changed, but the listing of a tracked directory did.\n\t\tawait fs.promises.writeFile(\"/project.inlang/added-later.txt\", \"new\");\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// After a failed compile the stored digest must not be reused: restoring an\n// input to its previous content has to trigger a real recompile, because the\n// failed attempt may have left no (or partial) output.\ntest(\"vite plugin does not reuse a digest from before a failed compile (#693)\", async () => {\n\tprocess.env.NODE_ENV = \"development\";\n\n\tconst actualCompileModule = await vi.importActual<\n\t\ttypeof import(\"../compiler/compile.js\")\n\t>(\"../compiler/compile.js\");\n\tconst compileSpy = vi.fn(actualCompileModule.compile);\n\tvi.doMock(\"../compiler/compile.js\", () => ({\n\t\t...actualCompileModule,\n\t\tcompile: compileSpy,\n\t}));\n\n\ttry {\n\t\tconst { paraglideVitePlugin: vitePlugin } =\n\t\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\t\tconst project = await loadProjectInMemory({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\", \"de\"] },\n\t\t\t}),\n\t\t});\n\n\t\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t\tawait saveProjectToDirectory({\n\t\t\tproject,\n\t\t\tpath: \"/project.inlang\",\n\t\t\tfs: fs.promises,\n\t\t});\n\n\t\tconst plugin = vitePlugin({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/test-output\",\n\t\t\tfs: fs,\n\t\t}) as any;\n\n\t\tconst mockContext = { addWatchFile: () => {} };\n\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(1);\n\n\t\tconst settingsPath = \"/project.inlang/settings.json\";\n\t\tconst originalSettings = await fs.promises.readFile(settingsPath, \"utf-8\");\n\n\t\t// Break the settings file — the compile attempt fails (dev mode\n\t\t// swallows the error) and must clear the stored digest.\n\t\tawait fs.promises.writeFile(settingsPath, \"{ not json\");\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(2);\n\n\t\t// Restore the exact original content. The digest now matches the one\n\t\t// from before the failure — it must have been cleared, so this\n\t\t// buildStart has to compile again instead of skipping.\n\t\tawait fs.promises.writeFile(settingsPath, originalSettings);\n\t\tawait plugin.buildStart?.call(mockContext);\n\t\texpect(compileSpy).toHaveBeenCalledTimes(3);\n\t} finally {\n\t\tvi.doUnmock(\"../compiler/compile.js\");\n\t}\n});\n\n// Two plugin instances with different filesystems must not share the tracked\n// fs wrapper or cached compilation state — each compiles into its own fs.\ntest(\"vite plugin instances with different fs compile against their own fs (#693)\", async () => {\n\tconst { paraglideVitePlugin: vitePlugin } =\n\t\tawait import(\"../bundler-plugins/vite.js\");\n\n\tconst makeProjectFs = async () => {\n\t\tconst project = await loadProjectInMemory({\n\t\t\tblob: await newProject({\n\t\t\t\tsettings: { baseLocale: \"en\", locales: [\"en\"] },\n\t\t\t}),\n\t\t});\n\t\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\t\tawait saveProjectToDirectory({\n\t\t\tproject,\n\t\t\tpath: \"/project.inlang\",\n\t\t\tfs: fs.promises,\n\t\t});\n\t\treturn fs;\n\t};\n\n\tconst fsA = await makeProjectFs();\n\tconst fsB = await makeProjectFs();\n\n\tconst mockContext = { addWatchFile: () => {} };\n\n\tconst pluginA = vitePlugin({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fsA,\n\t}) as any;\n\tawait pluginA.buildStart?.call(mockContext);\n\n\tconst pluginB = vitePlugin({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/test-output\",\n\t\tfs: fsB,\n\t}) as any;\n\tawait pluginB.buildStart?.call(mockContext);\n\n\t// B's output must exist in B's filesystem — with a shared tracked fs it\n\t// would have been read from and written into A's filesystem instead.\n\tconst outputB = await fsB.promises.readdir(\"/test-output\");\n\texpect(outputB.length).toBeGreaterThan(0);\n});\n"]}
|
|
@@ -65,7 +65,14 @@ export const compileCommand = new Command()
|
|
|
65
65
|
if (!options.watch) {
|
|
66
66
|
logger.info(`Compiling inlang project ...`);
|
|
67
67
|
try {
|
|
68
|
-
await
|
|
68
|
+
const previousCompilation = await seedPreviousCompilationFromOutdir({
|
|
69
|
+
outdir: compileOptions.outdir,
|
|
70
|
+
});
|
|
71
|
+
await compile({
|
|
72
|
+
...compileOptions,
|
|
73
|
+
previousCompilation,
|
|
74
|
+
cleanOutdir: false,
|
|
75
|
+
});
|
|
69
76
|
}
|
|
70
77
|
catch (e) {
|
|
71
78
|
logger.error("Error while compiling inlang project.");
|
|
@@ -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 { DEFAULT_OUTDIR, DEFAULT_PROJECT_PATH } from \"../../defaults.js\";\nimport { compile, type CompilationResult } from \"../../../compiler/compile.js\";\nimport { seedPreviousCompilationFromOutdir } from \"../../../compiler/seed-previous-compilation.js\";\nimport {\n\tdefaultCompilerOptions,\n\ttype CompilerOptions,\n} from \"../../../compiler/compiler-options.js\";\nimport {\n\tcreateTrackedFs,\n\tgetWatchTargets,\n} from \"../../../services/file-watching/tracked-fs.js\";\n\nconst parseOutputStructure = (\n\tvalue: string\n): NonNullable<CompilerOptions[\"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.requiredOption(\n\t\t\"--project <path>\",\n\t\t'The path to the inlang project. Example: \"./project.inlang\"',\n\t\tDEFAULT_PROJECT_PATH\n\t)\n\t.requiredOption(\n\t\t\"--outdir <path>\",\n\t\t'The path to the output directory. Example: \"./src/paraglide\"',\n\t\tDEFAULT_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)\",\n\t\tdefaultCompilerOptions.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\",\n\t\tdefaultCompilerOptions.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\",\n\t\tdefaultCompilerOptions.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)\",\n\t\tdefaultCompilerOptions.emitReadme\n\t)\n\t.option(\n\t\t\"--no-emit-readme\",\n\t\t\"Do not emit README.md in the output directory\"\n\t)\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\"--output-structure <structure>\",\n\t\t[\n\t\t\t'The output structure for compiled messages. Either \"message-modules\" or \"locale-modules\".',\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\tdefaultCompilerOptions.outputStructure\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?: CompilerOptions[\"strategy\"];\n\t\t\temitTsDeclarations?: CompilerOptions[\"emitTsDeclarations\"];\n\t\t\temitGitIgnore?: CompilerOptions[\"emitGitIgnore\"];\n\t\t\temitPrettierIgnore?: CompilerOptions[\"emitPrettierIgnore\"];\n\t\t\temitReadme?: CompilerOptions[\"emitReadme\"];\n\t\t\tisServer?: CompilerOptions[\"isServer\"];\n\t\t\toutputStructure?: CompilerOptions[\"outputStructure\"];\n\t\t\twatch?: boolean;\n\t\t}) => {\n\t\t\tconst logger = new Logger({ silent: options.silent, prefix: true });\n\t\t\tconst path = resolve(process.cwd(), options.project);\n\n\t\t\tconst compileOptions = {\n\t\t\t\tproject: path,\n\t\t\t\toutdir: options.outdir,\n\t\t\t\tstrategy: options.strategy ?? defaultCompilerOptions.strategy,\n\t\t\t\temitTsDeclarations:\n\t\t\t\t\toptions.emitTsDeclarations ??\n\t\t\t\t\tdefaultCompilerOptions.emitTsDeclarations,\n\t\t\t\temitGitIgnore:\n\t\t\t\t\toptions.emitGitIgnore ?? defaultCompilerOptions.emitGitIgnore,\n\t\t\t\temitPrettierIgnore:\n\t\t\t\t\toptions.emitPrettierIgnore ??\n\t\t\t\t\tdefaultCompilerOptions.emitPrettierIgnore,\n\t\t\t\temitReadme: options.emitReadme ?? defaultCompilerOptions.emitReadme,\n\t\t\t\tisServer: options.isServer ?? defaultCompilerOptions.isServer,\n\t\t\t\toutputStructure:\n\t\t\t\t\toptions.outputStructure ??\n\t\t\t\t\tdefaultCompilerOptions.outputStructure,\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\tawait compile(compileOptions);\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\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: options.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\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}: ${(error as Error).message}`\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 (error) {\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\tif (!filename) {\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\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 (error) {\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 (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(await seedPreviousCompilationFromOutdir({\n\t\t\t\t\t\t\toutdir: compileOptions.outdir,\n\t\t\t\t\t\t}));\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(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 { DEFAULT_OUTDIR, DEFAULT_PROJECT_PATH } from \"../../defaults.js\";\nimport { compile, type CompilationResult } from \"../../../compiler/compile.js\";\nimport { seedPreviousCompilationFromOutdir } from \"../../../compiler/seed-previous-compilation.js\";\nimport {\n\tdefaultCompilerOptions,\n\ttype CompilerOptions,\n} from \"../../../compiler/compiler-options.js\";\nimport {\n\tcreateTrackedFs,\n\tgetWatchTargets,\n} from \"../../../services/file-watching/tracked-fs.js\";\n\nconst parseOutputStructure = (\n\tvalue: string\n): NonNullable<CompilerOptions[\"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.requiredOption(\n\t\t\"--project <path>\",\n\t\t'The path to the inlang project. Example: \"./project.inlang\"',\n\t\tDEFAULT_PROJECT_PATH\n\t)\n\t.requiredOption(\n\t\t\"--outdir <path>\",\n\t\t'The path to the output directory. Example: \"./src/paraglide\"',\n\t\tDEFAULT_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)\",\n\t\tdefaultCompilerOptions.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\",\n\t\tdefaultCompilerOptions.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\",\n\t\tdefaultCompilerOptions.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)\",\n\t\tdefaultCompilerOptions.emitReadme\n\t)\n\t.option(\n\t\t\"--no-emit-readme\",\n\t\t\"Do not emit README.md in the output directory\"\n\t)\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\"--output-structure <structure>\",\n\t\t[\n\t\t\t'The output structure for compiled messages. Either \"message-modules\" or \"locale-modules\".',\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\tdefaultCompilerOptions.outputStructure\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?: CompilerOptions[\"strategy\"];\n\t\t\temitTsDeclarations?: CompilerOptions[\"emitTsDeclarations\"];\n\t\t\temitGitIgnore?: CompilerOptions[\"emitGitIgnore\"];\n\t\t\temitPrettierIgnore?: CompilerOptions[\"emitPrettierIgnore\"];\n\t\t\temitReadme?: CompilerOptions[\"emitReadme\"];\n\t\t\tisServer?: CompilerOptions[\"isServer\"];\n\t\t\toutputStructure?: CompilerOptions[\"outputStructure\"];\n\t\t\twatch?: boolean;\n\t\t}) => {\n\t\t\tconst logger = new Logger({ silent: options.silent, prefix: true });\n\t\t\tconst path = resolve(process.cwd(), options.project);\n\n\t\t\tconst compileOptions = {\n\t\t\t\tproject: path,\n\t\t\t\toutdir: options.outdir,\n\t\t\t\tstrategy: options.strategy ?? defaultCompilerOptions.strategy,\n\t\t\t\temitTsDeclarations:\n\t\t\t\t\toptions.emitTsDeclarations ??\n\t\t\t\t\tdefaultCompilerOptions.emitTsDeclarations,\n\t\t\t\temitGitIgnore:\n\t\t\t\t\toptions.emitGitIgnore ?? defaultCompilerOptions.emitGitIgnore,\n\t\t\t\temitPrettierIgnore:\n\t\t\t\t\toptions.emitPrettierIgnore ??\n\t\t\t\t\tdefaultCompilerOptions.emitPrettierIgnore,\n\t\t\t\temitReadme: options.emitReadme ?? defaultCompilerOptions.emitReadme,\n\t\t\t\tisServer: options.isServer ?? defaultCompilerOptions.isServer,\n\t\t\t\toutputStructure:\n\t\t\t\t\toptions.outputStructure ??\n\t\t\t\t\tdefaultCompilerOptions.outputStructure,\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 = await seedPreviousCompilationFromOutdir({\n\t\t\t\t\t\toutdir: compileOptions.outdir,\n\t\t\t\t\t});\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\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: options.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\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}: ${(error as Error).message}`\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 (error) {\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\tif (!filename) {\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\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 (error) {\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 (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(await seedPreviousCompilationFromOutdir({\n\t\t\t\t\t\t\toutdir: compileOptions.outdir,\n\t\t\t\t\t\t}));\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(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"]}
|
|
@@ -11,6 +11,7 @@ beforeEach(() => {
|
|
|
11
11
|
initialSigintListeners = process.listeners("SIGINT");
|
|
12
12
|
});
|
|
13
13
|
afterEach(async () => {
|
|
14
|
+
vi.restoreAllMocks();
|
|
14
15
|
for (const listener of process.listeners("SIGINT")) {
|
|
15
16
|
if (!initialSigintListeners.includes(listener)) {
|
|
16
17
|
process.removeListener("SIGINT", listener);
|
|
@@ -20,6 +21,50 @@ afterEach(async () => {
|
|
|
20
21
|
await rm(directory, { recursive: true, force: true });
|
|
21
22
|
}
|
|
22
23
|
});
|
|
24
|
+
test("compile seeds existing outdir and disables cleaning (#743)", async () => {
|
|
25
|
+
const testDirectory = await mkdtemp(path.join(tmpdir(), "paraglide-cli-"));
|
|
26
|
+
testDirectories.push(testDirectory);
|
|
27
|
+
const outdir = path.join(testDirectory, "output");
|
|
28
|
+
const { writeOutput } = await import("../../../services/file-handling/write-output.js");
|
|
29
|
+
await writeOutput({
|
|
30
|
+
directory: outdir,
|
|
31
|
+
output: {
|
|
32
|
+
"runtime.js": "export const runtime = true;",
|
|
33
|
+
},
|
|
34
|
+
fs: nodeFs,
|
|
35
|
+
});
|
|
36
|
+
const compileMock = vi.fn().mockResolvedValue({
|
|
37
|
+
outputHashes: {
|
|
38
|
+
"runtime.js": "next-hash",
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
vi.doMock("../../../compiler/compile.js", () => ({
|
|
42
|
+
compile: compileMock,
|
|
43
|
+
}));
|
|
44
|
+
const exitError = new Error("process.exit");
|
|
45
|
+
const exitMock = vi.spyOn(process, "exit").mockImplementation(() => {
|
|
46
|
+
throw exitError;
|
|
47
|
+
});
|
|
48
|
+
const { compileCommand } = await import("./command.js");
|
|
49
|
+
await expect(compileCommand.parseAsync([
|
|
50
|
+
"--project",
|
|
51
|
+
path.join(testDirectory, "project.inlang"),
|
|
52
|
+
"--outdir",
|
|
53
|
+
outdir,
|
|
54
|
+
"--silent",
|
|
55
|
+
], { from: "user" })).rejects.toBe(exitError);
|
|
56
|
+
expect(compileMock).toHaveBeenCalledTimes(1);
|
|
57
|
+
expect(compileMock).toHaveBeenCalledWith(expect.objectContaining({
|
|
58
|
+
outdir,
|
|
59
|
+
cleanOutdir: false,
|
|
60
|
+
previousCompilation: {
|
|
61
|
+
outputHashes: {
|
|
62
|
+
"runtime.js": expect.any(String),
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
}));
|
|
66
|
+
expect(exitMock).toHaveBeenCalledWith(0);
|
|
67
|
+
});
|
|
23
68
|
test("compile --watch seeds existing outdir and disables cleaning on first compile (#688)", async () => {
|
|
24
69
|
const testDirectory = await mkdtemp(path.join(tmpdir(), "paraglide-cli-"));
|
|
25
70
|
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 } from \"node:fs/promises\";\nimport * as nodeFs from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, 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\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\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"]}
|
|
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 } from \"node:fs/promises\";\nimport * as nodeFs from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, beforeEach, 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\ntest(\"compile seeds existing outdir and disables cleaning (#743)\", 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\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(testDirectory, \"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 --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"]}
|
package/dist/compiler/compile.js
CHANGED
|
@@ -2,10 +2,6 @@ import { loadProjectFromDirectory } from "@inlang/sdk";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { compileProject } from "./compile-project.js";
|
|
4
4
|
import { writeOutput } from "../services/file-handling/write-output.js";
|
|
5
|
-
// import {
|
|
6
|
-
// getLocalAccount,
|
|
7
|
-
// saveLocalAccount,
|
|
8
|
-
// } from "../services/account/index.js";
|
|
9
5
|
import { defaultCompilerOptions, } from "./compiler-options.js";
|
|
10
6
|
import { Logger } from "../services/logger/index.js";
|
|
11
7
|
// This is a workaround to prevent multiple compilations from running at the same time.
|
|
@@ -37,11 +33,9 @@ export async function compile(options) {
|
|
|
37
33
|
try {
|
|
38
34
|
const fs = withDefaultOptions.fs ?? (await import("node:fs"));
|
|
39
35
|
const absoluteOutdir = path.resolve(process.cwd(), withDefaultOptions.outdir);
|
|
40
|
-
// const localAccount = getLocalAccount({ fs });
|
|
41
36
|
const project = await loadProjectFromDirectory({
|
|
42
37
|
path: withDefaultOptions.project,
|
|
43
38
|
fs,
|
|
44
|
-
// account: localAccount,
|
|
45
39
|
});
|
|
46
40
|
const output = await compileProject({
|
|
47
41
|
compilerOptions: withDefaultOptions,
|
|
@@ -55,15 +49,6 @@ export async function compile(options) {
|
|
|
55
49
|
fs: fs.promises,
|
|
56
50
|
previousOutputHashes: options.previousCompilation?.outputHashes,
|
|
57
51
|
});
|
|
58
|
-
// if (!localAccount) {
|
|
59
|
-
// const activeAccount = await project.lix.db
|
|
60
|
-
// .selectFrom("active_account as aa")
|
|
61
|
-
// .innerJoin("account_all as a", "a.id", "aa.account_id")
|
|
62
|
-
// .where("a.lixcol_version_id", "=", "global")
|
|
63
|
-
// .select(["a.id", "a.name"])
|
|
64
|
-
// .executeTakeFirstOrThrow();
|
|
65
|
-
// saveLocalAccount({ fs, account: activeAccount });
|
|
66
|
-
// }
|
|
67
52
|
const warningsAndErrors = await project.errors.get();
|
|
68
53
|
for (const warningOrError of warningsAndErrors) {
|
|
69
54
|
logger.warn(warningOrError);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/compiler/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxE,
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/compiler/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EACN,sBAAsB,GAEtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAErD,uFAAuF;AACvF,kFAAkF;AAClF,IAAI,qBAAqB,GAEb,IAAI,CAAC;AAMjB,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAE5B;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC5B,OAEC;IAED,MAAM,kBAAkB,GAAG;QAC1B,GAAG,sBAAsB;QACzB,GAAG,OAAO;KACV,CAAC;IAEF,IAAI,qBAAqB,EAAE,CAAC;QAC3B,MAAM,qBAAqB,CAAC;IAC7B,CAAC;IAED,qBAAqB,GAAG,CAAC,KAAK,IAAI,EAAE;QACnC,IAAI,CAAC;YACJ,MAAM,EAAE,GAAG,kBAAkB,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAClC,OAAO,CAAC,GAAG,EAAE,EACb,kBAAkB,CAAC,MAAM,CACzB,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC;gBAC9C,IAAI,EAAE,kBAAkB,CAAC,OAAO;gBAChC,EAAE;aACF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;gBACnC,eAAe,EAAE,kBAAkB;gBACnC,OAAO;gBACP,WAAW,EAAE,kBAAkB,CAAC,OAAO;aACvC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC;gBACtC,SAAS,EAAE,cAAc;gBACzB,MAAM;gBACN,cAAc,EAAE,kBAAkB,CAAC,WAAW;gBAC9C,EAAE,EAAE,EAAE,CAAC,QAAQ;gBACf,oBAAoB,EAAE,OAAO,CAAC,mBAAmB,EAAE,YAAY;aAC/D,CAAC,CAAC;YAEH,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAErD,KAAK,MAAM,cAAc,IAAI,iBAAiB,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,CAAC;YAED,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,OAAO,EAAE,YAAY,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,uCAAuC;YACvC,qBAAqB,GAAG,IAAI,CAAC;YAC7B,MAAM,CAAC,CAAC;QACT,CAAC;IACF,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAC5D,qBAAqB,GAAG,IAAI,CAAC;IAE7B,OAAO,MAAM,CAAC;AACf,CAAC","sourcesContent":["import { loadProjectFromDirectory } from \"@inlang/sdk\";\nimport path from \"node:path\";\nimport { compileProject } from \"./compile-project.js\";\nimport { writeOutput } from \"../services/file-handling/write-output.js\";\nimport {\n\tdefaultCompilerOptions,\n\ttype CompilerOptions,\n} from \"./compiler-options.js\";\nimport { Logger } from \"../services/logger/index.js\";\n\n// This is a workaround to prevent multiple compilations from running at the same time.\n// https://github.com/opral/inlang-paraglide-js/issues/320#issuecomment-2596951222\nlet compilationInProgress: Promise<{\n\toutputHashes: Record<string, string> | undefined;\n}> | null = null;\n\nexport type CompilationResult = {\n\toutputHashes: Record<string, string> | undefined;\n};\n\nconst logger = new Logger();\n\n/**\n * Loads, compiles, and writes the output to disk.\n *\n * This is the main function to use when you want to compile a project.\n * If you want to adjust inlang project loading, or the output, use\n * `compileProject()` instead.\n *\n * @example\n * await compile({\n * project: 'path/to/project',\n * outdir: 'path/to/output',\n * })\n */\nexport async function compile(\n\toptions: CompilerOptions & {\n\t\tpreviousCompilation?: CompilationResult;\n\t}\n): Promise<CompilationResult> {\n\tconst withDefaultOptions = {\n\t\t...defaultCompilerOptions,\n\t\t...options,\n\t};\n\n\tif (compilationInProgress) {\n\t\tawait compilationInProgress;\n\t}\n\n\tcompilationInProgress = (async () => {\n\t\ttry {\n\t\t\tconst fs = withDefaultOptions.fs ?? (await import(\"node:fs\"));\n\t\t\tconst absoluteOutdir = path.resolve(\n\t\t\t\tprocess.cwd(),\n\t\t\t\twithDefaultOptions.outdir\n\t\t\t);\n\n\t\t\tconst project = await loadProjectFromDirectory({\n\t\t\t\tpath: withDefaultOptions.project,\n\t\t\t\tfs,\n\t\t\t});\n\n\t\t\tconst output = await compileProject({\n\t\t\t\tcompilerOptions: withDefaultOptions,\n\t\t\t\tproject,\n\t\t\t\tprojectPath: withDefaultOptions.project,\n\t\t\t});\n\n\t\t\tconst outputHashes = await writeOutput({\n\t\t\t\tdirectory: absoluteOutdir,\n\t\t\t\toutput,\n\t\t\t\tcleanDirectory: withDefaultOptions.cleanOutdir,\n\t\t\t\tfs: fs.promises,\n\t\t\t\tpreviousOutputHashes: options.previousCompilation?.outputHashes,\n\t\t\t});\n\n\t\t\tconst warningsAndErrors = await project.errors.get();\n\n\t\t\tfor (const warningOrError of warningsAndErrors) {\n\t\t\t\tlogger.warn(warningOrError);\n\t\t\t}\n\n\t\t\tawait project.close();\n\n\t\t\treturn { outputHashes };\n\t\t} catch (e) {\n\t\t\t// release the lock in case of an error\n\t\t\tcompilationInProgress = null;\n\t\t\tthrow e;\n\t\t}\n\t})();\n\n\tconst result = structuredClone(await compilationInProgress);\n\tcompilationInProgress = null;\n\n\treturn result;\n}\n"]}
|
|
@@ -2,7 +2,6 @@ import { loadProjectInMemory, newProject, saveProjectToDirectory, } from "@inlan
|
|
|
2
2
|
import { memfs } from "memfs";
|
|
3
3
|
import { test, expect, vi } from "vitest";
|
|
4
4
|
import { compile } from "./compile.js";
|
|
5
|
-
import { getAccountFilePath } from "../services/account/index.js";
|
|
6
5
|
import { defaultCompilerOptions } from "./compiler-options.js";
|
|
7
6
|
import consola from "consola";
|
|
8
7
|
test("loads a project and compiles it", async () => {
|
|
@@ -30,57 +29,6 @@ test("loads a project and compiles it", async () => {
|
|
|
30
29
|
//runtime.js and messages.js are always compiled with the default options
|
|
31
30
|
expect(files).toEqual(expect.arrayContaining(["runtime.js", "server.js", "messages.js"]));
|
|
32
31
|
});
|
|
33
|
-
test.skip("loads a local account from app data if exists", async () => {
|
|
34
|
-
const accountPath = getAccountFilePath();
|
|
35
|
-
const fs = memfs({
|
|
36
|
-
[accountPath]: JSON.stringify({ id: "mock", name: "test" }),
|
|
37
|
-
}).fs;
|
|
38
|
-
const spy = vi.spyOn(fs, "readFileSync");
|
|
39
|
-
const project = await loadProjectInMemory({
|
|
40
|
-
blob: await newProject({
|
|
41
|
-
settings: {
|
|
42
|
-
baseLocale: "en",
|
|
43
|
-
locales: ["en", "de", "fr"],
|
|
44
|
-
},
|
|
45
|
-
}),
|
|
46
|
-
});
|
|
47
|
-
await saveProjectToDirectory({
|
|
48
|
-
project,
|
|
49
|
-
path: "/project.inlang",
|
|
50
|
-
fs: fs.promises,
|
|
51
|
-
});
|
|
52
|
-
await compile({
|
|
53
|
-
project: "/project.inlang",
|
|
54
|
-
outdir: "/output",
|
|
55
|
-
fs: fs,
|
|
56
|
-
});
|
|
57
|
-
expect(spy).toHaveBeenCalledWith(accountPath, "utf8");
|
|
58
|
-
});
|
|
59
|
-
test.skip("saves the local account to app data if not exists", async () => {
|
|
60
|
-
const accountPath = getAccountFilePath();
|
|
61
|
-
const fs = memfs().fs;
|
|
62
|
-
const project = await loadProjectInMemory({
|
|
63
|
-
blob: await newProject({
|
|
64
|
-
settings: {
|
|
65
|
-
baseLocale: "en",
|
|
66
|
-
locales: ["en", "de", "fr"],
|
|
67
|
-
},
|
|
68
|
-
}),
|
|
69
|
-
});
|
|
70
|
-
await saveProjectToDirectory({
|
|
71
|
-
project,
|
|
72
|
-
path: "/project.inlang",
|
|
73
|
-
fs: fs.promises,
|
|
74
|
-
});
|
|
75
|
-
await compile({
|
|
76
|
-
project: "/project.inlang",
|
|
77
|
-
outdir: "/output",
|
|
78
|
-
fs: fs,
|
|
79
|
-
});
|
|
80
|
-
const account = JSON.parse(await fs.promises.readFile(accountPath, "utf8"));
|
|
81
|
-
expect(account).toHaveProperty("id");
|
|
82
|
-
expect(account).toHaveProperty("name");
|
|
83
|
-
});
|
|
84
32
|
test("cleans the output directory", async () => {
|
|
85
33
|
const fs = memfs().fs;
|
|
86
34
|
const project = await loadProjectInMemory({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../src/compiler/compile.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 { test, expect, vi } from \"vitest\";\nimport { compile } from \"./compile.js\";\nimport { getAccountFilePath } from \"../services/account/index.js\";\nimport type { Runtime } from \"./runtime/type.js\";\nimport { defaultCompilerOptions } from \"./compiler-options.js\";\nimport consola from \"consola\";\n\ntest(\"loads a project and compiles it\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\tconst files = await fs.promises.readdir(\"/output\");\n\n\t//runtime.js and messages.js are always compiled with the default options\n\texpect(files).toEqual(\n\t\texpect.arrayContaining([\"runtime.js\", \"server.js\", \"messages.js\"])\n\t);\n});\n\ntest.skip(\"loads a local account from app data if exists\", async () => {\n\tconst accountPath = getAccountFilePath();\n\tconst fs = memfs({\n\t\t[accountPath]: JSON.stringify({ id: \"mock\", name: \"test\" }),\n\t}).fs as unknown as typeof import(\"node:fs\");\n\n\tconst spy = vi.spyOn(fs, \"readFileSync\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\texpect(spy).toHaveBeenCalledWith(accountPath, \"utf8\");\n});\n\ntest.skip(\"saves the local account to app data if not exists\", async () => {\n\tconst accountPath = getAccountFilePath();\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\tconst account = JSON.parse(await fs.promises.readFile(accountPath, \"utf8\"));\n\n\texpect(account).toHaveProperty(\"id\");\n\texpect(account).toHaveProperty(\"name\");\n});\n\ntest(\"cleans the output directory\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({}),\n\t});\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait fs.promises.mkdir(\"/output/subdir\", { recursive: true });\n\tawait fs.promises.writeFile(\"/output/subdir/x.js\", \"console.log('hello')\");\n\tawait fs.promises.writeFile(\"/output/y.js\", \"console.log('hello')\");\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\tconst outputDir = await fs.promises.readdir(\"/output\");\n\tconst outputSubDir = fs.existsSync(\"/output/subdir\");\n\n\texpect(outputDir).not.toContain(\"y.js\");\n\texpect(outputSubDir).toBe(false);\n});\n\n// Regression coverage for https://github.com/opral/paraglide-js/issues/581\ntest(\"runtime output strips sourcemap references\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\tconst runtimeFile = await fs.promises.readFile(\"/output/runtime.js\", \"utf8\");\n\tconst serverFile = await fs.promises.readFile(\"/output/server.js\", \"utf8\");\n\n\texpect(runtimeFile).not.toMatch(/sourceMappingURL=/);\n\texpect(serverFile).not.toMatch(/sourceMappingURL=/);\n});\n\ntest(\"experimental middleware locale splitting uses globalThis.__paraglide.ssr\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs,\n\t\texperimentalMiddlewareLocaleSplitting: true,\n\t});\n\n\tconst runtimeFile = await fs.promises.readFile(\"/output/runtime.js\", \"utf8\");\n\tconst serverFile = await fs.promises.readFile(\"/output/server.js\", \"utf8\");\n\n\texpect(runtimeFile).toContain(\"(globalThis).__paraglide =\");\n\texpect(runtimeFile).toContain(\"(globalThis).__paraglide.ssr =\");\n\texpect(runtimeFile).not.toContain(\"__paraglide_ssr\");\n\texpect(serverFile).toContain(\"globalThis.__paraglide = globalThis.__paraglide ?? {};\");\n\texpect(serverFile).toContain(\"globalThis.__paraglide.ssr = {\");\n\texpect(serverFile).toContain(\n\t\tString.raw`replace(/<\\/(script)/gi, \"<\\\\/$1\")`\n\t);\n\texpect(serverFile).not.toContain(\"__paraglide_ssr\");\n});\n\ntest(\"doesn't clean the output directory if option is set to false\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({}),\n\t});\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait fs.promises.mkdir(\"/output/subdir\", { recursive: true });\n\tawait fs.promises.writeFile(\"/output/subdir/x.js\", \"console.log('hello')\");\n\tawait fs.promises.writeFile(\"/output/y.js\", \"console.log('hello')\");\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tcleanOutdir: false,\n\t\tfs: fs,\n\t});\n\n\tconst outputDir = await fs.promises.readdir(\"/output\");\n\tconst outputSubDir = fs.existsSync(\"/output/subdir\");\n\n\texpect(outputDir).toContain(\"y.js\");\n\texpect(outputSubDir).toBe(true);\n});\n\ntest(\"multiple compile calls do not interfere with each other\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\t// different project settings to test compile output\n\tawait project.settings.set({\n\t\t...(await project.settings.get()),\n\t\tbaseLocale: \"de\",\n\t\tlocales: [\"de\"],\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project2.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tconst compilations = [\n\t\tcompile({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/output\",\n\t\t\tfs: fs,\n\t\t}),\n\t\tcompile({\n\t\t\tproject: \"/project2.inlang\",\n\t\t\toutdir: \"/output\",\n\t\t\tfs: fs,\n\t\t}),\n\t];\n\n\tawait Promise.all(compilations);\n\n\tconst runtimeFile = await fs.promises.readFile(\"/output/runtime.js\", \"utf8\");\n\n\tconst runtime = (await import(\n\t\t\"data:text/javascript;base64,\" +\n\t\t\tBuffer.from(\n\t\t\t\t// replace the\n\t\t\t\truntimeFile.replace(\n\t\t\t\t\t`import \"@inlang/paraglide-js/urlpattern-polyfill\";`,\n\t\t\t\t\t\"\"\n\t\t\t\t),\n\t\t\t\t\"utf-8\"\n\t\t\t).toString(\"base64\")\n\t)) as Runtime;\n\n\t// expecting the second compile step to overwrite the first\n\texpect(runtime.baseLocale).toBe(\"de\");\n\texpect(runtime.locales).toEqual([\"de\"]);\n});\n\ntest(\"emits additional files\", async () => {\n\tconst additionalFiles = {\n\t\t\"adapter/component.svelte\": \"<script>console.log('hello')</script>\",\n\t\t\"adapter.js\": \"console.log('hello')\",\n\t};\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t\tadditionalFiles,\n\t});\n\n\tconst outputDir = await fs.promises.readdir(\"/output\");\n\tconst adapterDir = await fs.promises.readdir(\"/output/adapter\");\n\n\texpect(outputDir).toEqual(\n\t\texpect.arrayContaining([\n\t\t\t\"runtime.js\",\n\t\t\t\"server.js\",\n\t\t\t\"messages.js\",\n\t\t\t\"adapter.js\",\n\t\t])\n\t);\n\n\texpect(adapterDir).toEqual([\"component.svelte\"]);\n});\n\ntest(\"includes eslint-disable comment\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tincludeEslintDisableComment: true,\n\t\tfs: fs,\n\t});\n\n\tconst messages = await fs.promises.readFile(\"/output/messages.js\", \"utf8\");\n\n\texpect(messages).toContain(\"/* eslint-disable */\");\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tincludeEslintDisableComment: false,\n\t\tfs: fs,\n\t});\n\n\tconst messagesWithoutComment = await fs.promises.readFile(\n\t\t\"/output/messages.js\",\n\t\t\"utf8\"\n\t);\n\n\texpect(messagesWithoutComment).not.toContain(\"/* eslint-disable */\");\n});\n\ntest(\"default compiler options should include cookied, variable and baseLocale to ensure easy try out of paraglide js, working both in server and browser environemnts\", () => {\n\t// someone trying out paraglide js should be able to call `getLocale()` and `setLocale()`\n\t// without getting an error slammed in their face saying \"define your strategy\".\n\t//\n\t// instead, make the apis work out of the box and once the developer is convinced that\n\t// paraglide js is the right tool for them, they can then define their own strategy.\n\n\texpect(defaultCompilerOptions.strategy).toEqual([\n\t\t\"cookie\",\n\t\t\"globalVariable\",\n\t\t\"baseLocale\",\n\t]);\n});\n\ntest(\"emits warnings for modules that couldn't be imported locally\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t\tmodules: [\"./non-existent-paraglide-plugin.js\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst mock = vi.fn();\n\n\tconsola.mockTypes(() => mock);\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\texpect(mock).toHaveBeenCalled();\n});\n\ntest(\"emits warnings for modules that couldn't be imported via http\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t\tmodules: [\"https://example.com/non-existent-paraglide-plugin.js\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst mock = vi.fn();\n\n\tconsola.mockTypes(() => mock);\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\tconst fetchMock = vi.fn().mockRejectedValue(new TypeError(\"network error\"));\n\tvi.stubGlobal(\"fetch\", fetchMock);\n\n\tconst errorsSpy = vi.spyOn(project.errors, \"get\").mockResolvedValue([\n\t\t{\n\t\t\tmessage:\n\t\t\t\t\"Failed to import module https://example.com/non-existent-paraglide-plugin.js\",\n\t\t} as any,\n\t]);\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\ttry {\n\t\tawait compile({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/output\",\n\t\t\tfs: fs,\n\t\t});\n\t} finally {\n\t\tvi.unstubAllGlobals();\n\t\terrorsSpy.mockRestore();\n\t}\n\n\texpect(mock).toHaveBeenCalled();\n});\n"]}
|
|
1
|
+
{"version":3,"file":"compile.test.js","sourceRoot":"","sources":["../../src/compiler/compile.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 { test, expect, vi } from \"vitest\";\nimport { compile } from \"./compile.js\";\nimport type { Runtime } from \"./runtime/type.js\";\nimport { defaultCompilerOptions } from \"./compiler-options.js\";\nimport consola from \"consola\";\n\ntest(\"loads a project and compiles it\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\tconst files = await fs.promises.readdir(\"/output\");\n\n\t//runtime.js and messages.js are always compiled with the default options\n\texpect(files).toEqual(\n\t\texpect.arrayContaining([\"runtime.js\", \"server.js\", \"messages.js\"])\n\t);\n});\n\ntest(\"cleans the output directory\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({}),\n\t});\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait fs.promises.mkdir(\"/output/subdir\", { recursive: true });\n\tawait fs.promises.writeFile(\"/output/subdir/x.js\", \"console.log('hello')\");\n\tawait fs.promises.writeFile(\"/output/y.js\", \"console.log('hello')\");\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\tconst outputDir = await fs.promises.readdir(\"/output\");\n\tconst outputSubDir = fs.existsSync(\"/output/subdir\");\n\n\texpect(outputDir).not.toContain(\"y.js\");\n\texpect(outputSubDir).toBe(false);\n});\n\n// Regression coverage for https://github.com/opral/paraglide-js/issues/581\ntest(\"runtime output strips sourcemap references\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\tconst runtimeFile = await fs.promises.readFile(\"/output/runtime.js\", \"utf8\");\n\tconst serverFile = await fs.promises.readFile(\"/output/server.js\", \"utf8\");\n\n\texpect(runtimeFile).not.toMatch(/sourceMappingURL=/);\n\texpect(serverFile).not.toMatch(/sourceMappingURL=/);\n});\n\ntest(\"experimental middleware locale splitting uses globalThis.__paraglide.ssr\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs,\n\t\texperimentalMiddlewareLocaleSplitting: true,\n\t});\n\n\tconst runtimeFile = await fs.promises.readFile(\"/output/runtime.js\", \"utf8\");\n\tconst serverFile = await fs.promises.readFile(\"/output/server.js\", \"utf8\");\n\n\texpect(runtimeFile).toContain(\"(globalThis).__paraglide =\");\n\texpect(runtimeFile).toContain(\"(globalThis).__paraglide.ssr =\");\n\texpect(runtimeFile).not.toContain(\"__paraglide_ssr\");\n\texpect(serverFile).toContain(\"globalThis.__paraglide = globalThis.__paraglide ?? {};\");\n\texpect(serverFile).toContain(\"globalThis.__paraglide.ssr = {\");\n\texpect(serverFile).toContain(\n\t\tString.raw`replace(/<\\/(script)/gi, \"<\\\\/$1\")`\n\t);\n\texpect(serverFile).not.toContain(\"__paraglide_ssr\");\n});\n\ntest(\"doesn't clean the output directory if option is set to false\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({}),\n\t});\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait fs.promises.mkdir(\"/output/subdir\", { recursive: true });\n\tawait fs.promises.writeFile(\"/output/subdir/x.js\", \"console.log('hello')\");\n\tawait fs.promises.writeFile(\"/output/y.js\", \"console.log('hello')\");\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tcleanOutdir: false,\n\t\tfs: fs,\n\t});\n\n\tconst outputDir = await fs.promises.readdir(\"/output\");\n\tconst outputSubDir = fs.existsSync(\"/output/subdir\");\n\n\texpect(outputDir).toContain(\"y.js\");\n\texpect(outputSubDir).toBe(true);\n});\n\ntest(\"multiple compile calls do not interfere with each other\", async () => {\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\t// different project settings to test compile output\n\tawait project.settings.set({\n\t\t...(await project.settings.get()),\n\t\tbaseLocale: \"de\",\n\t\tlocales: [\"de\"],\n\t});\n\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project2.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tconst compilations = [\n\t\tcompile({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/output\",\n\t\t\tfs: fs,\n\t\t}),\n\t\tcompile({\n\t\t\tproject: \"/project2.inlang\",\n\t\t\toutdir: \"/output\",\n\t\t\tfs: fs,\n\t\t}),\n\t];\n\n\tawait Promise.all(compilations);\n\n\tconst runtimeFile = await fs.promises.readFile(\"/output/runtime.js\", \"utf8\");\n\n\tconst runtime = (await import(\n\t\t\"data:text/javascript;base64,\" +\n\t\t\tBuffer.from(\n\t\t\t\t// replace the\n\t\t\t\truntimeFile.replace(\n\t\t\t\t\t`import \"@inlang/paraglide-js/urlpattern-polyfill\";`,\n\t\t\t\t\t\"\"\n\t\t\t\t),\n\t\t\t\t\"utf-8\"\n\t\t\t).toString(\"base64\")\n\t)) as Runtime;\n\n\t// expecting the second compile step to overwrite the first\n\texpect(runtime.baseLocale).toBe(\"de\");\n\texpect(runtime.locales).toEqual([\"de\"]);\n});\n\ntest(\"emits additional files\", async () => {\n\tconst additionalFiles = {\n\t\t\"adapter/component.svelte\": \"<script>console.log('hello')</script>\",\n\t\t\"adapter.js\": \"console.log('hello')\",\n\t};\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t\tadditionalFiles,\n\t});\n\n\tconst outputDir = await fs.promises.readdir(\"/output\");\n\tconst adapterDir = await fs.promises.readdir(\"/output/adapter\");\n\n\texpect(outputDir).toEqual(\n\t\texpect.arrayContaining([\n\t\t\t\"runtime.js\",\n\t\t\t\"server.js\",\n\t\t\t\"messages.js\",\n\t\t\t\"adapter.js\",\n\t\t])\n\t);\n\n\texpect(adapterDir).toEqual([\"component.svelte\"]);\n});\n\ntest(\"includes eslint-disable comment\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tincludeEslintDisableComment: true,\n\t\tfs: fs,\n\t});\n\n\tconst messages = await fs.promises.readFile(\"/output/messages.js\", \"utf8\");\n\n\texpect(messages).toContain(\"/* eslint-disable */\");\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tincludeEslintDisableComment: false,\n\t\tfs: fs,\n\t});\n\n\tconst messagesWithoutComment = await fs.promises.readFile(\n\t\t\"/output/messages.js\",\n\t\t\"utf8\"\n\t);\n\n\texpect(messagesWithoutComment).not.toContain(\"/* eslint-disable */\");\n});\n\ntest(\"default compiler options should include cookied, variable and baseLocale to ensure easy try out of paraglide js, working both in server and browser environemnts\", () => {\n\t// someone trying out paraglide js should be able to call `getLocale()` and `setLocale()`\n\t// without getting an error slammed in their face saying \"define your strategy\".\n\t//\n\t// instead, make the apis work out of the box and once the developer is convinced that\n\t// paraglide js is the right tool for them, they can then define their own strategy.\n\n\texpect(defaultCompilerOptions.strategy).toEqual([\n\t\t\"cookie\",\n\t\t\"globalVariable\",\n\t\t\"baseLocale\",\n\t]);\n});\n\ntest(\"emits warnings for modules that couldn't be imported locally\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t\tmodules: [\"./non-existent-paraglide-plugin.js\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst mock = vi.fn();\n\n\tconsola.mockTypes(() => mock);\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\tawait compile({\n\t\tproject: \"/project.inlang\",\n\t\toutdir: \"/output\",\n\t\tfs: fs,\n\t});\n\n\texpect(mock).toHaveBeenCalled();\n});\n\ntest(\"emits warnings for modules that couldn't be imported via http\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\", \"fr\"],\n\t\t\t\tmodules: [\"https://example.com/non-existent-paraglide-plugin.js\"],\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst mock = vi.fn();\n\n\tconsola.mockTypes(() => mock);\n\n\tconst fs = memfs().fs as unknown as typeof import(\"node:fs\");\n\tconst fetchMock = vi.fn().mockRejectedValue(new TypeError(\"network error\"));\n\tvi.stubGlobal(\"fetch\", fetchMock);\n\n\tconst errorsSpy = vi.spyOn(project.errors, \"get\").mockResolvedValue([\n\t\t{\n\t\t\tmessage:\n\t\t\t\t\"Failed to import module https://example.com/non-existent-paraglide-plugin.js\",\n\t\t} as any,\n\t]);\n\n\t// save project to directory to test loading\n\tawait saveProjectToDirectory({\n\t\tproject,\n\t\tpath: \"/project.inlang\",\n\t\tfs: fs.promises,\n\t});\n\n\ttry {\n\t\tawait compile({\n\t\t\tproject: \"/project.inlang\",\n\t\t\toutdir: \"/output\",\n\t\t\tfs: fs,\n\t\t});\n\t} finally {\n\t\tvi.unstubAllGlobals();\n\t\terrorsSpy.mockRestore();\n\t}\n\n\texpect(mock).toHaveBeenCalled();\n});\n"]}
|