@prosopo/config 3.3.6 → 3.3.8

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 (66) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +8 -7
  2. package/.turbo/turbo-build$colon$tsc.log +4 -4
  3. package/.turbo/turbo-build.log +9 -8
  4. package/CHANGELOG.md +20 -0
  5. package/dist/cjs/index.cjs +2 -0
  6. package/dist/cjs/vite/index.cjs +2 -0
  7. package/dist/cjs/vite/vite-plugin-modify-exports-files.cjs +43 -0
  8. package/dist/cjs/vite/vite.frontend.config.cjs +6 -1
  9. package/dist/cjs/vite/vite.test.config.cjs +3 -1
  10. package/dist/dependencies.test.d.ts +2 -0
  11. package/dist/dependencies.test.d.ts.map +1 -0
  12. package/dist/dependencies.test.js +160 -0
  13. package/dist/dependencies.test.js.map +1 -0
  14. package/dist/getDependencies.test.d.ts +2 -0
  15. package/dist/getDependencies.test.d.ts.map +1 -0
  16. package/dist/getDependencies.test.js +258 -0
  17. package/dist/getDependencies.test.js.map +1 -0
  18. package/dist/index.js +2 -1
  19. package/dist/vite/bundleConfigs.test.d.ts +2 -0
  20. package/dist/vite/bundleConfigs.test.d.ts.map +1 -0
  21. package/dist/vite/bundleConfigs.test.js +252 -0
  22. package/dist/vite/bundleConfigs.test.js.map +1 -0
  23. package/dist/vite/configs.test.d.ts +2 -0
  24. package/dist/vite/configs.test.d.ts.map +1 -0
  25. package/dist/vite/configs.test.js +163 -0
  26. package/dist/vite/configs.test.js.map +1 -0
  27. package/dist/vite/index.d.ts +1 -0
  28. package/dist/vite/index.d.ts.map +1 -1
  29. package/dist/vite/index.js +2 -1
  30. package/dist/vite/index.js.map +1 -1
  31. package/dist/vite/modifyExportsFiles.test.d.ts +2 -0
  32. package/dist/vite/modifyExportsFiles.test.d.ts.map +1 -0
  33. package/dist/vite/modifyExportsFiles.test.js +28 -0
  34. package/dist/vite/modifyExportsFiles.test.js.map +1 -0
  35. package/dist/vite/plugins.test.d.ts +2 -0
  36. package/dist/vite/plugins.test.d.ts.map +1 -0
  37. package/dist/vite/plugins.test.js +232 -0
  38. package/dist/vite/plugins.test.js.map +1 -0
  39. package/dist/vite/translations.test.d.ts +2 -0
  40. package/dist/vite/translations.test.d.ts.map +1 -0
  41. package/dist/vite/translations.test.js +96 -0
  42. package/dist/vite/translations.test.js.map +1 -0
  43. package/dist/vite/vite-plugin-modify-exports-files.d.ts +4 -0
  44. package/dist/vite/vite-plugin-modify-exports-files.d.ts.map +1 -0
  45. package/dist/vite/vite-plugin-modify-exports-files.js +42 -0
  46. package/dist/vite/vite-plugin-modify-exports-files.js.map +1 -0
  47. package/dist/vite/vite.frontend.config.d.ts.map +1 -1
  48. package/dist/vite/vite.frontend.config.js +6 -1
  49. package/dist/vite/vite.frontend.config.js.map +1 -1
  50. package/dist/vite/vite.test.config.d.ts.map +1 -1
  51. package/dist/vite/vite.test.config.js +3 -1
  52. package/dist/vite/vite.test.config.js.map +1 -1
  53. package/package.json +3 -2
  54. package/src/dependencies.test.ts +249 -0
  55. package/src/getDependencies.test.ts +385 -0
  56. package/src/vite/bundleConfigs.test.ts +405 -0
  57. package/src/vite/configs.test.ts +217 -0
  58. package/src/vite/index.ts +1 -0
  59. package/src/vite/modifyExportsFiles.test.ts +56 -0
  60. package/src/vite/plugins.test.ts +348 -0
  61. package/src/vite/translations.test.ts +164 -0
  62. package/src/vite/vite-plugin-modify-exports-files.ts +64 -0
  63. package/src/vite/vite.frontend.config.ts +13 -0
  64. package/src/vite/vite.test.config.ts +5 -0
  65. package/tsconfig.tsbuildinfo +1 -1
  66. package/vite.test.config.ts +37 -0
