@three-blocks/devtools 11.0.0 → 11.1.0-alpha.395.g9b8ccb48a515

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 (77) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/NOTICE +26 -0
  3. package/README.md +117 -170
  4. package/dist/asset-optimize-YJGWKD4Y.js +1 -0
  5. package/dist/asset-transforms-ZVZ4RD4L.js +11 -0
  6. package/dist/browser/shader-capture.js +2 -2
  7. package/dist/browser-smoke-4MYMHKWB.js +1 -0
  8. package/dist/chunk-4SVF5BRM.js +2 -0
  9. package/dist/chunk-7X4DHW36.js +1 -0
  10. package/dist/chunk-BBODS5RH.js +5 -0
  11. package/dist/{chunk-IILE5RBI.js → chunk-CMMYXGQ3.js} +1 -2
  12. package/dist/chunk-DCLDEPPB.js +253 -0
  13. package/dist/{chunk-5L2VS3BN.js → chunk-ECQE4D2U.js} +1 -2
  14. package/dist/chunk-IWQV456Z.js +3 -0
  15. package/dist/chunk-LSH64HEU.js +80 -0
  16. package/dist/{chunk-X5OFYHIY.js → chunk-MIJXPQPM.js} +2 -3
  17. package/dist/chunk-NDIPQLTU.js +16 -0
  18. package/dist/{chunk-NPLE7PPF.js → chunk-NJITVI23.js} +1 -2
  19. package/dist/chunk-O5FU2ASS.js +16 -0
  20. package/dist/chunk-QQKHDH26.js +1 -0
  21. package/dist/chunk-S5LI2C2H.js +5 -0
  22. package/dist/chunk-SBUKHO24.js +1 -0
  23. package/dist/chunk-TK566QET.js +1 -0
  24. package/dist/{chunk-65VEJRRT.js → chunk-WNSGAV6N.js} +1 -2
  25. package/dist/chunk-ZG3LO3VB.js +1 -0
  26. package/dist/{chunk-UDUICSME.js → chunk-ZTHZE36A.js} +1 -1
  27. package/dist/cli.d.ts +1 -0
  28. package/dist/cli.js +26 -26
  29. package/dist/environment-bake-ON5I27N7.js +1 -0
  30. package/dist/index.d.ts +24 -12
  31. package/dist/index.js +1 -279
  32. package/dist/{shader-autowire-SPE5DM2X.js → shader-autowire-D2EOG6GF.js} +1 -2
  33. package/dist/shader-browser-6ICBHK3S.js +1 -0
  34. package/dist/shader-capture-server.d.ts +1 -1
  35. package/dist/shader-capture-server.js +1 -1
  36. package/dist/{shader-config-EOFU5D3Y.js → shader-config-AKZEKIRB.js} +1 -2
  37. package/dist/{shader-parity-QXJWR6OZ.js → shader-parity-7DEPQEDI.js} +1 -1
  38. package/dist/{shader-project-runner-S2AID2RJ.js → shader-project-runner-NV4GKHDX.js} +1 -2
  39. package/dist/shader-watch-JBUA4LP5.js +1 -0
  40. package/dist/shader-workflow-5EHHR32D.js +1 -0
  41. package/dist/status-GDVSLQWV.js +1 -0
  42. package/dist/text-atlas-YYWV7S6F.js +1 -0
  43. package/dist/transform.cjs +1 -1
  44. package/dist/transform.js +1 -1
  45. package/dist/webpack-loader.cjs +1 -1
  46. package/dist/webpack-loader.js +1 -1
  47. package/node/index.d.mts +70 -0
  48. package/node/index.mjs +407 -0
  49. package/node/ipc.mjs +31 -0
  50. package/node/layout.mjs +546 -0
  51. package/node/loader.mjs +103 -0
  52. package/node/media.mjs +454 -0
  53. package/node/recording.mjs +67 -0
  54. package/node/worker.mjs +1314 -0
  55. package/package.json +27 -11
  56. package/dist/asset-optimize-GG72JCOX.js +0 -6
  57. package/dist/browser-smoke-KFF7XV7F.js +0 -254
  58. package/dist/chunk-45AVKQQK.js +0 -80
  59. package/dist/chunk-5FT6AZD6.js +0 -82
  60. package/dist/chunk-7N6TU4JG.js +0 -17
  61. package/dist/chunk-EI7MMDWY.js +0 -1
  62. package/dist/chunk-HOZDD6PW.js +0 -2
  63. package/dist/chunk-LKXY5YU2.js +0 -17
  64. package/dist/chunk-MIUIIPS4.js +0 -1
  65. package/dist/chunk-NF4RFSUJ.js +0 -18
  66. package/dist/chunk-QJFPNM6W.js +0 -2
  67. package/dist/chunk-ZT6T2W4B.js +0 -2
  68. package/dist/chunk-ZZLAZ7GJ.js +0 -6
  69. package/dist/environment-bake-BGMGFAVK.js +0 -4
  70. package/dist/shader-browser-H5CB2ZQX.js +0 -2
  71. package/dist/shader-browser-UXXR6QI2.js +0 -1
  72. package/dist/shader-parity-XPKQQK26.js +0 -2
  73. package/dist/shader-watch-EORZ2SEC.js +0 -2
  74. package/dist/shader-workflow-7NQFDQI5.js +0 -2
  75. package/dist/status-PTBB4SW2.js +0 -2
  76. package/dist/text-atlas-UORTLOQJ.js +0 -2
  77. /package/dist/{chunk-TRHSN2DJ.cjs → chunk-LMLJIVNY.cjs} +0 -0
