@three-blocks/devtools 2.0.0-alpha.238.g8723f0a28ca3 → 3.0.0-alpha.280.g945a5d860d58
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 +63 -37
- package/dist/{browser-smoke-EIKJ6OVK.js → browser-smoke-JHZLPGEB.js} +1 -1
- package/dist/{chunk-GA7PGW2R.js → chunk-3CKEE22B.js} +1 -1
- package/dist/{chunk-OQLHTDDH.js → chunk-AIAYEDXX.js} +1 -1
- package/dist/{chunk-4YRR36JN.js → chunk-FKZT7XLM.js} +18 -18
- package/dist/{chunk-TUIINI6U.js → chunk-L2CZ7RSV.js} +1 -1
- package/dist/{chunk-LUULHXFK.js → chunk-NQIAU3XU.js} +6 -6
- package/dist/chunk-QJFPNM6W.js +2 -0
- package/dist/chunk-YHHGR2AJ.js +80 -0
- package/dist/cli.js +8 -8
- package/dist/{environment-bake-XMRKQJXM.js → environment-bake-BGMGFAVK.js} +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +5 -5
- package/dist/{shader-browser-EYE3UT2U.js → shader-browser-523TEBVA.js} +1 -1
- package/dist/{shader-browser-WF4HNSAV.js → shader-browser-YPBP3WQY.js} +1 -1
- package/dist/shader-capture-server.d.ts +1 -1
- package/dist/shader-capture-server.js +5 -5
- package/dist/{shader-watch-ISNWIAXN.js → shader-watch-XY6A2KGQ.js} +1 -1
- package/dist/shader-workflow-T7W7UHWJ.js +2 -0
- package/dist/{status-D2RF6QTL.js → status-RFA7WAM6.js} +1 -1
- package/dist/transform.js +1 -1
- package/dist/webpack-loader.js +1 -1
- package/package.json +4 -4
- package/dist/chunk-V34C7NIM.js +0 -80
- package/dist/chunk-W6UL2OW7.js +0 -2
- package/dist/shader-workflow-T72N2CLS.js +0 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,59 +1,85 @@
|
|
|
1
1
|
# @three-blocks/devtools
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 3.0.0-alpha.280.g945a5d860d58
|
|
4
4
|
|
|
5
|
-
-
|
|
5
|
+
- CLI: New projects return to the shell and prefer Bun for the development command.
|
|
6
6
|
|
|
7
|
-
-
|
|
7
|
+
- Devtools: Development stays available when compatible shader receipts predate a version bump.
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- Devtools: Headless shader checks ignore automatic favicon misses and allow slow screenshots.
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
- Library: Gaussian splats now promote still scenes to the fast tile compositor automatically.
|
|
12
12
|
|
|
13
|
-
-
|
|
13
|
+
- Library: Gaussian splats now stage tile-compositor promotion to avoid frame spikes.
|
|
14
14
|
|
|
15
|
-
-
|
|
15
|
+
- Library: Gaussian splats now use faster subgroup sorting when the GPU supports it.
|
|
16
16
|
|
|
17
|
-
-
|
|
17
|
+
- Packages: Benchmarks settle each frame lane before sampling steady-state performance.
|
|
18
18
|
|
|
19
|
-
-
|
|
19
|
+
- Packages: Benchmarks now compare GaussianSplats3D under the same standard protocol.
|
|
20
20
|
|
|
21
|
-
-
|
|
21
|
+
- Website: Agent docs and llms.txt match the shipped release and cover Baked Motion format 3.
|
|
22
22
|
|
|
23
|
-
-
|
|
23
|
+
- Website: Example search now connects every showcased feature to its matching library blocks.
|
|
24
24
|
|
|
25
|
-
-
|
|
25
|
+
- Packages: Built from `945a5d860d58`.
|
|
26
26
|
|
|
27
|
-
- CLI: Blender subject pickers now browse collapsed collections with fuzzy graph search.
|
|
28
27
|
|
|
29
|
-
|
|
28
|
+
## 2.0.0
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
- Website: Static assets now deploy reliably without changing their public URLs.
|
|
34
|
-
|
|
35
|
-
- CLI: Deployment status now reports Amplify through GitHub without an AWS login.
|
|
36
|
-
|
|
37
|
-
- Devtools: Pushes now return preprod failures to the active Agent and avoid oversized bundles.
|
|
38
|
-
|
|
39
|
-
- Devtools: Shader precompilation now hydrates minified builds without preserving constructor names.
|
|
40
|
-
|
|
41
|
-
- Packages: Three.js 186dev now uses upstream asynchronous compute compilation.
|
|
42
|
-
|
|
43
|
-
- Starter: New projects now use the current runtime without stale shader receipts.
|
|
44
|
-
|
|
45
|
-
- Tools: Mesh to Splat now ignores render-hidden collections when framing captures.
|
|
46
|
-
|
|
47
|
-
- Library: Vertex Animation Video now fails cleanly when numerical tracks cannot be decoded.
|
|
48
|
-
|
|
49
|
-
- Packages: Documentation now matches the shipped commands, versions, and ports.
|
|
50
|
-
|
|
51
|
-
- Website: Checkout now reuses billing profiles and collects tax-ready customer details.
|
|
30
|
+
### Minor Changes
|
|
52
31
|
|
|
53
|
-
-
|
|
32
|
+
- beb026f: Packages: Shader tools now capture both backends by default and show backend tests and sizes.
|
|
54
33
|
|
|
55
|
-
|
|
34
|
+
### Patch Changes
|
|
56
35
|
|
|
36
|
+
- a59c7b8: Packages: Documentation now matches the shipped commands, versions, and ports.
|
|
37
|
+
- a59c7b8: Devtools: Shader precompilation now hydrates minified builds without preserving constructor names.
|
|
38
|
+
- b328fab: Packages: Precompiled shaders now preserve deterministic output across more Three.js examples.
|
|
39
|
+
- 0ca530e: Devtools: Shader capture now respects each scene's supported renderer backends.
|
|
40
|
+
- beb026f: Devtools: Precompiled indirect batches now skip redundant shader setup.
|
|
41
|
+
- e8e7e30: Devtools: Shader precompilation now isolates backends and replays shared texture recipes.
|
|
42
|
+
- beb026f: Starter: Fresh projects now avoid unstyled flashes and hydrate every captured startup shader.
|
|
43
|
+
- 9daa49d: Packages: Three.js 186dev now uses upstream asynchronous compute compilation.
|
|
44
|
+
- Updated dependencies [beb026f]
|
|
45
|
+
- Updated dependencies [967a0ee]
|
|
46
|
+
- Updated dependencies [967a0ee]
|
|
47
|
+
- Updated dependencies [96be509]
|
|
48
|
+
- Updated dependencies [96be509]
|
|
49
|
+
- Updated dependencies [967a0ee]
|
|
50
|
+
- Updated dependencies [96be509]
|
|
51
|
+
- Updated dependencies [96be509]
|
|
52
|
+
- Updated dependencies [96be509]
|
|
53
|
+
- Updated dependencies [967a0ee]
|
|
54
|
+
- Updated dependencies [96be509]
|
|
55
|
+
- Updated dependencies [967a0ee]
|
|
56
|
+
- Updated dependencies [beb026f]
|
|
57
|
+
- Updated dependencies [0c23333]
|
|
58
|
+
- Updated dependencies [e8e7e30]
|
|
59
|
+
- Updated dependencies [a59c7b8]
|
|
60
|
+
- Updated dependencies [beb026f]
|
|
61
|
+
- Updated dependencies [967a0ee]
|
|
62
|
+
- Updated dependencies [8bd64d6]
|
|
63
|
+
- Updated dependencies [a59c7b8]
|
|
64
|
+
- Updated dependencies [967a0ee]
|
|
65
|
+
- Updated dependencies [b328fab]
|
|
66
|
+
- Updated dependencies [0ca530e]
|
|
67
|
+
- Updated dependencies [beb026f]
|
|
68
|
+
- Updated dependencies [8bd64d6]
|
|
69
|
+
- Updated dependencies [e8e7e30]
|
|
70
|
+
- Updated dependencies [967a0ee]
|
|
71
|
+
- Updated dependencies [0ca530e]
|
|
72
|
+
- Updated dependencies [967a0ee]
|
|
73
|
+
- Updated dependencies [9daa49d]
|
|
74
|
+
- Updated dependencies [9daa49d]
|
|
75
|
+
- Updated dependencies [beb026f]
|
|
76
|
+
- Updated dependencies [9daa49d]
|
|
77
|
+
- Updated dependencies [967a0ee]
|
|
78
|
+
- Updated dependencies [967a0ee]
|
|
79
|
+
- Updated dependencies [74a7597]
|
|
80
|
+
- Updated dependencies [0c23333]
|
|
81
|
+
- Updated dependencies [e8e7e30]
|
|
82
|
+
- three-blocks@0.3.0
|
|
57
83
|
|
|
58
84
|
## 1.0.0
|
|
59
85
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b,a as a$3}from'./chunk-
|
|
2
|
+
import {b,a as a$3}from'./chunk-L2CZ7RSV.js';import'./chunk-76WRV5MZ.js';import'./chunk-JHBQB7WC.js';import'./chunk-NQIAU3XU.js';import'./chunk-FKZT7XLM.js';import {a as a$2,b as b$1,d}from'./chunk-QJFPNM6W.js';import'./chunk-ZT6T2W4B.js';import'./chunk-NPLE7PPF.js';import {a as a$1}from'./chunk-65VEJRRT.js';import {j,a as a$4,c}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {randomUUID}from'crypto';import {mkdir,realpath,writeFile,rename,rm}from'fs/promises';import F from'path';import {PNG}from'pngjs';var ye="virtual:three-blocks-devtools/browser-smoke",ve=`\0${ye}`,Ke=`/@id/__x00__${ye}`,Be=9e4;async function Ee(){try{let[e,r]=await Promise.all([import('playwright'),import('vite')]);return {chromium:e.chromium,vite:r}}catch(e){throw new Error('Browser smoke and preview require the optional "playwright" and "vite" packages. Install both in the project and run `npx playwright install chromium`.',{cause:e})}}a(Ee,"loadBrowserSmokeTools");function V(e,r,o,t,n){let a=e??n;if(!Number.isSafeInteger(a)||a<o||a>t)throw new Error(`${r} must be an integer in ${o}...${t}.`);return a}a(V,"boundedInteger");function _e(e,r,o,t,n){let a=e??n;if(!Number.isFinite(a)||a<o||a>t)throw new Error(`${r} must be a finite number in ${o}...${t}.`);return a}a(_e,"boundedRatio");function Pe(e){let r=e??"/";if(r.length===0||r.length>2048||/[\u0000-\u001f\u007f]/u.test(r))throw new Error("Browser smoke route must be a bounded project URL.");let o=new URL(r,"http://three-blocks.invalid/");if(o.origin!=="http://three-blocks.invalid"||o.hash.length>0)throw new Error("Browser smoke route must stay within the project and have no fragment.");return `${o.pathname}${o.search}`}a(Pe,"safeRoute");function N(e,r){return e[r]===true}a(N,"booleanField");function $(e,r){if(!a$1(e)||!a$1(e.value))return {source:"missing",backend:"unknown",worker:false,workerReady:false,assetsReady:false,compileEnd:false,textEnabled:r,textReady:!r,firstFrame:false};let o=e.value,t=e.source==="public";if(t&&o.protocolVersion!==1)return {source:"public",backend:"unknown",worker:false,workerReady:false,assetsReady:false,compileEnd:false,textEnabled:r,textReady:!r,firstFrame:false};let n=a$1(o.readiness)?o.readiness:o,a=o.worker,d=t&&a$1(a)?a.offscreenCanvas===true&&a.visible===true:a===true;return {source:t?"public":"legacy",backend:t&&a$1(a)?a.offscreenCanvas===true?"OffscreenCanvas":"MainThread":a===true?"OffscreenCanvas":"unknown",worker:d,workerReady:N(n,"workerReady"),assetsReady:N(n,"assetsReady")||N(n,"loadEnd"),compileEnd:N(n,"compileEnd"),textEnabled:r,textReady:!r||N(n,"textReady"),firstFrame:N(n,"firstFrame")}}a($,"parseBrowserSmokeLifecycle");function ie(e){let r=PNG.sync.read(e),o=Math.floor(r.width*.25),t=Math.floor(r.width*.75),n=Math.floor(r.height*.25),a=Math.floor(r.height*.75),d=0,c=0;for(let f=n;f<a;f+=2)for(let p=o;p<t;p+=2){let h=(f*r.width+p)*4,l=r.data[h],i=r.data[h+1],s=r.data[h+2];l===void 0||i===void 0||s===void 0||(d+=Math.max(l,i,s),c+=1);}return c===0?0:d/c}a(ie,"screenshotLuminance");function Je(){return `
|
|
3
3
|
import * as THREE from 'three/webgpu';
|
|
4
4
|
import { createAssetLoaderRegistry, createAssetManager, createThreeAssetAdapters, defineAssets } from 'three-blocks/assets';
|
|
5
5
|
import { SceneHotReloader } from 'three-blocks/hmr';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {a}from'./chunk-EI7MMDWY.js';import {createHash,randomUUID}from'crypto';import {lstat,open,realpath,mkdir,rename,rm,link,readdir,readFile,unlink}from'fs/promises';import p from'path';import {THREE_WEBGL_R185_COMPATIBILITY,THREE_WEBGPU_R185_COMPATIBILITY,THREE_R186DEV_VERSION,THREE_WEBGPU_R186DEV_COMPATIBILITY,parsePrecompiledManifest,SHADER_HYDRATION_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_ADDRESS_SCHEMA_VERSION,PRECOMPILED_MANIFEST_VERSION}from'three-blocks/shaders';import {createRequire}from'module';import {transformThreeWebgpuProviderHooks,transformThreeWebgpuCaptureInstrumentation}from'three-blocks/vite';var V=/^[a-f0-9]{64}$/,rr=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/,xe=/^[a-z0-9][a-z0-9_-]{0,63}$/,Te=/^[0-9A-Za-z][0-9A-Za-z._/-]{0,127}$/;function c(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}a(c,"isRecord");function $(e){return typeof e=="string"&&rr.test(e)}a($,"isSafeVersion");function ne(e){if(e.length===0||e.length>512||e.includes("\\")||/[\u0000-\u001f\u007f]/.test(e))return false;let r=e.split("/");return !e.startsWith("/")&&r.every(t=>t.length>0&&t!=="."&&t!=="..")}a(ne,"isSafeRelativePath");function Ae(e){if(!c(e)||e.schemaVersion!==2)throw new Error("three-blocks.json must use schemaVersion 2.");if(typeof e.template!="string"||!xe.test(e.template))throw new Error("three-blocks.json has an invalid default shader scene key.");if(!Array.isArray(e.layers)||!e.layers.every(r=>typeof r=="string"&&Te.test(r))||new Set(e.layers).size!==e.layers.length)throw new Error("three-blocks.json has invalid layers.");if(e.generator!==void 0&&(!c(e.generator)||typeof e.generator.name!="string"||!Te.test(e.generator.name)||!$(e.generator.version)))throw new Error("three-blocks.json has invalid generator metadata.");if(!c(e.runtime)||!$(e.runtime.three)||!$(e.runtime.threeBlocks))throw new Error("three-blocks.json has invalid runtime versions.");if(!c(e.features)||typeof e.features.text!="boolean")throw new Error("three-blocks.json has invalid feature metadata.");if(!c(e.protocol)||e.protocol.resultFile!==1)throw new Error("three-blocks.json has an unsupported protocol schema.");if(e.artifacts!==void 0){if(!c(e.artifacts)||typeof e.artifacts.shaders!="string"||!["fresh","pending"].includes(e.artifacts.shaders)||typeof e.artifacts.text!="string"||!["fresh","pending","not-applicable"].includes(e.artifacts.text))throw new Error("three-blocks.json has invalid artifact metadata.");if(e.features.text?e.artifacts.text==="not-applicable":e.artifacts.text!=="not-applicable")throw new Error("three-blocks.json text artifact state does not match the text capability.")}return {schemaVersion:2,template:e.template,layers:e.layers,...e.generator===void 0?{}:{generator:{name:e.generator.name,version:e.generator.version}},runtime:{three:e.runtime.three,threeBlocks:e.runtime.threeBlocks},features:{text:e.features.text},...e.artifacts===void 0?{}:{artifacts:{shaders:e.artifacts.shaders,text:e.artifacts.text}},protocol:{resultFile:1}}}a(Ae,"parseProjectMetadata");function tr(e){if(!c(e))throw new Error("Shader coverage is missing.");for(let r of ["render","vertex","fragment","compute"])if(typeof e[r]!="number"||!Number.isSafeInteger(e[r])||e[r]<0)throw new Error(`Shader coverage.${r} must be a non-negative integer.`);return e}a(tr,"parseCoverage");function nr(e,r){if(!c(e))throw new Error(`Shader receipt inputs for "${r}" are invalid.`);let t=Object.entries(e);if(t.length===0||t.length>4096)throw new Error(`Shader receipt inputs for "${r}" must contain between 1 and 4096 files.`);for(let[n,i]of t)if(!ne(n)||typeof i!="string"||!V.test(i))throw new Error(`Shader receipt input for "${r}" is invalid.`)}a(nr,"parseInputs");function H(e){if(!c(e)||e.schemaVersion!==2||!c(e.runtime)||!$(e.runtime.three)||!$(e.runtime.threeBlocks)||typeof e.runtime.threeBlocksShaderClosure!="string"||!V.test(e.runtime.threeBlocksShaderClosure)||!c(e.scenes))throw new Error("Shader meta.json does not match receipt schema 2.");if(e.runtime.capture!==void 0&&(!c(e.runtime.capture)||typeof e.runtime.capture.userAgent!="string"||e.runtime.capture.userAgent.length>1024||typeof e.runtime.capture.adapter!="string"||e.runtime.capture.adapter.length>1024||!Array.isArray(e.runtime.capture.features)||e.runtime.capture.features.length>256||!e.runtime.capture.features.every(t=>typeof t=="string"&&t.length>0&&t.length<=128)))throw new Error("Shader meta.json has invalid browser capture provenance.");let r=Object.entries(e.scenes);if(r.length===0)throw new Error("Shader meta.json contains no scenes.");for(let[t,n]of r){let i=t.endsWith(".webgl")?"webgl":"webgpu",o=i==="webgl"?t.slice(0,-6):t;if(!xe.test(o)||!c(n)||n.backend!==void 0&&n.backend!==i||typeof n.artifact!="string"||!ne(n.artifact)||!n.artifact.endsWith(`.${i}.ts`)||typeof n.artifactHash!="string"||!V.test(n.artifactHash))throw new Error(`Shader receipt for "${t}" is invalid.`);if(n.asset===void 0!=(n.assetHash===void 0)||n.asset!==void 0&&(typeof n.asset!="string"||!ne(n.asset)||!n.asset.endsWith(".json")||typeof n.assetHash!="string"||!V.test(n.assetHash)))throw new Error(`Shader static asset receipt for "${t}" is invalid.`);if(nr(n.inputs,t),tr(n.coverage),n.bytes!==void 0&&(!Number.isSafeInteger(n.bytes)||Number(n.bytes)<0))throw new Error(`Shader receipt byte count for "${t}" is invalid.`);if(n.skipped!==void 0&&(!c(n.skipped)||!Number.isSafeInteger(n.skipped.render)||Number(n.skipped.render)<0||!Number.isSafeInteger(n.skipped.compute)||Number(n.skipped.compute)<0))throw new Error(`Shader receipt skipped-build counts for "${t}" are invalid.`)}if(e.tool!==void 0&&(!c(e.tool)||e.tool.name!=="@three-blocks/devtools"||!$(e.tool.version)||typeof e.tool.compatibility!="string"||!Number.isSafeInteger(e.tool.transform)||!Number.isSafeInteger(e.tool.address)||!Number.isSafeInteger(e.tool.recipe)||!Number.isSafeInteger(e.tool.hydration)))throw new Error("Shader meta.json has invalid tool compatibility metadata.");if(c(e.tool)&&e.tool.compatibilities!==void 0&&(!c(e.tool.compatibilities)||Object.entries(e.tool.compatibilities).some(([t,n])=>t!=="webgpu"&&t!=="webgl"||typeof n!="string"||n.length===0)))throw new Error("Shader meta.json has invalid backend compatibility metadata.");return e}a(H,"parseShaderReceipt");var O=Object.freeze({metadata:1024*1024,receipt:2*1024*1024,manifest:32*1024*1024,semanticInput:8*1024*1024,semanticTotal:64*1024*1024,metrics:8*1024*1024,texture:128*1024*1024,packageJson:1024*1024});function oe(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"?e.code:void 0}a(oe,"errorCode");function E(e){return createHash("sha256").update(e).digest("hex")}a(E,"sha256");async function w(e){try{return await lstat(e),!0}catch(r){if(oe(r)==="ENOENT")return false;throw r}}a(w,"pathExists");function I(e,r){let t=p.relative(e,r);return t===""||!p.isAbsolute(t)&&t!==".."&&!t.startsWith(`..${p.sep}`)}a(I,"isWithin");function B(e){return JSON.stringify(e)}a(B,"displayPath");async function Me(e,r,t){let n=await open(e,"r");try{let[i,o,a]=await Promise.all([lstat(e),n.stat(),realpath(e)]);if(i.isSymbolicLink())throw new Error(`${t} must not be a symbolic link: ${B(e)}.`);if(!o.isFile())throw new Error(`${t} must be a regular file: ${B(e)}.`);if(o.size>r)throw new Error(`${t} exceeds the ${r}-byte inspection limit: ${B(e)}.`);let d=await n.readFile();if(d.byteLength>r)throw new Error(`${t} grew beyond the ${r}-byte inspection limit while being read.`);return {path:a,data:d}}finally{await n.close();}}a(Me,"readBoundedRegularFile");async function C(e,r){let t=p.dirname(e);await mkdir(t,{recursive:true});try{if((await lstat(e)).isSymbolicLink())throw new Error(`Atomic write target must not be a symbolic link: ${B(e)}.`)}catch(o){if(oe(o)!=="ENOENT")throw o}let n=p.join(t,`.${p.basename(e)}.${process.pid}.${randomUUID()}.tmp`),i;try{i=await open(n,"wx",384),await i.writeFile(r),await i.sync(),await i.close(),i=void 0,await rename(n,e);}finally{await i?.close().catch(()=>{}),await rm(n,{force:true});}}a(C,"writeAtomicRegularFile");async function _e(e,r){let t=p.dirname(e);await mkdir(t,{recursive:true});let n=p.join(t,`.${p.basename(e)}.${process.pid}.${randomUUID()}.tmp`),i;try{i=await open(n,"wx",384),await i.writeFile(r),await i.sync(),await i.close(),i=void 0;try{return await link(n,e),!0}catch(o){if(oe(o)==="EEXIST")return !1;throw o}}finally{await i?.close().catch(()=>{}),await rm(n,{force:true});}}a(_e,"writeNewRegularFile");async function Dr(e,r,t){return Me(e,r,t)}a(Dr,"readExternalRegularFile");async function U(e,r,t){let n=p.resolve(e),i=p.resolve(r);if(!I(n,i))throw new Error(`${t} escapes its allowed directory.`);let o=await lstat(i);if(o.isSymbolicLink())throw new Error(`${t} must not be a symbolic link.`);if(!o.isDirectory())throw new Error(`${t} must be a directory.`);let[a,d]=await Promise.all([realpath(n),realpath(i)]);if(!I(a,d))throw new Error(`${t} resolves outside its allowed directory.`);return d}a(U,"canonicalDirectoryWithin");async function N(e,r,t,n){let i=p.resolve(e),o=p.resolve(r);if(!I(i,o)||i===o)throw new Error(`${n} escapes its allowed directory.`);let a=await Me(o,t,n),d=await realpath(i);if(!I(d,a.path)||d===a.path)throw new Error(`${n} resolves outside its allowed directory.`);return a}a(N,"readRegularFileWithin");async function Lr(e,r,t,n=8192){let o=[await U(e,r,"Inspected directory")],a=[],d=0;for(;o.length>0;){let l=o.shift();if(l===void 0)break;let y=(await readdir(l,{withFileTypes:true})).sort((f,h)=>f.name.localeCompare(h.name));for(let f of y){if(d+=1,d>n)throw new Error(`Inspected directory exceeds the ${n}-entry limit.`);let h=p.join(l,f.name);if(f.isSymbolicLink())throw new Error(`Inspected directory contains a symbolic link: ${B(p.relative(e,h))}.`);if(f.isDirectory()){o.push(await U(e,h,"Nested inspected directory"));continue}if(f.isFile()&&t(f.name))a.push(h);else if(t(f.name))throw new Error(`Semantic input is not a regular file: ${B(h)}.`)}}return a.sort()}a(Lr,"listRegularFilesRecursively");var se="three-blocks.shaders.json",Gr=".three-blocks/shaders",zr=".three-blocks/shaders/parity",cr=/^[a-z0-9][a-z0-9_-]{0,63}$/u,ur=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u,$e=64,Be=64,Ie={schemaVersion:1,backend:"both",scenes:[{key:"default",url:"/"}]};function Jr(e="both"){return e==="both"?["webgpu","webgl"]:[e]}a(Jr,"shaderBackends");function z(e,r){return e.backend===void 0?r:r.filter(t=>t===e.backend)}a(z,"shaderSceneBackends");function Kr(e,r){return r.flatMap(t=>e.filter(n=>z(n,[t]).length>0).map(n=>({scene:n,backend:t,key:de(n.key,t)})))}a(Kr,"shaderScenePairs");function de(e,r){return r==="webgpu"?e:`${e}.webgl`}a(de,"shaderReceiptKey");function Oe(e,r,t){if(e===void 0)return t;if(typeof e!="string"||e.length===0||e.length>512||p.isAbsolute(e)||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${r} must be a bounded project-relative directory.`);let n=p.posix.normalize(e.replaceAll("\\","/")).replace(/\/+$/u,"");if(n==="."||n===".."||n.startsWith("../"))throw new Error(`${r} must stay inside the project.`);return n}a(Oe,"safeProjectDirectory");function lr(e,r){let t=Oe(e,r,"");if(typeof e!="string"||e.endsWith("/"))throw new Error(`${r} must be a project-relative file.`);return t}a(lr,"safeProjectFile");function x(e,r,t,n,i){if(e===void 0)return i;if(!Number.isSafeInteger(e)||Number(e)<t||Number(e)>n)throw new Error(`${r} must be an integer in ${t}...${n}.`);return Number(e)}a(x,"boundedInteger");function Ne(e,r,t){if(e===void 0)return t;if(typeof e!="number"||!Number.isFinite(e)||e<0||e>1)throw new Error(`${r} must be a finite ratio in 0...1.`);return e}a(Ne,"finiteRatio");function De(e,r){if(typeof e!="string"||e.length===0||e.length>2048||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${r} must be a bounded project-relative URL.`);let t;try{t=new URL(e,"http://three-blocks.invalid/");}catch{throw new Error(`${r} is not a valid URL.`)}if(t.origin!=="http://three-blocks.invalid"||t.hash.length>0)throw new Error(`${r} must stay within the project and must not contain a fragment.`);return `${t.pathname}${t.search}`}a(De,"safeBrowserUrl");function pr(e){if(!Array.isArray(e)||e.length===0||e.length>$e)throw new Error(`Shader config scenes must contain 1...${$e} entries.`);let r=new Set;return e.map((t,n)=>{if(!c(t)||typeof t.key!="string"||!cr.test(t.key))throw new Error(`Shader config scene ${n} has an invalid key.`);if(r.has(t.key))throw new Error(`Shader config scene key "${t.key}" is duplicated.`);r.add(t.key);let i=t.parityFrames,o=t.maxDiffRatio;if(t.inputs!==void 0&&(!Array.isArray(t.inputs)||t.inputs.length===0||t.inputs.length>Be))throw new Error(`Shader config scene "${t.key}" inputs must contain 1...${Be} files.`);let a=t.inputs===void 0?void 0:t.inputs.map((d,l)=>lr(d,`Shader config scene "${t.key}" input ${l}`));if(a!==void 0&&new Set(a).size!==a.length)throw new Error(`Shader config scene "${t.key}" inputs must be unique.`);if(t.runtimeMotion!==void 0&&typeof t.runtimeMotion!="boolean")throw new Error(`Shader config scene "${t.key}" runtimeMotion must be a boolean.`);if(t.backend!==void 0&&t.backend!=="webgpu"&&t.backend!=="webgl")throw new Error(`Shader config scene "${t.key}" backend must be "webgpu" or "webgl".`);return {key:t.key,url:De(t.url,`Shader config scene "${t.key}" URL`),...t.backend===void 0?{}:{backend:t.backend},requiresText:t.requiresText===true,...a===void 0?{}:{inputs:a},...i===void 0?{}:{parityFrames:x(i,`Shader config scene "${t.key}" parityFrames`,0,1e4,0)},...o===void 0?{}:{maxDiffRatio:Ne(o,`Shader config scene "${t.key}" maxDiffRatio`,.01)},...t.runtimeMotion===true?{runtimeMotion:true}:{}}})}a(pr,"parseScenes");function G(e){if(!c(e)||e.schemaVersion!==void 0&&e.schemaVersion!==1)throw new Error("Shader config must use schemaVersion 1.");let r=e.viewport;if(r!==void 0&&!c(r))throw new Error("Shader config viewport must be an object.");let t=e.parity;if(t!==void 0&&!c(t))throw new Error("Shader config parity must be an object.");let n=e.bridge;if(n!==void 0&&!c(n))throw new Error("Shader config bridge must be an object.");let i=c(n)?n.deterministicModule:void 0;i!==void 0&&De(i,"Shader deterministic module");let o=e.readiness;if(o!==void 0&&!c(o))throw new Error("Shader config readiness must be an object.");let a=c(o)?o.selector:void 0;if(a!==void 0&&(typeof a!="string"||a.length===0||a.length>512||/[\u0000-\u001f\u007f]/u.test(a)))throw new Error("Shader readiness selector must be a bounded, non-empty CSS selector.");let d=c(o)?o.global:void 0;if(d!==void 0&&(typeof d!="string"||!ur.test(d)))throw new Error("Shader readiness global must be a dot-separated JavaScript property path.");if(e.backend!==void 0&&e.backend!=="webgpu"&&e.backend!=="webgl"&&e.backend!=="both")throw new Error('Shader config backend must be "webgpu", "webgl", or "both".');let l=x(e.timeoutMs,"Shader timeoutMs",1e3,15*6e4,24e4);return {schemaVersion:1,backend:e.backend??"both",scenes:pr(e.scenes),settleFrames:x(e.settleFrames,"Shader settleFrames",0,1e4,60),settleTimeoutMs:x(e.settleTimeoutMs,"Shader settleTimeoutMs",1e3,15*6e4,3e4),browserRelaunchScenes:x(e.browserRelaunchScenes,"Shader browserRelaunchScenes",1,64,8),timeoutMs:l,maxTimeoutMs:Math.max(l,x(e.maxTimeoutMs,"Shader maxTimeoutMs",1e3,15*6e4,l)),viewport:{width:x(c(r)?r.width:void 0,"Shader viewport width",64,8192,1024),height:x(c(r)?r.height:void 0,"Shader viewport height",64,8192,640)},parity:{frames:x(c(t)?t.frames:void 0,"Shader parity frames",0,1e4,90),channelTolerance:x(c(t)?t.channelTolerance:void 0,"Shader parity channelTolerance",0,255,8),maxDiffRatio:Ne(c(t)?t.maxDiffRatio:void 0,"Shader parity maxDiffRatio",.01)},bridge:{legacyLab:c(n)&&n.legacyLab===true,...typeof i=="string"?{deterministicModule:i}:{}},readiness:{...typeof a=="string"?{selector:a}:{},...typeof d=="string"?{global:d}:{}},publicDir:Oe(e.publicDir,"Shader publicDir","public"),allowLiveBuilds:e.allowLiveBuilds!==false}}a(G,"parseShaderToolConfig");async function qr(e=process.cwd()){let r=p.resolve(e);for(;;){if(await w(p.join(r,se))||await w(p.join(r,"three-blocks.json")))return realpath(r);let t=p.join(r,"package.json");if(await w(t)){let i=await N(r,t,O.packageJson,"Project package.json"),o;try{o=JSON.parse(i.data.toString("utf8"));}catch{throw new Error(`Project package.json is not valid JSON: ${t}.`)}if(c(o)&&[o.dependencies,o.devDependencies,o.peerDependencies,o.optionalDependencies].filter(c).some(l=>typeof l.three=="string"||typeof l["three-blocks"]=="string"||typeof l["@three-blocks/devtools"]=="string"))return realpath(r)}let n=p.dirname(r);if(n===r)throw new Error(`No Three Blocks shader project found from ${JSON.stringify(p.resolve(e))}; add Three.js to package.json or pass --root.`);r=n;}}a(qr,"findShaderProjectRoot");async function ae(e){let r=await realpath(e),t=p.join(r,se);if(await w(t)){let i=await N(r,t,O.metadata,"Shader configuration");return G(JSON.parse(i.data.toString("utf8")))}let n=p.join(r,"three-blocks.json");if(await w(n)){let i=Ae(JSON.parse(await readFile(n,"utf8")));return G({schemaVersion:1,backend:"both",scenes:[{key:i.template,url:"/",requiresText:i.features.text}]})}return G(Ie)}a(ae,"loadShaderToolConfig");async function Yr(e){let r=await realpath(e);for(let o of ["vite.config.ts","vite.config.mts","vite.config.js","vite.config.mjs","vite.config.cts","vite.config.cjs"])if(await w(p.join(r,o)))return {driverKind:"vite",reason:`Detected ${o}.`};let t,n=p.join(r,"package.json");if(await w(n)){let o=await N(r,n,O.packageJson,"Project package.json"),a=JSON.parse(o.data.toString("utf8"));c(a)&&(t=a);}let i=a(o=>[t?.dependencies,t?.devDependencies,t?.peerDependencies,t?.optionalDependencies].some(a=>c(a)&&typeof a[o]=="string"),"hasDependency");if(i("vite"))return {driverKind:"vite",reason:"Detected the Vite dependency."};for(let o of ["dist","build","out"])if(await w(p.join(r,o,"index.html")))return {driverKind:"static",serve:o,reason:`Detected the built ${o}/index.html application.`};if(i("next"))throw new Error("Detected Next.js without an attach URL. Run `shaders capture` without an explicit driver or URL to preview the withThreeBlocksNext adapter and start a project-local capture server, or pass --url <local-url> for a server you manage.");if(i("webpack")||i("esbuild")||i("rollup"))throw new Error("Detected a non-Vite bundler but no static index.html. Run `shaders capture` without an explicit driver or URL to preview adapter wiring and build the project, or build it yourself and pass --driver static --serve <directory>.");return {driverKind:"vite",reason:"Using the Vite golden-path driver."}}a(Yr,"inferShaderCaptureTarget");async function Xr(e){let r=await realpath(e),t=p.join(r,se);if(await w(t))return {config:await ae(r),file:t,created:false};let n=p.join(r,"three-blocks.json");if(await w(n))return {config:await ae(r),file:n,created:false};let i=Ie,o=G(i),a=await _e(t,`${JSON.stringify(i,null,2)}
|
|
2
|
-
`);return {config:a?o:await ae(r),file:t,created:a}}a(Xr,"ensureShaderToolConfig");function ce(e,r="webgpu"){if(/^0\.185\./u.test(e))return r==="webgl"?THREE_WEBGL_R185_COMPATIBILITY:THREE_WEBGPU_R185_COMPATIBILITY;if(e===THREE_R186DEV_VERSION&&r==="webgpu")return THREE_WEBGPU_R186DEV_COMPATIBILITY;throw new Error(`Three.js ${e} is outside the supported shader compatibility contracts.`)}a(ce,"shaderCompatibilityForThree");var ue="0.1.0";var he=
|
|
2
|
+
`);return {config:a?o:await ae(r),file:t,created:a}}a(Xr,"ensureShaderToolConfig");function ce(e,r="webgpu"){if(/^0\.185\./u.test(e))return r==="webgl"?THREE_WEBGL_R185_COMPATIBILITY:THREE_WEBGPU_R185_COMPATIBILITY;if(e===THREE_R186DEV_VERSION&&r==="webgpu")return THREE_WEBGPU_R186DEV_COMPATIBILITY;throw new Error(`Three.js ${e} is outside the supported shader compatibility contracts.`)}a(ce,"shaderCompatibilityForThree");var ue="0.1.0";var he=62,ye="timing.local.json",ge="timing.json",Se="parity.json",J=4096,wr=4096;function pe(e,r,t=8192){if(typeof e!="string"||e.length===0||e.length>t||/[\u0000\u007f]/u.test(e))throw new Error(`${r} must be a bounded non-empty string.`);return e}a(pe,"boundedString");function m(e,r,t=true){if(typeof e!="number"||!Number.isFinite(e)||e<0||t&&!Number.isSafeInteger(e))throw new Error(`${r} must be a non-negative ${t?"integer":"finite number"}.`);return e}a(m,"nonNegativeNumber");function br(e){if(!c(e))throw new Error("Shader capture stats are missing.");let r={buildCalls:m(e.buildCalls,"capture stats.buildCalls"),renderBuilds:m(e.renderBuilds,"capture stats.renderBuilds"),computeBuilds:m(e.computeBuilds,"capture stats.computeBuilds"),registeredBuilds:m(e.registeredBuilds,"capture stats.registeredBuilds"),registeredRenderBuilds:m(e.registeredRenderBuilds,"capture stats.registeredRenderBuilds"),registeredComputeBuilds:m(e.registeredComputeBuilds,"capture stats.registeredComputeBuilds"),buildMs:m(e.buildMs,"capture stats.buildMs",false),syncBuildMs:m(e.syncBuildMs,"capture stats.syncBuildMs",false),asyncBuildElapsedMs:m(e.asyncBuildElapsedMs,"capture stats.asyncBuildElapsedMs",false),precompiledSetupMs:m(e.precompiledSetupMs,"capture stats.precompiledSetupMs",false),maxSyncBuildMs:m(e.maxSyncBuildMs??e.syncBuildMs,"capture stats.maxSyncBuildMs",false),maxPrecompiledSetupMs:m(e.maxPrecompiledSetupMs??e.precompiledSetupMs,"capture stats.maxPrecompiledSetupMs",false),hydrationMs:m(e.hydrationMs??0,"capture stats.hydrationMs",false),maxHydrationMs:m(e.maxHydrationMs??e.hydrationMs??0,"capture stats.maxHydrationMs",false),injected:m(e.injected,"capture stats.injected"),injectedRender:m(e.injectedRender,"capture stats.injectedRender"),injectedCompute:m(e.injectedCompute,"capture stats.injectedCompute"),missed:m(e.missed,"capture stats.missed"),missedRender:m(e.missedRender,"capture stats.missedRender"),missedCompute:m(e.missedCompute,"capture stats.missedCompute"),...Array.isArray(e.missedKeys)&&e.missedKeys.every(t=>typeof t=="string")?{missedKeys:e.missedKeys.slice(0,J)}:{}};if(r.renderBuilds+r.computeBuilds!==r.buildCalls||r.registeredRenderBuilds+r.registeredComputeBuilds!==r.registeredBuilds||r.injectedRender+r.injectedCompute!==r.injected||r.missedRender+r.missedCompute!==r.missed||r.registeredBuilds>r.buildCalls||Math.abs(r.syncBuildMs+r.asyncBuildElapsedMs-r.buildMs)>.001||r.maxSyncBuildMs>r.syncBuildMs+.001||r.maxPrecompiledSetupMs>r.precompiledSetupMs+.001||r.maxHydrationMs>r.hydrationMs+.001)throw new Error("Shader capture stats totals are inconsistent.");return r}a(br,"captureStats");function Er(e){if(!Array.isArray(e)||e.length>J)throw new Error("Shader capture skipped builds are invalid.");return e.map((r,t)=>{if(!c(r)||r.kind!=="render"&&r.kind!=="compute")throw new Error(`Shader capture skipped build ${t} is invalid.`);return {kind:r.kind,name:pe(r.name,`skipped build ${t} name`,512),reason:pe(r.reason,`skipped build ${t} reason`)}})}a(Er,"skippedBuilds");function kr(e){let r=0,t=0,n=0,i=0;for(let o of Object.values(e.entries)){let a=e.states[o];a!==void 0&&((a.vertex!==null||a.fragment!==null)&&r++,a.vertex!==null&&t++,a.fragment!==null&&n++,a.compute!==null&&i++);}return {render:r,vertex:t,fragment:n,compute:i}}a(kr,"shaderCoverage");function ft(e,r){if(!c(e))throw new Error("Shader capture payload must be an object.");if(e.scene!==r.scene)throw new Error(`Shader capture scene does not match "${r.scene}".`);if(e.protocolVersion!==2)throw new Error("Shader capture protocolVersion must be 2.");let t=r.backend??"webgpu",n=ce(r.runtime.three,t);if(e.compatibility!==n)throw new Error(`Shader capture compatibility must be "${n}".`);if(!c(e.entries))throw new Error("Shader capture entries must be an object.");if(typeof e.requiresSetup!="boolean")throw new Error("Shader capture requiresSetup must be boolean.");let i=Object.keys(e.entries).length;if(i>J)throw new Error(`Shader capture must contain at most ${J} entries.`);if(!Array.isArray(e.errors)||e.errors.length>wr)throw new Error("Shader capture errors are invalid.");let o=e.errors.map((R,u)=>pe(R,`capture error ${u}`,64*1024));if(o.length>0)throw new Error(`Shader capture failed:
|
|
3
3
|
- ${o.join(`
|
|
4
4
|
- `)}`);let a=Er(e.skipped);if(i===0&&(t!=="webgl"||a.length===0))throw new Error("Shader capture must contain an entry unless WebGL explicitly skipped every live build.");let d=br(e.stats),l=c(e.timing)?e.timing:void 0,y=l===void 0?void 0:Object.fromEntries(["launch","firstRequest","readiness","lastBuild","settled","posted"].flatMap(R=>{let u=l[R];if(u===void 0)return [];if(typeof u!="number"||!Number.isFinite(u)||u<0)throw new Error(`Shader capture timing.${R} is invalid.`);return [[R,u]]})),f;if(e.provenance!==void 0){if(!c(e.provenance)||typeof e.provenance.userAgent!="string"||e.provenance.userAgent.length>1024||typeof e.provenance.adapter!="string"||e.provenance.adapter.length>1024||!Array.isArray(e.provenance.features)||e.provenance.features.length>256||!e.provenance.features.every(R=>typeof R=="string"&&R.length<=128))throw new Error("Shader capture provenance is invalid.");f={userAgent:e.provenance.userAgent,adapter:e.provenance.adapter,features:[...new Set(e.provenance.features)].sort()};}let h=parsePrecompiledManifest({version:PRECOMPILED_MANIFEST_VERSION,scene:r.scene,three:r.runtime.three,threeBlocks:r.runtime.threeBlocks,runtime:{id:n,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION},...e.automatic===void 0?{}:{automatic:e.automatic},requiresSetup:e.requiresSetup,modules:e.modules,nodes:e.nodes,layouts:e.layouts,attributePlans:e.attributePlans,updatePlans:e.updatePlans,requirementPlans:e.requirementPlans,states:e.states,entries:e.entries,...e.fallbacks===void 0?{}:{fallbacks:e.fallbacks}}),k=kr(h);if(d.registeredRenderBuilds<k.render||d.registeredComputeBuilds<k.compute)throw new Error("Shader capture did not live-build every distinct registered render/compute entry.");return {scene:r.scene,backend:t,manifest:h,skipped:a,stats:d,coverage:k,...y===void 0?{}:{timing:y},...f===void 0?{}:{provenance:f}}}a(ft,"validateShaderCapture");function A(e,r=0){let t=" ".repeat(r),n=" ".repeat(r+1);if(Array.isArray(e))return e.length===0?"[]":e.every(o=>o===null||["number","string","boolean"].includes(typeof o))?JSON.stringify(e):`[
|
|
5
5
|
${e.map(o=>`${n}${A(o,r+1)}`).join(`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {V,W}from'./chunk-
|
|
1
|
+
import {V,W}from'./chunk-3CKEE22B.js';import {a}from'./chunk-EI7MMDWY.js';import {existsSync,readFileSync,readFile}from'fs';import {createRequire}from'module';import d from'path';var m="@three-blocks/devtools/webpack-loader";function y(e){if(typeof e=="string")return e===m;if(Array.isArray(e))return e.some(y);if(e===null||typeof e!="object")return false;let o=e;return o.loader===m||y(o.use)}a(y,"webpackRuleUsesShaderLoader");function T(e){let o=b(process.cwd()),r=a(t=>x(o,t),"exact"),n={...e.resolve?.alias,...r("three")===void 0?{}:{three$:r("three")},...r("three/webgpu")===void 0?{}:{"three/webgpu$":r("three/webgpu")},...r("three/tsl")===void 0?{}:{"three/tsl$":r("three/tsl")},"three/addons":d.join(o.root,"examples/jsm"),"three/examples/jsm":d.join(o.root,"examples/jsm")};return {...e,resolve:{...e.resolve,alias:n}}}a(T,"withTargetThreeAliases");function w(e){let o=T(e),r=o.module?.rules??[];return r.some(y)?o:{...o,module:{...o.module,rules:[...r,{enforce:"pre",test:/three[\\/]build[\\/]three\.webgpu\.js$/u,use:[{loader:m}]}]}}}a(w,"withShaderWebpackRule");function A(e){return w(e)}a(A,"withThreeBlocksWebpack");function B(e){let r=e.webpack;return {...e,webpack(n,...t){let s=r?.call(this,n,...t)??n,i=t[0];return i!==null&&typeof i=="object"&&Reflect.get(i,"isServer")===true?T(s):w(s)}}}a(B,"withThreeBlocksNext");function b(e){let o;try{o=createRequire(d.join(d.resolve(e),"package.json")).resolve("three");}catch(s){throw new Error("The shader adapter could not resolve Three.js from the target project.",{cause:s})}let r=d.dirname(o),n,t;for(;;){let s=d.join(r,"package.json");if(existsSync(s)){let l=JSON.parse(readFileSync(s,"utf8"));if(l.name==="three"){n=s,t=l;break}}let i=d.dirname(r);if(i===r)break;r=i;}if(n===void 0)throw new Error(`The shader adapter could not locate Three.js package metadata from ${o}.`);if(typeof t?.version!="string"||t.version.length===0)throw new Error(`The resolved Three.js package has no version: ${n}`);return {root:d.dirname(n),version:t.version,exports:t.exports}}a(b,"resolveThreePackage");function L(e=process.cwd()){return b(e).version}a(L,"resolveShaderAdapterThreeVersion");function v(e){return {version:e.threeVersion??L(e.root),capture:e.capture??process.env.THREE_BLOCKS_SHADER_TOOL==="1"}}a(v,"resolvedOptions");function _(e,o,r={}){if(!V(o))return null;let n=v(r);return W(e,n.version,{instrumentCapture:n.capture})}a(_,"transformThreeWebGPUModule");function g(e){if(typeof e=="string")return e;if(Array.isArray(e)){for(let r of e){let n=g(r);if(n!==void 0)return n}return}if(e===null||typeof e!="object")return;let o=e;for(let r of ["browser","import","default"]){let n=g(o[r]);if(n!==void 0)return n}}a(g,"exportTarget");function x(e,o){if(e.exports===null||typeof e.exports!="object")return;let r=e.exports,n=o==="three"?".":`./${o.slice(6)}`,t=g(r[n]);if(t!==void 0)return d.resolve(e.root,t);for(let[s,i]of Object.entries(r)){let l=s.indexOf("*");if(l<0)continue;let c=s.slice(0,l),u=s.slice(l+1);if(!n.startsWith(c)||!n.endsWith(u))continue;let f=n.slice(c.length,n.length-u.length),p=g(i);if(p!==void 0)return d.resolve(e.root,p.replaceAll("*",f))}}a(x,"resolveThreeExport");function $(e={}){let o=e.root??process.cwd(),r=b(o),n={version:e.threeVersion??r.version,capture:e.capture??process.env.THREE_BLOCKS_SHADER_TOOL==="1"};return {name:"three-blocks-shader-provider",setup(t){t.onResolve?.({filter:/^three(?:\/.*)?$/},s=>{let i=x(r,s.path);return i===void 0?void 0:{path:i}}),t.onLoad({filter:/three[\\/]build[\\/]three\.webgpu\.js$/},async s=>{let i=await new Promise((c,u)=>{readFile(s.path,"utf8",(f,p)=>{f?u(f):c(p);});});return {contents:W(i,n.version,{instrumentCapture:n.capture}).code,loader:"js"}});}}}a($,"createEsbuildShaderPlugin");function H(e={}){let o=v(e);return {name:"three-blocks-shader-provider",enforce:"pre",transform(r,n){return V(n)?{code:W(r,o.version,{instrumentCapture:o.capture}).code,map:null}:null}}}a(H,"createRollupShaderPlugin");export{m as a,A as b,B as c,L as d,_ as e,$ as f,H as g};
|