@@ -0,0 +1,163 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+ import { nodejsPolarsDirnamePlugin } from "./NodejsPolarsDirnamePlugin.js";
6
+ import ViteTestConfig from "./vite.test.config.js";
7
+ import ViteThreadsTestConfig from "./vite.threads.test.config.js";
8
+ const NATIVE_POLARS = "/repo/node_modules/nodejs-polars/bin/native-polars.js";
9
+ let root;
10
+ let cwd;
11
+ let originalTestType;
12
+ beforeEach(() => {
13
+ root = fs.mkdtempSync(path.join(os.tmpdir(), "prosopo-vite-config-test-"));
14
+ cwd = process.cwd();
15
+ originalTestType = process.env.TEST_TYPE;
16
+ process.env.TEST_TYPE = undefined;
17
+ delete process.env.TEST_TYPE;
18
+ });
19
+ afterEach(() => {
20
+ process.chdir(cwd);
21
+ if (originalTestType === undefined) {
22
+ delete process.env.TEST_TYPE;
23
+ }
24
+ else {
25
+ process.env.TEST_TYPE = originalTestType;
26
+ }
27
+ fs.rmSync(root, { recursive: true, force: true });
28
+ });
29
+ const asPackage = () => {
30
+ fs.writeFileSync(path.join(root, "package.json"), "{}");
31
+ fs.mkdirSync(path.join(root, "src"));
32
+ process.chdir(root);
33
+ };
34
+ const asRepoRoot = () => {
35
+ fs.writeFileSync(path.join(root, "package.json"), "{}");
36
+ process.chdir(root);
37
+ };
38
+ describe("ViteTestConfig", () => {
39
+ it("enables coverage and typechecking by default", () => {
40
+ asPackage();
41
+ const config = ViteTestConfig();
42
+ expect(config.test?.coverage?.enabled).toBe(true);
43
+ expect(config.test?.typecheck?.enabled).toBe(true);
44
+ expect(config.test?.watch).toBe(false);
45
+ });
46
+ it("runs in forks, isolated, because low-level crypto needs it", () => {
47
+ asPackage();
48
+ const config = ViteTestConfig();
49
+ expect(config.test?.pool).toBe("forks");
50
+ expect(config.test?.isolate).toBe(true);
51
+ });
52
+ it("includes tests with no declared type when no filter is set", () => {
53
+ asPackage();
54
+ expect(config_include(ViteTestConfig())).toBe("src/**/*@(|).@(test|spec).@(mts|cts|mjs|cjs|js|ts|tsx|jsx)");
55
+ });
56
+ it("filters on a single declared test type", () => {
57
+ asPackage();
58
+ process.env.TEST_TYPE = "unit";
59
+ expect(config_include(ViteTestConfig())).toContain("@(.unit)");
60
+ });
61
+ it("filters on several test types", () => {
62
+ asPackage();
63
+ process.env.TEST_TYPE = "unit,integration";
64
+ expect(config_include(ViteTestConfig())).toContain("@(.unit|.integration)");
65
+ });
66
+ it("trims whitespace around the test type list", () => {
67
+ asPackage();
68
+ process.env.TEST_TYPE = " unit ";
69
+ expect(config_include(ViteTestConfig())).toContain("@(.unit)");
70
+ });
71
+ it("ignores an empty test type, keeping the default glob", () => {
72
+ asPackage();
73
+ process.env.TEST_TYPE = "";
74
+ expect(config_include(ViteTestConfig())).toContain("@(|)");
75
+ });
76
+ it("scopes coverage to the local src when run from a package", () => {
77
+ asPackage();
78
+ const config = ViteTestConfig();
79
+ expect(config.test?.coverage?.include).toContain("src/**/*.ts");
80
+ expect(config.test?.coverage?.exclude).toContain("src/**/*.test.ts");
81
+ });
82
+ it("falls back to repo-wide globs when there is no src directory", () => {
83
+ asRepoRoot();
84
+ const config = ViteTestConfig();
85
+ expect(config.test?.coverage?.include).toEqual([
86
+ "packages/*/src/**",
87
+ "captcha/packages/*/src/**",
88
+ ]);
89
+ expect(config.test?.coverage?.exclude).toContain("**/node_modules/**");
90
+ });
91
+ it("adds the tsconfig-paths plugin only when given a tsconfig", () => {
92
+ asPackage();
93
+ const withoutPaths = ViteTestConfig().plugins ?? [];
94
+ const tsConfigPath = path.join(root, "tsconfig.json");
95
+ fs.writeFileSync(tsConfigPath, "{}");
96
+ const withPaths = ViteTestConfig(tsConfigPath).plugins ?? [];
97
+ expect(withPaths.length).toBe(withoutPaths.length + 1);
98
+ });
99
+ it("always excludes node_modules and dist from the test run", () => {
100
+ asPackage();
101
+ expect(ViteTestConfig().test?.exclude).toEqual([
102
+ "**/node_modules/**",
103
+ "**/dist/**",
104
+ ]);
105
+ });
106
+ it("disables sourcemaps and minification, which only cost time here", () => {
107
+ asPackage();
108
+ const config = ViteTestConfig();
109
+ expect(config.build?.minify).toBe(false);
110
+ expect(config.build?.sourcemap).toBe(false);
111
+ });
112
+ });
113
+ describe("ViteThreadsTestConfig", () => {
114
+ it("differs from the forks config only in its pool", () => {
115
+ asPackage();
116
+ expect(ViteThreadsTestConfig().test?.pool).toBe("threads");
117
+ expect(ViteTestConfig().test?.pool).toBe("forks");
118
+ });
119
+ it("keeps coverage and typechecking on", () => {
120
+ asPackage();
121
+ const config = ViteThreadsTestConfig();
122
+ expect(config.test?.coverage?.enabled).toBe(true);
123
+ expect(config.test?.typecheck?.enabled).toBe(true);
124
+ });
125
+ });
126
+ describe("nodejsPolarsDirnamePlugin", () => {
127
+ const plugin = nodejsPolarsDirnamePlugin();
128
+ it("claims only the native polars entry point", () => {
129
+ expect(plugin.resolveId(NATIVE_POLARS, undefined, {})).toBe(NATIVE_POLARS);
130
+ expect(plugin.resolveId("zod", undefined, {})).toBeNull();
131
+ expect(plugin.resolveId("nodejs-polars/bin/other.js", undefined, {})).toBeNull();
132
+ });
133
+ it("rewrites __dirname to a path derived from import.meta.url", () => {
134
+ const code = "const a = __dirname; const b = __dirname;";
135
+ const transformed = plugin.transform(code, NATIVE_POLARS);
136
+ expect(transformed).not.toContain("__dirname");
137
+ expect(transformed).toContain("import.meta.url");
138
+ expect(transformed.match(/import\.meta\.url/g)).toHaveLength(2);
139
+ });
140
+ it("leaves every other module untouched", () => {
141
+ const code = "const a = __dirname;";
142
+ expect(plugin.transform(code, "/repo/src/index.ts")).toBe(code);
143
+ });
144
+ it("is named", () => {
145
+ expect(plugin.name).toBe("nodejs-polars-dirname-plugin");
146
+ });
147
+ });
148
+ const config_include = (config) => {
149
+ const include = config.test?.include;
150
+ if (!include || !include[0]) {
151
+ throw new Error("config has no test include glob");
152
+ }
153
+ return include[0];
154
+ };
155
+ describe("coverage excludes", () => {
156
+ it("drops type-test files, which are compiled but never executed", () => {
157
+ asPackage();
158
+ const exclude = ViteTestConfig().test?.coverage?.exclude ?? [];
159
+ expect(exclude).toContain("src/**/*.test-d.ts");
160
+ expect(exclude).toContain("src/**/*.test-d.tsx");
161
+ });
162
+ });
163
+ //# sourceMappingURL=configs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configs.test.js","sourceRoot":"","sources":["../../src/vite/configs.test.ts"],"names":[],"mappings":"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"}
@@ -11,4 +11,5 @@ export { default as ViteEsmConfig } from "./vite.esm.config.js";
11
11
  export { default as VitePluginRemoveUnusedTranslations } from "./vite-plugin-remove-unused-translations.js";