@@ -1,5 +1,4 @@
1
- #!/usr/bin/env node
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}
1
+ import {a as a$1}from'./chunk-WNSGAV6N.js';import {d,j,a as a$2,c,g as g$1,f,k}from'./chunk-ECQE4D2U.js';import {a}from'./chunk-7X4DHW36.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
2
  ${e}`;let t=e.indexOf(`
4
3
  `);return t<0?`${e}
5
4
  ${n}
@@ -0,0 +1 @@
1
+ export{d as canReuseShaderBrowserSession,h as createAttachedPlaywrightShaderDriver,f as createPlaywrightShaderDriver,i as createShaderDriver,g as createStaticPlaywrightShaderDriver,e as isRetryableShaderObservationNavigation,c as publicBridgeScript,b as settleShaderParityFrames,a as waitForShaderCaptureAcrossNavigation}from'./chunk-LSH64HEU.js';import'./chunk-ZG3LO3VB.js';import'./chunk-4SVF5BRM.js';import'./chunk-NDIPQLTU.js';import'./chunk-TK566QET.js';import'./chunk-NJITVI23.js';import'./chunk-WNSGAV6N.js';import'./chunk-ECQE4D2U.js';import'./chunk-7X4DHW36.js';
@@ -181,7 +181,7 @@ interface ShaderMatrixStatus {
181
181
  /** Inspect all configured manifests without launching Vite, a browser, or a GPU. */
182
182
  declare function inspectShaderMatrix(start?: string, runtimeOverride?: InstalledShaderRuntime, backendOverride?: ShaderBackendSelection): Promise<ShaderMatrixStatus>;
183
183
 
184
- declare const SHADER_PROVIDER_TRANSFORM_VERSION: 63;
184
+ declare const SHADER_PROVIDER_TRANSFORM_VERSION: 64;
185
185
  interface ShaderSceneTiming {
186
186
  /** Number of registered render/compute NodeBuilder builds covered by the manifest. */
187
187
  readonly builds: number;
@@ -1,4 +1,4 @@
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 B(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(B,"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 Bt=/^[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"||!Bt.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 B(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 B(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=63,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:
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 B(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(B,"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 Bt=/^[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"||!Bt.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 B(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 B(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=64,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
2
  - ${s.join(`
3
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
4
  ${e.map(s=>`${n}${q(s,t+1)}`).join(`,
@@ -1,2 +1 @@
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
+ 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-NJITVI23.js';import'./chunk-WNSGAV6N.js';import'./chunk-ECQE4D2U.js';import'./chunk-7X4DHW36.js';
@@ -1 +1 @@
1
- export{b as compareShaderScreenshots,a as shaderScreenshotMetrics}from'./chunk-UDUICSME.js';import'./chunk-EI7MMDWY.js';
1
+ export{b as compareShaderScreenshots,a as shaderScreenshotMetrics}from'./chunk-ZTHZE36A.js';import'./chunk-7X4DHW36.js';
@@ -1,5 +1,4 @@
1
- #!/usr/bin/env node
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?"":`
1
+ import {a as a$2}from'./chunk-WNSGAV6N.js';import {j,a as a$1,d}from'./chunk-ECQE4D2U.js';import {a}from'./chunk-7X4DHW36.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
2
  ${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
3
  ${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
4
  export{J as buildShaderCaptureProject,A as startNextShaderCaptureServer};
@@ -0,0 +1 @@
1
+ export{a as ShaderWatchQueue,b as watchShaders}from'./chunk-SBUKHO24.js';import'./chunk-O5FU2ASS.js';import'./chunk-LSH64HEU.js';import'./chunk-ZG3LO3VB.js';import'./chunk-4SVF5BRM.js';import'./chunk-NDIPQLTU.js';import'./chunk-TK566QET.js';import'./chunk-NJITVI23.js';import'./chunk-WNSGAV6N.js';import'./chunk-ECQE4D2U.js';import'./chunk-7X4DHW36.js';
@@ -0,0 +1 @@
1
+ export{e as captureShaders,d as inspectShaderMatrix,f as testShaders}from'./chunk-O5FU2ASS.js';import'./chunk-LSH64HEU.js';import'./chunk-ZG3LO3VB.js';import'./chunk-4SVF5BRM.js';import'./chunk-NDIPQLTU.js';import'./chunk-TK566QET.js';import'./chunk-NJITVI23.js';import'./chunk-WNSGAV6N.js';import'./chunk-ECQE4D2U.js';import'./chunk-7X4DHW36.js';
@@ -0,0 +1 @@
1
+ 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-BBODS5RH.js';export{c as readInstalledShaderRuntime,b as snapshotShaderInputs}from'./chunk-O5FU2ASS.js';import'./chunk-CMMYXGQ3.js';import'./chunk-MIJXPQPM.js';import'./chunk-LSH64HEU.js';import'./chunk-ZG3LO3VB.js';import'./chunk-4SVF5BRM.js';import'./chunk-NDIPQLTU.js';import'./chunk-TK566QET.js';import'./chunk-NJITVI23.js';import'./chunk-WNSGAV6N.js';import'./chunk-ECQE4D2U.js';import'./chunk-7X4DHW36.js';
@@ -0,0 +1 @@
1
+ export{h as TEXT_ATLAS_GENERATOR_VERSION,g as TEXT_ATLAS_SCHEMA_VERSION,i as builtinFontMetadata,k as generateTextAtlases,m as inspectTextAtlases,l as parseTextAtlasReceipt,j as prewarmBuiltinFont}from'./chunk-MIJXPQPM.js';import'./chunk-WNSGAV6N.js';import'./chunk-ECQE4D2U.js';import'./chunk-7X4DHW36.js';
@@ -1 +1 @@
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
+ 'use strict';var chunkLMLJIVNY_cjs=require('./chunk-LMLJIVNY.cjs');Object.defineProperty(exports,"THREE_BLOCKS_WEBPACK_LOADER",{enumerable:true,get:function(){return chunkLMLJIVNY_cjs.b}});Object.defineProperty(exports,"createEsbuildShaderPlugin",{enumerable:true,get:function(){return chunkLMLJIVNY_cjs.g}});Object.defineProperty(exports,"createRollupShaderPlugin",{enumerable:true,get:function(){return chunkLMLJIVNY_cjs.h}});Object.defineProperty(exports,"resolveShaderAdapterThreeVersion",{enumerable:true,get:function(){return chunkLMLJIVNY_cjs.e}});Object.defineProperty(exports,"transformThreeWebGPUModule",{enumerable:true,get:function(){return chunkLMLJIVNY_cjs.f}});Object.defineProperty(exports,"withThreeBlocksNext",{enumerable:true,get:function(){return chunkLMLJIVNY_cjs.d}});Object.defineProperty(exports,"withThreeBlocksWebpack",{enumerable:true,get:function(){return chunkLMLJIVNY_cjs.c}});
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-MIUIIPS4.js';import'./chunk-NF4RFSUJ.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-QQKHDH26.js';import'./chunk-4SVF5BRM.js';import'./chunk-NDIPQLTU.js';import'./chunk-TK566QET.js';import'./chunk-NJITVI23.js';import'./chunk-WNSGAV6N.js';import'./chunk-ECQE4D2U.js';import'./chunk-7X4DHW36.js';
@@ -1 +1 @@
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
+ 'use strict';var chunkLMLJIVNY_cjs=require('./chunk-LMLJIVNY.cjs');function o(e){return chunkLMLJIVNY_cjs.f(e,this.resourcePath,this.getOptions?.()??{})?.code??e}chunkLMLJIVNY_cjs.a(o,"threeBlocksShaderLoader");module.exports=o;
@@ -1 +1 @@
1
- import {e}from'./chunk-MIUIIPS4.js';import'./chunk-NF4RFSUJ.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-QQKHDH26.js';import'./chunk-4SVF5BRM.js';import'./chunk-NDIPQLTU.js';import'./chunk-TK566QET.js';import'./chunk-NJITVI23.js';import'./chunk-WNSGAV6N.js';import'./chunk-ECQE4D2U.js';import {a}from'./chunk-7X4DHW36.js';function o(e$1){return e(e$1,this.resourcePath,this.getOptions?.()??{})?.code??e$1}a(o,"threeBlocksShaderLoader");export{o as default};
@@ -0,0 +1,70 @@
1
+ import type { EventEmitter } from 'node:events';
2
+
3
+ export interface ConsoleMessage {
4
+ type(): string;
5
+ text(): string;
6
+ location(): { url: string };
7
+ }
8
+ export interface Route {
9
+ request(): { url(): string; method(): string; headers(): Record<string, string>; resourceType(): string; postDataBuffer(): Buffer | null };
10
+ fulfill( response: { status?: number; body?: string | Buffer; contentType?: string; headers?: Record<string, string> } ): Promise<void>;
11
+ continue(): Promise<void>;
12
+ abort( reason?: string ): Promise<void>;
13
+ }
14
+ interface Bounds { x: number; y: number; width: number; height: number }
15
+ interface Frame { url(): string; parentFrame(): null }
16
+ interface ScreenshotOptions { path?: string; type?: 'png'; timeout?: number; clip?: Bounds; omitBackground?: boolean }
17
+ interface NavigationOptions { timeout?: number; waitUntil?: string }
18
+ interface ContextOptions {
19
+ gpu?: boolean;
20
+ viewport?: { width: number; height: number };
21
+ deviceScaleFactor?: number;
22
+ /** Zero runs as fast as possible; use a display interval for pacing benchmarks. */
23
+ frameIntervalMs?: number;
24
+ recordVideo?: { dir: string; size?: { width: number; height: number } };
25
+ }
26
+
27
+ /** Native canvas rendering, Yoga layout, and Skia text measurement. */
28
+ export interface RendererLocator {
29
+ screenshot( options?: ScreenshotOptions ): Promise<Buffer>;
30
+ evaluateAll<R, A>( callback: ( elements: Element[], arg: A ) => R | Promise<R>, arg?: A ): Promise<R>;
31
+ boundingBox(): Promise<Bounds | null>;
32
+ nth( index: number ): RendererLocator;
33
+ first(): RendererLocator;
34
+ }
35
+ export interface RendererPage extends EventEmitter<{
36
+ console: [ ConsoleMessage ]; pageerror: [ Error ]; unhandledrejection: [ string ]; crash: []; close: []; framenavigated: [ Frame ];
37
+ }> {
38
+ evaluate<R>( callback: () => R | Promise<R> ): Promise<R>;
39
+ evaluate<R, A>( callback: ( arg: A ) => R | Promise<R>, arg: A ): Promise<R>;
40
+ waitForFunction<A>( callback: string | ( ( arg: A ) => unknown ), arg?: A, options?: { timeout?: number; polling?: number | 'raf' } ): Promise<unknown>;
41
+ goto( url: string, options?: NavigationOptions ): Promise<void>;
42
+ reload( options?: NavigationOptions ): Promise<void>;
43
+ screenshot( options?: ScreenshotOptions ): Promise<Buffer>;
44
+ close(): Promise<void>;
45
+ waitForTimeout( ms: number ): Promise<void>;
46
+ waitForLoadState( state?: string, options?: { timeout?: number } ): Promise<void>;
47
+ mainFrame(): Frame;
48
+ url(): string;
49
+ waitForURL( expected: string | RegExp | ( ( url: URL ) => boolean ), options?: { timeout?: number } ): Promise<void>;
50
+ isClosed(): boolean;
51
+ context(): RendererContext;
52
+ locator( selector: string ): RendererLocator;
53
+ }
54
+ export interface RendererContext {
55
+ addInitScript<A>( script: string | { content: string } | ( ( arg: A ) => unknown ), arg?: A ): Promise<void>;
56
+ route( pattern: string, handler: ( route: Route ) => unknown ): Promise<void>;
57
+ close(): Promise<void>;
58
+ browser(): RendererBrowser;
59
+ newPage(): Promise<RendererPage>;
60
+ }
61
+ export interface RendererBrowser extends EventEmitter<{ disconnected: [] }> {
62
+ readonly execution: 'node';
63
+ gpuInfo(): Promise<{ execution: 'node'; vendor: string; architecture: string; device: string; description: string; isFallbackAdapter: boolean }>;
64
+ newContext( options?: ContextOptions ): Promise<RendererContext>;
65
+ newPage( options?: ContextOptions ): Promise<RendererPage>;
66
+ isConnected(): boolean;
67
+ version(): string;
68
+ close(): Promise<void>;
69
+ }
70
+ export function launchNodeRenderer(): Promise<RendererBrowser>;