zyzz 0.0.5 → 0.0.7

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 (91) hide show
  1. package/README.md +26 -1
  2. package/dist/Style.d.ts +3 -3
  3. package/dist/Style.d.ts.map +1 -1
  4. package/dist/Style.js +12 -1
  5. package/dist/Style.js.map +1 -1
  6. package/dist/babel/index.d.ts +2 -0
  7. package/dist/babel/index.d.ts.map +1 -1
  8. package/dist/babel/index.js +10 -1
  9. package/dist/babel/index.js.map +1 -1
  10. package/dist/compiler/Graph.d.ts +2 -0
  11. package/dist/compiler/Graph.d.ts.map +1 -1
  12. package/dist/compiler/Graph.js +19 -1
  13. package/dist/compiler/Graph.js.map +1 -1
  14. package/dist/compiler/Source.d.ts.map +1 -1
  15. package/dist/compiler/Source.js +5 -2
  16. package/dist/compiler/Source.js.map +1 -1
  17. package/dist/compiler/internal/Contributions.d.ts +1 -1
  18. package/dist/compiler/internal/Contributions.d.ts.map +1 -1
  19. package/dist/compiler/internal/Contributions.js +5 -3
  20. package/dist/compiler/internal/Contributions.js.map +1 -1
  21. package/dist/compiler/internal/Static.d.ts.map +1 -1
  22. package/dist/compiler/internal/Static.js +2 -0
  23. package/dist/compiler/internal/Static.js.map +1 -1
  24. package/dist/internal/Authoring.d.ts.map +1 -1
  25. package/dist/internal/Authoring.js +14 -0
  26. package/dist/internal/Authoring.js.map +1 -1
  27. package/dist/internal/Binding.d.ts +7 -0
  28. package/dist/internal/Binding.d.ts.map +1 -1
  29. package/dist/internal/Binding.js.map +1 -1
  30. package/dist/internal/Configuration.d.ts +1 -1
  31. package/dist/internal/Configuration.d.ts.map +1 -1
  32. package/dist/internal/Configuration.js +7 -6
  33. package/dist/internal/Configuration.js.map +1 -1
  34. package/dist/internal/Theme.d.ts +1 -1
  35. package/dist/internal/Theme.d.ts.map +1 -1
  36. package/dist/internal/Theme.js.map +1 -1
  37. package/dist/internal/Token.d.ts +3 -1
  38. package/dist/internal/Token.d.ts.map +1 -1
  39. package/dist/internal/Token.js +28 -3
  40. package/dist/internal/Token.js.map +1 -1
  41. package/dist/internal/Value.d.ts +22 -0
  42. package/dist/internal/Value.d.ts.map +1 -1
  43. package/dist/internal/Value.js +76 -9
  44. package/dist/internal/Value.js.map +1 -1
  45. package/dist/next/index.d.ts +8 -3
  46. package/dist/next/index.d.ts.map +1 -1
  47. package/dist/next/index.js +21 -10
  48. package/dist/next/index.js.map +1 -1
  49. package/dist/next/internal/Project.d.ts +28 -0
  50. package/dist/next/internal/Project.d.ts.map +1 -0
  51. package/dist/next/internal/Project.js +249 -0
  52. package/dist/next/internal/Project.js.map +1 -0
  53. package/dist/next/loader.d.ts +3 -5
  54. package/dist/next/loader.d.ts.map +1 -1
  55. package/dist/next/loader.js +14 -144
  56. package/dist/next/loader.js.map +1 -1
  57. package/dist/node/Reset.d.ts +3 -0
  58. package/dist/node/Reset.d.ts.map +1 -0
  59. package/dist/node/Reset.js +7 -0
  60. package/dist/node/Reset.js.map +1 -0
  61. package/dist/unplugin/index.d.ts +2 -0
  62. package/dist/unplugin/index.d.ts.map +1 -1
  63. package/dist/unplugin/index.js +2 -0
  64. package/dist/unplugin/index.js.map +1 -1
  65. package/dist/variants.d.ts +1 -1
  66. package/dist/variants.d.ts.map +1 -1
  67. package/dist/variants.js.map +1 -1
  68. package/dist/vite/index.d.ts +2 -0
  69. package/dist/vite/index.d.ts.map +1 -1
  70. package/dist/vite/index.js +38 -9
  71. package/dist/vite/index.js.map +1 -1
  72. package/package.json +1 -1
  73. package/src/Style.ts +42 -8
  74. package/src/babel/index.ts +23 -1
  75. package/src/compiler/Graph.ts +22 -0
  76. package/src/compiler/Source.ts +5 -1
  77. package/src/compiler/internal/Contributions.ts +5 -2
  78. package/src/compiler/internal/Static.ts +1 -0
  79. package/src/internal/Authoring.ts +21 -0
  80. package/src/internal/Binding.ts +30 -0
  81. package/src/internal/Configuration.ts +19 -13
  82. package/src/internal/Theme.ts +5 -1
  83. package/src/internal/Token.ts +34 -3
  84. package/src/internal/Value.ts +180 -10
  85. package/src/next/index.ts +34 -12
  86. package/src/next/internal/Project.ts +337 -0
  87. package/src/next/loader.ts +28 -190
  88. package/src/node/Reset.ts +7 -0
  89. package/src/unplugin/index.ts +4 -0
  90. package/src/variants.ts +1 -0
  91. package/src/vite/index.ts +43 -14