12
12
  export * from "./TsNoCheckPlugin.js";
13
13
  export { default as VitePluginCopy } from "./vite-plugin-copy.js";
14
+ export { default as VitePluginModifyExportsFiles } from "./vite-plugin-modify-exports-files.js";
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,uCAAuC,EAAE,MAAM,kDAAkD,CAAC;AACtH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,6CAA6C,CAAC;AAC5G,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,uCAAuC,EAAE,MAAM,kDAAkD,CAAC;AACtH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,6CAA6C,CAAC;AAC5G,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,uCAAuC,CAAC"}
@@ -11,4 +11,5 @@ import vite_commonjs_config_default from "./vite.commonjs.config.js";
11
11
  import vite_esm_config_default from "./vite.esm.config.js";
12
12
  import VitePluginRemoveUnusedTranslations from "./vite-plugin-remove-unused-translations.js";
13
13
  import { tsNoCheckPlugin } from "./TsNoCheckPlugin.js";
14
- export { vite_backend_config_default as ViteBackendConfig, vite_commonjs_config_default as ViteCommonJSConfig, vite_esm_config_default as ViteEsmConfig, vite_frontend_config_default as ViteFrontendConfig, VitePluginCloseAndCopy, VitePluginCopy, VitePluginExternalizeObfuscatorDeadCode, VitePluginFixAbsoluteImports, VitePluginRemoveUnusedTranslations, VitePluginSourcemapExclude as VitePluginSourceMapExclude, vite_test_config_default as ViteTestConfig, vite_threads_test_config_default as ViteThreadsTestConfig, tsNoCheckPlugin };
14
+ import modifyExportsFilesPlugin from "./vite-plugin-modify-exports-files.js";
15
+ export { vite_backend_config_default as ViteBackendConfig, vite_commonjs_config_default as ViteCommonJSConfig, vite_esm_config_default as ViteEsmConfig, vite_frontend_config_default as ViteFrontendConfig, VitePluginCloseAndCopy, VitePluginCopy, VitePluginExternalizeObfuscatorDeadCode, VitePluginFixAbsoluteImports, modifyExportsFilesPlugin as VitePluginModifyExportsFiles, VitePluginRemoveUnusedTranslations, VitePluginSourcemapExclude as VitePluginSourceMapExclude, vite_test_config_default as ViteTestConfig, vite_threads_test_config_default as ViteThreadsTestConfig, tsNoCheckPlugin };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,uCAAuC,EAAE,MAAM,kDAAkD,CAAC;AACtH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,6CAA6C,CAAC;AAC5G,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,uCAAuC,EAAE,MAAM,kDAAkD,CAAC;AACtH,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,kCAAkC,EAAE,MAAM,6CAA6C,CAAC;AAC5G,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,uCAAuC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=modifyExportsFiles.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifyExportsFiles.test.d.ts","sourceRoot":"","sources":["../../src/vite/modifyExportsFiles.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { emptyExportsFiles } from "./vite-plugin-modify-exports-files.js";
3
+ describe("emptyExportsFiles", () => {
4
+ test("empties an assignment and keeps the code around it", () => {
5
+ expect(emptyExportsFiles('a();\nexports2.FILES = ["a.js", "b.js"];\nb();')).toBe("a();\nexports2.FILES = [];\n\nb();");
6
+ });
7
+ test("empties every assignment, not just the first", () => {
8
+ const out = emptyExportsFiles('exports2.FILES = ["a"];exports2.FILES = ["b"];');
9
+ expect(out).toBe("exports2.FILES = [];\nexports2.FILES = [];\n");
10
+ });
11
+ test("spans newlines, as a formatted listing does", () => {
12
+ expect(emptyExportsFiles('exports2.FILES = [\n\t"a.js"\n];')).toBe("exports2.FILES = [];\n");
13
+ });
14
+ test("leaves code with no assignment untouched", () => {
15
+ expect(emptyExportsFiles("const FILES = [];")).toBe("const FILES = [];");
16
+ });
17
+ test("leaves an unterminated assignment alone rather than truncating", () => {
18
+ const code = 'exports2.FILES = ["a.js"';
19
+ expect(emptyExportsFiles(code)).toBe(code);
20
+ });
21
+ test("stays linear on many unterminated assignments", () => {
22
+ const code = "exports2.FILES = [".repeat(20000);
23
+ const started = performance.now();
24
+ expect(emptyExportsFiles(code)).toBe(code);
25
+ expect(performance.now() - started).toBeLessThan(1000);
26
+ });
27
+ });
28
+ //# sourceMappingURL=modifyExportsFiles.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifyExportsFiles.test.js","sourceRoot":"","sources":["../../src/vite/modifyExportsFiles.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC/D,MAAM,CACL,iBAAiB,CAAC,gDAAgD,CAAC,CACnE,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACzD,MAAM,GAAG,GAAG,iBAAiB,CAC5B,gDAAgD,CAChD,CAAC;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,iBAAiB,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CACjE,wBAAwB,CACxB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;QAE3E,MAAM,IAAI,GAAG,0BAA0B,CAAC;QACxC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QAG1D,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugins.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.test.d.ts","sourceRoot":"","sources":["../../src/vite/plugins.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,232 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { tsNoCheckPlugin } from "./TsNoCheckPlugin.js";
6
+ import VitePluginCopy from "./vite-plugin-copy.js";
7
+ import VitePluginExternalizeObfuscatorDeadCode from "./vite-plugin-externalize-obfuscator-deadcode.js";
8
+ import VitePluginFixAbsoluteImports from "./vite-plugin-fix-absolute-imports.js";
9
+ import { flatten, unflatten, } from "./vite-plugin-remove-unused-translations.js";
10
+ import VitePluginSourcemapExclude from "./vite-plugin-sourcemap-exclude.js";
11
+ const handlerOf = (hook) => {
12
+ if (!hook) {
13
+ throw new Error("plugin does not define the hook");
14
+ }
15
+ return typeof hook === "function" ? hook : hook.handler;
16
+ };
17
+ describe("VitePluginSourcemapExclude", () => {
18
+ const transformOf = (opts) => {
19
+ const plugin = VitePluginSourcemapExclude(opts);
20
+ return handlerOf(plugin.transform);
21
+ };
22
+ it("is named so it can be found in a plugin list", () => {
23
+ expect(VitePluginSourcemapExclude().name).toBe("sourcemap-exclude");
24
+ });
25
+ it("blanks the sourcemap for node_modules when asked", () => {
26
+ const result = transformOf({ excludeNodeModules: true })("code", "/repo/node_modules/zod/index.js");
27
+ expect(result).toEqual({ code: "code", map: { mappings: "" } });
28
+ });
29
+ it("leaves first-party code alone", () => {
30
+ expect(transformOf({ excludeNodeModules: true })("code", "/repo/src/index.ts")).toBeUndefined();
31
+ });
32
+ it("does nothing without the option, or with no options at all", () => {
33
+ expect(transformOf({})("code", "/repo/node_modules/zod/index.js")).toBeUndefined();
34
+ expect(transformOf()("code", "/repo/node_modules/zod/index.js")).toBeUndefined();
35
+ expect(transformOf({ excludeNodeModules: false })("code", "/repo/node_modules/zod/index.js")).toBeUndefined();
36
+ });
37
+ it("matches node_modules anywhere in the id, including nested copies", () => {
38
+ expect(transformOf({ excludeNodeModules: true })("code", "/repo/node_modules/a/node_modules/b/index.js")).toBeDefined();
39
+ });
40
+ });
41
+ describe("VitePluginFixAbsoluteImports", () => {
42
+ const transform = handlerOf(VitePluginFixAbsoluteImports().transform);
43
+ it("runs after other plugins have emitted their imports", () => {
44
+ const plugin = VitePluginFixAbsoluteImports();
45
+ expect(plugin.name).toBe("fix-absolute-imports");
46
+ expect(plugin.enforce).toBe("post");
47
+ });
48
+ it("rewrites a deep builtin import back to the bare specifier", () => {
49
+ expect(transform('import x from "fs/promises/index.js";', "id").code).toBe('import x from "fs";');
50
+ });
51
+ it("rewrites every occurrence in a file", () => {
52
+ const code = 'from "path/posix/x.js";\nfrom "path/win32/y.js";';
53
+ expect(transform(code, "id").code).toBe('from "path";\nfrom "path";');
54
+ });
55
+ it("leaves a bare builtin import untouched", () => {
56
+ const code = 'import fs from "fs";';
57
+ expect(transform(code, "id").code).toBe(code);
58
+ });
59
+ it("leaves third-party deep imports untouched", () => {
60
+ const code = 'import x from "zod/lib/index.js";';
61
+ expect(transform(code, "id").code).toBe(code);
62
+ });
63
+ it("returns empty code unchanged", () => {
64
+ expect(transform("", "id").code).toBe("");
65
+ });
66
+ });
67
+ describe("tsNoCheckPlugin", () => {
68
+ it("prefixes every emitted chunk with a ts-nocheck pragma", () => {
69
+ const bundle = {
70
+ "index.js": { type: "chunk", code: "export const a = 1;" },
71
+ "other.js": { type: "chunk", code: "export const b = 2;" },
72
+ };
73
+ tsNoCheckPlugin().generateBundle({}, bundle);
74
+ expect(bundle["index.js"].code).toBe("// @ts-nocheck\nexport const a = 1;");
75
+ expect(bundle["other.js"].code).toBe("// @ts-nocheck\nexport const b = 2;");
76
+ });
77
+ it("leaves assets and empty chunks alone", () => {
78
+ const bundle = {
79
+ "style.css": { type: "asset", source: "body{}" },
80
+ "empty.js": { type: "chunk", code: "" },
81
+ };
82
+ tsNoCheckPlugin().generateBundle({}, bundle);
83
+ expect(bundle["style.css"]).toEqual({ type: "asset", source: "body{}" });
84
+ expect(bundle["empty.js"].code).toBe("");
85
+ });
86
+ it("handles an empty bundle", () => {
87
+ expect(() => tsNoCheckPlugin().generateBundle({}, {})).not.toThrow();
88
+ });
89
+ it("is named", () => {
90
+ expect(tsNoCheckPlugin().name).toBe("vite-plugin-ts-nocheck");
91
+ });
92
+ });
93
+ describe("VitePluginExternalizeObfuscatorDeadCode", () => {
94
+ const resolveId = handlerOf(VitePluginExternalizeObfuscatorDeadCode().resolveId);
95
+ it("runs before resolution so rolldown never sees the specifier", () => {
96
+ const plugin = VitePluginExternalizeObfuscatorDeadCode();
97
+ expect(plugin.name).toBe("externalize-obfuscator-deadcode");
98
+ expect(plugin.enforce).toBe("pre");
99
+ });
100
+ it("externalises each known dead-code specifier", () => {
101
+ for (const source of [
102
+ "../../package",
103
+ "../redacted.js",
104
+ "../utils/isStandaloneExecutable",
105
+ "./resolve-local-redacted-path",
106
+ "@redacted/components/package",
107
+ "@redacted/enterprise-plugin",
108
+ "@redacted/enterprise-plugin/package",
109
+ ]) {
110
+ expect(resolveId(source), source).toEqual({ id: source, external: true });
111
+ }
112
+ });
113
+ it("defers every other specifier to the normal resolver", () => {
114
+ for (const source of [
115
+ "zod",
116
+ "./real-module.js",
117
+ "",
118
+ "../../package.json",
119
+ ]) {
120
+ expect(resolveId(source), source).toBeNull();
121
+ }
122
+ });
123
+ it("matches exactly, not by prefix", () => {
124
+ expect(resolveId("@redacted/enterprise-plugin/extra")).toBeNull();
125
+ });
126
+ });
127
+ describe("VitePluginCopy", () => {
128
+ let root;
129
+ let cwd;
130
+ beforeEach(() => {
131
+ root = fs.mkdtempSync(path.join(os.tmpdir(), "prosopo-copy-test-"));
132
+ cwd = process.cwd();
133
+ process.chdir(root);
134
+ fs.mkdirSync(path.join(root, "src", "nested"), { recursive: true });
135
+ fs.writeFileSync(path.join(root, "src", "a.txt"), "a");
136
+ fs.writeFileSync(path.join(root, "src", "b.md"), "b");
137
+ fs.writeFileSync(path.join(root, "src", "nested", "c.txt"), "c");
138
+ });
139
+ afterEach(() => {
140
+ process.chdir(cwd);
141
+ fs.rmSync(root, { recursive: true, force: true });
142
+ });
143
+ const run = async (options) => {
144
+ const plugin = VitePluginCopy(options);
145
+ const closeBundle = handlerOf(plugin.closeBundle);
146
+ await closeBundle();
147
+ };
148
+ it("copies matching files and creates the destination tree", async () => {
149
+ await run({ srcDir: "src", destDir: "dist", include: ["**/*.txt"] });
150
+ expect(fs.readFileSync(path.join(root, "dist", "a.txt"), "utf8")).toBe("a");
151
+ expect(fs.readFileSync(path.join(root, "dist", "nested", "c.txt"), "utf8")).toBe("c");
152
+ expect(fs.existsSync(path.join(root, "dist", "b.md"))).toBe(false);
153
+ });
154
+ it("honours the exclude globs", async () => {
155
+ await run({
156
+ srcDir: "src",
157
+ destDir: "dist",
158
+ include: ["**/*.txt"],
159
+ exclude: ["nested/**"],
160
+ });
161
+ expect(fs.existsSync(path.join(root, "dist", "a.txt"))).toBe(true);
162
+ expect(fs.existsSync(path.join(root, "dist", "nested"))).toBe(false);
163
+ });
164
+ it("copies nothing, and says so, when no include glob is given", async () => {
165
+ const info = vi.spyOn(console, "info").mockImplementation(() => undefined);
166
+ await run({ srcDir: "src", destDir: "dist" });
167
+ expect(fs.existsSync(path.join(root, "dist"))).toBe(false);
168
+ expect(info).toHaveBeenCalledWith("[copy-plugin] No include globs specified, nothing to copy.");
169
+ info.mockRestore();
170
+ });
171
+ it("treats an empty include list as no include list", async () => {
172
+ await run({ srcDir: "src", destDir: "dist", include: [] });
173
+ expect(fs.existsSync(path.join(root, "dist"))).toBe(false);
174
+ });
175
+ it("succeeds when nothing matches", async () => {
176
+ await run({ srcDir: "src", destDir: "dist", include: ["**/*.nope"] });
177
+ expect(fs.existsSync(path.join(root, "dist"))).toBe(false);
178
+ });
179
+ it("overwrites an existing destination file", async () => {
180
+ fs.mkdirSync(path.join(root, "dist"), { recursive: true });
181
+ fs.writeFileSync(path.join(root, "dist", "a.txt"), "stale");
182
+ await run({ srcDir: "src", destDir: "dist", include: ["a.txt"] });
183
+ expect(fs.readFileSync(path.join(root, "dist", "a.txt"), "utf8")).toBe("a");
184
+ });
185
+ it("is named", () => {
186
+ expect(VitePluginCopy({ srcDir: "s", destDir: "d" }).name).toBe("copy-plugin");
187
+ });
188
+ });
189
+ describe("translation flatten/unflatten", () => {
190
+ it("flattens nested objects to dotted keys", () => {
191
+ expect(flatten({ a: { b: { c: "x" } }, d: "y" })).toEqual({
192
+ "a.b.c": "x",
193
+ d: "y",
194
+ });
195
+ });
196
+ it("returns an empty object for an empty input", () => {
197
+ expect(flatten({})).toEqual({});
198
+ });
199
+ it("applies a prefix", () => {
200
+ expect(flatten({ a: "x" }, "p.")).toEqual({ "p.a": "x" });
201
+ });
202
+ it("treats arrays as objects, keying by index", () => {
203
+ expect(flatten({ a: ["x", "y"] })).toEqual({ "a.0": "x", "a.1": "y" });
204
+ });
205
+ it("round trips a nested object", () => {
206
+ const original = { a: { b: "x" }, c: "y" };
207
+ expect(unflatten(flatten(original))).toEqual(original);
208
+ });
209
+ it("rebuilds arrays when the next key is numeric", () => {
210
+ expect(unflatten({ "a.0": "x", "a.1": "y" })).toEqual({ a: ["x", "y"] });
211
+ });
212
+ it("keeps object keys that merely look like words", () => {
213
+ expect(unflatten({ "a.b": "x" })).toEqual({ a: { b: "x" } });
214
+ });
215
+ it("merges sibling keys under one parent", () => {
216
+ expect(unflatten({ "a.b": "x", "a.c": "y" })).toEqual({
217
+ a: { b: "x", c: "y" },
218
+ });
219
+ });
220
+ it("handles a top-level key with no dots", () => {
221
+ expect(unflatten({ a: "x" })).toEqual({ a: "x" });
222
+ });
223
+ it("returns an empty object for an empty input", () => {
224
+ expect(unflatten({})).toEqual({});
225
+ });
226
+ it("preserves non-string leaf values", () => {
227
+ expect(unflatten({ "a.b": 1, "a.c": true })).toEqual({
228
+ a: { b: 1, c: true },
229
+ });
230
+ });
231
+ });
232
+ //# sourceMappingURL=plugins.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.test.js","sourceRoot":"","sources":["../../src/vite/plugins.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=translations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translations.test.d.ts","sourceRoot":"","sources":["../../src/vite/translations.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+ import VitePluginRemoveUnusedTranslations from "./vite-plugin-remove-unused-translations.js";
6
+ let root;
7
+ let cwd;
8
+ beforeEach(() => {
9
+ root = fs.mkdtempSync(path.join(os.tmpdir(), "prosopo-translations-test-"));
10
+ cwd = process.cwd();
11
+ process.chdir(root);
12
+ });
13
+ afterEach(() => {
14
+ process.chdir(cwd);
15
+ fs.rmSync(root, { recursive: true, force: true });
16
+ });
17
+ const callHook = (hook, ...args) => {
18
+ if (!hook) {
19
+ throw new Error("plugin does not define the hook");
20
+ }
21
+ const handler = typeof hook === "function" ? hook : hook.handler;
22
+ return handler(...args);
23
+ };
24
+ const writeJson = (name, data) => {
25
+ const filePath = path.join(root, name);
26
+ fs.writeFileSync(filePath, JSON.stringify(data));
27
+ return filePath;
28
+ };
29
+ const readJson = (filePath) => JSON.parse(fs.readFileSync(filePath, "utf-8"));
30
+ const run = async (keys, sources, pattern) => {
31
+ const plugin = VitePluginRemoveUnusedTranslations(keys, pattern);
32
+ for (const source of sources) {
33
+ callHook(plugin.transform, source, "id.ts");
34
+ }
35
+ await callHook(plugin.writeBundle, {}, {});
36
+ };
37
+ describe("VitePluginRemoveUnusedTranslations", () => {
38
+ it("runs after the other plugins, once the code is final", () => {
39
+ expect(VitePluginRemoveUnusedTranslations([], "*.json").enforce).toBe("post");
40
+ });
41
+ it("returns the code it was given, unmodified", () => {
42
+ const plugin = VitePluginRemoveUnusedTranslations(["zz"], "*.json");
43
+ expect(callHook(plugin.transform, "uses zz", "id.ts")).toEqual({
44
+ code: "uses zz",
45
+ });
46
+ });
47
+ it("keeps only the keys the bundle actually references", async () => {
48
+ const file = writeJson("en.json", { kept: "yes", dropped: "no" });
49
+ await run(["kept", "dropped"], ["t('kept')"], `${root}/*.json`);
50
+ expect(readJson(file)).toEqual({ kept: "yes" });
51
+ });
52
+ it("restores the nesting of the keys it keeps", async () => {
53
+ const file = writeJson("en.json", {
54
+ widget: { label: "Verify", hint: "Click" },
55
+ });
56
+ await run(["widget.label", "widget.hint"], ["t('widget.label')"], `${root}/*.json`);
57
+ expect(readJson(file)).toEqual({ widget: { label: "Verify" } });
58
+ });
59
+ it("empties a file whose keys are all unused", async () => {
60
+ const file = writeJson("en.json", { solo: "1" });
61
+ await run(["solo"], ["nothing here"], `${root}/*.json`);
62
+ expect(readJson(file)).toEqual({});
63
+ });
64
+ it("prunes every matching file", async () => {
65
+ const en = writeJson("en.json", { pa: "en", pb: "en" });
66
+ const fr = writeJson("fr.json", { pa: "fr", pb: "fr" });
67
+ await run(["pa", "pb"], ["t('pa')"], `${root}/*.json`);
68
+ expect(readJson(en)).toEqual({ pa: "en" });
69
+ expect(readJson(fr)).toEqual({ pa: "fr" });
70
+ });
71
+ it("does nothing when the pattern matches no file", async () => {
72
+ await expect(run(["nk"], ["t('nk')"], `${root}/none/*.json`)).resolves.toBeUndefined();
73
+ });
74
+ it("leaves a malformed JSON file alone instead of failing the build", async () => {
75
+ const broken = path.join(root, "en.json");
76
+ fs.writeFileSync(broken, "{ not json");
77
+ await expect(run(["mk"], ["t('mk')"], `${root}/*.json`)).resolves.toBeUndefined();
78
+ expect(fs.readFileSync(broken, "utf-8")).toBe("{ not json");
79
+ });
80
+ it("declares no key used when the key list is empty", async () => {
81
+ const file = writeJson("en.json", { ek: "1" });
82
+ await run([], ["t('ek')"], `${root}/*.json`);
83
+ expect(readJson(file)).toEqual({});
84
+ });
85
+ it("matches a key as a substring of the emitted code", async () => {
86
+ const file = writeJson("en.json", { sa: "1", sab: "2" });
87
+ await run(["sa", "sab"], ["t('sab')"], `${root}/*.json`);
88
+ expect(readJson(file)).toEqual({ sa: "1", sab: "2" });
89
+ });
90
+ it("accumulates used keys across every transformed module", async () => {
91
+ const file = writeJson("en.json", { one: "1", two: "2", three: "3" });
92
+ await run(["one", "two", "three"], ["t('one')", "t('two')"], `${root}/*.json`);
93
+ expect(readJson(file)).toEqual({ one: "1", two: "2" });
94
+ });
95
+ });
96
+ //# sourceMappingURL=translations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translations.test.js","sourceRoot":"","sources":["../../src/vite/translations.test.ts"],"names":[],"mappings":"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"}