@three-blocks/devtools 1.0.1-alpha.229.gb2f4ea7d182c → 2.0.0-alpha.238.g8723f0a28ca3

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 (52) hide show
  1. package/CHANGELOG.md +30 -2
  2. package/README.md +27 -4
  3. package/dist/browser/shader-capture.d.ts +13 -1
  4. package/dist/browser/shader-capture.js +2 -2
  5. package/dist/{browser-smoke-X3NBYPHI.js → browser-smoke-EIKJ6OVK.js} +4 -4
  6. package/dist/chunk-4YRR36JN.js +97 -0
  7. package/dist/chunk-65VEJRRT.js +2 -0
  8. package/dist/chunk-GA7PGW2R.js +18 -0
  9. package/dist/{chunk-JMS5NTP7.js → chunk-JHBQB7WC.js} +1 -1
  10. package/dist/chunk-LUULHXFK.js +17 -0
  11. package/dist/chunk-NPLE7PPF.js +3 -0
  12. package/dist/{chunk-YLN3G2JS.js → chunk-OQLHTDDH.js} +1 -1
  13. package/dist/chunk-TRHSN2DJ.cjs +1 -0
  14. package/dist/{chunk-ILOEBEIQ.js → chunk-TUIINI6U.js} +1 -1
  15. package/dist/chunk-V34C7NIM.js +80 -0
  16. package/dist/chunk-W6UL2OW7.js +2 -0
  17. package/dist/cli.js +22 -22
  18. package/dist/environment-bake-XMRKQJXM.js +4 -0
  19. package/dist/index.d.ts +38 -8
  20. package/dist/index.js +24 -21
  21. package/dist/{shader-autowire-DCODBFMX.js → shader-autowire-SPE5DM2X.js} +1 -1
  22. package/dist/{shader-browser-ZGPGYM2U.js → shader-browser-EYE3UT2U.js} +1 -1
  23. package/dist/{shader-browser-FSCRBXJ7.js → shader-browser-WF4HNSAV.js} +1 -1
  24. package/dist/shader-capture-server.d.ts +22 -2
  25. package/dist/shader-capture-server.js +14 -14
  26. package/dist/shader-config-EOFU5D3Y.js +2 -0
  27. package/dist/{shader-project-runner-FJXPTLUO.js → shader-project-runner-S2AID2RJ.js} +1 -1
  28. package/dist/{shader-transform-DSFaVrux.d.ts → shader-transform-D160zMyt.d.ts} +3 -0
  29. package/dist/shader-watch-ISNWIAXN.js +2 -0
  30. package/dist/shader-workflow-T72N2CLS.js +2 -0
  31. package/dist/status-D2RF6QTL.js +2 -0
  32. package/dist/{text-atlas-BHPSDU7C.js → text-atlas-WRYJT3E7.js} +1 -1
  33. package/dist/transform.cjs +1 -1
  34. package/dist/transform.d.ts +1 -1
  35. package/dist/transform.js +1 -1
  36. package/dist/webpack-loader.cjs +1 -1
  37. package/dist/webpack-loader.d.ts +1 -1
  38. package/dist/webpack-loader.js +1 -1
  39. package/package.json +3 -3
  40. package/dist/chunk-4M7M55NS.js +0 -93
  41. package/dist/chunk-5X5NS5EW.js +0 -18
  42. package/dist/chunk-J6OESAZM.js +0 -76
  43. package/dist/chunk-NE7SC2BX.js +0 -2
  44. package/dist/chunk-NEWSG5RX.js +0 -3
  45. package/dist/chunk-PAH76FDD.js +0 -14
  46. package/dist/chunk-PY2ZLMZF.cjs +0 -1
  47. package/dist/chunk-ZDNZCQUQ.js +0 -2
  48. package/dist/environment-bake-5P4IAL4O.js +0 -4
  49. package/dist/shader-config-BYBJUL3C.js +0 -2
  50. package/dist/shader-watch-FVQNE263.js +0 -2
  51. package/dist/shader-workflow-HZWFWHTS.js +0 -2
  52. package/dist/status-TV3G3PG4.js +0 -2
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$1}from'./chunk-ZDNZCQUQ.js';import {d,j,a as a$2,c,g as g$1,f,k}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {realpath,readFile,stat,chmod}from'fs/promises';import p from'path';var g="@three-blocks/devtools/transform",M=["next.config.ts","next.config.mts","next.config.mjs","next.config.js","next.config.cjs"],_=["webpack.config.ts","webpack.config.mts","webpack.config.mjs","webpack.config.js","webpack.config.cjs"],O=["rollup.config.ts","rollup.config.mts","rollup.config.mjs","rollup.config.js","rollup.config.cjs"],C=["build.mjs","build.js","build.ts","scripts/build.mjs","scripts/build.js","scripts/build.ts"];function $(e,n){return [e.dependencies,e.devDependencies,e.peerDependencies,e.optionalDependencies].some(t=>a$1(t)&&typeof t[n]=="string")}a($,"dependency");async function J(e){let n=p.join(e,"package.json");if(!await d(n))return {};let t=await j(e,n,a$2.packageJson,"Project package.json"),r=JSON.parse(t.data.toString("utf8"));if(!a$1(r))throw new Error("Project package.json must contain an object.");return r}a(J,"readPackageManifest");async function y(e,n){for(let t of n)if(await d(p.join(e,t)))return t}a(y,"firstExisting");function S(e,n){switch(n){case "next":return e.includes(g)&&/\bwithThreeBlocksNext\s*\(/u.test(e);case "webpack":return e.includes(g)&&/\bwithThreeBlocksWebpack\s*\(/u.test(e)||e.includes("@three-blocks/devtools/webpack-loader");case "esbuild":return e.includes(g)&&/\bcreateEsbuildShaderPlugin\s*\(/u.test(e);case "rollup":return e.includes(g)&&/\bcreateRollupShaderPlugin\s*\(/u.test(e)}}a(S,"sourceUsesAdapter");function R(e,n){if(!e.startsWith("#!"))return `${n}
2
+ import {a as a$1}from'./chunk-65VEJRRT.js';import {d,j,a as a$2,c,g as g$1,f,k}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {realpath,readFile,stat,chmod}from'fs/promises';import p from'path';var g="@three-blocks/devtools/transform",M=["next.config.ts","next.config.mts","next.config.mjs","next.config.js","next.config.cjs"],_=["webpack.config.ts","webpack.config.mts","webpack.config.mjs","webpack.config.js","webpack.config.cjs"],O=["rollup.config.ts","rollup.config.mts","rollup.config.mjs","rollup.config.js","rollup.config.cjs"],C=["build.mjs","build.js","build.ts","scripts/build.mjs","scripts/build.js","scripts/build.ts"];function $(e,n){return [e.dependencies,e.devDependencies,e.peerDependencies,e.optionalDependencies].some(t=>a$1(t)&&typeof t[n]=="string")}a($,"dependency");async function J(e){let n=p.join(e,"package.json");if(!await d(n))return {};let t=await j(e,n,a$2.packageJson,"Project package.json"),r=JSON.parse(t.data.toString("utf8"));if(!a$1(r))throw new Error("Project package.json must contain an object.");return r}a(J,"readPackageManifest");async function y(e,n){for(let t of n)if(await d(p.join(e,t)))return t}a(y,"firstExisting");function S(e,n){switch(n){case "next":return e.includes(g)&&/\bwithThreeBlocksNext\s*\(/u.test(e);case "webpack":return e.includes(g)&&/\bwithThreeBlocksWebpack\s*\(/u.test(e)||e.includes("@three-blocks/devtools/webpack-loader");case "esbuild":return e.includes(g)&&/\bcreateEsbuildShaderPlugin\s*\(/u.test(e);case "rollup":return e.includes(g)&&/\bcreateRollupShaderPlugin\s*\(/u.test(e)}}a(S,"sourceUsesAdapter");function R(e,n){if(!e.startsWith("#!"))return `${n}
3
3
  ${e}`;let t=e.indexOf(`
4
4
  `);return t<0?`${e}
5
5
  ${n}
@@ -1 +1 @@
1
- export{h as canReuseShaderBrowserSession,l as createAttachedPlaywrightShaderDriver,j as createPlaywrightShaderDriver,k as createStaticPlaywrightShaderDriver,i as isRetryableShaderObservationNavigation,g as publicBridgeScript,f as settleShaderParityFrames,e as waitForShaderCaptureAcrossNavigation}from'./chunk-J6OESAZM.js';import'./chunk-5X5NS5EW.js';import'./chunk-EI7MMDWY.js';
1
+ export{h as canReuseShaderBrowserSession,l as createAttachedPlaywrightShaderDriver,j as createPlaywrightShaderDriver,k as createStaticPlaywrightShaderDriver,i as isRetryableShaderObservationNavigation,g as publicBridgeScript,f as settleShaderParityFrames,e as waitForShaderCaptureAcrossNavigation}from'./chunk-V34C7NIM.js';import'./chunk-GA7PGW2R.js';import'./chunk-EI7MMDWY.js';
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{n as canReuseShaderBrowserSession,r as createAttachedPlaywrightShaderDriver,p as createPlaywrightShaderDriver,q as createStaticPlaywrightShaderDriver,o as isRetryableShaderObservationNavigation,m as publicBridgeScript,l as settleShaderParityFrames,k as waitForShaderCaptureAcrossNavigation}from'./chunk-4M7M55NS.js';import'./chunk-NE7SC2BX.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NEWSG5RX.js';import'./chunk-ZDNZCQUQ.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
2
+ export{n as canReuseShaderBrowserSession,r as createAttachedPlaywrightShaderDriver,p as createPlaywrightShaderDriver,q as createStaticPlaywrightShaderDriver,o as isRetryableShaderObservationNavigation,m as publicBridgeScript,l as settleShaderParityFrames,k as waitForShaderCaptureAcrossNavigation}from'./chunk-4YRR36JN.js';import'./chunk-W6UL2OW7.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
@@ -1,9 +1,13 @@
1
1
  import { PrecompiledManifest } from 'three-blocks/shaders';
2
2
 
3
+ type ShaderBackend = 'webgpu' | 'webgl';
4
+ type ShaderBackendSelection = ShaderBackend | 'both';
3
5
  interface ShaderSceneConfig {
4
6
  readonly key: string;
5
7
  /** Project-relative browser URL, including an optional query string. */
6
8
  readonly url: string;
9
+ /** Restrict this scene to one renderer backend. Absent means every configured backend. */
10
+ readonly backend?: ShaderBackend;
7
11
  readonly requiresText: boolean;
8
12
  /** Optional authoritative project-relative semantic inputs for this scene. */
9
13
  readonly inputs?: readonly string[];
@@ -33,6 +37,8 @@ interface ShaderReadinessConfig {
33
37
  }
34
38
  interface ShaderToolConfig {
35
39
  readonly schemaVersion: 1;
40
+ /** Backends captured and release-gated by default. Absent means both. */
41
+ readonly backend?: ShaderBackendSelection;
36
42
  readonly scenes: readonly ShaderSceneConfig[];
37
43
  readonly settleFrames: number;
38
44
  /** Total post-readiness settle ceiling. Defaults to 30 seconds. */
@@ -40,6 +46,14 @@ interface ShaderToolConfig {
40
46
  /** Chromium is relaunched after this many isolated capture contexts. Defaults to 8. */
41
47
  readonly browserRelaunchScenes?: number;
42
48
  readonly timeoutMs: number;
49
+ /**
50
+ * Hard ceiling for one capture or parity observation when the page keeps
51
+ * showing progress (new registered builds, advancing parity frames, or a
52
+ * main thread busy compiling). `timeoutMs` remains the idle budget — a lane
53
+ * with no progress still fails after `timeoutMs`. Defaults to `timeoutMs`,
54
+ * which disables extension entirely.
55
+ */
56
+ readonly maxTimeoutMs?: number;
43
57
  readonly viewport: {
44
58
  readonly width: number;
45
59
  readonly height: number;
@@ -88,6 +102,7 @@ interface ShaderCoverage {
88
102
  readonly compute: number;
89
103
  }
90
104
  interface ShaderSceneReceipt {
105
+ readonly backend?: 'webgpu' | 'webgl';
91
106
  readonly artifact: string;
92
107
  readonly artifactHash: string;
93
108
  /** Path relative to the configured public directory. */
@@ -115,6 +130,7 @@ interface ShaderReceiptV2 {
115
130
  readonly name: '@three-blocks/devtools';
116
131
  readonly version: string;
117
132
  readonly compatibility: string;
133
+ readonly compatibilities?: Partial<Readonly<Record<'webgpu' | 'webgl', string>>>;
118
134
  readonly transform: number;
119
135
  readonly address: number;
120
136
  readonly recipe: number;
@@ -136,6 +152,7 @@ declare function readInstalledShaderRuntime(root: string): Promise<InstalledShad
136
152
  type ShaderMatrixState = 'fresh' | 'stale' | 'invalid' | 'missing';
137
153
  interface ShaderSceneArtifactStatus {
138
154
  readonly scene: string;
155
+ readonly backend: ShaderBackend;
139
156
  readonly state: ShaderMatrixState;
140
157
  readonly reason: string;
141
158
  readonly coverage?: ShaderCoverage;
@@ -162,9 +179,9 @@ interface ShaderMatrixStatus {
162
179
  readonly timing?: ShaderTiming;
163
180
  }
164
181
  /** Inspect all configured manifests without launching Vite, a browser, or a GPU. */
165
- declare function inspectShaderMatrix(start?: string, runtimeOverride?: InstalledShaderRuntime): Promise<ShaderMatrixStatus>;
182
+ declare function inspectShaderMatrix(start?: string, runtimeOverride?: InstalledShaderRuntime, backendOverride?: ShaderBackendSelection): Promise<ShaderMatrixStatus>;
166
183
 
167
- declare const SHADER_PROVIDER_TRANSFORM_VERSION: 54;
184
+ declare const SHADER_PROVIDER_TRANSFORM_VERSION: 60;
168
185
  interface ShaderSceneTiming {
169
186
  /** Number of registered render/compute NodeBuilder builds covered by the manifest. */
170
187
  readonly builds: number;
@@ -250,6 +267,7 @@ interface ShaderCaptureProvenance {
250
267
  }
251
268
  interface ValidatedShaderCapture {
252
269
  readonly scene: string;
270
+ readonly backend: ShaderBackend;
253
271
  readonly manifest: PrecompiledManifest;
254
272
  readonly skipped: readonly ShaderSkippedBuild[];
255
273
  readonly stats: ShaderCaptureStats;
@@ -259,6 +277,7 @@ interface ValidatedShaderCapture {
259
277
  }
260
278
  interface ValidateShaderCaptureOptions {
261
279
  readonly scene: string;
280
+ readonly backend?: ShaderBackend;
262
281
  readonly runtime: InstalledShaderRuntime;
263
282
  }
264
283
  /** Validate untrusted browser capture data through the public runtime manifest schema. */
@@ -267,6 +286,7 @@ declare function stableStringify(value: unknown, indent?: number): string;
267
286
  interface WriteShaderArtifactsOptions {
268
287
  readonly root: string;
269
288
  readonly scenes: readonly ShaderSceneConfig[];
289
+ readonly backends?: readonly ShaderBackend[];
270
290
  readonly captures: ReadonlyMap<string, ValidatedShaderCapture>;
271
291
  readonly runtime: InstalledShaderRuntime;
272
292
  readonly inputs: ReadonlyMap<string, Readonly<Record<string, string>>>;
@@ -1,19 +1,19 @@
1
- import {realpath,readFile,mkdir,readdir,unlink,lstat,open,rename,rm}from'fs/promises';import w from'path';import {parsePrecompiledManifest,SHADER_HYDRATION_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_ADDRESS_SCHEMA_VERSION,PRECOMPILED_MANIFEST_VERSION,THREE_WEBGPU_R185_COMPATIBILITY,THREE_R186DEV_VERSION,THREE_WEBGPU_R186DEV_COMPATIBILITY}from'three-blocks/shaders';import {createHash,randomUUID}from'crypto';import {createRequire}from'module';var mt=Object.defineProperty;var a=(e,t)=>mt(e,"name",{value:t,configurable:true});var x=Object.freeze({metadata:1024*1024,receipt:2*1024*1024,manifest:32*1024*1024,semanticInput:8*1024*1024,semanticTotal:64*1024*1024,metrics:8*1024*1024,texture:128*1024*1024,packageJson:1024*1024});function Ie(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:void 0}a(Ie,"errorCode");function $(e){return createHash("sha256").update(e).digest("hex")}a($,"sha256");async function A(e){try{return await lstat(e),!0}catch(t){if(Ie(t)==="ENOENT")return false;throw t}}a(A,"pathExists");function N(e,t){let r=w.relative(e,t);return r===""||!w.isAbsolute(r)&&r!==".."&&!r.startsWith(`..${w.sep}`)}a(N,"isWithin");function V(e){return JSON.stringify(e)}a(V,"displayPath");async function _e(e,t,r){let n=await open(e,"r");try{let[i,s,o]=await Promise.all([lstat(e),n.stat(),realpath(e)]);if(i.isSymbolicLink())throw new Error(`${r} must not be a symbolic link: ${V(e)}.`);if(!s.isFile())throw new Error(`${r} must be a regular file: ${V(e)}.`);if(s.size>t)throw new Error(`${r} exceeds the ${t}-byte inspection limit: ${V(e)}.`);let c=await n.readFile();if(c.byteLength>t)throw new Error(`${r} grew beyond the ${t}-byte inspection limit while being read.`);return {path:o,data:c}}finally{await n.close();}}a(_e,"readBoundedRegularFile");async function ee(e,t){let r=w.dirname(e);await mkdir(r,{recursive:true});try{if((await lstat(e)).isSymbolicLink())throw new Error(`Atomic write target must not be a symbolic link: ${V(e)}.`)}catch(s){if(Ie(s)!=="ENOENT")throw s}let n=w.join(r,`.${w.basename(e)}.${process.pid}.${randomUUID()}.tmp`),i;try{i=await open(n,"wx",384),await i.writeFile(t),await i.sync(),await i.close(),i=void 0,await rename(n,e);}finally{await i?.close().catch(()=>{}),await rm(n,{force:true});}}a(ee,"writeAtomicRegularFile");async function le(e,t,r){return _e(e,t,r)}a(le,"readExternalRegularFile");async function H(e,t,r){let n=w.resolve(e),i=w.resolve(t);if(!N(n,i))throw new Error(`${r} escapes its allowed directory.`);let s=await lstat(i);if(s.isSymbolicLink())throw new Error(`${r} must not be a symbolic link.`);if(!s.isDirectory())throw new Error(`${r} must be a directory.`);let[o,c]=await Promise.all([realpath(n),realpath(i)]);if(!N(o,c))throw new Error(`${r} resolves outside its allowed directory.`);return c}a(H,"canonicalDirectoryWithin");async function C(e,t,r,n){let i=w.resolve(e),s=w.resolve(t);if(!N(i,s)||i===s)throw new Error(`${n} escapes its allowed directory.`);let o=await _e(s,r,n),c=await realpath(i);if(!N(c,o.path)||c===o.path)throw new Error(`${n} resolves outside its allowed directory.`);return o}a(C,"readRegularFileWithin");async function Pe(e,t,r,n=8192){let s=[await H(e,t,"Inspected directory")],o=[],c=0;for(;s.length>0;){let l=s.shift();if(l===void 0)break;let m=(await readdir(l,{withFileTypes:true})).sort((g,u)=>g.name.localeCompare(u.name));for(let g of m){if(c+=1,c>n)throw new Error(`Inspected directory exceeds the ${n}-entry limit.`);let u=w.join(l,g.name);if(g.isSymbolicLink())throw new Error(`Inspected directory contains a symbolic link: ${V(w.relative(e,u))}.`);if(g.isDirectory()){s.push(await H(e,u,"Nested inspected directory"));continue}if(g.isFile()&&r(g.name))o.push(u);else if(r(g.name))throw new Error(`Semantic input is not a regular file: ${V(u)}.`)}}return o.sort()}a(Pe,"listRegularFilesRecursively");var te=/^[a-f0-9]{64}$/,Et=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/,Oe=/^[a-z0-9][a-z0-9_-]{0,63}$/,Be=/^[0-9A-Za-z][0-9A-Za-z._/-]{0,127}$/;function f(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}a(f,"isRecord");function z(e){return typeof e=="string"&&Et.test(e)}a(z,"isSafeVersion");function fe(e){if(e.length===0||e.length>512||e.includes("\\")||/[\u0000-\u001f\u007f]/.test(e))return false;let t=e.split("/");return !e.startsWith("/")&&t.every(r=>r.length>0&&r!=="."&&r!=="..")}a(fe,"isSafeRelativePath");function Ne(e){if(!f(e)||e.schemaVersion!==2)throw new Error("three-blocks.json must use schemaVersion 2.");if(typeof e.template!="string"||!Oe.test(e.template))throw new Error("three-blocks.json has an invalid default shader scene key.");if(!Array.isArray(e.layers)||!e.layers.every(t=>typeof t=="string"&&Be.test(t))||new Set(e.layers).size!==e.layers.length)throw new Error("three-blocks.json has invalid layers.");if(e.generator!==void 0&&(!f(e.generator)||typeof e.generator.name!="string"||!Be.test(e.generator.name)||!z(e.generator.version)))throw new Error("three-blocks.json has invalid generator metadata.");if(!f(e.runtime)||!z(e.runtime.three)||!z(e.runtime.threeBlocks))throw new Error("three-blocks.json has invalid runtime versions.");if(!f(e.features)||typeof e.features.text!="boolean")throw new Error("three-blocks.json has invalid feature metadata.");if(!f(e.protocol)||e.protocol.resultFile!==1)throw new Error("three-blocks.json has an unsupported protocol schema.");if(e.artifacts!==void 0){if(!f(e.artifacts)||typeof e.artifacts.shaders!="string"||!["fresh","pending"].includes(e.artifacts.shaders)||typeof e.artifacts.text!="string"||!["fresh","pending","not-applicable"].includes(e.artifacts.text))throw new Error("three-blocks.json has invalid artifact metadata.");if(e.features.text?e.artifacts.text==="not-applicable":e.artifacts.text!=="not-applicable")throw new Error("three-blocks.json text artifact state does not match the text capability.")}return {schemaVersion:2,template:e.template,layers:e.layers,...e.generator===void 0?{}:{generator:{name:e.generator.name,version:e.generator.version}},runtime:{three:e.runtime.three,threeBlocks:e.runtime.threeBlocks},features:{text:e.features.text},...e.artifacts===void 0?{}:{artifacts:{shaders:e.artifacts.shaders,text:e.artifacts.text}},protocol:{resultFile:1}}}a(Ne,"parseProjectMetadata");function Rt(e){if(!f(e))throw new Error("Shader coverage is missing.");for(let t of ["render","vertex","fragment","compute"])if(typeof e[t]!="number"||!Number.isSafeInteger(e[t])||e[t]<0)throw new Error(`Shader coverage.${t} must be a non-negative integer.`);return e}a(Rt,"parseCoverage");function kt(e,t){if(!f(e))throw new Error(`Shader receipt inputs for "${t}" are invalid.`);let r=Object.entries(e);if(r.length===0||r.length>4096)throw new Error(`Shader receipt inputs for "${t}" must contain between 1 and 4096 files.`);for(let[n,i]of r)if(!fe(n)||typeof i!="string"||!te.test(i))throw new Error(`Shader receipt input for "${t}" is invalid.`)}a(kt,"parseInputs");function re(e){if(!f(e)||e.schemaVersion!==2||!f(e.runtime)||!z(e.runtime.three)||!z(e.runtime.threeBlocks)||typeof e.runtime.threeBlocksShaderClosure!="string"||!te.test(e.runtime.threeBlocksShaderClosure)||!f(e.scenes))throw new Error("Shader meta.json does not match receipt schema 2.");if(e.runtime.capture!==void 0&&(!f(e.runtime.capture)||typeof e.runtime.capture.userAgent!="string"||e.runtime.capture.userAgent.length>1024||typeof e.runtime.capture.adapter!="string"||e.runtime.capture.adapter.length>1024||!Array.isArray(e.runtime.capture.features)||e.runtime.capture.features.length>256||!e.runtime.capture.features.every(r=>typeof r=="string"&&r.length>0&&r.length<=128)))throw new Error("Shader meta.json has invalid browser capture provenance.");let t=Object.entries(e.scenes);if(t.length===0)throw new Error("Shader meta.json contains no scenes.");for(let[r,n]of t){if(!Oe.test(r)||!f(n)||typeof n.artifact!="string"||!fe(n.artifact)||!n.artifact.endsWith(".webgpu.ts")||typeof n.artifactHash!="string"||!te.test(n.artifactHash))throw new Error(`Shader receipt for "${r}" is invalid.`);if(n.asset===void 0!=(n.assetHash===void 0)||n.asset!==void 0&&(typeof n.asset!="string"||!fe(n.asset)||!n.asset.endsWith(".json")||typeof n.assetHash!="string"||!te.test(n.assetHash)))throw new Error(`Shader static asset receipt for "${r}" is invalid.`);if(kt(n.inputs,r),Rt(n.coverage),n.bytes!==void 0&&(!Number.isSafeInteger(n.bytes)||Number(n.bytes)<0))throw new Error(`Shader receipt byte count for "${r}" is invalid.`);if(n.skipped!==void 0&&(!f(n.skipped)||!Number.isSafeInteger(n.skipped.render)||Number(n.skipped.render)<0||!Number.isSafeInteger(n.skipped.compute)||Number(n.skipped.compute)<0))throw new Error(`Shader receipt skipped-build counts for "${r}" are invalid.`)}if(e.tool!==void 0&&(!f(e.tool)||e.tool.name!=="@three-blocks/devtools"||!z(e.tool.version)||typeof e.tool.compatibility!="string"||!Number.isSafeInteger(e.tool.transform)||!Number.isSafeInteger(e.tool.address)||!Number.isSafeInteger(e.tool.recipe)||!Number.isSafeInteger(e.tool.hydration)))throw new Error("Shader meta.json has invalid tool compatibility metadata.");return e}a(re,"parseShaderReceipt");var ve="three-blocks.shaders.json",he=".three-blocks/shaders";var Tt=/^[a-z0-9][a-z0-9_-]{0,63}$/u,jt=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u,De=64,Le=64,At={schemaVersion:1,scenes:[{key:"default",url:"/"}]};function Fe(e,t,r){if(e===void 0)return r;if(typeof e!="string"||e.length===0||e.length>512||w.isAbsolute(e)||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a bounded project-relative directory.`);let n=w.posix.normalize(e.replaceAll("\\","/")).replace(/\/+$/u,"");if(n==="."||n===".."||n.startsWith("../"))throw new Error(`${t} must stay inside the project.`);return n}a(Fe,"safeProjectDirectory");function $t(e,t){let r=Fe(e,t,"");if(typeof e!="string"||e.endsWith("/"))throw new Error(`${t} must be a project-relative file.`);return r}a($t,"safeProjectFile");function D(e,t,r,n,i){if(e===void 0)return i;if(!Number.isSafeInteger(e)||Number(e)<r||Number(e)>n)throw new Error(`${t} must be an integer in ${r}...${n}.`);return Number(e)}a(D,"boundedInteger");function Ve(e,t,r){if(e===void 0)return r;if(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)throw new Error(`${t} must be a finite ratio in 0...1.`);return e}a(Ve,"finiteRatio");function He(e,t){if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a bounded project-relative URL.`);let r;try{r=new URL(e,"http://three-blocks.invalid/");}catch{throw new Error(`${t} is not a valid URL.`)}if(r.origin!=="http://three-blocks.invalid"||r.hash.length>0)throw new Error(`${t} must stay within the project and must not contain a fragment.`);return `${r.pathname}${r.search}`}a(He,"safeBrowserUrl");function Ct(e){if(!Array.isArray(e)||e.length===0||e.length>De)throw new Error(`Shader config scenes must contain 1...${De} entries.`);let t=new Set;return e.map((r,n)=>{if(!f(r)||typeof r.key!="string"||!Tt.test(r.key))throw new Error(`Shader config scene ${n} has an invalid key.`);if(t.has(r.key))throw new Error(`Shader config scene key "${r.key}" is duplicated.`);t.add(r.key);let i=r.parityFrames,s=r.maxDiffRatio;if(r.inputs!==void 0&&(!Array.isArray(r.inputs)||r.inputs.length===0||r.inputs.length>Le))throw new Error(`Shader config scene "${r.key}" inputs must contain 1...${Le} files.`);let o=r.inputs===void 0?void 0:r.inputs.map((c,l)=>$t(c,`Shader config scene "${r.key}" input ${l}`));if(o!==void 0&&new Set(o).size!==o.length)throw new Error(`Shader config scene "${r.key}" inputs must be unique.`);if(r.runtimeMotion!==void 0&&typeof r.runtimeMotion!="boolean")throw new Error(`Shader config scene "${r.key}" runtimeMotion must be a boolean.`);return {key:r.key,url:He(r.url,`Shader config scene "${r.key}" URL`),requiresText:r.requiresText===true,...o===void 0?{}:{inputs:o},...i===void 0?{}:{parityFrames:D(i,`Shader config scene "${r.key}" parityFrames`,0,1e4,0)},...s===void 0?{}:{maxDiffRatio:Ve(s,`Shader config scene "${r.key}" maxDiffRatio`,.01)},...r.runtimeMotion===true?{runtimeMotion:true}:{}}})}a(Ct,"parseScenes");function pe(e){if(!f(e)||e.schemaVersion!==void 0&&e.schemaVersion!==1)throw new Error("Shader config must use schemaVersion 1.");let t=e.viewport;if(t!==void 0&&!f(t))throw new Error("Shader config viewport must be an object.");let r=e.parity;if(r!==void 0&&!f(r))throw new Error("Shader config parity must be an object.");let n=e.bridge;if(n!==void 0&&!f(n))throw new Error("Shader config bridge must be an object.");let i=f(n)?n.deterministicModule:void 0;i!==void 0&&He(i,"Shader deterministic module");let s=e.readiness;if(s!==void 0&&!f(s))throw new Error("Shader config readiness must be an object.");let o=f(s)?s.selector:void 0;if(o!==void 0&&(typeof o!="string"||o.length===0||o.length>512||/[\u0000-\u001f\u007f]/u.test(o)))throw new Error("Shader readiness selector must be a bounded, non-empty CSS selector.");let c=f(s)?s.global:void 0;if(c!==void 0&&(typeof c!="string"||!jt.test(c)))throw new Error("Shader readiness global must be a dot-separated JavaScript property path.");return {schemaVersion:1,scenes:Ct(e.scenes),settleFrames:D(e.settleFrames,"Shader settleFrames",0,1e4,60),settleTimeoutMs:D(e.settleTimeoutMs,"Shader settleTimeoutMs",1e3,15*6e4,3e4),browserRelaunchScenes:D(e.browserRelaunchScenes,"Shader browserRelaunchScenes",1,64,8),timeoutMs:D(e.timeoutMs,"Shader timeoutMs",1e3,15*6e4,24e4),viewport:{width:D(f(t)?t.width:void 0,"Shader viewport width",64,8192,1024),height:D(f(t)?t.height:void 0,"Shader viewport height",64,8192,640)},parity:{frames:D(f(r)?r.frames:void 0,"Shader parity frames",0,1e4,90),channelTolerance:D(f(r)?r.channelTolerance:void 0,"Shader parity channelTolerance",0,255,8),maxDiffRatio:Ve(f(r)?r.maxDiffRatio:void 0,"Shader parity maxDiffRatio",.01)},bridge:{legacyLab:f(n)&&n.legacyLab===true,...typeof i=="string"?{deterministicModule:i}:{}},readiness:{...typeof o=="string"?{selector:o}:{},...typeof c=="string"?{global:c}:{}},publicDir:Fe(e.publicDir,"Shader publicDir","public"),allowLiveBuilds:e.allowLiveBuilds!==false}}a(pe,"parseShaderToolConfig");async function ze(e=process.cwd()){let t=w.resolve(e);for(;;){if(await A(w.join(t,ve))||await A(w.join(t,"three-blocks.json")))return realpath(t);let r=w.join(t,"package.json");if(await A(r)){let i=await C(t,r,x.packageJson,"Project package.json"),s;try{s=JSON.parse(i.data.toString("utf8"));}catch{throw new Error(`Project package.json is not valid JSON: ${r}.`)}if(f(s)&&[s.dependencies,s.devDependencies,s.peerDependencies,s.optionalDependencies].filter(f).some(l=>typeof l.three=="string"||typeof l["three-blocks"]=="string"||typeof l["@three-blocks/devtools"]=="string"))return realpath(t)}let n=w.dirname(t);if(n===t)throw new Error(`No Three Blocks shader project found from ${JSON.stringify(w.resolve(e))}; add Three.js to package.json or pass --root.`);t=n;}}a(ze,"findShaderProjectRoot");async function ge(e){let t=await realpath(e),r=w.join(t,ve);if(await A(r)){let i=await C(t,r,x.metadata,"Shader configuration");return pe(JSON.parse(i.data.toString("utf8")))}let n=w.join(t,"three-blocks.json");if(await A(n)){let i=Ne(JSON.parse(await readFile(n,"utf8")));return pe({schemaVersion:1,scenes:[{key:i.template,url:"/",requiresText:i.features.text}]})}return pe(At)}a(ge,"loadShaderToolConfig");function J(e){if(/^0\.185\./u.test(e))return THREE_WEBGPU_R185_COMPATIBILITY;if(e===THREE_R186DEV_VERSION)return THREE_WEBGPU_R186DEV_COMPATIBILITY;throw new Error(`Three.js ${e} is outside the supported shader compatibility contracts.`)}a(J,"shaderCompatibilityForThree");var q="0.1.0";var se=54,Ot="timing.local.json",Nt="timing.json";var ie=4096,Dt=4096;function ye(e,t,r=8192){if(typeof e!="string"||e.length===0||e.length>r||/[\u0000\u007f]/u.test(e))throw new Error(`${t} must be a bounded non-empty string.`);return e}a(ye,"boundedString");function y(e,t,r=true){if(typeof e!="number"||!Number.isFinite(e)||e<0||r&&!Number.isSafeInteger(e))throw new Error(`${t} must be a non-negative ${r?"integer":"finite number"}.`);return e}a(y,"nonNegativeNumber");function Lt(e){if(!f(e))throw new Error("Shader capture stats are missing.");let t={buildCalls:y(e.buildCalls,"capture stats.buildCalls"),renderBuilds:y(e.renderBuilds,"capture stats.renderBuilds"),computeBuilds:y(e.computeBuilds,"capture stats.computeBuilds"),registeredBuilds:y(e.registeredBuilds,"capture stats.registeredBuilds"),registeredRenderBuilds:y(e.registeredRenderBuilds,"capture stats.registeredRenderBuilds"),registeredComputeBuilds:y(e.registeredComputeBuilds,"capture stats.registeredComputeBuilds"),buildMs:y(e.buildMs,"capture stats.buildMs",false),syncBuildMs:y(e.syncBuildMs,"capture stats.syncBuildMs",false),asyncBuildElapsedMs:y(e.asyncBuildElapsedMs,"capture stats.asyncBuildElapsedMs",false),precompiledSetupMs:y(e.precompiledSetupMs,"capture stats.precompiledSetupMs",false),maxSyncBuildMs:y(e.maxSyncBuildMs??e.syncBuildMs,"capture stats.maxSyncBuildMs",false),maxPrecompiledSetupMs:y(e.maxPrecompiledSetupMs??e.precompiledSetupMs,"capture stats.maxPrecompiledSetupMs",false),hydrationMs:y(e.hydrationMs??0,"capture stats.hydrationMs",false),maxHydrationMs:y(e.maxHydrationMs??e.hydrationMs??0,"capture stats.maxHydrationMs",false),injected:y(e.injected,"capture stats.injected"),injectedRender:y(e.injectedRender,"capture stats.injectedRender"),injectedCompute:y(e.injectedCompute,"capture stats.injectedCompute"),missed:y(e.missed,"capture stats.missed"),missedRender:y(e.missedRender,"capture stats.missedRender"),missedCompute:y(e.missedCompute,"capture stats.missedCompute"),...Array.isArray(e.missedKeys)&&e.missedKeys.every(r=>typeof r=="string")?{missedKeys:e.missedKeys.slice(0,ie)}:{}};if(t.renderBuilds+t.computeBuilds!==t.buildCalls||t.registeredRenderBuilds+t.registeredComputeBuilds!==t.registeredBuilds||t.injectedRender+t.injectedCompute!==t.injected||t.missedRender+t.missedCompute!==t.missed||t.registeredBuilds>t.buildCalls||Math.abs(t.syncBuildMs+t.asyncBuildElapsedMs-t.buildMs)>.001||t.maxSyncBuildMs>t.syncBuildMs+.001||t.maxPrecompiledSetupMs>t.precompiledSetupMs+.001||t.maxHydrationMs>t.hydrationMs+.001)throw new Error("Shader capture stats totals are inconsistent.");return t}a(Lt,"captureStats");function vt(e){if(!Array.isArray(e)||e.length>ie)throw new Error("Shader capture skipped builds are invalid.");return e.map((t,r)=>{if(!f(t)||t.kind!=="render"&&t.kind!=="compute")throw new Error(`Shader capture skipped build ${r} is invalid.`);return {kind:t.kind,name:ye(t.name,`skipped build ${r} name`,512),reason:ye(t.reason,`skipped build ${r} reason`)}})}a(vt,"skippedBuilds");function Ft(e){let t=0,r=0,n=0,i=0;for(let s of Object.values(e.entries)){let o=e.states[s];o!==void 0&&((o.vertex!==null||o.fragment!==null)&&t++,o.vertex!==null&&r++,o.fragment!==null&&n++,o.compute!==null&&i++);}return {render:t,vertex:r,fragment:n,compute:i}}a(Ft,"shaderCoverage");function Vt(e,t){if(!f(e))throw new Error("Shader capture payload must be an object.");if(e.scene!==t.scene)throw new Error(`Shader capture scene does not match "${t.scene}".`);if(e.protocolVersion!==2)throw new Error("Shader capture protocolVersion must be 2.");let r=J(t.runtime.three);if(e.compatibility!==r)throw new Error(`Shader capture compatibility must be "${r}".`);if(!f(e.entries))throw new Error("Shader capture entries must be an object.");if(typeof e.requiresSetup!="boolean")throw new Error("Shader capture requiresSetup must be boolean.");let n=Object.keys(e.entries).length;if(n===0||n>ie)throw new Error(`Shader capture must contain 1...${ie} entries.`);if(!Array.isArray(e.errors)||e.errors.length>Dt)throw new Error("Shader capture errors are invalid.");let i=e.errors.map((p,d)=>ye(p,`capture error ${d}`,64*1024));if(i.length>0)throw new Error(`Shader capture failed:
2
- - ${i.join(`
3
- - `)}`);let s=vt(e.skipped),o=Lt(e.stats),c=f(e.timing)?e.timing:void 0,l=c===void 0?void 0:Object.fromEntries(["launch","firstRequest","readiness","lastBuild","settled","posted"].flatMap(p=>{let d=c[p];if(d===void 0)return [];if(typeof d!="number"||!Number.isFinite(d)||d<0)throw new Error(`Shader capture timing.${p} is invalid.`);return [[p,d]]})),m;if(e.provenance!==void 0){if(!f(e.provenance)||typeof e.provenance.userAgent!="string"||e.provenance.userAgent.length>1024||typeof e.provenance.adapter!="string"||e.provenance.adapter.length>1024||!Array.isArray(e.provenance.features)||e.provenance.features.length>256||!e.provenance.features.every(p=>typeof p=="string"&&p.length<=128))throw new Error("Shader capture provenance is invalid.");m={userAgent:e.provenance.userAgent,adapter:e.provenance.adapter,features:[...new Set(e.provenance.features)].sort()};}let g=parsePrecompiledManifest({version:PRECOMPILED_MANIFEST_VERSION,scene:t.scene,three:t.runtime.three,threeBlocks:t.runtime.threeBlocks,runtime:{id:r,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION},...e.automatic===void 0?{}:{automatic:e.automatic},requiresSetup:e.requiresSetup,modules:e.modules,nodes:e.nodes,layouts:e.layouts,attributePlans:e.attributePlans,updatePlans:e.updatePlans,requirementPlans:e.requirementPlans,states:e.states,entries:e.entries}),u=Ft(g);if(o.registeredRenderBuilds<u.render||o.registeredComputeBuilds<u.compute)throw new Error("Shader capture did not live-build every distinct registered render/compute entry.");return {scene:t.scene,manifest:g,skipped:s,stats:o,coverage:u,...l===void 0?{}:{timing:l},...m===void 0?{}:{provenance:m}}}a(Vt,"validateShaderCapture");function U(e,t=0){let r=" ".repeat(t),n=" ".repeat(t+1);if(Array.isArray(e))return e.length===0?"[]":e.every(s=>s===null||["number","string","boolean"].includes(typeof s))?JSON.stringify(e):`[
4
- ${e.map(s=>`${n}${U(s,t+1)}`).join(`,
1
+ import {realpath,readFile,mkdir,readdir,unlink,lstat,open,rename,rm}from'fs/promises';import b from'path';import {parsePrecompiledManifest,SHADER_HYDRATION_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_ADDRESS_SCHEMA_VERSION,PRECOMPILED_MANIFEST_VERSION,THREE_WEBGL_R185_COMPATIBILITY,THREE_WEBGPU_R185_COMPATIBILITY,THREE_R186DEV_VERSION,THREE_WEBGPU_R186DEV_COMPATIBILITY}from'three-blocks/shaders';import {createHash,randomUUID}from'crypto';import {createRequire}from'module';var kt=Object.defineProperty;var o=(e,t)=>kt(e,"name",{value:t,configurable:true});var $=Object.freeze({metadata:1024*1024,receipt:2*1024*1024,manifest:32*1024*1024,semanticInput:8*1024*1024,semanticTotal:64*1024*1024,metrics:8*1024*1024,texture:128*1024*1024,packageJson:1024*1024});function De(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:void 0}o(De,"errorCode");function I(e){return createHash("sha256").update(e).digest("hex")}o(I,"sha256");async function C(e){try{return await lstat(e),!0}catch(t){if(De(t)==="ENOENT")return false;throw t}}o(C,"pathExists");function v(e,t){let r=b.relative(e,t);return r===""||!b.isAbsolute(r)&&r!==".."&&!r.startsWith(`..${b.sep}`)}o(v,"isWithin");function z(e){return JSON.stringify(e)}o(z,"displayPath");async function Fe(e,t,r){let n=await open(e,"r");try{let[i,s,a]=await Promise.all([lstat(e),n.stat(),realpath(e)]);if(i.isSymbolicLink())throw new Error(`${r} must not be a symbolic link: ${z(e)}.`);if(!s.isFile())throw new Error(`${r} must be a regular file: ${z(e)}.`);if(s.size>t)throw new Error(`${r} exceeds the ${t}-byte inspection limit: ${z(e)}.`);let c=await n.readFile();if(c.byteLength>t)throw new Error(`${r} grew beyond the ${t}-byte inspection limit while being read.`);return {path:a,data:c}}finally{await n.close();}}o(Fe,"readBoundedRegularFile");async function ce(e,t){let r=b.dirname(e);await mkdir(r,{recursive:true});try{if((await lstat(e)).isSymbolicLink())throw new Error(`Atomic write target must not be a symbolic link: ${z(e)}.`)}catch(s){if(De(s)!=="ENOENT")throw s}let n=b.join(r,`.${b.basename(e)}.${process.pid}.${randomUUID()}.tmp`),i;try{i=await open(n,"wx",384),await i.writeFile(t),await i.sync(),await i.close(),i=void 0,await rename(n,e);}finally{await i?.close().catch(()=>{}),await rm(n,{force:true});}}o(ce,"writeAtomicRegularFile");async function ye(e,t,r){return Fe(e,t,r)}o(ye,"readExternalRegularFile");async function U(e,t,r){let n=b.resolve(e),i=b.resolve(t);if(!v(n,i))throw new Error(`${r} escapes its allowed directory.`);let s=await lstat(i);if(s.isSymbolicLink())throw new Error(`${r} must not be a symbolic link.`);if(!s.isDirectory())throw new Error(`${r} must be a directory.`);let[a,c]=await Promise.all([realpath(n),realpath(i)]);if(!v(a,c))throw new Error(`${r} resolves outside its allowed directory.`);return c}o(U,"canonicalDirectoryWithin");async function _(e,t,r,n){let i=b.resolve(e),s=b.resolve(t);if(!v(i,s)||i===s)throw new Error(`${n} escapes its allowed directory.`);let a=await Fe(s,r,n),c=await realpath(i);if(!v(c,a.path)||c===a.path)throw new Error(`${n} resolves outside its allowed directory.`);return a}o(_,"readRegularFileWithin");async function Ve(e,t,r,n=8192){let s=[await U(e,t,"Inspected directory")],a=[],c=0;for(;s.length>0;){let f=s.shift();if(f===void 0)break;let m=(await readdir(f,{withFileTypes:true})).sort((h,d)=>h.name.localeCompare(d.name));for(let h of m){if(c+=1,c>n)throw new Error(`Inspected directory exceeds the ${n}-entry limit.`);let d=b.join(f,h.name);if(h.isSymbolicLink())throw new Error(`Inspected directory contains a symbolic link: ${z(b.relative(e,d))}.`);if(h.isDirectory()){s.push(await U(e,d,"Nested inspected directory"));continue}if(h.isFile()&&r(h.name))a.push(d);else if(r(h.name))throw new Error(`Semantic input is not a regular file: ${z(d)}.`)}}return a.sort()}o(Ve,"listRegularFilesRecursively");var ue=/^[a-f0-9]{64}$/,Mt=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/,He=/^[a-z0-9][a-z0-9_-]{0,63}$/,ve=/^[0-9A-Za-z][0-9A-Za-z._/-]{0,127}$/;function l(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(l,"isRecord");function W(e){return typeof e=="string"&&Mt.test(e)}o(W,"isSafeVersion");function Se(e){if(e.length===0||e.length>512||e.includes("\\")||/[\u0000-\u001f\u007f]/.test(e))return false;let t=e.split("/");return !e.startsWith("/")&&t.every(r=>r.length>0&&r!=="."&&r!=="..")}o(Se,"isSafeRelativePath");function ze(e){if(!l(e)||e.schemaVersion!==2)throw new Error("three-blocks.json must use schemaVersion 2.");if(typeof e.template!="string"||!He.test(e.template))throw new Error("three-blocks.json has an invalid default shader scene key.");if(!Array.isArray(e.layers)||!e.layers.every(t=>typeof t=="string"&&ve.test(t))||new Set(e.layers).size!==e.layers.length)throw new Error("three-blocks.json has invalid layers.");if(e.generator!==void 0&&(!l(e.generator)||typeof e.generator.name!="string"||!ve.test(e.generator.name)||!W(e.generator.version)))throw new Error("three-blocks.json has invalid generator metadata.");if(!l(e.runtime)||!W(e.runtime.three)||!W(e.runtime.threeBlocks))throw new Error("three-blocks.json has invalid runtime versions.");if(!l(e.features)||typeof e.features.text!="boolean")throw new Error("three-blocks.json has invalid feature metadata.");if(!l(e.protocol)||e.protocol.resultFile!==1)throw new Error("three-blocks.json has an unsupported protocol schema.");if(e.artifacts!==void 0){if(!l(e.artifacts)||typeof e.artifacts.shaders!="string"||!["fresh","pending"].includes(e.artifacts.shaders)||typeof e.artifacts.text!="string"||!["fresh","pending","not-applicable"].includes(e.artifacts.text))throw new Error("three-blocks.json has invalid artifact metadata.");if(e.features.text?e.artifacts.text==="not-applicable":e.artifacts.text!=="not-applicable")throw new Error("three-blocks.json text artifact state does not match the text capability.")}return {schemaVersion:2,template:e.template,layers:e.layers,...e.generator===void 0?{}:{generator:{name:e.generator.name,version:e.generator.version}},runtime:{three:e.runtime.three,threeBlocks:e.runtime.threeBlocks},features:{text:e.features.text},...e.artifacts===void 0?{}:{artifacts:{shaders:e.artifacts.shaders,text:e.artifacts.text}},protocol:{resultFile:1}}}o(ze,"parseProjectMetadata");function Ct(e){if(!l(e))throw new Error("Shader coverage is missing.");for(let t of ["render","vertex","fragment","compute"])if(typeof e[t]!="number"||!Number.isSafeInteger(e[t])||e[t]<0)throw new Error(`Shader coverage.${t} must be a non-negative integer.`);return e}o(Ct,"parseCoverage");function It(e,t){if(!l(e))throw new Error(`Shader receipt inputs for "${t}" are invalid.`);let r=Object.entries(e);if(r.length===0||r.length>4096)throw new Error(`Shader receipt inputs for "${t}" must contain between 1 and 4096 files.`);for(let[n,i]of r)if(!Se(n)||typeof i!="string"||!ue.test(i))throw new Error(`Shader receipt input for "${t}" is invalid.`)}o(It,"parseInputs");function le(e){if(!l(e)||e.schemaVersion!==2||!l(e.runtime)||!W(e.runtime.three)||!W(e.runtime.threeBlocks)||typeof e.runtime.threeBlocksShaderClosure!="string"||!ue.test(e.runtime.threeBlocksShaderClosure)||!l(e.scenes))throw new Error("Shader meta.json does not match receipt schema 2.");if(e.runtime.capture!==void 0&&(!l(e.runtime.capture)||typeof e.runtime.capture.userAgent!="string"||e.runtime.capture.userAgent.length>1024||typeof e.runtime.capture.adapter!="string"||e.runtime.capture.adapter.length>1024||!Array.isArray(e.runtime.capture.features)||e.runtime.capture.features.length>256||!e.runtime.capture.features.every(r=>typeof r=="string"&&r.length>0&&r.length<=128)))throw new Error("Shader meta.json has invalid browser capture provenance.");let t=Object.entries(e.scenes);if(t.length===0)throw new Error("Shader meta.json contains no scenes.");for(let[r,n]of t){let i=r.endsWith(".webgl")?"webgl":"webgpu",s=i==="webgl"?r.slice(0,-6):r;if(!He.test(s)||!l(n)||n.backend!==void 0&&n.backend!==i||typeof n.artifact!="string"||!Se(n.artifact)||!n.artifact.endsWith(`.${i}.ts`)||typeof n.artifactHash!="string"||!ue.test(n.artifactHash))throw new Error(`Shader receipt for "${r}" is invalid.`);if(n.asset===void 0!=(n.assetHash===void 0)||n.asset!==void 0&&(typeof n.asset!="string"||!Se(n.asset)||!n.asset.endsWith(".json")||typeof n.assetHash!="string"||!ue.test(n.assetHash)))throw new Error(`Shader static asset receipt for "${r}" is invalid.`);if(It(n.inputs,r),Ct(n.coverage),n.bytes!==void 0&&(!Number.isSafeInteger(n.bytes)||Number(n.bytes)<0))throw new Error(`Shader receipt byte count for "${r}" is invalid.`);if(n.skipped!==void 0&&(!l(n.skipped)||!Number.isSafeInteger(n.skipped.render)||Number(n.skipped.render)<0||!Number.isSafeInteger(n.skipped.compute)||Number(n.skipped.compute)<0))throw new Error(`Shader receipt skipped-build counts for "${r}" are invalid.`)}if(e.tool!==void 0&&(!l(e.tool)||e.tool.name!=="@three-blocks/devtools"||!W(e.tool.version)||typeof e.tool.compatibility!="string"||!Number.isSafeInteger(e.tool.transform)||!Number.isSafeInteger(e.tool.address)||!Number.isSafeInteger(e.tool.recipe)||!Number.isSafeInteger(e.tool.hydration)))throw new Error("Shader meta.json has invalid tool compatibility metadata.");if(l(e.tool)&&e.tool.compatibilities!==void 0&&(!l(e.tool.compatibilities)||Object.entries(e.tool.compatibilities).some(([r,n])=>r!=="webgpu"&&r!=="webgl"||typeof n!="string"||n.length===0)))throw new Error("Shader meta.json has invalid backend compatibility metadata.");return e}o(le,"parseShaderReceipt");var Je="three-blocks.shaders.json",Ee=".three-blocks/shaders";var _t=/^[a-z0-9][a-z0-9_-]{0,63}$/u,Pt=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u,Ue=64,We=64,Ot={schemaVersion:1,backend:"both",scenes:[{key:"default",url:"/"}]};function qe(e="both"){return e==="both"?["webgpu","webgl"]:[e]}o(qe,"shaderBackends");function J(e,t){return e.backend===void 0?t:t.filter(r=>r===e.backend)}o(J,"shaderSceneBackends");function K(e,t){return t==="webgpu"?e:`${e}.webgl`}o(K,"shaderReceiptKey");function Ge(e,t,r){if(e===void 0)return r;if(typeof e!="string"||e.length===0||e.length>512||b.isAbsolute(e)||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a bounded project-relative directory.`);let n=b.posix.normalize(e.replaceAll("\\","/")).replace(/\/+$/u,"");if(n==="."||n===".."||n.startsWith("../"))throw new Error(`${t} must stay inside the project.`);return n}o(Ge,"safeProjectDirectory");function Nt(e,t){let r=Ge(e,t,"");if(typeof e!="string"||e.endsWith("/"))throw new Error(`${t} must be a project-relative file.`);return r}o(Nt,"safeProjectFile");function L(e,t,r,n,i){if(e===void 0)return i;if(!Number.isSafeInteger(e)||Number(e)<r||Number(e)>n)throw new Error(`${t} must be an integer in ${r}...${n}.`);return Number(e)}o(L,"boundedInteger");function Ke(e,t,r){if(e===void 0)return r;if(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)throw new Error(`${t} must be a finite ratio in 0...1.`);return e}o(Ke,"finiteRatio");function Ye(e,t){if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a bounded project-relative URL.`);let r;try{r=new URL(e,"http://three-blocks.invalid/");}catch{throw new Error(`${t} is not a valid URL.`)}if(r.origin!=="http://three-blocks.invalid"||r.hash.length>0)throw new Error(`${t} must stay within the project and must not contain a fragment.`);return `${r.pathname}${r.search}`}o(Ye,"safeBrowserUrl");function Lt(e){if(!Array.isArray(e)||e.length===0||e.length>Ue)throw new Error(`Shader config scenes must contain 1...${Ue} entries.`);let t=new Set;return e.map((r,n)=>{if(!l(r)||typeof r.key!="string"||!_t.test(r.key))throw new Error(`Shader config scene ${n} has an invalid key.`);if(t.has(r.key))throw new Error(`Shader config scene key "${r.key}" is duplicated.`);t.add(r.key);let i=r.parityFrames,s=r.maxDiffRatio;if(r.inputs!==void 0&&(!Array.isArray(r.inputs)||r.inputs.length===0||r.inputs.length>We))throw new Error(`Shader config scene "${r.key}" inputs must contain 1...${We} files.`);let a=r.inputs===void 0?void 0:r.inputs.map((c,f)=>Nt(c,`Shader config scene "${r.key}" input ${f}`));if(a!==void 0&&new Set(a).size!==a.length)throw new Error(`Shader config scene "${r.key}" inputs must be unique.`);if(r.runtimeMotion!==void 0&&typeof r.runtimeMotion!="boolean")throw new Error(`Shader config scene "${r.key}" runtimeMotion must be a boolean.`);if(r.backend!==void 0&&r.backend!=="webgpu"&&r.backend!=="webgl")throw new Error(`Shader config scene "${r.key}" backend must be "webgpu" or "webgl".`);return {key:r.key,url:Ye(r.url,`Shader config scene "${r.key}" URL`),...r.backend===void 0?{}:{backend:r.backend},requiresText:r.requiresText===true,...a===void 0?{}:{inputs:a},...i===void 0?{}:{parityFrames:L(i,`Shader config scene "${r.key}" parityFrames`,0,1e4,0)},...s===void 0?{}:{maxDiffRatio:Ke(s,`Shader config scene "${r.key}" maxDiffRatio`,.01)},...r.runtimeMotion===true?{runtimeMotion:true}:{}}})}o(Lt,"parseScenes");function we(e){if(!l(e)||e.schemaVersion!==void 0&&e.schemaVersion!==1)throw new Error("Shader config must use schemaVersion 1.");let t=e.viewport;if(t!==void 0&&!l(t))throw new Error("Shader config viewport must be an object.");let r=e.parity;if(r!==void 0&&!l(r))throw new Error("Shader config parity must be an object.");let n=e.bridge;if(n!==void 0&&!l(n))throw new Error("Shader config bridge must be an object.");let i=l(n)?n.deterministicModule:void 0;i!==void 0&&Ye(i,"Shader deterministic module");let s=e.readiness;if(s!==void 0&&!l(s))throw new Error("Shader config readiness must be an object.");let a=l(s)?s.selector:void 0;if(a!==void 0&&(typeof a!="string"||a.length===0||a.length>512||/[\u0000-\u001f\u007f]/u.test(a)))throw new Error("Shader readiness selector must be a bounded, non-empty CSS selector.");let c=l(s)?s.global:void 0;if(c!==void 0&&(typeof c!="string"||!Pt.test(c)))throw new Error("Shader readiness global must be a dot-separated JavaScript property path.");if(e.backend!==void 0&&e.backend!=="webgpu"&&e.backend!=="webgl"&&e.backend!=="both")throw new Error('Shader config backend must be "webgpu", "webgl", or "both".');let f=L(e.timeoutMs,"Shader timeoutMs",1e3,15*6e4,24e4);return {schemaVersion:1,backend:e.backend??"both",scenes:Lt(e.scenes),settleFrames:L(e.settleFrames,"Shader settleFrames",0,1e4,60),settleTimeoutMs:L(e.settleTimeoutMs,"Shader settleTimeoutMs",1e3,15*6e4,3e4),browserRelaunchScenes:L(e.browserRelaunchScenes,"Shader browserRelaunchScenes",1,64,8),timeoutMs:f,maxTimeoutMs:Math.max(f,L(e.maxTimeoutMs,"Shader maxTimeoutMs",1e3,15*6e4,f)),viewport:{width:L(l(t)?t.width:void 0,"Shader viewport width",64,8192,1024),height:L(l(t)?t.height:void 0,"Shader viewport height",64,8192,640)},parity:{frames:L(l(r)?r.frames:void 0,"Shader parity frames",0,1e4,90),channelTolerance:L(l(r)?r.channelTolerance:void 0,"Shader parity channelTolerance",0,255,8),maxDiffRatio:Ke(l(r)?r.maxDiffRatio:void 0,"Shader parity maxDiffRatio",.01)},bridge:{legacyLab:l(n)&&n.legacyLab===true,...typeof i=="string"?{deterministicModule:i}:{}},readiness:{...typeof a=="string"?{selector:a}:{},...typeof c=="string"?{global:c}:{}},publicDir:Ge(e.publicDir,"Shader publicDir","public"),allowLiveBuilds:e.allowLiveBuilds!==false}}o(we,"parseShaderToolConfig");async function Xe(e=process.cwd()){let t=b.resolve(e);for(;;){if(await C(b.join(t,Je))||await C(b.join(t,"three-blocks.json")))return realpath(t);let r=b.join(t,"package.json");if(await C(r)){let i=await _(t,r,$.packageJson,"Project package.json"),s;try{s=JSON.parse(i.data.toString("utf8"));}catch{throw new Error(`Project package.json is not valid JSON: ${r}.`)}if(l(s)&&[s.dependencies,s.devDependencies,s.peerDependencies,s.optionalDependencies].filter(l).some(f=>typeof f.three=="string"||typeof f["three-blocks"]=="string"||typeof f["@three-blocks/devtools"]=="string"))return realpath(t)}let n=b.dirname(t);if(n===t)throw new Error(`No Three Blocks shader project found from ${JSON.stringify(b.resolve(e))}; add Three.js to package.json or pass --root.`);t=n;}}o(Xe,"findShaderProjectRoot");async function ke(e){let t=await realpath(e),r=b.join(t,Je);if(await C(r)){let i=await _(t,r,$.metadata,"Shader configuration");return we(JSON.parse(i.data.toString("utf8")))}let n=b.join(t,"three-blocks.json");if(await C(n)){let i=ze(JSON.parse(await readFile(n,"utf8")));return we({schemaVersion:1,backend:"both",scenes:[{key:i.template,url:"/",requiresText:i.features.text}]})}return we(Ot)}o(ke,"loadShaderToolConfig");function Y(e,t="webgpu"){if(/^0\.185\./u.test(e))return t==="webgl"?THREE_WEBGL_R185_COMPATIBILITY:THREE_WEBGPU_R185_COMPATIBILITY;if(e===THREE_R186DEV_VERSION&&t==="webgpu")return THREE_WEBGPU_R186DEV_COMPATIBILITY;throw new Error(`Three.js ${e} is outside the supported shader compatibility contracts.`)}o(Y,"shaderCompatibilityForThree");var X="0.1.0";var me=60,Ut="timing.local.json",Wt="timing.json";var pe=4096,Jt=4096;function Re(e,t,r=8192){if(typeof e!="string"||e.length===0||e.length>r||/[\u0000\u007f]/u.test(e))throw new Error(`${t} must be a bounded non-empty string.`);return e}o(Re,"boundedString");function w(e,t,r=true){if(typeof e!="number"||!Number.isFinite(e)||e<0||r&&!Number.isSafeInteger(e))throw new Error(`${t} must be a non-negative ${r?"integer":"finite number"}.`);return e}o(w,"nonNegativeNumber");function qt(e){if(!l(e))throw new Error("Shader capture stats are missing.");let t={buildCalls:w(e.buildCalls,"capture stats.buildCalls"),renderBuilds:w(e.renderBuilds,"capture stats.renderBuilds"),computeBuilds:w(e.computeBuilds,"capture stats.computeBuilds"),registeredBuilds:w(e.registeredBuilds,"capture stats.registeredBuilds"),registeredRenderBuilds:w(e.registeredRenderBuilds,"capture stats.registeredRenderBuilds"),registeredComputeBuilds:w(e.registeredComputeBuilds,"capture stats.registeredComputeBuilds"),buildMs:w(e.buildMs,"capture stats.buildMs",false),syncBuildMs:w(e.syncBuildMs,"capture stats.syncBuildMs",false),asyncBuildElapsedMs:w(e.asyncBuildElapsedMs,"capture stats.asyncBuildElapsedMs",false),precompiledSetupMs:w(e.precompiledSetupMs,"capture stats.precompiledSetupMs",false),maxSyncBuildMs:w(e.maxSyncBuildMs??e.syncBuildMs,"capture stats.maxSyncBuildMs",false),maxPrecompiledSetupMs:w(e.maxPrecompiledSetupMs??e.precompiledSetupMs,"capture stats.maxPrecompiledSetupMs",false),hydrationMs:w(e.hydrationMs??0,"capture stats.hydrationMs",false),maxHydrationMs:w(e.maxHydrationMs??e.hydrationMs??0,"capture stats.maxHydrationMs",false),injected:w(e.injected,"capture stats.injected"),injectedRender:w(e.injectedRender,"capture stats.injectedRender"),injectedCompute:w(e.injectedCompute,"capture stats.injectedCompute"),missed:w(e.missed,"capture stats.missed"),missedRender:w(e.missedRender,"capture stats.missedRender"),missedCompute:w(e.missedCompute,"capture stats.missedCompute"),...Array.isArray(e.missedKeys)&&e.missedKeys.every(r=>typeof r=="string")?{missedKeys:e.missedKeys.slice(0,pe)}:{}};if(t.renderBuilds+t.computeBuilds!==t.buildCalls||t.registeredRenderBuilds+t.registeredComputeBuilds!==t.registeredBuilds||t.injectedRender+t.injectedCompute!==t.injected||t.missedRender+t.missedCompute!==t.missed||t.registeredBuilds>t.buildCalls||Math.abs(t.syncBuildMs+t.asyncBuildElapsedMs-t.buildMs)>.001||t.maxSyncBuildMs>t.syncBuildMs+.001||t.maxPrecompiledSetupMs>t.precompiledSetupMs+.001||t.maxHydrationMs>t.hydrationMs+.001)throw new Error("Shader capture stats totals are inconsistent.");return t}o(qt,"captureStats");function Gt(e){if(!Array.isArray(e)||e.length>pe)throw new Error("Shader capture skipped builds are invalid.");return e.map((t,r)=>{if(!l(t)||t.kind!=="render"&&t.kind!=="compute")throw new Error(`Shader capture skipped build ${r} is invalid.`);return {kind:t.kind,name:Re(t.name,`skipped build ${r} name`,512),reason:Re(t.reason,`skipped build ${r} reason`)}})}o(Gt,"skippedBuilds");function Kt(e){let t=0,r=0,n=0,i=0;for(let s of Object.values(e.entries)){let a=e.states[s];a!==void 0&&((a.vertex!==null||a.fragment!==null)&&t++,a.vertex!==null&&r++,a.fragment!==null&&n++,a.compute!==null&&i++);}return {render:t,vertex:r,fragment:n,compute:i}}o(Kt,"shaderCoverage");function Yt(e,t){if(!l(e))throw new Error("Shader capture payload must be an object.");if(e.scene!==t.scene)throw new Error(`Shader capture scene does not match "${t.scene}".`);if(e.protocolVersion!==2)throw new Error("Shader capture protocolVersion must be 2.");let r=t.backend??"webgpu",n=Y(t.runtime.three,r);if(e.compatibility!==n)throw new Error(`Shader capture compatibility must be "${n}".`);if(!l(e.entries))throw new Error("Shader capture entries must be an object.");if(typeof e.requiresSetup!="boolean")throw new Error("Shader capture requiresSetup must be boolean.");let i=Object.keys(e.entries).length;if(i>pe)throw new Error(`Shader capture must contain at most ${pe} entries.`);if(!Array.isArray(e.errors)||e.errors.length>Jt)throw new Error("Shader capture errors are invalid.");let s=e.errors.map((g,u)=>Re(g,`capture error ${u}`,64*1024));if(s.length>0)throw new Error(`Shader capture failed:
2
+ - ${s.join(`
3
+ - `)}`);let a=Gt(e.skipped);if(i===0&&(r!=="webgl"||a.length===0))throw new Error("Shader capture must contain an entry unless WebGL explicitly skipped every live build.");let c=qt(e.stats),f=l(e.timing)?e.timing:void 0,m=f===void 0?void 0:Object.fromEntries(["launch","firstRequest","readiness","lastBuild","settled","posted"].flatMap(g=>{let u=f[g];if(u===void 0)return [];if(typeof u!="number"||!Number.isFinite(u)||u<0)throw new Error(`Shader capture timing.${g} is invalid.`);return [[g,u]]})),h;if(e.provenance!==void 0){if(!l(e.provenance)||typeof e.provenance.userAgent!="string"||e.provenance.userAgent.length>1024||typeof e.provenance.adapter!="string"||e.provenance.adapter.length>1024||!Array.isArray(e.provenance.features)||e.provenance.features.length>256||!e.provenance.features.every(g=>typeof g=="string"&&g.length<=128))throw new Error("Shader capture provenance is invalid.");h={userAgent:e.provenance.userAgent,adapter:e.provenance.adapter,features:[...new Set(e.provenance.features)].sort()};}let d=parsePrecompiledManifest({version:PRECOMPILED_MANIFEST_VERSION,scene:t.scene,three:t.runtime.three,threeBlocks:t.runtime.threeBlocks,runtime:{id:n,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION},...e.automatic===void 0?{}:{automatic:e.automatic},requiresSetup:e.requiresSetup,modules:e.modules,nodes:e.nodes,layouts:e.layouts,attributePlans:e.attributePlans,updatePlans:e.updatePlans,requirementPlans:e.requirementPlans,states:e.states,entries:e.entries,...e.fallbacks===void 0?{}:{fallbacks:e.fallbacks}}),p=Kt(d);if(c.registeredRenderBuilds<p.render||c.registeredComputeBuilds<p.compute)throw new Error("Shader capture did not live-build every distinct registered render/compute entry.");return {scene:t.scene,backend:r,manifest:d,skipped:a,stats:c,coverage:p,...m===void 0?{}:{timing:m},...h===void 0?{}:{provenance:h}}}o(Yt,"validateShaderCapture");function q(e,t=0){let r=" ".repeat(t),n=" ".repeat(t+1);if(Array.isArray(e))return e.length===0?"[]":e.every(s=>s===null||["number","string","boolean"].includes(typeof s))?JSON.stringify(e):`[
4
+ ${e.map(s=>`${n}${q(s,t+1)}`).join(`,
5
5
  `)}
6
- ${r}]`;if(e!==null&&typeof e=="object"){let s=e,o=Object.keys(s).sort();return o.length===0?"{}":`{
7
- ${o.map(c=>{let l=s[c];return `${n}${JSON.stringify(c)}: ${U(l,t+1)}`}).join(`,
6
+ ${r}]`;if(e!==null&&typeof e=="object"){let s=e,a=Object.keys(s).sort();return a.length===0?"{}":`{
7
+ ${a.map(c=>{let f=s[c];return `${n}${JSON.stringify(c)}: ${q(f,t+1)}`}).join(`,
8
8
  `)}
9
- ${r}}`}let i=JSON.stringify(e);if(i===void 0)throw new Error("Shader artifact contains a non-serializable value.");return i}a(U,"stableStringify");function Ht(e){return ["// GENERATED FILE \u2014 do not edit by hand.","// Produced by @three-blocks/devtools.","import type { PrecompiledManifest } from 'three-blocks/shaders';","",`export default ${U(e)} satisfies PrecompiledManifest;`,""].join(`
10
- `)}a(Ht,"serializeShaderManifest");function Je(e,t){if(typeof e!="string"||e.length===0||e.length>256||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} is invalid.`);return e}a(Je,"timingLabel");function zt(e){if(!f(e)||e.schemaVersion!==3||e.source!=="latest-local-capture"&&e.source!=="committed-capture"||typeof e.receiptHash!="string"||!/^[a-f0-9]{64}$/u.test(e.receiptHash)||typeof e.measuredAt!="string"||!Number.isFinite(Date.parse(e.measuredAt))||!f(e.scenes))throw new Error("Shader timing is invalid.");let t={};for(let[n,i]of Object.entries(e.scenes)){if(n.length===0||n.length>128||!f(i))throw new Error("Shader timing scene is invalid.");let s={builds:y(i.builds,`timing ${n}.builds`),setupMeasured:i.setupMeasured===true,liveBuildMs:y(i.liveBuildMs,`timing ${n}.liveBuildMs`,false),precompiledBuildMs:y(i.precompiledBuildMs,`timing ${n}.precompiledBuildMs`,false),avoidedBuildMs:y(i.avoidedBuildMs,`timing ${n}.avoidedBuildMs`,false),runs:y(i.runs,`timing ${n}.runs`),spreadMs:y(i.spreadMs,`timing ${n}.spreadMs`,false)};if(s.runs<1)throw new Error(`Shader timing runs are invalid for scene "${n}".`);if(Math.abs(s.avoidedBuildMs-Math.max(0,s.liveBuildMs-s.precompiledBuildMs))>.001)throw new Error(`Shader timing delta is inconsistent for scene "${n}".`);t[n]=s;}if(Object.keys(t).length===0)throw new Error("Shader timing contains no scenes.");let r={schemaVersion:3,receiptHash:e.receiptHash,measuredAt:e.measuredAt,scenes:t};return e.source==="latest-local-capture"?{...r,source:"latest-local-capture"}:{...r,source:"committed-capture",adapter:Je(e.adapter,"Shader timing adapter"),platform:Je(e.platform,"Shader timing platform")}}a(zt,"parseShaderTiming");async function qe(e,t,r,n){let i=w.join(e,r);try{if(!await A(i))return;let s=await lstat(i);if(s.isSymbolicLink()||!s.isFile()||s.size>1024*1024)return;let o=zt(JSON.parse(await readFile(i,"utf8")));return o.source===n&&o.receiptHash===$(t)?o:void 0}catch{return}}a(qe,"readShaderTimingFile");async function et(e,t){return await qe(e,t,Ot,"latest-local-capture")??await qe(e,t,Nt,"committed-capture")}a(et,"readShaderTiming");async function Ge(e){if(!await A(e)){await mkdir(e);return}let t=await lstat(e);if(t.isSymbolicLink()||!t.isDirectory())throw new Error(`Shader artifact path is not a real directory: ${e}.`)}a(Ge,"assertDirectory");async function Ut(e){let t=w.resolve(e),r=w.join(t,".three-blocks");await Ge(r);let n=w.join(r,"shaders");return await Ge(n),n}a(Ut,"artifactRoot");async function Wt(e){let t=await Ut(e.root),r=J(e.runtime.three),n=w.resolve(e.root),i=w.resolve(n,e.publicDirectory??"public");if(!N(n,i)||i===n)throw new Error("Shader public directory must stay inside the project root.");let s=w.join(i,"three-blocks","shaders");await mkdir(s,{recursive:true}),await H(n,s,"Shader static-asset directory");let o={},c=[];for(let d of [...e.scenes].sort((h,E)=>h.key.localeCompare(E.key))){let h=e.captures.get(d.key),E=e.inputs.get(d.key);if(E===void 0)throw new Error(`Shader input matrix is missing scene "${d.key}".`);if(h===void 0){let R=e.previousReceipt?.scenes[d.key];if(R===void 0)throw new Error(`Capture matrix is missing scene "${d.key}".`);let S=await readFile(w.join(t,R.artifact));if($(S)!==R.artifactHash)throw new Error(`Preserved shader artifact checksum differs for scene "${d.key}".`);if(R.asset!==void 0&&R.assetHash!==void 0){let k=await readFile(w.join(i,R.asset));if($(k)!==R.assetHash)throw new Error(`Preserved static shader manifest checksum differs for scene "${d.key}".`)}o[d.key]={...R,inputs:Object.fromEntries(Object.entries(E).sort(([k],[F])=>k.localeCompare(F)))},c.push(R.artifact),R.asset!==void 0&&c.push(w.relative(n,w.join(i,R.asset)).split(w.sep).join("/"));continue}if(h.scene!==d.key||h.manifest.scene!==d.key)throw new Error(`Capture matrix scene "${d.key}" is inconsistent.`);let T=`${d.key}.webgpu.ts`,_=Ht(h.manifest);await ee(w.join(t,T),_),c.push(T);let P=`three-blocks/shaders/${d.key}.json`,O=`${U(h.manifest)}
11
- `;await ee(w.join(i,P),O),c.push(w.relative(n,w.join(i,P)).split(w.sep).join("/"));let M=h.skipped.filter(R=>R.kind==="render").length,v=h.skipped.length-M;o[d.key]={artifact:T,artifactHash:$(_),asset:P,assetHash:$(O),inputs:Object.fromEntries(Object.entries(E).sort(([R],[S])=>R.localeCompare(S))),coverage:h.coverage,bytes:Buffer.byteLength(_),skipped:{render:M,compute:v}};}let l=[...e.captures.values()].find(d=>d.provenance!==void 0)?.provenance??e.previousReceipt?.runtime.capture,m={schemaVersion:2,runtime:{...e.runtime,...l===void 0?{}:{capture:l}},tool:{name:"@three-blocks/devtools",version:q,compatibility:r,transform:se,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION},scenes:o},g=new Set(c);for(let d of await readdir(t,{withFileTypes:true}))if(!(!d.name.endsWith(".webgpu.ts")||g.has(d.name))){if(d.isSymbolicLink()||!d.isFile())throw new Error(`Orphan shader artifact is not a regular file: ${d.name}.`);await unlink(w.join(t,d.name));}let u=new Set(e.scenes.map(d=>`${d.key}.json`)),p=new Set(Object.values(e.previousReceipt?.scenes??{}).map(d=>d.asset===void 0?void 0:w.posix.basename(d.asset)).filter(d=>d!==void 0));try{let d=re(JSON.parse(await readFile(w.join(t,"meta.json"),"utf8")));for(let h of Object.values(d.scenes))h.asset!==void 0&&p.add(w.posix.basename(h.asset));}catch{}for(let d of await readdir(s,{withFileTypes:true}))if(!(!d.name.endsWith(".json")||u.has(d.name))&&p.has(d.name)){if(d.isSymbolicLink()||!d.isFile())throw new Error(`Orphan shader static asset is not a regular file: ${d.name}.`);await unlink(w.join(s,d.name));}return await ee(w.join(t,"meta.json"),`${U(m)}
12
- `),c.push("meta.json"),{directory:t,receipt:m,files:c}}a(Wt,"writeShaderArtifacts");var we=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".wgsl",".glsl",".vert",".frag",".json",".css"],be=new Set(we),Se=/^(?:three-blocks\.shaders\.json|(?:precompile|three-blocks\.shaders)\.config\.(?:cjs|cts|js|mjs|mts|ts))$/u,qt=/(?:^|\/)scene\.(?:cjs|cts|js|jsx|mjs|mts|ts|tsx)$/u,Gt=/\b(?:export\s+)?(?:async\s+)?function\s+createScene\b|\bcreateScene\s*=\s*(?:async\s*)?\(/u,Kt=/\b(?:[A-Za-z_$][\w$]*\.)*(?:shaders|shaderCache|sceneShaders)\s*\.\s*(?:material|pipeline|compute|container)\s*\(/u,Xt=/\b(import|export)(?!\s*\()\s*(type\b\s*)?(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']/gu,Yt=/\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,Zt=/\b(?:import|export)(?!\s*\()\s*(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']|\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,Qt=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/u,Ee=4096,er="./shaders";function nt(e,t){let r=w.relative(e,t).split(w.sep).join("/");if(r.length===0||/[\u0000-\u001f\u007f]/u.test(r))throw new Error("Semantic input has an unsafe relative path.");return r}a(nt,"portableRelativePath");function Re(e,t){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new Error(`Shader-relevant source ${JSON.stringify(t)} is not valid UTF-8.`)}}a(Re,"sourceText");function xe(e,t){let r="",n="code";for(let i=0;i<e.length;i++){let s=e[i]??"",o=e[i+1]??"";if(n==="code"){if(s==="/"&&o==="/"){r+=" ",n="line-comment",i++;continue}if(s==="/"&&o==="*"){r+=" ",n="block-comment",i++;continue}if(s==="'"||s==='"'||s==="`"){n=s==="'"?"single":s==='"'?"double":"template",r+=t?s:" ";continue}r+=s;continue}if(n==="line-comment"){s===`
9
+ ${r}}`}let i=JSON.stringify(e);if(i===void 0)throw new Error("Shader artifact contains a non-serializable value.");return i}o(q,"stableStringify");function Xt(e){return ["// GENERATED FILE \u2014 do not edit by hand.","// Produced by @three-blocks/devtools.","import type { PrecompiledManifest } from 'three-blocks/shaders';","",`export default ${q(e)} satisfies PrecompiledManifest;`,""].join(`
10
+ `)}o(Xt,"serializeShaderManifest");function et(e,t){if(typeof e!="string"||e.length===0||e.length>256||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} is invalid.`);return e}o(et,"timingLabel");function Zt(e){if(!l(e)||e.schemaVersion!==3||e.source!=="latest-local-capture"&&e.source!=="committed-capture"||typeof e.receiptHash!="string"||!/^[a-f0-9]{64}$/u.test(e.receiptHash)||typeof e.measuredAt!="string"||!Number.isFinite(Date.parse(e.measuredAt))||!l(e.scenes))throw new Error("Shader timing is invalid.");let t={};for(let[n,i]of Object.entries(e.scenes)){if(n.length===0||n.length>128||!l(i))throw new Error("Shader timing scene is invalid.");let s={builds:w(i.builds,`timing ${n}.builds`),setupMeasured:i.setupMeasured===true,liveBuildMs:w(i.liveBuildMs,`timing ${n}.liveBuildMs`,false),precompiledBuildMs:w(i.precompiledBuildMs,`timing ${n}.precompiledBuildMs`,false),avoidedBuildMs:w(i.avoidedBuildMs,`timing ${n}.avoidedBuildMs`,false),runs:w(i.runs,`timing ${n}.runs`),spreadMs:w(i.spreadMs,`timing ${n}.spreadMs`,false)};if(s.runs<1)throw new Error(`Shader timing runs are invalid for scene "${n}".`);if(Math.abs(s.avoidedBuildMs-Math.max(0,s.liveBuildMs-s.precompiledBuildMs))>.001)throw new Error(`Shader timing delta is inconsistent for scene "${n}".`);t[n]=s;}if(Object.keys(t).length===0)throw new Error("Shader timing contains no scenes.");let r={schemaVersion:3,receiptHash:e.receiptHash,measuredAt:e.measuredAt,scenes:t};return e.source==="latest-local-capture"?{...r,source:"latest-local-capture"}:{...r,source:"committed-capture",adapter:et(e.adapter,"Shader timing adapter"),platform:et(e.platform,"Shader timing platform")}}o(Zt,"parseShaderTiming");async function tt(e,t,r,n){let i=b.join(e,r);try{if(!await C(i))return;let s=await lstat(i);if(s.isSymbolicLink()||!s.isFile()||s.size>1024*1024)return;let a=Zt(JSON.parse(await readFile(i,"utf8")));return a.source===n&&a.receiptHash===I(t)?a:void 0}catch{return}}o(tt,"readShaderTimingFile");async function dt(e,t){return await tt(e,t,Ut,"latest-local-capture")??await tt(e,t,Wt,"committed-capture")}o(dt,"readShaderTiming");async function rt(e){if(!await C(e)){await mkdir(e);return}let t=await lstat(e);if(t.isSymbolicLink()||!t.isDirectory())throw new Error(`Shader artifact path is not a real directory: ${e}.`)}o(rt,"assertDirectory");async function Qt(e){let t=b.resolve(e),r=b.join(t,".three-blocks");await rt(r);let n=b.join(r,"shaders");return await rt(n),n}o(Qt,"artifactRoot");async function er(e){let t=await Qt(e.root),r=e.backends??["webgpu"],n=Object.fromEntries(r.map(u=>[u,Y(e.runtime.three,u)])),i=b.resolve(e.root),s=b.resolve(i,e.publicDirectory??"public");if(!v(i,s)||s===i)throw new Error("Shader public directory must stay inside the project root.");let a=b.join(s,"three-blocks","shaders");await mkdir(a,{recursive:true}),await U(i,a,"Shader static-asset directory");let c={},f=[];for(let u of [...e.scenes].sort((R,y)=>R.key.localeCompare(y.key))){let R=e.inputs.get(u.key);if(R===void 0)throw new Error(`Shader input matrix is missing scene "${u.key}".`);for(let y of J(u,r)){let k=K(u.key,y),x=e.captures.get(k);if(x===void 0){let S=e.previousReceipt?.scenes[k];if(S===void 0)continue;let N=await readFile(b.join(t,S.artifact));if(I(N)!==S.artifactHash)throw new Error(`Preserved shader artifact checksum differs for "${k}".`);if(S.asset!==void 0&&S.assetHash!==void 0){let j=await readFile(b.join(s,S.asset));if(I(j)!==S.assetHash)throw new Error(`Preserved static shader manifest checksum differs for "${k}".`)}c[k]={...S,backend:y,inputs:Object.fromEntries(Object.entries(R).sort(([j],[re])=>j.localeCompare(re)))},f.push(S.artifact),S.asset!==void 0&&f.push(b.relative(i,b.join(s,S.asset)).split(b.sep).join("/"));continue}if(x.scene!==u.key||x.backend!==y||x.manifest.scene!==u.key)throw new Error(`Capture matrix scene/backend "${k}" is inconsistent.`);let A=`${u.key}.${y}.ts`,O=Xt(x.manifest);await ce(b.join(t,A),O),f.push(A);let B=`three-blocks/shaders/${u.key}.${y}.json`,F=`${q(x.manifest)}
11
+ `;await ce(b.join(s,B),F),f.push(b.relative(i,b.join(s,B)).split(b.sep).join("/"));let V=x.skipped.filter(S=>S.kind==="render").length,T=x.skipped.length-V;c[k]={backend:y,artifact:A,artifactHash:I(O),asset:B,assetHash:I(F),inputs:Object.fromEntries(Object.entries(R).sort(([S],[N])=>S.localeCompare(N))),coverage:x.coverage,bytes:Buffer.byteLength(O),skipped:{render:V,compute:T}};}}let m=[...e.captures.values()].find(u=>u.provenance!==void 0)?.provenance??e.previousReceipt?.runtime.capture,h={schemaVersion:2,runtime:{...e.runtime,...m===void 0?{}:{capture:m}},tool:{name:"@three-blocks/devtools",version:X,compatibility:n[r[0]??"webgpu"],compatibilities:n,transform:me,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION},scenes:c},d=new Set(f);for(let u of await readdir(t,{withFileTypes:true}))if(!(!/\.(?:webgpu|webgl)\.ts$/u.test(u.name)||d.has(u.name))){if(u.isSymbolicLink()||!u.isFile())throw new Error(`Orphan shader artifact is not a regular file: ${u.name}.`);await unlink(b.join(t,u.name));}let p=new Set(e.scenes.flatMap(u=>J(u,r).map(R=>`${u.key}.${R}.json`))),g=new Set(Object.values(e.previousReceipt?.scenes??{}).map(u=>u.asset===void 0?void 0:b.posix.basename(u.asset)).filter(u=>u!==void 0));try{let u=le(JSON.parse(await readFile(b.join(t,"meta.json"),"utf8")));for(let R of Object.values(u.scenes))R.asset!==void 0&&g.add(b.posix.basename(R.asset));}catch{}for(let u of await readdir(a,{withFileTypes:true}))if(!(!u.name.endsWith(".json")||p.has(u.name))&&g.has(u.name)){if(u.isSymbolicLink()||!u.isFile())throw new Error(`Orphan shader static asset is not a regular file: ${u.name}.`);await unlink(b.join(a,u.name));}return await ce(b.join(t,"meta.json"),`${q(h)}
12
+ `),f.push("meta.json"),{directory:t,receipt:h,files:f}}o(er,"writeShaderArtifacts");var Te=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".wgsl",".glsl",".vert",".frag",".json",".css"],je=new Set(Te),xe=/^(?:three-blocks\.shaders\.json|(?:precompile|three-blocks\.shaders)\.config\.(?:cjs|cts|js|mjs|mts|ts))$/u,rr=/(?:^|\/)scene\.(?:cjs|cts|js|jsx|mjs|mts|ts|tsx)$/u,nr=/\b(?:export\s+)?(?:async\s+)?function\s+createScene\b|\bcreateScene\s*=\s*(?:async\s*)?\(/u,ir=/\b(?:[A-Za-z_$][\w$]*\.)*(?:shaders|shaderCache|sceneShaders)\s*\.\s*(?:material|pipeline|compute|container)\s*\(/u,sr=/\b(import|export)(?!\s*\()\s*(type\b\s*)?(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']/gu,or=/\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,ar=/\b(?:import|export)(?!\s*\()\s*(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']|\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,dr=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/u,$e=4096,cr="./shaders";function lt(e,t){let r=b.relative(e,t).split(b.sep).join("/");if(r.length===0||/[\u0000-\u001f\u007f]/u.test(r))throw new Error("Semantic input has an unsafe relative path.");return r}o(lt,"portableRelativePath");function Ae(e,t){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new Error(`Shader-relevant source ${JSON.stringify(t)} is not valid UTF-8.`)}}o(Ae,"sourceText");function Ce(e,t){let r="",n="code";for(let i=0;i<e.length;i++){let s=e[i]??"",a=e[i+1]??"";if(n==="code"){if(s==="/"&&a==="/"){r+=" ",n="line-comment",i++;continue}if(s==="/"&&a==="*"){r+=" ",n="block-comment",i++;continue}if(s==="'"||s==='"'||s==="`"){n=s==="'"?"single":s==='"'?"double":"template",r+=t?s:" ";continue}r+=s;continue}if(n==="line-comment"){s===`
13
13
  `?(r+=`
14
- `,n="code"):r+=" ";continue}if(n==="block-comment"){s==="*"&&o==="/"?(r+=" ",n="code",i++):r+=s===`
14
+ `,n="code"):r+=" ";continue}if(n==="block-comment"){s==="*"&&a==="/"?(r+=" ",n="code",i++):r+=s===`
15
15
  `?`
16
- `:" ";continue}let c=n==="single"?"'":n==="double"?'"':"`";if(s==="\\"&&o.length>0){r+=t?`${s}${o}`:" ",i++;continue}r+=t?s:s===`
16
+ `:" ";continue}let c=n==="single"?"'":n==="double"?'"':"`";if(s==="\\"&&a.length>0){r+=t?`${s}${a}`:" ",i++;continue}r+=t?s:s===`
17
17
  `?`
18
- `:" ",s===c&&(n="code");}return r}a(xe,"lexicalSource");function tr(e){let t=new Set,r=xe(e,true);for(let n of r.matchAll(Xt))n[2]===void 0&&n[3]!==void 0&&t.add(n[3]);for(let n of r.matchAll(Yt))n[1]!==void 0&&t.add(n[1]);return [...t].sort()}a(tr,"importSpecifiers");function rr(e){let t=new Set;for(let r of xe(e,true).matchAll(Zt)){let n=r[1]??r[2];n!==void 0&&t.add(n);}return [...t].sort()}a(rr,"runtimeSpecifiers");function it(e){return (e.split(/[?#]/u,1)[0]??e).replaceAll("\\","/")}a(it,"cleanSpecifier");function nr(e,t,r){let n=it(t),i;if(n.startsWith("./")||n.startsWith("../"))i=w.posix.normalize(w.posix.join(w.posix.dirname(e),n));else if(n.startsWith("@/"))i=`src/${n.slice(2)}`;else if(n.startsWith("/src/"))i=n.slice(1);else return;if(i===".three-blocks"||i.startsWith(".three-blocks/"))return;let s=w.posix.extname(i).toLowerCase(),o=new Set([i]);if(s.length===0||!be.has(s)){for(let c of we)o.add(`${i}${c}`);for(let c of we)o.add(`${i}/index${c}`);}else if([".js",".mjs",".cjs",".jsx"].includes(s)){let c=i.slice(0,-s.length);for(let l of [".ts",".tsx",".mts",".cts"])o.add(`${c}${l}`);}return [...o].find(c=>r.has(c))}a(nr,"resolveProjectImport");function ir(e,t){let r=xe(t,false);return qt.test(e)||Gt.test(r)||Kt.test(r)}a(ir,"isShaderRoot");async function Te(e,t){let r=await realpath(e);if(t!==void 0){let u={},p=0;for(let d of t){let h=await C(r,w.join(r,d),x.semanticInput,"Declared shader semantic input");if(p+=h.data.byteLength,p>x.semanticTotal)throw new Error("Declared shader semantic inputs exceed the total inspection size limit.");u[d]=$(h.data);}return u}let n=new Map,i=w.join(r,"src");if(await A(i))for(let u of await Pe(r,i,p=>be.has(w.extname(p).toLowerCase()))){let p=await C(r,u,x.semanticInput,"Shader semantic input");n.set(nt(r,u),p.data);}for(let u of await readdir(r,{withFileTypes:true})){if(!u.isFile()||!Se.test(u.name)&&!be.has(w.extname(u.name).toLowerCase()))continue;let p=await C(r,w.join(r,u.name),x.semanticInput,Se.test(u.name)?"Shader configuration input":"Shader semantic input");n.set(u.name,p.data);}if(n.size>Ee)throw new Error(`Shader input discovery exceeds the ${Ee}-file limit.`);let s=new Set,o=new Map;for(let[u,p]of n){if(!u.includes("/")&&Se.test(u)&&s.add(u),!u.startsWith("src/"))continue;let d=Re(p,u);o.set(u,d),ir(u,d)&&s.add(u);}if(s.size===0)throw new Error("No shader registration or scene source root was found.");let c=new Set,l=[...s].sort();for(;l.length>0;){let u=l.shift();if(u===void 0||c.has(u))continue;let p=n.get(u);if(p===void 0)continue;c.add(u);let d=o.get(u)??Re(p,u);for(let h of tr(d)){let E=nr(u,h,n);E!==void 0&&!c.has(E)&&l.push(E);}l.sort();}let m=0,g={};for(let u of [...c].sort()){let p=n.get(u);if(p===void 0)throw new Error(`Shader input ${JSON.stringify(u)} disappeared during inspection.`);if(m+=p.byteLength,m>x.semanticTotal)throw new Error("Semantic shader inputs exceed the total inspection size limit.");g[u]=$(p);}return g}a(Te,"snapshotShaderInputs");function ke(e){if(typeof e=="string")return e;if(f(e))return ke(e.import)??ke(e.default)}a(ke,"conditionalImportTarget");async function tt(e,t){let r=e;for(;;){let n=w.join(r,"node_modules",...t.split("/"),"package.json");if(await A(n)){let s=await le(n,x.packageJson,`${t} package.json`),o=JSON.parse(s.data.toString("utf8"));if(!f(o)||o.name!==t||typeof o.version!="string"||!Qt.test(o.version))throw new Error(`Installed ${t} package metadata is invalid.`);return {root:w.dirname(s.path),manifest:o}}let i=w.dirname(r);if(i===r)break;r=i;}throw new Error(`Cannot verify the installed ${t} package.`)}a(tt,"findInstalledPackage");async function sr(e,t){if(!f(t.exports))throw new Error("Installed three-blocks package has no public exports map.");let r=ke(t.exports[er]);if(r===void 0||!r.startsWith("./"))throw new Error("Installed three-blocks shader export has no import target.");let n=await realpath(e),i=[w.resolve(n,r)],s=new Map,o=0;for(;i.length>0;){let l=i.shift();if(l===void 0)break;let m=await le(l,x.semanticInput,"Three Blocks shader runtime module");if(!N(n,m.path)||m.path===n)throw new Error("Three Blocks shader runtime closure escapes its package.");let g=nt(n,m.path);if(s.has(g))continue;if(o+=m.data.byteLength,o>x.semanticTotal)throw new Error("Three Blocks shader runtime closure exceeds the inspection limit.");s.set(g,$(m.data));let u=Re(m.data,g);for(let p of rr(u)){let d=it(p);if(!d.startsWith("./")&&!d.startsWith("../"))continue;let h=w.resolve(w.dirname(m.path),d);if(!N(n,h))throw new Error("Three Blocks shader runtime import escapes its package.");i.push(h);}if(i.sort(),s.size+i.length>Ee)throw new Error("Three Blocks shader runtime closure exceeds the file limit.")}let c=[...s].sort((l,m)=>l[0].localeCompare(m[0])).map(([l,m])=>`${l}\0${m}`).join(`
19
- `);return $(c)}a(sr,"shaderRuntimeClosure");async function je(e){let[t,r]=await Promise.all([tt(e,"three"),tt(e,"three-blocks")]);return {three:String(t.manifest.version),threeBlocks:String(r.manifest.version),threeBlocksShaderClosure:await sr(r.root,r.manifest)}}a(je,"readInstalledShaderRuntime");var G;async function ar(){G===void 0&&(G=(async()=>{let t=createRequire(w.join(process.cwd(),"package.json")).resolve("@three-blocks/devtools/browser/shader-capture"),r=w.resolve(w.dirname(t),"../..");return (await C(r,t,x.metadata,"Shader capture browser runtime")).data.toString("utf8")})());let e=G;try{return await e}catch(t){throw G===e&&(G=void 0),t}}a(ar,"loadShaderCaptureRuntimeSource");var st=4096,cr=createRequire(import.meta.url),ot,b=new Proxy({},{get(e,t){return ot??=cr("typescript"),Reflect.get(ot,t)}});function L(e){let t=e;for(;b.isParenthesizedExpression(t)||b.isAsExpression(t)||b.isSatisfiesExpression(t)||b.isNonNullExpression(t);)t=t.expression;return t}a(L,"unwrap");function ur(e){if(b.isIdentifier(e)||b.isStringLiteral(e)||b.isNumericLiteral(e))return e.text}a(ur,"propertyName");function oe(e,t){let r=new Map;for(let n of e.properties){if(!b.isPropertyAssignment(n))throw new Error(`${t} may contain only static property assignments.`);let i=ur(n.name);if(i===void 0||r.has(i))throw new Error(`${t} contains a computed or duplicate property.`);r.set(i,n.initializer);}return r}a(oe,"properties");function ae(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=L(e);if(!b.isObjectLiteralExpression(r))throw new Error(`${t} must be a static object literal.`);return r}a(ae,"objectLiteral");function de(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=L(e);if(!b.isStringLiteral(r)&&!b.isNoSubstitutionTemplateLiteral(r))throw new Error(`${t} must be a string literal.`);return r.text}a(de,"stringLiteral");function ce(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=L(e);if(!b.isNumericLiteral(r))throw new Error(`${t} must be a numeric literal.`);return Number(r.text)}a(ce,"numericLiteral");function at(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=L(e);if(!b.isArrayLiteralExpression(r))throw new Error(`${t} must be a static array literal.`);return r.elements}a(at,"arrayLiteral");function lr(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=L(e);if(r.kind===b.SyntaxKind.NullKeyword)return null;if(!b.isNumericLiteral(r))throw new Error(`${t} must be null or a numeric literal.`);return Number(r.text)}a(lr,"numericOrNullLiteral");function fr(e){return e.parseDiagnostics??[]}a(fr,"parseDiagnostics");function dt(e,t,r,n){let i=b.createSourceFile(t,e,b.ScriptTarget.Latest,true,b.ScriptKind.TS),s=fr(i);if(s.length>0)throw new Error(`Shader manifest is not valid TypeScript: ${b.flattenDiagnosticMessageText(s[0]?.messageText??"parse error"," ")}`);let o=i.statements.filter(b.isExportAssignment).filter(d=>!d.isExportEquals);if(o.length!==1)throw new Error("Shader manifest must contain exactly one default export.");let c=oe(ae(o[0]?.expression,"Shader manifest default export"),"Shader manifest"),l=c.get("version");if(l===void 0||!b.isNumericLiteral(L(l))||Number(L(l).getText(i))!==3)throw new Error("Shader manifest version must be the numeric literal 3.");if(de(c.get("scene"),"Shader manifest scene")!==r)throw new Error(`Shader manifest scene does not match "${r}".`);if(n){if(de(c.get("three"),"Shader manifest Three.js version")!==n.three||de(c.get("threeBlocks"),"Shader manifest Three Blocks version")!==n.threeBlocks)throw new Error("Shader manifest runtime versions do not match its receipt.");let d=oe(ae(c.get("runtime"),"Shader manifest runtime"),"Shader manifest runtime");if(de(d.get("id"),"Shader manifest runtime id")!==n.compatibility||ce(d.get("address"),"Shader manifest address schema")!==n.address||ce(d.get("recipe"),"Shader manifest recipe schema")!==n.recipe||ce(d.get("hydration"),"Shader manifest hydration schema")!==n.hydration)throw new Error("Shader manifest runtime compatibility schemas do not match its receipt.")}let m=oe(ae(c.get("entries"),"Shader manifest entries"),"Shader manifest entries");if(m.size===0||m.size>st)throw new Error(`Shader manifest must contain between 1 and ${st} entries.`);let g=at(c.get("modules"),"Shader manifest modules").map((d,h)=>{let E=L(d);if(!b.isStringLiteral(E)&&!b.isNoSubstitutionTemplateLiteral(E))throw new Error(`Shader manifest module ${h} must be a WGSL string literal.`);if(E.text.length===0)throw new Error(`Shader manifest module ${h} is empty.`);return E.text}),u=at(c.get("states"),"Shader manifest states").map((d,h)=>{let E=oe(ae(d,`Shader manifest state ${h}`),`Shader manifest state ${h}`),T=a((M,v)=>{let R=lr(E.get(M),`Shader manifest state ${h} ${M}`);if(R===null)return false;let S=g[R];if(S===void 0||!S.includes(v))throw new Error(`Shader manifest state ${h} ${M} does not reference a ${v} module.`);return true},"moduleAt"),_=T("vertex","@vertex"),P=T("fragment","@fragment"),O=T("compute","@compute");if(O&&(_||P))throw new Error(`Shader manifest state ${h} mixes render and compute stages.`);if(!O&&!_&&!P)throw new Error(`Shader manifest state ${h} contains no shader stage.`);return {vertex:_,fragment:P,compute:O}}),p={render:0,vertex:0,fragment:0,compute:0};for(let[d,h]of m){if(d.length===0||/[\u0000-\u001f\u007f]/.test(d))throw new Error("Shader manifest contains an invalid entry key.");let E=ce(h,`Shader manifest entry "${d}"`),T=u[E];if(T===void 0)throw new Error(`Shader manifest entry "${d}" references an absent state.`);(T.vertex||T.fragment)&&(p.render+=1),T.vertex&&(p.vertex+=1),T.fragment&&(p.fragment+=1),T.compute&&(p.compute+=1);}return p}a(dt,"inspectPrecompiledManifest");function pr(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(pr,"sameCoverage");function mr(e){let t=e.some(n=>n.state==="invalid")?"invalid":e.some(n=>n.state==="missing")?"missing":e.some(n=>n.state==="stale")?"stale":"fresh",r=e.filter(n=>n.state===t);return {state:t,reason:t==="fresh"?`${e.length} configured shader scene${e.length===1?" is":"s are"} fresh.`:r.map(n=>`${n.scene}: ${n.reason}`).join("; ")}}a(mr,"classifyMatrix");function hr(e,t){let r=e.tool;if(!r)return "Shader receipt has no public tool compatibility metadata.";if(r.compatibility!==t)return "Shader receipt targets a different runtime compatibility contract.";if(r.transform!==se)return "Shader receipt uses a different provider transform version.";if(r.address!==SHADER_ADDRESS_SCHEMA_VERSION||r.recipe!==SHADER_RECIPE_SCHEMA_VERSION||r.hydration!==SHADER_HYDRATION_SCHEMA_VERSION)return "Shader receipt uses incompatible address, recipe, or hydration schemas."}a(hr,"exactToolCompatibility");function gr(e,t){let r=Object.keys(t).filter(s=>Object.hasOwn(e,s)&&e[s]!==t[s]),n=Object.keys(t).filter(s=>!Object.hasOwn(e,s)),i=Object.keys(e).filter(s=>!Object.hasOwn(t,s));return {...r.length>0?{changedInputs:r}:{},...n.length>0?{addedInputs:n}:{},...i.length>0?{removedInputs:i}:{}}}a(gr,"inputChanges");async function yr(e=process.cwd(),t){let r=await ze(e),n=await ge(r),i=w.join(r,he),s=a(()=>({schemaVersion:1,root:r,state:"missing",reason:`${he}/meta.json is absent.`,scenes:n.scenes.map(o=>({scene:o.key,state:"missing",reason:"No committed shader receipt."}))}),"missing");if(!await A(i)||!await A(w.join(i,"meta.json")))return s();try{let o=await H(r,i,"Shader artifact directory"),c=await C(o,w.join(o,"meta.json"),x.receipt,"Shader receipt"),l=re(JSON.parse(c.data.toString("utf8"))),m=await et(o,c.data),g=t??await je(r),u=J(g.three),p=new Set(n.scenes.map(S=>S.key)),h=Object.keys(l.scenes).filter(S=>!p.has(S));if(h.length>0)throw new Error(`Shader receipt contains unconfigured scenes: ${h.join(", ")}.`);let E=hr(l,u);if(E)throw new Error(E);let T=l.runtime.three!==g.three||l.runtime.threeBlocks!==g.threeBlocks,_=l.runtime.threeBlocksShaderClosure!==g.threeBlocksShaderClosure,P=l.tool?.version!==q,O=w.join(r,n.publicDir??"public"),M=[];for(let S of n.scenes){let k=l.scenes[S.key];if(!k){M.push({scene:S.key,state:"missing",reason:"Scene is absent from the complete receipt matrix."});continue}let F=await C(o,w.join(o,k.artifact),x.manifest,"Shader manifest");if($(F.data)!==k.artifactHash)throw new Error(`Shader artifact checksum differs for scene "${S.key}".`);if(k.asset!==void 0&&k.assetHash!==void 0){let pt=await C(O,w.join(O,k.asset),x.manifest,"Static shader manifest");if($(pt.data)!==k.assetHash)throw new Error(`Static shader manifest checksum differs for scene "${S.key}".`)}if(k.bytes!==void 0&&k.bytes!==F.data.byteLength)throw new Error(`Shader artifact byte count differs for scene "${S.key}".`);let K=dt(F.data.toString("utf8"),F.path,S.key,{three:l.runtime.three,threeBlocks:l.runtime.threeBlocks,compatibility:u,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION});if(!pr(K,k.coverage))throw new Error(`Shader coverage differs for scene "${S.key}".`);if(!n.allowLiveBuilds&&k.skipped&&k.skipped.render+k.skipped.compute>0)throw new Error(`Scene "${S.key}" contains skipped live builds but allowLiveBuilds is false.`);let ft=await Te(r,S.inputs),X=gr(k.inputs,ft),Y=(X.changedInputs?.length??0)+(X.addedInputs?.length??0)+(X.removedInputs?.length??0),$e=T||_||P||Y>0,Ce=m?.scenes[S.key],ue=Ce===void 0||m===void 0?void 0:{...Ce,schemaVersion:m.schemaVersion,measuredAt:m.measuredAt,source:m.source,...m.source==="committed-capture"?{adapter:m.adapter,platform:m.platform}:{}};M.push({scene:S.key,state:$e?"stale":"fresh",reason:T?"Installed runtime versions differ from the receipt.":_?"Installed three-blocks/shaders runtime closure differs from the receipt.":P?`Receipt was generated by @three-blocks/devtools ${l.tool?.version??"unknown"}.`:Y>0?`${Y} semantic shader input${Y===1?"":"s"} changed.`:"Manifest, runtime, schemas, transform, and semantic inputs match.",coverage:K,...!$e&&ue!==void 0&&ue.builds===K.render+K.compute?{timing:ue}:{},...X});}let v=mr(M),R=v.state==="fresh"&&m!==void 0&&M.every(S=>S.timing!==void 0)?m:void 0;return {schemaVersion:1,root:r,...v,scenes:M,runtime:g,receipt:l,...R===void 0?{}:{timing:R}}}catch(o){let c=o instanceof Error?o.message:String(o);return {schemaVersion:1,root:r,state:"invalid",reason:c,scenes:n.scenes.map(l=>({scene:l.key,state:"invalid",reason:c}))}}}a(yr,"inspectShaderMatrix");export{se as SHADER_PROVIDER_TRANSFORM_VERSION,yr as inspectShaderMatrix,ar as loadShaderCaptureRuntimeSource,ge as loadShaderToolConfig,je as readInstalledShaderRuntime,Te as snapshotShaderInputs,U as stableStringify,Vt as validateShaderCapture,Wt as writeShaderArtifacts};
18
+ `:" ",s===c&&(n="code");}return r}o(Ce,"lexicalSource");function ur(e){let t=new Set,r=Ce(e,true);for(let n of r.matchAll(sr))n[2]===void 0&&n[3]!==void 0&&t.add(n[3]);for(let n of r.matchAll(or))n[1]!==void 0&&t.add(n[1]);return [...t].sort()}o(ur,"importSpecifiers");function lr(e){let t=new Set;for(let r of Ce(e,true).matchAll(ar)){let n=r[1]??r[2];n!==void 0&&t.add(n);}return [...t].sort()}o(lr,"runtimeSpecifiers");function ft(e){return (e.split(/[?#]/u,1)[0]??e).replaceAll("\\","/")}o(ft,"cleanSpecifier");function fr(e,t,r){let n=ft(t),i;if(n.startsWith("./")||n.startsWith("../"))i=b.posix.normalize(b.posix.join(b.posix.dirname(e),n));else if(n.startsWith("@/"))i=`src/${n.slice(2)}`;else if(n.startsWith("/src/"))i=n.slice(1);else return;if(i===".three-blocks"||i.startsWith(".three-blocks/"))return;let s=b.posix.extname(i).toLowerCase(),a=new Set([i]);if(s.length===0||!je.has(s)){for(let c of Te)a.add(`${i}${c}`);for(let c of Te)a.add(`${i}/index${c}`);}else if([".js",".mjs",".cjs",".jsx"].includes(s)){let c=i.slice(0,-s.length);for(let f of [".ts",".tsx",".mts",".cts"])a.add(`${c}${f}`);}return [...a].find(c=>r.has(c))}o(fr,"resolveProjectImport");function pr(e,t){let r=Ce(t,false);return rr.test(e)||nr.test(r)||ir.test(r)}o(pr,"isShaderRoot");async function Ie(e,t){let r=await realpath(e);if(t!==void 0){let d={},p=0;for(let g of t){let u=await _(r,b.join(r,g),$.semanticInput,"Declared shader semantic input");if(p+=u.data.byteLength,p>$.semanticTotal)throw new Error("Declared shader semantic inputs exceed the total inspection size limit.");d[g]=I(u.data);}return d}let n=new Map,i=b.join(r,"src");if(await C(i))for(let d of await Ve(r,i,p=>je.has(b.extname(p).toLowerCase()))){let p=await _(r,d,$.semanticInput,"Shader semantic input");n.set(lt(r,d),p.data);}for(let d of await readdir(r,{withFileTypes:true})){if(!d.isFile()||!xe.test(d.name)&&!je.has(b.extname(d.name).toLowerCase()))continue;let p=await _(r,b.join(r,d.name),$.semanticInput,xe.test(d.name)?"Shader configuration input":"Shader semantic input");n.set(d.name,p.data);}if(n.size>$e)throw new Error(`Shader input discovery exceeds the ${$e}-file limit.`);let s=new Set,a=new Map;for(let[d,p]of n){if(!d.includes("/")&&xe.test(d)&&s.add(d),!d.startsWith("src/"))continue;let g=Ae(p,d);a.set(d,g),pr(d,g)&&s.add(d);}if(s.size===0)throw new Error("No shader registration or scene source root was found.");let c=new Set,f=[...s].sort();for(;f.length>0;){let d=f.shift();if(d===void 0||c.has(d))continue;let p=n.get(d);if(p===void 0)continue;c.add(d);let g=a.get(d)??Ae(p,d);for(let u of ur(g)){let R=fr(d,u,n);R!==void 0&&!c.has(R)&&f.push(R);}f.sort();}let m=0,h={};for(let d of [...c].sort()){let p=n.get(d);if(p===void 0)throw new Error(`Shader input ${JSON.stringify(d)} disappeared during inspection.`);if(m+=p.byteLength,m>$.semanticTotal)throw new Error("Semantic shader inputs exceed the total inspection size limit.");h[d]=I(p);}return h}o(Ie,"snapshotShaderInputs");function Me(e){if(typeof e=="string")return e;if(l(e))return Me(e.import)??Me(e.default)}o(Me,"conditionalImportTarget");async function ct(e,t){let r=e;for(;;){let n=b.join(r,"node_modules",...t.split("/"),"package.json");if(await C(n)){let s=await ye(n,$.packageJson,`${t} package.json`),a=JSON.parse(s.data.toString("utf8"));if(!l(a)||a.name!==t||typeof a.version!="string"||!dr.test(a.version))throw new Error(`Installed ${t} package metadata is invalid.`);return {root:b.dirname(s.path),manifest:a}}let i=b.dirname(r);if(i===r)break;r=i;}throw new Error(`Cannot verify the installed ${t} package.`)}o(ct,"findInstalledPackage");async function mr(e,t){if(!l(t.exports))throw new Error("Installed three-blocks package has no public exports map.");let r=Me(t.exports[cr]);if(r===void 0||!r.startsWith("./"))throw new Error("Installed three-blocks shader export has no import target.");let n=await realpath(e),i=[b.resolve(n,r)],s=new Map,a=0;for(;i.length>0;){let f=i.shift();if(f===void 0)break;let m=await ye(f,$.semanticInput,"Three Blocks shader runtime module");if(!v(n,m.path)||m.path===n)throw new Error("Three Blocks shader runtime closure escapes its package.");let h=lt(n,m.path);if(s.has(h))continue;if(a+=m.data.byteLength,a>$.semanticTotal)throw new Error("Three Blocks shader runtime closure exceeds the inspection limit.");s.set(h,I(m.data));let d=Ae(m.data,h);for(let p of lr(d)){let g=ft(p);if(!g.startsWith("./")&&!g.startsWith("../"))continue;let u=b.resolve(b.dirname(m.path),g);if(!v(n,u))throw new Error("Three Blocks shader runtime import escapes its package.");i.push(u);}if(i.sort(),s.size+i.length>$e)throw new Error("Three Blocks shader runtime closure exceeds the file limit.")}let c=[...s].sort((f,m)=>f[0].localeCompare(m[0])).map(([f,m])=>`${f}\0${m}`).join(`
19
+ `);return I(c)}o(mr,"shaderRuntimeClosure");async function Be(e){let[t,r]=await Promise.all([ct(e,"three"),ct(e,"three-blocks")]);return {three:String(t.manifest.version),threeBlocks:String(r.manifest.version),threeBlocksShaderClosure:await mr(r.root,r.manifest)}}o(Be,"readInstalledShaderRuntime");var Z;async function gr(){Z===void 0&&(Z=(async()=>{let t=createRequire(b.join(process.cwd(),"package.json")).resolve("@three-blocks/devtools/browser/shader-capture"),r=b.resolve(b.dirname(t),"../..");return (await _(r,t,$.metadata,"Shader capture browser runtime")).data.toString("utf8")})());let e=Z;try{return await e}catch(t){throw Z===e&&(Z=void 0),t}}o(gr,"loadShaderCaptureRuntimeSource");var pt=4096,Sr=createRequire(import.meta.url),mt,E=new Proxy({},{get(e,t){return mt??=Sr("typescript"),Reflect.get(mt,t)}});function H(e){let t=e;for(;E.isParenthesizedExpression(t)||E.isAsExpression(t)||E.isSatisfiesExpression(t)||E.isNonNullExpression(t);)t=t.expression;return t}o(H,"unwrap");function wr(e){if(E.isIdentifier(e)||E.isStringLiteral(e)||E.isNumericLiteral(e))return e.text}o(wr,"propertyName");function Q(e,t){let r=new Map;for(let n of e.properties){if(!E.isPropertyAssignment(n))throw new Error(`${t} may contain only static property assignments.`);let i=wr(n.name);if(i===void 0||r.has(i))throw new Error(`${t} contains a computed or duplicate property.`);r.set(i,n.initializer);}return r}o(Q,"properties");function ee(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=H(e);if(!E.isObjectLiteralExpression(r))throw new Error(`${t} must be a static object literal.`);return r}o(ee,"objectLiteral");function te(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=H(e);if(!E.isStringLiteral(r)&&!E.isNoSubstitutionTemplateLiteral(r))throw new Error(`${t} must be a string literal.`);return r.text}o(te,"stringLiteral");function he(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=H(e);if(!E.isNumericLiteral(r))throw new Error(`${t} must be a numeric literal.`);return Number(r.text)}o(he,"numericLiteral");function ht(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=H(e);if(!E.isArrayLiteralExpression(r))throw new Error(`${t} must be a static array literal.`);return r.elements}o(ht,"arrayLiteral");function br(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=H(e);if(r.kind===E.SyntaxKind.NullKeyword)return null;if(!E.isNumericLiteral(r))throw new Error(`${t} must be null or a numeric literal.`);return Number(r.text)}o(br,"numericOrNullLiteral");function Er(e){return e.parseDiagnostics??[]}o(Er,"parseDiagnostics");function gt(e,t,r,n){let i=E.createSourceFile(t,e,E.ScriptTarget.Latest,true,E.ScriptKind.TS),s=Er(i);if(s.length>0)throw new Error(`Shader manifest is not valid TypeScript: ${E.flattenDiagnosticMessageText(s[0]?.messageText??"parse error"," ")}`);let a=i.statements.filter(E.isExportAssignment).filter(y=>!y.isExportEquals);if(a.length!==1)throw new Error("Shader manifest must contain exactly one default export.");let c=Q(ee(a[0]?.expression,"Shader manifest default export"),"Shader manifest"),f=c.get("version");if(f===void 0||!E.isNumericLiteral(H(f))||Number(H(f).getText(i))!==3)throw new Error("Shader manifest version must be the numeric literal 3.");if(te(c.get("scene"),"Shader manifest scene")!==r)throw new Error(`Shader manifest scene does not match "${r}".`);let m=c.get("runtime"),d=(n?.compatibility??(m===void 0?"":te(Q(ee(m,"Shader manifest runtime"),"Shader manifest runtime").get("id"),"Shader manifest runtime id"))).startsWith("three-webgl-");if(n){if(te(c.get("three"),"Shader manifest Three.js version")!==n.three||te(c.get("threeBlocks"),"Shader manifest Three Blocks version")!==n.threeBlocks)throw new Error("Shader manifest runtime versions do not match its receipt.");let y=Q(ee(c.get("runtime"),"Shader manifest runtime"),"Shader manifest runtime");if(te(y.get("id"),"Shader manifest runtime id")!==n.compatibility||he(y.get("address"),"Shader manifest address schema")!==n.address||he(y.get("recipe"),"Shader manifest recipe schema")!==n.recipe||he(y.get("hydration"),"Shader manifest hydration schema")!==n.hydration)throw new Error("Shader manifest runtime compatibility schemas do not match its receipt.")}let p=Q(ee(c.get("entries"),"Shader manifest entries"),"Shader manifest entries");if(p.size===0&&!d||p.size>pt)throw new Error(`Shader manifest must contain ${d?"0":"1"}...${pt} entries.`);let g=ht(c.get("modules"),"Shader manifest modules").map((y,k)=>{let x=H(y);if(!E.isStringLiteral(x)&&!E.isNoSubstitutionTemplateLiteral(x))throw new Error(`Shader manifest module ${k} must be a shader string literal.`);if(x.text.length===0)throw new Error(`Shader manifest module ${k} is empty.`);return x.text}),u=ht(c.get("states"),"Shader manifest states").map((y,k)=>{let x=Q(ee(y,`Shader manifest state ${k}`),`Shader manifest state ${k}`),A=o((V,T)=>{let S=br(x.get(V),`Shader manifest state ${k} ${V}`);if(S===null)return false;let N=g[S];if(N===void 0||!d&&!N.includes(T))throw new Error(`Shader manifest state ${k} ${V} does not reference a ${T} module.`);return true},"moduleAt"),O=A("vertex","@vertex"),B=A("fragment","@fragment"),F=A("compute","@compute");if(F&&(O||B))throw new Error(`Shader manifest state ${k} mixes render and compute stages.`);if(!F&&!O&&!B)throw new Error(`Shader manifest state ${k} contains no shader stage.`);return {vertex:O,fragment:B,compute:F}}),R={render:0,vertex:0,fragment:0,compute:0};for(let[y,k]of p){if(y.length===0||/[\u0000-\u001f\u007f]/.test(y))throw new Error("Shader manifest contains an invalid entry key.");let x=he(k,`Shader manifest entry "${y}"`),A=u[x];if(A===void 0)throw new Error(`Shader manifest entry "${y}" references an absent state.`);(A.vertex||A.fragment)&&(R.render+=1),A.vertex&&(R.vertex+=1),A.fragment&&(R.fragment+=1),A.compute&&(R.compute+=1);}return R}o(gt,"inspectPrecompiledManifest");function kr(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}o(kr,"sameCoverage");function Rr(e){let t=e.some(n=>n.state==="invalid")?"invalid":e.some(n=>n.state==="missing")?"missing":e.some(n=>n.state==="stale")?"stale":"fresh",r=e.filter(n=>n.state===t);return {state:t,reason:t==="fresh"?`${e.length} configured shader scene${e.length===1?" is":"s are"} fresh.`:r.map(n=>`${n.scene} (${n.backend}): ${n.reason}`).join("; ")}}o(Rr,"classifyMatrix");function xr(e,t,r){let n=e.tool;if(!n)return "Shader receipt has no public tool compatibility metadata.";if((n.compatibilities?.[r]??n.compatibility)!==t)return "Shader receipt targets a different runtime compatibility contract.";if(n.transform!==me)return "Shader receipt uses a different provider transform version.";if(n.address!==SHADER_ADDRESS_SCHEMA_VERSION||n.recipe!==SHADER_RECIPE_SCHEMA_VERSION||n.hydration!==SHADER_HYDRATION_SCHEMA_VERSION)return "Shader receipt uses incompatible address, recipe, or hydration schemas."}o(xr,"exactToolCompatibility");function Tr(e,t){let r=Object.keys(t).filter(s=>Object.hasOwn(e,s)&&e[s]!==t[s]),n=Object.keys(t).filter(s=>!Object.hasOwn(e,s)),i=Object.keys(e).filter(s=>!Object.hasOwn(t,s));return {...r.length>0?{changedInputs:r}:{},...n.length>0?{addedInputs:n}:{},...i.length>0?{removedInputs:i}:{}}}o(Tr,"inputChanges");async function jr(e=process.cwd(),t,r){let n=await Xe(e),i=await ke(n),s=qe(r??i.backend),a=i.scenes.flatMap(m=>J(m,s).map(h=>({scene:m,backend:h,key:K(m.key,h)}))),c=b.join(n,Ee),f=o(()=>({schemaVersion:1,root:n,state:"missing",reason:`${Ee}/meta.json is absent.`,scenes:a.map(({scene:m,backend:h})=>({scene:m.key,backend:h,state:"missing",reason:"No committed shader receipt."}))}),"missing");if(!await C(c)||!await C(b.join(c,"meta.json")))return f();try{let m=await U(n,c,"Shader artifact directory"),h=await _(m,b.join(m,"meta.json"),$.receipt,"Shader receipt"),d=le(JSON.parse(h.data.toString("utf8"))),p=await dt(m,h.data),g=t??await Be(n),u=new Set(i.scenes.flatMap(T=>J(T,["webgpu","webgl"]).map(S=>K(T.key,S)))),y=Object.keys(d.scenes).filter(T=>!u.has(T));if(y.length>0)throw new Error(`Shader receipt contains unconfigured scenes: ${y.join(", ")}.`);let k=d.runtime.three!==g.three||d.runtime.threeBlocks!==g.threeBlocks,x=d.runtime.threeBlocksShaderClosure!==g.threeBlocksShaderClosure,A=d.tool?.version!==X,O=b.join(n,i.publicDir??"public"),B=[];for(let{scene:T,backend:S,key:N}of a){let j=d.scenes[N];if(!j){B.push({scene:T.key,backend:S,state:"missing",reason:"Scene/backend is absent from the complete receipt matrix."});continue}let re=Y(g.three,S),Pe=xr(d,re,S);if(Pe)throw new Error(`${N}: ${Pe}`);let ne=await _(m,b.join(m,j.artifact),$.manifest,"Shader manifest");if(I(ne.data)!==j.artifactHash)throw new Error(`Shader artifact checksum differs for scene "${T.key}".`);if(j.asset!==void 0&&j.assetHash!==void 0){let Et=await _(O,b.join(O,j.asset),$.manifest,"Static shader manifest");if(I(Et.data)!==j.assetHash)throw new Error(`Static shader manifest checksum differs for scene "${T.key}".`)}if(j.bytes!==void 0&&j.bytes!==ne.data.byteLength)throw new Error(`Shader artifact byte count differs for scene "${T.key}".`);let ie=gt(ne.data.toString("utf8"),ne.path,T.key,{three:d.runtime.three,threeBlocks:d.runtime.threeBlocks,compatibility:re,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION});if(!kr(ie,j.coverage))throw new Error(`Shader coverage differs for scene "${T.key}".`);if(S==="webgpu"&&!i.allowLiveBuilds&&j.skipped&&j.skipped.render+j.skipped.compute>0)throw new Error(`Scene "${T.key}" contains skipped live builds but allowLiveBuilds is false.`);let bt=await Ie(n,T.inputs),se=Tr(j.inputs,bt),oe=(se.changedInputs?.length??0)+(se.addedInputs?.length??0)+(se.removedInputs?.length??0),Oe=k||x||A||oe>0,Ne=p?.scenes[N],ge=Ne===void 0||p===void 0?void 0:{...Ne,schemaVersion:p.schemaVersion,measuredAt:p.measuredAt,source:p.source,...p.source==="committed-capture"?{adapter:p.adapter,platform:p.platform}:{}};B.push({scene:T.key,backend:S,state:Oe?"stale":"fresh",reason:k?"Installed runtime versions differ from the receipt.":x?"Installed three-blocks/shaders runtime closure differs from the receipt.":A?`Receipt was generated by @three-blocks/devtools ${d.tool?.version??"unknown"}.`:oe>0?`${oe} semantic shader input${oe===1?"":"s"} changed.`:"Manifest, runtime, schemas, transform, and semantic inputs match.",coverage:ie,...!Oe&&ge!==void 0&&ge.builds===ie.render+ie.compute?{timing:ge}:{},...se});}let F=Rr(B),V=F.state==="fresh"&&p!==void 0&&B.every(T=>T.timing!==void 0)?p:void 0;return {schemaVersion:1,root:n,...F,scenes:B,runtime:g,receipt:d,...V===void 0?{}:{timing:V}}}catch(m){let h=m instanceof Error?m.message:String(m);return {schemaVersion:1,root:n,state:"invalid",reason:h,scenes:a.map(({scene:d,backend:p})=>({scene:d.key,backend:p,state:"invalid",reason:h}))}}}o(jr,"inspectShaderMatrix");export{me as SHADER_PROVIDER_TRANSFORM_VERSION,jr as inspectShaderMatrix,gr as loadShaderCaptureRuntimeSource,ke as loadShaderToolConfig,Be as readInstalledShaderRuntime,Ie as snapshotShaderInputs,q as stableStringify,Yt as validateShaderCapture,er as writeShaderArtifacts};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{b as SHADER_ARTIFACT_DIRECTORY,c as SHADER_PARITY_DIRECTORY,a as SHADER_TOOL_CONFIG_FILE,l as ensureShaderToolConfig,i as findShaderProjectRoot,k as inferShaderCaptureTarget,j as loadShaderToolConfig,h as parseShaderToolConfig,d as shaderBackends,g as shaderReceiptKey,e as shaderSceneBackends,f as shaderScenePairs}from'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$2}from'./chunk-ZDNZCQUQ.js';import {j,a as a$1,d}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {spawn}from'child_process';import {readFile}from'fs/promises';import {createRequire}from'module';import T from'net';import l from'path';var P=128*1024;function h(e,t){let n=`${e}${String(t)}`;return n.length<=P?n:n.slice(n.length-P)}a(h,"appendOutput");async function C(e){let t=await j(e,l.join(e,"package.json"),a$1.packageJson,"Project package.json"),n=JSON.parse(t.data.toString("utf8"));if(!a$2(n))throw new Error("Project package.json must contain an object.");return n}a(C,"projectManifest");async function _(){return new Promise((e,t)=>{let n=T.createServer();n.unref(),n.once("error",t),n.listen({host:"127.0.0.1",port:0},()=>{let r=n.address(),o=typeof r=="object"&&r!==null?r.port:void 0;n.close(i=>{i?t(i):o===void 0?t(new Error("Could not allocate a local capture port.")):e(o);});});})}a(_,"availablePort");function S(e,t,n,r){let o=r.trim();return new Error(`${e} exited with code ${n??"unknown"} while running ${t}.`+(o.length===0?"":`
2
+ import {a as a$2}from'./chunk-65VEJRRT.js';import {j,a as a$1,d}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {spawn}from'child_process';import {readFile}from'fs/promises';import {createRequire}from'module';import T from'net';import l from'path';var P=128*1024;function h(e,t){let n=`${e}${String(t)}`;return n.length<=P?n:n.slice(n.length-P)}a(h,"appendOutput");async function C(e){let t=await j(e,l.join(e,"package.json"),a$1.packageJson,"Project package.json"),n=JSON.parse(t.data.toString("utf8"));if(!a$2(n))throw new Error("Project package.json must contain an object.");return n}a(C,"projectManifest");async function _(){return new Promise((e,t)=>{let n=T.createServer();n.unref(),n.once("error",t),n.listen({host:"127.0.0.1",port:0},()=>{let r=n.address(),o=typeof r=="object"&&r!==null?r.port:void 0;n.close(i=>{i?t(i):o===void 0?t(new Error("Could not allocate a local capture port.")):e(o);});});})}a(_,"availablePort");function S(e,t,n,r){let o=r.trim();return new Error(`${e} exited with code ${n??"unknown"} while running ${t}.`+(o.length===0?"":`
3
3
  ${o}`))}a(S,"childFailure");async function b(e){if(e.exitCode!==null||e.signalCode!==null)return;e.kill("SIGTERM");let t=Date.now()+3e3;for(;e.exitCode===null&&e.signalCode===null&&Date.now()<t;)await new Promise(n=>setTimeout(n,25));if(e.exitCode===null&&e.signalCode===null)for(e.kill("SIGKILL");e.exitCode===null&&e.signalCode===null;)await new Promise(n=>setTimeout(n,25));}a(b,"stopChild");async function N(e,t,n,r,o){let i=Date.now()+o,s;for(e.once("exit",c=>{s=c;});Date.now()<i;){if(s!==void 0||e.exitCode!==null||e.signalCode!==null)throw S("Next.js capture server",n,s??e.exitCode,r());try{await(await fetch(t,{redirect:"manual",signal:AbortSignal.timeout(5e3)})).body?.cancel();return}catch{await new Promise(c=>{setTimeout(c,150).unref();});}}throw new Error(`Next.js capture server did not answer ${t} within ${o}ms while running ${n}.`+(r().trim().length===0?"":`
4
4
  ${r().trim()}`))}a(N,"waitForServer");async function A(e,t=12e4){await C(e);let n;try{n=createRequire(l.join(e,"package.json")).resolve("next/package.json");}catch(d){throw new Error("Next.js is declared but could not be resolved from the target project.",{cause:d})}let r=JSON.parse(await readFile(n,"utf8"));if(!a$2(r))throw new Error("Resolved Next.js package metadata is invalid.");let o=r.bin,i=typeof o=="string"?o:a$2(o)&&typeof o.next=="string"?o.next:void 0;if(i===void 0)throw new Error("Resolved Next.js package does not expose its CLI.");let s=typeof r.version=="string"?Number.parseInt(r.version.split(".")[0]??"",10):Number.NaN,c=await _(),p=[l.resolve(l.dirname(n),i),"dev",...Number.isFinite(s)&&s>=16?["--webpack"]:[],"--hostname","127.0.0.1","--port",String(c)],v=`${process.execPath} ${p.map(d=>JSON.stringify(d)).join(" ")}`,g=spawn(process.execPath,p,{cwd:e,env:{...process.env,THREE_BLOCKS_SHADER_TOOL:"1"},stdio:["ignore","pipe","pipe"]}),m="";g.stdout?.on("data",d=>{m=h(m,d);}),g.stderr?.on("data",d=>{m=h(m,d);});let y=`http://127.0.0.1:${c}/`;try{await N(g,y,v,()=>m,t);}catch(d){throw await b(g),d}return {url:y,command:v,diagnostics:a(()=>m,"diagnostics"),close:a(()=>b(g),"close")}}a(A,"startNextShaderCaptureServer");async function R(e,t){if(typeof t.packageManager=="string"){let n=t.packageManager.split("@")[0];if(n==="bun"||n==="npm"||n==="pnpm"||n==="yarn")return n}return await d(l.join(e,"bun.lock"))||await d(l.join(e,"bun.lockb"))?"bun":await d(l.join(e,"pnpm-lock.yaml"))?"pnpm":await d(l.join(e,"yarn.lock"))?"yarn":"npm"}a(R,"packageManager");function L(e){switch(e){case "bun":return {command:"bun",arguments:["run","build"]};case "pnpm":return {command:"pnpm",arguments:["run","build"]};case "yarn":return {command:"yarn",arguments:["build"]};case "npm":return {command:"npm",arguments:["run","build"]}}}a(L,"buildCommand");async function J(e,t=10*6e4){let n=await C(e);if(!a$2(n.scripts)||typeof n.scripts.build!="string")throw new Error('The detected non-Vite project has no package.json "build" script. Build it with THREE_BLOCKS_SHADER_TOOL=1, then pass --driver static --serve <directory>.');let r=L(await R(e,n)),o=`${r.command} ${r.arguments.join(" ")}`,i=spawn(r.command,r.arguments,{cwd:e,env:{...process.env,THREE_BLOCKS_SHADER_TOOL:"1"},stdio:["ignore","pipe","pipe"],shell:process.platform==="win32"}),s="";i.stdout?.on("data",u=>{s=h(s,u);}),i.stderr?.on("data",u=>{s=h(s,u);});let c=await Promise.race([new Promise((u,p)=>{i.once("error",p),i.once("exit",u);}),new Promise(u=>{setTimeout(()=>u("timeout"),t).unref();})]);if(c==="timeout")throw await b(i),new Error(`Capture build exceeded ${t}ms while running ${o}.`);if(c!==0)throw S("Capture build",o,c,s)}a(J,"buildShaderCaptureProject");
5
5
  export{J as buildShaderCaptureProject,A as startNextShaderCaptureServer};
@@ -20,6 +20,7 @@ interface AppliedShaderProviderTransform {
20
20
  }
21
21
  interface ApplyShaderProviderTransformOptions {
22
22
  readonly instrumentCapture?: boolean;
23
+ readonly forceWebGL?: boolean;
23
24
  /** Exact Three.js runtime revision for unreleased compatibility fixtures. */
24
25
  readonly threeRevision?: string;
25
26
  /**
@@ -34,6 +35,8 @@ declare function applyShaderProviderTransform(source: string, threeVersion: stri
34
35
  interface ShaderCaptureTransformOptions {
35
36
  readonly capture: boolean;
36
37
  readonly forceLive: boolean;
38
+ readonly driven?: boolean;
39
+ readonly forceWebGL?: boolean;
37
40
  readonly settleFrames: number;
38
41
  readonly settleTimeoutMs?: number;
39
42
  readonly visibilityGuard?: boolean;
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import {e}from'./chunk-LUULHXFK.js';import'./chunk-4YRR36JN.js';import'./chunk-W6UL2OW7.js';import'./chunk-ZT6T2W4B.js';import {i}from'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {watch}from'fs';import v from'path';var o=class{static{a(this,"ShaderWatchQueue");}#s;#r;#a;#e;#t;#i=false;#n=false;constructor(r){if(this.#s=r.capture,this.#r=r.debounceMs??200,this.#a=r.onError??(()=>{}),!Number.isSafeInteger(this.#r)||this.#r<0||this.#r>6e4)throw new Error("Shader watch debounce must be an integer in 0...60000ms.")}notify(){this.#n||(this.#i=true,!this.#t&&(this.#e&&clearTimeout(this.#e),this.#e=setTimeout(()=>{this.#e=void 0,this.#o();},this.#r)));}#o(){this.#n||this.#t||!this.#i||(this.#i=false,this.#t=this.#s().catch(r=>{this.#a(r instanceof Error?r:new Error(String(r)));}).finally(()=>{this.#t=void 0,this.#i&&!this.#n&&this.notify();}));}async close(){this.#n=true,this.#i=false,this.#e&&clearTimeout(this.#e),this.#e=void 0,await this.#t;}};function y(e){let r=e.split(v.sep).join("/");return r===""||r.startsWith("node_modules/")||r.startsWith(".git/")||r.startsWith("dist/")||r===".three-blocks"||r.startsWith(".three-blocks/")}a(y,"ignored");async function W(e$1={}){let r=e$1.root??await i(e$1.start),d,l=new Promise(t=>{d=t;}),n=new o({...e$1.debounceMs!==void 0?{debounceMs:e$1.debounceMs}:{},...e$1.onError?{onError:e$1.onError}:{},capture:a(async()=>{let t=await e({root:r,...e$1.config?{config:e$1.config}:{},...e$1.driver?{driver:e$1.driver}:{},...e$1.driverKind?{driverKind:e$1.driverKind}:{},...e$1.serve?{serve:e$1.serve}:{},...e$1.url?{url:e$1.url}:{},...e$1.headed!==void 0?{headed:e$1.headed}:{},...e$1.attempts!==void 0?{attempts:e$1.attempts}:{}});e$1.onResult?.(t);},"capture")}),s,u=false,a$1=a(async()=>{u||(u=true,s?.close(),await n.close(),d?.());},"close");return s=watch(r,{recursive:true},(t,f)=>{y(f??"")||n.notify();}),s.on("error",t=>e$1.onError?.(t)),e$1.signal&&(e$1.signal.aborted?await a$1():e$1.signal.addEventListener("abort",()=>{a$1();},{once:true})),e$1.initial!==false&&n.notify(),{root:r,done:l,close:a$1}}a(W,"watchShaders");export{o as ShaderWatchQueue,W as watchShaders};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{e as captureShaders,d as inspectShaderMatrix,f as testShaders}from'./chunk-LUULHXFK.js';import'./chunk-4YRR36JN.js';import'./chunk-W6UL2OW7.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{b as RUNTIME_STATUS_RECEIPT_MAX_BYTES,a as RUNTIME_STATUS_RECEIPT_PATH,c as RUNTIME_STATUS_RECOVERY,e as findProjectRoot,i as formatShaderMatrixStatus,j as formatStatus,k as formatThreeBlocksStatus,f as inspectProject,g as inspectThreeBlocksStatus,d as parseRuntimeStatusReceipt,h as threeBlocksStatusIsFresh}from'./chunk-TUIINI6U.js';import'./chunk-76WRV5MZ.js';import'./chunk-JHBQB7WC.js';export{c as readInstalledShaderRuntime,b as snapshotShaderInputs}from'./chunk-LUULHXFK.js';import'./chunk-4YRR36JN.js';import'./chunk-W6UL2OW7.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{b as TEXT_ATLAS_GENERATOR_VERSION,a as TEXT_ATLAS_SCHEMA_VERSION,c as builtinFontMetadata,e as generateTextAtlases,g as inspectTextAtlases,f as parseTextAtlasReceipt,d as prewarmBuiltinFont}from'./chunk-JMS5NTP7.js';import'./chunk-ZDNZCQUQ.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
2
+ export{b as TEXT_ATLAS_GENERATOR_VERSION,a as TEXT_ATLAS_SCHEMA_VERSION,c as builtinFontMetadata,e as generateTextAtlases,g as inspectTextAtlases,f as parseTextAtlasReceipt,d as prewarmBuiltinFont}from'./chunk-JHBQB7WC.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
@@ -1 +1 @@
1
- 'use strict';var chunkPY2ZLMZF_cjs=require('./chunk-PY2ZLMZF.cjs');Object.defineProperty(exports,"THREE_BLOCKS_WEBPACK_LOADER",{enumerable:true,get:function(){return chunkPY2ZLMZF_cjs.b}});Object.defineProperty(exports,"createEsbuildShaderPlugin",{enumerable:true,get:function(){return chunkPY2ZLMZF_cjs.g}});Object.defineProperty(exports,"createRollupShaderPlugin",{enumerable:true,get:function(){return chunkPY2ZLMZF_cjs.h}});Object.defineProperty(exports,"resolveShaderAdapterThreeVersion",{enumerable:true,get:function(){return chunkPY2ZLMZF_cjs.e}});Object.defineProperty(exports,"transformThreeWebGPUModule",{enumerable:true,get:function(){return chunkPY2ZLMZF_cjs.f}});Object.defineProperty(exports,"withThreeBlocksNext",{enumerable:true,get:function(){return chunkPY2ZLMZF_cjs.d}});Object.defineProperty(exports,"withThreeBlocksWebpack",{enumerable:true,get:function(){return chunkPY2ZLMZF_cjs.c}});
1
+ 'use strict';var chunkTRHSN2DJ_cjs=require('./chunk-TRHSN2DJ.cjs');Object.defineProperty(exports,"THREE_BLOCKS_WEBPACK_LOADER",{enumerable:true,get:function(){return chunkTRHSN2DJ_cjs.b}});Object.defineProperty(exports,"createEsbuildShaderPlugin",{enumerable:true,get:function(){return chunkTRHSN2DJ_cjs.g}});Object.defineProperty(exports,"createRollupShaderPlugin",{enumerable:true,get:function(){return chunkTRHSN2DJ_cjs.h}});Object.defineProperty(exports,"resolveShaderAdapterThreeVersion",{enumerable:true,get:function(){return chunkTRHSN2DJ_cjs.e}});Object.defineProperty(exports,"transformThreeWebGPUModule",{enumerable:true,get:function(){return chunkTRHSN2DJ_cjs.f}});Object.defineProperty(exports,"withThreeBlocksNext",{enumerable:true,get:function(){return chunkTRHSN2DJ_cjs.d}});Object.defineProperty(exports,"withThreeBlocksWebpack",{enumerable:true,get:function(){return chunkTRHSN2DJ_cjs.c}});
@@ -1,4 +1,4 @@
1
- import { A as AppliedShaderProviderTransform } from './shader-transform-DSFaVrux.js';
1
+ import { A as AppliedShaderProviderTransform } from './shader-transform-D160zMyt.js';
2
2
  import 'vite';
3
3
 
4
4
  interface ShaderBundlerTransformOptions {
package/dist/transform.js CHANGED
@@ -1 +1 @@
1
- export{a as THREE_BLOCKS_WEBPACK_LOADER,f as createEsbuildShaderPlugin,g as createRollupShaderPlugin,d as resolveShaderAdapterThreeVersion,e as transformThreeWebGPUModule,c as withThreeBlocksNext,b as withThreeBlocksWebpack}from'./chunk-YLN3G2JS.js';import'./chunk-5X5NS5EW.js';import'./chunk-EI7MMDWY.js';
1
+ export{a as THREE_BLOCKS_WEBPACK_LOADER,f as createEsbuildShaderPlugin,g as createRollupShaderPlugin,d as resolveShaderAdapterThreeVersion,e as transformThreeWebGPUModule,c as withThreeBlocksNext,b as withThreeBlocksWebpack}from'./chunk-OQLHTDDH.js';import'./chunk-GA7PGW2R.js';import'./chunk-EI7MMDWY.js';
@@ -1 +1 @@
1
- 'use strict';var chunkPY2ZLMZF_cjs=require('./chunk-PY2ZLMZF.cjs');function o(e){return chunkPY2ZLMZF_cjs.f(e,this.resourcePath,this.getOptions?.()??{})?.code??e}chunkPY2ZLMZF_cjs.a(o,"threeBlocksShaderLoader");module.exports=o;
1
+ 'use strict';var chunkTRHSN2DJ_cjs=require('./chunk-TRHSN2DJ.cjs');function o(e){return chunkTRHSN2DJ_cjs.f(e,this.resourcePath,this.getOptions?.()??{})?.code??e}chunkTRHSN2DJ_cjs.a(o,"threeBlocksShaderLoader");module.exports=o;
@@ -1,5 +1,5 @@
1
1
  import { ShaderBundlerTransformOptions } from './transform.js';
2
- import './shader-transform-DSFaVrux.js';
2
+ import './shader-transform-D160zMyt.js';
3
3
  import 'vite';
4
4
 
5
5
  interface WebpackShaderLoaderContext {
@@ -1 +1 @@
1
- import {e}from'./chunk-YLN3G2JS.js';import'./chunk-5X5NS5EW.js';import {a}from'./chunk-EI7MMDWY.js';function o(e$1){return e(e$1,this.resourcePath,this.getOptions?.()??{})?.code??e$1}a(o,"threeBlocksShaderLoader");export{o as default};
1
+ import {e}from'./chunk-OQLHTDDH.js';import'./chunk-GA7PGW2R.js';import {a}from'./chunk-EI7MMDWY.js';function o(e$1){return e(e$1,this.resourcePath,this.getOptions?.()??{})?.code??e$1}a(o,"threeBlocksShaderLoader");export{o as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@three-blocks/devtools",
3
- "version": "1.0.1-alpha.229.gb2f4ea7d182c",
3
+ "version": "2.0.0-alpha.238.g8723f0a28ca3",
4
4
  "description": "Three Blocks devtools command engine for npx three-blocks; the runtime lives in three-blocks/devtools and the Vite plugin",
5
5
  "keywords": [
6
6
  "three",
@@ -79,7 +79,7 @@
79
79
  "@types/three": "0.185.0",
80
80
  "create-vite": "9.1.1",
81
81
  "playwright": "^1.61.1",
82
- "three-blocks": "0.2.1-alpha.229.gb2f4ea7d182c",
82
+ "three-blocks": "0.3.0-alpha.238.g8723f0a28ca3",
83
83
  "tsup": "^8.0.0",
84
84
  "typescript": "^5.9.3",
85
85
  "vite": "^7.2.2",
@@ -91,7 +91,7 @@
91
91
  "peerDependencies": {
92
92
  "playwright": "^1.61.1",
93
93
  "three": ">=0.185.0 <0.186.0",
94
- "three-blocks": "0.2.1-alpha.229.gb2f4ea7d182c",
94
+ "three-blocks": "0.3.0-alpha.238.g8723f0a28ca3",
95
95
  "typescript": ">=5.9.3 <7.0.0",
96
96
  "vite": ">=7.2.2 <9.0.0"
97
97
  },