@three-blocks/devtools 1.0.0-alpha.176.g8ff8a72e6369 → 1.0.0-alpha.190.g3ffe5c0ecc9c
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 +27 -2
- package/LICENSE +1 -2
- package/NOTICE +19 -27
- package/README.md +89 -144
- package/dist/browser/shader-capture.js +2 -2
- package/dist/{browser-smoke-76626IZQ.js → browser-smoke-HB7ZXQGR.js} +1 -1
- package/dist/chunk-3HTNEAVD.cjs +1 -0
- package/dist/chunk-3TQVLKUH.js +14 -0
- package/dist/chunk-54BHFG2E.js +76 -0
- package/dist/{chunk-ZKK6E42X.js → chunk-77HY5X2T.js} +1 -1
- package/dist/chunk-NEWSG5RX.js +3 -0
- package/dist/chunk-UQOPSJR6.js +6 -0
- package/dist/chunk-WNNN3UJI.js +93 -0
- package/dist/chunk-ZKXUYNSG.js +18 -0
- package/dist/cli.js +21 -21
- package/dist/index.d.ts +14 -10
- package/dist/index.js +21 -21
- package/dist/shader-browser-6TM4RNUL.js +2 -0
- package/dist/shader-browser-ZHG2JISC.js +1 -0
- package/dist/shader-capture-server.d.ts +6 -8
- package/dist/shader-capture-server.js +15 -15
- package/dist/{shader-config-4EXO5DKK.js → shader-config-BYBJUL3C.js} +1 -1
- package/dist/{shader-transform-CUkZn5Oa.d.ts → shader-transform-DSFaVrux.d.ts} +2 -0
- package/dist/{shader-watch-QHTNTSZE.js → shader-watch-Z3VGP4QB.js} +1 -1
- package/dist/shader-workflow-SO7WCR4Y.js +2 -0
- package/dist/{status-DV2BYZHR.js → status-CFJSWBDI.js} +1 -1
- package/dist/transform.cjs +1 -1
- package/dist/transform.d.ts +1 -1
- package/dist/transform.js +1 -1
- package/dist/webpack-loader.cjs +1 -1
- package/dist/webpack-loader.d.ts +1 -1
- package/dist/webpack-loader.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-26FK4CRS.js +0 -6
- package/dist/chunk-4EHPYBKA.cjs +0 -1
- package/dist/chunk-HRYYNBVC.js +0 -3
- package/dist/chunk-INDAJN42.js +0 -94
- package/dist/chunk-ME3X2KFY.js +0 -14
- package/dist/chunk-SCJNCGMF.js +0 -17
- package/dist/chunk-VGJ3V4QQ.js +0 -78
- package/dist/shader-browser-65V22LLL.js +0 -1
- package/dist/shader-browser-JII6ZFCW.js +0 -2
- package/dist/shader-workflow-U4G565EB.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export{n as canReuseShaderBrowserSession,r as createAttachedPlaywrightShaderDriver,p as createPlaywrightShaderDriver,q as createStaticPlaywrightShaderDriver,o as isRetryableShaderObservationNavigation,m as publicBridgeScript,l as settleShaderParityFrames,k as waitForShaderCaptureAcrossNavigation}from'./chunk-WNNN3UJI.js';import'./chunk-NE7SC2BX.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NEWSG5RX.js';import'./chunk-ZDNZCQUQ.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{h as canReuseShaderBrowserSession,l as createAttachedPlaywrightShaderDriver,j as createPlaywrightShaderDriver,k as createStaticPlaywrightShaderDriver,i as isRetryableShaderObservationNavigation,g as publicBridgeScript,f as settleShaderParityFrames,e as waitForShaderCaptureAcrossNavigation}from'./chunk-54BHFG2E.js';import'./chunk-ZKXUYNSG.js';import'./chunk-EI7MMDWY.js';
|
|
@@ -11,8 +11,6 @@ interface ShaderSceneConfig {
|
|
|
11
11
|
readonly parityFrames?: number;
|
|
12
12
|
/** Optional scene-specific pixel-difference budget for intrinsically nondeterministic GPU work. */
|
|
13
13
|
readonly maxDiffRatio?: number;
|
|
14
|
-
/** Permit Three's backend pipeline cache to reuse an earlier injected pipeline with identical WGSL. */
|
|
15
|
-
readonly allowPipelineReuse?: boolean;
|
|
16
14
|
/** Require the normal published page's primary canvas to keep changing after startup. */
|
|
17
15
|
readonly runtimeMotion?: boolean;
|
|
18
16
|
}
|
|
@@ -164,21 +162,21 @@ interface ShaderMatrixStatus {
|
|
|
164
162
|
readonly timing?: ShaderTiming;
|
|
165
163
|
}
|
|
166
164
|
/** Inspect all configured manifests without launching Vite, a browser, or a GPU. */
|
|
167
|
-
declare function inspectShaderMatrix(start?: string): Promise<ShaderMatrixStatus>;
|
|
165
|
+
declare function inspectShaderMatrix(start?: string, runtimeOverride?: InstalledShaderRuntime): Promise<ShaderMatrixStatus>;
|
|
168
166
|
|
|
169
|
-
declare const SHADER_PROVIDER_TRANSFORM_VERSION:
|
|
167
|
+
declare const SHADER_PROVIDER_TRANSFORM_VERSION: 50;
|
|
170
168
|
interface ShaderSceneTiming {
|
|
171
169
|
/** Number of registered render/compute NodeBuilder builds covered by the manifest. */
|
|
172
170
|
readonly builds: number;
|
|
173
|
-
/** Cumulative NodeBuilder time
|
|
171
|
+
/** Cumulative NodeBuilder time observed while shaders build live. */
|
|
174
172
|
readonly liveBuildMs: number;
|
|
175
|
-
/**
|
|
173
|
+
/** Observed precompiled time, or zero for the single-capture hydration estimate. */
|
|
176
174
|
readonly precompiledBuildMs: number;
|
|
177
175
|
/** Non-negative live minus precompiled NodeBuilder time. */
|
|
178
176
|
readonly avoidedBuildMs: number;
|
|
179
|
-
/**
|
|
177
|
+
/** One for a capture estimate; greater than one for warmed live/precompiled medians. */
|
|
180
178
|
readonly runs: number;
|
|
181
|
-
/** Maximum absolute per-run
|
|
179
|
+
/** Maximum absolute per-run deviation, or zero for a capture estimate. */
|
|
182
180
|
readonly spreadMs: number;
|
|
183
181
|
}
|
|
184
182
|
interface ShaderLocalTiming {
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import {realpath,readFile,mkdir,readdir,unlink,lstat,open,rename,rm}from'fs/promises';import S from'path';import {THREE_WEBGPU_R185_COMPATIBILITY,parsePrecompiledManifest,SHADER_HYDRATION_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_ADDRESS_SCHEMA_VERSION,PRECOMPILED_MANIFEST_VERSION}from'three-blocks/shaders';import {createHash,randomUUID}from'crypto';import {createRequire}from'module';var pt=Object.defineProperty;var a=(e,t)=>pt(e,"name",{value:t,configurable:true});var k=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 Ce(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:void 0}a(Ce,"errorCode");function A(e){return createHash("sha256").update(e).digest("hex")}a(A,"sha256");async function j(e){try{return await lstat(e),!0}catch(t){if(Ce(t)==="ENOENT")return false;throw t}}a(j,"pathExists");function N(e,t){let r=S.relative(e,t);return r===""||!S.isAbsolute(r)&&r!==".."&&!r.startsWith(`..${S.sep}`)}a(N,"isWithin");function F(e){return JSON.stringify(e)}a(F,"displayPath");async function Ie(e,t,r){let n=await open(e,"r");try{let[s,i,o]=await Promise.all([lstat(e),n.stat(),realpath(e)]);if(s.isSymbolicLink())throw new Error(`${r} must not be a symbolic link: ${F(e)}.`);if(!i.isFile())throw new Error(`${r} must be a regular file: ${F(e)}.`);if(i.size>t)throw new Error(`${r} exceeds the ${t}-byte inspection limit: ${F(e)}.`);let c=await n.readFile();if(c.byteLength>t)throw new Error(`${r} grew beyond the ${t}-byte inspection limit while being read.`);return {path:o,data:c}}finally{await n.close();}}a(Ie,"readBoundedRegularFile");async function Y(e,t){let r=S.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: ${F(e)}.`)}catch(i){if(Ce(i)!=="ENOENT")throw i}let n=S.join(r,`.${S.basename(e)}.${process.pid}.${randomUUID()}.tmp`),s;try{s=await open(n,"wx",384),await s.writeFile(t),await s.sync(),await s.close(),s=void 0,await rename(n,e);}finally{await s?.close().catch(()=>{}),await rm(n,{force:true});}}a(Y,"writeAtomicRegularFile");async function ce(e,t,r){return Ie(e,t,r)}a(ce,"readExternalRegularFile");async function V(e,t,r){let n=S.resolve(e),s=S.resolve(t);if(!N(n,s))throw new Error(`${r} escapes its allowed directory.`);let i=await lstat(s);if(i.isSymbolicLink())throw new Error(`${r} must not be a symbolic link.`);if(!i.isDirectory())throw new Error(`${r} must be a directory.`);let[o,c]=await Promise.all([realpath(n),realpath(s)]);if(!N(o,c))throw new Error(`${r} resolves outside its allowed directory.`);return c}a(V,"canonicalDirectoryWithin");async function $(e,t,r,n){let s=S.resolve(e),i=S.resolve(t);if(!N(s,i)||s===i)throw new Error(`${n} escapes its allowed directory.`);let o=await Ie(i,r,n),c=await realpath(s);if(!N(c,o.path)||c===o.path)throw new Error(`${n} resolves outside its allowed directory.`);return o}a($,"readRegularFileWithin");async function _e(e,t,r,n=8192){let i=[await V(e,t,"Inspected directory")],o=[],c=0;for(;i.length>0;){let f=i.shift();if(f===void 0)break;let h=(await readdir(f,{withFileTypes:true})).sort((y,u)=>y.name.localeCompare(u.name));for(let y of h){if(c+=1,c>n)throw new Error(`Inspected directory exceeds the ${n}-entry limit.`);let u=S.join(f,y.name);if(y.isSymbolicLink())throw new Error(`Inspected directory contains a symbolic link: ${F(S.relative(e,u))}.`);if(y.isDirectory()){i.push(await V(e,u,"Nested inspected directory"));continue}if(y.isFile()&&r(y.name))o.push(u);else if(r(y.name))throw new Error(`Semantic input is not a regular file: ${F(u)}.`)}}return o.sort()}a(_e,"listRegularFilesRecursively");var Z=/^[a-f0-9]{64}$/,bt=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/,Me=/^[a-z0-9][a-z0-9_-]{0,63}$/,Pe=/^[0-9A-Za-z][0-9A-Za-z._/-]{0,127}$/;function l(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}a(l,"isRecord");function H(e){return typeof e=="string"&&bt.test(e)}a(H,"isSafeVersion");function ue(e){if(e.length===0||e.length>512||e.includes("\\")||/[\u0000-\u001f\u007f]/.test(e))return false;let t=e.split("/");return !e.startsWith("/")&&t.every(r=>r.length>0&&r!=="."&&r!=="..")}a(ue,"isSafeRelativePath");function Oe(e){if(!l(e)||e.schemaVersion!==2)throw new Error("three-blocks.json must use schemaVersion 2.");if(typeof e.template!="string"||!Me.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"&&Pe.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"||!Pe.test(e.generator.name)||!H(e.generator.version)))throw new Error("three-blocks.json has invalid generator metadata.");if(!l(e.runtime)||!H(e.runtime.three)||!H(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}}}a(Oe,"parseProjectMetadata");function Et(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}a(Et,"parseCoverage");function Rt(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,s]of r)if(!ue(n)||typeof s!="string"||!Z.test(s))throw new Error(`Shader receipt input for "${t}" is invalid.`)}a(Rt,"parseInputs");function Q(e){if(!l(e)||e.schemaVersion!==2||!l(e.runtime)||!H(e.runtime.three)||!H(e.runtime.threeBlocks)||typeof e.runtime.threeBlocksShaderClosure!="string"||!Z.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){if(!Me.test(r)||!l(n)||typeof n.artifact!="string"||!ue(n.artifact)||!n.artifact.endsWith(".webgpu.ts")||typeof n.artifactHash!="string"||!Z.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"||!ue(n.asset)||!n.asset.endsWith(".json")||typeof n.assetHash!="string"||!Z.test(n.assetHash)))throw new Error(`Shader static asset receipt for "${r}" is invalid.`);if(Rt(n.inputs,r),Et(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"||!H(e.tool.version)||typeof e.tool.compatibility!="string"||!Number.isSafeInteger(e.tool.transform)||!Number.isSafeInteger(e.tool.address)||!Number.isSafeInteger(e.tool.recipe)||!Number.isSafeInteger(e.tool.hydration)))throw new Error("Shader meta.json has invalid tool compatibility metadata.");return e}a(Q,"parseShaderReceipt");var De="three-blocks.shaders.json",pe=".three-blocks/shaders";var xt=/^[a-z0-9][a-z0-9_-]{0,63}$/u,Tt=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u,Ne=64,Be=64,jt={schemaVersion:1,scenes:[{key:"default",url:"/"}]};function ve(e,t,r){if(e===void 0)return r;if(typeof e!="string"||e.length===0||e.length>512||S.isAbsolute(e)||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a bounded project-relative directory.`);let n=S.posix.normalize(e.replaceAll("\\","/")).replace(/\/+$/u,"");if(n==="."||n===".."||n.startsWith("../"))throw new Error(`${t} must stay inside the project.`);return n}a(ve,"safeProjectDirectory");function At(e,t){let r=ve(e,t,"");if(typeof e!="string"||e.endsWith("/"))throw new Error(`${t} must be a project-relative file.`);return r}a(At,"safeProjectFile");function B(e,t,r,n,s){if(e===void 0)return s;if(!Number.isSafeInteger(e)||Number(e)<r||Number(e)>n)throw new Error(`${t} must be an integer in ${r}...${n}.`);return Number(e)}a(B,"boundedInteger");function Le(e,t,r){if(e===void 0)return r;if(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)throw new Error(`${t} must be a finite ratio in 0...1.`);return e}a(Le,"finiteRatio");function Fe(e,t){if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a bounded project-relative URL.`);let r;try{r=new URL(e,"http://three-blocks.invalid/");}catch{throw new Error(`${t} is not a valid URL.`)}if(r.origin!=="http://three-blocks.invalid"||r.hash.length>0)throw new Error(`${t} must stay within the project and must not contain a fragment.`);return `${r.pathname}${r.search}`}a(Fe,"safeBrowserUrl");function $t(e){if(!Array.isArray(e)||e.length===0||e.length>Ne)throw new Error(`Shader config scenes must contain 1...${Ne} entries.`);let t=new Set;return e.map((r,n)=>{if(!l(r)||typeof r.key!="string"||!xt.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 s=r.parityFrames,i=r.maxDiffRatio;if(r.inputs!==void 0&&(!Array.isArray(r.inputs)||r.inputs.length===0||r.inputs.length>Be))throw new Error(`Shader config scene "${r.key}" inputs must contain 1...${Be} files.`);let o=r.inputs===void 0?void 0:r.inputs.map((c,f)=>At(c,`Shader config scene "${r.key}" input ${f}`));if(o!==void 0&&new Set(o).size!==o.length)throw new Error(`Shader config scene "${r.key}" inputs must be unique.`);if(r.allowPipelineReuse!==void 0&&typeof r.allowPipelineReuse!="boolean")throw new Error(`Shader config scene "${r.key}" allowPipelineReuse must be a boolean.`);if(r.runtimeMotion!==void 0&&typeof r.runtimeMotion!="boolean")throw new Error(`Shader config scene "${r.key}" runtimeMotion must be a boolean.`);return {key:r.key,url:Fe(r.url,`Shader config scene "${r.key}" URL`),requiresText:r.requiresText===true,...o===void 0?{}:{inputs:o},...s===void 0?{}:{parityFrames:B(s,`Shader config scene "${r.key}" parityFrames`,0,1e4,0)},...i===void 0?{}:{maxDiffRatio:Le(i,`Shader config scene "${r.key}" maxDiffRatio`,.01)},...r.allowPipelineReuse===true?{allowPipelineReuse:true}:{},...r.runtimeMotion===true?{runtimeMotion:true}:{}}})}a($t,"parseScenes");function fe(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 s=l(n)?n.deterministicModule:void 0;s!==void 0&&Fe(s,"Shader deterministic module");let i=e.readiness;if(i!==void 0&&!l(i))throw new Error("Shader config readiness must be an object.");let o=l(i)?i.selector:void 0;if(o!==void 0&&(typeof o!="string"||o.length===0||o.length>512||/[\u0000-\u001f\u007f]/u.test(o)))throw new Error("Shader readiness selector must be a bounded, non-empty CSS selector.");let c=l(i)?i.global:void 0;if(c!==void 0&&(typeof c!="string"||!Tt.test(c)))throw new Error("Shader readiness global must be a dot-separated JavaScript property path.");return {schemaVersion:1,scenes:$t(e.scenes),settleFrames:B(e.settleFrames,"Shader settleFrames",0,1e4,60),settleTimeoutMs:B(e.settleTimeoutMs,"Shader settleTimeoutMs",1e3,15*6e4,3e4),browserRelaunchScenes:B(e.browserRelaunchScenes,"Shader browserRelaunchScenes",1,64,8),timeoutMs:B(e.timeoutMs,"Shader timeoutMs",1e3,15*6e4,24e4),viewport:{width:B(l(t)?t.width:void 0,"Shader viewport width",64,8192,1024),height:B(l(t)?t.height:void 0,"Shader viewport height",64,8192,640)},parity:{frames:B(l(r)?r.frames:void 0,"Shader parity frames",0,1e4,90),channelTolerance:B(l(r)?r.channelTolerance:void 0,"Shader parity channelTolerance",0,255,8),maxDiffRatio:Le(l(r)?r.maxDiffRatio:void 0,"Shader parity maxDiffRatio",.01)},bridge:{legacyLab:l(n)&&n.legacyLab===true,...typeof s=="string"?{deterministicModule:s}:{}},readiness:{...typeof o=="string"?{selector:o}:{},...typeof c=="string"?{global:c}:{}},publicDir:ve(e.publicDir,"Shader publicDir","public"),allowLiveBuilds:e.allowLiveBuilds!==false}}a(fe,"parseShaderToolConfig");async function Ve(e=process.cwd()){let t=S.resolve(e);for(;;){if(await j(S.join(t,De))||await j(S.join(t,"three-blocks.json")))return realpath(t);let r=S.join(t,"package.json");if(await j(r)){let s=await $(t,r,k.packageJson,"Project package.json"),i;try{i=JSON.parse(s.data.toString("utf8"));}catch{throw new Error(`Project package.json is not valid JSON: ${r}.`)}if(l(i)&&[i.dependencies,i.devDependencies,i.peerDependencies,i.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=S.dirname(t);if(n===t)throw new Error(`No Three Blocks shader project found from ${JSON.stringify(S.resolve(e))}; add Three.js to package.json or pass --root.`);t=n;}}a(Ve,"findShaderProjectRoot");async function me(e){let t=await realpath(e),r=S.join(t,De);if(await j(r)){let s=await $(t,r,k.metadata,"Shader configuration");return fe(JSON.parse(s.data.toString("utf8")))}let n=S.join(t,"three-blocks.json");if(await j(n)){let s=Oe(JSON.parse(await readFile(n,"utf8")));return fe({schemaVersion:1,scenes:[{key:s.template,url:"/",requiresText:s.features.text}]})}return fe(jt)}a(me,"loadShaderToolConfig");var W="0.1.0";var ne=3,_t="timing.local.json",Pt="timing.json";var re=4096,Mt=4096;function he(e,t,r=8192){if(typeof e!="string"||e.length===0||e.length>r||/[\u0000\u007f]/u.test(e))throw new Error(`${t} must be a bounded non-empty string.`);return e}a(he,"boundedString");function R(e,t,r=true){if(typeof e!="number"||!Number.isFinite(e)||e<0||r&&!Number.isSafeInteger(e))throw new Error(`${t} must be a non-negative ${r?"integer":"finite number"}.`);return e}a(R,"nonNegativeNumber");function Ot(e){if(!l(e))throw new Error("Shader capture stats are missing.");let t={buildCalls:R(e.buildCalls,"capture stats.buildCalls"),renderBuilds:R(e.renderBuilds,"capture stats.renderBuilds"),computeBuilds:R(e.computeBuilds,"capture stats.computeBuilds"),registeredBuilds:R(e.registeredBuilds,"capture stats.registeredBuilds"),registeredRenderBuilds:R(e.registeredRenderBuilds,"capture stats.registeredRenderBuilds"),registeredComputeBuilds:R(e.registeredComputeBuilds,"capture stats.registeredComputeBuilds"),buildMs:R(e.buildMs,"capture stats.buildMs",false),injected:R(e.injected,"capture stats.injected"),injectedRender:R(e.injectedRender,"capture stats.injectedRender"),injectedCompute:R(e.injectedCompute,"capture stats.injectedCompute"),missed:R(e.missed,"capture stats.missed"),missedRender:R(e.missedRender,"capture stats.missedRender"),missedCompute:R(e.missedCompute,"capture stats.missedCompute"),...Array.isArray(e.missedKeys)&&e.missedKeys.every(r=>typeof r=="string")?{missedKeys:e.missedKeys.slice(0,re)}:{}};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)throw new Error("Shader capture stats totals are inconsistent.");return t}a(Ot,"captureStats");function Nt(e){if(!Array.isArray(e)||e.length>re)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:he(t.name,`skipped build ${r} name`,512),reason:he(t.reason,`skipped build ${r} reason`)}})}a(Nt,"skippedBuilds");function Bt(e){let t=0,r=0,n=0,s=0;for(let i of Object.values(e.entries)){let o=e.states[i];o!==void 0&&((o.vertex!==null||o.fragment!==null)&&t++,o.vertex!==null&&r++,o.fragment!==null&&n++,o.compute!==null&&s++);}return {render:t,vertex:r,fragment:n,compute:s}}a(Bt,"shaderCoverage");function Dt(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.");if(e.compatibility!==THREE_WEBGPU_R185_COMPATIBILITY)throw new Error(`Shader capture compatibility must be "${THREE_WEBGPU_R185_COMPATIBILITY}".`);if(!l(e.entries))throw new Error("Shader capture entries must be an object.");let r=Object.keys(e.entries).length;if(r===0||r>re)throw new Error(`Shader capture must contain 1...${re} entries.`);if(!Array.isArray(e.errors)||e.errors.length>Mt)throw new Error("Shader capture errors are invalid.");let n=e.errors.map((u,d)=>he(u,`capture error ${d}`,64*1024));if(n.length>0)throw new Error(`Shader capture failed:
|
|
2
|
-
- ${
|
|
3
|
-
- `)}`);let s=
|
|
4
|
-
${e.map(
|
|
1
|
+
import {realpath,readFile,mkdir,readdir,unlink,lstat,open,rename,rm}from'fs/promises';import S from'path';import {parsePrecompiledManifest,SHADER_HYDRATION_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_ADDRESS_SCHEMA_VERSION,PRECOMPILED_MANIFEST_VERSION,THREE_WEBGPU_R185_COMPATIBILITY,THREE_R186DEV_VERSION,THREE_WEBGPU_R186DEV_COMPATIBILITY}from'three-blocks/shaders';import {createHash,randomUUID}from'crypto';import {createRequire}from'module';var mt=Object.defineProperty;var a=(e,r)=>mt(e,"name",{value:r,configurable:true});var x=Object.freeze({metadata:1024*1024,receipt:2*1024*1024,manifest:32*1024*1024,semanticInput:8*1024*1024,semanticTotal:64*1024*1024,metrics:8*1024*1024,texture:128*1024*1024,packageJson:1024*1024});function _e(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:void 0}a(_e,"errorCode");function $(e){return createHash("sha256").update(e).digest("hex")}a($,"sha256");async function A(e){try{return await lstat(e),!0}catch(r){if(_e(r)==="ENOENT")return false;throw r}}a(A,"pathExists");function B(e,r){let t=S.relative(e,r);return t===""||!S.isAbsolute(t)&&t!==".."&&!t.startsWith(`..${S.sep}`)}a(B,"isWithin");function V(e){return JSON.stringify(e)}a(V,"displayPath");async function Pe(e,r,t){let n=await open(e,"r");try{let[i,s,o]=await Promise.all([lstat(e),n.stat(),realpath(e)]);if(i.isSymbolicLink())throw new Error(`${t} must not be a symbolic link: ${V(e)}.`);if(!s.isFile())throw new Error(`${t} must be a regular file: ${V(e)}.`);if(s.size>r)throw new Error(`${t} exceeds the ${r}-byte inspection limit: ${V(e)}.`);let c=await n.readFile();if(c.byteLength>r)throw new Error(`${t} grew beyond the ${r}-byte inspection limit while being read.`);return {path:o,data:c}}finally{await n.close();}}a(Pe,"readBoundedRegularFile");async function ee(e,r){let t=S.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: ${V(e)}.`)}catch(s){if(_e(s)!=="ENOENT")throw s}let n=S.join(t,`.${S.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(ee,"writeAtomicRegularFile");async function fe(e,r,t){return Pe(e,r,t)}a(fe,"readExternalRegularFile");async function H(e,r,t){let n=S.resolve(e),i=S.resolve(r);if(!B(n,i))throw new Error(`${t} escapes its allowed directory.`);let s=await lstat(i);if(s.isSymbolicLink())throw new Error(`${t} must not be a symbolic link.`);if(!s.isDirectory())throw new Error(`${t} must be a directory.`);let[o,c]=await Promise.all([realpath(n),realpath(i)]);if(!B(o,c))throw new Error(`${t} resolves outside its allowed directory.`);return c}a(H,"canonicalDirectoryWithin");async function C(e,r,t,n){let i=S.resolve(e),s=S.resolve(r);if(!B(i,s)||i===s)throw new Error(`${n} escapes its allowed directory.`);let o=await Pe(s,t,n),c=await realpath(i);if(!B(c,o.path)||c===o.path)throw new Error(`${n} resolves outside its allowed directory.`);return o}a(C,"readRegularFileWithin");async function Oe(e,r,t,n=8192){let s=[await H(e,r,"Inspected directory")],o=[],c=0;for(;s.length>0;){let f=s.shift();if(f===void 0)break;let m=(await readdir(f,{withFileTypes:true})).sort((g,u)=>g.name.localeCompare(u.name));for(let g of m){if(c+=1,c>n)throw new Error(`Inspected directory exceeds the ${n}-entry limit.`);let u=S.join(f,g.name);if(g.isSymbolicLink())throw new Error(`Inspected directory contains a symbolic link: ${V(S.relative(e,u))}.`);if(g.isDirectory()){s.push(await H(e,u,"Nested inspected directory"));continue}if(g.isFile()&&t(g.name))o.push(u);else if(t(g.name))throw new Error(`Semantic input is not a regular file: ${V(u)}.`)}}return o.sort()}a(Oe,"listRegularFilesRecursively");var te=/^[a-f0-9]{64}$/,Et=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/,Ne=/^[a-z0-9][a-z0-9_-]{0,63}$/,Me=/^[0-9A-Za-z][0-9A-Za-z._/-]{0,127}$/;function l(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}a(l,"isRecord");function z(e){return typeof e=="string"&&Et.test(e)}a(z,"isSafeVersion");function le(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(le,"isSafeRelativePath");function Be(e){if(!l(e)||e.schemaVersion!==2)throw new Error("three-blocks.json must use schemaVersion 2.");if(typeof e.template!="string"||!Ne.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"&&Me.test(r))||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"||!Me.test(e.generator.name)||!z(e.generator.version)))throw new Error("three-blocks.json has invalid generator metadata.");if(!l(e.runtime)||!z(e.runtime.three)||!z(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}}}a(Be,"parseProjectMetadata");function Rt(e){if(!l(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(Rt,"parseCoverage");function kt(e,r){if(!l(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(!le(n)||typeof i!="string"||!te.test(i))throw new Error(`Shader receipt input for "${r}" is invalid.`)}a(kt,"parseInputs");function re(e){if(!l(e)||e.schemaVersion!==2||!l(e.runtime)||!z(e.runtime.three)||!z(e.runtime.threeBlocks)||typeof e.runtime.threeBlocksShaderClosure!="string"||!te.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(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){if(!Ne.test(t)||!l(n)||typeof n.artifact!="string"||!le(n.artifact)||!n.artifact.endsWith(".webgpu.ts")||typeof n.artifactHash!="string"||!te.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"||!le(n.asset)||!n.asset.endsWith(".json")||typeof n.assetHash!="string"||!te.test(n.assetHash)))throw new Error(`Shader static asset receipt for "${t}" is invalid.`);if(kt(n.inputs,t),Rt(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&&(!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 "${t}" are invalid.`)}if(e.tool!==void 0&&(!l(e.tool)||e.tool.name!=="@three-blocks/devtools"||!z(e.tool.version)||typeof e.tool.compatibility!="string"||!Number.isSafeInteger(e.tool.transform)||!Number.isSafeInteger(e.tool.address)||!Number.isSafeInteger(e.tool.recipe)||!Number.isSafeInteger(e.tool.hydration)))throw new Error("Shader meta.json has invalid tool compatibility metadata.");return e}a(re,"parseShaderReceipt");var Le="three-blocks.shaders.json",he=".three-blocks/shaders";var Tt=/^[a-z0-9][a-z0-9_-]{0,63}$/u,jt=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u,ve=64,De=64,At={schemaVersion:1,scenes:[{key:"default",url:"/"}]};function Fe(e,r,t){if(e===void 0)return t;if(typeof e!="string"||e.length===0||e.length>512||S.isAbsolute(e)||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${r} must be a bounded project-relative directory.`);let n=S.posix.normalize(e.replaceAll("\\","/")).replace(/\/+$/u,"");if(n==="."||n===".."||n.startsWith("../"))throw new Error(`${r} must stay inside the project.`);return n}a(Fe,"safeProjectDirectory");function $t(e,r){let t=Fe(e,r,"");if(typeof e!="string"||e.endsWith("/"))throw new Error(`${r} must be a project-relative file.`);return t}a($t,"safeProjectFile");function v(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(v,"boundedInteger");function Ve(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(Ve,"finiteRatio");function He(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(He,"safeBrowserUrl");function Ct(e){if(!Array.isArray(e)||e.length===0||e.length>ve)throw new Error(`Shader config scenes must contain 1...${ve} entries.`);let r=new Set;return e.map((t,n)=>{if(!l(t)||typeof t.key!="string"||!Tt.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,s=t.maxDiffRatio;if(t.inputs!==void 0&&(!Array.isArray(t.inputs)||t.inputs.length===0||t.inputs.length>De))throw new Error(`Shader config scene "${t.key}" inputs must contain 1...${De} files.`);let o=t.inputs===void 0?void 0:t.inputs.map((c,f)=>$t(c,`Shader config scene "${t.key}" input ${f}`));if(o!==void 0&&new Set(o).size!==o.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.`);return {key:t.key,url:He(t.url,`Shader config scene "${t.key}" URL`),requiresText:t.requiresText===true,...o===void 0?{}:{inputs:o},...i===void 0?{}:{parityFrames:v(i,`Shader config scene "${t.key}" parityFrames`,0,1e4,0)},...s===void 0?{}:{maxDiffRatio:Ve(s,`Shader config scene "${t.key}" maxDiffRatio`,.01)},...t.runtimeMotion===true?{runtimeMotion:true}:{}}})}a(Ct,"parseScenes");function pe(e){if(!l(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&&!l(r))throw new Error("Shader config viewport must be an object.");let t=e.parity;if(t!==void 0&&!l(t))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&&He(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 o=l(s)?s.selector:void 0;if(o!==void 0&&(typeof o!="string"||o.length===0||o.length>512||/[\u0000-\u001f\u007f]/u.test(o)))throw new Error("Shader readiness selector must be a bounded, non-empty CSS selector.");let c=l(s)?s.global:void 0;if(c!==void 0&&(typeof c!="string"||!jt.test(c)))throw new Error("Shader readiness global must be a dot-separated JavaScript property path.");return {schemaVersion:1,scenes:Ct(e.scenes),settleFrames:v(e.settleFrames,"Shader settleFrames",0,1e4,60),settleTimeoutMs:v(e.settleTimeoutMs,"Shader settleTimeoutMs",1e3,15*6e4,3e4),browserRelaunchScenes:v(e.browserRelaunchScenes,"Shader browserRelaunchScenes",1,64,8),timeoutMs:v(e.timeoutMs,"Shader timeoutMs",1e3,15*6e4,24e4),viewport:{width:v(l(r)?r.width:void 0,"Shader viewport width",64,8192,1024),height:v(l(r)?r.height:void 0,"Shader viewport height",64,8192,640)},parity:{frames:v(l(t)?t.frames:void 0,"Shader parity frames",0,1e4,90),channelTolerance:v(l(t)?t.channelTolerance:void 0,"Shader parity channelTolerance",0,255,8),maxDiffRatio:Ve(l(t)?t.maxDiffRatio:void 0,"Shader parity maxDiffRatio",.01)},bridge:{legacyLab:l(n)&&n.legacyLab===true,...typeof i=="string"?{deterministicModule:i}:{}},readiness:{...typeof o=="string"?{selector:o}:{},...typeof c=="string"?{global:c}:{}},publicDir:Fe(e.publicDir,"Shader publicDir","public"),allowLiveBuilds:e.allowLiveBuilds!==false}}a(pe,"parseShaderToolConfig");async function ze(e=process.cwd()){let r=S.resolve(e);for(;;){if(await A(S.join(r,Le))||await A(S.join(r,"three-blocks.json")))return realpath(r);let t=S.join(r,"package.json");if(await A(t)){let i=await C(r,t,x.packageJson,"Project package.json"),s;try{s=JSON.parse(i.data.toString("utf8"));}catch{throw new Error(`Project package.json is not valid JSON: ${t}.`)}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(r)}let n=S.dirname(r);if(n===r)throw new Error(`No Three Blocks shader project found from ${JSON.stringify(S.resolve(e))}; add Three.js to package.json or pass --root.`);r=n;}}a(ze,"findShaderProjectRoot");async function ge(e){let r=await realpath(e),t=S.join(r,Le);if(await A(t)){let i=await C(r,t,x.metadata,"Shader configuration");return pe(JSON.parse(i.data.toString("utf8")))}let n=S.join(r,"three-blocks.json");if(await A(n)){let i=Be(JSON.parse(await readFile(n,"utf8")));return pe({schemaVersion:1,scenes:[{key:i.template,url:"/",requiresText:i.features.text}]})}return pe(At)}a(ge,"loadShaderToolConfig");function J(e){if(/^0\.185\./u.test(e))return THREE_WEBGPU_R185_COMPATIBILITY;if(e===THREE_R186DEV_VERSION)return THREE_WEBGPU_R186DEV_COMPATIBILITY;throw new Error(`Three.js ${e} is outside the supported shader compatibility contracts.`)}a(J,"shaderCompatibilityForThree");var G="0.1.0";var se=50,Nt="timing.local.json",Bt="timing.json";var ie=4096,vt=4096;function ye(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(ye,"boundedString");function R(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(R,"nonNegativeNumber");function Dt(e){if(!l(e))throw new Error("Shader capture stats are missing.");let r={buildCalls:R(e.buildCalls,"capture stats.buildCalls"),renderBuilds:R(e.renderBuilds,"capture stats.renderBuilds"),computeBuilds:R(e.computeBuilds,"capture stats.computeBuilds"),registeredBuilds:R(e.registeredBuilds,"capture stats.registeredBuilds"),registeredRenderBuilds:R(e.registeredRenderBuilds,"capture stats.registeredRenderBuilds"),registeredComputeBuilds:R(e.registeredComputeBuilds,"capture stats.registeredComputeBuilds"),buildMs:R(e.buildMs,"capture stats.buildMs",false),injected:R(e.injected,"capture stats.injected"),injectedRender:R(e.injectedRender,"capture stats.injectedRender"),injectedCompute:R(e.injectedCompute,"capture stats.injectedCompute"),missed:R(e.missed,"capture stats.missed"),missedRender:R(e.missedRender,"capture stats.missedRender"),missedCompute:R(e.missedCompute,"capture stats.missedCompute"),...Array.isArray(e.missedKeys)&&e.missedKeys.every(t=>typeof t=="string")?{missedKeys:e.missedKeys.slice(0,ie)}:{}};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)throw new Error("Shader capture stats totals are inconsistent.");return r}a(Dt,"captureStats");function Lt(e){if(!Array.isArray(e)||e.length>ie)throw new Error("Shader capture skipped builds are invalid.");return e.map((r,t)=>{if(!l(r)||r.kind!=="render"&&r.kind!=="compute")throw new Error(`Shader capture skipped build ${t} is invalid.`);return {kind:r.kind,name:ye(r.name,`skipped build ${t} name`,512),reason:ye(r.reason,`skipped build ${t} reason`)}})}a(Lt,"skippedBuilds");function Ft(e){let r=0,t=0,n=0,i=0;for(let s of Object.values(e.entries)){let o=e.states[s];o!==void 0&&((o.vertex!==null||o.fragment!==null)&&r++,o.vertex!==null&&t++,o.fragment!==null&&n++,o.compute!==null&&i++);}return {render:r,vertex:t,fragment:n,compute:i}}a(Ft,"shaderCoverage");function Vt(e,r){if(!l(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=J(r.runtime.three);if(e.compatibility!==t)throw new Error(`Shader capture compatibility must be "${t}".`);if(!l(e.entries))throw new Error("Shader capture entries must be an object.");let n=Object.keys(e.entries).length;if(n===0||n>ie)throw new Error(`Shader capture must contain 1...${ie} entries.`);if(!Array.isArray(e.errors)||e.errors.length>vt)throw new Error("Shader capture errors are invalid.");let i=e.errors.map((p,d)=>ye(p,`capture error ${d}`,64*1024));if(i.length>0)throw new Error(`Shader capture failed:
|
|
2
|
+
- ${i.join(`
|
|
3
|
+
- `)}`);let s=Lt(e.skipped),o=Dt(e.stats),c=l(e.timing)?e.timing:void 0,f=c===void 0?void 0:Object.fromEntries(["launch","firstRequest","readiness","lastBuild","settled","posted"].flatMap(p=>{let d=c[p];if(d===void 0)return [];if(typeof d!="number"||!Number.isFinite(d)||d<0)throw new Error(`Shader capture timing.${p} is invalid.`);return [[p,d]]})),m;if(e.provenance!==void 0){if(!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(p=>typeof p=="string"&&p.length<=128))throw new Error("Shader capture provenance is invalid.");m={userAgent:e.provenance.userAgent,adapter:e.provenance.adapter,features:[...new Set(e.provenance.features)].sort()};}let g=parsePrecompiledManifest({version:PRECOMPILED_MANIFEST_VERSION,scene:r.scene,three:r.runtime.three,threeBlocks:r.runtime.threeBlocks,runtime:{id:t,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION},...e.automatic===void 0?{}:{automatic:e.automatic},modules:e.modules,nodes:e.nodes,layouts:e.layouts,attributePlans:e.attributePlans,updatePlans:e.updatePlans,requirementPlans:e.requirementPlans,states:e.states,entries:e.entries}),u=Ft(g);if(o.registeredRenderBuilds<u.render||o.registeredComputeBuilds<u.compute)throw new Error("Shader capture did not live-build every distinct registered render/compute entry.");return {scene:r.scene,manifest:g,skipped:s,stats:o,coverage:u,...f===void 0?{}:{timing:f},...m===void 0?{}:{provenance:m}}}a(Vt,"validateShaderCapture");function U(e,r=0){let t=" ".repeat(r),n=" ".repeat(r+1);if(Array.isArray(e))return e.length===0?"[]":e.every(s=>s===null||["number","string","boolean"].includes(typeof s))?JSON.stringify(e):`[
|
|
4
|
+
${e.map(s=>`${n}${U(s,r+1)}`).join(`,
|
|
5
5
|
`)}
|
|
6
|
-
${
|
|
7
|
-
${o.map(c=>{let f=
|
|
6
|
+
${t}]`;if(e!==null&&typeof e=="object"){let s=e,o=Object.keys(s).sort();return o.length===0?"{}":`{
|
|
7
|
+
${o.map(c=>{let f=s[c];return `${n}${JSON.stringify(c)}: ${U(f,r+1)}`}).join(`,
|
|
8
8
|
`)}
|
|
9
|
-
${
|
|
10
|
-
`)}a(
|
|
11
|
-
`;await
|
|
12
|
-
`),
|
|
13
|
-
`?(
|
|
14
|
-
`,n="code"):
|
|
9
|
+
${t}}`}let i=JSON.stringify(e);if(i===void 0)throw new Error("Shader artifact contains a non-serializable value.");return i}a(U,"stableStringify");function Ht(e){return ["// GENERATED FILE \u2014 do not edit by hand.","// Produced by @three-blocks/devtools.","import type { PrecompiledManifest } from 'three-blocks/shaders';","",`export default ${U(e)} satisfies PrecompiledManifest;`,""].join(`
|
|
10
|
+
`)}a(Ht,"serializeShaderManifest");function Je(e,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(Je,"timingLabel");function zt(e){if(!l(e)||e.schemaVersion!==3||e.source!=="latest-local-capture"&&e.source!=="committed-capture"||typeof e.receiptHash!="string"||!/^[a-f0-9]{64}$/u.test(e.receiptHash)||typeof e.measuredAt!="string"||!Number.isFinite(Date.parse(e.measuredAt))||!l(e.scenes))throw new Error("Shader timing is invalid.");let r={};for(let[n,i]of Object.entries(e.scenes)){if(n.length===0||n.length>128||!l(i))throw new Error("Shader timing scene is invalid.");let s={builds:R(i.builds,`timing ${n}.builds`),liveBuildMs:R(i.liveBuildMs,`timing ${n}.liveBuildMs`,false),precompiledBuildMs:R(i.precompiledBuildMs,`timing ${n}.precompiledBuildMs`,false),avoidedBuildMs:R(i.avoidedBuildMs,`timing ${n}.avoidedBuildMs`,false),runs:R(i.runs,`timing ${n}.runs`),spreadMs:R(i.spreadMs,`timing ${n}.spreadMs`,false)};if(s.runs<1)throw new Error(`Shader timing runs are invalid for scene "${n}".`);if(Math.abs(s.avoidedBuildMs-Math.max(0,s.liveBuildMs-s.precompiledBuildMs))>.001)throw new Error(`Shader timing delta is inconsistent for scene "${n}".`);r[n]=s;}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:Je(e.adapter,"Shader timing adapter"),platform:Je(e.platform,"Shader timing platform")}}a(zt,"parseShaderTiming");async function Ge(e,r,t,n){let i=S.join(e,t);try{if(!await A(i))return;let s=await lstat(i);if(s.isSymbolicLink()||!s.isFile()||s.size>1024*1024)return;let o=zt(JSON.parse(await readFile(i,"utf8")));return o.source===n&&o.receiptHash===$(r)?o:void 0}catch{return}}a(Ge,"readShaderTimingFile");async function et(e,r){return await Ge(e,r,Nt,"latest-local-capture")??await Ge(e,r,Bt,"committed-capture")}a(et,"readShaderTiming");async function qe(e){if(!await A(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(qe,"assertDirectory");async function Ut(e){let r=S.resolve(e),t=S.join(r,".three-blocks");await qe(t);let n=S.join(t,"shaders");return await qe(n),n}a(Ut,"artifactRoot");async function Wt(e){let r=await Ut(e.root),t=J(e.runtime.three),n=S.resolve(e.root),i=S.resolve(n,e.publicDirectory??"public");if(!B(n,i)||i===n)throw new Error("Shader public directory must stay inside the project root.");let s=S.join(i,"three-blocks","shaders");await mkdir(s,{recursive:true}),await H(n,s,"Shader static-asset directory");let o={},c=[];for(let d of [...e.scenes].sort((h,b)=>h.key.localeCompare(b.key))){let h=e.captures.get(d.key),b=e.inputs.get(d.key);if(b===void 0)throw new Error(`Shader input matrix is missing scene "${d.key}".`);if(h===void 0){let E=e.previousReceipt?.scenes[d.key];if(E===void 0)throw new Error(`Capture matrix is missing scene "${d.key}".`);let y=await readFile(S.join(r,E.artifact));if($(y)!==E.artifactHash)throw new Error(`Preserved shader artifact checksum differs for scene "${d.key}".`);if(E.asset!==void 0&&E.assetHash!==void 0){let k=await readFile(S.join(i,E.asset));if($(k)!==E.assetHash)throw new Error(`Preserved static shader manifest checksum differs for scene "${d.key}".`)}o[d.key]={...E,inputs:Object.fromEntries(Object.entries(b).sort(([k],[F])=>k.localeCompare(F)))},c.push(E.artifact),E.asset!==void 0&&c.push(S.relative(n,S.join(i,E.asset)).split(S.sep).join("/"));continue}if(h.scene!==d.key||h.manifest.scene!==d.key)throw new Error(`Capture matrix scene "${d.key}" is inconsistent.`);let T=`${d.key}.webgpu.ts`,P=Ht(h.manifest);await ee(S.join(r,T),P),c.push(T);let O=`three-blocks/shaders/${d.key}.json`,N=`${U(h.manifest)}
|
|
11
|
+
`;await ee(S.join(i,O),N),c.push(S.relative(n,S.join(i,O)).split(S.sep).join("/"));let I=h.skipped.filter(E=>E.kind==="render").length,L=h.skipped.length-I;o[d.key]={artifact:T,artifactHash:$(P),asset:O,assetHash:$(N),inputs:Object.fromEntries(Object.entries(b).sort(([E],[y])=>E.localeCompare(y))),coverage:h.coverage,bytes:Buffer.byteLength(P),skipped:{render:I,compute:L}};}let f=[...e.captures.values()].find(d=>d.provenance!==void 0)?.provenance??e.previousReceipt?.runtime.capture,m={schemaVersion:2,runtime:{...e.runtime,...f===void 0?{}:{capture:f}},tool:{name:"@three-blocks/devtools",version:G,compatibility:t,transform:se,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION},scenes:o},g=new Set(c);for(let d of await readdir(r,{withFileTypes:true}))if(!(!d.name.endsWith(".webgpu.ts")||g.has(d.name))){if(d.isSymbolicLink()||!d.isFile())throw new Error(`Orphan shader artifact is not a regular file: ${d.name}.`);await unlink(S.join(r,d.name));}let u=new Set(e.scenes.map(d=>`${d.key}.json`)),p=new Set(Object.values(e.previousReceipt?.scenes??{}).map(d=>d.asset===void 0?void 0:S.posix.basename(d.asset)).filter(d=>d!==void 0));try{let d=re(JSON.parse(await readFile(S.join(r,"meta.json"),"utf8")));for(let h of Object.values(d.scenes))h.asset!==void 0&&p.add(S.posix.basename(h.asset));}catch{}for(let d of await readdir(s,{withFileTypes:true}))if(!(!d.name.endsWith(".json")||u.has(d.name))&&p.has(d.name)){if(d.isSymbolicLink()||!d.isFile())throw new Error(`Orphan shader static asset is not a regular file: ${d.name}.`);await unlink(S.join(s,d.name));}return await ee(S.join(r,"meta.json"),`${U(m)}
|
|
12
|
+
`),c.push("meta.json"),{directory:r,receipt:m,files:c}}a(Wt,"writeShaderArtifacts");var we=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".wgsl",".glsl",".vert",".frag",".json",".css"],be=new Set(we),Se=/^(?:three-blocks\.shaders\.json|(?:precompile|three-blocks\.shaders)\.config\.(?:cjs|cts|js|mjs|mts|ts))$/u,Gt=/(?:^|\/)scene\.(?:cjs|cts|js|jsx|mjs|mts|ts|tsx)$/u,qt=/\b(?:export\s+)?(?:async\s+)?function\s+createScene\b|\bcreateScene\s*=\s*(?:async\s*)?\(/u,Kt=/\b(?:[A-Za-z_$][\w$]*\.)*(?:shaders|shaderCache|sceneShaders)\s*\.\s*(?:material|pipeline|compute|container)\s*\(/u,Xt=/\b(import|export)(?!\s*\()\s*(type\b\s*)?(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']/gu,Yt=/\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,Zt=/\b(?:import|export)(?!\s*\()\s*(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']|\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,Qt=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/u,Ee=4096,er="./shaders";function nt(e,r){let t=S.relative(e,r).split(S.sep).join("/");if(t.length===0||/[\u0000-\u001f\u007f]/u.test(t))throw new Error("Semantic input has an unsafe relative path.");return t}a(nt,"portableRelativePath");function Re(e,r){try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{throw new Error(`Shader-relevant source ${JSON.stringify(r)} is not valid UTF-8.`)}}a(Re,"sourceText");function xe(e,r){let t="",n="code";for(let i=0;i<e.length;i++){let s=e[i]??"",o=e[i+1]??"";if(n==="code"){if(s==="/"&&o==="/"){t+=" ",n="line-comment",i++;continue}if(s==="/"&&o==="*"){t+=" ",n="block-comment",i++;continue}if(s==="'"||s==='"'||s==="`"){n=s==="'"?"single":s==='"'?"double":"template",t+=r?s:" ";continue}t+=s;continue}if(n==="line-comment"){s===`
|
|
13
|
+
`?(t+=`
|
|
14
|
+
`,n="code"):t+=" ";continue}if(n==="block-comment"){s==="*"&&o==="/"?(t+=" ",n="code",i++):t+=s===`
|
|
15
15
|
`?`
|
|
16
|
-
`:" ";continue}let c=n==="single"?"'":n==="double"?'"':"`";if(
|
|
16
|
+
`:" ";continue}let c=n==="single"?"'":n==="double"?'"':"`";if(s==="\\"&&o.length>0){t+=r?`${s}${o}`:" ",i++;continue}t+=r?s:s===`
|
|
17
17
|
`?`
|
|
18
|
-
`:" ",
|
|
19
|
-
`);return A(c)}a(tr,"shaderRuntimeClosure");async function xe(e){let[t,r]=await Promise.all([Qe(e,"three"),Qe(e,"three-blocks")]);return {three:String(t.manifest.version),threeBlocks:String(r.manifest.version),threeBlocksShaderClosure:await tr(r.root,r.manifest)}}a(xe,"readInstalledShaderRuntime");var J;async function nr(){J===void 0&&(J=(async()=>{let t=createRequire(S.join(process.cwd(),"package.json")).resolve("@three-blocks/devtools/browser/shader-capture"),r=S.resolve(S.dirname(t),"../..");return (await $(r,t,k.metadata,"Shader capture browser runtime")).data.toString("utf8")})());let e=J;try{return await e}catch(t){throw J===e&&(J=void 0),t}}a(nr,"loadShaderCaptureRuntimeSource");var nt=4096,sr=createRequire(import.meta.url),it,w=new Proxy({},{get(e,t){return it??=sr("typescript"),Reflect.get(it,t)}});function v(e){let t=e;for(;w.isParenthesizedExpression(t)||w.isAsExpression(t)||w.isSatisfiesExpression(t)||w.isNonNullExpression(t);)t=t.expression;return t}a(v,"unwrap");function or(e){if(w.isIdentifier(e)||w.isStringLiteral(e)||w.isNumericLiteral(e))return e.text}a(or,"propertyName");function ie(e,t){let r=new Map;for(let n of e.properties){if(!w.isPropertyAssignment(n))throw new Error(`${t} may contain only static property assignments.`);let s=or(n.name);if(s===void 0||r.has(s))throw new Error(`${t} contains a computed or duplicate property.`);r.set(s,n.initializer);}return r}a(ie,"properties");function se(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=v(e);if(!w.isObjectLiteralExpression(r))throw new Error(`${t} must be a static object literal.`);return r}a(se,"objectLiteral");function oe(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=v(e);if(!w.isStringLiteral(r)&&!w.isNoSubstitutionTemplateLiteral(r))throw new Error(`${t} must be a string literal.`);return r.text}a(oe,"stringLiteral");function ae(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=v(e);if(!w.isNumericLiteral(r))throw new Error(`${t} must be a numeric literal.`);return Number(r.text)}a(ae,"numericLiteral");function st(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=v(e);if(!w.isArrayLiteralExpression(r))throw new Error(`${t} must be a static array literal.`);return r.elements}a(st,"arrayLiteral");function ar(e,t){if(e===void 0)throw new Error(`${t} is missing.`);let r=v(e);if(r.kind===w.SyntaxKind.NullKeyword)return null;if(!w.isNumericLiteral(r))throw new Error(`${t} must be null or a numeric literal.`);return Number(r.text)}a(ar,"numericOrNullLiteral");function dr(e){return e.parseDiagnostics??[]}a(dr,"parseDiagnostics");function ot(e,t,r,n){let s=w.createSourceFile(t,e,w.ScriptTarget.Latest,true,w.ScriptKind.TS),i=dr(s);if(i.length>0)throw new Error(`Shader manifest is not valid TypeScript: ${w.flattenDiagnosticMessageText(i[0]?.messageText??"parse error"," ")}`);let o=s.statements.filter(w.isExportAssignment).filter(p=>!p.isExportEquals);if(o.length!==1)throw new Error("Shader manifest must contain exactly one default export.");let c=ie(se(o[0]?.expression,"Shader manifest default export"),"Shader manifest"),f=c.get("version");if(f===void 0||!w.isNumericLiteral(v(f))||Number(v(f).getText(s))!==3)throw new Error("Shader manifest version must be the numeric literal 3.");if(oe(c.get("scene"),"Shader manifest scene")!==r)throw new Error(`Shader manifest scene does not match "${r}".`);if(n){if(oe(c.get("three"),"Shader manifest Three.js version")!==n.three||oe(c.get("threeBlocks"),"Shader manifest Three Blocks version")!==n.threeBlocks)throw new Error("Shader manifest runtime versions do not match its receipt.");let p=ie(se(c.get("runtime"),"Shader manifest runtime"),"Shader manifest runtime");if(oe(p.get("id"),"Shader manifest runtime id")!==n.compatibility||ae(p.get("address"),"Shader manifest address schema")!==n.address||ae(p.get("recipe"),"Shader manifest recipe schema")!==n.recipe||ae(p.get("hydration"),"Shader manifest hydration schema")!==n.hydration)throw new Error("Shader manifest runtime compatibility schemas do not match its receipt.")}let h=ie(se(c.get("entries"),"Shader manifest entries"),"Shader manifest entries");if(h.size===0||h.size>nt)throw new Error(`Shader manifest must contain between 1 and ${nt} entries.`);let y=st(c.get("modules"),"Shader manifest modules").map((p,g)=>{let E=v(p);if(!w.isStringLiteral(E)&&!w.isNoSubstitutionTemplateLiteral(E))throw new Error(`Shader manifest module ${g} must be a WGSL string literal.`);if(E.text.length===0)throw new Error(`Shader manifest module ${g} is empty.`);return E.text}),u=st(c.get("states"),"Shader manifest states").map((p,g)=>{let E=ie(se(p,`Shader manifest state ${g}`),`Shader manifest state ${g}`),x=a((D,m)=>{let b=ar(E.get(D),`Shader manifest state ${g} ${D}`);if(b===null)return false;let _=y[b];if(_===void 0||!_.includes(m))throw new Error(`Shader manifest state ${g} ${D} does not reference a ${m} module.`);return true},"moduleAt"),P=x("vertex","@vertex"),C=x("fragment","@fragment"),O=x("compute","@compute");if(O&&(P||C))throw new Error(`Shader manifest state ${g} mixes render and compute stages.`);if(!O&&!P&&!C)throw new Error(`Shader manifest state ${g} contains no shader stage.`);return {vertex:P,fragment:C,compute:O}}),d={render:0,vertex:0,fragment:0,compute:0};for(let[p,g]of h){if(p.length===0||/[\u0000-\u001f\u007f]/.test(p))throw new Error("Shader manifest contains an invalid entry key.");let E=ae(g,`Shader manifest entry "${p}"`),x=u[E];if(x===void 0)throw new Error(`Shader manifest entry "${p}" references an absent state.`);(x.vertex||x.fragment)&&(d.render+=1),x.vertex&&(d.vertex+=1),x.fragment&&(d.fragment+=1),x.compute&&(d.compute+=1);}return d}a(ot,"inspectPrecompiledManifest");function cr(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(cr,"sameCoverage");function ur(e){let t=e.some(n=>n.state==="invalid")?"invalid":e.some(n=>n.state==="missing")?"missing":e.some(n=>n.state==="stale")?"stale":"fresh",r=e.filter(n=>n.state===t);return {state:t,reason:t==="fresh"?`${e.length} configured shader scene${e.length===1?" is":"s are"} fresh.`:r.map(n=>`${n.scene}: ${n.reason}`).join("; ")}}a(ur,"classifyMatrix");function fr(e){let t=e.tool;if(!t)return "Shader receipt has no public tool compatibility metadata.";if(t.compatibility!==THREE_WEBGPU_R185_COMPATIBILITY)return "Shader receipt targets a different runtime compatibility contract.";if(t.transform!==ne)return "Shader receipt uses a different provider transform version.";if(t.address!==SHADER_ADDRESS_SCHEMA_VERSION||t.recipe!==SHADER_RECIPE_SCHEMA_VERSION||t.hydration!==SHADER_HYDRATION_SCHEMA_VERSION)return "Shader receipt uses incompatible address, recipe, or hydration schemas."}a(fr,"exactToolCompatibility");function lr(e,t){let r=Object.keys(t).filter(i=>Object.hasOwn(e,i)&&e[i]!==t[i]),n=Object.keys(t).filter(i=>!Object.hasOwn(e,i)),s=Object.keys(e).filter(i=>!Object.hasOwn(t,i));return {...r.length>0?{changedInputs:r}:{},...n.length>0?{addedInputs:n}:{},...s.length>0?{removedInputs:s}:{}}}a(lr,"inputChanges");async function pr(e=process.cwd()){let t=await Ve(e),r=await me(t),n=S.join(t,pe),s=a(()=>({schemaVersion:1,root:t,state:"missing",reason:`${pe}/meta.json is absent.`,scenes:r.scenes.map(i=>({scene:i.key,state:"missing",reason:"No committed shader receipt."}))}),"missing");if(!await j(n)||!await j(S.join(n,"meta.json")))return s();try{let i=await V(t,n,"Shader artifact directory"),o=await $(i,S.join(i,"meta.json"),k.receipt,"Shader receipt"),c=Q(JSON.parse(o.data.toString("utf8"))),f=await Ze(i,o.data),h=await xe(t),y=new Set(r.scenes.map(m=>m.key)),d=Object.keys(c.scenes).filter(m=>!y.has(m));if(d.length>0)throw new Error(`Shader receipt contains unconfigured scenes: ${d.join(", ")}.`);let p=fr(c);if(p)throw new Error(p);if(!/^0\.185\./u.test(h.three))throw new Error(`Installed Three.js ${h.three} is outside the r185 capture contract.`);let g=c.runtime.three!==h.three||c.runtime.threeBlocks!==h.threeBlocks,E=c.runtime.threeBlocksShaderClosure!==h.threeBlocksShaderClosure,x=c.tool?.version!==W,P=S.join(t,r.publicDir??"public"),C=[];for(let m of r.scenes){let b=c.scenes[m.key];if(!b){C.push({scene:m.key,state:"missing",reason:"Scene is absent from the complete receipt matrix."});continue}let _=await $(i,S.join(i,b.artifact),k.manifest,"Shader manifest");if(A(_.data)!==b.artifactHash)throw new Error(`Shader artifact checksum differs for scene "${m.key}".`);if(b.asset!==void 0&&b.assetHash!==void 0){let lt=await $(P,S.join(P,b.asset),k.manifest,"Static shader manifest");if(A(lt.data)!==b.assetHash)throw new Error(`Static shader manifest checksum differs for scene "${m.key}".`)}if(b.bytes!==void 0&&b.bytes!==_.data.byteLength)throw new Error(`Shader artifact byte count differs for scene "${m.key}".`);let L=ot(_.data.toString("utf8"),_.path,m.key,{three:c.runtime.three,threeBlocks:c.runtime.threeBlocks,compatibility:THREE_WEBGPU_R185_COMPATIBILITY,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION});if(!cr(L,b.coverage))throw new Error(`Shader coverage differs for scene "${m.key}".`);if(!r.allowLiveBuilds&&b.skipped&&b.skipped.render+b.skipped.compute>0)throw new Error(`Scene "${m.key}" contains skipped live builds but allowLiveBuilds is false.`);let ft=await ke(t,m.inputs),q=lr(b.inputs,ft),G=(q.changedInputs?.length??0)+(q.addedInputs?.length??0)+(q.removedInputs?.length??0),je=g||E||x||G>0,Ae=f?.scenes[m.key],de=Ae===void 0||f===void 0?void 0:{...Ae,schemaVersion:f.schemaVersion,measuredAt:f.measuredAt,source:f.source,...f.source==="committed-capture"?{adapter:f.adapter,platform:f.platform}:{}};C.push({scene:m.key,state:je?"stale":"fresh",reason:g?"Installed runtime versions differ from the receipt.":E?"Installed three-blocks/shaders runtime closure differs from the receipt.":x?`Receipt was generated by @three-blocks/devtools ${c.tool?.version??"unknown"}.`:G>0?`${G} semantic shader input${G===1?"":"s"} changed.`:"Manifest, runtime, schemas, transform, and semantic inputs match.",coverage:L,...!je&&de!==void 0&&de.builds===L.render+L.compute?{timing:de}:{},...q});}let O=ur(C),D=O.state==="fresh"&&f!==void 0&&C.every(m=>m.timing!==void 0)?f:void 0;return {schemaVersion:1,root:t,...O,scenes:C,runtime:h,receipt:c,...D===void 0?{}:{timing:D}}}catch(i){let o=i instanceof Error?i.message:String(i);return {schemaVersion:1,root:t,state:"invalid",reason:o,scenes:r.scenes.map(c=>({scene:c.key,state:"invalid",reason:o}))}}}a(pr,"inspectShaderMatrix");export{ne as SHADER_PROVIDER_TRANSFORM_VERSION,pr as inspectShaderMatrix,nr as loadShaderCaptureRuntimeSource,me as loadShaderToolConfig,xe as readInstalledShaderRuntime,ke as snapshotShaderInputs,z as stableStringify,Dt as validateShaderCapture,Vt as writeShaderArtifacts};
|
|
18
|
+
`:" ",s===c&&(n="code");}return t}a(xe,"lexicalSource");function tr(e){let r=new Set,t=xe(e,true);for(let n of t.matchAll(Xt))n[2]===void 0&&n[3]!==void 0&&r.add(n[3]);for(let n of t.matchAll(Yt))n[1]!==void 0&&r.add(n[1]);return [...r].sort()}a(tr,"importSpecifiers");function rr(e){let r=new Set;for(let t of xe(e,true).matchAll(Zt)){let n=t[1]??t[2];n!==void 0&&r.add(n);}return [...r].sort()}a(rr,"runtimeSpecifiers");function it(e){return (e.split(/[?#]/u,1)[0]??e).replaceAll("\\","/")}a(it,"cleanSpecifier");function nr(e,r,t){let n=it(r),i;if(n.startsWith("./")||n.startsWith("../"))i=S.posix.normalize(S.posix.join(S.posix.dirname(e),n));else if(n.startsWith("@/"))i=`src/${n.slice(2)}`;else if(n.startsWith("/src/"))i=n.slice(1);else return;if(i===".three-blocks"||i.startsWith(".three-blocks/"))return;let s=S.posix.extname(i).toLowerCase(),o=new Set([i]);if(s.length===0||!be.has(s)){for(let c of we)o.add(`${i}${c}`);for(let c of we)o.add(`${i}/index${c}`);}else if([".js",".mjs",".cjs",".jsx"].includes(s)){let c=i.slice(0,-s.length);for(let f of [".ts",".tsx",".mts",".cts"])o.add(`${c}${f}`);}return [...o].find(c=>t.has(c))}a(nr,"resolveProjectImport");function ir(e,r){let t=xe(r,false);return Gt.test(e)||qt.test(t)||Kt.test(t)}a(ir,"isShaderRoot");async function Te(e,r){let t=await realpath(e);if(r!==void 0){let u={},p=0;for(let d of r){let h=await C(t,S.join(t,d),x.semanticInput,"Declared shader semantic input");if(p+=h.data.byteLength,p>x.semanticTotal)throw new Error("Declared shader semantic inputs exceed the total inspection size limit.");u[d]=$(h.data);}return u}let n=new Map,i=S.join(t,"src");if(await A(i))for(let u of await Oe(t,i,p=>be.has(S.extname(p).toLowerCase()))){let p=await C(t,u,x.semanticInput,"Shader semantic input");n.set(nt(t,u),p.data);}for(let u of await readdir(t,{withFileTypes:true})){if(!u.isFile()||!Se.test(u.name)&&!be.has(S.extname(u.name).toLowerCase()))continue;let p=await C(t,S.join(t,u.name),x.semanticInput,Se.test(u.name)?"Shader configuration input":"Shader semantic input");n.set(u.name,p.data);}if(n.size>Ee)throw new Error(`Shader input discovery exceeds the ${Ee}-file limit.`);let s=new Set,o=new Map;for(let[u,p]of n){if(!u.includes("/")&&Se.test(u)&&s.add(u),!u.startsWith("src/"))continue;let d=Re(p,u);o.set(u,d),ir(u,d)&&s.add(u);}if(s.size===0)throw new Error("No shader registration or scene source root was found.");let c=new Set,f=[...s].sort();for(;f.length>0;){let u=f.shift();if(u===void 0||c.has(u))continue;let p=n.get(u);if(p===void 0)continue;c.add(u);let d=o.get(u)??Re(p,u);for(let h of tr(d)){let b=nr(u,h,n);b!==void 0&&!c.has(b)&&f.push(b);}f.sort();}let m=0,g={};for(let u of [...c].sort()){let p=n.get(u);if(p===void 0)throw new Error(`Shader input ${JSON.stringify(u)} disappeared during inspection.`);if(m+=p.byteLength,m>x.semanticTotal)throw new Error("Semantic shader inputs exceed the total inspection size limit.");g[u]=$(p);}return g}a(Te,"snapshotShaderInputs");function ke(e){if(typeof e=="string")return e;if(l(e))return ke(e.import)??ke(e.default)}a(ke,"conditionalImportTarget");async function tt(e,r){let t=e;for(;;){let n=S.join(t,"node_modules",...r.split("/"),"package.json");if(await A(n)){let s=await fe(n,x.packageJson,`${r} package.json`),o=JSON.parse(s.data.toString("utf8"));if(!l(o)||o.name!==r||typeof o.version!="string"||!Qt.test(o.version))throw new Error(`Installed ${r} package metadata is invalid.`);return {root:S.dirname(s.path),manifest:o}}let i=S.dirname(t);if(i===t)break;t=i;}throw new Error(`Cannot verify the installed ${r} package.`)}a(tt,"findInstalledPackage");async function sr(e,r){if(!l(r.exports))throw new Error("Installed three-blocks package has no public exports map.");let t=ke(r.exports[er]);if(t===void 0||!t.startsWith("./"))throw new Error("Installed three-blocks shader export has no import target.");let n=await realpath(e),i=[S.resolve(n,t)],s=new Map,o=0;for(;i.length>0;){let f=i.shift();if(f===void 0)break;let m=await fe(f,x.semanticInput,"Three Blocks shader runtime module");if(!B(n,m.path)||m.path===n)throw new Error("Three Blocks shader runtime closure escapes its package.");let g=nt(n,m.path);if(s.has(g))continue;if(o+=m.data.byteLength,o>x.semanticTotal)throw new Error("Three Blocks shader runtime closure exceeds the inspection limit.");s.set(g,$(m.data));let u=Re(m.data,g);for(let p of rr(u)){let d=it(p);if(!d.startsWith("./")&&!d.startsWith("../"))continue;let h=S.resolve(S.dirname(m.path),d);if(!B(n,h))throw new Error("Three Blocks shader runtime import escapes its package.");i.push(h);}if(i.sort(),s.size+i.length>Ee)throw new Error("Three Blocks shader runtime closure exceeds the file limit.")}let c=[...s].sort((f,m)=>f[0].localeCompare(m[0])).map(([f,m])=>`${f}\0${m}`).join(`
|
|
19
|
+
`);return $(c)}a(sr,"shaderRuntimeClosure");async function je(e){let[r,t]=await Promise.all([tt(e,"three"),tt(e,"three-blocks")]);return {three:String(r.manifest.version),threeBlocks:String(t.manifest.version),threeBlocksShaderClosure:await sr(t.root,t.manifest)}}a(je,"readInstalledShaderRuntime");var q;async function ar(){q===void 0&&(q=(async()=>{let r=createRequire(S.join(process.cwd(),"package.json")).resolve("@three-blocks/devtools/browser/shader-capture"),t=S.resolve(S.dirname(r),"../..");return (await C(t,r,x.metadata,"Shader capture browser runtime")).data.toString("utf8")})());let e=q;try{return await e}catch(r){throw q===e&&(q=void 0),r}}a(ar,"loadShaderCaptureRuntimeSource");var st=4096,cr=createRequire(import.meta.url),ot,w=new Proxy({},{get(e,r){return ot??=cr("typescript"),Reflect.get(ot,r)}});function D(e){let r=e;for(;w.isParenthesizedExpression(r)||w.isAsExpression(r)||w.isSatisfiesExpression(r)||w.isNonNullExpression(r);)r=r.expression;return r}a(D,"unwrap");function ur(e){if(w.isIdentifier(e)||w.isStringLiteral(e)||w.isNumericLiteral(e))return e.text}a(ur,"propertyName");function oe(e,r){let t=new Map;for(let n of e.properties){if(!w.isPropertyAssignment(n))throw new Error(`${r} may contain only static property assignments.`);let i=ur(n.name);if(i===void 0||t.has(i))throw new Error(`${r} contains a computed or duplicate property.`);t.set(i,n.initializer);}return t}a(oe,"properties");function ae(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=D(e);if(!w.isObjectLiteralExpression(t))throw new Error(`${r} must be a static object literal.`);return t}a(ae,"objectLiteral");function de(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=D(e);if(!w.isStringLiteral(t)&&!w.isNoSubstitutionTemplateLiteral(t))throw new Error(`${r} must be a string literal.`);return t.text}a(de,"stringLiteral");function ce(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=D(e);if(!w.isNumericLiteral(t))throw new Error(`${r} must be a numeric literal.`);return Number(t.text)}a(ce,"numericLiteral");function at(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=D(e);if(!w.isArrayLiteralExpression(t))throw new Error(`${r} must be a static array literal.`);return t.elements}a(at,"arrayLiteral");function fr(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let t=D(e);if(t.kind===w.SyntaxKind.NullKeyword)return null;if(!w.isNumericLiteral(t))throw new Error(`${r} must be null or a numeric literal.`);return Number(t.text)}a(fr,"numericOrNullLiteral");function lr(e){return e.parseDiagnostics??[]}a(lr,"parseDiagnostics");function dt(e,r,t,n){let i=w.createSourceFile(r,e,w.ScriptTarget.Latest,true,w.ScriptKind.TS),s=lr(i);if(s.length>0)throw new Error(`Shader manifest is not valid TypeScript: ${w.flattenDiagnosticMessageText(s[0]?.messageText??"parse error"," ")}`);let o=i.statements.filter(w.isExportAssignment).filter(d=>!d.isExportEquals);if(o.length!==1)throw new Error("Shader manifest must contain exactly one default export.");let c=oe(ae(o[0]?.expression,"Shader manifest default export"),"Shader manifest"),f=c.get("version");if(f===void 0||!w.isNumericLiteral(D(f))||Number(D(f).getText(i))!==3)throw new Error("Shader manifest version must be the numeric literal 3.");if(de(c.get("scene"),"Shader manifest scene")!==t)throw new Error(`Shader manifest scene does not match "${t}".`);if(n){if(de(c.get("three"),"Shader manifest Three.js version")!==n.three||de(c.get("threeBlocks"),"Shader manifest Three Blocks version")!==n.threeBlocks)throw new Error("Shader manifest runtime versions do not match its receipt.");let d=oe(ae(c.get("runtime"),"Shader manifest runtime"),"Shader manifest runtime");if(de(d.get("id"),"Shader manifest runtime id")!==n.compatibility||ce(d.get("address"),"Shader manifest address schema")!==n.address||ce(d.get("recipe"),"Shader manifest recipe schema")!==n.recipe||ce(d.get("hydration"),"Shader manifest hydration schema")!==n.hydration)throw new Error("Shader manifest runtime compatibility schemas do not match its receipt.")}let m=oe(ae(c.get("entries"),"Shader manifest entries"),"Shader manifest entries");if(m.size===0||m.size>st)throw new Error(`Shader manifest must contain between 1 and ${st} entries.`);let g=at(c.get("modules"),"Shader manifest modules").map((d,h)=>{let b=D(d);if(!w.isStringLiteral(b)&&!w.isNoSubstitutionTemplateLiteral(b))throw new Error(`Shader manifest module ${h} must be a WGSL string literal.`);if(b.text.length===0)throw new Error(`Shader manifest module ${h} is empty.`);return b.text}),u=at(c.get("states"),"Shader manifest states").map((d,h)=>{let b=oe(ae(d,`Shader manifest state ${h}`),`Shader manifest state ${h}`),T=a((I,L)=>{let E=fr(b.get(I),`Shader manifest state ${h} ${I}`);if(E===null)return false;let y=g[E];if(y===void 0||!y.includes(L))throw new Error(`Shader manifest state ${h} ${I} does not reference a ${L} module.`);return true},"moduleAt"),P=T("vertex","@vertex"),O=T("fragment","@fragment"),N=T("compute","@compute");if(N&&(P||O))throw new Error(`Shader manifest state ${h} mixes render and compute stages.`);if(!N&&!P&&!O)throw new Error(`Shader manifest state ${h} contains no shader stage.`);return {vertex:P,fragment:O,compute:N}}),p={render:0,vertex:0,fragment:0,compute:0};for(let[d,h]of m){if(d.length===0||/[\u0000-\u001f\u007f]/.test(d))throw new Error("Shader manifest contains an invalid entry key.");let b=ce(h,`Shader manifest entry "${d}"`),T=u[b];if(T===void 0)throw new Error(`Shader manifest entry "${d}" references an absent state.`);(T.vertex||T.fragment)&&(p.render+=1),T.vertex&&(p.vertex+=1),T.fragment&&(p.fragment+=1),T.compute&&(p.compute+=1);}return p}a(dt,"inspectPrecompiledManifest");function pr(e,r){return e.render===r.render&&e.vertex===r.vertex&&e.fragment===r.fragment&&e.compute===r.compute}a(pr,"sameCoverage");function mr(e){let r=e.some(n=>n.state==="invalid")?"invalid":e.some(n=>n.state==="missing")?"missing":e.some(n=>n.state==="stale")?"stale":"fresh",t=e.filter(n=>n.state===r);return {state:r,reason:r==="fresh"?`${e.length} configured shader scene${e.length===1?" is":"s are"} fresh.`:t.map(n=>`${n.scene}: ${n.reason}`).join("; ")}}a(mr,"classifyMatrix");function hr(e,r){let t=e.tool;if(!t)return "Shader receipt has no public tool compatibility metadata.";if(t.compatibility!==r)return "Shader receipt targets a different runtime compatibility contract.";if(t.transform!==se)return "Shader receipt uses a different provider transform version.";if(t.address!==SHADER_ADDRESS_SCHEMA_VERSION||t.recipe!==SHADER_RECIPE_SCHEMA_VERSION||t.hydration!==SHADER_HYDRATION_SCHEMA_VERSION)return "Shader receipt uses incompatible address, recipe, or hydration schemas."}a(hr,"exactToolCompatibility");function gr(e,r){let t=Object.keys(r).filter(s=>Object.hasOwn(e,s)&&e[s]!==r[s]),n=Object.keys(r).filter(s=>!Object.hasOwn(e,s)),i=Object.keys(e).filter(s=>!Object.hasOwn(r,s));return {...t.length>0?{changedInputs:t}:{},...n.length>0?{addedInputs:n}:{},...i.length>0?{removedInputs:i}:{}}}a(gr,"inputChanges");async function yr(e=process.cwd(),r){let t=await ze(e),n=await ge(t),i=S.join(t,he),s=a(()=>({schemaVersion:1,root:t,state:"missing",reason:`${he}/meta.json is absent.`,scenes:n.scenes.map(o=>({scene:o.key,state:"missing",reason:"No committed shader receipt."}))}),"missing");if(!await A(i)||!await A(S.join(i,"meta.json")))return s();try{let o=await H(t,i,"Shader artifact directory"),c=await C(o,S.join(o,"meta.json"),x.receipt,"Shader receipt"),f=re(JSON.parse(c.data.toString("utf8"))),m=await et(o,c.data),g=r??await je(t),u=J(g.three),p=new Set(n.scenes.map(y=>y.key)),h=Object.keys(f.scenes).filter(y=>!p.has(y));if(h.length>0)throw new Error(`Shader receipt contains unconfigured scenes: ${h.join(", ")}.`);let b=hr(f,u);if(b)throw new Error(b);let T=f.runtime.three!==g.three||f.runtime.threeBlocks!==g.threeBlocks,P=f.runtime.threeBlocksShaderClosure!==g.threeBlocksShaderClosure,O=f.tool?.version!==G,N=S.join(t,n.publicDir??"public"),I=[];for(let y of n.scenes){let k=f.scenes[y.key];if(!k){I.push({scene:y.key,state:"missing",reason:"Scene is absent from the complete receipt matrix."});continue}let F=await C(o,S.join(o,k.artifact),x.manifest,"Shader manifest");if($(F.data)!==k.artifactHash)throw new Error(`Shader artifact checksum differs for scene "${y.key}".`);if(k.asset!==void 0&&k.assetHash!==void 0){let pt=await C(N,S.join(N,k.asset),x.manifest,"Static shader manifest");if($(pt.data)!==k.assetHash)throw new Error(`Static shader manifest checksum differs for scene "${y.key}".`)}if(k.bytes!==void 0&&k.bytes!==F.data.byteLength)throw new Error(`Shader artifact byte count differs for scene "${y.key}".`);let K=dt(F.data.toString("utf8"),F.path,y.key,{three:f.runtime.three,threeBlocks:f.runtime.threeBlocks,compatibility:u,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION});if(!pr(K,k.coverage))throw new Error(`Shader coverage differs for scene "${y.key}".`);if(!n.allowLiveBuilds&&k.skipped&&k.skipped.render+k.skipped.compute>0)throw new Error(`Scene "${y.key}" contains skipped live builds but allowLiveBuilds is false.`);let lt=await Te(t,y.inputs),X=gr(k.inputs,lt),Y=(X.changedInputs?.length??0)+(X.addedInputs?.length??0)+(X.removedInputs?.length??0),$e=T||P||O||Y>0,Ce=m?.scenes[y.key],ue=Ce===void 0||m===void 0?void 0:{...Ce,schemaVersion:m.schemaVersion,measuredAt:m.measuredAt,source:m.source,...m.source==="committed-capture"?{adapter:m.adapter,platform:m.platform}:{}};I.push({scene:y.key,state:$e?"stale":"fresh",reason:T?"Installed runtime versions differ from the receipt.":P?"Installed three-blocks/shaders runtime closure differs from the receipt.":O?`Receipt was generated by @three-blocks/devtools ${f.tool?.version??"unknown"}.`:Y>0?`${Y} semantic shader input${Y===1?"":"s"} changed.`:"Manifest, runtime, schemas, transform, and semantic inputs match.",coverage:K,...!$e&&ue!==void 0&&ue.builds===K.render+K.compute?{timing:ue}:{},...X});}let L=mr(I),E=L.state==="fresh"&&m!==void 0&&I.every(y=>y.timing!==void 0)?m:void 0;return {schemaVersion:1,root:t,...L,scenes:I,runtime:g,receipt:f,...E===void 0?{}:{timing:E}}}catch(o){let c=o instanceof Error?o.message:String(o);return {schemaVersion:1,root:t,state:"invalid",reason:c,scenes:n.scenes.map(f=>({scene:f.key,state:"invalid",reason:c}))}}}a(yr,"inspectShaderMatrix");export{se as SHADER_PROVIDER_TRANSFORM_VERSION,yr as inspectShaderMatrix,ar as loadShaderCaptureRuntimeSource,ge as loadShaderToolConfig,je as readInstalledShaderRuntime,Te as snapshotShaderInputs,U as stableStringify,Vt as validateShaderCapture,Wt as writeShaderArtifacts};
|
|
@@ -1,2 +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,h as ensureShaderToolConfig,e as findShaderProjectRoot,g as inferShaderCaptureTarget,f as loadShaderToolConfig,d as parseShaderToolConfig}from'./chunk-
|
|
2
|
+
export{b as SHADER_ARTIFACT_DIRECTORY,c as SHADER_PARITY_DIRECTORY,a as SHADER_TOOL_CONFIG_FILE,h as ensureShaderToolConfig,e as findShaderProjectRoot,g as inferShaderCaptureTarget,f as loadShaderToolConfig,d as parseShaderToolConfig}from'./chunk-NEWSG5RX.js';import'./chunk-ZDNZCQUQ.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
|
|
@@ -20,6 +20,8 @@ interface AppliedShaderProviderTransform {
|
|
|
20
20
|
}
|
|
21
21
|
interface ApplyShaderProviderTransformOptions {
|
|
22
22
|
readonly instrumentCapture?: boolean;
|
|
23
|
+
/** Exact Three.js runtime revision for unreleased compatibility fixtures. */
|
|
24
|
+
readonly threeRevision?: string;
|
|
23
25
|
/**
|
|
24
26
|
* Optional side-effect import that installs the browser capture runtime.
|
|
25
27
|
* Vite uses its virtual module; static builds leave this unset and let the
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {e as e$1}from'./chunk-
|
|
2
|
+
import {e as e$1}from'./chunk-3TQVLKUH.js';import'./chunk-WNNN3UJI.js';import'./chunk-NE7SC2BX.js';import'./chunk-ZT6T2W4B.js';import {e}from'./chunk-NEWSG5RX.js';import'./chunk-ZDNZCQUQ.js';import'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {watch}from'fs';import v from'path';var o=class{static{a(this,"ShaderWatchQueue");}#s;#r;#a;#e;#t;#i=false;#n=false;constructor(r){if(this.#s=r.capture,this.#r=r.debounceMs??200,this.#a=r.onError??(()=>{}),!Number.isSafeInteger(this.#r)||this.#r<0||this.#r>6e4)throw new Error("Shader watch debounce must be an integer in 0...60000ms.")}notify(){this.#n||(this.#i=true,!this.#t&&(this.#e&&clearTimeout(this.#e),this.#e=setTimeout(()=>{this.#e=void 0,this.#o();},this.#r)));}#o(){this.#n||this.#t||!this.#i||(this.#i=false,this.#t=this.#s().catch(r=>{this.#a(r instanceof Error?r:new Error(String(r)));}).finally(()=>{this.#t=void 0,this.#i&&!this.#n&&this.notify();}));}async close(){this.#n=true,this.#i=false,this.#e&&clearTimeout(this.#e),this.#e=void 0,await this.#t;}};function y(e){let r=e.split(v.sep).join("/");return r===""||r.startsWith("node_modules/")||r.startsWith(".git/")||r.startsWith("dist/")||r===".three-blocks"||r.startsWith(".three-blocks/")}a(y,"ignored");async function W(e$2={}){let r=e$2.root??await e(e$2.start),d,l=new Promise(t=>{d=t;}),n=new o({...e$2.debounceMs!==void 0?{debounceMs:e$2.debounceMs}:{},...e$2.onError?{onError:e$2.onError}:{},capture:a(async()=>{let t=await e$1({root:r,...e$2.config?{config:e$2.config}:{},...e$2.driver?{driver:e$2.driver}:{},...e$2.driverKind?{driverKind:e$2.driverKind}:{},...e$2.serve?{serve:e$2.serve}:{},...e$2.url?{url:e$2.url}:{},...e$2.headed!==void 0?{headed:e$2.headed}:{},...e$2.attempts!==void 0?{attempts:e$2.attempts}:{}});e$2.onResult?.(t);},"capture")}),s,u=false,a$1=a(async()=>{u||(u=true,s?.close(),await n.close(),d?.());},"close");return s=watch(r,{recursive:true},(t,f)=>{y(f??"")||n.notify();}),s.on("error",t=>e$2.onError?.(t)),e$2.signal&&(e$2.signal.aborted?await a$1():e$2.signal.addEventListener("abort",()=>{a$1();},{once:true})),e$2.initial!==false&&n.notify(),{root:r,done:l,close:a$1}}a(W,"watchShaders");export{o as ShaderWatchQueue,W as watchShaders};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export{e as captureShaders,d as inspectShaderMatrix,f as testShaders}from'./chunk-3TQVLKUH.js';import'./chunk-WNNN3UJI.js';import'./chunk-NE7SC2BX.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NEWSG5RX.js';import'./chunk-ZDNZCQUQ.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
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-
|
|
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-UQOPSJR6.js';import'./chunk-76WRV5MZ.js';import'./chunk-JMS5NTP7.js';export{c as readInstalledShaderRuntime,b as snapshotShaderInputs}from'./chunk-3TQVLKUH.js';import'./chunk-WNNN3UJI.js';import'./chunk-NE7SC2BX.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NEWSG5RX.js';import'./chunk-ZDNZCQUQ.js';import'./chunk-5L2VS3BN.js';import'./chunk-HOZDD6PW.js';
|
package/dist/transform.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunk3HTNEAVD_cjs=require('./chunk-3HTNEAVD.cjs');Object.defineProperty(exports,"THREE_BLOCKS_WEBPACK_LOADER",{enumerable:true,get:function(){return chunk3HTNEAVD_cjs.b}});Object.defineProperty(exports,"createEsbuildShaderPlugin",{enumerable:true,get:function(){return chunk3HTNEAVD_cjs.g}});Object.defineProperty(exports,"createRollupShaderPlugin",{enumerable:true,get:function(){return chunk3HTNEAVD_cjs.h}});Object.defineProperty(exports,"resolveShaderAdapterThreeVersion",{enumerable:true,get:function(){return chunk3HTNEAVD_cjs.e}});Object.defineProperty(exports,"transformThreeWebGPUModule",{enumerable:true,get:function(){return chunk3HTNEAVD_cjs.f}});Object.defineProperty(exports,"withThreeBlocksNext",{enumerable:true,get:function(){return chunk3HTNEAVD_cjs.d}});Object.defineProperty(exports,"withThreeBlocksWebpack",{enumerable:true,get:function(){return chunk3HTNEAVD_cjs.c}});
|
package/dist/transform.d.ts
CHANGED
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-
|
|
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-77HY5X2T.js';import'./chunk-ZKXUYNSG.js';import'./chunk-EI7MMDWY.js';
|
package/dist/webpack-loader.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunk3HTNEAVD_cjs=require('./chunk-3HTNEAVD.cjs');function o(e){return chunk3HTNEAVD_cjs.f(e,this.resourcePath,this.getOptions?.()??{})?.code??e}chunk3HTNEAVD_cjs.a(o,"threeBlocksShaderLoader");module.exports=o;
|
package/dist/webpack-loader.d.ts
CHANGED
package/dist/webpack-loader.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {e}from'./chunk-
|
|
1
|
+
import {e}from'./chunk-77HY5X2T.js';import'./chunk-ZKXUYNSG.js';import {a}from'./chunk-EI7MMDWY.js';function o(e$1){return e(e$1,this.resourcePath,this.getOptions?.()??{})?.code??e$1}a(o,"threeBlocksShaderLoader");export{o as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@three-blocks/devtools",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.190.g3ffe5c0ecc9c",
|
|
4
4
|
"description": "Three Blocks devtools command engine for npx three-blocks; the runtime lives in three-blocks/devtools and the Vite plugin",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"three",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"@types/three": "0.185.0",
|
|
80
80
|
"create-vite": "9.1.1",
|
|
81
81
|
"playwright": "^1.61.1",
|
|
82
|
-
"three-blocks": "0.2.0-alpha.
|
|
82
|
+
"three-blocks": "0.2.0-alpha.190.g3ffe5c0ecc9c",
|
|
83
83
|
"tsup": "^8.0.0",
|
|
84
84
|
"typescript": "^5.9.3",
|
|
85
85
|
"vite": "^7.2.2",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"peerDependencies": {
|
|
92
92
|
"playwright": "^1.61.1",
|
|
93
93
|
"three": ">=0.185.0 <0.186.0",
|
|
94
|
-
"three-blocks": "0.2.0-alpha.
|
|
94
|
+
"three-blocks": "0.2.0-alpha.190.g3ffe5c0ecc9c",
|
|
95
95
|
"typescript": ">=5.9.3 <7.0.0",
|
|
96
96
|
"vite": ">=7.2.2 <9.0.0"
|
|
97
97
|
},
|
package/dist/chunk-26FK4CRS.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-76WRV5MZ.js';import {g as g$1}from'./chunk-JMS5NTP7.js';import {a as a$3,c as c$2,b,d as d$1}from'./chunk-ME3X2KFY.js';import {a as a$1,c,b as b$1}from'./chunk-ZDNZCQUQ.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 re=".three-blocks/runtime/status.json",se=256*1024,H="three-blocks browser smoke",ne=["three-blocks.json","three-blocks.shaders.json","three-blocks.text.ts"];function ee(e){return "kind"in e&&e.kind==="adopted"}a(ee,"isAdoptedProjectStatus");async function O(e,t,r,s){let n=await j(e,t,r,s);return JSON.parse(n.data.toString("utf8"))}a(O,"readJsonWithin");var ae=["starting","worker ready","assets ready","compiled","first frame","updating","error"],oe=["ready","generating","fallback","missing","invalid"],ie=["WebGPU","WebGL"],de=["OffscreenCanvas","MainThread"],ce=/^[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 ue(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(ue,"observedTimestamp");function le(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(le,"receiptError");function me(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"||!ce.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(me,"parseRuntimeCodecs");function pe(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(pe,"validateLifecycle");function he(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 k={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&&!k.scene)throw new Error("Runtime status receipt cannot attempt HMR without the scene capability.");if(y&&!k.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"]),S={state:A(R.state,ae,"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")};pe(S);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,oe,"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=le(t.error);if(S.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:ue(t.observedAt),worker:{backend:A(r.backend,de,"Runtime status receipt worker.backend"),renderer:A(r.renderer,ie,"Runtime status receipt worker.renderer"),protocolVersion:1},assets:{codecs:me(s.codecs),resources:E(s.resources,"Runtime status receipt assets.resources")},hmr:{capabilities:k,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:S,shaders:{mode:P,pipelines:T},...f===void 0?{}:{text:f},error:b}}a(he,"parseRuntimeStatusReceipt");function fe(e,t){return e.render===t.render&&e.vertex===t.vertex&&e.fragment===t.fragment&&e.compute===t.compute}a(fe,"sameCoverage");async function te(e=process.cwd()){let t=h.resolve(e);for(;;){if((await Promise.all(ne.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(te,"findProjectRoot");async function ye(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 O(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(!fe(m,d.coverage))return {state:"invalid",scene:r,reason:"Shader receipt coverage does not match the manifest entries.",coverage:m};let{three:y,threeBlocks:k,threeBlocksShaderClosure:x}=await c$2(e);if(a.runtime.three!==y||t.runtime.three!==y||a.runtime.threeBlocks!==k||t.runtime.threeBlocks!==k)return {state:"stale",scene:r,reason:`Installed runtime versions (${y}, ${k}) 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),S=Object.keys(R),V=Object.keys(d.inputs),P=S.filter(b=>!Object.hasOwn(d.inputs,b)),T=V.filter(b=>!Object.hasOwn(R,b)),f=S.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(ye,"inspectShaders");async function Re(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(Re,"inspectText");function be(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(be,"validateRuntimeReceiptForProject");async function ge(e,t){let r=h.join(e,...re.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=he(await O(s,h.join(s,h.basename(r)),se,"Runtime status receipt"));return be(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(ge,"inspectRuntimeReceipt");function we(){return {scene:false,component:false,assetManifest:false,workerRestart:false}}a(we,"emptyCapabilities");function ke(){return {attempted:false,succeeded:null,rollbackPreserved:null,workerRestarted:false}}a(ke,"emptyOutcome");function Se(){return []}a(Se,"configuredCodecs");function xe(e,t,r){if(t.state!=="fresh")return "three-blocks shaders capture";if(r!==void 0&&r.state!=="ready")return "three-blocks text generate";let s=e.receipt;return e.kind!=="valid"||s===null||s.lifecycle.state==="error"?H:s.text!==void 0&&s.text.state!=="ready"?"three-blocks text generate":H}a(xe,"recoveryCommand");async function $e(e=process.cwd()){let t=await te(e),r=b$1(await O(t,h.join(t,"three-blocks.json"),a$2.metadata,"Project metadata")),s=await ye(t,r),n=r.features.text?await Re(t,r):void 0,o=await ge(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:Se(),resources:0}:{state:l?"error":a.lifecycle.assetsReady?"assets ready":"starting",codecs:a.assets.codecs,resources:a.assets.resources},k=a===null?{state:d?"error":"starting",capabilities:we(),outcome:ke()}:{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},S=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:k,optimization:R,stats:x,...S===void 0?{}:{text:S}},runtime:{state:d?"error":a?.lifecycle.state??"starting",observed:a!==null,observedAt:a?.observedAt??null,reason:o.reason,recovery:xe(o,s,n),observation:a},shaders:s,...n?{text:n}:{}}}a($e,"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 te(e),r=h.join(t,"three-blocks.json");if(await d(r)){try{b$1(await O(t,r,a$2.metadata,"Project metadata"));}catch{return Z(t)}return $e(t)}return Z(t)}a(qe,"inspectThreeBlocksStatus");function Ge(e){return ee(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 ve(e){return e==="ktx2"?"KTX2":e==="draco"?"Draco":e==="meshopt"?"Meshopt":e}a(ve,"codecName");function Pe(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(Pe,"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 Q(e){return e<100?e.toFixed(1):Math.round(e).toString()}a(Q,"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"?`Committed capture \xB7 recorded on ${s.adapter??"unknown adapter"}`:"Latest local capture",o=s===void 0?"":`n=${s.runs}`,a=s===void 0?"":`\u2248${Q(s.avoidedBuildMs)} ms \xB1 ${Q(s.spreadMs)} TSL build time saved`,d=s===void 0?r.state==="fresh"?` ${c$3.dot} ${b$2.dim("Build timing not recorded for this capture \xB7 run three-blocks shaders test")}`:"":` ${c$3.dot} ${b$2.dim(`${a} \xB7 ${o} \xB7 ${n}`)}`;t.push(w(g$2(r.state),r.scene,`${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=>`${ve(l.name)}${l.decoded?"":l.available?" (idle)":" (unavailable)"}`).join(" \xB7 ");n.push(w(c$3.tick,"verified",`${Pe(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 ${H}`)));return e.shaders.state==="fresh"&&(e.text===void 0||e.text.state==="ready")&&e.runtime.state!=="error"||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(!ee(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{re as a,se as b,H as c,he as d,te as e,$e as f,qe as g,Ge as h,je as i,Me as j,He as k};
|
package/dist/chunk-4EHPYBKA.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
'use strict';var fs=require('fs'),module$1=require('module'),d=require('path'),shaders=require('three-blocks/shaders'),vite=require('three-blocks/vite');require('fs/promises'),require('crypto');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var d__default=/*#__PURE__*/_interopDefault(d);var x=Object.defineProperty;var i=(e,r)=>x(e,"name",{value:r,configurable:true});function g(e){let r=e.split("?",1)[0];return r===void 0?false:r.split(d__default.default.sep).join("/").endsWith("/build/three.webgpu.js")}i(g,"isThreeWebGPUModule");function M(e){let r=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/u.exec(e);return r?.[1]==="0"&&r[2]==="185"}i(M,"supportedVersion");function m(e,r,t={}){if(!M(r))throw new Error(`Shader provider transform ${shaders.THREE_WEBGPU_R185_COMPATIBILITY} supports Three.js 0.185.x; received "${r}".`);let n=vite.transformThreeWebgpuProviderHooks(e,{threeVersion:r,id:"three/build/three.webgpu.js"}),s=n.state==="already-applied",o=n.code;return t.instrumentCapture&&(o=vite.transformThreeWebgpuCaptureInstrumentation(o,{...t.captureRuntimeImport===void 0?{}:{runtimeImport:t.captureRuntimeImport}}).code),{code:o,alreadyPresent:s,captureApplied:t.instrumentCapture===true}}i(m,"applyShaderProviderTransform");var y="@three-blocks/devtools/webpack-loader";function w(e){if(typeof e=="string")return e===y;if(Array.isArray(e))return e.some(w);if(e===null||typeof e!="object")return false;let r=e;return r.loader===y||w(r.use)}i(w,"webpackRuleUsesShaderLoader");function E(e){let r=S(process.cwd()),t=i(s=>T(r,s),"exact"),n={...e.resolve?.alias,...t("three")===void 0?{}:{three$:t("three")},...t("three/webgpu")===void 0?{}:{"three/webgpu$":t("three/webgpu")},...t("three/tsl")===void 0?{}:{"three/tsl$":t("three/tsl")},"three/addons":d__default.default.join(r.root,"examples/jsm"),"three/examples/jsm":d__default.default.join(r.root,"examples/jsm")};return {...e,resolve:{...e.resolve,alias:n}}}i(E,"withTargetThreeAliases");function k(e){let r=E(e),t=r.module?.rules??[];return t.some(w)?r:{...r,module:{...r.module,rules:[...t,{enforce:"pre",test:/three[\\/]build[\\/]three\.webgpu\.js$/u,use:[{loader:y}]}]}}}i(k,"withShaderWebpackRule");function pr(e){return k(e)}i(pr,"withThreeBlocksWebpack");function fr(e){let t=e.webpack;return {...e,webpack(n,...s){let o=t?.call(this,n,...s)??n,a=s[0];return a!==null&&typeof a=="object"&&Reflect.get(a,"isServer")===true?E(o):k(o)}}}i(fr,"withThreeBlocksNext");function S(e){let r;try{r=module$1.createRequire(d__default.default.join(d__default.default.resolve(e),"package.json")).resolve("three");}catch(o){throw new Error("The shader adapter could not resolve Three.js from the target project.",{cause:o})}let t=d__default.default.dirname(r),n,s;for(;;){let o=d__default.default.join(t,"package.json");if(fs.existsSync(o)){let c=JSON.parse(fs.readFileSync(o,"utf8"));if(c.name==="three"){n=o,s=c;break}}let a=d__default.default.dirname(t);if(a===t)break;t=a;}if(n===void 0)throw new Error(`The shader adapter could not locate Three.js package metadata from ${r}.`);if(typeof s?.version!="string"||s.version.length===0)throw new Error(`The resolved Three.js package has no version: ${n}`);return {root:d__default.default.dirname(n),version:s.version,exports:s.exports}}i(S,"resolveThreePackage");function F(e=process.cwd()){return S(e).version}i(F,"resolveShaderAdapterThreeVersion");function R(e){return {version:e.threeVersion??F(e.root),capture:e.capture??process.env.THREE_BLOCKS_SHADER_TOOL==="1"}}i(R,"resolvedOptions");function mr(e,r,t={}){if(!g(r))return null;let n=R(t);return m(e,n.version,{instrumentCapture:n.capture})}i(mr,"transformThreeWebGPUModule");function h(e){if(typeof e=="string")return e;if(Array.isArray(e)){for(let t of e){let n=h(t);if(n!==void 0)return n}return}if(e===null||typeof e!="object")return;let r=e;for(let t of ["browser","import","default"]){let n=h(r[t]);if(n!==void 0)return n}}i(h,"exportTarget");function T(e,r){if(e.exports===null||typeof e.exports!="object")return;let t=e.exports,n=r==="three"?".":`./${r.slice(6)}`,s=h(t[n]);if(s!==void 0)return d__default.default.resolve(e.root,s);for(let[o,a]of Object.entries(t)){let c=o.indexOf("*");if(c<0)continue;let u=o.slice(0,c),l=o.slice(c+1);if(!n.startsWith(u)||!n.endsWith(l))continue;let p=n.slice(u.length,n.length-l.length),f=h(a);if(f!==void 0)return d__default.default.resolve(e.root,f.replaceAll("*",p))}}i(T,"resolveThreeExport");function hr(e={}){let r=e.root??process.cwd(),t=S(r),n={version:e.threeVersion??t.version,capture:e.capture??process.env.THREE_BLOCKS_SHADER_TOOL==="1"};return {name:"three-blocks-shader-provider",setup(s){s.onResolve?.({filter:/^three(?:\/.*)?$/},o=>{let a=T(t,o.path);return a===void 0?void 0:{path:a}}),s.onLoad({filter:/three[\\/]build[\\/]three\.webgpu\.js$/},async o=>{let a=await new Promise((u,l)=>{fs.readFile(o.path,"utf8",(p,f)=>{p?l(p):u(f);});});return {contents:m(a,n.version,{instrumentCapture:n.capture}).code,loader:"js"}});}}}i(hr,"createEsbuildShaderPlugin");function gr(e={}){let r=R(e);return {name:"three-blocks-shader-provider",enforce:"pre",transform(t,n){return g(n)?{code:m(t,r.version,{instrumentCapture:r.capture}).code,map:null}:null}}}i(gr,"createRollupShaderPlugin");exports.a=i;exports.b=y;exports.c=pr;exports.d=fr;exports.e=F;exports.f=mr;exports.g=hr;exports.h=gr;
|
package/dist/chunk-HRYYNBVC.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {a as a$1,b as b$1}from'./chunk-ZDNZCQUQ.js';import {d as d$1,j as j$1,a as a$2,g}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {realpath,readFile}from'fs/promises';import d from'path';var b="three-blocks.shaders.json",I=".three-blocks/shaders",O=".three-blocks/shaders/parity",_=/^[a-z0-9][a-z0-9_-]{0,63}$/u,C=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u,R=64,E=64,j={schemaVersion:1,scenes:[{key:"default",url:"/"}]};function x(n,r,e){if(n===void 0)return e;if(typeof n!="string"||n.length===0||n.length>512||d.isAbsolute(n)||/[\u0000-\u001f\u007f]/u.test(n))throw new Error(`${r} must be a bounded project-relative directory.`);let i=d.posix.normalize(n.replaceAll("\\","/")).replace(/\/+$/u,"");if(i==="."||i===".."||i.startsWith("../"))throw new Error(`${r} must stay inside the project.`);return i}a(x,"safeProjectDirectory");function P(n,r){let e=x(n,r,"");if(typeof n!="string"||n.endsWith("/"))throw new Error(`${r} must be a project-relative file.`);return e}a(P,"safeProjectFile");function u(n,r,e,i,o){if(n===void 0)return o;if(!Number.isSafeInteger(n)||Number(n)<e||Number(n)>i)throw new Error(`${r} must be an integer in ${e}...${i}.`);return Number(n)}a(u,"boundedInteger");function $(n,r,e){if(n===void 0)return e;if(typeof n!="number"||!Number.isFinite(n)||n<0||n>1)throw new Error(`${r} must be a finite ratio in 0...1.`);return n}a($,"finiteRatio");function T(n,r){if(typeof n!="string"||n.length===0||n.length>2048||/[\u0000-\u001f\u007f]/u.test(n))throw new Error(`${r} must be a bounded project-relative URL.`);let e;try{e=new URL(n,"http://three-blocks.invalid/");}catch{throw new Error(`${r} is not a valid URL.`)}if(e.origin!=="http://three-blocks.invalid"||e.hash.length>0)throw new Error(`${r} must stay within the project and must not contain a fragment.`);return `${e.pathname}${e.search}`}a(T,"safeBrowserUrl");function A(n){if(!Array.isArray(n)||n.length===0||n.length>R)throw new Error(`Shader config scenes must contain 1...${R} entries.`);let r=new Set;return n.map((e,i)=>{if(!a$1(e)||typeof e.key!="string"||!_.test(e.key))throw new Error(`Shader config scene ${i} has an invalid key.`);if(r.has(e.key))throw new Error(`Shader config scene key "${e.key}" is duplicated.`);r.add(e.key);let o=e.parityFrames,t=e.maxDiffRatio;if(e.inputs!==void 0&&(!Array.isArray(e.inputs)||e.inputs.length===0||e.inputs.length>E))throw new Error(`Shader config scene "${e.key}" inputs must contain 1...${E} files.`);let a=e.inputs===void 0?void 0:e.inputs.map((l,h)=>P(l,`Shader config scene "${e.key}" input ${h}`));if(a!==void 0&&new Set(a).size!==a.length)throw new Error(`Shader config scene "${e.key}" inputs must be unique.`);if(e.allowPipelineReuse!==void 0&&typeof e.allowPipelineReuse!="boolean")throw new Error(`Shader config scene "${e.key}" allowPipelineReuse must be a boolean.`);if(e.runtimeMotion!==void 0&&typeof e.runtimeMotion!="boolean")throw new Error(`Shader config scene "${e.key}" runtimeMotion must be a boolean.`);return {key:e.key,url:T(e.url,`Shader config scene "${e.key}" URL`),requiresText:e.requiresText===true,...a===void 0?{}:{inputs:a},...o===void 0?{}:{parityFrames:u(o,`Shader config scene "${e.key}" parityFrames`,0,1e4,0)},...t===void 0?{}:{maxDiffRatio:$(t,`Shader config scene "${e.key}" maxDiffRatio`,.01)},...e.allowPipelineReuse===true?{allowPipelineReuse:true}:{},...e.runtimeMotion===true?{runtimeMotion:true}:{}}})}a(A,"parseScenes");function y(n){if(!a$1(n)||n.schemaVersion!==void 0&&n.schemaVersion!==1)throw new Error("Shader config must use schemaVersion 1.");let r=n.viewport;if(r!==void 0&&!a$1(r))throw new Error("Shader config viewport must be an object.");let e=n.parity;if(e!==void 0&&!a$1(e))throw new Error("Shader config parity must be an object.");let i=n.bridge;if(i!==void 0&&!a$1(i))throw new Error("Shader config bridge must be an object.");let o=a$1(i)?i.deterministicModule:void 0;o!==void 0&&T(o,"Shader deterministic module");let t=n.readiness;if(t!==void 0&&!a$1(t))throw new Error("Shader config readiness must be an object.");let a=a$1(t)?t.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 l=a$1(t)?t.global:void 0;if(l!==void 0&&(typeof l!="string"||!C.test(l)))throw new Error("Shader readiness global must be a dot-separated JavaScript property path.");return {schemaVersion:1,scenes:A(n.scenes),settleFrames:u(n.settleFrames,"Shader settleFrames",0,1e4,60),settleTimeoutMs:u(n.settleTimeoutMs,"Shader settleTimeoutMs",1e3,15*6e4,3e4),browserRelaunchScenes:u(n.browserRelaunchScenes,"Shader browserRelaunchScenes",1,64,8),timeoutMs:u(n.timeoutMs,"Shader timeoutMs",1e3,15*6e4,24e4),viewport:{width:u(a$1(r)?r.width:void 0,"Shader viewport width",64,8192,1024),height:u(a$1(r)?r.height:void 0,"Shader viewport height",64,8192,640)},parity:{frames:u(a$1(e)?e.frames:void 0,"Shader parity frames",0,1e4,90),channelTolerance:u(a$1(e)?e.channelTolerance:void 0,"Shader parity channelTolerance",0,255,8),maxDiffRatio:$(a$1(e)?e.maxDiffRatio:void 0,"Shader parity maxDiffRatio",.01)},bridge:{legacyLab:a$1(i)&&i.legacyLab===true,...typeof o=="string"?{deterministicModule:o}:{}},readiness:{...typeof a=="string"?{selector:a}:{},...typeof l=="string"?{global:l}:{}},publicDir:x(n.publicDir,"Shader publicDir","public"),allowLiveBuilds:n.allowLiveBuilds!==false}}a(y,"parseShaderToolConfig");async function v(n=process.cwd()){let r=d.resolve(n);for(;;){if(await d$1(d.join(r,b))||await d$1(d.join(r,"three-blocks.json")))return realpath(r);let e=d.join(r,"package.json");if(await d$1(e)){let o=await j$1(r,e,a$2.packageJson,"Project package.json"),t;try{t=JSON.parse(o.data.toString("utf8"));}catch{throw new Error(`Project package.json is not valid JSON: ${e}.`)}if(a$1(t)&&[t.dependencies,t.devDependencies,t.peerDependencies,t.optionalDependencies].filter(a$1).some(h=>typeof h.three=="string"||typeof h["three-blocks"]=="string"||typeof h["@three-blocks/devtools"]=="string"))return realpath(r)}let i=d.dirname(r);if(i===r)throw new Error(`No Three Blocks shader project found from ${JSON.stringify(d.resolve(n))}; add Three.js to package.json or pass --root.`);r=i;}}a(v,"findShaderProjectRoot");async function w(n){let r=await realpath(n),e=d.join(r,b);if(await d$1(e)){let o=await j$1(r,e,a$2.metadata,"Shader configuration");return y(JSON.parse(o.data.toString("utf8")))}let i=d.join(r,"three-blocks.json");if(await d$1(i)){let o=b$1(JSON.parse(await readFile(i,"utf8")));return y({schemaVersion:1,scenes:[{key:o.template,url:"/",requiresText:o.features.text}]})}return y(j)}a(w,"loadShaderToolConfig");async function U(n){let r=await realpath(n);for(let t of ["vite.config.ts","vite.config.mts","vite.config.js","vite.config.mjs","vite.config.cts","vite.config.cjs"])if(await d$1(d.join(r,t)))return {driverKind:"vite",reason:`Detected ${t}.`};let e,i=d.join(r,"package.json");if(await d$1(i)){let t=await j$1(r,i,a$2.packageJson,"Project package.json"),a=JSON.parse(t.data.toString("utf8"));a$1(a)&&(e=a);}let o=a(t=>[e?.dependencies,e?.devDependencies,e?.peerDependencies,e?.optionalDependencies].some(a=>a$1(a)&&typeof a[t]=="string"),"hasDependency");if(o("vite"))return {driverKind:"vite",reason:"Detected the Vite dependency."};for(let t of ["dist","build","out"])if(await d$1(d.join(r,t,"index.html")))return {driverKind:"static",serve:t,reason:`Detected the built ${t}/index.html application.`};if(o("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(o("webpack")||o("esbuild")||o("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(U,"inferShaderCaptureTarget");async function V(n){let r=await realpath(n),e=d.join(r,b);if(await d$1(e))return {config:await w(r),file:e,created:false};let i=d.join(r,"three-blocks.json");if(await d$1(i))return {config:await w(r),file:i,created:false};let o=j,t=y(o),a=await g(e,`${JSON.stringify(o,null,2)}
|
|
3
|
-
`);return {config:a?t:await w(r),file:e,created:a}}a(V,"ensureShaderToolConfig");export{b as a,I as b,O as c,y as d,v as e,w as f,U as g,V as h};
|