@multiplatform.one/config 7.3.0 → 7.4.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/lib/vitest.js CHANGED
@@ -102,8 +102,6 @@ function createVitestConfig(options = {}) {
102
102
  test: testConfig,
103
103
  resolve: {
104
104
  extensions: [
105
- ".test.ts",
106
- ".test.tsx",
107
105
  ".web.ts",
108
106
  ".web.tsx",
109
107
  ".web.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/config",
3
- "version": "7.3.0",
3
+ "version": "7.4.1",
4
4
  "description": "Shared build and test configuration presets for multiplatform.one",
5
5
  "keywords": [
6
6
  "config",
@@ -87,7 +87,7 @@
87
87
  "vite-plugin-external": "^6.2.2",
88
88
  "vite-plugin-i18next-loader": "^3.1.3",
89
89
  "vitest": "^4.1.5",
90
- "@multiplatform.one/utils": "7.3.0"
90
+ "@multiplatform.one/utils": "7.4.1"
91
91
  },
92
92
  "devDependencies": {
93
93
  "tsdown": "^0.21.10",
@@ -0,0 +1,76 @@
1
+ /**
2
+ * createVitestConfig — resolve.extensions must never prefer a .test.* sibling.
3
+ *
4
+ * Regression guard for MPO-11: the defaults listed ".test.ts" / ".test.tsx"
5
+ * first, so vite resolved an extensionless `import "./foo"` to foo.test.ts
6
+ * whenever both files existed. That pulled the test file's own imports into the
7
+ * module graph and killed the lookout unit job with "Cannot bundle Node.js
8
+ * built-in node:test imported from src/format.test.ts".
9
+ */
10
+
11
+ import path from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ import { afterAll, describe, expect, it } from "vitest";
14
+ import { createServer, type ViteDevServer } from "vite";
15
+ import { createVitestConfig } from "./vitest.js";
16
+
17
+ const fixtureDir = path.resolve(
18
+ path.dirname(fileURLToPath(import.meta.url)),
19
+ "../tests/fixtures/extensionless-resolve",
20
+ );
21
+
22
+ const servers: ViteDevServer[] = [];
23
+
24
+ afterAll(async () => {
25
+ await Promise.all(servers.map((server) => server.close()));
26
+ });
27
+
28
+ /**
29
+ * Resolve a specifier through a real vite pipeline built from the produced
30
+ * config, so the assertion exercises vite's own extension probing rather than
31
+ * re-implementing it.
32
+ */
33
+ async function resolveThroughVite(specifier: string, importer: string) {
34
+ const config = createVitestConfig({ tamaguiConfig: false, dedupeReact: false });
35
+ const server = await createServer({
36
+ configFile: false,
37
+ logLevel: "silent",
38
+ root: fixtureDir,
39
+ server: { middlewareMode: true },
40
+ resolve: config.resolve,
41
+ });
42
+ servers.push(server);
43
+ const environment = server.environments?.client ?? server.environments?.ssr;
44
+ const container = environment ? environment.pluginContainer : (server as any).pluginContainer;
45
+ const resolved = await container.resolveId(specifier, importer);
46
+ return resolved?.id ?? null;
47
+ }
48
+
49
+ describe("resolve.extensions", () => {
50
+ it("does not list any .test.* extension", () => {
51
+ const extensions = createVitestConfig().resolve?.extensions ?? [];
52
+ expect(extensions.filter((extension) => extension.startsWith(".test."))).toEqual([]);
53
+ });
54
+
55
+ it("still resolves platform-specific and plain source extensions, web first", () => {
56
+ const extensions = createVitestConfig().resolve?.extensions ?? [];
57
+ expect(extensions).toEqual([
58
+ ".web.ts",
59
+ ".web.tsx",
60
+ ".web.js",
61
+ ".web.jsx",
62
+ ".ts",
63
+ ".tsx",
64
+ ".js",
65
+ ".jsx",
66
+ ]);
67
+ expect(extensions.indexOf(".web.ts")).toBeLessThan(extensions.indexOf(".ts"));
68
+ });
69
+
70
+ it("resolves an extensionless ./foo to foo.ts even when foo.test.ts sits beside it", async () => {
71
+ const id = await resolveThroughVite("./foo", path.join(fixtureDir, "entry.ts"));
72
+ expect(id).toBeTruthy();
73
+ expect(path.basename(id!)).toBe("foo.ts");
74
+ expect(id).not.toContain(".test.");
75
+ });
76
+ });
package/src/vitest.ts CHANGED
@@ -217,18 +217,13 @@ export function createVitestConfig(options: CreateVitestConfigOptions = {}): Use
217
217
  plugins,
218
218
  test: testConfig,
219
219
  resolve: {
220
- extensions: [
221
- ".test.ts",
222
- ".test.tsx",
223
- ".web.ts",
224
- ".web.tsx",
225
- ".web.js",
226
- ".web.jsx",
227
- ".ts",
228
- ".tsx",
229
- ".js",
230
- ".jsx",
231
- ],
220
+ // Never list .test.* here. Vite tries these suffixes in order for an
221
+ // extensionless specifier, so a leading ".test.ts" makes `import "./foo"`
222
+ // resolve to foo.test.ts instead of foo.ts whenever both exist. That drags
223
+ // the test file (and whatever it imports, e.g. node:test) into the module
224
+ // graph and vitest dies with "Cannot bundle Node.js built-in node:test".
225
+ // Test files are collected by test.include globs, not by resolution.
226
+ extensions: [".web.ts", ".web.tsx", ".web.js", ".web.jsx", ".ts", ".tsx", ".js", ".jsx"],
232
227
  mainFields: ["browser", "module", "main"],
233
228
  alias: {
234
229
  ...resolveAliases,
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../src/vitest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEvC,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE/B;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IAE7C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IAEF;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,UAAU,CAmJtF"}
1
+ {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../src/vitest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEvC,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE/B;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IAE7C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IAEF;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,UAAU,CA8ItF"}