@vgpu/wgsl 0.0.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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/dist/compile.d.ts +3 -0
  4. package/dist/compile.d.ts.map +1 -0
  5. package/dist/compile.js +50 -0
  6. package/dist/compile.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +2 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/loader-vite/index.d.ts +10 -0
  12. package/dist/loader-vite/index.d.ts.map +1 -0
  13. package/dist/loader-vite/index.js +19 -0
  14. package/dist/loader-vite/index.js.map +1 -0
  15. package/dist/loader-webpack/index.d.ts +7 -0
  16. package/dist/loader-webpack/index.d.ts.map +1 -0
  17. package/dist/loader-webpack/index.js +16 -0
  18. package/dist/loader-webpack/index.js.map +1 -0
  19. package/dist/runtime/astProjection.d.ts +5 -0
  20. package/dist/runtime/astProjection.d.ts.map +1 -0
  21. package/dist/runtime/astProjection.js +14 -0
  22. package/dist/runtime/astProjection.js.map +1 -0
  23. package/dist/runtime/cacheKey.d.ts +4 -0
  24. package/dist/runtime/cacheKey.d.ts.map +1 -0
  25. package/dist/runtime/cacheKey.js +36 -0
  26. package/dist/runtime/cacheKey.js.map +1 -0
  27. package/dist/runtime/diagnosticTypes.d.ts +15 -0
  28. package/dist/runtime/diagnosticTypes.d.ts.map +1 -0
  29. package/dist/runtime/diagnosticTypes.js +2 -0
  30. package/dist/runtime/diagnosticTypes.js.map +1 -0
  31. package/dist/runtime/errors.d.ts +16 -0
  32. package/dist/runtime/errors.d.ts.map +1 -0
  33. package/dist/runtime/errors.js +19 -0
  34. package/dist/runtime/errors.js.map +1 -0
  35. package/dist/runtime/lru.d.ts +2 -0
  36. package/dist/runtime/lru.d.ts.map +1 -0
  37. package/dist/runtime/lru.js +6 -0
  38. package/dist/runtime/lru.js.map +1 -0
  39. package/dist/runtime/mangler.d.ts +20 -0
  40. package/dist/runtime/mangler.d.ts.map +1 -0
  41. package/dist/runtime/mangler.js +96 -0
  42. package/dist/runtime/mangler.js.map +1 -0
  43. package/dist/runtime/packageResolution.d.ts +11 -0
  44. package/dist/runtime/packageResolution.d.ts.map +1 -0
  45. package/dist/runtime/packageResolution.js +77 -0
  46. package/dist/runtime/packageResolution.js.map +1 -0
  47. package/dist/runtime/parser.d.ts +29 -0
  48. package/dist/runtime/parser.d.ts.map +1 -0
  49. package/dist/runtime/parser.js +129 -0
  50. package/dist/runtime/parser.js.map +1 -0
  51. package/dist/runtime/reflect.d.ts +25 -0
  52. package/dist/runtime/reflect.d.ts.map +1 -0
  53. package/dist/runtime/reflect.js +22 -0
  54. package/dist/runtime/reflect.js.map +1 -0
  55. package/dist/runtime/resolveShader.d.ts +48 -0
  56. package/dist/runtime/resolveShader.d.ts.map +1 -0
  57. package/dist/runtime/resolveShader.js +94 -0
  58. package/dist/runtime/resolveShader.js.map +1 -0
  59. package/dist/runtime/scanner.d.ts +12 -0
  60. package/dist/runtime/scanner.d.ts.map +1 -0
  61. package/dist/runtime/scanner.js +90 -0
  62. package/dist/runtime/scanner.js.map +1 -0
  63. package/dist/runtime/validation.d.ts +2 -0
  64. package/dist/runtime/validation.d.ts.map +1 -0
  65. package/dist/runtime/validation.js +63 -0
  66. package/dist/runtime/validation.js.map +1 -0
  67. package/dist/runtime/xxh64.d.ts +2 -0
  68. package/dist/runtime/xxh64.d.ts.map +1 -0
  69. package/dist/runtime/xxh64.js +58 -0
  70. package/dist/runtime/xxh64.js.map +1 -0
  71. package/dist/tsconfig.tsbuildinfo +1 -0
  72. package/dist/types.d.ts +38 -0
  73. package/dist/types.d.ts.map +1 -0
  74. package/dist/types.js +2 -0
  75. package/dist/types.js.map +1 -0
  76. package/package.json +64 -0
  77. package/src/ResolvedShader.docs.md +28 -0
  78. package/src/compile.docs.md +24 -0
  79. package/src/loader-vite/index.docs.md +7 -0
  80. package/src/loader-webpack/index.docs.md +7 -0
  81. package/src/runtime/resolveShader.docs.md +9 -0
