@inlang/paraglide-js 2.26.0 → 2.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/README.md +11 -1
  2. package/dist/bundler-plugins/per-locale-build/index.js +14 -7
  3. package/dist/bundler-plugins/per-locale-build/index.js.map +1 -1
  4. package/dist/bundler-plugins/per-locale-build/vite-environments.test.js +237 -4
  5. package/dist/bundler-plugins/per-locale-build/vite-environments.test.js.map +1 -1
  6. package/dist/bundler-plugins/unplugin.d.ts +1 -1
  7. package/dist/bundler-plugins/unplugin.js +79 -10
  8. package/dist/bundler-plugins/unplugin.js.map +1 -1
  9. package/dist/bundler-plugins/unplugin.test.js +334 -1
  10. package/dist/bundler-plugins/unplugin.test.js.map +1 -1
  11. package/dist/bundler-plugins/vite.js +2 -1
  12. package/dist/bundler-plugins/vite.js.map +1 -1
  13. package/dist/bundler-plugins/vite.test.js +1 -1
  14. package/dist/bundler-plugins/vite.test.js.map +1 -1
  15. package/dist/cli/commands/compile/command.js +13 -0
  16. package/dist/cli/commands/compile/command.js.map +1 -1
  17. package/dist/cli/commands/compile/command.test.js +87 -3
  18. package/dist/cli/commands/compile/command.test.js.map +1 -1
  19. package/dist/cli/commands/init/command.d.ts +5 -0
  20. package/dist/cli/commands/init/command.js +216 -44
  21. package/dist/cli/commands/init/command.js.map +1 -1
  22. package/dist/cli/commands/init/command.test.d.ts +1 -0
  23. package/dist/cli/commands/init/command.test.js +123 -0
  24. package/dist/cli/commands/init/command.test.js.map +1 -0
  25. package/dist/cli/defaults.js +2 -2
  26. package/dist/cli/defaults.js.map +1 -1
  27. package/dist/cli/init-options.d.ts +11 -0
  28. package/dist/cli/init-options.js +2 -0
  29. package/dist/cli/init-options.js.map +1 -0
  30. package/dist/cli/steps/add-inlang-check.d.ts +19 -0
  31. package/dist/cli/steps/add-inlang-check.js +60 -0
  32. package/dist/cli/steps/add-inlang-check.js.map +1 -0
  33. package/dist/cli/steps/add-inlang-check.test.d.ts +1 -0
  34. package/dist/cli/steps/add-inlang-check.test.js +88 -0
  35. package/dist/cli/steps/add-inlang-check.test.js.map +1 -0
  36. package/dist/cli/steps/add-message-lint.d.ts +34 -0
  37. package/dist/cli/steps/add-message-lint.js +105 -0
  38. package/dist/cli/steps/add-message-lint.js.map +1 -0
  39. package/dist/cli/steps/add-message-lint.test.d.ts +1 -0
  40. package/dist/cli/steps/add-message-lint.test.js +74 -0
  41. package/dist/cli/steps/add-message-lint.test.js.map +1 -0
  42. package/dist/cli/steps/add-vite-plugin.d.ts +18 -0
  43. package/dist/cli/steps/add-vite-plugin.js +34 -6
  44. package/dist/cli/steps/add-vite-plugin.js.map +1 -1
  45. package/dist/cli/steps/add-vite-plugin.test.js +25 -9
  46. package/dist/cli/steps/add-vite-plugin.test.js.map +1 -1
  47. package/dist/cli/steps/agents-md-suggestion.d.ts +11 -0
  48. package/dist/cli/steps/agents-md-suggestion.js +19 -0
  49. package/dist/cli/steps/agents-md-suggestion.js.map +1 -0
  50. package/dist/cli/steps/agents-md-suggestion.test.d.ts +1 -0
  51. package/dist/cli/steps/agents-md-suggestion.test.js +36 -0
  52. package/dist/cli/steps/agents-md-suggestion.test.js.map +1 -0
  53. package/dist/cli/steps/check-for-uncomitted-changes.d.ts +3 -0
  54. package/dist/cli/steps/check-for-uncomitted-changes.js +15 -3
  55. package/dist/cli/steps/check-for-uncomitted-changes.js.map +1 -1
  56. package/dist/cli/steps/detect-bundler.d.ts +1 -0
  57. package/dist/cli/steps/detect-bundler.js +7 -1
  58. package/dist/cli/steps/detect-bundler.js.map +1 -1
  59. package/dist/cli/steps/initialize-inlang-project.d.ts +4 -3
  60. package/dist/cli/steps/initialize-inlang-project.js +60 -157
  61. package/dist/cli/steps/initialize-inlang-project.js.map +1 -1
  62. package/dist/cli/steps/maybe-add-machine-translation.d.ts +4 -0
  63. package/dist/cli/steps/maybe-add-machine-translation.js +14 -8
  64. package/dist/cli/steps/maybe-add-machine-translation.js.map +1 -1
  65. package/dist/cli/steps/maybe-add-sherlock.d.ts +2 -0
  66. package/dist/cli/steps/maybe-add-sherlock.js +13 -7
  67. package/dist/cli/steps/maybe-add-sherlock.js.map +1 -1
  68. package/dist/cli/steps/maybe-add-sherlock.test.d.ts +1 -0
  69. package/dist/cli/steps/maybe-add-sherlock.test.js +44 -0
  70. package/dist/cli/steps/maybe-add-sherlock.test.js.map +1 -0
  71. package/dist/cli/steps/prompt-for-outdir.d.ts +2 -0
  72. package/dist/cli/steps/prompt-for-outdir.js +4 -0
  73. package/dist/cli/steps/prompt-for-outdir.js.map +1 -1
  74. package/dist/cli/steps/update-package-json.js +8 -13
  75. package/dist/cli/steps/update-package-json.js.map +1 -1
  76. package/dist/cli/steps/update-ts-config.d.ts +6 -0
  77. package/dist/cli/steps/update-ts-config.js +27 -4
  78. package/dist/cli/steps/update-ts-config.js.map +1 -1
  79. package/dist/cli/utils.d.ts +11 -0
  80. package/dist/cli/utils.js +21 -0
  81. package/dist/cli/utils.js.map +1 -1
  82. package/dist/cli/utils.test.d.ts +1 -0
  83. package/dist/cli/utils.test.js +16 -0
  84. package/dist/cli/utils.test.js.map +1 -0
  85. package/dist/compiler/compile-annotation.d.ts +48 -1
  86. package/dist/compiler/compile-annotation.js +243 -10
  87. package/dist/compiler/compile-annotation.js.map +1 -1
  88. package/dist/compiler/compile-bundle.d.ts +7 -2
  89. package/dist/compiler/compile-bundle.js +97 -3
  90. package/dist/compiler/compile-bundle.js.map +1 -1
  91. package/dist/compiler/compile-bundle.test.js +232 -19
  92. package/dist/compiler/compile-bundle.test.js.map +1 -1
  93. package/dist/compiler/compile-lifecycle.test.d.ts +1 -0
  94. package/dist/compiler/compile-lifecycle.test.js +69 -0
  95. package/dist/compiler/compile-lifecycle.test.js.map +1 -0
  96. package/dist/compiler/compile-local-variable.d.ts +3 -0
  97. package/dist/compiler/compile-local-variable.js +5 -2
  98. package/dist/compiler/compile-local-variable.js.map +1 -1
  99. package/dist/compiler/compile-local-variable.test.js +55 -15
  100. package/dist/compiler/compile-local-variable.test.js.map +1 -1
  101. package/dist/compiler/compile-message.d.ts +29 -1
  102. package/dist/compiler/compile-message.exact-number.test.d.ts +1 -0
  103. package/dist/compiler/compile-message.exact-number.test.js +786 -0
  104. package/dist/compiler/compile-message.exact-number.test.js.map +1 -0
  105. package/dist/compiler/compile-message.js +162 -66
  106. package/dist/compiler/compile-message.js.map +1 -1
  107. package/dist/compiler/compile-message.locals.test.d.ts +1 -0
  108. package/dist/compiler/compile-message.locals.test.js +498 -0
  109. package/dist/compiler/compile-message.locals.test.js.map +1 -0
  110. package/dist/compiler/compile-message.test.js +113 -22
  111. package/dist/compiler/compile-message.test.js.map +1 -1
  112. package/dist/compiler/compile-pattern.d.ts +5 -0
  113. package/dist/compiler/compile-pattern.js +6 -18
  114. package/dist/compiler/compile-pattern.js.map +1 -1
  115. package/dist/compiler/compile-pattern.test.js +169 -5
  116. package/dist/compiler/compile-pattern.test.js.map +1 -1
  117. package/dist/compiler/compile-project.js +5 -1
  118. package/dist/compiler/compile-project.js.map +1 -1
  119. package/dist/compiler/compile-project.test.js +1260 -185
  120. package/dist/compiler/compile-project.test.js.map +1 -1
  121. package/dist/compiler/compile.js +36 -17
  122. package/dist/compiler/compile.js.map +1 -1
  123. package/dist/compiler/compile.test.js +71 -1
  124. package/dist/compiler/compile.test.js.map +1 -1
  125. package/dist/compiler/compiler-options.d.ts +41 -0
  126. package/dist/compiler/compiler-options.js.map +1 -1
  127. package/dist/compiler/create-readme.d.ts +4 -1
  128. package/dist/compiler/create-readme.js +33 -125
  129. package/dist/compiler/create-readme.js.map +1 -1
  130. package/dist/compiler/emit-ts-declarations.interop.test.js +2 -2
  131. package/dist/compiler/emit-ts-declarations.interop.test.js.map +1 -1
  132. package/dist/compiler/emit-ts-declarations.test.js +4 -4
  133. package/dist/compiler/emit-ts-declarations.test.js.map +1 -1
  134. package/dist/compiler/index.d.ts +1 -1
  135. package/dist/compiler/index.js +1 -1
  136. package/dist/compiler/index.js.map +1 -1
  137. package/dist/compiler/input-alias.d.ts +21 -0
  138. package/dist/compiler/input-alias.js +42 -0
  139. package/dist/compiler/input-alias.js.map +1 -0
  140. package/dist/compiler/input-alias.test.d.ts +1 -0
  141. package/dist/compiler/input-alias.test.js +58 -0
  142. package/dist/compiler/input-alias.test.js.map +1 -0
  143. package/dist/compiler/message-locals.d.ts +46 -0
  144. package/dist/compiler/message-locals.js +129 -0
  145. package/dist/compiler/message-locals.js.map +1 -0
  146. package/dist/compiler/output-structure/locale-modules.js +7 -1
  147. package/dist/compiler/output-structure/locale-modules.js.map +1 -1
  148. package/dist/compiler/output-structure/locale-modules.test.js +35 -0
  149. package/dist/compiler/output-structure/locale-modules.test.js.map +1 -1
  150. package/dist/compiler/output-structure/message-modules.js +6 -4
  151. package/dist/compiler/output-structure/message-modules.js.map +1 -1
  152. package/dist/compiler/output-structure/message-modules.test.js +35 -0
  153. package/dist/compiler/output-structure/message-modules.test.js.map +1 -1
  154. package/dist/compiler/registry.d.ts +12 -0
  155. package/dist/compiler/registry.js +158 -31
  156. package/dist/compiler/registry.js.map +1 -1
  157. package/dist/compiler/registry.test.d.ts +1 -0
  158. package/dist/compiler/registry.test.js +291 -0
  159. package/dist/compiler/registry.test.js.map +1 -0
  160. package/dist/compiler/runtime/create-runtime.d.ts +2 -0
  161. package/dist/compiler/runtime/create-runtime.js +9 -0
  162. package/dist/compiler/runtime/create-runtime.js.map +1 -1
  163. package/dist/compiler/runtime/extract-locale-from-cookie.js +8 -1
  164. package/dist/compiler/runtime/extract-locale-from-cookie.js.map +1 -1
  165. package/dist/compiler/runtime/extract-locale-from-cookie.test.js +26 -0
  166. package/dist/compiler/runtime/extract-locale-from-cookie.test.js.map +1 -1
  167. package/dist/compiler/runtime/extract-locale-from-header.js +47 -5
  168. package/dist/compiler/runtime/extract-locale-from-header.js.map +1 -1
  169. package/dist/compiler/runtime/extract-locale-from-header.test.js +58 -0
  170. package/dist/compiler/runtime/extract-locale-from-header.test.js.map +1 -1
  171. package/dist/compiler/runtime/get-locale.js +7 -1
  172. package/dist/compiler/runtime/get-locale.js.map +1 -1
  173. package/dist/compiler/runtime/get-locale.test.js +95 -0
  174. package/dist/compiler/runtime/get-locale.test.js.map +1 -1
  175. package/dist/compiler/runtime/localize-href.d.ts +8 -0
  176. package/dist/compiler/runtime/localize-href.js +60 -0
  177. package/dist/compiler/runtime/localize-href.js.map +1 -1
  178. package/dist/compiler/runtime/localize-href.test.js +227 -1
  179. package/dist/compiler/runtime/localize-href.test.js.map +1 -1
  180. package/dist/compiler/runtime/set-locale.js +24 -6
  181. package/dist/compiler/runtime/set-locale.js.map +1 -1
  182. package/dist/compiler/runtime/set-locale.test.js +182 -0
  183. package/dist/compiler/runtime/set-locale.test.js.map +1 -1
  184. package/dist/compiler/runtime/type.d.ts +2 -0
  185. package/dist/compiler/runtime/type.js.map +1 -1
  186. package/dist/compiler/runtime/type.test.js +34 -0
  187. package/dist/compiler/runtime/type.test.js.map +1 -1
  188. package/dist/compiler/runtime/variables.d.ts +2 -0
  189. package/dist/compiler/runtime/variables.js +7 -0
  190. package/dist/compiler/runtime/variables.js.map +1 -1
  191. package/dist/compiler/server/create-server-file.js +24 -0
  192. package/dist/compiler/server/create-server-file.js.map +1 -1
  193. package/dist/compiler/server/create-server-file.test.js +8 -2
  194. package/dist/compiler/server/create-server-file.test.js.map +1 -1
  195. package/dist/compiler/server/middleware.d.ts +8 -2
  196. package/dist/compiler/server/middleware.js +204 -11
  197. package/dist/compiler/server/middleware.js.map +1 -1
  198. package/dist/compiler/server/middleware.test.js +750 -3
  199. package/dist/compiler/server/middleware.test.js.map +1 -1
  200. package/dist/eslint/index.d.ts +4 -0
  201. package/dist/eslint/index.js +8 -0
  202. package/dist/eslint/index.js.map +1 -0
  203. package/dist/eslint/no-dynamic-message-access.d.ts +3 -0
  204. package/dist/eslint/no-dynamic-message-access.js +150 -0
  205. package/dist/eslint/no-dynamic-message-access.js.map +1 -0
  206. package/dist/eslint/no-dynamic-message-access.test.d.ts +1 -0
  207. package/dist/eslint/no-dynamic-message-access.test.js +126 -0
  208. package/dist/eslint/no-dynamic-message-access.test.js.map +1 -0
  209. package/dist/eslint/oxlint.test.d.ts +1 -0
  210. package/dist/eslint/oxlint.test.js +64 -0
  211. package/dist/eslint/oxlint.test.js.map +1 -0
  212. package/dist/services/config/config-schema.d.ts +2 -0
  213. package/dist/services/config/config-schema.js +2 -0
  214. package/dist/services/config/config-schema.js.map +1 -1
  215. package/dist/services/config/load-paraglide-config.test.js +12 -0
  216. package/dist/services/config/load-paraglide-config.test.js.map +1 -1
  217. package/dist/services/env-variables/index.js +1 -1
  218. package/dist/services/env-variables/index.js.map +1 -1
  219. package/dist/services/file-handling/write-output.bench.js +51 -11
  220. package/dist/services/file-handling/write-output.bench.js.map +1 -1
  221. package/dist/services/file-handling/write-output.js +60 -20
  222. package/dist/services/file-handling/write-output.js.map +1 -1
  223. package/dist/services/file-handling/write-output.test.js +175 -0
  224. package/dist/services/file-handling/write-output.test.js.map +1 -1
  225. package/package.json +15 -5
