@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.
- package/CHANGELOG.md +18 -0
- package/NOTICE +26 -0
- package/README.md +117 -170
- package/dist/asset-optimize-YJGWKD4Y.js +1 -0
- package/dist/asset-transforms-ZVZ4RD4L.js +11 -0
- package/dist/browser/shader-capture.js +2 -2
- package/dist/browser-smoke-4MYMHKWB.js +1 -0
- package/dist/chunk-4SVF5BRM.js +2 -0
- package/dist/chunk-7X4DHW36.js +1 -0
- package/dist/chunk-BBODS5RH.js +5 -0
- package/dist/{chunk-IILE5RBI.js → chunk-CMMYXGQ3.js} +1 -2
- package/dist/chunk-DCLDEPPB.js +253 -0
- package/dist/{chunk-5L2VS3BN.js → chunk-ECQE4D2U.js} +1 -2
- package/dist/chunk-IWQV456Z.js +3 -0
- package/dist/chunk-LSH64HEU.js +80 -0
- package/dist/{chunk-X5OFYHIY.js → chunk-MIJXPQPM.js} +2 -3
- package/dist/chunk-NDIPQLTU.js +16 -0
- package/dist/{chunk-NPLE7PPF.js → chunk-NJITVI23.js} +1 -2
- package/dist/chunk-O5FU2ASS.js +16 -0
- package/dist/chunk-QQKHDH26.js +1 -0
- package/dist/chunk-S5LI2C2H.js +5 -0
- package/dist/chunk-SBUKHO24.js +1 -0
- package/dist/chunk-TK566QET.js +1 -0
- package/dist/{chunk-65VEJRRT.js → chunk-WNSGAV6N.js} +1 -2
- package/dist/chunk-ZG3LO3VB.js +1 -0
- package/dist/{chunk-UDUICSME.js → chunk-ZTHZE36A.js} +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +26 -26
- package/dist/environment-bake-ON5I27N7.js +1 -0
- package/dist/index.d.ts +24 -12
- package/dist/index.js +1 -279
- package/dist/{shader-autowire-SPE5DM2X.js → shader-autowire-D2EOG6GF.js} +1 -2
- package/dist/shader-browser-6ICBHK3S.js +1 -0
- package/dist/shader-capture-server.d.ts +1 -1
- package/dist/shader-capture-server.js +1 -1
- package/dist/{shader-config-EOFU5D3Y.js → shader-config-AKZEKIRB.js} +1 -2
- package/dist/{shader-parity-QXJWR6OZ.js → shader-parity-7DEPQEDI.js} +1 -1
- package/dist/{shader-project-runner-S2AID2RJ.js → shader-project-runner-NV4GKHDX.js} +1 -2
- package/dist/shader-watch-JBUA4LP5.js +1 -0
- package/dist/shader-workflow-5EHHR32D.js +1 -0
- package/dist/status-GDVSLQWV.js +1 -0
- package/dist/text-atlas-YYWV7S6F.js +1 -0
- package/dist/transform.cjs +1 -1
- package/dist/transform.js +1 -1
- package/dist/webpack-loader.cjs +1 -1
- package/dist/webpack-loader.js +1 -1
- package/node/index.d.mts +70 -0
- package/node/index.mjs +407 -0
- package/node/ipc.mjs +31 -0
- package/node/layout.mjs +546 -0
- package/node/loader.mjs +103 -0
- package/node/media.mjs +454 -0
- package/node/recording.mjs +67 -0
- package/node/worker.mjs +1314 -0
- package/package.json +27 -11
- package/dist/asset-optimize-GG72JCOX.js +0 -6
- package/dist/browser-smoke-KFF7XV7F.js +0 -254
- package/dist/chunk-45AVKQQK.js +0 -80
- package/dist/chunk-5FT6AZD6.js +0 -82
- package/dist/chunk-7N6TU4JG.js +0 -17
- package/dist/chunk-EI7MMDWY.js +0 -1
- package/dist/chunk-HOZDD6PW.js +0 -2
- package/dist/chunk-LKXY5YU2.js +0 -17
- package/dist/chunk-MIUIIPS4.js +0 -1
- package/dist/chunk-NF4RFSUJ.js +0 -18
- package/dist/chunk-QJFPNM6W.js +0 -2
- package/dist/chunk-ZT6T2W4B.js +0 -2
- package/dist/chunk-ZZLAZ7GJ.js +0 -6
- package/dist/environment-bake-BGMGFAVK.js +0 -4
- package/dist/shader-browser-H5CB2ZQX.js +0 -2
- package/dist/shader-browser-UXXR6QI2.js +0 -1
- package/dist/shader-parity-XPKQQK26.js +0 -2
- package/dist/shader-watch-EORZ2SEC.js +0 -2
- package/dist/shader-workflow-7NQFDQI5.js +0 -2
- package/dist/status-PTBB4SW2.js +0 -2
- package/dist/text-atlas-UORTLOQJ.js +0 -2
- /package/dist/{chunk-TRHSN2DJ.cjs → chunk-LMLJIVNY.cjs} +0 -0
package/dist/chunk-NF4RFSUJ.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import {a}from'./chunk-EI7MMDWY.js';import {createHash,randomUUID}from'crypto';import {lstat,open,realpath,mkdir,rename,rm,link,readdir,readFile,unlink}from'fs/promises';import p from'path';import {THREE_WEBGL_R185_COMPATIBILITY,THREE_WEBGPU_R185_COMPATIBILITY,THREE_R186DEV_VERSION,THREE_WEBGPU_R186DEV_COMPATIBILITY,parsePrecompiledManifest,SHADER_HYDRATION_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_ADDRESS_SCHEMA_VERSION,PRECOMPILED_MANIFEST_VERSION}from'three-blocks/shaders';import {createRequire}from'module';import {transformThreeWebgpuProviderHooks,transformThreeWebgpuCaptureInstrumentation}from'three-blocks/vite';var V=/^[a-f0-9]{64}$/,rr=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/,xe=/^[a-z0-9][a-z0-9_-]{0,63}$/,Te=/^[0-9A-Za-z][0-9A-Za-z._/-]{0,127}$/;function c(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}a(c,"isRecord");function $(e){return typeof e=="string"&&rr.test(e)}a($,"isSafeVersion");function ne(e){if(e.length===0||e.length>512||e.includes("\\")||/[\u0000-\u001f\u007f]/.test(e))return false;let r=e.split("/");return !e.startsWith("/")&&r.every(t=>t.length>0&&t!=="."&&t!=="..")}a(ne,"isSafeRelativePath");function Ae(e){if(!c(e)||e.schemaVersion!==2)throw new Error("three-blocks.json must use schemaVersion 2.");if(typeof e.template!="string"||!xe.test(e.template))throw new Error("three-blocks.json has an invalid default shader scene key.");if(!Array.isArray(e.layers)||!e.layers.every(r=>typeof r=="string"&&Te.test(r))||new Set(e.layers).size!==e.layers.length)throw new Error("three-blocks.json has invalid layers.");if(e.generator!==void 0&&(!c(e.generator)||typeof e.generator.name!="string"||!Te.test(e.generator.name)||!$(e.generator.version)))throw new Error("three-blocks.json has invalid generator metadata.");if(!c(e.runtime)||!$(e.runtime.three)||!$(e.runtime.threeBlocks))throw new Error("three-blocks.json has invalid runtime versions.");if(!c(e.features)||typeof e.features.text!="boolean")throw new Error("three-blocks.json has invalid feature metadata.");if(!c(e.protocol)||e.protocol.resultFile!==1)throw new Error("three-blocks.json has an unsupported protocol schema.");if(e.artifacts!==void 0){if(!c(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(Ae,"parseProjectMetadata");function tr(e){if(!c(e))throw new Error("Shader coverage is missing.");for(let r of ["render","vertex","fragment","compute"])if(typeof e[r]!="number"||!Number.isSafeInteger(e[r])||e[r]<0)throw new Error(`Shader coverage.${r} must be a non-negative integer.`);return e}a(tr,"parseCoverage");function nr(e,r){if(!c(e))throw new Error(`Shader receipt inputs for "${r}" are invalid.`);let t=Object.entries(e);if(t.length===0||t.length>4096)throw new Error(`Shader receipt inputs for "${r}" must contain between 1 and 4096 files.`);for(let[n,i]of t)if(!ne(n)||typeof i!="string"||!V.test(i))throw new Error(`Shader receipt input for "${r}" is invalid.`)}a(nr,"parseInputs");function H(e){if(!c(e)||e.schemaVersion!==2||!c(e.runtime)||!$(e.runtime.three)||!$(e.runtime.threeBlocks)||typeof e.runtime.threeBlocksShaderClosure!="string"||!V.test(e.runtime.threeBlocksShaderClosure)||!c(e.scenes))throw new Error("Shader meta.json does not match receipt schema 2.");if(e.runtime.capture!==void 0&&(!c(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 r=Object.entries(e.scenes);if(r.length===0)throw new Error("Shader meta.json contains no scenes.");for(let[t,n]of r){let i=t.endsWith(".webgl")?"webgl":"webgpu",o=i==="webgl"?t.slice(0,-6):t;if(!xe.test(o)||!c(n)||n.backend!==void 0&&n.backend!==i||typeof n.artifact!="string"||!ne(n.artifact)||!n.artifact.endsWith(`.${i}.ts`)||typeof n.artifactHash!="string"||!V.test(n.artifactHash))throw new Error(`Shader receipt for "${t}" is invalid.`);if(n.asset===void 0!=(n.assetHash===void 0)||n.asset!==void 0&&(typeof n.asset!="string"||!ne(n.asset)||!n.asset.endsWith(".json")||typeof n.assetHash!="string"||!V.test(n.assetHash)))throw new Error(`Shader static asset receipt for "${t}" is invalid.`);if(nr(n.inputs,t),tr(n.coverage),n.bytes!==void 0&&(!Number.isSafeInteger(n.bytes)||Number(n.bytes)<0))throw new Error(`Shader receipt byte count for "${t}" is invalid.`);if(n.skipped!==void 0&&(!c(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 "${t}" are invalid.`)}if(e.tool!==void 0&&(!c(e.tool)||e.tool.name!=="@three-blocks/devtools"||!$(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(c(e.tool)&&e.tool.compatibilities!==void 0&&(!c(e.tool.compatibilities)||Object.entries(e.tool.compatibilities).some(([t,n])=>t!=="webgpu"&&t!=="webgl"||typeof n!="string"||n.length===0)))throw new Error("Shader meta.json has invalid backend compatibility metadata.");return e}a(H,"parseShaderReceipt");var O=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 oe(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:void 0}a(oe,"errorCode");function E(e){return createHash("sha256").update(e).digest("hex")}a(E,"sha256");async function w(e){try{return await lstat(e),!0}catch(r){if(oe(r)==="ENOENT")return false;throw r}}a(w,"pathExists");function I(e,r){let t=p.relative(e,r);return t===""||!p.isAbsolute(t)&&t!==".."&&!t.startsWith(`..${p.sep}`)}a(I,"isWithin");function B(e){return JSON.stringify(e)}a(B,"displayPath");async function Me(e,r,t){let n=await open(e,"r");try{let[i,o,a]=await Promise.all([lstat(e),n.stat(),realpath(e)]);if(i.isSymbolicLink())throw new Error(`${t} must not be a symbolic link: ${B(e)}.`);if(!o.isFile())throw new Error(`${t} must be a regular file: ${B(e)}.`);if(o.size>r)throw new Error(`${t} exceeds the ${r}-byte inspection limit: ${B(e)}.`);let d=await n.readFile();if(d.byteLength>r)throw new Error(`${t} grew beyond the ${r}-byte inspection limit while being read.`);return {path:a,data:d}}finally{await n.close();}}a(Me,"readBoundedRegularFile");async function C(e,r){let t=p.dirname(e);await mkdir(t,{recursive:true});try{if((await lstat(e)).isSymbolicLink())throw new Error(`Atomic write target must not be a symbolic link: ${B(e)}.`)}catch(o){if(oe(o)!=="ENOENT")throw o}let n=p.join(t,`.${p.basename(e)}.${process.pid}.${randomUUID()}.tmp`),i;try{i=await open(n,"wx",384),await i.writeFile(r),await i.sync(),await i.close(),i=void 0,await rename(n,e);}finally{await i?.close().catch(()=>{}),await rm(n,{force:true});}}a(C,"writeAtomicRegularFile");async function _e(e,r){let t=p.dirname(e);await mkdir(t,{recursive:true});let n=p.join(t,`.${p.basename(e)}.${process.pid}.${randomUUID()}.tmp`),i;try{i=await open(n,"wx",384),await i.writeFile(r),await i.sync(),await i.close(),i=void 0;try{return await link(n,e),!0}catch(o){if(oe(o)==="EEXIST")return !1;throw o}}finally{await i?.close().catch(()=>{}),await rm(n,{force:true});}}a(_e,"writeNewRegularFile");async function Dr(e,r,t){return Me(e,r,t)}a(Dr,"readExternalRegularFile");async function U(e,r,t){let n=p.resolve(e),i=p.resolve(r);if(!I(n,i))throw new Error(`${t} escapes its allowed directory.`);let o=await lstat(i);if(o.isSymbolicLink())throw new Error(`${t} must not be a symbolic link.`);if(!o.isDirectory())throw new Error(`${t} must be a directory.`);let[a,d]=await Promise.all([realpath(n),realpath(i)]);if(!I(a,d))throw new Error(`${t} resolves outside its allowed directory.`);return d}a(U,"canonicalDirectoryWithin");async function N(e,r,t,n){let i=p.resolve(e),o=p.resolve(r);if(!I(i,o)||i===o)throw new Error(`${n} escapes its allowed directory.`);let a=await Me(o,t,n),d=await realpath(i);if(!I(d,a.path)||d===a.path)throw new Error(`${n} resolves outside its allowed directory.`);return a}a(N,"readRegularFileWithin");async function Lr(e,r,t,n=8192){let o=[await U(e,r,"Inspected directory")],a=[],d=0;for(;o.length>0;){let l=o.shift();if(l===void 0)break;let y=(await readdir(l,{withFileTypes:true})).sort((f,h)=>f.name.localeCompare(h.name));for(let f of y){if(d+=1,d>n)throw new Error(`Inspected directory exceeds the ${n}-entry limit.`);let h=p.join(l,f.name);if(f.isSymbolicLink())throw new Error(`Inspected directory contains a symbolic link: ${B(p.relative(e,h))}.`);if(f.isDirectory()){o.push(await U(e,h,"Nested inspected directory"));continue}if(f.isFile()&&t(f.name))a.push(h);else if(t(f.name))throw new Error(`Semantic input is not a regular file: ${B(h)}.`)}}return a.sort()}a(Lr,"listRegularFilesRecursively");var se="three-blocks.shaders.json",Gr=".three-blocks/shaders",zr=".three-blocks/shaders/parity",cr=/^[a-z0-9][a-z0-9_-]{0,63}$/u,ur=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u,$e=64,Be=64,Ie={schemaVersion:1,backend:"both",scenes:[{key:"default",url:"/"}]};function Jr(e="both"){return e==="both"?["webgpu","webgl"]:[e]}a(Jr,"shaderBackends");function z(e,r){return e.backend===void 0?r:r.filter(t=>t===e.backend)}a(z,"shaderSceneBackends");function Kr(e,r){return r.flatMap(t=>e.filter(n=>z(n,[t]).length>0).map(n=>({scene:n,backend:t,key:de(n.key,t)})))}a(Kr,"shaderScenePairs");function de(e,r){return r==="webgpu"?e:`${e}.webgl`}a(de,"shaderReceiptKey");function Oe(e,r,t){if(e===void 0)return t;if(typeof e!="string"||e.length===0||e.length>512||p.isAbsolute(e)||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${r} must be a bounded project-relative directory.`);let n=p.posix.normalize(e.replaceAll("\\","/")).replace(/\/+$/u,"");if(n==="."||n===".."||n.startsWith("../"))throw new Error(`${r} must stay inside the project.`);return n}a(Oe,"safeProjectDirectory");function lr(e,r){let t=Oe(e,r,"");if(typeof e!="string"||e.endsWith("/"))throw new Error(`${r} must be a project-relative file.`);return t}a(lr,"safeProjectFile");function x(e,r,t,n,i){if(e===void 0)return i;if(!Number.isSafeInteger(e)||Number(e)<t||Number(e)>n)throw new Error(`${r} must be an integer in ${t}...${n}.`);return Number(e)}a(x,"boundedInteger");function Ne(e,r,t){if(e===void 0)return t;if(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)throw new Error(`${r} must be a finite ratio in 0...1.`);return e}a(Ne,"finiteRatio");function De(e,r){if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${r} must be a bounded project-relative URL.`);let t;try{t=new URL(e,"http://three-blocks.invalid/");}catch{throw new Error(`${r} is not a valid URL.`)}if(t.origin!=="http://three-blocks.invalid"||t.hash.length>0)throw new Error(`${r} must stay within the project and must not contain a fragment.`);return `${t.pathname}${t.search}`}a(De,"safeBrowserUrl");function pr(e){if(!Array.isArray(e)||e.length===0||e.length>$e)throw new Error(`Shader config scenes must contain 1...${$e} entries.`);let r=new Set;return e.map((t,n)=>{if(!c(t)||typeof t.key!="string"||!cr.test(t.key))throw new Error(`Shader config scene ${n} has an invalid key.`);if(r.has(t.key))throw new Error(`Shader config scene key "${t.key}" is duplicated.`);r.add(t.key);let i=t.parityFrames,o=t.maxDiffRatio;if(t.inputs!==void 0&&(!Array.isArray(t.inputs)||t.inputs.length===0||t.inputs.length>Be))throw new Error(`Shader config scene "${t.key}" inputs must contain 1...${Be} files.`);let a=t.inputs===void 0?void 0:t.inputs.map((d,l)=>lr(d,`Shader config scene "${t.key}" input ${l}`));if(a!==void 0&&new Set(a).size!==a.length)throw new Error(`Shader config scene "${t.key}" inputs must be unique.`);if(t.runtimeMotion!==void 0&&typeof t.runtimeMotion!="boolean")throw new Error(`Shader config scene "${t.key}" runtimeMotion must be a boolean.`);if(t.backend!==void 0&&t.backend!=="webgpu"&&t.backend!=="webgl")throw new Error(`Shader config scene "${t.key}" backend must be "webgpu" or "webgl".`);return {key:t.key,url:De(t.url,`Shader config scene "${t.key}" URL`),...t.backend===void 0?{}:{backend:t.backend},requiresText:t.requiresText===true,...a===void 0?{}:{inputs:a},...i===void 0?{}:{parityFrames:x(i,`Shader config scene "${t.key}" parityFrames`,0,1e4,0)},...o===void 0?{}:{maxDiffRatio:Ne(o,`Shader config scene "${t.key}" maxDiffRatio`,.01)},...t.runtimeMotion===true?{runtimeMotion:true}:{}}})}a(pr,"parseScenes");function G(e){if(!c(e)||e.schemaVersion!==void 0&&e.schemaVersion!==1)throw new Error("Shader config must use schemaVersion 1.");let r=e.viewport;if(r!==void 0&&!c(r))throw new Error("Shader config viewport must be an object.");let t=e.parity;if(t!==void 0&&!c(t))throw new Error("Shader config parity must be an object.");let n=e.bridge;if(n!==void 0&&!c(n))throw new Error("Shader config bridge must be an object.");let i=c(n)?n.deterministicModule:void 0;i!==void 0&&De(i,"Shader deterministic module");let o=e.readiness;if(o!==void 0&&!c(o))throw new Error("Shader config readiness must be an object.");let a=c(o)?o.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 d=c(o)?o.global:void 0;if(d!==void 0&&(typeof d!="string"||!ur.test(d)))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 l=x(e.timeoutMs,"Shader timeoutMs",1e3,15*6e4,24e4);return {schemaVersion:1,backend:e.backend??"both",scenes:pr(e.scenes),settleFrames:x(e.settleFrames,"Shader settleFrames",0,1e4,60),settleTimeoutMs:x(e.settleTimeoutMs,"Shader settleTimeoutMs",1e3,15*6e4,3e4),browserRelaunchScenes:x(e.browserRelaunchScenes,"Shader browserRelaunchScenes",1,64,8),timeoutMs:l,maxTimeoutMs:Math.max(l,x(e.maxTimeoutMs,"Shader maxTimeoutMs",1e3,15*6e4,l)),viewport:{width:x(c(r)?r.width:void 0,"Shader viewport width",64,8192,1024),height:x(c(r)?r.height:void 0,"Shader viewport height",64,8192,640)},parity:{frames:x(c(t)?t.frames:void 0,"Shader parity frames",0,1e4,90),channelTolerance:x(c(t)?t.channelTolerance:void 0,"Shader parity channelTolerance",0,255,8),maxDiffRatio:Ne(c(t)?t.maxDiffRatio:void 0,"Shader parity maxDiffRatio",.01)},bridge:{legacyLab:c(n)&&n.legacyLab===true,...typeof i=="string"?{deterministicModule:i}:{}},readiness:{...typeof a=="string"?{selector:a}:{},...typeof d=="string"?{global:d}:{}},publicDir:Oe(e.publicDir,"Shader publicDir","public"),allowLiveBuilds:e.allowLiveBuilds!==false}}a(G,"parseShaderToolConfig");async function qr(e=process.cwd()){let r=p.resolve(e);for(;;){if(await w(p.join(r,se))||await w(p.join(r,"three-blocks.json")))return realpath(r);let t=p.join(r,"package.json");if(await w(t)){let i=await N(r,t,O.packageJson,"Project package.json"),o;try{o=JSON.parse(i.data.toString("utf8"));}catch{throw new Error(`Project package.json is not valid JSON: ${t}.`)}if(c(o)&&[o.dependencies,o.devDependencies,o.peerDependencies,o.optionalDependencies].filter(c).some(l=>typeof l.three=="string"||typeof l["three-blocks"]=="string"||typeof l["@three-blocks/devtools"]=="string"))return realpath(r)}let n=p.dirname(r);if(n===r)throw new Error(`No Three Blocks shader project found from ${JSON.stringify(p.resolve(e))}; add Three.js to package.json or pass --root.`);r=n;}}a(qr,"findShaderProjectRoot");async function ae(e){let r=await realpath(e),t=p.join(r,se);if(await w(t)){let i=await N(r,t,O.metadata,"Shader configuration");return G(JSON.parse(i.data.toString("utf8")))}let n=p.join(r,"three-blocks.json");if(await w(n)){let i=Ae(JSON.parse(await readFile(n,"utf8")));return G({schemaVersion:1,backend:"both",scenes:[{key:i.template,url:"/",requiresText:i.features.text}]})}return G(Ie)}a(ae,"loadShaderToolConfig");async function Yr(e){let r=await realpath(e);for(let o of ["vite.config.ts","vite.config.mts","vite.config.js","vite.config.mjs","vite.config.cts","vite.config.cjs"])if(await w(p.join(r,o)))return {driverKind:"vite",reason:`Detected ${o}.`};let t,n=p.join(r,"package.json");if(await w(n)){let o=await N(r,n,O.packageJson,"Project package.json"),a=JSON.parse(o.data.toString("utf8"));c(a)&&(t=a);}let i=a(o=>[t?.dependencies,t?.devDependencies,t?.peerDependencies,t?.optionalDependencies].some(a=>c(a)&&typeof a[o]=="string"),"hasDependency");if(i("vite"))return {driverKind:"vite",reason:"Detected the Vite dependency."};for(let o of ["dist","build","out"])if(await w(p.join(r,o,"index.html")))return {driverKind:"static",serve:o,reason:`Detected the built ${o}/index.html application.`};if(i("next"))throw new Error("Detected Next.js without an attach URL. Run `shaders capture` without an explicit driver or URL to preview the withThreeBlocksNext adapter and start a project-local capture server, or pass --url <local-url> for a server you manage.");if(i("webpack")||i("esbuild")||i("rollup"))throw new Error("Detected a non-Vite bundler but no static index.html. Run `shaders capture` without an explicit driver or URL to preview adapter wiring and build the project, or build it yourself and pass --driver static --serve <directory>.");return {driverKind:"vite",reason:"Using the Vite golden-path driver."}}a(Yr,"inferShaderCaptureTarget");async function Xr(e){let r=await realpath(e),t=p.join(r,se);if(await w(t))return {config:await ae(r),file:t,created:false};let n=p.join(r,"three-blocks.json");if(await w(n))return {config:await ae(r),file:n,created:false};let i=Ie,o=G(i),a=await _e(t,`${JSON.stringify(i,null,2)}
|
|
2
|
-
`);return {config:a?o:await ae(r),file:t,created:a}}a(Xr,"ensureShaderToolConfig");function ce(e,r="webgpu"){if(/^0\.185\./u.test(e))return r==="webgl"?THREE_WEBGL_R185_COMPATIBILITY:THREE_WEBGPU_R185_COMPATIBILITY;if(e===THREE_R186DEV_VERSION&&r==="webgpu")return THREE_WEBGPU_R186DEV_COMPATIBILITY;throw new Error(`Three.js ${e} is outside the supported shader compatibility contracts.`)}a(ce,"shaderCompatibilityForThree");var ue="0.1.0";var he=63,ye="timing.local.json",ge="timing.json",Se="parity.json",J=4096,wr=4096;function pe(e,r,t=8192){if(typeof e!="string"||e.length===0||e.length>t||/[\u0000\u007f]/u.test(e))throw new Error(`${r} must be a bounded non-empty string.`);return e}a(pe,"boundedString");function m(e,r,t=true){if(typeof e!="number"||!Number.isFinite(e)||e<0||t&&!Number.isSafeInteger(e))throw new Error(`${r} must be a non-negative ${t?"integer":"finite number"}.`);return e}a(m,"nonNegativeNumber");function br(e){if(!c(e))throw new Error("Shader capture stats are missing.");let r={buildCalls:m(e.buildCalls,"capture stats.buildCalls"),renderBuilds:m(e.renderBuilds,"capture stats.renderBuilds"),computeBuilds:m(e.computeBuilds,"capture stats.computeBuilds"),registeredBuilds:m(e.registeredBuilds,"capture stats.registeredBuilds"),registeredRenderBuilds:m(e.registeredRenderBuilds,"capture stats.registeredRenderBuilds"),registeredComputeBuilds:m(e.registeredComputeBuilds,"capture stats.registeredComputeBuilds"),buildMs:m(e.buildMs,"capture stats.buildMs",false),syncBuildMs:m(e.syncBuildMs,"capture stats.syncBuildMs",false),asyncBuildElapsedMs:m(e.asyncBuildElapsedMs,"capture stats.asyncBuildElapsedMs",false),precompiledSetupMs:m(e.precompiledSetupMs,"capture stats.precompiledSetupMs",false),maxSyncBuildMs:m(e.maxSyncBuildMs??e.syncBuildMs,"capture stats.maxSyncBuildMs",false),maxPrecompiledSetupMs:m(e.maxPrecompiledSetupMs??e.precompiledSetupMs,"capture stats.maxPrecompiledSetupMs",false),hydrationMs:m(e.hydrationMs??0,"capture stats.hydrationMs",false),maxHydrationMs:m(e.maxHydrationMs??e.hydrationMs??0,"capture stats.maxHydrationMs",false),injected:m(e.injected,"capture stats.injected"),injectedRender:m(e.injectedRender,"capture stats.injectedRender"),injectedCompute:m(e.injectedCompute,"capture stats.injectedCompute"),missed:m(e.missed,"capture stats.missed"),missedRender:m(e.missedRender,"capture stats.missedRender"),missedCompute:m(e.missedCompute,"capture stats.missedCompute"),...Array.isArray(e.missedKeys)&&e.missedKeys.every(t=>typeof t=="string")?{missedKeys:e.missedKeys.slice(0,J)}:{}};if(r.renderBuilds+r.computeBuilds!==r.buildCalls||r.registeredRenderBuilds+r.registeredComputeBuilds!==r.registeredBuilds||r.injectedRender+r.injectedCompute!==r.injected||r.missedRender+r.missedCompute!==r.missed||r.registeredBuilds>r.buildCalls||Math.abs(r.syncBuildMs+r.asyncBuildElapsedMs-r.buildMs)>.001||r.maxSyncBuildMs>r.syncBuildMs+.001||r.maxPrecompiledSetupMs>r.precompiledSetupMs+.001||r.maxHydrationMs>r.hydrationMs+.001)throw new Error("Shader capture stats totals are inconsistent.");return r}a(br,"captureStats");function Er(e){if(!Array.isArray(e)||e.length>J)throw new Error("Shader capture skipped builds are invalid.");return e.map((r,t)=>{if(!c(r)||r.kind!=="render"&&r.kind!=="compute")throw new Error(`Shader capture skipped build ${t} is invalid.`);return {kind:r.kind,name:pe(r.name,`skipped build ${t} name`,512),reason:pe(r.reason,`skipped build ${t} reason`)}})}a(Er,"skippedBuilds");function kr(e){let r=0,t=0,n=0,i=0;for(let o of Object.values(e.entries)){let a=e.states[o];a!==void 0&&((a.vertex!==null||a.fragment!==null)&&r++,a.vertex!==null&&t++,a.fragment!==null&&n++,a.compute!==null&&i++);}return {render:r,vertex:t,fragment:n,compute:i}}a(kr,"shaderCoverage");function ft(e,r){if(!c(e))throw new Error("Shader capture payload must be an object.");if(e.scene!==r.scene)throw new Error(`Shader capture scene does not match "${r.scene}".`);if(e.protocolVersion!==2)throw new Error("Shader capture protocolVersion must be 2.");let t=r.backend??"webgpu",n=ce(r.runtime.three,t);if(e.compatibility!==n)throw new Error(`Shader capture compatibility must be "${n}".`);if(!c(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>J)throw new Error(`Shader capture must contain at most ${J} entries.`);if(!Array.isArray(e.errors)||e.errors.length>wr)throw new Error("Shader capture errors are invalid.");let o=e.errors.map((R,u)=>pe(R,`capture error ${u}`,64*1024));if(o.length>0)throw new Error(`Shader capture failed:
|
|
3
|
-
- ${o.join(`
|
|
4
|
-
- `)}`);let a=Er(e.skipped);if(i===0&&(t!=="webgl"||a.length===0))throw new Error("Shader capture must contain an entry unless WebGL explicitly skipped every live build.");let d=br(e.stats),l=c(e.timing)?e.timing:void 0,y=l===void 0?void 0:Object.fromEntries(["launch","firstRequest","readiness","lastBuild","settled","posted"].flatMap(R=>{let u=l[R];if(u===void 0)return [];if(typeof u!="number"||!Number.isFinite(u)||u<0)throw new Error(`Shader capture timing.${R} is invalid.`);return [[R,u]]})),f;if(e.provenance!==void 0){if(!c(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(R=>typeof R=="string"&&R.length<=128))throw new Error("Shader capture provenance is invalid.");f={userAgent:e.provenance.userAgent,adapter:e.provenance.adapter,features:[...new Set(e.provenance.features)].sort()};}let h=parsePrecompiledManifest({version:PRECOMPILED_MANIFEST_VERSION,scene:r.scene,three:r.runtime.three,threeBlocks:r.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}}),k=kr(h);if(d.registeredRenderBuilds<k.render||d.registeredComputeBuilds<k.compute)throw new Error("Shader capture did not live-build every distinct registered render/compute entry.");return {scene:r.scene,backend:t,manifest:h,skipped:a,stats:d,coverage:k,...y===void 0?{}:{timing:y},...f===void 0?{}:{provenance:f}}}a(ft,"validateShaderCapture");function A(e,r=0){let t=" ".repeat(r),n=" ".repeat(r+1);if(Array.isArray(e))return e.length===0?"[]":e.every(o=>o===null||["number","string","boolean"].includes(typeof o))?JSON.stringify(e):`[
|
|
5
|
-
${e.map(o=>`${n}${A(o,r+1)}`).join(`,
|
|
6
|
-
`)}
|
|
7
|
-
${t}]`;if(e!==null&&typeof e=="object"){let o=e,a=Object.keys(o).sort();return a.length===0?"{}":`{
|
|
8
|
-
${a.map(d=>{let l=o[d];return `${n}${JSON.stringify(d)}: ${A(l,r+1)}`}).join(`,
|
|
9
|
-
`)}
|
|
10
|
-
${t}}`}let i=JSON.stringify(e);if(i===void 0)throw new Error("Shader artifact contains a non-serializable value.");return i}a(A,"stableStringify");function Rr(e){return ["// GENERATED FILE \u2014 do not edit by hand.","// Produced by @three-blocks/devtools.","import type { PrecompiledManifest } from 'three-blocks/shaders';","",`export default ${A(e)} satisfies PrecompiledManifest;`,""].join(`
|
|
11
|
-
`)}a(Rr,"serializeShaderManifest");function Fe(e,r){if(typeof e!="string"||e.length===0||e.length>256||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${r} is invalid.`);return e}a(Fe,"timingLabel");function fe(e){if(!c(e)||e.schemaVersion!==3||e.source!=="latest-local-capture"&&e.source!=="committed-capture"||typeof e.receiptHash!="string"||!/^[a-f0-9]{64}$/u.test(e.receiptHash)||typeof e.measuredAt!="string"||!Number.isFinite(Date.parse(e.measuredAt))||!c(e.scenes))throw new Error("Shader timing is invalid.");let r={};for(let[n,i]of Object.entries(e.scenes)){if(n.length===0||n.length>128||!c(i))throw new Error("Shader timing scene is invalid.");let o={builds:m(i.builds,`timing ${n}.builds`),setupMeasured:i.setupMeasured===true,liveBuildMs:m(i.liveBuildMs,`timing ${n}.liveBuildMs`,false),precompiledBuildMs:m(i.precompiledBuildMs,`timing ${n}.precompiledBuildMs`,false),avoidedBuildMs:m(i.avoidedBuildMs,`timing ${n}.avoidedBuildMs`,false),runs:m(i.runs,`timing ${n}.runs`),spreadMs:m(i.spreadMs,`timing ${n}.spreadMs`,false)};if(o.runs<1)throw new Error(`Shader timing runs are invalid for scene "${n}".`);if(Math.abs(o.avoidedBuildMs-Math.max(0,o.liveBuildMs-o.precompiledBuildMs))>.001)throw new Error(`Shader timing delta is inconsistent for scene "${n}".`);r[n]=o;}if(Object.keys(r).length===0)throw new Error("Shader timing contains no scenes.");let t={schemaVersion:3,receiptHash:e.receiptHash,measuredAt:e.measuredAt,scenes:r};return e.source==="latest-local-capture"?{...t,source:"latest-local-capture"}:{...t,source:"committed-capture",adapter:Fe(e.adapter,"Shader timing adapter"),platform:Fe(e.platform,"Shader timing platform")}}a(fe,"parseShaderTiming");function K(e){return /^[a-z0-9][a-z0-9_-]{0,63}(?:\.webgl)?$/u.test(e)}a(K,"validParityScene");function Ve(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}a(Ve,"validParityTimestamp");function we(e){if(!c(e))throw new Error("Shader parity evidence is invalid.");if(e.schemaVersion===1){if(typeof e.receiptHash!="string"||!/^[a-f0-9]{64}$/u.test(e.receiptHash)||!Ve(e.verifiedAt)||!Array.isArray(e.scenes)||e.scenes.length===0||e.scenes.length>64||!e.scenes.every(n=>typeof n=="string"&&K(n)))throw new Error("Shader parity evidence is invalid.");return {schemaVersion:1,receiptHash:e.receiptHash,verifiedAt:e.verifiedAt,scenes:[...new Set(e.scenes)].sort()}}if(e.schemaVersion!==2||!c(e.scenes))throw new Error("Shader parity evidence is invalid.");let r=Object.entries(e.scenes);if(r.length===0||r.length>64)throw new Error("Shader parity evidence is invalid.");let t={};for(let[n,i]of r.sort(([o],[a])=>o.localeCompare(a))){if(!K(n)||!c(i)||typeof i.fingerprint!="string"||!/^[a-f0-9]{64}$/u.test(i.fingerprint)||!Ve(i.verifiedAt))throw new Error("Shader parity evidence is invalid.");t[n]={fingerprint:i.fingerprint,verifiedAt:i.verifiedAt};}return {schemaVersion:2,scenes:t}}a(we,"parseShaderParityEvidence");function me(e,r){let t=e.scenes[r];if(t===void 0)throw new Error(`Shader receipt has no scene "${r}" for parity evidence.`);return E(A({runtime:{three:e.runtime.three,threeBlocks:e.runtime.threeBlocks,threeBlocksShaderClosure:e.runtime.threeBlocksShaderClosure},...e.tool===void 0?{}:{tool:e.tool},scene:t}))}a(me,"shaderSceneParityFingerprint");async function q(e,r,t,n){let i=p.join(e,t);try{if(!await w(i))return;let o=await lstat(i);if(o.isSymbolicLink()||!o.isFile()||o.size>1024*1024)return;let a=fe(JSON.parse(await readFile(i,"utf8")));return a.source===n&&a.receiptHash===E(r)?a:void 0}catch{return}}a(q,"readShaderTimingFile");async function mt(e,r){let t=await q(e,r,ye,"latest-local-capture");return t?.source==="latest-local-capture"?t:void 0}a(mt,"readShaderLocalTiming");async function ht(e,r){return await q(e,r,ye,"latest-local-capture")??await q(e,r,ge,"committed-capture")}a(ht,"readShaderTiming");async function ze(e,r){let t=p.join(e,Se);try{if(!await w(t))return;let n=await lstat(t);if(n.isSymbolicLink()||!n.isFile()||n.size>1024*1024)return;let i=we(JSON.parse(await readFile(t,"utf8"))),o=H(JSON.parse(Buffer.from(r).toString("utf8"))),a={};if(i.schemaVersion===1){if(i.receiptHash!==E(r))return;for(let d of i.scenes)o.scenes[d]!==void 0&&(a[d]={fingerprint:me(o,d),verifiedAt:i.verifiedAt});}else for(let[d,l]of Object.entries(i.scenes))o.scenes[d]===void 0||l.fingerprint!==me(o,d)||(a[d]=l);return Object.keys(a).length===0?void 0:{schemaVersion:2,scenes:a}}catch{return}}a(ze,"readShaderParityEvidence");async function yt(e,r){let t=await q(e,r,ge,"committed-capture");return t?.source==="committed-capture"?t:void 0}a(yt,"readShaderCommittedTiming");async function Je(e,r,t){let n=await Y(e),i=p.join(n,"meta.json"),o=await lstat(i);if(o.isSymbolicLink()||!o.isFile())throw new Error("Shader receipt must be a regular file before timing.");let a=await readFile(i),d=new Date().toISOString(),l=Object.fromEntries(Object.entries(r).sort(([h],[k])=>h.localeCompare(k))),y=fe({schemaVersion:3,receiptHash:E(a),measuredAt:d,source:"latest-local-capture",scenes:l});if(await C(p.join(n,ye),`${A(y)}
|
|
12
|
-
`),t===void 0)return {local:y};let f=fe({schemaVersion:3,receiptHash:E(a),measuredAt:d,source:"committed-capture",adapter:t.adapter,platform:t.platform,scenes:l});return await C(p.join(n,ge),`${A(f)}
|
|
13
|
-
`),{local:y,committed:f}}a(Je,"writeShaderTimings");async function gt(e,r){return (await Je(e,r)).local}a(gt,"writeShaderLocalTiming");async function St(e,r,t){if(r.length===0||r.length>64||r.some(k=>!K(k)))throw new Error("Shader parity evidence must contain 1...64 valid scene keys.");let n=await Y(e),i=p.join(n,"meta.json"),o=await lstat(i);if(o.isSymbolicLink()||!o.isFile())throw new Error("Shader receipt must be a regular file before parity evidence.");let a=await readFile(i);if(t!==void 0&&E(a)!==E(t))throw new Error("Shader receipt changed during browser parity verification; completed observations were not attached to the new receipt.");let d=H(JSON.parse(a.toString("utf8"))),l=await ze(n,a),y=new Date().toISOString(),f={...l?.scenes};for(let k of [...new Set(r)].sort())f[k]={fingerprint:me(d,k),verifiedAt:y};let h=we({schemaVersion:2,scenes:f});return await C(p.join(n,Se),`${A(h)}
|
|
14
|
-
`),h}a(St,"writeShaderParityEvidence");async function wt(e,r,t){if(r.length===0||r.length>64||r.some(f=>!K(f)))throw new Error("Shader parity invalidation must contain 1...64 valid scene keys.");let n=await Y(e),i=await readFile(p.join(n,"meta.json"));if(E(i)!==E(t))throw new Error("Shader receipt changed before prior parity evidence could be invalidated.");let o=await ze(n,i);if(o===void 0)return;let a=new Set(r),d=Object.fromEntries(Object.entries(o.scenes).filter(([f])=>!a.has(f))),l=p.join(n,Se);if(Object.keys(d).length===0){await unlink(l).catch(f=>{if(!c(f)||f.code!=="ENOENT")throw f});return}let y=we({schemaVersion:2,scenes:d});await C(l,`${A(y)}
|
|
15
|
-
`);}a(wt,"removeShaderParityEvidence");async function bt(e,r,t){let n=await Je(e,r,t);if(n.committed===void 0)throw new Error("Committed shader timing was not written.");return {local:n.local,committed:n.committed}}a(bt,"writeShaderTimingTwins");async function He(e){if(!await w(e)){await mkdir(e);return}let r=await lstat(e);if(r.isSymbolicLink()||!r.isDirectory())throw new Error(`Shader artifact path is not a real directory: ${e}.`)}a(He,"assertDirectory");async function Y(e){let r=p.resolve(e),t=p.join(r,".three-blocks");await He(t);let n=p.join(t,"shaders");return await He(n),n}a(Y,"artifactRoot");async function Et(e){let r=await Y(e.root),t=e.backends??["webgpu"],n=Object.fromEntries(t.map(u=>[u,ce(e.runtime.three,u)])),i=p.resolve(e.root),o=p.resolve(i,e.publicDirectory??"public");if(!I(i,o)||o===i)throw new Error("Shader public directory must stay inside the project root.");let a=p.join(o,"three-blocks","shaders");await mkdir(a,{recursive:true}),await U(i,a,"Shader static-asset directory");let d={},l=[];for(let u of [...e.scenes].sort((T,j)=>T.key.localeCompare(j.key))){let T=e.inputs.get(u.key);if(T===void 0)throw new Error(`Shader input matrix is missing scene "${u.key}".`);for(let j of z(u,t)){let _=de(u.key,j),P=e.captures.get(_);if(P===void 0){let g=e.previousReceipt?.scenes[_];if(g===void 0)continue;let re=await readFile(p.join(r,g.artifact));if(E(re)!==g.artifactHash)throw new Error(`Preserved shader artifact checksum differs for "${_}".`);if(g.asset!==void 0&&g.assetHash!==void 0){let te=await readFile(p.join(o,g.asset));if(E(te)!==g.assetHash)throw new Error(`Preserved static shader manifest checksum differs for "${_}".`)}d[_]={...g,backend:j,inputs:Object.fromEntries(Object.entries(T).sort(([te],[er])=>te.localeCompare(er)))},l.push(g.artifact),g.asset!==void 0&&l.push(p.relative(i,p.join(o,g.asset)).split(p.sep).join("/"));continue}if(P.scene!==u.key||P.backend!==j||P.manifest.scene!==u.key)throw new Error(`Capture matrix scene/backend "${_}" is inconsistent.`);let Z=`${u.key}.${j}.ts`,Q=Rr(P.manifest);await C(p.join(r,Z),Q),l.push(Z);let ee=`three-blocks/shaders/${u.key}.${j}.json`,ke=`${A(P.manifest)}
|
|
16
|
-
`;await C(p.join(o,ee),ke),l.push(p.relative(i,p.join(o,ee)).split(p.sep).join("/"));let Re=P.skipped.filter(g=>g.kind==="render").length,Qe=P.skipped.length-Re;d[_]={backend:j,artifact:Z,artifactHash:E(Q),asset:ee,assetHash:E(ke),inputs:Object.fromEntries(Object.entries(T).sort(([g],[re])=>g.localeCompare(re))),coverage:P.coverage,bytes:Buffer.byteLength(Q),skipped:{render:Re,compute:Qe}};}}let y=[...e.captures.values()].find(u=>u.provenance!==void 0)?.provenance??e.previousReceipt?.runtime.capture,f={schemaVersion:2,runtime:{...e.runtime,...y===void 0?{}:{capture:y}},tool:{name:"@three-blocks/devtools",version:ue,compatibility:n[t[0]??"webgpu"],compatibilities:n,transform:he,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION},scenes:d},h=new Set(l);for(let u of await readdir(r,{withFileTypes:true}))if(!(!/\.(?:webgpu|webgl)\.ts$/u.test(u.name)||h.has(u.name))){if(u.isSymbolicLink()||!u.isFile())throw new Error(`Orphan shader artifact is not a regular file: ${u.name}.`);await unlink(p.join(r,u.name));}let k=new Set(e.scenes.flatMap(u=>z(u,t).map(T=>`${u.key}.${T}.json`))),R=new Set(Object.values(e.previousReceipt?.scenes??{}).map(u=>u.asset===void 0?void 0:p.posix.basename(u.asset)).filter(u=>u!==void 0));try{let u=H(JSON.parse(await readFile(p.join(r,"meta.json"),"utf8")));for(let T of Object.values(u.scenes))T.asset!==void 0&&R.add(p.posix.basename(T.asset));}catch{}for(let u of await readdir(a,{withFileTypes:true}))if(!(!u.name.endsWith(".json")||k.has(u.name))&&R.has(u.name)){if(u.isSymbolicLink()||!u.isFile())throw new Error(`Orphan shader static asset is not a regular file: ${u.name}.`);await unlink(p.join(a,u.name));}return await C(p.join(r,"meta.json"),`${A(f)}
|
|
17
|
-
`),l.push("meta.json"),{directory:r,receipt:f,files:l}}a(Et,"writeShaderArtifacts");var F;async function X(){F===void 0&&(F=(async()=>{let r=createRequire(p.join(process.cwd(),"package.json")).resolve("@three-blocks/devtools/browser/shader-capture"),t=p.resolve(p.dirname(r),"../..");return (await N(t,r,O.metadata,"Shader capture browser runtime")).data.toString("utf8")})());let e=F;try{return await e}catch(r){throw F===e&&(F=void 0),r}}a(X,"loadShaderCaptureRuntimeSource");var Ke="virtual:three-blocks-shader-capture-client",qe="\0three-blocks:shader-capture-client",Ee="virtual:three-blocks-shader-capture-runtime",Ye="\0three-blocks:shader-capture-runtime";async function Ot(){let e=await X(),r=e.replace(/\bexport\{[^{}]*\};?\s*$/u,"");if(r===e)throw new Error("Shader capture browser runtime no longer has the expected final ESM export list.");return r}a(Ot,"loadShaderCaptureRuntimeScriptSource");function jr(e){let r=e.split("?",1)[0];return r===void 0?false:r.split(p.sep).join("/").endsWith("/build/three.webgpu.js")}a(jr,"isThreeWebGPUModule");function Ze(e){let r=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/u.exec(e);return r?.[1]==="0"&&r[2]==="185"}a(Ze,"supportedVersion");function Cr(e,r,t={}){if(!Ze(r))throw new Error(`Shader provider transform ${THREE_WEBGPU_R185_COMPATIBILITY} supports Three.js 0.185.x; received "${r}".`);let n=transformThreeWebgpuProviderHooks(e,{threeVersion:r,...t.threeRevision===void 0?{}:{threeRevision:t.threeRevision},id:"three/build/three.webgpu.js"}),i=n.state==="already-applied",o=n.code;return t.instrumentCapture&&(o=transformThreeWebgpuCaptureInstrumentation(o,{...t.captureRuntimeImport===void 0?{}:{runtimeImport:t.captureRuntimeImport},...t.forceWebGL===true?{forceWebGL:true}:{}}).code),{code:o,alreadyPresent:i,captureApplied:t.instrumentCapture===true}}a(Cr,"applyShaderProviderTransform");var Mr=/this\.trackTimestamp\s*=\s*\(\s*parameters\.trackTimestamp\s*===\s*true\s*\);/gu,_r="Object.defineProperty( this, 'trackTimestamp', { get: () => false, set: () => {} } );";function Nt(e,r={}){if(!Ze(e))throw new Error(`Shader provider transform ${THREE_WEBGPU_R185_COMPATIBILITY} supports Three.js 0.185.x; received "${e}".`);let t={seen:false,applied:false,alreadyPresent:false};return {plugin:{name:"three-blocks:shader-provider-transform",enforce:"pre",config(){return {optimizeDeps:{exclude:["three","three/webgpu","three/tsl"]},resolve:{dedupe:["three"]}}},resolveId(i){return r.capture&&i===Ke?qe:r.capture&&i===Ee?Ye:null},async load(i){return r.capture?i===Ye?X():i===qe?[`export * from '${Ee}';`,`import { configureThreeBlocksShaderCapture } from '${Ee}';`,`configureThreeBlocksShaderCapture( ${JSON.stringify({capture:r.capture.capture,backend:r.capture.forceWebGL===true?"webgl":"webgpu",forceLive:r.capture.forceLive,driven:r.capture.driven,settleFrames:r.capture.settleFrames,settleTimeoutMs:r.capture.settleTimeoutMs,visibilityGuard:r.capture.visibilityGuard,captureId:r.capture.captureId,sessionKey:r.capture.sessionKey,token:r.capture.token,readiness:r.capture.readiness??{},transform:he})} );`].join(`
|
|
18
|
-
`):null:null},transform(i,o){if(!jr(o))return null;t.seen=true,t.id=o;try{let a=Cr(i,e,{instrumentCapture:r.capture!==void 0,forceWebGL:r.capture?.forceWebGL===!0,...r.capture!==void 0?{captureRuntimeImport:Ke}:{}}),d=r.disableTimestampQueries===!0?a.code.replace(Mr,_r):a.code;if(r.disableTimestampQueries===!0&&d===a.code)throw new Error("Three.js timestamp tracking anchor drifted; refusing software WebGPU capture.");return t.applied=!0,t.alreadyPresent=a.alreadyPresent,t.captureApplied=a.captureApplied,d===i?null:{code:d,map:null}}catch(a){throw t.error=a instanceof Error?a.message:String(a),a}}},status:t}}a(Nt,"createShaderProviderTransform");function Dt(e){if(e.error)throw new Error(e.error);if(!e.seen||!e.applied)throw new Error(`The version-gated shader provider transform was not applied (${e.seen?"module seen":"three/webgpu not seen"}).`)}a(Dt,"assertShaderProviderTransform");export{ue as A,he as B,ye as C,ge as D,Se as E,kr as F,ft as G,A as H,Rr as I,mt as J,ht as K,ze as L,yt as M,gt as N,St as O,wt as P,bt as Q,Et as R,X as S,Ke as T,Ot as U,jr as V,Cr as W,Nt as X,Dt as Y,c as a,Ae as b,H as c,O as d,oe as e,E as f,w as g,I as h,C as i,Dr as j,U as k,N as l,Lr as m,se as n,Gr as o,zr as p,Jr as q,z as r,Kr as s,de as t,G as u,qr as v,ae as w,Yr as x,Xr as y,ce as z};
|
package/dist/chunk-QJFPNM6W.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {a}from'./chunk-HOZDD6PW.js';import t from'process';var i=Object.freeze([{id:"three-inspector-invalid-json",pattern:/is not valid JSON/iu},{id:"chromium-webgpu-experimental",pattern:/WebGPU is experimental/iu},{id:"browser-automatic-favicon",pattern:/Failed to load resource:.*404.*\/favicon\.ico/iu}]);function u(r){return i.some(e=>e.pattern.test(r))}a(u,"isDocumentedBrowserNoise");function l(r=t.env,e=t.platform){let o=r.THREE_BLOCKS_WEBGPU_BROWSER_ARGS?.split(/\s+/u).filter(Boolean);if(o&&o.length>0)return o;let s=["--enable-unsafe-webgpu"];return e==="darwin"&&s.push("--enable-gpu","--use-angle=metal"),e==="linux"&&s.push("--enable-features=Vulkan","--disable-vulkan-surface","--ignore-gpu-blocklist","--disable-gpu-driver-bug-workarounds","--disable-gpu-watchdog"),s}a(l,"webgpuBrowserArgs");function p(r=t.env){let e=r.THREE_BLOCKS_WEBGL_BROWSER_ARGS?.split(/\s+/u).filter(Boolean);return e&&e.length>0?e:["--use-angle=swiftshader","--enable-unsafe-swiftshader","--ignore-gpu-blocklist"]}a(p,"webglBrowserArgs");function g(r=false,e=t.env){return r!==true&&e.THREE_BLOCKS_SOFTWARE_WEBGPU!=="1"}a(g,"webgpuBrowserHeadless");export{u as a,l as b,p as c,g as d};
|
package/dist/chunk-ZT6T2W4B.js
DELETED
package/dist/chunk-ZZLAZ7GJ.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {d as d$2,b as b$2,c as c$3,g as g$2}from'./chunk-IILE5RBI.js';import {g as g$1}from'./chunk-X5OFYHIY.js';import {a as a$3,c as c$2,b,d as d$1}from'./chunk-LKXY5YU2.js';import {a as a$1,c,b as b$1}from'./chunk-65VEJRRT.js';import {j,d,i,a as a$2,c as c$1}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {realpath}from'fs/promises';import h from'path';var te=".three-blocks/runtime/status.json",re=256*1024,O="three-blocks browser smoke",se=["three-blocks.json","three-blocks.shaders.json","three-blocks.text.ts"];function Q(e){return "kind"in e&&e.kind==="adopted"}a(Q,"isAdoptedProjectStatus");async function C(e,t,r,s){let n=await j(e,t,r,s);return JSON.parse(n.data.toString("utf8"))}a(C,"readJsonWithin");var ne=["starting","worker ready","assets ready","compiled","first frame","updating","error"],ae=["ready","generating","fallback","missing","invalid"],oe=["WebGPU","WebGL"],ie=["OffscreenCanvas","MainThread"],de=/^[0-9A-Za-z][0-9A-Za-z._-]{0,63}$/,X=16,K=1e9;function g(e,t,r,s=[]){if(!a$1(e))throw new Error(`${t} must be an object.`);let n=new Set([...r,...s]);for(let o of r)if(!Object.hasOwn(e,o))throw new Error(`${t}.${o} is required.`);for(let o of Object.keys(e))if(!n.has(o))throw new Error(`${t}.${o} is not supported by schema v1.`);return e}a(g,"exactRecord");function A(e,t,r){if(typeof e!="string"||!t.includes(e))throw new Error(`${r} has an unsupported value.`);return e}a(A,"enumValue");function p(e,t){if(typeof e!="boolean")throw new Error(`${t} must be a boolean.`);return e}a(p,"booleanValue");function Y(e,t){return e===null?null:p(e,t)}a(Y,"nullableBoolean");function E(e,t){if(typeof e!="number"||!Number.isSafeInteger(e)||e<0||e>K)throw new Error(`${t} must be a non-negative integer no greater than ${K}.`);return e}a(E,"boundedCounter");function ce(e){if(typeof e!="string"||e.length>32)throw new Error("Runtime status receipt observedAt must be a bounded ISO timestamp.");let t=Date.parse(e);if(!Number.isFinite(t)||new Date(t).toISOString()!==e)throw new Error("Runtime status receipt observedAt must be an exact ISO timestamp.");return e}a(ce,"observedTimestamp");function ue(e){if(e===null)return null;if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error("Runtime status receipt error must be null or one bounded display-safe line.");return e}a(ue,"receiptError");function le(e){if(!Array.isArray(e)||e.length>X)throw new Error(`Runtime status receipt assets.codecs must contain at most ${X} entries.`);let t=e.map((r,s)=>{let n=g(r,`Runtime status receipt assets.codecs[${s}]`,["name","available","decoded"]);if(typeof n.name!="string"||!de.test(n.name))throw new Error(`Runtime status receipt assets.codecs[${s}].name is invalid.`);let o=p(n.available,`Runtime status receipt assets.codecs[${s}].available`),a=p(n.decoded,`Runtime status receipt assets.codecs[${s}].decoded`);if(a&&!o)throw new Error(`Runtime status receipt codec ${JSON.stringify(n.name)} cannot be decoded when unavailable.`);return {name:n.name,available:o,decoded:a}});if(new Set(t.map(r=>r.name)).size!==t.length)throw new Error("Runtime status receipt assets.codecs must have unique names.");return t}a(le,"parseRuntimeCodecs");function me(e){if(e.assetsReady&&!e.workerReady)throw new Error("Runtime lifecycle assetsReady requires workerReady.");if(e.compiled&&!e.assetsReady)throw new Error("Runtime lifecycle compiled requires assetsReady.");if(e.firstFrame&&!e.compiled)throw new Error("Runtime lifecycle firstFrame requires compiled.");let t=e.state==="starting"?[false,false,false,false]:e.state==="worker ready"?[true,false,false,false]:e.state==="assets ready"?[true,true,false,false]:e.state==="compiled"?[true,true,true,false]:e.state==="first frame"||e.state==="updating"?[true,true,true,true]:null;if(t!==null&&![e.workerReady,e.assetsReady,e.compiled,e.firstFrame].every((r,s)=>r===t[s]))throw new Error(`Runtime lifecycle flags do not match state ${JSON.stringify(e.state)}.`)}a(me,"validateLifecycle");function pe(e){let t=g(e,"Runtime status receipt",["schemaVersion","observedAt","worker","assets","hmr","stats","lifecycle","shaders","error"],["text"]);if(t.schemaVersion!==1)throw new Error("Runtime status receipt must use schemaVersion 1.");let r=g(t.worker,"Runtime status receipt worker",["backend","renderer","protocolVersion"]);if(r.protocolVersion!==1)throw new Error("Runtime status receipt worker.protocolVersion must be 1.");let s=g(t.assets,"Runtime status receipt assets",["codecs","resources"]),n=g(t.hmr,"Runtime status receipt hmr",["capabilities","outcome"]),o=g(n.capabilities,"Runtime status receipt hmr.capabilities",["scene","component","assetManifest","workerRestart"]),a=g(n.outcome,"Runtime status receipt hmr.outcome",["attempted","succeeded","rollbackPreserved","workerRestarted"]),d=p(a.attempted,"Runtime status receipt hmr.outcome.attempted"),l=Y(a.succeeded,"Runtime status receipt hmr.outcome.succeeded"),m=Y(a.rollbackPreserved,"Runtime status receipt hmr.outcome.rollbackPreserved"),y=p(a.workerRestarted,"Runtime status receipt hmr.outcome.workerRestarted");if(d?l===null||m===null:l!==null||m!==null||y)throw new Error("Runtime status receipt HMR outcome fields are inconsistent with attempted.");let S={scene:p(o.scene,"Runtime status receipt hmr.capabilities.scene"),component:p(o.component,"Runtime status receipt hmr.capabilities.component"),assetManifest:p(o.assetManifest,"Runtime status receipt hmr.capabilities.assetManifest"),workerRestart:p(o.workerRestart,"Runtime status receipt hmr.capabilities.workerRestart")};if(d&&!S.scene)throw new Error("Runtime status receipt cannot attempt HMR without the scene capability.");if(y&&!S.workerRestart)throw new Error("Runtime status receipt cannot restart a worker without the workerRestart capability.");let x=g(t.stats,"Runtime status receipt stats",["snapshots","textures","workerProfiler","mainPanels"]),R=g(t.lifecycle,"Runtime status receipt lifecycle",["state","workerReady","assetsReady","compiled","firstFrame"]),k={state:A(R.state,ne,"Runtime status receipt lifecycle.state"),workerReady:p(R.workerReady,"Runtime status receipt lifecycle.workerReady"),assetsReady:p(R.assetsReady,"Runtime status receipt lifecycle.assetsReady"),compiled:p(R.compiled,"Runtime status receipt lifecycle.compiled"),firstFrame:p(R.firstFrame,"Runtime status receipt lifecycle.firstFrame")};me(k);let V=g(t.shaders,"Runtime status receipt shaders",["mode","pipelines"]),P=A(V.mode,["precompiled","live"],"Runtime status receipt shaders.mode"),T=E(V.pipelines,"Runtime status receipt shaders.pipelines");if(P==="precompiled"&&T===0)throw new Error("A precompiled runtime receipt must observe at least one shader pipeline.");let f;if(t.text!==void 0){let I=g(t.text,"Runtime status receipt text",["state","atlases","glyphs","requiredGlyphs"]);if(f={state:A(I.state,ae,"Runtime status receipt text.state"),atlases:E(I.atlases,"Runtime status receipt text.atlases"),glyphs:E(I.glyphs,"Runtime status receipt text.glyphs"),requiredGlyphs:E(I.requiredGlyphs,"Runtime status receipt text.requiredGlyphs")},f.state==="ready"&&(f.atlases===0||f.requiredGlyphs===0||f.glyphs<f.requiredGlyphs))throw new Error("A ready text receipt must cover a non-empty required glyph set with at least one atlas.")}let b=ue(t.error);if(k.state==="error"?b===null:b!==null)throw new Error("Runtime status receipt error must be present only when lifecycle.state is error.");return {schemaVersion:1,observedAt:ce(t.observedAt),worker:{backend:A(r.backend,ie,"Runtime status receipt worker.backend"),renderer:A(r.renderer,oe,"Runtime status receipt worker.renderer"),protocolVersion:1},assets:{codecs:le(s.codecs),resources:E(s.resources,"Runtime status receipt assets.resources")},hmr:{capabilities:S,outcome:{attempted:d,succeeded:l,rollbackPreserved:m,workerRestarted:y}},stats:{snapshots:E(x.snapshots,"Runtime status receipt stats.snapshots"),textures:E(x.textures,"Runtime status receipt stats.textures"),workerProfiler:p(x.workerProfiler,"Runtime status receipt stats.workerProfiler"),mainPanels:p(x.mainPanels,"Runtime status receipt stats.mainPanels")},lifecycle:k,shaders:{mode:P,pipelines:T},...f===void 0?{}:{text:f},error:b}}a(pe,"parseRuntimeStatusReceipt");function he(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(he,"sameCoverage");async function ee(e=process.cwd()){let t=h.resolve(e);for(;;){if((await Promise.all(se.map(s=>d(h.join(t,s))))).some(Boolean))return realpath(t);let r=h.dirname(t);if(r===t)return realpath(h.resolve(e));t=r;}}a(ee,"findProjectRoot");async function fe(e,t){let r=t.template,s=h.join(e,".three-blocks","shaders"),n=h.join(s,"meta.json");if(!await d(s)||!await d(n))return {state:"missing",scene:r,reason:t.artifacts?.shaders==="pending"?"The selected template has no verified shader capture yet.":".three-blocks/shaders/meta.json is absent."};try{let o=await i(e,s,"Shader artifact directory"),a=c(await C(o,n,a$2.receipt,"Shader receipt")),d=a.scenes[r];if(d===void 0)return {state:"invalid",scene:r,reason:`Shader receipt has no "${r}" scene.`};let l=await j(o,h.join(o,d.artifact),a$2.manifest,"Shader manifest");if(c$1(l.data)!==d.artifactHash)return {state:"invalid",scene:r,reason:"The selected shader manifest checksum does not match its receipt."};let m=a$3(l.data.toString("utf8"),l.path,r);if(!he(m,d.coverage))return {state:"invalid",scene:r,reason:"Shader receipt coverage does not match the manifest entries.",coverage:m};let{three:y,threeBlocks:S,threeBlocksShaderClosure:x}=await c$2(e);if(a.runtime.three!==y||t.runtime.three!==y||t.runtime.threeBlocks!==S)return {state:"stale",scene:r,reason:`Installed runtime versions (${y}, ${S}) do not match the metadata and shader receipt.`,coverage:m};if(a.runtime.threeBlocksShaderClosure!==x)return {state:"stale",scene:r,reason:"The installed three-blocks/shaders runtime closure differs from the capture receipt.",coverage:m};let R=await b(e),k=Object.keys(R),V=Object.keys(d.inputs),P=k.filter(b=>!Object.hasOwn(d.inputs,b)),T=V.filter(b=>!Object.hasOwn(R,b)),f=k.filter(b=>Object.hasOwn(d.inputs,b)&&d.inputs[b]!==R[b]);return P.length>0||T.length>0||f.length>0?{state:"stale",scene:r,reason:`${P.length} added, ${T.length} removed, and ${f.length} changed semantic shader inputs.`,coverage:m,...f.length>0?{changedInputs:f}:{},...P.length>0?{addedInputs:P}:{},...T.length>0?{removedInputs:T}:{}}:{state:"fresh",scene:r,reason:"Manifest, installed shader runtime closure, and the shader-relevant source snapshot match.",coverage:m}}catch(o){return {state:"invalid",scene:r,reason:o instanceof Error?o.message:String(o)}}}a(fe,"inspectShaders");async function ye(e,t){if(t.artifacts?.text==="pending")return {state:"missing",reason:"The template has no verified text artifacts yet.",atlases:[]};let r=await g$1(e);return {state:r.state,reason:r.reason,atlases:r.atlases.map(s=>({name:s.font.key,glyphs:s.codePoints.length,width:s.texture.width,height:s.texture.height}))}}a(ye,"inspectText");function Re(e,t){if(e.lifecycle.assetsReady&&e.assets.codecs.some(r=>!r.available))throw new Error("Runtime status receipt claims assets ready while a configured codec is unavailable.");if(t.features.text!==(e.text!==void 0))throw new Error("Runtime status receipt text observation does not match three-blocks.json.")}a(Re,"validateRuntimeReceiptForProject");async function be(e,t){let r=h.join(e,...te.split("/"));if(!await d(r))return {kind:"absent",receipt:null,reason:"No browser observation receipt is available."};try{let s=await i(e,h.dirname(r),"Runtime status receipt directory"),n=pe(await C(s,h.join(s,h.basename(r)),re,"Runtime status receipt"));return Re(n,t),{kind:"valid",receipt:n,reason:n.error??`Browser observation captured at ${n.observedAt}.`}}catch(s){return {kind:"invalid",receipt:null,reason:`Runtime status receipt is invalid: ${s instanceof Error?s.message:String(s)}`}}}a(be,"inspectRuntimeReceipt");function ge(){return {scene:false,component:false,assetManifest:false,workerRestart:false}}a(ge,"emptyCapabilities");function we(){return {attempted:false,succeeded:null,rollbackPreserved:null,workerRestarted:false}}a(we,"emptyOutcome");function ke(){return []}a(ke,"configuredCodecs");function Se(e,t){if(t!==void 0&&t.state!=="ready")return "three-blocks text generate";let r=e.receipt;return e.kind!=="valid"||r===null||r.lifecycle.state==="error"?O:r.text!==void 0&&r.text.state!=="ready"?"three-blocks text generate":O}a(Se,"recoveryCommand");async function xe(e=process.cwd()){let t=await ee(e),r=b$1(await C(t,h.join(t,"three-blocks.json"),a$2.metadata,"Project metadata")),s=await fe(t,r),n=r.features.text?await ye(t,r):void 0,o=await be(t,r),a=o.receipt,d=o.kind==="invalid",l=d||a?.lifecycle.state==="error",m=a===null?{state:d?"error":"starting",backend:null,renderer:null,protocolVersion:1}:{state:l?"error":a.lifecycle.workerReady?"worker ready":"starting",backend:a.worker.backend,renderer:a.worker.renderer,protocolVersion:a.worker.protocolVersion},y=a===null?{state:d?"error":"starting",codecs:ke(),resources:0}:{state:l?"error":a.lifecycle.assetsReady?"assets ready":"starting",codecs:a.assets.codecs,resources:a.assets.resources},S=a===null?{state:d?"error":"starting",capabilities:ge(),outcome:we()}:{state:l||a.hmr.outcome.attempted&&(a.hmr.outcome.succeeded!==true||a.hmr.outcome.rollbackPreserved!==true)?"error":a.hmr.outcome.attempted?"first frame":"starting",capabilities:a.hmr.capabilities,outcome:a.hmr.outcome},x=a===null?{state:d?"error":"starting",snapshots:0,textures:0,workerProfiler:false,mainPanels:false}:{state:l?"error":a.stats.snapshots>0&&a.stats.workerProfiler&&a.stats.mainPanels?"first frame":"starting",...a.stats},R=a===null?{state:d?"error":"starting",mode:null,pipelines:0,artifactState:s.state}:{state:l?"error":a.lifecycle.compiled?s.state==="fresh"?a.shaders.mode:s.state:a.lifecycle.state,mode:a.shaders.mode,pipelines:a.shaders.pipelines,artifactState:s.state},k=n===void 0?void 0:a?.text===void 0?{state:d?"error":"starting",atlases:0,glyphs:0,requiredGlyphs:0}:{state:l?"error":n.state==="ready"?a.text.state:n.state,atlases:a.text.atlases,glyphs:a.text.glyphs,requiredGlyphs:a.text.requiredGlyphs};return {schemaVersion:1,root:t,metadata:r,configuration:{worker:m,assets:y,hmr:S,optimization:R,stats:x,...k===void 0?{}:{text:k}},runtime:{state:d?"error":a?.lifecycle.state??"starting",observed:a!==null,observedAt:a?.observedAt??null,reason:o.reason,recovery:Se(o,n),observation:a},shaders:s,...n?{text:n}:{}}}a(xe,"inspectProject");async function Z(e){let[t,r]=await Promise.all([d(h.join(e,"three-blocks.shaders.json")),d(h.join(e,"three-blocks.text.ts"))]),[s,n]=await Promise.all([t?d$1(e):Promise.resolve(void 0),r?g$1(e):Promise.resolve(void 0)]);return {schemaVersion:1,root:e,kind:"adopted",markers:{shaders:t,text:r},...s===void 0?{}:{shaders:s},...n===void 0?{}:{text:n}}}a(Z,"inspectAdoptedProject");async function qe(e=process.cwd()){let t=await ee(e),r=h.join(t,"three-blocks.json");if(await d(r)){try{b$1(await C(t,r,a$2.metadata,"Project metadata"));}catch{return Z(t)}return xe(t)}return Z(t)}a(qe,"inspectThreeBlocksStatus");function Ge(e){return Q(e)?(e.markers.shaders||e.markers.text)&&(e.shaders===void 0||e.shaders.state==="fresh")&&(e.text===void 0||e.text.state==="ready"):e.shaders.state==="fresh"&&(e.text===void 0||e.text.state==="ready")&&e.runtime.state!=="error"}a(Ge,"threeBlocksStatusIsFresh");function $e(e){return e==="ktx2"?"KTX2":e==="draco"?"Draco":e==="meshopt"?"Meshopt":e}a($e,"codecName");function ve(e,t=Date.now()){let r=t-Date.parse(e);if(!Number.isFinite(r)||r<0)return e;let s=Math.round(r/1e3);if(s<60)return "just now";let n=Math.round(s/60);if(n<60)return `${n} minute${n===1?"":"s"} ago`;let o=Math.round(n/60);return o<48?`${o} hour${o===1?"":"s"} ago`:`${Math.round(o/24)} days ago`}a(ve,"relativeTime");function w(e,t,r){return `${e} ${d$2(t,12)} ${r}`}a(w,"row");function v(e,t){return ` ${d$2(b$2.dim(e),12)} ${b$2.dim(t)}`}a(v,"subRow");function Pe(e){return e<100?e.toFixed(1):Math.round(e).toString()}a(Pe,"milliseconds");function Te(e){return e?`${e.render} render \xB7 ${e.compute} compute`:"no coverage"}a(Te,"coverageText");function je(e){let t=[w(g$2(e.state),"shaders",`${e.state==="fresh"?"fresh":b$2.warn(e.state)} ${c$3.dot} ${b$2.dim(e.reason)}`)];for(let r of e.scenes){let s=r.timing,n=s?.source==="committed-capture"?s.adapter??"captured adapter":"this capture",o=s===void 0?"":s.runs>1?`measured median of ${s.runs}`:"single-capture estimate",a=s===void 0?"":`\u2248${Pe(s.avoidedBuildMs)} ms TSL work avoided`,d=s===void 0?r.state==="fresh"?` ${c$3.dot} ${b$2.dim("capture again to record a timing estimate")}`:"":` ${c$3.dot} ${b$2.dim(`${a} \xB7 ${o} \xB7 ${n}`)}`;t.push(w(g$2(r.state),`${r.scene}:${r.backend}`,`${r.state} ${c$3.dot} ${Te(r.coverage)}${d}`)),s!==void 0&&s.spreadMs>s.avoidedBuildMs*.4&&t.push(v("measure",b$2.warn("noisy measurement \u2014 close other GPU apps and re-run")));let l=[...r.changedInputs??[],...r.addedInputs??[],...r.removedInputs??[]];l.length>0&&t.push(v("changed",l.join(", ")));}return e.state!=="fresh"&&t.push(`${c$3.info} ${b$2.accent("three-blocks shaders capture")}`),t.join(`
|
|
3
|
-
`)}a(je,"formatShaderMatrixStatus");function Ee(e){let t=e.scene,r=e.coverage,s=r?`${r.render} render \xB7 ${r.compute} compute`:"no coverage";if(e.state==="fresh")return [w(g$2("fresh"),t,`fresh ${c$3.dot} ${s} ${c$3.dot} ${b$2.dim("precompiled at runtime")}`)];let n=[w(g$2(e.state),t,`${e.state==="missing"?b$2.dim("missing"):b$2.warn(e.state)} ${c$3.dot} ${b$2.dim(e.reason)}`)],o=[...e.changedInputs??[],...e.addedInputs??[],...e.removedInputs??[]];return o.length>0&&n.push(v("changed",o.join(", "))),n}a(Ee,"shaderRow");function Me(e,t=Date.now()){let r=c$3.mark?`${c$3.mark} `:"",s=e.metadata.runtime,n=[`${r}${b$2.bold("three-blocks")} ${b$2.dim("status")}`,v("project",e.root),"",b$2.bold("Project"),w(c$3.tick,e.metadata.template,`three ${s.three} ${c$3.dot} three-blocks ${s.threeBlocks}`),"",b$2.bold("Shaders"),...Ee(e.shaders)];if(e.text){let d=e.text,l=d.atlases.reduce((m,y)=>m+y.glyphs,0);n.push("",b$2.bold("Text"),w(g$2(d.state),"coverage",d.state==="ready"?`ready ${c$3.dot} ${l} glyphs ${c$3.dot} ${d.atlases.length} atlas${d.atlases.length===1?"":"es"}`:`${b$2.warn(d.state)} ${c$3.dot} ${b$2.dim(d.reason)}`),...d.atlases.map(m=>v("atlas",`${m.name} \xB7 ${m.glyphs} glyphs \xB7 ${m.width}\xD7${m.height}`)));}let o=e.runtime.observation;if(n.push("",b$2.bold("Browser check")),o!==null&&e.runtime.state!=="error"){let d=o.assets.codecs.map(l=>`${$e(l.name)}${l.decoded?"":l.available?" (idle)":" (unavailable)"}`).join(" \xB7 ");n.push(w(c$3.tick,"verified",`${ve(o.observedAt,t)} ${c$3.dot} ${o.worker.renderer} worker ${c$3.dot} ${o.lifecycle.state} ${c$3.dot} ${o.shaders.pipelines} pipeline${o.shaders.pipelines===1?"":"s"} ${o.shaders.mode}`),v("codecs",d||"none configured")),o.hmr.outcome.attempted&&n.push(v("hmr",o.hmr.outcome.succeeded?`update succeeded${o.hmr.outcome.workerRestarted?" \xB7 worker restarted":""}`:"update failed"));}else e.runtime.state==="error"?n.push(w(c$3.cross,"runtime",b$2.danger(e.runtime.reason))):n.push(w(c$3.ring,"unverified",b$2.dim(`no browser run recorded \u2014 ${O}`)));return !(e.shaders.state==="fresh"&&(e.text===void 0||e.text.state==="ready")&&e.runtime.state!=="error")&&(e.runtime.state==="error"||e.runtime.recovery!==O)&&n.push("",b$2.bold("Next"),`${c$3.info} ${b$2.accent(e.runtime.recovery)}`),n.join(`
|
|
4
|
-
`)}a(Me,"formatStatus");function He(e,t=Date.now()){if(!Q(e))return Me(e,t);let r=c$3.mark?`${c$3.mark} `:"",s=e.markers.shaders||e.markers.text,n=[`${r}${b$2.bold("three-blocks")} ${b$2.dim("status")}`,v("project",e.root)];if(!s)return n.push("",`${c$3.dot} ${b$2.dim("no Three Blocks project markers found")}`,` ${b$2.dim("shaders:")} add three-blocks.shaders.json \u2014 /docs/tools/devtools`,` ${b$2.dim("starter:")} npx three-blocks starter`),n.join(`
|
|
5
|
-
`);if(e.shaders!==void 0&&n.push("",b$2.bold("Shaders"),je(e.shaders)),e.text!==void 0){let o=e.text.atlases.reduce((a,d)=>a+d.codePoints.length,0);n.push("",b$2.bold("Text"),w(g$2(e.text.state),"coverage",e.text.state==="ready"?`ready ${c$3.dot} ${o} glyphs ${c$3.dot} ${e.text.atlases.length} atlas${e.text.atlases.length===1?"":"es"}`:`${b$2.warn(e.text.state)} ${c$3.dot} ${b$2.dim(e.text.reason)}`));}return n.join(`
|
|
6
|
-
`)}a(He,"formatThreeBlocksStatus");export{te as a,re as b,O as c,pe as d,ee as e,xe as f,qe as g,Ge as h,je as i,Me as j,He as k};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {b,d,a as a$2}from'./chunk-QJFPNM6W.js';import {a as a$1,c,d as d$1,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$1=ne(),f=F.constants.ZSTD_c_compressionLevel;if(m==="zstd"&&(c$1.zstdCompressSync===void 0||c$1.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$1.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$1.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(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$1(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$1,m,c,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$1=await r.launch({headless:d(e.headed),args:[...b()]}),m=await d$1.newContext({viewport:{width:320,height:240}});let h=await m.newPage(),a=ce(h),l=new Promise((R,H)=>{c=setTimeout(()=>H(new Error(`RoomEnvironment bake timed out after ${e.timeoutMs}ms.`)),e.timeoutMs),c.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&&clearTimeout(c);let u=[];if(await m?.close().catch(i=>u.push(`context: ${i instanceof Error?i.message:String(i)}`)),await d$1?.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 of t.split(p.sep)){n=p.join(n,d),await d$1(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$1(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=p.join(p.dirname(e),`.${p.basename(e)}.${o}.tmp`),m=p.join(p.dirname(t),`.${p.basename(t)}.${o}.tmp`),c=`${d}.backup`,f=`${m}.backup`,u=false,i=false,h=false,a=false;try{await Promise.all([writeFile(d,r,{flag:"wx"}),writeFile(m,n,{encoding:"utf8",flag:"wx"})]),await d$1(e)&&(await rename(e,c),u=!0),await d$1(t)&&(await rename(t,f),i=!0),await rename(d,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,{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$1=se(m.bytes,{cubeSize:t,threeRevision:m.threeRevision,compression:e.compression??"zstd"}),f=`${JSON.stringify(c$1.metadata,null,2)}
|
|
3
|
-
`;await ve(o.asset,c$1.bytes,o.metadata,f);let u=await readFile(o.asset);if(c(u)!==c$1.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$1.bytes.byteLength,metadata:c$1.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{d as canReuseShaderBrowserSession,h as createAttachedPlaywrightShaderDriver,f as createPlaywrightShaderDriver,g as createStaticPlaywrightShaderDriver,e as isRetryableShaderObservationNavigation,c as publicBridgeScript,b as settleShaderParityFrames,a as waitForShaderCaptureAcrossNavigation}from'./chunk-5FT6AZD6.js';import'./chunk-7N6TU4JG.js';import'./chunk-QJFPNM6W.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{h as canReuseShaderBrowserSession,l as createAttachedPlaywrightShaderDriver,j as createPlaywrightShaderDriver,k as createStaticPlaywrightShaderDriver,i as isRetryableShaderObservationNavigation,g as publicBridgeScript,f as settleShaderParityFrames,e as waitForShaderCaptureAcrossNavigation}from'./chunk-45AVKQQK.js';import'./chunk-NF4RFSUJ.js';import'./chunk-EI7MMDWY.js';
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {a}from'./chunk-HOZDD6PW.js';import {PNG}from'pngjs';var x=2/255,E=4096*4096,P=64*1024*1024;function u(t){if(t.byteLength<24||t.byteLength>P||t[0]!==137||t[1]!==80||t[2]!==78||t[3]!==71)throw new Error("Shader screenshot is not a bounded PNG file.");let i=new DataView(t.buffer,t.byteOffset,t.byteLength),n=i.getUint32(16)*i.getUint32(20);if(!Number.isSafeInteger(n)||n<=0||n>E)throw new Error("Shader screenshot dimensions are invalid or exceed the inspection limit.");let a=PNG.sync.read(t),e=a.width*a.height;if(!Number.isSafeInteger(e)||e<=0||e>E)throw new Error("Shader screenshot dimensions are invalid or exceed the inspection limit.");if(a.data.byteLength!==e*4)throw new Error("Shader screenshot has invalid RGBA data.");return a}a(u,"decode");function b(t){let i=0;for(let n=0;n<t.data.byteLength;n+=4){let a=t.data[n]??0,e=t.data[n+1]??0,h=t.data[n+2]??0,d=(t.data[n+3]??0)/255;i+=(.2126*a+.7152*e+.0722*h)*d;}return i/(t.width*t.height*255)}a(b,"imageLuminance");function N(t){let i=u(t);return {width:i.width,height:i.height,luminance:b(i)}}a(N,"shaderScreenshotMetrics");function A(t,i,n,a){if(!Number.isSafeInteger(n)||n<0||n>255)throw new Error("Shader parity channel tolerance must be an integer in 0...255.");if(!Number.isFinite(a)||a<0||a>1)throw new Error("Shader parity maximum diff ratio must be in 0...1.");let e=u(t),h=u(i);if(e.width!==h.width||e.height!==h.height)throw new Error(`Shader parity dimensions differ (${e.width}\xD7${e.height} vs ${h.width}\xD7${h.height}).`);let d=new Uint8Array(e.data.byteLength),c=0,f=0;for(let r=0;r<e.data.byteLength;r+=4){let p=false;for(let o=0;o<4;o++){let s=Math.abs((e.data[r+o]??0)-(h.data[r+o]??0));f=Math.max(f,s),s>n&&(p=true);}if(p)c++,d[r]=255,d[r+1]=24,d[r+2]=24,d[r+3]=255;else {let o=Math.round(.2126*(e.data[r]??0)+.7152*(e.data[r+1]??0)+.0722*(e.data[r+2]??0)),s=Math.round(o*.25);d[r]=s,d[r+1]=s,d[r+2]=s,d[r+3]=255;}}let y=e.width*e.height,w=c/y,g=b(e),m=b(h),S=g>x&&m>x;return {width:e.width,height:e.height,luminance:m,differentPixels:c,totalPixels:y,diffRatio:w,maximumChannelDelta:f,baselineLuminance:g,precompiledLuminance:m,nonBlack:S,matches:S&&w<=a,diff:PNG.sync.write({width:e.width,height:e.height,data:d})}}a(A,"compareShaderScreenshots");export{A as compareShaderScreenshots,N as shaderScreenshotMetrics};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {e}from'./chunk-LKXY5YU2.js';import'./chunk-5FT6AZD6.js';import'./chunk-7N6TU4JG.js';import'./chunk-QJFPNM6W.js';import'./chunk-ZT6T2W4B.js';import {i}from'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {watch}from'fs';import v from'path';var o=class{static{a(this,"ShaderWatchQueue");}#s;#r;#a;#e;#t;#i=false;#n=false;constructor(r){if(this.#s=r.capture,this.#r=r.debounceMs??200,this.#a=r.onError??(()=>{}),!Number.isSafeInteger(this.#r)||this.#r<0||this.#r>6e4)throw new Error("Shader watch debounce must be an integer in 0...60000ms.")}notify(){this.#n||(this.#i=true,!this.#t&&(this.#e&&clearTimeout(this.#e),this.#e=setTimeout(()=>{this.#e=void 0,this.#o();},this.#r)));}#o(){this.#n||this.#t||!this.#i||(this.#i=false,this.#t=this.#s().catch(r=>{this.#a(r instanceof Error?r:new Error(String(r)));}).finally(()=>{this.#t=void 0,this.#i&&!this.#n&&this.notify();}));}async close(){this.#n=true,this.#i=false,this.#e&&clearTimeout(this.#e),this.#e=void 0,await this.#t;}};function y(e){let r=e.split(v.sep).join("/");return r===""||r.startsWith("node_modules/")||r.startsWith(".git/")||r.startsWith("dist/")||r===".three-blocks"||r.startsWith(".three-blocks/")}a(y,"ignored");async function W(e$1={}){let r=e$1.root??await i(e$1.start),d,l=new Promise(t=>{d=t;}),n=new o({...e$1.debounceMs!==void 0?{debounceMs:e$1.debounceMs}:{},...e$1.onError?{onError:e$1.onError}:{},capture:a(async()=>{let t=await e({root:r,...e$1.config?{config:e$1.config}:{},...e$1.driver?{driver:e$1.driver}:{},...e$1.driverKind?{driverKind:e$1.driverKind}:{},...e$1.serve?{serve:e$1.serve}:{},...e$1.url?{url:e$1.url}:{},...e$1.headed!==void 0?{headed:e$1.headed}:{},...e$1.attempts!==void 0?{attempts:e$1.attempts}:{}});e$1.onResult?.(t);},"capture")}),s,u=false,a$1=a(async()=>{u||(u=true,s?.close(),await n.close(),d?.());},"close");return s=watch(r,{recursive:true},(t,f)=>{y(f??"")||n.notify();}),s.on("error",t=>e$1.onError?.(t)),e$1.signal&&(e$1.signal.aborted?await a$1():e$1.signal.addEventListener("abort",()=>{a$1();},{once:true})),e$1.initial!==false&&n.notify(),{root:r,done:l,close:a$1}}a(W,"watchShaders");export{o as ShaderWatchQueue,W as watchShaders};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
export{e as captureShaders,d as inspectShaderMatrix,f as testShaders}from'./chunk-LKXY5YU2.js';import'./chunk-5FT6AZD6.js';import'./chunk-7N6TU4JG.js';import'./chunk-QJFPNM6W.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
|
package/dist/status-PTBB4SW2.js
DELETED
|
@@ -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-ZZLAZ7GJ.js';import'./chunk-IILE5RBI.js';import'./chunk-X5OFYHIY.js';export{c as readInstalledShaderRuntime,b as snapshotShaderInputs}from'./chunk-LKXY5YU2.js';import'./chunk-5FT6AZD6.js';import'./chunk-7N6TU4JG.js';import'./chunk-QJFPNM6W.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NPLE7PPF.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
export{b as TEXT_ATLAS_GENERATOR_VERSION,a as TEXT_ATLAS_SCHEMA_VERSION,c as builtinFontMetadata,e as generateTextAtlases,g as inspectTextAtlases,f as parseTextAtlasReceipt,d as prewarmBuiltinFont}from'./chunk-X5OFYHIY.js';import'./chunk-65VEJRRT.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
|
|
File without changes
|