@@ -0,0 +1,77 @@
1
+ import { existsSync, readFileSync, statSync } from "node:fs";
2
+ import { dirname, extname, join, normalize, resolve } from "node:path";
3
+ import { wgslError, wgslWarning } from "./errors.js";
4
+ export function resolveImport(spec, from, opts, diagnostics) {
5
+ if (spec.startsWith("/"))
6
+ throw wgslError("VGPU-WGSL-RES-ABS", "Absolute WGSL imports are not portable");
7
+ if (spec.startsWith("@/") && opts.rootDir)
8
+ return opts.modules ? defaultVirtual(join(opts.rootDir, spec.slice(2)), opts.modules) : defaultFile(join(opts.rootDir, spec.slice(2)));
9
+ for (const [prefix, target] of Object.entries(opts.packageMap ?? {}))
10
+ if (spec.startsWith(prefix))
11
+ return opts.modules ? defaultVirtual(join(target, spec.slice(prefix.length)), opts.modules) : defaultFile(join(target, spec.slice(prefix.length)));
12
+ if (opts.modules && (spec.startsWith("./") || spec.startsWith("../")))
13
+ return defaultVirtual(join(dirname(from), spec), opts.modules);
14
+ if (opts.modules)
15
+ throw wgslError("VGPU-WGSL-PKG-NOTFOUND", `Package ${spec.split("/")[0]} was not found`);
16
+ if (spec.startsWith("./") || spec.startsWith("../"))
17
+ return defaultFile(resolve(dirname(from), spec));
18
+ return packageImport(spec, from, diagnostics);
19
+ }
20
+ export function readModule(path, opts) {
21
+ const text = opts.modules?.[path];
22
+ if (text !== undefined)
23
+ return text;
24
+ if (existsSync(path))
25
+ return readFileSync(path, "utf8");
26
+ throw wgslError("VGPU-WGSL-RES-NOTFOUND", `WGSL module ${path} was not found`);
27
+ }
28
+ export function canonicalEntry(entry, opts) {
29
+ return opts.modules ? defaultVirtual(entry, opts.modules) : defaultFile(resolve(entry));
30
+ }
31
+ function packageImport(spec, from, diagnostics) {
32
+ const parts = spec.split("/");
33
+ const pkg = spec.startsWith("@") ? `${parts[0]}/${parts[1]}` : parts[0];
34
+ const sub = `.${spec.slice(pkg.length) || ""}`;
35
+ for (let dir = dirname(from);;) {
36
+ const pkgJson = join(dir, "node_modules", pkg, "package.json");
37
+ if (existsSync(pkgJson))
38
+ return packageExport(pkgJson, sub, diagnostics);
39
+ if (isWorkspaceRoot(dir))
40
+ break;
41
+ const next = dirname(dir);
42
+ if (next === dir)
43
+ break;
44
+ dir = next;
45
+ }
46
+ throw wgslError("VGPU-WGSL-PKG-NOTFOUND", `Package ${pkg} was not found`);
47
+ }
48
+ function packageExport(pkgJson, sub, diagnostics) {
49
+ const root = dirname(pkgJson);
50
+ const parsed = JSON.parse(readFileSync(pkgJson, "utf8"));
51
+ const value = parsed.exports?.[sub];
52
+ if (typeof value === "string")
53
+ return defaultFile(join(root, value));
54
+ if (value && typeof value.default === "string") {
55
+ warnOnce(diagnostics, "VGPU-WGSL-PKG-CONDITIONAL", `Package export ${sub} uses conditional exports; selecting default`);
56
+ return defaultFile(join(root, value.default));
57
+ }
58
+ for (const [key, target] of Object.entries(parsed.exports ?? {}))
59
+ if (key.includes("*") && typeof target === "string") {
60
+ const [before, after] = key.split("*");
61
+ if (sub.startsWith(before) && sub.endsWith(after))
62
+ return defaultFile(join(root, target.replace("*", sub.slice(before.length, sub.length - after.length))));
63
+ }
64
+ throw wgslError("VGPU-WGSL-PKG-NOTFOUND", `Package export ${sub} was not found`);
65
+ }
66
+ function warnOnce(diagnostics, code, message) { if (!diagnostics.some((item) => item.code === code && item.message === message))
67
+ diagnostics.push(wgslWarning(code, message)); }
68
+ function defaultVirtual(path, modules) { const clean = normalize(path).replace(/\\/g, "/"); if (modules[clean] !== undefined)
69
+ return clean; if (modules[`${clean}.wgsl`] !== undefined)
70
+ return `${clean}.wgsl`; if (modules[`${clean}/index.wgsl`] !== undefined)
71
+ return `${clean}/index.wgsl`; throw wgslError("VGPU-WGSL-RES-NOTFOUND", `WGSL module ${clean} was not found`); }
72
+ function defaultFile(path) { if (existsSync(path) && statSync(path).isDirectory())
73
+ path = join(path, "index.wgsl"); for (const choice of extname(path) ? [path] : [`${path}.wgsl`, join(path, "index.wgsl")])
74
+ if (existsSync(choice))
75
+ return choice; throw wgslError("VGPU-WGSL-RES-NOTFOUND", `WGSL module ${path} was not found`); }
76
+ function isWorkspaceRoot(dir) { return existsSync(join(dir, "pnpm-workspace.yaml")) || existsSync(join(dir, ".git")) || dirname(dir) === dir; }
77
+ //# sourceMappingURL=packageResolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageResolution.js","sourceRoot":"","sources":["../../src/runtime/packageResolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Token } from "./scanner.ts";
2
+ export interface ImportBinding {
3
+ readonly imported: string;
4
+ readonly local: string;
5
+ readonly namespace?: false;
6
+ }
7
+ export interface NamespaceBinding {
8
+ readonly imported: "*";
9
+ readonly local: string;
10
+ readonly namespace: true;
11
+ }
12
+ export interface ImportDecl {
13
+ readonly from: string;
14
+ readonly bindings: readonly (ImportBinding | NamespaceBinding)[];
15
+ readonly start: number;
16
+ readonly end: number;
17
+ }
18
+ export interface ExportDecl {
19
+ readonly name: string;
20
+ readonly localName: string;
21
+ readonly kind: string;
22
+ }
23
+ export interface ModuleParse {
24
+ readonly imports: readonly ImportDecl[];
25
+ readonly exports: readonly ExportDecl[];
26
+ readonly locals: readonly ExportDecl[];
27
+ }
28
+ export declare function parseModule(tokens: readonly Token[]): ModuleParse;
29
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/runtime/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,WAAW,aAAa;IAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAA;CAAE;AAChH,MAAM,WAAW,gBAAgB;IAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;CAAE;AAC9G,MAAM,WAAW,UAAU;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,aAAa,GAAG,gBAAgB,CAAC,EAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACrK,MAAM,WAAW,UAAU;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACxG,MAAM,WAAW,WAAW;IAAG,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE;AAIzJ,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,WAAW,CAgCjE"}
@@ -0,0 +1,129 @@
1
+ import { wgslError } from "./errors.js";
2
+ const declKinds = new Set(["fn", "struct", "const", "alias", "var", "override"]);
3
+ export function parseModule(tokens) {
4
+ const imports = [];
5
+ const locals = [];
6
+ const exports = [];
7
+ let i = 0;
8
+ let sawDecl = false;
9
+ let depth = 0;
10
+ while (i < tokens.length) {
11
+ const token = tokens[i];
12
+ if (token.text === "{") {
13
+ depth++;
14
+ i++;
15
+ continue;
16
+ }
17
+ if (token.text === "}") {
18
+ depth = Math.max(0, depth - 1);
19
+ i++;
20
+ continue;
21
+ }
22
+ if (isComment(token)) {
23
+ i++;
24
+ continue;
25
+ }
26
+ if (depth > 0) {
27
+ i++;
28
+ continue;
29
+ }
30
+ if (token.text === "import") {
31
+ if (sawDecl)
32
+ throw wgslError("VGPU-WGSL-IMP-ORDER", "Imports must precede declarations", token.line, token.column);
33
+ const [decl, next] = parseImport(tokens, i);
34
+ imports.push(decl);
35
+ i = next;
36
+ continue;
37
+ }
38
+ if (token.text === "export" && tokens[i + 1]?.text === "{")
39
+ throw wgslError("VGPU-WGSL-EXP-REEXPORT-CYCLE", "Re-export cycles are not supported", token.line, token.column);
40
+ if (token.text === "@" && tokens[i + 2]?.text === "export" && tokens[i + 3]?.text === "@")
41
+ throw wgslError("VGPU-WGSL-EXP-NOTDECL", "Repeated export attributes", token.line, token.column);
42
+ const exported = token.text === "export" || (token.text === "@" && tokens[i + 2]?.text === "export");
43
+ const kindIndex = exported ? skipAttrs(tokens, token.text === "export" ? i + 1 : i + 3) : i;
44
+ const kind = tokens[kindIndex];
45
+ if (kind && declKinds.has(kind.text)) {
46
+ const name = findDeclName(tokens, kindIndex);
47
+ locals.push({ name, localName: name, kind: kind.text });
48
+ if (exported)
49
+ exports.push({ name, localName: name, kind: kind.text });
50
+ sawDecl = true;
51
+ }
52
+ i++;
53
+ }
54
+ return { imports, exports, locals };
55
+ }
56
+ function parseImport(tokens, start) {
57
+ let i = start + 1;
58
+ const bindings = [];
59
+ if (tokens[i]?.text === "{") {
60
+ i++;
61
+ while (tokens[i] && tokens[i].text !== "}") {
62
+ if (isComment(tokens[i])) {
63
+ i++;
64
+ continue;
65
+ }
66
+ const imported = expectIdent(tokens[i]);
67
+ let local = imported;
68
+ i++;
69
+ if (tokens[i]?.text === "as") {
70
+ local = expectIdent(tokens[i + 1]);
71
+ i += 2;
72
+ }
73
+ bindings.push({ imported, local });
74
+ if (tokens[i]?.text === ",")
75
+ i++;
76
+ }
77
+ i++;
78
+ expectText(tokens[i], "from");
79
+ i++;
80
+ }
81
+ else if (tokens[i]?.text === "*") {
82
+ expectText(tokens[i + 1], "as");
83
+ bindings.push({ imported: "*", local: expectIdent(tokens[i + 2]), namespace: true });
84
+ i += 3;
85
+ expectText(tokens[i], "from");
86
+ i++;
87
+ }
88
+ else if (tokens[i]?.kind === "string") {
89
+ throw wgslError("VGPU-WGSL-IMP-SIDEEFFECT", "Side-effect imports are not supported", tokens[i].line, tokens[i].column);
90
+ }
91
+ else {
92
+ throw wgslError("VGPU-WGSL-IMP-DEFAULT", "Default imports are not supported", tokens[i]?.line, tokens[i]?.column);
93
+ }
94
+ const fromToken = tokens[i];
95
+ if (fromToken?.kind !== "string")
96
+ throw wgslError("VGPU-WGSL-RES-NOTFOUND", "Import path must be a string", fromToken?.line, fromToken?.column);
97
+ const from = fromToken.text.slice(1, -1);
98
+ i++;
99
+ if (tokens[i]?.text === ";")
100
+ i++;
101
+ return [{ from, bindings, start: tokens[start].start, end: tokens[i - 1].end }, i];
102
+ }
103
+ function skipAttrs(tokens, i) {
104
+ while (tokens[i]?.text === "@") {
105
+ i += 2;
106
+ if (tokens[i]?.text === "(")
107
+ while (tokens[i] && tokens[i].text !== ")")
108
+ i++;
109
+ if (tokens[i]?.text === ")")
110
+ i++;
111
+ }
112
+ return i;
113
+ }
114
+ function findDeclName(tokens, kindIndex) {
115
+ let i = kindIndex + 1;
116
+ if (tokens[kindIndex]?.text === "var" && tokens[i]?.text === "<")
117
+ while (tokens[i] && tokens[i].text !== ">")
118
+ i++;
119
+ for (; i < tokens.length; i++)
120
+ if (tokens[i].kind === "ident")
121
+ return tokens[i].text;
122
+ throw wgslError("VGPU-WGSL-EXP-NOTDECL", "Exported declaration has no name", tokens[kindIndex]?.line, tokens[kindIndex]?.column);
123
+ }
124
+ function expectText(token, text) { if (token?.text !== text)
125
+ throw wgslError("VGPU-WGSL-IMP-DEFAULT", `Expected ${text}`, token?.line, token?.column); }
126
+ function expectIdent(token) { if (token?.kind !== "ident")
127
+ throw wgslError("VGPU-WGSL-IMP-DEFAULT", "Expected identifier", token?.line, token?.column); return token.text; }
128
+ function isComment(token) { return token.kind === "lineComment" || token.kind === "blockComment"; }
129
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/runtime/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { MangleModule } from "./mangler.ts";
2
+ export interface Reflection {
3
+ readonly bindings: readonly BindingInfo[];
4
+ readonly entryPoints: readonly EntryPointInfo[];
5
+ readonly overrides: readonly OverrideInfo[];
6
+ readonly featuresRequired: readonly string[];
7
+ readonly hostShareableLayouts: readonly [];
8
+ }
9
+ export interface BindingInfo {
10
+ readonly group: number;
11
+ readonly binding: number;
12
+ readonly name: string;
13
+ }
14
+ export interface EntryPointInfo {
15
+ readonly name: string;
16
+ readonly mangledName: string;
17
+ readonly stage: "vertex" | "fragment" | "compute";
18
+ }
19
+ export interface OverrideInfo {
20
+ readonly name: string;
21
+ readonly mangledName: string;
22
+ readonly defaultValue?: string;
23
+ }
24
+ export declare function reflect(modules: readonly MangleModule[]): Reflection;
25
+ //# sourceMappingURL=reflect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflect.d.ts","sourceRoot":"","sources":["../../src/runtime/reflect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,oBAAoB,EAAE,SAAS,EAAE,CAAC;CAC5C;AACD,MAAM,WAAW,WAAW;IAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACxG,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE;AAC1I,MAAM,WAAW,YAAY;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE;AAErH,wBAAgB,OAAO,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,UAAU,CAmBpE"}
@@ -0,0 +1,22 @@
1
+ export function reflect(modules) {
2
+ const bindings = [];
3
+ const entryPoints = [];
4
+ const overrides = [];
5
+ const featuresRequired = [];
6
+ for (const module of modules) {
7
+ for (const match of module.source.matchAll(/@group\((\d+)\)\s*@binding\((\d+)\)[\s\S]*?var(?:<[^>]+>)?\s+([A-Za-z_][A-Za-z0-9_]*)/g)) {
8
+ bindings.push({ group: Number(match[1]), binding: Number(match[2]), name: match[3] });
9
+ }
10
+ for (const match of module.source.matchAll(/@(vertex|fragment|compute)[\s\S]*?fn\s+([A-Za-z_][A-Za-z0-9_]*)/g)) {
11
+ const stage = match[1];
12
+ entryPoints.push({ stage, name: match[2], mangledName: match[2] });
13
+ }
14
+ for (const match of module.source.matchAll(/\boverride\s+([A-Za-z_][A-Za-z0-9_]*)(?:[^=;]*=\s*([^;]+))?/g)) {
15
+ overrides.push({ name: match[1], mangledName: match[1], defaultValue: match[2]?.trim() });
16
+ }
17
+ for (const match of module.source.matchAll(/\benable\s+([A-Za-z_][A-Za-z0-9_]*)\s*;/g))
18
+ featuresRequired.push(match[1]);
19
+ }
20
+ return { bindings, entryPoints, overrides, featuresRequired, hostShareableLayouts: [] };
21
+ }
22
+ //# sourceMappingURL=reflect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflect.js","sourceRoot":"","sources":["../../src/runtime/reflect.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,OAAO,CAAC,OAAgC;IACtD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,wFAAwF,CAAC,EAAE,CAAC;YACrI,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,kEAAkE,CAAC,EAAE,CAAC;YAC/G,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAsC,CAAC;YAC5D,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,8DAA8D,CAAC,EAAE,CAAC;YAC3G,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,0CAA0C,CAAC;YAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAC3H,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { DiagnosticList } from "./diagnosticTypes.ts";
2
+ import { type Reflection } from "./reflect.ts";
3
+ export interface ResolveOptions {
4
+ readonly entry: string;
5
+ readonly rootDir?: string;
6
+ readonly packageMap?: Record<string, string>;
7
+ readonly modules?: Record<string, string>;
8
+ readonly validate?: boolean;
9
+ }
10
+ export interface WGSLModule {
11
+ readonly path: string;
12
+ readonly exports: readonly {
13
+ readonly name: string;
14
+ readonly localName: string;
15
+ readonly sourcePath: string;
16
+ }[];
17
+ readonly imports: readonly {
18
+ readonly from: string;
19
+ readonly bindings: readonly {
20
+ readonly local: string;
21
+ readonly imported: string;
22
+ }[];
23
+ }[];
24
+ readonly bytes: number;
25
+ readonly hash8: string;
26
+ }
27
+ export interface WGSLAst {
28
+ readonly version: 1;
29
+ readonly modules: readonly WGSLModule[];
30
+ readonly diagnostics: DiagnosticList;
31
+ readonly sourceMap: SourceMap;
32
+ readonly cacheKey: Record<string, string>;
33
+ }
34
+ export interface SourceMap {
35
+ readonly version: 3;
36
+ readonly sources: readonly string[];
37
+ readonly mappings: string;
38
+ }
39
+ export interface ResolvedShader {
40
+ readonly wgsl: string;
41
+ readonly cacheKey: Record<string, string>;
42
+ readonly ast: WGSLAst;
43
+ readonly sourceMap: SourceMap;
44
+ readonly diagnostics: DiagnosticList;
45
+ readonly reflection: Reflection;
46
+ }
47
+ export declare function resolveShader(opts: ResolveOptions): Promise<ResolvedShader>;
48
+ //# sourceMappingURL=resolveShader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveShader.d.ts","sourceRoot":"","sources":["../../src/runtime/resolveShader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK3D,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAKxD,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AAC3M,MAAM,WAAW,UAAU;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS;YAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,EAAE,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AACnW,MAAM,WAAW,OAAO;IAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AACzM,MAAM,WAAW,SAAS;IAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAClH,MAAM,WAAW,cAAc;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE;AAKjO,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAsBjF"}
@@ -0,0 +1,94 @@
1
+ import { dirname } from "node:path";
2
+ import { sourceMap, toAstModule } from "./astProjection.js";
3
+ import { cacheKeys } from "./cacheKey.js";
4
+ import { remember } from "./lru.js";
5
+ import { assertNoMangleCollisions, emitModule } from "./mangler.js";
6
+ import { canonicalEntry, readModule, resolveImport as resolvePath } from "./packageResolution.js";
7
+ import { parseModule } from "./parser.js";
8
+ import { reflect } from "./reflect.js";
9
+ import { wgslError } from "./errors.js";
10
+ import { scan } from "./scanner.js";
11
+ import { validateWGSL } from "./validation.js";
12
+ const scanCache = new Map();
13
+ const resolveCache = new Map();
14
+ export async function resolveShader(opts) {
15
+ const key = JSON.stringify({ entry: opts.entry, rootDir: opts.rootDir, packageMap: opts.packageMap, modules: opts.modules });
16
+ const cached = resolveCache.get(key);
17
+ if (cached)
18
+ return cached;
19
+ const loaded = new Map();
20
+ const diagnostics = [];
21
+ const entry = canonicalEntry(opts.entry, opts);
22
+ loadGraph(entry, opts, loaded, [], diagnostics);
23
+ const modules = [...loaded.values()];
24
+ assertNoMangleCollisions(modules.map((module) => module.path));
25
+ assertNoJsVisibleDuplicates(modules);
26
+ const exportsByPath = buildExports(modules);
27
+ const pathOf = (from, imp) => resolvePath(imp.from, from, opts, diagnostics);
28
+ const wgsl = modules.map((module) => `// vgsl-module: ${module.path}\n${emitModule(module, exportsByPath, pathOf).trim()}\n`).join("\n");
29
+ const reflection = reflect(modules);
30
+ const map = sourceMap(modules);
31
+ if (opts.validate !== false)
32
+ await validateWGSL(wgsl);
33
+ const cacheKey = cacheKeys(modules, reflection, opts.rootDir ?? dirname(entry));
34
+ const ast = { version: 1, modules: modules.map(toAstModule), diagnostics, sourceMap: map, cacheKey };
35
+ const resolved = { wgsl, cacheKey, ast, sourceMap: map, diagnostics, reflection };
36
+ remember(resolveCache, key, resolved);
37
+ return resolved;
38
+ }
39
+ function loadGraph(path, opts, loaded, stack, diagnostics) {
40
+ if (stack.includes(path))
41
+ throw wgslError("VGPU-WGSL-IMP-SELF", `Import cycle: ${[...stack, path].join(" -> ")}`);
42
+ if (loaded.has(path))
43
+ return;
44
+ const source = readModule(path, opts);
45
+ const cacheKey = `${path}:${source}`;
46
+ let module = scanCache.get(cacheKey);
47
+ if (!module) {
48
+ const tokens = scan(source);
49
+ module = { path, source, tokens, parsed: parseModule(tokens) };
50
+ remember(scanCache, cacheKey, module);
51
+ }
52
+ loaded.set(path, module);
53
+ stack.push(path);
54
+ for (const imp of module.parsed.imports)
55
+ loadGraph(resolvePath(imp.from, path, opts, diagnostics), opts, loaded, stack, diagnostics);
56
+ stack.pop();
57
+ }
58
+ function buildExports(modules) {
59
+ const byPath = new Map();
60
+ for (const module of modules) {
61
+ const exports = new Map();
62
+ for (const item of module.parsed.exports)
63
+ exports.set(item.name, { path: module.path, localName: item.localName, kind: entryKind(module, item.localName, item.kind) });
64
+ byPath.set(module.path, exports);
65
+ }
66
+ for (const module of modules)
67
+ checkImportShadows(module);
68
+ return byPath;
69
+ }
70
+ function checkImportShadows(module) {
71
+ const imported = new Set();
72
+ for (const imp of module.parsed.imports)
73
+ for (const binding of imp.bindings) {
74
+ if (imported.has(binding.local))
75
+ throw wgslError("VGPU-WGSL-SYM-IMPORT-SHADOW", `Import ${binding.local} conflicts with another import`);
76
+ imported.add(binding.local);
77
+ if (!binding.namespace && module.parsed.locals.some((local) => local.name === binding.local))
78
+ throw wgslError("VGPU-WGSL-SYM-IMPORT-SHADOW", `Import ${binding.local} shadows a local symbol`);
79
+ }
80
+ }
81
+ function assertNoJsVisibleDuplicates(modules) {
82
+ const overrides = new Map(), entries = new Map();
83
+ for (const module of modules)
84
+ for (const local of module.parsed.locals) {
85
+ if (local.kind === "override")
86
+ duplicate(overrides, local.name, module.path, "VGPU-WGSL-OVERRIDE-DUP");
87
+ if (entryKind(module, local.name, local.kind) === "entry")
88
+ duplicate(entries, local.name, module.path, "VGPU-WGSL-ENTRYPOINT-DUP");
89
+ }
90
+ }
91
+ function duplicate(map, name, path, code) { const previous = map.get(name); if (previous)
92
+ throw wgslError(code, `${name} appears in ${previous} and ${path}`); map.set(name, path); }
93
+ function entryKind(module, name, kind) { return module.source.match(new RegExp(`@(vertex|fragment|compute)[\\s\\S]*?fn\\s+${name}\\b`)) ? "entry" : kind; }
94
+ //# sourceMappingURL=resolveShader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveShader.js","sourceRoot":"","sources":["../../src/runtime/resolveShader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type TokenKind = "ident" | "keyword" | "string" | "lineComment" | "blockComment" | "punct" | "number";
2
+ export interface Token {
3
+ readonly kind: TokenKind;
4
+ readonly text: string;
5
+ readonly start: number;
6
+ readonly end: number;
7
+ readonly line: number;
8
+ readonly column: number;
9
+ }
10
+ export declare function scan(source: string): Token[];
11
+ export declare function hasTopLevelImport(source: string): boolean;
12
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/runtime/scanner.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7G,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAOD,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAgD5C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAOzD"}
@@ -0,0 +1,90 @@
1
+ import { wgslError } from "./errors.js";
2
+ const keywords = new Set([
3
+ "import", "export", "from", "as", "fn", "struct", "const", "alias", "var", "override", "let", "enable",
4
+ "requires", "return", "if", "else", "for", "while", "loop", "switch", "case", "default", "break", "continue",
5
+ ]);
6
+ export function scan(source) {
7
+ const tokens = [];
8
+ let i = 0;
9
+ let line = 1;
10
+ let column = 1;
11
+ const push = (kind, start, end, atLine, atColumn) => tokens.push({ kind, text: source.slice(start, end), start, end, line: atLine, column: atColumn });
12
+ const step = () => {
13
+ if (source[i] === "\n") {
14
+ line++;
15
+ column = 1;
16
+ }
17
+ else
18
+ column++;
19
+ i++;
20
+ };
21
+ while (i < source.length) {
22
+ const ch = source[i];
23
+ if (/\s/.test(ch)) {
24
+ step();
25
+ continue;
26
+ }
27
+ const start = i, atLine = line, atColumn = column;
28
+ if (ch === "/" && source[i + 1] === "/") {
29
+ while (i < source.length && source[i] !== "\n")
30
+ step();
31
+ push("lineComment", start, i, atLine, atColumn);
32
+ continue;
33
+ }
34
+ if (ch === "/" && source[i + 1] === "*") {
35
+ step();
36
+ step();
37
+ while (i < source.length && !(source[i] === "*" && source[i + 1] === "/"))
38
+ step();
39
+ if (i >= source.length)
40
+ throw wgslError("VGPU-WGSL-LEX-UNTERM-COMMENT", "Unterminated block comment", atLine, atColumn);
41
+ step();
42
+ step();
43
+ push("blockComment", start, i, atLine, atColumn);
44
+ continue;
45
+ }
46
+ if (ch === '"' || ch === "'") {
47
+ const quote = ch;
48
+ step();
49
+ while (i < source.length && source[i] !== quote) {
50
+ if (source[i] === "\n")
51
+ throw wgslError("VGPU-WGSL-LEX-UNTERM-STRING", "Unterminated string", atLine, atColumn);
52
+ if (source[i] === "\\")
53
+ step();
54
+ step();
55
+ }
56
+ if (i >= source.length)
57
+ throw wgslError("VGPU-WGSL-LEX-UNTERM-STRING", "Unterminated string", atLine, atColumn);
58
+ step();
59
+ push("string", start, i, atLine, atColumn);
60
+ continue;
61
+ }
62
+ if (/[A-Za-z_]/.test(ch)) {
63
+ while (i < source.length && /[A-Za-z0-9_]/.test(source[i]))
64
+ step();
65
+ const text = source.slice(start, i);
66
+ push(keywords.has(text) ? "keyword" : "ident", start, i, atLine, atColumn);
67
+ continue;
68
+ }
69
+ if (/[0-9]/.test(ch)) {
70
+ while (i < source.length && /[A-Za-z0-9_.]/.test(source[i]))
71
+ step();
72
+ push("number", start, i, atLine, atColumn);
73
+ continue;
74
+ }
75
+ step();
76
+ push("punct", start, i, atLine, atColumn);
77
+ }
78
+ return tokens;
79
+ }
80
+ export function hasTopLevelImport(source) {
81
+ for (const token of scan(source)) {
82
+ if (token.kind === "lineComment" || token.kind === "blockComment")
83
+ continue;
84
+ if (token.kind === "keyword" && (token.text === "enable" || token.text === "requires"))
85
+ continue;
86
+ return token.kind === "keyword" && token.text === "import";
87
+ }
88
+ return false;
89
+ }
90
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/runtime/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function validateWGSL(wgsl: string): Promise<void>;
2
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/runtime/validation.ts"],"names":[],"mappings":"AAYA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9D"}