@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,14 +0,0 @@
1
- #!/usr/bin/env node
2
- import {b,e as e$2,a as a$3,d as d$1,c as c$2,j as j$1,i as i$1,f as f$2,h as h$2,g as g$1}from'./chunk-4M7M55NS.js';import {a as a$4}from'./chunk-ZT6T2W4B.js';import {e as e$1,f,b as b$1,h as h$1,g,c as c$3}from'./chunk-NEWSG5RX.js';import {a as a$2,c as c$1}from'./chunk-ZDNZCQUQ.js';import {j,a as a$1,c,d,k,h,e,i,f as f$1}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {realpath,readdir,readFile,lstat,mkdir,writeFile}from'fs/promises';import ve from'os';import P from'path';import {SHADER_ADDRESS_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_HYDRATION_SCHEMA_VERSION}from'three-blocks/shaders';import {createRequire}from'module';var Pe=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".wgsl",".glsl",".vert",".frag",".json",".css"],Ie=new Set(Pe),Be=/^(?:three-blocks\.shaders\.json|(?:precompile|three-blocks\.shaders)\.config\.(?:cjs|cts|js|mjs|mts|ts))$/u,gr=/(?:^|\/)scene\.(?:cjs|cts|js|jsx|mjs|mts|ts|tsx)$/u,Sr=/\b(?:export\s+)?(?:async\s+)?function\s+createScene\b|\bcreateScene\s*=\s*(?:async\s*)?\(/u,yr=/\b(?:[A-Za-z_$][\w$]*\.)*(?:shaders|shaderCache|sceneShaders)\s*\.\s*(?:material|pipeline|compute|container)\s*\(/u,wr=/\b(import|export)(?!\s*\()\s*(type\b\s*)?(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']/gu,vr=/\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,br=/\b(?:import|export)(?!\s*\()\s*(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']|\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,Er=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/u,Oe=4096,kr="./shaders";function Ye(e,r){let t=P.relative(e,r).split(P.sep).join("/");if(t.length===0||/[\u0000-\u001f\u007f]/u.test(t))throw new Error("Semantic input has an unsafe relative path.");return t}a(Ye,"portableRelativePath");function Ce(e,r){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new Error(`Shader-relevant source ${JSON.stringify(r)} is not valid UTF-8.`)}}a(Ce,"sourceText");function Ae(e,r){let t="",n="code";for(let i=0;i<e.length;i++){let s=e[i]??"",a=e[i+1]??"";if(n==="code"){if(s==="/"&&a==="/"){t+=" ",n="line-comment",i++;continue}if(s==="/"&&a==="*"){t+=" ",n="block-comment",i++;continue}if(s==="'"||s==='"'||s==="`"){n=s==="'"?"single":s==='"'?"double":"template",t+=r?s:" ";continue}t+=s;continue}if(n==="line-comment"){s===`
3
- `?(t+=`
4
- `,n="code"):t+=" ";continue}if(n==="block-comment"){s==="*"&&a==="/"?(t+=" ",n="code",i++):t+=s===`
5
- `?`
6
- `:" ";continue}let l=n==="single"?"'":n==="double"?'"':"`";if(s==="\\"&&a.length>0){t+=r?`${s}${a}`:" ",i++;continue}t+=r?s:s===`
7
- `?`
8
- `:" ",s===l&&(n="code");}return t}a(Ae,"lexicalSource");function Rr(e){let r=new Set,t=Ae(e,true);for(let n of t.matchAll(wr))n[2]===void 0&&n[3]!==void 0&&r.add(n[3]);for(let n of t.matchAll(vr))n[1]!==void 0&&r.add(n[1]);return [...r].sort()}a(Rr,"importSpecifiers");function xr(e){let r=new Set;for(let t of Ae(e,true).matchAll(br)){let n=t[1]??t[2];n!==void 0&&r.add(n);}return [...r].sort()}a(xr,"runtimeSpecifiers");function Xe(e){return (e.split(/[?#]/u,1)[0]??e).replaceAll("\\","/")}a(Xe,"cleanSpecifier");function Tr(e,r,t){let n=Xe(r),i;if(n.startsWith("./")||n.startsWith("../"))i=P.posix.normalize(P.posix.join(P.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=P.posix.extname(i).toLowerCase(),a=new Set([i]);if(s.length===0||!Ie.has(s)){for(let l of Pe)a.add(`${i}${l}`);for(let l of Pe)a.add(`${i}/index${l}`);}else if([".js",".mjs",".cjs",".jsx"].includes(s)){let l=i.slice(0,-s.length);for(let u of [".ts",".tsx",".mts",".cts"])a.add(`${l}${u}`);}return [...a].find(l=>t.has(l))}a(Tr,"resolveProjectImport");function $r(e,r){let t=Ae(r,false);return gr.test(e)||Sr.test(t)||yr.test(t)}a($r,"isShaderRoot");async function me(e,r){let t=await realpath(e);if(r!==void 0){let o={},h=0;for(let m of r){let b=await j(t,P.join(t,m),a$1.semanticInput,"Declared shader semantic input");if(h+=b.data.byteLength,h>a$1.semanticTotal)throw new Error("Declared shader semantic inputs exceed the total inspection size limit.");o[m]=c(b.data);}return o}let n=new Map,i=P.join(t,"src");if(await d(i))for(let o of await k(t,i,h=>Ie.has(P.extname(h).toLowerCase()))){let h=await j(t,o,a$1.semanticInput,"Shader semantic input");n.set(Ye(t,o),h.data);}for(let o of await readdir(t,{withFileTypes:true})){if(!o.isFile()||!Be.test(o.name)&&!Ie.has(P.extname(o.name).toLowerCase()))continue;let h=await j(t,P.join(t,o.name),a$1.semanticInput,Be.test(o.name)?"Shader configuration input":"Shader semantic input");n.set(o.name,h.data);}if(n.size>Oe)throw new Error(`Shader input discovery exceeds the ${Oe}-file limit.`);let s=new Set,a=new Map;for(let[o,h]of n){if(!o.includes("/")&&Be.test(o)&&s.add(o),!o.startsWith("src/"))continue;let m=Ce(h,o);a.set(o,m),$r(o,m)&&s.add(o);}if(s.size===0)throw new Error("No shader registration or scene source root was found.");let l=new Set,u=[...s].sort();for(;u.length>0;){let o=u.shift();if(o===void 0||l.has(o))continue;let h=n.get(o);if(h===void 0)continue;l.add(o);let m=a.get(o)??Ce(h,o);for(let b of Rr(m)){let x=Tr(o,b,n);x!==void 0&&!l.has(x)&&u.push(x);}u.sort();}let f=0,w={};for(let o of [...l].sort()){let h=n.get(o);if(h===void 0)throw new Error(`Shader input ${JSON.stringify(o)} disappeared during inspection.`);if(f+=h.byteLength,f>a$1.semanticTotal)throw new Error("Semantic shader inputs exceed the total inspection size limit.");w[o]=c(h);}return w}a(me,"snapshotShaderInputs");function je(e){if(typeof e=="string")return e;if(a$2(e))return je(e.import)??je(e.default)}a(je,"conditionalImportTarget");async function Ge(e,r){let t=e;for(;;){let n=P.join(t,"node_modules",...r.split("/"),"package.json");if(await d(n)){let s=await h(n,a$1.packageJson,`${r} package.json`),a=JSON.parse(s.data.toString("utf8"));if(!a$2(a)||a.name!==r||typeof a.version!="string"||!Er.test(a.version))throw new Error(`Installed ${r} package metadata is invalid.`);return {root:P.dirname(s.path),manifest:a}}let i=P.dirname(t);if(i===t)break;t=i;}throw new Error(`Cannot verify the installed ${r} package.`)}a(Ge,"findInstalledPackage");async function Mr(e$1,r){if(!a$2(r.exports))throw new Error("Installed three-blocks package has no public exports map.");let t=je(r.exports[kr]);if(t===void 0||!t.startsWith("./"))throw new Error("Installed three-blocks shader export has no import target.");let n=await realpath(e$1),i=[P.resolve(n,t)],s=new Map,a=0;for(;i.length>0;){let u=i.shift();if(u===void 0)break;let f=await h(u,a$1.semanticInput,"Three Blocks shader runtime module");if(!e(n,f.path)||f.path===n)throw new Error("Three Blocks shader runtime closure escapes its package.");let w=Ye(n,f.path);if(s.has(w))continue;if(a+=f.data.byteLength,a>a$1.semanticTotal)throw new Error("Three Blocks shader runtime closure exceeds the inspection limit.");s.set(w,c(f.data));let o=Ce(f.data,w);for(let h of xr(o)){let m=Xe(h);if(!m.startsWith("./")&&!m.startsWith("../"))continue;let b=P.resolve(P.dirname(f.path),m);if(!e(n,b))throw new Error("Three Blocks shader runtime import escapes its package.");i.push(b);}if(i.sort(),s.size+i.length>Oe)throw new Error("Three Blocks shader runtime closure exceeds the file limit.")}let l=[...s].sort((u,f)=>u[0].localeCompare(f[0])).map(([u,f])=>`${u}\0${f}`).join(`
9
- `);return c(l)}a(Mr,"shaderRuntimeClosure");async function se(e){let[r,t]=await Promise.all([Ge(e,"three"),Ge(e,"three-blocks")]);return {three:String(r.manifest.version),threeBlocks:String(t.manifest.version),threeBlocksShaderClosure:await Mr(t.root,t.manifest)}}a(se,"readInstalledShaderRuntime");var Ze=4096,Pr=createRequire(import.meta.url),Qe,R=new Proxy({},{get(e,r){return Qe??=Pr("typescript"),Reflect.get(Qe,r)}});function U(e){let r=e;for(;R.isParenthesizedExpression(r)||R.isAsExpression(r)||R.isSatisfiesExpression(r)||R.isNonNullExpression(r);)r=r.expression;return r}a(U,"unwrap");function Ir(e){if(R.isIdentifier(e)||R.isStringLiteral(e)||R.isNumericLiteral(e))return e.text}a(Ir,"propertyName");function pe(e,r){let t=new Map;for(let n of e.properties){if(!R.isPropertyAssignment(n))throw new Error(`${r} may contain only static property assignments.`);let i=Ir(n.name);if(i===void 0||t.has(i))throw new Error(`${r} contains a computed or duplicate property.`);t.set(i,n.initializer);}return t}a(pe,"properties");function ge(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=U(e);if(!R.isObjectLiteralExpression(t))throw new Error(`${r} must be a static object literal.`);return t}a(ge,"objectLiteral");function Se(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=U(e);if(!R.isStringLiteral(t)&&!R.isNoSubstitutionTemplateLiteral(t))throw new Error(`${r} must be a string literal.`);return t.text}a(Se,"stringLiteral");function ye(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=U(e);if(!R.isNumericLiteral(t))throw new Error(`${r} must be a numeric literal.`);return Number(t.text)}a(ye,"numericLiteral");function er(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=U(e);if(!R.isArrayLiteralExpression(t))throw new Error(`${r} must be a static array literal.`);return t.elements}a(er,"arrayLiteral");function Or(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=U(e);if(t.kind===R.SyntaxKind.NullKeyword)return null;if(!R.isNumericLiteral(t))throw new Error(`${r} must be null or a numeric literal.`);return Number(t.text)}a(Or,"numericOrNullLiteral");function Cr(e){return e.parseDiagnostics??[]}a(Cr,"parseDiagnostics");function rr(e,r,t,n){let i=R.createSourceFile(r,e,R.ScriptTarget.Latest,true,R.ScriptKind.TS),s=Cr(i);if(s.length>0)throw new Error(`Shader manifest is not valid TypeScript: ${R.flattenDiagnosticMessageText(s[0]?.messageText??"parse error"," ")}`);let a$1=i.statements.filter(R.isExportAssignment).filter(m=>!m.isExportEquals);if(a$1.length!==1)throw new Error("Shader manifest must contain exactly one default export.");let l=pe(ge(a$1[0]?.expression,"Shader manifest default export"),"Shader manifest"),u=l.get("version");if(u===void 0||!R.isNumericLiteral(U(u))||Number(U(u).getText(i))!==3)throw new Error("Shader manifest version must be the numeric literal 3.");if(Se(l.get("scene"),"Shader manifest scene")!==t)throw new Error(`Shader manifest scene does not match "${t}".`);if(n){if(Se(l.get("three"),"Shader manifest Three.js version")!==n.three||Se(l.get("threeBlocks"),"Shader manifest Three Blocks version")!==n.threeBlocks)throw new Error("Shader manifest runtime versions do not match its receipt.");let m=pe(ge(l.get("runtime"),"Shader manifest runtime"),"Shader manifest runtime");if(Se(m.get("id"),"Shader manifest runtime id")!==n.compatibility||ye(m.get("address"),"Shader manifest address schema")!==n.address||ye(m.get("recipe"),"Shader manifest recipe schema")!==n.recipe||ye(m.get("hydration"),"Shader manifest hydration schema")!==n.hydration)throw new Error("Shader manifest runtime compatibility schemas do not match its receipt.")}let f=pe(ge(l.get("entries"),"Shader manifest entries"),"Shader manifest entries");if(f.size===0||f.size>Ze)throw new Error(`Shader manifest must contain between 1 and ${Ze} entries.`);let w=er(l.get("modules"),"Shader manifest modules").map((m,b)=>{let x=U(m);if(!R.isStringLiteral(x)&&!R.isNoSubstitutionTemplateLiteral(x))throw new Error(`Shader manifest module ${b} must be a WGSL string literal.`);if(x.text.length===0)throw new Error(`Shader manifest module ${b} is empty.`);return x.text}),o=er(l.get("states"),"Shader manifest states").map((m,b)=>{let x=pe(ge(m,`Shader manifest state ${b}`),`Shader manifest state ${b}`),E=a(($,I)=>{let L=Or(x.get($),`Shader manifest state ${b} ${$}`);if(L===null)return false;let p=w[L];if(p===void 0||!p.includes(I))throw new Error(`Shader manifest state ${b} ${$} does not reference a ${I} module.`);return true},"moduleAt"),O=E("vertex","@vertex"),C=E("fragment","@fragment"),A=E("compute","@compute");if(A&&(O||C))throw new Error(`Shader manifest state ${b} mixes render and compute stages.`);if(!A&&!O&&!C)throw new Error(`Shader manifest state ${b} contains no shader stage.`);return {vertex:O,fragment:C,compute:A}}),h={render:0,vertex:0,fragment:0,compute:0};for(let[m,b]of f){if(m.length===0||/[\u0000-\u001f\u007f]/.test(m))throw new Error("Shader manifest contains an invalid entry key.");let x=ye(b,`Shader manifest entry "${m}"`),E=o[x];if(E===void 0)throw new Error(`Shader manifest entry "${m}" references an absent state.`);(E.vertex||E.fragment)&&(h.render+=1),E.vertex&&(h.vertex+=1),E.fragment&&(h.fragment+=1),E.compute&&(h.compute+=1);}return h}a(rr,"inspectPrecompiledManifest");function jr(e,r){return e.render===r.render&&e.vertex===r.vertex&&e.fragment===r.fragment&&e.compute===r.compute}a(jr,"sameCoverage");function Ar(e){let r=e.some(n=>n.state==="invalid")?"invalid":e.some(n=>n.state==="missing")?"missing":e.some(n=>n.state==="stale")?"stale":"fresh",t=e.filter(n=>n.state===r);return {state:r,reason:r==="fresh"?`${e.length} configured shader scene${e.length===1?" is":"s are"} fresh.`:t.map(n=>`${n.scene}: ${n.reason}`).join("; ")}}a(Ar,"classifyMatrix");function Dr(e,r){let t=e.tool;if(!t)return "Shader receipt has no public tool compatibility metadata.";if(t.compatibility!==r)return "Shader receipt targets a different runtime compatibility contract.";if(t.transform!==b)return "Shader receipt uses a different provider transform version.";if(t.address!==SHADER_ADDRESS_SCHEMA_VERSION||t.recipe!==SHADER_RECIPE_SCHEMA_VERSION||t.hydration!==SHADER_HYDRATION_SCHEMA_VERSION)return "Shader receipt uses incompatible address, recipe, or hydration schemas."}a(Dr,"exactToolCompatibility");function _r(e,r){let t=Object.keys(r).filter(s=>Object.hasOwn(e,s)&&e[s]!==r[s]),n=Object.keys(r).filter(s=>!Object.hasOwn(e,s)),i=Object.keys(e).filter(s=>!Object.hasOwn(r,s));return {...t.length>0?{changedInputs:t}:{},...n.length>0?{addedInputs:n}:{},...i.length>0?{removedInputs:i}:{}}}a(_r,"inputChanges");async function we(e=process.cwd(),r){let t=await e$1(e),n=await f(t),i$1=P.join(t,b$1),s=a(()=>({schemaVersion:1,root:t,state:"missing",reason:`${b$1}/meta.json is absent.`,scenes:n.scenes.map(a=>({scene:a.key,state:"missing",reason:"No committed shader receipt."}))}),"missing");if(!await d(i$1)||!await d(P.join(i$1,"meta.json")))return s();try{let a=await i(t,i$1,"Shader artifact directory"),l=await j(a,P.join(a,"meta.json"),a$1.receipt,"Shader receipt"),u=c$1(JSON.parse(l.data.toString("utf8"))),f=await e$2(a,l.data),w=r??await se(t),o=a$3(w.three),h=new Set(n.scenes.map(p=>p.key)),b=Object.keys(u.scenes).filter(p=>!h.has(p));if(b.length>0)throw new Error(`Shader receipt contains unconfigured scenes: ${b.join(", ")}.`);let x=Dr(u,o);if(x)throw new Error(x);let E=u.runtime.three!==w.three||u.runtime.threeBlocks!==w.threeBlocks,O=u.runtime.threeBlocksShaderClosure!==w.threeBlocksShaderClosure,C=u.tool?.version!==a$4,A=P.join(t,n.publicDir??"public"),$=[];for(let p of n.scenes){let c$1=u.scenes[p.key];if(!c$1){$.push({scene:p.key,state:"missing",reason:"Scene is absent from the complete receipt matrix."});continue}let M=await j(a,P.join(a,c$1.artifact),a$1.manifest,"Shader manifest");if(c(M.data)!==c$1.artifactHash)throw new Error(`Shader artifact checksum differs for scene "${p.key}".`);if(c$1.asset!==void 0&&c$1.assetHash!==void 0){let N=await j(A,P.join(A,c$1.asset),a$1.manifest,"Static shader manifest");if(c(N.data)!==c$1.assetHash)throw new Error(`Static shader manifest checksum differs for scene "${p.key}".`)}if(c$1.bytes!==void 0&&c$1.bytes!==M.data.byteLength)throw new Error(`Shader artifact byte count differs for scene "${p.key}".`);let S=rr(M.data.toString("utf8"),M.path,p.key,{three:u.runtime.three,threeBlocks:u.runtime.threeBlocks,compatibility:o,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION});if(!jr(S,c$1.coverage))throw new Error(`Shader coverage differs for scene "${p.key}".`);if(!n.allowLiveBuilds&&c$1.skipped&&c$1.skipped.render+c$1.skipped.compute>0)throw new Error(`Scene "${p.key}" contains skipped live builds but allowLiveBuilds is false.`);let j$1=await me(t,p.inputs),v=_r(c$1.inputs,j$1),g=(v.changedInputs?.length??0)+(v.addedInputs?.length??0)+(v.removedInputs?.length??0),y=E||O||C||g>0,T=f?.scenes[p.key],F=T===void 0||f===void 0?void 0:{...T,schemaVersion:f.schemaVersion,measuredAt:f.measuredAt,source:f.source,...f.source==="committed-capture"?{adapter:f.adapter,platform:f.platform}:{}};$.push({scene:p.key,state:y?"stale":"fresh",reason:E?"Installed runtime versions differ from the receipt.":O?"Installed three-blocks/shaders runtime closure differs from the receipt.":C?`Receipt was generated by @three-blocks/devtools ${u.tool?.version??"unknown"}.`:g>0?`${g} semantic shader input${g===1?"":"s"} changed.`:"Manifest, runtime, schemas, transform, and semantic inputs match.",coverage:S,...!y&&F!==void 0&&F.builds===S.render+S.compute?{timing:F}:{},...v});}let I=Ar($),L=I.state==="fresh"&&f!==void 0&&$.every(p=>p.timing!==void 0)?f:void 0;return {schemaVersion:1,root:t,...I,scenes:$,runtime:w,receipt:u,...L===void 0?{}:{timing:L}}}catch(a){let l=a instanceof Error?a.message:String(a);return {schemaVersion:1,root:t,state:"invalid",reason:l,scenes:n.scenes.map(u=>({scene:u.key,state:"invalid",reason:l}))}}}a(we,"inspectShaderMatrix");var dr=".three-blocks/shaders/pending-capture";function Nr(e){return (e instanceof Error?`${e.name}: ${e.message}`:String(e)).includes("ShaderHydrationError:")}a(Nr,"isShaderHydrationFailure");async function Vr(e,r,t){if(r.length===0)return;let n=P.join(e,b$1,"meta.json"),i=await readFile(n);if(c(i)!==c(t))throw new Error("Shader receipt changed before failed scenes could be marked for recapture.");let s=c$1(JSON.parse(i.toString("utf8"))),a=c(t),l=new Set(r),u=c$1({...s,scenes:Object.fromEntries(Object.entries(s.scenes).map(([f,w])=>[f,l.has(f)?{...w,inputs:{...w.inputs,[dr]:a}}:w]))});await f$1(n,`${d$1(u)}
10
- `);}a(Vr,"markShaderScenesForRecapture");function Hr(e,r){return d$1(e)===d$1(r)}a(Hr,"equalSnapshot");async function Rt(e={}){let r=e.root?await realpath(e.root):await e$1(e.start),t=e.config===void 0?await h$1(r):void 0,n=e.config??t?.config??await f(r),i=e.runtime??await se(r),s=n.scenes,a$1,l={},u;if(e.ifStale){let S=await we(r,i);if(S.state==="fresh"&&S.scenes.every(j=>j.timing!==void 0))return {schemaVersion:1,root:r,skipped:true,reason:S.reason,scenes:[]};if(S.state!=="invalid"&&S.receipt!==void 0){let j=S.state==="fresh";s=n.scenes.filter(v=>{let g=S.scenes.find(y=>y.scene===v.key);return g?.state!=="fresh"||j&&g.timing===void 0}),a$1=S.receipt;for(let v of S.scenes){if(v.state!=="fresh"||v.timing===void 0)continue;let{builds:g,liveBuildMs:y,precompiledBuildMs:T,avoidedBuildMs:F,runs:N,spreadMs:q}=v.timing;l[v.scene]={builds:g,liveBuildMs:y,precompiledBuildMs:T,avoidedBuildMs:F,runs:N,spreadMs:q},v.timing.source==="committed-capture"&&v.timing.adapter!==void 0&&v.timing.platform!==void 0&&(u={adapter:v.timing.adapter,platform:v.timing.platform});}}}let f$1=performance.now(),w=a$1!==void 0&&(a$1.runtime.three!==i.three||a$1.runtime.threeBlocks!==i.threeBlocks||a$1.runtime.threeBlocksShaderClosure!==i.threeBlocksShaderClosure||a$1.tool?.version!==a$4)?c(d$1({runtime:a$1.runtime,tool:a$1.tool})):void 0,o=a(async()=>new Map(await Promise.all(n.scenes.map(async S=>[S.key,await me(r,S.inputs)]))),"snapshotInputs"),h=await o(),m=a(async()=>{let S=await o();for(let j of n.scenes){let v=h.get(j.key),g=S.get(j.key);if(v===void 0||g===void 0||!Hr(v,g))throw new Error(`Semantic shader inputs changed during capture for scene "${j.key}"; the current scene was not committed.`)}},"assertInputsUnchanged"),b=e.driver===void 0,x=e.driver===void 0&&e.driverKind===void 0&&e.serve===void 0&&e.url===void 0?await g(r):void 0,E=e.serve??x?.serve,O=e.driverKind??x?.driverKind??(E===void 0?"vite":"static");if(e.url!==void 0&&(e.serve!==void 0||e.driverKind!==void 0))throw new Error("--url cannot be combined with --driver or --serve.");if(O==="vite"&&E!==void 0)throw new Error("--serve requires the static shader driver.");if(O==="static"&&E===void 0&&e.driver===void 0)throw new Error("The static shader driver requires --serve <built-directory>.");let C=e.driver===void 0?await import('./shader-browser-FSCRBXJ7.js'):void 0,A=e.driver??(e.url!==void 0?C.createAttachedPlaywrightShaderDriver({root:r,runtime:i,url:e.url,...e.headed!==void 0?{headed:e.headed}:{}}):O==="static"?C.createStaticPlaywrightShaderDriver({root:r,runtime:i,serve:E,...e.headed!==void 0?{headed:e.headed}:{}}):C.createPlaywrightShaderDriver({root:r,runtime:i,...e.headed!==void 0?{headed:e.headed}:{}})),$=new Map,I=[],L=a$1!==void 0&&n.scenes.every(S=>a$1?.scenes[S.key]!==void 0),p=a$1,c$1,M=e.attempts??2;if(!Number.isSafeInteger(M)||M<1||M>5)throw new Error("Shader capture attempts must be an integer in 1...5.");try{for(let[g,y]of s.entries()){e.onSceneStart?.(y.key,g,s.length);let T,F,N=0;for(;N<M;N++)try{if(T=c$2(await A.capture(y,n),{scene:y.key,runtime:i}),T.skipped.length>0&&!n.allowLiveBuilds)throw new Error(`Scene "${y.key}" contains ${T.skipped.length} unregistered live shader build${T.skipped.length===1?"":"s"} while allowLiveBuilds is false.`);break}catch(q){F=q,T=void 0,N+1<M&&e.onSceneRetry?.(y.key,N+2,M,n.timeoutMs,q);}if(!T)throw new Error(`Shader capture "${y.key}" failed after ${M} attempts: ${F instanceof Error?F.message:String(F)}`);if($.set(y.key,T),I.push({scene:y.key,attempts:N+1,coverage:T.coverage,skipped:T.skipped.length,startupBuilds:T.stats.registeredBuilds,startupBuildMs:T.stats.buildMs,...T.timing===void 0?{}:{timing:T.timing}}),L&&p!==void 0){await m();let q=new Map(n.scenes.map(W=>{let re=W.key===y.key?h.get(W.key):p?.scenes[W.key]?.inputs;if(re===void 0)throw new Error(`Shader checkpoint is missing scene "${W.key}".`);return w!==void 0&&!$.has(W.key)&&(re={...re,[dr]:w}),[W.key,re]}));c$1=await j$1({root:r,scenes:n.scenes,captures:new Map([[y.key,T]]),runtime:i,inputs:q,previousReceipt:p,publicDirectory:n.publicDir??"public"}),p=c$1.receipt;}}await m(),c$1??=await j$1({root:r,scenes:n.scenes,captures:$,runtime:i,inputs:h,...a$1===void 0?{}:{previousReceipt:a$1},publicDirectory:n.publicDir??"public"});let S={...l};for(let g of I)S[g.scene]={builds:g.coverage.render+g.coverage.compute,setupMeasured:!1,liveBuildMs:g.startupBuildMs,precompiledBuildMs:0,avoidedBuildMs:g.startupBuildMs,runs:1,spreadMs:0};if(e.commitTiming===!0){let g=u??{adapter:$.values().next().value?.provenance?.adapter??"WebGPU adapter",platform:`${ve.platform()}/${ve.arch()}`};await i$1(r,S,await(A.timingEnvironment?.()??g));}else await f$2(r,S);let j=await readFile(P.join(c$1.directory,"meta.json")),v=await e$2(c$1.directory,j);return {schemaVersion:1,root:r,skipped:!1,reason:`Wrote ${I.length} shader scene${I.length===1?"":"s"}.`,durationMs:performance.now()-f$1,scenes:I,measurement:{beforeBuilds:I.reduce((g,y)=>g+y.startupBuilds,0),afterBuilds:0,firstFrameDeltaMs:-I.reduce((g,y)=>g+y.startupBuildMs,0),source:"capture-build-phase"},...t===void 0?{}:{configuration:{created:t.created,file:t.file}},written:c$1,...v===void 0?{}:{timing:v}}}finally{b&&await A.close();}}a(Rt,"captureShaders");function Wr(e){return ["workerReady","assetsReady",...e.requiresText?["textReady"]:[],"compileEnd","firstFrame"]}a(Wr,"requiredReadiness");function ar(e){if(e.length===0)throw new Error("Cannot take the median of an empty shader timing capture.");let r=[...e].sort((s,a)=>s-a),t=Math.floor(r.length/2),n=r[t];if(n===void 0)throw new Error("Shader timing median is unavailable.");if(r.length%2===1)return n;let i=r[t-1];if(i===void 0)throw new Error("Shader timing median pair is unavailable.");return (i+n)/2}a(ar,"median");function De(e,r,t,n){if(e.scene!==r.key||e.mode!==t)throw new Error(`Browser observation identity differs for scene "${r.key}".`);if(e.compatibility!==n||e.transform!==b)throw new Error(`Browser observation compatibility differs for scene "${r.key}".`);let i=Wr(r).filter(s=>e.readiness[s]!==true);if(i.length>0)throw new Error(`Scene "${r.key}" ${t} observation is missing readiness bits: ${i.join(", ")}.`);if(e.errors.length>0)throw new Error(`Scene "${r.key}" ${t} browser errors:
11
- - ${e.errors.join(`
12
- - `)}`)}a(De,"assertObservation");function Kr(e,r,t,n){if(r.render>0&&t.stats.registeredRenderBuilds===0)throw new Error(`Scene "${e.key}" live baseline exercised no registered render pipeline.`);if(r.compute>0&&t.stats.registeredComputeBuilds===0)throw new Error(`Scene "${e.key}" live baseline exercised no registered compute kernel.`);cr(e,r,n);}a(Kr,"assertZeroBuild");function cr(e,r,t){if(t.stats.registeredRenderBuilds!==0||t.stats.registeredComputeBuilds!==0){let n=t.stats.missedKeys??[];throw new Error(`Scene "${e.key}" injected path performed ${t.stats.registeredRenderBuilds} render and ${t.stats.registeredComputeBuilds} compute registered live builds.`+(n.length>0?` Missed keys: ${n.join(", ")}.`:""))}if(r.render>0&&t.stats.injectedRender===0)throw new Error(`Scene "${e.key}" injected no render entries.`);if(r.compute>0&&t.stats.injectedCompute===0)throw new Error(`Scene "${e.key}" injected no compute entries.`);if(t.stats.missed!==0||t.stats.missedRender!==0||t.stats.missedCompute!==0)throw new Error(`Scene "${e.key}" injected path reported shader manifest misses.`)}a(cr,"assertPrecompiledZeroBuild");async function zr(e,r,t,n,i){let s=P.join(e,c$3);if(await d(s)){let l=await lstat(s);if(l.isSymbolicLink()||!l.isDirectory())throw new Error("Shader parity artifact directory is not a real directory.")}else await mkdir(s,{recursive:true});let a=[`${r}.live.png`,`${r}.precompiled.png`,`${r}.diff.png`];return await Promise.all([t,n,i].map(async(l,u)=>{let f=a[u];if(f===void 0)throw new Error("Parity artifact mapping failed.");let w=P.join(s,f);if(await d(w)){let o=await lstat(w);if(o.isSymbolicLink()||!o.isFile())throw new Error(`Shader parity target is not a regular file: ${f}.`)}await writeFile(w,l,{mode:384});})),a.map(l=>`${c$3}/${l}`)}a(zr,"writeParityFailure");async function xt(e={}){let r=e.root?await realpath(e.root):await e$1(e.start),t=e.runtime??await se(r),n=a$3(t.three),i=await we(r,t);if(i.state!=="fresh")throw new Error(`Shader no-GPU validation is ${i.state}: ${i.reason}`);if(e.skipBrowser)return {schemaVersion:1,root:r,noGpu:i,browser:"skipped",scenes:[]};if(e.parityOnly===true&&e.commitTiming===true)throw new Error("Parity-only shader verification cannot commit timing.");let s=e.runs??5;if(!Number.isSafeInteger(s)||s<1||s>100)throw new Error("Shader timing runs must be an integer in 1...100.");let a$1=e.config??await f(r),l=await readFile(P.join(r,b$1,"meta.json")),u=c$1(JSON.parse(l.toString("utf8")));if(i.receipt===void 0||d$1(u)!==d$1(i.receipt))throw new Error("Shader receipt changed after no-GPU validation; restart browser parity verification.");let f$1=e.driver===void 0,w=e.driver===void 0&&e.driverKind===void 0&&e.serve===void 0&&e.url===void 0?await g(r):void 0,o=e.serve??w?.serve,h=e.driverKind??w?.driverKind??(o===void 0?"vite":"static");if(e.url!==void 0&&(e.serve!==void 0||e.driverKind!==void 0))throw new Error("--url cannot be combined with --driver or --serve.");if(h==="vite"&&o!==void 0)throw new Error("--serve requires the static shader driver.");if(h==="static"&&o===void 0&&e.driver===void 0)throw new Error("The static shader driver requires --serve <built-directory>.");let m=e.driver===void 0?await import('./shader-browser-FSCRBXJ7.js'):void 0,{compareShaderScreenshots:b}=await import('./shader-parity-XPKQQK26.js'),x=a(()=>e.url!==void 0?m.createAttachedPlaywrightShaderDriver({root:r,runtime:t,url:e.url,...e.headed!==void 0?{headed:e.headed}:{}}):h==="static"?m.createStaticPlaywrightShaderDriver({root:r,runtime:t,serve:o,...e.headed!==void 0?{headed:e.headed}:{}}):m.createPlaywrightShaderDriver({root:r,runtime:t,...e.headed!==void 0?{headed:e.headed}:{}}),"createDriver"),E=e.driver??x(),O=e.driver??x();await h$2(r,a$1.scenes.map(L=>L.key),l);let C=[],A={},$=[],I=new Set;try{for(let[p,c]of a$1.scenes.entries()){e.onSceneStart?.(c.key,p,a$1.scenes.length);let M=i.scenes.find(B=>B.scene===c.key);if(!M?.coverage)throw new Error(`Fresh receipt has no coverage for scene "${c.key}".`);let S=M.coverage,j=a(async B=>{let te=B?"live":"precompiled",G=B?"precompiled":"live",Y=B?E:O,oe=B?O:E,K=await Y.observe(c,te,a$1),de=await oe.observe(c,G,a$1,K.frame),k=K.mode==="live"?K:de,X=K.mode==="precompiled"?K:de;De(k,c,"live",n),De(X,c,"precompiled",n),Kr(c,S,k,X);let Fe=a(async(fr,Le,Ne)=>{let V=b(Le,Ne,a$1.parity.channelTolerance,c.maxDiffRatio??a$1.parity.maxDiffRatio);if(V.matches)return V;let hr=await zr(r,c.key,Le,Ne,V.diff),mr=V.nonBlack?`${V.differentPixels}/${V.totalPixels} pixels differ (${(V.diffRatio*100).toFixed(3)}%).`:`rendered output is black (live=${V.baselineLuminance.toFixed(4)}, precompiled=${V.precompiledLuminance.toFixed(4)}).`;throw new Error(`Shader ${fr} parity failed for scene "${c.key}" at completed frames live=${k.frame}, precompiled=${X.frame}: ${mr} Artifacts: ${hr.join(", ")}`)},"compare");await Fe("first frame",k.firstFrameScreenshot,X.firstFrameScreenshot);let ur=await Fe("settled",k.screenshot,X.screenshot);return {live:k,precompiled:X,parity:ur}},"observePair"),v,g,y;if(e.parityOnly===!0)try{v=await j(!0);}catch(B){Nr(B)&&I.add(c.key),$.push({scene:c.key,error:B}),e.onSceneError?.(c.key,B);continue}else {await j(!0);let B=[];for(let k=0;k<s;k++)B.push(await j(k%2===0));let te=B[B.length-1];if(te===void 0)throw new Error(`Shader timing produced no runs for scene "${c.key}".`);if(v=te,g=await O.observePublished(c,a$1),De(g,c,"precompiled",n),cr(c,S,g),y=c.runtimeMotion?b(g.beforeScreenshot,g.screenshot,a$1.parity.channelTolerance,1):void 0,y&&y.diffRatio<1e-4)throw new Error(`Published scene "${c.key}" stopped animating during its normal 120-frame soak (changed ${y.differentPixels}/${y.totalPixels} canvas pixels).`);let G=a(k=>k.stats.buildMs+(k.stats.precompiledSetupMs??0)+(k.stats.hydrationMs??0),"observedNodeBuilderMs"),Y=ar(B.map(k=>G(k.live))),oe=ar(B.map(k=>G(k.precompiled))),K=Math.max(0,Y-oe),de=B.map(k=>Math.max(0,G(k.live)-G(k.precompiled)));A[c.key]={builds:S.render+S.compute,setupMeasured:!0,liveBuildMs:Y,precompiledBuildMs:oe,avoidedBuildMs:K,runs:s,spreadMs:Math.max(...de.map(k=>Math.abs(k-K)))};}let{diff:T,...F}=v.parity,{firstFrameScreenshot:N,screenshot:q,...W}=v.live,{firstFrameScreenshot:re,screenshot:Ur,...lr}=v.precompiled,be;if(g!==void 0){let{beforeScreenshot:B,firstFrameScreenshot:te,screenshot:G,...Y}=g;be=Y;}C.push({scene:c.key,coverage:S,live:W,precompiled:lr,...be===void 0?{}:{published:be},parity:F,...y===void 0?{}:{runtimeMotion:{differentPixels:y.differentPixels,totalPixels:y.totalPixels,diffRatio:y.diffRatio}}}),await g$1(r,[c.key],l);}if(e.parityOnly===!0){if(await Vr(r,[...I],l),$.length>0)throw new Error(`Shader parity failed for ${$.length}/${a$1.scenes.length} scene(s):
13
- `+$.map(p=>{let c=p.error instanceof Error?p.error.message:String(p.error);return ` - ${p.scene}: ${c}`}).join(`
14
- `));return {schemaVersion:1,root:r,noGpu:i,browser:"passed",scenes:C}}if(e.commitTiming===!0){let p={adapter:"WebGPU adapter",platform:`${ve.platform()}/${ve.arch()}`},c=await(E.timingEnvironment?.()??p),M=await i$1(r,A,c);return {schemaVersion:1,root:r,noGpu:i,browser:"passed",scenes:C,timing:M.local,committedTiming:M.committed}}let L=await f$2(r,A);return {schemaVersion:1,root:r,noGpu:i,browser:"passed",scenes:C,timing:L}}finally{f$1&&(await O.close(),await E.close());}}a(xt,"testShaders");export{rr as a,me as b,se as c,we as d,Rt as e,xt as f};
@@ -1 +0,0 @@
1
- 'use strict';var fs=require('fs'),module$1=require('module'),d=require('path'),shaders=require('three-blocks/shaders'),vite=require('three-blocks/vite');require('fs/promises'),require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var d__default=/*#__PURE__*/_interopDefault(d);var x=Object.defineProperty;var i=(e,r)=>x(e,"name",{value:r,configurable:true});function y(e){let r=e.split("?",1)[0];return r===void 0?false:r.split(d__default.default.sep).join("/").endsWith("/build/three.webgpu.js")}i(y,"isThreeWebGPUModule");function O(e){let r=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/u.exec(e);return r?.[1]==="0"&&r[2]==="185"}i(O,"supportedVersion");function m(e,r,t={}){if(!O(r))throw new Error(`Shader provider transform ${shaders.THREE_WEBGPU_R185_COMPATIBILITY} supports Three.js 0.185.x; received "${r}".`);let n=vite.transformThreeWebgpuProviderHooks(e,{threeVersion:r,...t.threeRevision===void 0?{}:{threeRevision:t.threeRevision},id:"three/build/three.webgpu.js"}),s=n.state==="already-applied",o=n.code;return t.instrumentCapture&&(o=vite.transformThreeWebgpuCaptureInstrumentation(o,{...t.captureRuntimeImport===void 0?{}:{runtimeImport:t.captureRuntimeImport}}).code),{code:o,alreadyPresent:s,captureApplied:t.instrumentCapture===true}}i(m,"applyShaderProviderTransform");var g="@three-blocks/devtools/webpack-loader";function S(e){if(typeof e=="string")return e===g;if(Array.isArray(e))return e.some(S);if(e===null||typeof e!="object")return false;let r=e;return r.loader===g||S(r.use)}i(S,"webpackRuleUsesShaderLoader");function E(e){let r=w(process.cwd()),t=i(s=>T(r,s),"exact"),n={...e.resolve?.alias,...t("three")===void 0?{}:{three$:t("three")},...t("three/webgpu")===void 0?{}:{"three/webgpu$":t("three/webgpu")},...t("three/tsl")===void 0?{}:{"three/tsl$":t("three/tsl")},"three/addons":d__default.default.join(r.root,"examples/jsm"),"three/examples/jsm":d__default.default.join(r.root,"examples/jsm")};return {...e,resolve:{...e.resolve,alias:n}}}i(E,"withTargetThreeAliases");function k(e){let r=E(e),t=r.module?.rules??[];return t.some(S)?r:{...r,module:{...r.module,rules:[...t,{enforce:"pre",test:/three[\\/]build[\\/]three\.webgpu\.js$/u,use:[{loader:g}]}]}}}i(k,"withShaderWebpackRule");function wr(e){return k(e)}i(wr,"withThreeBlocksWebpack");function br(e){let t=e.webpack;return {...e,webpack(n,...s){let o=t?.call(this,n,...s)??n,a=s[0];return a!==null&&typeof a=="object"&&Reflect.get(a,"isServer")===true?E(o):k(o)}}}i(br,"withThreeBlocksNext");function w(e){let r;try{r=module$1.createRequire(d__default.default.join(d__default.default.resolve(e),"package.json")).resolve("three");}catch(o){throw new Error("The shader adapter could not resolve Three.js from the target project.",{cause:o})}let t=d__default.default.dirname(r),n,s;for(;;){let o=d__default.default.join(t,"package.json");if(fs.existsSync(o)){let c=JSON.parse(fs.readFileSync(o,"utf8"));if(c.name==="three"){n=o,s=c;break}}let a=d__default.default.dirname(t);if(a===t)break;t=a;}if(n===void 0)throw new Error(`The shader adapter could not locate Three.js package metadata from ${r}.`);if(typeof s?.version!="string"||s.version.length===0)throw new Error(`The resolved Three.js package has no version: ${n}`);return {root:d__default.default.dirname(n),version:s.version,exports:s.exports}}i(w,"resolveThreePackage");function F(e=process.cwd()){return w(e).version}i(F,"resolveShaderAdapterThreeVersion");function R(e){return {version:e.threeVersion??F(e.root),capture:e.capture??process.env.THREE_BLOCKS_SHADER_TOOL==="1"}}i(R,"resolvedOptions");function Er(e,r,t={}){if(!y(r))return null;let n=R(t);return m(e,n.version,{instrumentCapture:n.capture})}i(Er,"transformThreeWebGPUModule");function h(e){if(typeof e=="string")return e;if(Array.isArray(e)){for(let t of e){let n=h(t);if(n!==void 0)return n}return}if(e===null||typeof e!="object")return;let r=e;for(let t of ["browser","import","default"]){let n=h(r[t]);if(n!==void 0)return n}}i(h,"exportTarget");function T(e,r){if(e.exports===null||typeof e.exports!="object")return;let t=e.exports,n=r==="three"?".":`./${r.slice(6)}`,s=h(t[n]);if(s!==void 0)return d__default.default.resolve(e.root,s);for(let[o,a]of Object.entries(t)){let c=o.indexOf("*");if(c<0)continue;let u=o.slice(0,c),l=o.slice(c+1);if(!n.startsWith(u)||!n.endsWith(l))continue;let p=n.slice(u.length,n.length-l.length),f=h(a);if(f!==void 0)return d__default.default.resolve(e.root,f.replaceAll("*",p))}}i(T,"resolveThreeExport");function kr(e={}){let r=e.root??process.cwd(),t=w(r),n={version:e.threeVersion??t.version,capture:e.capture??process.env.THREE_BLOCKS_SHADER_TOOL==="1"};return {name:"three-blocks-shader-provider",setup(s){s.onResolve?.({filter:/^three(?:\/.*)?$/},o=>{let a=T(t,o.path);return a===void 0?void 0:{path:a}}),s.onLoad({filter:/three[\\/]build[\\/]three\.webgpu\.js$/},async o=>{let a=await new Promise((u,l)=>{fs.readFile(o.path,"utf8",(p,f)=>{p?l(p):u(f);});});return {contents:m(a,n.version,{instrumentCapture:n.capture}).code,loader:"js"}});}}}i(kr,"createEsbuildShaderPlugin");function Rr(e={}){let r=R(e);return {name:"three-blocks-shader-provider",enforce:"pre",transform(t,n){return y(n)?{code:m(t,r.version,{instrumentCapture:r.capture}).code,map:null}:null}}}i(Rr,"createRollupShaderPlugin");exports.a=i;exports.b=g;exports.c=wr;exports.d=br;exports.e=F;exports.f=Er;exports.g=kr;exports.h=Rr;
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {a as a$1}from'./chunk-HOZDD6PW.js';var i=/^[a-f0-9]{64}$/,p=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/,h=/^[a-z0-9][a-z0-9_-]{0,63}$/,f=/^[0-9A-Za-z][0-9A-Za-z._/-]{0,127}$/;function o(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}a$1(o,"isRecord");function a(e){return typeof e=="string"&&p.test(e)}a$1(a,"isSafeVersion");function d(e){if(e.length===0||e.length>512||e.includes("\\")||/[\u0000-\u001f\u007f]/.test(e))return false;let n=e.split("/");return !e.startsWith("/")&&n.every(t=>t.length>0&&t!=="."&&t!=="..")}a$1(d,"isSafeRelativePath");function m(e){if(!o(e)||e.schemaVersion!==2)throw new Error("three-blocks.json must use schemaVersion 2.");if(typeof e.template!="string"||!h.test(e.template))throw new Error("three-blocks.json has an invalid default shader scene key.");if(!Array.isArray(e.layers)||!e.layers.every(n=>typeof n=="string"&&f.test(n))||new Set(e.layers).size!==e.layers.length)throw new Error("three-blocks.json has invalid layers.");if(e.generator!==void 0&&(!o(e.generator)||typeof e.generator.name!="string"||!f.test(e.generator.name)||!a(e.generator.version)))throw new Error("three-blocks.json has invalid generator metadata.");if(!o(e.runtime)||!a(e.runtime.three)||!a(e.runtime.threeBlocks))throw new Error("three-blocks.json has invalid runtime versions.");if(!o(e.features)||typeof e.features.text!="boolean")throw new Error("three-blocks.json has invalid feature metadata.");if(!o(e.protocol)||e.protocol.resultFile!==1)throw new Error("three-blocks.json has an unsupported protocol schema.");if(e.artifacts!==void 0){if(!o(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$1(m,"parseProjectMetadata");function y(e){if(!o(e))throw new Error("Shader coverage is missing.");for(let n of ["render","vertex","fragment","compute"])if(typeof e[n]!="number"||!Number.isSafeInteger(e[n])||e[n]<0)throw new Error(`Shader coverage.${n} must be a non-negative integer.`);return e}a$1(y,"parseCoverage");function g(e,n){if(!o(e))throw new Error(`Shader receipt inputs for "${n}" are invalid.`);let t=Object.entries(e);if(t.length===0||t.length>4096)throw new Error(`Shader receipt inputs for "${n}" must contain between 1 and 4096 files.`);for(let[r,c]of t)if(!d(r)||typeof c!="string"||!i.test(c))throw new Error(`Shader receipt input for "${n}" is invalid.`)}a$1(g,"parseInputs");function l(e){if(!o(e)||e.schemaVersion!==2||!o(e.runtime)||!a(e.runtime.three)||!a(e.runtime.threeBlocks)||typeof e.runtime.threeBlocksShaderClosure!="string"||!i.test(e.runtime.threeBlocksShaderClosure)||!o(e.scenes))throw new Error("Shader meta.json does not match receipt schema 2.");if(e.runtime.capture!==void 0&&(!o(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(t=>typeof t=="string"&&t.length>0&&t.length<=128)))throw new Error("Shader meta.json has invalid browser capture provenance.");let n=Object.entries(e.scenes);if(n.length===0)throw new Error("Shader meta.json contains no scenes.");for(let[t,r]of n){if(!h.test(t)||!o(r)||typeof r.artifact!="string"||!d(r.artifact)||!r.artifact.endsWith(".webgpu.ts")||typeof r.artifactHash!="string"||!i.test(r.artifactHash))throw new Error(`Shader receipt for "${t}" is invalid.`);if(r.asset===void 0!=(r.assetHash===void 0)||r.asset!==void 0&&(typeof r.asset!="string"||!d(r.asset)||!r.asset.endsWith(".json")||typeof r.assetHash!="string"||!i.test(r.assetHash)))throw new Error(`Shader static asset receipt for "${t}" is invalid.`);if(g(r.inputs,t),y(r.coverage),r.bytes!==void 0&&(!Number.isSafeInteger(r.bytes)||Number(r.bytes)<0))throw new Error(`Shader receipt byte count for "${t}" is invalid.`);if(r.skipped!==void 0&&(!o(r.skipped)||!Number.isSafeInteger(r.skipped.render)||Number(r.skipped.render)<0||!Number.isSafeInteger(r.skipped.compute)||Number(r.skipped.compute)<0))throw new Error(`Shader receipt skipped-build counts for "${t}" are invalid.`)}if(e.tool!==void 0&&(!o(e.tool)||e.tool.name!=="@three-blocks/devtools"||!a(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$1(l,"parseShaderReceipt");export{o as a,m as b,l as c};
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import {b,c,a as a$2}from'./chunk-NE7SC2BX.js';import {a as a$1,c as c$1,d,h,e}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {randomUUID}from'crypto';import {mkdir,lstat,realpath,writeFile,rename,rm,readFile}from'fs/promises';import p from'path';import {fileURLToPath}from'url';import F from'zlib';import {VK_FORMAT_R16G16B16A16_SFLOAT,KHR_SUPERCOMPRESSION_NONE,read,KHR_SUPERCOMPRESSION_ZSTD,write}from'ktx-parse';var N="/__three-blocks/devtools/environment-bake",Q="/__three-blocks/devtools/environment-bake/upload",T="virtual:three-blocks-devtools/environment-bake.ts",O=`\0${T}`,q=`/@id/__x00__${T}`,ee="src/assets/environment/room-environment.pmrem.ktx2",_=128*1024*1024,te=1;async function re(){try{let[e,r]=await Promise.all([import('playwright'),import('vite')]);return {chromium:e.chromium,createServer:r.createServer}}catch(e){throw new Error('Environment baking requires the optional "playwright" and "vite" packages. Install both in the project and run `npx playwright install chromium`.',{cause:e})}}a(re,"loadEnvironmentBakeBrowserTools");function j(e,r,t,n,o){let d=e??o;if(!Number.isSafeInteger(d)||d<t||d>n)throw new Error(`${r} must be an integer in ${t}...${n}.`);return d}a(j,"boundedInteger");function V(e){let r=j(e,"Environment cube size",16,1024,256);if((r&r-1)!==0)throw new Error("Environment cube size must be a power of two.");return r}a(V,"validateEnvironmentCubeSize");function ne(){return F}a(ne,"zstdFunctions");function oe(e){if(!/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,63}$/u.test(e))throw new Error("Browser reported an invalid Three.js revision.");return e}a(oe,"boundedThreeRevision");function ie(e){if(e.vkFormat!==VK_FORMAT_R16G16B16A16_SFLOAT)throw new Error("RoomEnvironment bake must be RGBA16F KTX2.");if(e.typeSize!==2)throw new Error("RoomEnvironment RGBA16F KTX2 must use a two-byte component type.");if(e.supercompressionScheme!==KHR_SUPERCOMPRESSION_NONE)throw new Error("Browser RoomEnvironment KTX2 must be uncompressed before deterministic encoding.");if(!Number.isSafeInteger(e.pixelWidth)||e.pixelWidth<=0||e.pixelWidth>8192||!Number.isSafeInteger(e.pixelHeight)||e.pixelHeight<=0||e.pixelHeight>8192||e.pixelDepth!==0||e.layerCount!==0||e.faceCount!==1||e.levels.length!==1||e.levels[0]===void 0)throw new Error("RoomEnvironment KTX2 has invalid CubeUV dimensions or topology.");let r=e.pixelWidth*e.pixelHeight*8;if(!Number.isSafeInteger(r)||r>_)throw new Error("RoomEnvironment KTX2 decoded payload exceeds the safety limit.");let t=e.levels[0],n=r+e.pixelHeight*256;if(t.levelData.byteLength<r||t.levelData.byteLength>n||t.levelData.byteLength%8!==0||t.uncompressedByteLength!==t.levelData.byteLength)throw new Error(`RoomEnvironment KTX2 level byte count ${t.levelData.byteLength} is outside the bounded RGBA16F CubeUV layout.`);return e.levels.map(o=>new Uint8Array(o.levelData))}a(ie,"validateRawContainer");function ae(e,r){return e.byteLength===r.byteLength&&Buffer.from(e).equals(Buffer.from(r))}a(ae,"sameBytes");function se(e,r){let t=V(r.cubeSize),n=oe(r.threeRevision);if(e.byteLength===0||e.byteLength>a$1.texture)throw new Error("RoomEnvironment KTX2 input exceeds the bounded texture size.");let o=read(e),d=ie(o),m=r.compression??"zstd",c=ne(),f=F.constants.ZSTD_c_compressionLevel;if(m==="zstd"&&(c.zstdCompressSync===void 0||c.zstdDecompressSync===void 0||f===void 0))throw new Error("This Node.js runtime does not provide deterministic Zstandard support; use --no-zstd explicitly to opt out.");if(o.supercompressionScheme=m==="zstd"?KHR_SUPERCOMPRESSION_ZSTD:KHR_SUPERCOMPRESSION_NONE,o.levelCount=d.length,o.levels=d.map(a=>{let l=m==="zstd"?c.zstdCompressSync?.(a,{params:{[f]:19}}):void 0;return {levelData:l===void 0?a:new Uint8Array(l.buffer,l.byteOffset,l.byteLength),uncompressedByteLength:a.byteLength}}),m==="zstd")for(let a of o.dataFormatDescriptor)a.bytesPlane=[0,0,0,0,0,0,0,0];o.keyValue={KTXorientation:"rd",KTXwriter:`three-blocks RoomEnvironment \xB7 three r${n}`};let u=write(o,{keepWriter:true});if(u.byteLength===0||u.byteLength>a$1.texture)throw new Error("Encoded RoomEnvironment KTX2 exceeds the bounded texture size.");let i=read(u);if(i.vkFormat!==VK_FORMAT_R16G16B16A16_SFLOAT||i.pixelWidth!==o.pixelWidth||i.pixelHeight!==o.pixelHeight||i.supercompressionScheme!==o.supercompressionScheme||i.keyValue.KTXorientation!=="rd"||i.levels.length!==d.length)throw new Error("RoomEnvironment KTX2 header failed round-trip validation.");for(let a=0;a<i.levels.length;a+=1){let l=i.levels[a],g=d[a];if(l===void 0||g===void 0)throw new Error(`RoomEnvironment KTX2 level ${a} is missing after round-trip.`);let R=m==="zstd"?c.zstdDecompressSync?.(l.levelData):l.levelData;if(R===void 0||l.uncompressedByteLength!==g.byteLength||!ae(R,g))throw new Error(`RoomEnvironment KTX2 level ${a} failed byte-for-byte round-trip validation.`)}let h=d.reduce((a,l)=>a+l.byteLength,0);return {bytes:u,metadata:{compression:m,cubeSize:t,format:"RGBA16F CubeUVReflectionMapping",height:i.pixelHeight,rawBytes:h,sha256:c$1(u),three:n,version:te,width:i.pixelWidth}}}a(se,"encodeRoomEnvironmentKtx2");var S=class{static{a(this,"BakeInbox");}promise;#t=a(()=>{},"#resolve");#r=a(()=>{},"#reject");#e=false;constructor(){this.promise=new Promise((r,t)=>{this.#t=r,this.#r=t;});}receive(r){return this.#e?false:(this.#e=true,this.#t(r),true)}reject(r){this.#e||(this.#e=true,this.#r(r));}};function ue(e){if(e.url!==void 0)try{return new URL(e.url,"http://three-blocks.invalid").pathname}catch{return}}a(ue,"requestPath");function y(e,r,t=""){e.statusCode=r,e.setHeader("Content-Type",t.startsWith("<!")?"text/html; charset=utf-8":"text/plain; charset=utf-8"),e.setHeader("Cache-Control","no-store"),e.end(t);}a(y,"respond");function de(e,r){return {name:"three-blocks:environment-bake",enforce:"post",resolveId(t){return t===T?O:void 0},load(t){return t===O?r:void 0},configureServer(t){t.middlewares.use((n,o,d)=>{let m=ue(n);if(m===N&&(n.method==="GET"||n.method==="HEAD")){let a=n.method==="HEAD"?"":`<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Three Blocks environment bake</title></head><body><canvas id="three-blocks-environment-baker" width="1" height="1"></canvas><script type="module" src="${q}"></script></body></html>`;y(o,200,a);return}if(m!==Q)return d();if(n.method!=="POST"){y(o,405,"POST required");return}let c=n.headers["content-type"];if(typeof c!="string"||!c.toLowerCase().startsWith("image/ktx2")){y(o,415,"image/ktx2 required");return}let f=Number(n.headers["content-length"]??0);if(Number.isFinite(f)&&f>_){y(o,413,"Bake payload exceeds 128 MiB");return}let u=[],i=0,h=false;n.on("data",a=>{i+=a.byteLength,i>_?h=true:u.push(a);}),n.on("error",a=>e.reject(a)),n.on("end",()=>{if(h){y(o,413,"Bake payload exceeds 128 MiB"),e.reject(new Error("RoomEnvironment bake upload exceeded 128 MiB."));return}let a=n.headers["x-three-revision"];if(typeof a!="string"){y(o,400,"x-three-revision required"),e.reject(new Error("RoomEnvironment upload omitted the Three.js revision."));return}let l=e.receive({bytes:new Uint8Array(Buffer.concat(u)),threeRevision:a});y(o,l?204:409,l?"":"Bake upload already received");});});}}}a(de,"bakePlugin");async function me(){let e=p.dirname(fileURLToPath(import.meta.url)),r=[p.join(e,"browser","environment-bake.js"),p.join(e,"browser","environment-bake.ts")];for(let t of r)if(await d(t))return (await h(t,a$1.semanticInput,"Environment bake browser entry")).data.toString("utf8");throw new Error("The separately built environment bake browser entry is missing.")}a(me,"browserEntrySource");function ce(e){return new Promise((r,t)=>{e.on("pageerror",n=>{a$2(n.message)||t(n);}),e.on("console",n=>{n.type()==="error"&&!a$2(n.text())&&t(new Error(n.text()));});})}a(ce,"pageFailure");async function le(e,r){await e.waitForFunction(()=>globalThis.__THREE_BLOCKS_ROOM_ENVIRONMENT_BAKE__!==void 0,void 0,{timeout:Math.min(r,3e4)});let t=await e.evaluate(()=>globalThis.__THREE_BLOCKS_ROOM_ENVIRONMENT_BAKE__);if(!t||typeof t!="object"||Reflect.get(t,"ok")!==true){let n=t&&typeof t=="object"?Reflect.get(t,"error"):void 0;throw new Error(typeof n=="string"?n:"Browser RoomEnvironment bake did not report success.")}}a(le,"readBrowserBakeResult");var pe=a(async e=>{let{chromium:r,createServer:t}=await re(),n=new S,o,d,m,c$1,f=false;try{let u=await me();o=await t({root:e.root,configFile:!1,logLevel:"silent",optimizeDeps:{noDiscovery:!0},plugins:[de(n,u)],server:{host:"127.0.0.1",port:0,strictPort:!1}}),await o.listen();let i=o.httpServer?.address();if(!i||typeof i=="string")throw new Error("Environment bake Vite server has no ephemeral TCP address.");d=await r.launch({headless:c(e.headed),args:[...b()]}),m=await d.newContext({viewport:{width:320,height:240}});let h=await m.newPage(),a=ce(h),l=new Promise((R,H)=>{c$1=setTimeout(()=>H(new Error(`RoomEnvironment bake timed out after ${e.timeoutMs}ms.`)),e.timeoutMs),c$1.unref();});await h.goto(`http://127.0.0.1:${i.port}${N}?size=${e.size}`,{waitUntil:"domcontentloaded",timeout:Math.min(e.timeoutMs,3e4)});let g=await Promise.race([n.promise,a,l]);return await le(h,e.timeoutMs),g}catch(u){throw f=true,n.reject(u instanceof Error?u:new Error(String(u))),await n.promise.catch(()=>{}),u}finally{c$1&&clearTimeout(c$1);let u=[];if(await m?.close().catch(i=>u.push(`context: ${i instanceof Error?i.message:String(i)}`)),await d?.close().catch(i=>u.push(`browser: ${i instanceof Error?i.message:String(i)}`)),await o?.close().catch(i=>u.push(`Vite: ${i instanceof Error?i.message:String(i)}`)),!f&&u.length>0)throw new Error(`RoomEnvironment cleanup failed (${u.join("; ")}).`)}},"captureRoomEnvironment");function fe(e$1,r){let t=r??ee;if(p.isAbsolute(t)||t.length===0||t.length>2048||/[\u0000-\u001f\u007f]/u.test(t)||!t.endsWith(".ktx2"))throw new Error("Environment output must be a bounded project-relative .ktx2 path.");let n=p.resolve(e$1,t);if(!e(e$1,n)||n===e$1)throw new Error("Environment output escapes the project root.");return {asset:n,metadata:`${n.slice(0,-5)}.json`}}a(fe,"outputPaths");async function he(e$1,r){let t=p.relative(e$1,r);if(t==="")return;let n=e$1;for(let d$1 of t.split(p.sep)){n=p.join(n,d$1),await d(n)||await mkdir(n);let m=await lstat(n);if(m.isSymbolicLink()||!m.isDirectory())throw new Error(`Environment output parent is not a real directory: ${n}.`)}let o=await realpath(r);if(!e(e$1,o))throw new Error("Environment output parent resolves outside the project root.")}a(he,"ensureSafeParent");async function M(e){if(!await d(e))return;let r=await lstat(e);if(r.isSymbolicLink()||!r.isFile())throw new Error(`Environment output target must be a regular file: ${e}.`)}a(M,"validateOutputTarget");async function ve(e,r,t,n){await Promise.all([M(e),M(t)]);let o=`${process.pid}-${randomUUID()}`,d$1=p.join(p.dirname(e),`.${p.basename(e)}.${o}.tmp`),m=p.join(p.dirname(t),`.${p.basename(t)}.${o}.tmp`),c=`${d$1}.backup`,f=`${m}.backup`,u=false,i=false,h=false,a=false;try{await Promise.all([writeFile(d$1,r,{flag:"wx"}),writeFile(m,n,{encoding:"utf8",flag:"wx"})]),await d(e)&&(await rename(e,c),u=!0),await d(t)&&(await rename(t,f),i=!0),await rename(d$1,e),h=!0,await rename(m,t),a=!0,await Promise.all([rm(c,{force:!0}),rm(f,{force:!0})]);}catch(l){throw a&&await rm(t,{force:true}),h&&await rm(e,{force:true}),i&&await rename(f,t),u&&await rename(c,e),l}finally{await Promise.all([rm(d$1,{force:true}),rm(m,{force:true}),rm(c,{force:true}),rm(f,{force:true})]);}}a(ve,"writeAtomicPair");function U(e,r){return p.relative(e,r).split(p.sep).join("/")}a(U,"portableRelative");async function _e(e){let r=await realpath(e.root),t=V(e.size??256),n=j(e.timeoutMs,"Environment bake timeoutMs",1e3,15*6e4,24e4),o=fe(r,e.output);await he(r,p.dirname(o.asset));let m=await(e.capture??pe)({root:r,size:t,timeoutMs:n,headed:e.headed===true}),c=se(m.bytes,{cubeSize:t,threeRevision:m.threeRevision,compression:e.compression??"zstd"}),f=`${JSON.stringify(c.metadata,null,2)}
3
- `;await ve(o.asset,c.bytes,o.metadata,f);let u=await readFile(o.asset);if(c$1(u)!==c.metadata.sha256)throw new Error("Committed RoomEnvironment checksum does not match metadata.");return {schemaVersion:1,command:"environment bake",output:U(r,o.asset),metadataOutput:U(r,o.metadata),bytes:c.bytes.byteLength,metadata:c.metadata}}a(_e,"bakeRoomEnvironment");function ye(e){if(e<1e3)return `${e} B`;let r=e/1e3;return `${r>=100?Math.round(r):r.toFixed(1)} kB`}a(ye,"formatBytes");function Se(e){return [`\u2713 Environment ${e.metadata.width}\xD7${e.metadata.height} \xB7 CubeUV ${e.metadata.cubeSize}px \xB7 RGBA16F ${e.metadata.compression}`,` Output ${e.output} \xB7 ${ye(e.bytes)}`,` Checksum ${e.metadata.sha256}`].join(`
4
- `)}a(Se,"formatEnvironmentBakeReport");export{_e as bakeRoomEnvironment,pe as captureRoomEnvironment,se as encodeRoomEnvironmentKtx2,Se as formatEnvironmentBakeReport,V as validateEnvironmentCubeSize};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{b as SHADER_ARTIFACT_DIRECTORY,c as SHADER_PARITY_DIRECTORY,a as SHADER_TOOL_CONFIG_FILE,h as ensureShaderToolConfig,e as findShaderProjectRoot,g as inferShaderCaptureTarget,f as loadShaderToolConfig,d as parseShaderToolConfig}from'./chunk-NEWSG5RX.js';import'./chunk-ZDNZCQUQ.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import {e as e$1}from'./chunk-PAH76FDD.js';import'./chunk-4M7M55NS.js';import'./chunk-NE7SC2BX.js';import'./chunk-ZT6T2W4B.js';import {e}from'./chunk-NEWSG5RX.js';import'./chunk-ZDNZCQUQ.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$2={}){let r=e$2.root??await e(e$2.start),d,l=new Promise(t=>{d=t;}),n=new o({...e$2.debounceMs!==void 0?{debounceMs:e$2.debounceMs}:{},...e$2.onError?{onError:e$2.onError}:{},capture:a(async()=>{let t=await e$1({root:r,...e$2.config?{config:e$2.config}:{},...e$2.driver?{driver:e$2.driver}:{},...e$2.driverKind?{driverKind:e$2.driverKind}:{},...e$2.serve?{serve:e$2.serve}:{},...e$2.url?{url:e$2.url}:{},...e$2.headed!==void 0?{headed:e$2.headed}:{},...e$2.attempts!==void 0?{attempts:e$2.attempts}:{}});e$2.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$2.onError?.(t)),e$2.signal&&(e$2.signal.aborted?await a$1():e$2.signal.addEventListener("abort",()=>{a$1();},{once:true})),e$2.initial!==false&&n.notify(),{root:r,done:l,close:a$1}}a(W,"watchShaders");export{o as ShaderWatchQueue,W as watchShaders};
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export{e as captureShaders,d as inspectShaderMatrix,f as testShaders}from'./chunk-PAH76FDD.js';import'./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';
@@ -1,2 +0,0 @@
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-ILOEBEIQ.js';import'./chunk-76WRV5MZ.js';import'./chunk-JMS5NTP7.js';export{c as readInstalledShaderRuntime,b as snapshotShaderInputs}from'./chunk-PAH76FDD.js';import'./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';