@@ -1,14 +1,14 @@
1
1
  import * as Fs from 'node:fs';
2
2
  import * as Module from 'node:module';
3
3
  import * as Path from 'node:path';
4
- export function zyzz(config) {
4
+ export function zyzz(config, options = {}) {
5
5
  if (typeof config === 'function')
6
- return async (phase, context) => zyzz(await config(phase, context));
6
+ return async (phase, context) => zyzz(await config(phase, context), options);
7
7
  if (config instanceof Promise)
8
- return config.then(zyzz);
8
+ return config.then((value) => zyzz(value, options));
9
9
  const loader = Module.createRequire(import.meta.url).resolve('zyzz/next/loader');
10
- const options = { root: process.cwd() };
11
- const shared = Path.join(options.root, '.zyzz', 'next', 'shared.css');
10
+ const loaderOptions = { reset: options.reset ?? false, root: process.cwd() };
11
+ const shared = Path.join(loaderOptions.root, '.zyzz', 'next', 'shared.css');
12
12
  Fs.mkdirSync(Path.dirname(shared), { recursive: true });
13
13
  try {
14
14
  Fs.writeFileSync(shared, '', { flag: 'wx' });
@@ -24,7 +24,10 @@ export function zyzz(config) {
24
24
  all: [{ not: 'foreign' }, { not: { query: /zyzz-style/ } }],
25
25
  },
26
26
  loaders: [
27
- { loader, options: { ...options, bundler: 'turbopack', mode: 'source' } },
27
+ {
28
+ loader,
29
+ options: { ...loaderOptions, bundler: 'turbopack', mode: 'source' },
30
+ },
28
31
  ],
29
32
  };
30
33
  return {
@@ -53,7 +56,11 @@ export function zyzz(config) {
53
56
  loaders: [
54
57
  {
55
58
  loader,
56
- options: { ...options, bundler: 'turbopack', mode: 'style' },
59
+ options: {
60
+ ...loaderOptions,
61
+ bundler: 'turbopack',
62
+ mode: 'style',
63
+ },
57
64
  },
58
65
  ],
59
66
  as: '*.css',
@@ -63,7 +70,11 @@ export function zyzz(config) {
63
70
  loaders: [
64
71
  {
65
72
  loader,
66
- options: { ...options, bundler: 'turbopack', mode: 'shared' },
73
+ options: {
74
+ ...loaderOptions,
75
+ bundler: 'turbopack',
76
+ mode: 'shared',
77
+ },
67
78
  },
68
79
  ],
69
80
  },
@@ -76,12 +87,12 @@ export function zyzz(config) {
76
87
  result.module.rules.push({
77
88
  enforce: 'pre',
78
89
  exclude: /node_modules/,
79
- include: options.root,
90
+ include: loaderOptions.root,
80
91
  test: /\.[cm]?[jt]sx?$/,
81
92
  use: [
82
93
  {
83
94
  loader,
84
- options: { ...options, bundler: 'webpack', mode: 'source' },
95
+ options: { ...loaderOptions, bundler: 'webpack', mode: 'source' },
85
96
  },
86
97
  ],
87
98
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import * as Graph from '../../compiler/Graph.js';
2
+ /** Resolution and dependency notifications supplied by the active loader invocation. */
3
+ export type Context = {
4
+ /** Track graph membership changes. */
5
+ addContextDependency(directory: string): void;
6
+ /** Track source and contract edits. */
7
+ addDependency(file: string): void;
8
+ /** Resolve with the active bundler's aliases and conditions. */
9
+ getResolve(options: object): (directory: string, specifier: string, callback: (error: Error | null, file?: string | false) => void) => void;
10
+ /** Physical loader resource. */
11
+ resourcePath: string;
12
+ };
13
+ /** Creates project state owned by a loader configuration in one worker process. */
14
+ export declare function create(options: create.Options): {
15
+ /** Compiles a fresh snapshot while retaining unchanged syntax and graph results. */
16
+ compile(context: Context, source?: string): Promise<Graph.compile.ReturnType>;
17
+ };
18
+ /** Project cache settings. */
19
+ export declare namespace create {
20
+ /** Isolates source discovery and shared stylesheet options. */
21
+ type Options = {
22
+ /** Include the packaged reset in shared CSS. */
23
+ readonly reset?: boolean | undefined;
24
+ /** Absolute application directory. */
25
+ readonly root: string;
26
+ };
27
+ }
28
+ //# sourceMappingURL=Project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../../src/next/internal/Project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,yBAAyB,CAAA;AAMhD,wFAAwF;AACxF,MAAM,MAAM,OAAO,GAAG;IACpB,sCAAsC;IACtC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7C,uCAAuC;IACvC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,gEAAgE;IAChE,UAAU,CACR,OAAO,EAAE,MAAM,GACd,CACD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,KAAK,IAAI,KAC3D,IAAI,CAAA;IACT,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,mFAAmF;AACnF,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO;IAmB1C,oFAAoF;IACpF,OAAO,UAAU,OAAO,WAAW,MAAM;EA6O5C;AAED,8BAA8B;AAC9B,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,KAAK,OAAO,GAAG;QACb,gDAAgD;QAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QACpC,sCAAsC;QACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KACtB,CAAA;CACF"}
@@ -0,0 +1,249 @@
1
+ /** Retains filesystem snapshots and an incremental graph within a Next.js loader worker. @module */
2
+ import * as Contract from '../../compiler/internal/Contract.js';
3
+ import * as Fs from 'node:fs/promises';
4
+ import * as Graph from '../../compiler/Graph.js';
5
+ import * as Path from 'node:path';
6
+ import * as Reset from '../../node/Reset.js';
7
+ import * as Syntax from '../../compiler/internal/Syntax.js';
8
+ /** Creates project state owned by a loader configuration in one worker process. */
9
+ export function create(options) {
10
+ let compiler = Graph.create();
11
+ const directories = new Map();
12
+ const files = new Map();
13
+ const libraries = new Map();
14
+ const reset = options.reset ? Reset.read() : undefined;
15
+ const syntax = new Map();
16
+ let pending = Promise.resolve();
17
+ return {
18
+ /** Compiles a fresh snapshot while retaining unchanged syntax and graph results. */
19
+ compile(context, source) {
20
+ // Loader calls may overlap, but only one immutable snapshot updates the compiler at a time.
21
+ const result = pending.then(async () => {
22
+ try {
23
+ return await compile(context, source);
24
+ }
25
+ catch (error) {
26
+ // Failed discovery or extraction may leave a partial filesystem snapshot.
27
+ compiler = Graph.create();
28
+ directories.clear();
29
+ files.clear();
30
+ libraries.clear();
31
+ syntax.clear();
32
+ throw error;
33
+ }
34
+ });
35
+ // A failed generation must not prevent recovery after the source is corrected.
36
+ pending = result.then(() => { }, () => { });
37
+ return result;
38
+ },
39
+ };
40
+ async function compile(context, source) {
41
+ const root = options.root;
42
+ const programs = new Map();
43
+ const seenDirectories = new Set();
44
+ const seenFiles = new Set();
45
+ async function read(file) {
46
+ seenFiles.add(file);
47
+ const version = await stamp(file);
48
+ let entry = files.get(file);
49
+ if (entry?.version !== version) {
50
+ entry = { source: await Fs.readFile(file, 'utf8'), version };
51
+ files.set(file, entry);
52
+ }
53
+ return entry.source;
54
+ }
55
+ const modules = Object.create(null);
56
+ const imports = Object.create(null);
57
+ const contracts = Object.create(null);
58
+ const resolve = context.getResolve({});
59
+ const id = (file) => `app/${Path.relative(root, file).split(Path.sep).join('/')}`;
60
+ const eligible = (file) => /\.[cm]?[jt]sx?$/.test(file) &&
61
+ !/\.(?:d|test|test-d|bench|bench-d)\.[cm]?[jt]sx?$/.test(file) &&
62
+ !Path.relative(root, file)
63
+ .split(Path.sep)
64
+ .some((part) => part === '..' || part === 'node_modules' || part.startsWith('.'));
65
+ async function visit(file, text) {
66
+ const name = id(file);
67
+ if (Object.hasOwn(modules, name))
68
+ return;
69
+ context.addDependency(file);
70
+ seenFiles.add(file);
71
+ modules[name] = text ?? (await read(file));
72
+ const links = Object.create(null);
73
+ imports[name] = links;
74
+ let entry = syntax.get(name);
75
+ if (entry?.source !== modules[name]) {
76
+ entry = {
77
+ source: modules[name],
78
+ parsed: Syntax.parse({ moduleId: name, source: modules[name] }),
79
+ };
80
+ syntax.set(name, entry);
81
+ }
82
+ programs.set(name, entry.parsed);
83
+ const parsed = entry.parsed;
84
+ for (const node of parsed.program.body) {
85
+ if ((node.type !== 'ImportDeclaration' &&
86
+ node.type !== 'ExportNamedDeclaration' &&
87
+ node.type !== 'ExportAllDeclaration') ||
88
+ !node.source)
89
+ continue;
90
+ if (node.type === 'ImportDeclaration'
91
+ ? node.importKind === 'type'
92
+ : node.exportKind === 'type')
93
+ continue;
94
+ const specifier = node.source.value;
95
+ links[specifier] = null;
96
+ // Next owns this virtual module, which has no physical stylesheet contract.
97
+ if (specifier === 'next/root-params')
98
+ continue;
99
+ if (specifier === 'zyzz' ||
100
+ (specifier.startsWith('zyzz/') && specifier !== 'zyzz/default') ||
101
+ specifier.startsWith('node:'))
102
+ continue;
103
+ const resolved = await new Promise((accept, reject) => {
104
+ resolve(Path.dirname(file), specifier, (error, value) => error ? reject(error) : accept(value));
105
+ });
106
+ if (!resolved || !/\.[cm]?[jt]sx?$/.test(resolved))
107
+ continue;
108
+ if (eligible(resolved)) {
109
+ links[specifier] = id(resolved);
110
+ await visit(resolved);
111
+ continue;
112
+ }
113
+ const sidecar = `${resolved}.zyzz.json`;
114
+ try {
115
+ contracts[resolved] = await read(sidecar);
116
+ context.addDependency(sidecar);
117
+ links[specifier] = resolved;
118
+ }
119
+ catch (error) {
120
+ if (error.code !== 'ENOENT')
121
+ throw error;
122
+ }
123
+ }
124
+ }
125
+ async function discover(directory) {
126
+ const version = await stamp(directory);
127
+ let cached = directories.get(directory);
128
+ if (cached?.version !== version) {
129
+ const items = await Fs.readdir(directory, { withFileTypes: true });
130
+ cached = {
131
+ items,
132
+ track: !items.some((item) => item.name === 'node_modules') ||
133
+ !(await loops(directory)),
134
+ version,
135
+ };
136
+ directories.set(directory, cached);
137
+ }
138
+ seenDirectories.add(directory);
139
+ const items = cached.items;
140
+ // Linked package roots are tracked through children to avoid recursive dependency loops.
141
+ if (cached.track)
142
+ context.addContextDependency(directory);
143
+ for (const item of items) {
144
+ if (item.name.startsWith('.') ||
145
+ [
146
+ 'node_modules',
147
+ 'dist',
148
+ 'build',
149
+ 'coverage',
150
+ 'test',
151
+ 'tests',
152
+ '__tests__',
153
+ ].includes(item.name))
154
+ continue;
155
+ const file = Path.join(directory, item.name);
156
+ if (item.isDirectory())
157
+ await discover(file);
158
+ else if (item.isFile() && eligible(file))
159
+ await visit(file);
160
+ }
161
+ }
162
+ if (source !== undefined)
163
+ await visit(context.resourcePath, source);
164
+ await discover(root);
165
+ const loaded = new Set();
166
+ async function dependencies(file) {
167
+ if (loaded.has(file))
168
+ return;
169
+ loaded.add(file);
170
+ let library = libraries.get(file);
171
+ if (!library || library.source !== contracts[file]) {
172
+ library = {
173
+ source: contracts[file],
174
+ dependencies: Contract.read(contracts[file], new Map(), file).stylesheets.map((section) => section.dependency ?? []),
175
+ };
176
+ libraries.set(file, library);
177
+ }
178
+ for (const dependency of library.dependencies) {
179
+ let owner = file;
180
+ for (const specifier of dependency) {
181
+ const target = await new Promise((accept, reject) => {
182
+ resolve(Path.dirname(owner), specifier, (error, value) => error ? reject(error) : accept(value));
183
+ });
184
+ if (!target || !Path.isAbsolute(target))
185
+ throw new Error('Unable to resolve packed stylesheet dependency.');
186
+ const links = (imports[owner] ??= Object.create(null));
187
+ links[specifier] = target;
188
+ if (!Object.hasOwn(contracts, target)) {
189
+ const sidecar = `${target}.zyzz.json`;
190
+ contracts[target] = await read(sidecar);
191
+ context.addDependency(sidecar);
192
+ }
193
+ await dependencies(target);
194
+ owner = target;
195
+ }
196
+ }
197
+ }
198
+ for (const file of Object.keys(contracts))
199
+ await dependencies(file);
200
+ const graph = compiler.compile({
201
+ [Syntax.cache]: programs,
202
+ contracts,
203
+ imports,
204
+ modules,
205
+ reset,
206
+ });
207
+ for (const file of files.keys())
208
+ if (!seenFiles.has(file))
209
+ files.delete(file);
210
+ for (const file of directories.keys())
211
+ if (!seenDirectories.has(file))
212
+ directories.delete(file);
213
+ for (const file of libraries.keys())
214
+ if (!Object.hasOwn(contracts, file))
215
+ libraries.delete(file);
216
+ for (const name of syntax.keys())
217
+ if (!programs.has(name))
218
+ syntax.delete(name);
219
+ return graph;
220
+ }
221
+ }
222
+ async function stamp(file) {
223
+ const stat = await Fs.stat(file, { bigint: true });
224
+ return `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeNs}:${stat.ctimeNs}`;
225
+ }
226
+ /** Whether an installed dependency links back to the directory or one of its ancestors. */
227
+ async function loops(directory) {
228
+ const installed = Path.join(directory, 'node_modules');
229
+ const entries = await Fs.readdir(installed, { withFileTypes: true }).catch(() => []);
230
+ const candidates = (await Promise.all(entries.map(async (entry) => {
231
+ if (!entry.name.startsWith('@'))
232
+ return [Path.join(installed, entry.name)];
233
+ const scoped = Path.join(installed, entry.name);
234
+ return (await Fs.readdir(scoped).catch(() => [])).map((name) => Path.join(scoped, name));
235
+ }))).flat();
236
+ for (const candidate of candidates) {
237
+ const stat = await Fs.lstat(candidate).catch(() => undefined);
238
+ if (!stat?.isSymbolicLink())
239
+ continue;
240
+ const target = await Fs.realpath(candidate).catch(() => undefined);
241
+ if (target === undefined)
242
+ continue;
243
+ const relative = Path.relative(target, directory);
244
+ if (!relative.startsWith('..') && !Path.isAbsolute(relative))
245
+ return true;
246
+ }
247
+ return false;
248
+ }
249
+ //# sourceMappingURL=Project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Project.js","sourceRoot":"","sources":["../../../src/next/internal/Project.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,12 @@
1
- type Context = {
2
- addContextDependency(directory: string): void;
3
- addDependency(file: string): void;
1
+ import * as Project from './internal/Project.js';
2
+ type Context = Project.Context & {
4
3
  async(): (error: Error | null, code?: string, map?: object) => void;
5
4
  getOptions(): {
6
5
  bundler: string;
7
6
  mode: 'shared' | 'source' | 'style';
7
+ reset?: boolean | undefined;
8
8
  root: string;
9
9
  };
10
- getResolve(options: object): (directory: string, specifier: string, callback: (error: Error | null, file?: string | false) => void) => void;
11
- resourcePath: string;
12
10
  };
13
11
  /** Loader-runner boundary used by Webpack and Turbopack. */
14
12
  export default function loader(this: Context, source: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/next/loader.ts"],"names":[],"mappings":"AASA,KAAK,OAAO,GAAG;IACb,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7C,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACnE,UAAU,IAAI;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;QACnC,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,UAAU,CACR,OAAO,EAAE,MAAM,GACd,CACD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,KAAK,IAAI,KAC3D,IAAI,CAAA;IACT,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,4DAA4D;AAC5D,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOlE"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/next/loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAEhD,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,GAAG;IAC/B,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACnE,UAAU,IAAI;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAA;QACnC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QAC3B,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;CACF,CAAA;AAKD,4DAA4D;AAC5D,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOlE"}
@@ -1,11 +1,11 @@
1
1
  /** Loads a physical source graph through Next.js resolution and emits cache-owned CSS. @module */
2
+ import * as AtRules from '../compiler/internal/AtRules.js';
2
3
  import * as Crypto from 'node:crypto';
3
4
  import * as Fs from 'node:fs/promises';
4
5
  import * as Path from 'node:path';
5
- import * as Parser from 'oxc-parser';
6
- import * as Graph from '../compiler/Graph.js';
7
- import * as AtRules from '../compiler/internal/AtRules.js';
8
- import * as Contract from '../compiler/internal/Contract.js';
6
+ import * as Project from './internal/Project.js';
7
+ // Next owns loader worker lifetimes. Each project retains only its latest graph in that worker.
8
+ const projects = new Map();
9
9
  /** Loader-runner boundary used by Webpack and Turbopack. */
10
10
  export default function loader(source) {
11
11
  const callback = this.async();
@@ -15,131 +15,24 @@ async function compile(context, source) {
15
15
  const options = context.getOptions();
16
16
  const root = options.root;
17
17
  const directory = Path.resolve(root, '.zyzz', 'next');
18
- const modules = Object.create(null);
19
- const imports = Object.create(null);
20
- const contracts = Object.create(null);
21
- const resolve = context.getResolve({});
22
- const id = (file) => `app/${Path.relative(root, file).split(Path.sep).join('/')}`;
23
18
  const eligible = (file) => /\.[cm]?[jt]sx?$/.test(file) &&
24
19
  !/\.(?:d|test|test-d|bench|bench-d)\.[cm]?[jt]sx?$/.test(file) &&
25
20
  !Path.relative(root, file)
26
21
  .split(Path.sep)
27
22
  .some((part) => part === '..' || part === 'node_modules' || part.startsWith('.'));
23
+ // Next.js hoists instrumentation CSS out of route stylesheets without loading it.
24
+ if (/^(?:src\/)?instrumentation-client\.[cm]?[jt]s$/.test(Path.relative(root, context.resourcePath).split(Path.sep).join('/')))
25
+ return { code: source, map: undefined };
28
26
  if (options.mode !== 'shared' && !eligible(context.resourcePath))
29
27
  return { code: source, map: undefined };
30
- async function visit(file, text) {
31
- const name = id(file);
32
- if (Object.hasOwn(modules, name))
33
- return;
34
- context.addDependency(file);
35
- modules[name] = text ?? (await Fs.readFile(file, 'utf8'));
36
- const links = Object.create(null);
37
- imports[name] = links;
38
- const parsed = Parser.parseSync(file, modules[name], {
39
- sourceType: 'module',
40
- });
41
- for (const node of parsed.program.body) {
42
- if ((node.type !== 'ImportDeclaration' &&
43
- node.type !== 'ExportNamedDeclaration' &&
44
- node.type !== 'ExportAllDeclaration') ||
45
- !node.source)
46
- continue;
47
- if (node.type === 'ImportDeclaration'
48
- ? node.importKind === 'type'
49
- : node.exportKind === 'type')
50
- continue;
51
- const specifier = node.source.value;
52
- links[specifier] = null;
53
- // Next owns this virtual module, which has no physical stylesheet contract.
54
- if (specifier === 'next/root-params')
55
- continue;
56
- if (specifier === 'zyzz' ||
57
- (specifier.startsWith('zyzz/') && specifier !== 'zyzz/default') ||
58
- specifier.startsWith('node:'))
59
- continue;
60
- const resolved = await new Promise((accept, reject) => {
61
- resolve(Path.dirname(file), specifier, (error, value) => error ? reject(error) : accept(value));
62
- });
63
- if (!resolved || !/\.[cm]?[jt]sx?$/.test(resolved))
64
- continue;
65
- if (eligible(resolved)) {
66
- links[specifier] = id(resolved);
67
- await visit(resolved);
68
- continue;
69
- }
70
- const sidecar = `${resolved}.zyzz.json`;
71
- try {
72
- contracts[resolved] = await Fs.readFile(sidecar, 'utf8');
73
- context.addDependency(sidecar);
74
- links[specifier] = resolved;
75
- }
76
- catch (error) {
77
- if (error.code !== 'ENOENT')
78
- throw error;
79
- }
80
- }
28
+ const key = JSON.stringify([root, options.bundler, options.reset ?? false]);
29
+ let project = projects.get(key);
30
+ if (!project) {
31
+ project = Project.create(options);
32
+ projects.set(key, project);
81
33
  }
82
- async function discover(directory) {
83
- const items = await Fs.readdir(directory, { withFileTypes: true });
84
- // Recursive tracking of a package root follows every installed dependency.
85
- // A dependency symlink back to an ancestor, as a package linked from its
86
- // own repository, is rejected as a loop, so such a root is tracked through
87
- // its files and subdirectories instead.
88
- if (!items.some((item) => item.name === 'node_modules') ||
89
- !(await loops(directory)))
90
- context.addContextDependency(directory);
91
- for (const item of items) {
92
- if (item.name.startsWith('.') ||
93
- [
94
- 'node_modules',
95
- 'dist',
96
- 'build',
97
- 'coverage',
98
- 'test',
99
- 'tests',
100
- '__tests__',
101
- ].includes(item.name))
102
- continue;
103
- const file = Path.join(directory, item.name);
104
- if (item.isDirectory())
105
- await discover(file);
106
- else if (item.isFile() && eligible(file))
107
- await visit(file);
108
- }
109
- }
110
- if (options.mode !== 'shared')
111
- await visit(context.resourcePath, source);
112
- await discover(root);
113
- const loaded = new Set();
114
- async function dependencies(file) {
115
- if (loaded.has(file))
116
- return;
117
- loaded.add(file);
118
- const metadata = Contract.read(contracts[file], new Map(), file);
119
- for (const section of metadata.stylesheets) {
120
- let owner = file;
121
- for (const specifier of section.dependency ?? []) {
122
- const target = await new Promise((accept, reject) => {
123
- resolve(Path.dirname(owner), specifier, (error, value) => error ? reject(error) : accept(value));
124
- });
125
- if (!target || !Path.isAbsolute(target))
126
- throw new Error('Unable to resolve packed stylesheet dependency.');
127
- const links = (imports[owner] ??= Object.create(null));
128
- links[specifier] = target;
129
- if (!Object.hasOwn(contracts, target)) {
130
- const sidecar = `${target}.zyzz.json`;
131
- contracts[target] = await Fs.readFile(sidecar, 'utf8');
132
- context.addDependency(sidecar);
133
- }
134
- await dependencies(target);
135
- owner = target;
136
- }
137
- }
138
- }
139
- for (const file of Object.keys(contracts))
140
- await dependencies(file);
141
- const graph = Graph.compile({ contracts, imports, modules });
142
- const output = graph.modules[id(context.resourcePath)];
34
+ const graph = await project.compile(context, options.mode === 'shared' ? undefined : source);
35
+ const output = graph.modules[`app/${Path.relative(root, context.resourcePath).split(Path.sep).join('/')}`];
143
36
  const assets = new Map();
144
37
  for (const [placeholder, target] of Object.entries(graph.sharedAssets ?? {})) {
145
38
  const raw = target.split(/[?#]/)[0];
@@ -266,27 +159,4 @@ async function compile(context, source) {
266
159
  }
267
160
  return { code: `${output.code}\n${requests.join('\n')}`, map };
268
161
  }
269
- /** Whether an installed dependency links back to the directory or one of its ancestors. */
270
- async function loops(directory) {
271
- const installed = Path.join(directory, 'node_modules');
272
- const entries = await Fs.readdir(installed, { withFileTypes: true }).catch(() => []);
273
- const candidates = (await Promise.all(entries.map(async (entry) => {
274
- if (!entry.name.startsWith('@'))
275
- return [Path.join(installed, entry.name)];
276
- const scoped = Path.join(installed, entry.name);
277
- return (await Fs.readdir(scoped).catch(() => [])).map((name) => Path.join(scoped, name));
278
- }))).flat();
279
- for (const candidate of candidates) {
280
- const stat = await Fs.lstat(candidate).catch(() => undefined);
281
- if (!stat?.isSymbolicLink())
282
- continue;
283
- const target = await Fs.realpath(candidate).catch(() => undefined);
284
- if (target === undefined)
285
- continue;
286
- const relative = Path.relative(target, directory);
287
- if (!relative.startsWith('..') && !Path.isAbsolute(relative))
288
- return true;
289
- }
290
- return false;
291
- }
292
162
  //# sourceMappingURL=loader.js.map