@@ -1 +1 @@
1
- {"version":3,"file":"write-output.test.js","sourceRoot":"","sources":["../../../src/services/file-handling/write-output.test.ts"],"names":[],"mappings":"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","sourcesContent":["import memfs from \"memfs\";\nimport type fs from \"node:fs/promises\";\nimport { test, expect, vi, beforeEach } from \"vitest\";\n\nbeforeEach(() => {\n\tvi.resetModules();\n});\n\ntest(\"should write the output to a non-existing directory\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test\" },\n\t\tfs,\n\t});\n\texpect(await fs.readFile(\"/output/test.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"test\"\n\t);\n});\n\ntest(\"should clear & overwrite output that's already there\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({\n\t\t\"/output/test.txt\": \"old\",\n\t\t\"/output/other.txt\": \"other\",\n\t});\n\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"new\" },\n\t\tcleanDirectory: true,\n\t\tfs,\n\t});\n\n\texpect(await fs.readFile(\"/output/test.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"new\"\n\t);\n\tawait expect(\n\t\tasync () => await fs.readFile(\"/output/other.txt\", { encoding: \"utf-8\" })\n\t).rejects.toBeDefined();\n});\n\ntest(\"should create any missing directories\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tawait writeOutput({\n\t\tdirectory: \"/output/messages\",\n\t\toutput: {\n\t\t\t\"de/test.txt\": \"de\",\n\t\t\t\"en/test.txt\": \"en\",\n\t\t},\n\t\tfs,\n\t});\n\texpect(\n\t\tawait fs.readFile(\"/output/messages/de/test.txt\", { encoding: \"utf-8\" })\n\t).toBe(\"de\");\n\texpect(\n\t\tawait fs.readFile(\"/output/messages/en/test.txt\", { encoding: \"utf-8\" })\n\t).toBe(\"en\");\n});\n\ntest(\"should only write once if the output hasn't changed\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tconst writeFileSpy = vi.spyOn(fs as any, \"writeFile\");\n\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test\" },\n\t\tfs,\n\t});\n\tconst hashes2 = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test\" },\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\texpect(hashes).toEqual(hashes2);\n\texpect(await fs.readFile(\"/output/test.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"test\"\n\t);\n\texpect(writeFileSpy).toHaveBeenCalledTimes(1);\n});\n\ntest(\"should write again if the output has changed\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tconst writeFileSpy = vi.spyOn(fs as any, \"writeFile\");\n\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test\" },\n\t\tfs,\n\t});\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test2\" },\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\texpect(await fs.readFile(\"/output/test.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"test2\"\n\t);\n\texpect(writeFileSpy).toHaveBeenCalledTimes(2);\n});\n\ntest(\"should only create directories for files that changed\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\tconst mkdirSpy = vi.spyOn(fs, \"mkdir\");\n\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"messages/first.js\": \"first\",\n\t\t\t\"messages/second.js\": \"second\",\n\t\t},\n\t\tfs,\n\t});\n\tmkdirSpy.mockClear();\n\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"messages/first.js\": \"changed\",\n\t\t\t\"messages/second.js\": \"second\",\n\t\t},\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\n\texpect(mkdirSpy).toHaveBeenCalledTimes(1);\n\texpect(mkdirSpy).toHaveBeenCalledWith(\"/output/messages\", {\n\t\trecursive: true,\n\t});\n});\n\ntest(\"should write files if output has partially changed\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tconst writeFileSpy = vi.spyOn(fs as any, \"writeFile\");\n\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"file1.txt\": \"test\", \"file2.txt\": \"test\" },\n\t\tfs,\n\t});\n\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"file1.txt\": \"test\", \"file2.txt\": \"test2\" },\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\texpect(writeFileSpy).toHaveBeenCalledWith(\"/output/file2.txt\", \"test2\");\n\texpect(writeFileSpy).toHaveBeenCalledTimes(3);\n});\n\ntest(\"should delete files that have been removed from the output\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\t// First write with three files\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"file1.txt\": \"content1\",\n\t\t\t\"file2.txt\": \"content2\",\n\t\t\t\"subdir/file3.txt\": \"content3\",\n\t\t},\n\t\tfs,\n\t});\n\n\t// Verify all files were written\n\texpect(await fs.readFile(\"/output/file1.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"content1\"\n\t);\n\texpect(await fs.readFile(\"/output/file2.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"content2\"\n\t);\n\texpect(\n\t\tawait fs.readFile(\"/output/subdir/file3.txt\", { encoding: \"utf-8\" })\n\t).toBe(\"content3\");\n\n\t// Second write with file2.txt removed\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"file1.txt\": \"content1\",\n\t\t\t\"subdir/file3.txt\": \"content3updated\",\n\t\t},\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\n\t// Verify file1.txt still exists\n\texpect(await fs.readFile(\"/output/file1.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"content1\"\n\t);\n\t// Verify file2.txt has been deleted\n\tawait expect(\n\t\tasync () => await fs.readFile(\"/output/file2.txt\", { encoding: \"utf-8\" })\n\t).rejects.toBeDefined();\n\t// Verify file3.txt was updated\n\texpect(\n\t\tawait fs.readFile(\"/output/subdir/file3.txt\", { encoding: \"utf-8\" })\n\t).toBe(\"content3updated\");\n\n\t// Get the new hashes\n\tconst newHashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"file1.txt\": \"content1\",\n\t\t\t\"subdir/file3.txt\": \"content3updated\",\n\t\t},\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\n\t// Third write with subdir/file3.txt removed\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"file1.txt\": \"content1\",\n\t\t},\n\t\tfs,\n\t\tpreviousOutputHashes: newHashes,\n\t});\n\n\t// Verify file1.txt still exists\n\texpect(await fs.readFile(\"/output/file1.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"content1\"\n\t);\n\t// Verify subdir/file3.txt has been deleted\n\tawait expect(\n\t\tasync () =>\n\t\t\tawait fs.readFile(\"/output/subdir/file3.txt\", { encoding: \"utf-8\" })\n\t).rejects.toBeDefined();\n\t// Verify the subdir directory has also been removed\n\tawait expect(\n\t\tasync () => await fs.readdir(\"/output/subdir\")\n\t).rejects.toBeDefined();\n});\n\ntest(\"hashDirectory matches the hashes writeOutput returns\", async () => {\n\tconst { writeOutput, hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tconst output = {\n\t\t\"a.txt\": \"alpha\",\n\t\t\"nested/b.txt\": \"beta\",\n\t\t\"nested/deep/c.txt\": \"gamma\",\n\t};\n\n\tconst writtenHashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput,\n\t\tfs,\n\t});\n\n\tconst seededHashes = await hashDirectory(\"/output\", fs);\n\n\texpect(seededHashes).toEqual(writtenHashes);\n});\n\ntest(\"hashDirectory returns undefined when directory does not exist\", async () => {\n\tconst { hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\texpect(await hashDirectory(\"/nope\", fs)).toBeUndefined();\n});\n\ntest(\"hashDirectory skips files that disappear while walking\", async () => {\n\tconst { hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({\n\t\t\"/output/a.txt\": \"alpha\",\n\t\t\"/output/b.txt\": \"beta\",\n\t});\n\tconst readFile = fs.readFile.bind(fs);\n\tvi.spyOn(fs, \"readFile\").mockImplementation((async (...args) => {\n\t\tif (args[0] === \"/output/b.txt\") {\n\t\t\tthrow new Error(\"file disappeared\");\n\t\t}\n\t\treturn readFile(args[0], args[1]);\n\t}) as typeof fs.readFile);\n\n\tconst seededHashes = await hashDirectory(\"/output\", fs);\n\n\texpect(seededHashes).toEqual({\n\t\t\"a.txt\": expect.any(String),\n\t});\n});\n\ntest(\"hashDirectory skips directories that disappear while walking\", async () => {\n\tconst { hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({\n\t\t\"/output/nested/b.txt\": \"beta\",\n\t});\n\tconst readdir = fs.readdir.bind(fs);\n\tvi.spyOn(fs, \"readdir\").mockImplementation((async (...args) => {\n\t\tif (args[0] === \"/output/nested\") {\n\t\t\tthrow new Error(\"directory disappeared\");\n\t\t}\n\t\treturn readdir(args[0], args[1] as never);\n\t}) as typeof fs.readdir);\n\n\tconst seededHashes = await hashDirectory(\"/output\", fs);\n\n\texpect(seededHashes).toEqual({});\n});\n\nconst mockFs = (files: memfs.DirectoryJSON) => {\n\tconst _memfs = memfs.createFsFromVolume(memfs.Volume.fromJSON(files));\n\treturn _memfs.promises as unknown as typeof fs;\n};\n"]}
1
+ {"version":3,"file":"write-output.test.js","sourceRoot":"","sources":["../../../src/services/file-handling/write-output.test.ts"],"names":[],"mappings":"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","sourcesContent":["import memfs from \"memfs\";\nimport type fs from \"node:fs/promises\";\nimport { test, expect, vi, beforeEach } from \"vitest\";\n\nbeforeEach(() => {\n\tvi.resetModules();\n});\n\ntest(\"should write the output to a non-existing directory\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test\" },\n\t\tfs,\n\t});\n\texpect(await fs.readFile(\"/output/test.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"test\"\n\t);\n});\n\ntest(\"should clear & overwrite output that's already there\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({\n\t\t\"/output/test.txt\": \"old\",\n\t\t\"/output/other.txt\": \"other\",\n\t});\n\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"new\" },\n\t\tcleanDirectory: true,\n\t\tfs,\n\t});\n\n\texpect(await fs.readFile(\"/output/test.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"new\"\n\t);\n\tawait expect(\n\t\tasync () => await fs.readFile(\"/output/other.txt\", { encoding: \"utf-8\" })\n\t).rejects.toBeDefined();\n});\n\ntest(\"should create any missing directories\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tawait writeOutput({\n\t\tdirectory: \"/output/messages\",\n\t\toutput: {\n\t\t\t\"de/test.txt\": \"de\",\n\t\t\t\"en/test.txt\": \"en\",\n\t\t},\n\t\tfs,\n\t});\n\texpect(\n\t\tawait fs.readFile(\"/output/messages/de/test.txt\", { encoding: \"utf-8\" })\n\t).toBe(\"de\");\n\texpect(\n\t\tawait fs.readFile(\"/output/messages/en/test.txt\", { encoding: \"utf-8\" })\n\t).toBe(\"en\");\n});\n\ntest(\"should only write once if the output hasn't changed\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tconst writeFileSpy = vi.spyOn(fs as any, \"writeFile\");\n\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test\" },\n\t\tfs,\n\t});\n\tconst hashes2 = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test\" },\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\texpect(hashes).toEqual(hashes2);\n\texpect(await fs.readFile(\"/output/test.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"test\"\n\t);\n\texpect(writeFileSpy).toHaveBeenCalledTimes(1);\n});\n\ntest(\"should write again if the output has changed\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tconst writeFileSpy = vi.spyOn(fs as any, \"writeFile\");\n\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test\" },\n\t\tfs,\n\t});\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"test.txt\": \"test2\" },\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\texpect(await fs.readFile(\"/output/test.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"test2\"\n\t);\n\texpect(writeFileSpy).toHaveBeenCalledTimes(2);\n});\n\ntest(\"should only create directories for files that changed\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\tconst mkdirSpy = vi.spyOn(fs, \"mkdir\");\n\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"messages/first.js\": \"first\",\n\t\t\t\"messages/second.js\": \"second\",\n\t\t},\n\t\tfs,\n\t});\n\tmkdirSpy.mockClear();\n\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"messages/first.js\": \"changed\",\n\t\t\t\"messages/second.js\": \"second\",\n\t\t},\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\n\texpect(mkdirSpy).toHaveBeenCalledTimes(1);\n\texpect(mkdirSpy).toHaveBeenCalledWith(\"/output/messages\", {\n\t\trecursive: true,\n\t});\n});\n\ntest(\"should write files if output has partially changed\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tconst writeFileSpy = vi.spyOn(fs as any, \"writeFile\");\n\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"file1.txt\": \"test\", \"file2.txt\": \"test\" },\n\t\tfs,\n\t});\n\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"file1.txt\": \"test\", \"file2.txt\": \"test2\" },\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\texpect(writeFileSpy).toHaveBeenCalledWith(\"/output/file2.txt\", \"test2\");\n\texpect(writeFileSpy).toHaveBeenCalledTimes(3);\n});\n\ntest(\"should delete files that have been removed from the output\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\t// First write with three files\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"file1.txt\": \"content1\",\n\t\t\t\"file2.txt\": \"content2\",\n\t\t\t\"subdir/file3.txt\": \"content3\",\n\t\t},\n\t\tfs,\n\t});\n\n\t// Verify all files were written\n\texpect(await fs.readFile(\"/output/file1.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"content1\"\n\t);\n\texpect(await fs.readFile(\"/output/file2.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"content2\"\n\t);\n\texpect(\n\t\tawait fs.readFile(\"/output/subdir/file3.txt\", { encoding: \"utf-8\" })\n\t).toBe(\"content3\");\n\n\t// Second write with file2.txt removed\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"file1.txt\": \"content1\",\n\t\t\t\"subdir/file3.txt\": \"content3updated\",\n\t\t},\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\n\t// Verify file1.txt still exists\n\texpect(await fs.readFile(\"/output/file1.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"content1\"\n\t);\n\t// Verify file2.txt has been deleted\n\tawait expect(\n\t\tasync () => await fs.readFile(\"/output/file2.txt\", { encoding: \"utf-8\" })\n\t).rejects.toBeDefined();\n\t// Verify file3.txt was updated\n\texpect(\n\t\tawait fs.readFile(\"/output/subdir/file3.txt\", { encoding: \"utf-8\" })\n\t).toBe(\"content3updated\");\n\n\t// Get the new hashes\n\tconst newHashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"file1.txt\": \"content1\",\n\t\t\t\"subdir/file3.txt\": \"content3updated\",\n\t\t},\n\t\tfs,\n\t\tpreviousOutputHashes: hashes,\n\t});\n\n\t// Third write with subdir/file3.txt removed\n\tawait writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: {\n\t\t\t\"file1.txt\": \"content1\",\n\t\t},\n\t\tfs,\n\t\tpreviousOutputHashes: newHashes,\n\t});\n\n\t// Verify file1.txt still exists\n\texpect(await fs.readFile(\"/output/file1.txt\", { encoding: \"utf-8\" })).toBe(\n\t\t\"content1\"\n\t);\n\t// Verify subdir/file3.txt has been deleted\n\tawait expect(\n\t\tasync () =>\n\t\t\tawait fs.readFile(\"/output/subdir/file3.txt\", { encoding: \"utf-8\" })\n\t).rejects.toBeDefined();\n\t// Verify the subdir directory has also been removed\n\tawait expect(\n\t\tasync () => await fs.readdir(\"/output/subdir\")\n\t).rejects.toBeDefined();\n});\n\ntest(\"hashDirectory matches the hashes writeOutput returns\", async () => {\n\tconst { writeOutput, hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\tconst output = {\n\t\t\"a.txt\": \"alpha\",\n\t\t\"nested/b.txt\": \"beta\",\n\t\t\"nested/deep/c.txt\": \"gamma\",\n\t};\n\n\tconst writtenHashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput,\n\t\tfs,\n\t});\n\n\tconst seededHashes = await hashDirectory(\"/output\", fs);\n\n\texpect(seededHashes).toEqual(writtenHashes);\n});\n\ntest(\"hashDirectory returns undefined when directory does not exist\", async () => {\n\tconst { hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\n\texpect(await hashDirectory(\"/nope\", fs)).toBeUndefined();\n});\n\ntest(\"hashDirectory skips files that disappear while walking\", async () => {\n\tconst { hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({\n\t\t\"/output/a.txt\": \"alpha\",\n\t\t\"/output/b.txt\": \"beta\",\n\t});\n\tconst readFile = fs.readFile.bind(fs);\n\tvi.spyOn(fs, \"readFile\").mockImplementation((async (...args) => {\n\t\tif (args[0] === \"/output/b.txt\") {\n\t\t\tthrow new Error(\"file disappeared\");\n\t\t}\n\t\treturn readFile(args[0], args[1]);\n\t}) as typeof fs.readFile);\n\n\tconst seededHashes = await hashDirectory(\"/output\", fs);\n\n\texpect(seededHashes).toEqual({\n\t\t\"a.txt\": expect.any(String),\n\t});\n});\n\ntest(\"hashDirectory skips directories that disappear while walking\", async () => {\n\tconst { hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({\n\t\t\"/output/nested/b.txt\": \"beta\",\n\t});\n\tconst readdir = fs.readdir.bind(fs);\n\tvi.spyOn(fs, \"readdir\").mockImplementation((async (...args) => {\n\t\tif (args[0] === \"/output/nested\") {\n\t\t\tthrow new Error(\"directory disappeared\");\n\t\t}\n\t\treturn readdir(args[0], args[1] as never);\n\t}) as typeof fs.readdir);\n\n\tconst seededHashes = await hashDirectory(\"/output\", fs);\n\n\texpect(seededHashes).toEqual({});\n});\n\nconst mockFs = (files: memfs.DirectoryJSON) => {\n\tconst _memfs = memfs.createFsFromVolume(memfs.Volume.fromJSON(files));\n\treturn _memfs.promises as unknown as typeof fs;\n};\n\ntest(\"bounds every filesystem phase for large nested outputs\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\tconst output = Object.fromEntries(\n\t\tArray.from({ length: 500 }, (_, i) => [\n\t\t\t`messages/${i}/en.js`,\n\t\t\t`message ${i}`,\n\t\t])\n\t);\n\tfor (const name of [\"mkdir\", \"writeFile\", \"unlink\"] as const) {\n\t\tconst original = fs[name].bind(fs);\n\t\tlet active = 0;\n\t\tlet peak = 0;\n\t\tvi.spyOn(fs, name).mockImplementation((async (...args: unknown[]) => {\n\t\t\tactive++;\n\t\t\tpeak = Math.max(peak, active);\n\t\t\ttry {\n\t\t\t\t// Simulate a process with room for at most 32 operations.\n\t\t\t\tif (active > 32)\n\t\t\t\t\tthrow Object.assign(new Error(\"too many open files\"), {\n\t\t\t\t\t\tcode: \"EMFILE\",\n\t\t\t\t\t});\n\t\t\t\tawait new Promise<void>((resolve) => setImmediate(resolve));\n\t\t\t\treturn await (original as (...args: unknown[]) => Promise<unknown>)(\n\t\t\t\t\t...args\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tactive--;\n\t\t\t}\n\t\t}) as never);\n\t\tconst hashes = await writeOutput({ directory: \"/output\", output, fs });\n\t\tawait writeOutput({\n\t\t\tdirectory: \"/output\",\n\t\t\toutput: {},\n\t\t\tpreviousOutputHashes: hashes,\n\t\t\tfs,\n\t\t});\n\t\texpect(peak).toBeGreaterThan(1);\n\t\texpect(peak).toBeLessThanOrEqual(32);\n\t\texpect(active).toBe(0);\n\t\tvi.restoreAllMocks();\n\t}\n});\n\ntest.each([\"mkdir\", \"writeFile\"] as const)(\n\t\"propagates %s errors and retries the incomplete output\",\n\tasync (name) => {\n\t\tconst { writeOutput, hashDirectory } = await import(\"./write-output.js\");\n\t\tconst fs = mockFs({});\n\t\tconst output = {\n\t\t\t\"messages/en.js\": \"English\",\n\t\t\t\"messages/de.js\": \"German\",\n\t\t\t\"runtime.js\": \"runtime\",\n\t\t};\n\t\tconst error = Object.assign(new Error(`${name}: permission denied`), {\n\t\t\tcode: \"EACCES\",\n\t\t});\n\t\tconst spy = vi.spyOn(fs, name).mockRejectedValueOnce(error);\n\t\tawait expect(\n\t\t\twriteOutput({ directory: \"/output\", output, fs })\n\t\t).rejects.toBe(error);\n\t\tspy.mockRestore();\n\t\tconst hashes = await writeOutput({ directory: \"/output\", output, fs });\n\t\texpect(await hashDirectory(\"/output\", fs)).toEqual(hashes);\n\t}\n);\n\ntest(\"waits for active writes and stops scheduling after a failure\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\tconst output = Object.fromEntries(\n\t\tArray.from({ length: 100 }, (_, i) => [`${i}.js`, `${i}`])\n\t);\n\tconst error = Object.assign(new Error(\"disk full\"), { code: \"ENOSPC\" });\n\tlet release!: () => void;\n\tconst blocked = new Promise<void>((resolve) => {\n\t\trelease = resolve;\n\t});\n\tlet signalStarted!: () => void;\n\tconst startedWriting = new Promise<void>((resolve) => {\n\t\tsignalStarted = resolve;\n\t});\n\tlet calls = 0;\n\tlet active = 0;\n\tvi.spyOn(fs, \"writeFile\").mockImplementation((async () => {\n\t\tcalls++;\n\t\tif (calls === 1) throw error;\n\t\tactive++;\n\t\tsignalStarted();\n\t\tawait blocked;\n\t\tactive--;\n\t}) as typeof fs.writeFile);\n\tlet settled = false;\n\tconst writing = writeOutput({ directory: \"/output\", output, fs });\n\tconst rejection = writing.catch((caught) => caught);\n\tvoid writing.catch(() => {\n\t\tsettled = true;\n\t});\n\tawait startedWriting;\n\tawait Promise.resolve();\n\texpect(active).toBeGreaterThan(0);\n\texpect(settled).toBe(false);\n\tconst started = calls;\n\trelease();\n\texpect(await rejection).toBe(error);\n\texpect(active).toBe(0);\n\texpect(calls).toBe(started);\n\texpect(calls).toBeLessThan(100);\n});\n\ntest(\"required deletes ignore only missing files and preserve the old hashes on failure\", async () => {\n\tconst { writeOutput } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\tconst hashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"old.js\": \"old\" },\n\t\tfs,\n\t});\n\tconst error = Object.assign(new Error(\"unlink denied\"), { code: \"EACCES\" });\n\tconst spy = vi.spyOn(fs, \"unlink\").mockRejectedValueOnce(error);\n\tawait expect(\n\t\twriteOutput({\n\t\t\tdirectory: \"/output\",\n\t\t\toutput: { \"new.js\": \"new\" },\n\t\t\tpreviousOutputHashes: hashes,\n\t\t\tfs,\n\t\t})\n\t).rejects.toBe(error);\n\texpect(await fs.readFile(\"/output/old.js\", \"utf8\")).toBe(\"old\");\n\tspy.mockRestore();\n\tawait fs.unlink(\"/output/old.js\");\n\tconst next = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { \"new.js\": \"new\" },\n\t\tpreviousOutputHashes: hashes,\n\t\tfs,\n\t});\n\texpect(Object.keys(next)).toEqual([\"new.js\"]);\n\texpect(await fs.readFile(\"/output/new.js\", \"utf8\")).toBe(\"new\");\n});\n\ntest(\"clean partial updates rewrite unchanged output too\", async () => {\n\tconst { writeOutput, hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\tconst output = { \"messages/en.js\": \"English\", \"runtime.js\": \"runtime\" };\n\tconst hashes = await writeOutput({ directory: \"/output\", output, fs });\n\tconst next = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: { ...output, \"messages/en.js\": \"changed\" },\n\t\tpreviousOutputHashes: hashes,\n\t\tcleanDirectory: true,\n\t\tfs,\n\t});\n\texpect(await fs.readFile(\"/output/runtime.js\", \"utf8\")).toBe(\"runtime\");\n\texpect(await hashDirectory(\"/output\", fs)).toEqual(next);\n});\n\ntest(\"retries a partially written incremental update with the same previous hashes\", async () => {\n\tconst { writeOutput, hashDirectory } = await import(\"./write-output.js\");\n\tconst fs = mockFs({});\n\tconst baseline = {\n\t\t\"a.js\": \"old a\",\n\t\t\"b.js\": \"old b\",\n\t\t\"unchanged.js\": \"unchanged\",\n\t};\n\tconst previousOutputHashes = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput: baseline,\n\t\tfs,\n\t});\n\tconst output = { ...baseline, \"a.js\": \"new a\", \"b.js\": \"new b\" };\n\tconst original = fs.writeFile.bind(fs);\n\tconst error = Object.assign(new Error(\"disk full\"), { code: \"ENOSPC\" });\n\tconst spy = vi.spyOn(fs, \"writeFile\").mockImplementation((async (...args) => {\n\t\tif (args[0] === \"/output/b.js\") throw error;\n\t\treturn original(...args);\n\t}) as typeof fs.writeFile);\n\tawait expect(\n\t\twriteOutput({ directory: \"/output\", output, previousOutputHashes, fs })\n\t).rejects.toBe(error);\n\texpect(await fs.readFile(\"/output/a.js\", \"utf8\")).toBe(\"new a\");\n\texpect(await fs.readFile(\"/output/b.js\", \"utf8\")).toBe(\"old b\");\n\tspy.mockRestore();\n\tconst next = await writeOutput({\n\t\tdirectory: \"/output\",\n\t\toutput,\n\t\tpreviousOutputHashes,\n\t\tfs,\n\t});\n\texpect(await hashDirectory(\"/output\", fs)).toEqual(next);\n\texpect(previousOutputHashes[\"a.js\"]).not.toBe(next[\"a.js\"]);\n});\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@inlang/paraglide-js",
3
3
  "type": "module",
4
- "version": "2.26.0",
4
+ "version": "2.28.0",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
7
7
  "access": "public",
@@ -23,20 +23,23 @@
23
23
  "types": "./dist/index.d.ts",
24
24
  "exports": {
25
25
  ".": "./dist/index.js",
26
- "./urlpattern-polyfill": "./dist/urlpattern-polyfill/index.js"
26
+ "./urlpattern-polyfill": "./dist/urlpattern-polyfill/index.js",
27
+ "./eslint": "./dist/eslint/index.js"
27
28
  },
28
29
  "dependencies": {
29
30
  "@inlang/recommend-sherlock": "^0.2.1",
30
- "@inlang/sdk": "^3.1.0",
31
+ "@inlang/sdk": "^4.0.4",
31
32
  "commander": "11.1.0",
32
33
  "consola": "3.4.0",
33
34
  "jiti": "^2.7.0",
34
35
  "json5": "2.2.3",
36
+ "jsonc-parser": "^3.3.1",
35
37
  "unplugin": "^2.1.2",
36
38
  "urlpattern-polyfill": "^10.0.0",
37
39
  "valibot": "^1.4.2"
38
40
  },
39
41
  "peerDependencies": {
42
+ "eslint": "^9.0.0 || ^10.0.0",
40
43
  "typescript": ">=5.6",
41
44
  "vite": ">=5.0.0"
42
45
  },
@@ -46,17 +49,24 @@
46
49
  },
47
50
  "vite": {
48
51
  "optional": true
52
+ },
53
+ "eslint": {
54
+ "optional": true
49
55
  }
50
56
  },
51
57
  "devDependencies": {
52
58
  "@changesets/cli": "^2.29.7",
53
- "@inlang/plugin-message-format": "^4.3.0",
59
+ "@inlang/plugin-message-format": "^4.5.0",
54
60
  "@rollup/plugin-virtual": "3.0.2",
55
61
  "@ts-morph/bootstrap": "0.26.0",
62
+ "@types/estree": "^1.0.9",
56
63
  "@types/node": "^22.10.6",
64
+ "@typescript-eslint/parser": "8.71.2",
57
65
  "@vitest/coverage-v8": "3.1.4",
66
+ "eslint": "10.12.0",
67
+ "eslint9": "npm:eslint@^9.39.2",
58
68
  "memfs": "4.17.0",
59
- "oxlint": "^1.14.0",
69
+ "oxlint": "^1.88.0",
60
70
  "prettier": "^3.4.2",
61
71
  "rolldown": "1.0.0-beta.1",
62
72
  "typedoc": "0.28.12",