@three-blocks/devtools 11.0.0 → 11.1.0-alpha.395.g9b8ccb48a515
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/NOTICE +26 -0
- package/README.md +117 -170
- package/dist/asset-optimize-YJGWKD4Y.js +1 -0
- package/dist/asset-transforms-ZVZ4RD4L.js +11 -0
- package/dist/browser/shader-capture.js +2 -2
- package/dist/browser-smoke-4MYMHKWB.js +1 -0
- package/dist/chunk-4SVF5BRM.js +2 -0
- package/dist/chunk-7X4DHW36.js +1 -0
- package/dist/chunk-BBODS5RH.js +5 -0
- package/dist/{chunk-IILE5RBI.js → chunk-CMMYXGQ3.js} +1 -2
- package/dist/chunk-DCLDEPPB.js +253 -0
- package/dist/{chunk-5L2VS3BN.js → chunk-ECQE4D2U.js} +1 -2
- package/dist/chunk-IWQV456Z.js +3 -0
- package/dist/chunk-LSH64HEU.js +80 -0
- package/dist/{chunk-X5OFYHIY.js → chunk-MIJXPQPM.js} +2 -3
- package/dist/chunk-NDIPQLTU.js +16 -0
- package/dist/{chunk-NPLE7PPF.js → chunk-NJITVI23.js} +1 -2
- package/dist/chunk-O5FU2ASS.js +16 -0
- package/dist/chunk-QQKHDH26.js +1 -0
- package/dist/chunk-S5LI2C2H.js +5 -0
- package/dist/chunk-SBUKHO24.js +1 -0
- package/dist/chunk-TK566QET.js +1 -0
- package/dist/{chunk-65VEJRRT.js → chunk-WNSGAV6N.js} +1 -2
- package/dist/chunk-ZG3LO3VB.js +1 -0
- package/dist/{chunk-UDUICSME.js → chunk-ZTHZE36A.js} +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +26 -26
- package/dist/environment-bake-ON5I27N7.js +1 -0
- package/dist/index.d.ts +24 -12
- package/dist/index.js +1 -279
- package/dist/{shader-autowire-SPE5DM2X.js → shader-autowire-D2EOG6GF.js} +1 -2
- package/dist/shader-browser-6ICBHK3S.js +1 -0
- package/dist/shader-capture-server.d.ts +1 -1
- package/dist/shader-capture-server.js +1 -1
- package/dist/{shader-config-EOFU5D3Y.js → shader-config-AKZEKIRB.js} +1 -2
- package/dist/{shader-parity-QXJWR6OZ.js → shader-parity-7DEPQEDI.js} +1 -1
- package/dist/{shader-project-runner-S2AID2RJ.js → shader-project-runner-NV4GKHDX.js} +1 -2
- package/dist/shader-watch-JBUA4LP5.js +1 -0
- package/dist/shader-workflow-5EHHR32D.js +1 -0
- package/dist/status-GDVSLQWV.js +1 -0
- package/dist/text-atlas-YYWV7S6F.js +1 -0
- package/dist/transform.cjs +1 -1
- package/dist/transform.js +1 -1
- package/dist/webpack-loader.cjs +1 -1
- package/dist/webpack-loader.js +1 -1
- package/node/index.d.mts +70 -0
- package/node/index.mjs +407 -0
- package/node/ipc.mjs +31 -0
- package/node/layout.mjs +546 -0
- package/node/loader.mjs +103 -0
- package/node/media.mjs +454 -0
- package/node/recording.mjs +67 -0
- package/node/worker.mjs +1314 -0
- package/package.json +27 -11
- package/dist/asset-optimize-GG72JCOX.js +0 -6
- package/dist/browser-smoke-KFF7XV7F.js +0 -254
- package/dist/chunk-45AVKQQK.js +0 -80
- package/dist/chunk-5FT6AZD6.js +0 -82
- package/dist/chunk-7N6TU4JG.js +0 -17
- package/dist/chunk-EI7MMDWY.js +0 -1
- package/dist/chunk-HOZDD6PW.js +0 -2
- package/dist/chunk-LKXY5YU2.js +0 -17
- package/dist/chunk-MIUIIPS4.js +0 -1
- package/dist/chunk-NF4RFSUJ.js +0 -18
- package/dist/chunk-QJFPNM6W.js +0 -2
- package/dist/chunk-ZT6T2W4B.js +0 -2
- package/dist/chunk-ZZLAZ7GJ.js +0 -6
- package/dist/environment-bake-BGMGFAVK.js +0 -4
- package/dist/shader-browser-H5CB2ZQX.js +0 -2
- package/dist/shader-browser-UXXR6QI2.js +0 -1
- package/dist/shader-parity-XPKQQK26.js +0 -2
- package/dist/shader-watch-EORZ2SEC.js +0 -2
- package/dist/shader-workflow-7NQFDQI5.js +0 -2
- package/dist/status-PTBB4SW2.js +0 -2
- package/dist/text-atlas-UORTLOQJ.js +0 -2
- /package/dist/{chunk-TRHSN2DJ.cjs → chunk-LMLJIVNY.cjs} +0 -0
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {a as a$1}from'./chunk-65VEJRRT.js';import {j as j$1,a as a$2,c,h,b,f}from'./chunk-5L2VS3BN.js';import {a}from'./chunk-HOZDD6PW.js';import {createHash,randomUUID}from'crypto';import {rm,mkdir,writeFile,rename}from'fs/promises';import {platform,homedir}from'os';import y from'path';import {fileURLToPath}from'url';import*as G from'zlib';import {createDefaultContainer,VK_FORMAT_R8G8B8A8_UNORM,KHR_SUPERCOMPRESSION_ZSTD,KHR_SUPERCOMPRESSION_NONE,KHR_DF_FLAG_ALPHA_STRAIGHT,KHR_DF_TRANSFER_LINEAR,KHR_DF_PRIMARIES_BT709,KHR_DF_MODEL_RGBSDA,KHR_DF_VERSION,KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,KHR_DF_VENDORID_KHRONOS,KHR_DF_CHANNEL_RGBSDA_RED,KHR_DF_CHANNEL_RGBSDA_GREEN,KHR_DF_CHANNEL_RGBSDA_BLUE,KHR_DF_CHANNEL_RGBSDA_ALPHA,KHR_DF_SAMPLE_DATATYPE_LINEAR,write,read}from'ktx-parse';import It from'msdf-bmfont-xml';import se from'opentype.js';import {PNG}from'pngjs';import {createRequire}from'module';var Je=createRequire(import.meta.url),he,g=new Proxy({},{get(e,t){return he??=Je("typescript"),Reflect.get(he,t)}}),qe=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),Xe=new Set(["script","style","template"]),ge=2e5,Ze={amp:"&",apos:"'",copy:"\xA9",deg:"\xB0",gt:">",hellip:"\u2026",ldquo:"\u201C",lsquo:"\u2018",lt:"<",mdash:"\u2014",nbsp:"\xA0",ndash:"\u2013",quot:'"',rdquo:"\u201D",rsquo:"\u2019"};function Ye(e){return e.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z][a-z0-9]+);/giu,(t,n)=>{if(n.startsWith("#x")||n.startsWith("#X")){let r=Number.parseInt(n.slice(2),16);return H(r)?String.fromCodePoint(r):t}if(n.startsWith("#")){let r=Number.parseInt(n.slice(1),10);return H(r)?String.fromCodePoint(r):t}return Ze[n.toLowerCase()]??t})}a(Ye,"decodeHtmlEntities");function H(e){return Number.isSafeInteger(e)&&e>=0&&e<=1114111&&!(e>=55296&&e<=57343)}a(H,"validCodePoint");function we(e){return H(e)&&e>=32&&!(e>=127&&e<=159)}a(we,"renderableCodePoint");function Qe(e){return /(?:^|\s)data-canvas-text(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?(?=\s|\/?>)/iu.test(e)}a(Qe,"hasCanvasTextAttribute");function xe(e){let t=[],n=[],r=e.match(/<!--[\s\S]*?-->|<![^>]*>|<[^>]*>|[^<]+/gu)??[];for(let o of r){if(!o.startsWith("<")){if(n.some(s=>s.synchronized)&&!n.some(s=>s.skipped)){let s=Ye(o);s.trim().length>0&&t.push(s);}continue}if(o.startsWith("<!--")||o.startsWith("<!")||o.startsWith("<?"))continue;let i=/^<\s*\//u.test(o),a=/^<\s*\/?\s*([a-z][a-z0-9:-]*)/iu.exec(o)?.[1]?.toLowerCase();if(!a)continue;if(i){let s=n.map(u=>u.tag).lastIndexOf(a);s>=0&&n.splice(s);continue}/\/\s*>$/u.test(o)||qe.has(a)||n.push({tag:a,synchronized:Qe(o),skipped:Xe.has(a)});}return t}a(xe,"extractCanvasTextFromHtml");function et(e){let t=new Set,n=new Set;for(let r of e.statements){if(!g.isImportDeclaration(r)||!g.isStringLiteral(r.moduleSpecifier)||r.moduleSpecifier.text!=="three-blocks/text")continue;let o=r.importClause?.namedBindings;if(o&&g.isNamespaceImport(o)&&n.add(o.name.text),o&&g.isNamedImports(o))for(let i of o.elements)(i.propertyName?.text??i.name.text)==="defineTextContent"&&t.add(i.name.text);}return {named:t,namespaces:n}}a(et,"importedTextHelpers");function tt(e,t){return g.isIdentifier(e)?t.named.has(e.text):g.isPropertyAccessExpression(e)&&g.isIdentifier(e.expression)&&t.namespaces.has(e.expression.text)&&e.name.text==="defineTextContent"}a(tt,"isDefineTextContentCall");function nt(e){let t=e;for(;g.isParenthesizedExpression(t)||g.isAsExpression(t)||g.isSatisfiesExpression(t)||g.isTypeAssertionExpression(t);)t=t.expression;return t}a(nt,"unwrapExpression");function Q(e,t,n){let r=nt(e);if(g.isStringLiteral(r)||g.isNoSubstitutionTemplateLiteral(r)){t.push(r.text);return}if(g.isArrayLiteralExpression(r)){for(let a of r.elements){if(g.isSpreadElement(a))throw new Error(`${n}: defineTextContent() cannot use spread elements.`);Q(a,t,n);}return}if(g.isObjectLiteralExpression(r)){for(let a of r.properties){if(!g.isPropertyAssignment(a))throw new Error(`${n}: defineTextContent() accepts only static property assignments.`);Q(a.initializer,t,n);}return}let o=r.getStart(),i=r.getSourceFile().getLineAndCharacterOfPosition(o).line+1;throw new Error(`${n}:${i}: defineTextContent() contains dynamic text; declare a Unicode range or an explicit static string.`)}a(Q,"collectStaticStrings");function be(e,t="content.ts"){let n=g.createSourceFile(t,e,g.ScriptTarget.Latest,true,t.endsWith(".tsx")?g.ScriptKind.TSX:g.ScriptKind.TS),r=et(n),o=[];function i(a){if(g.isCallExpression(a)&&tt(a.expression,r)){if(a.arguments.length!==1||!a.arguments[0])throw new Error(`${t}: defineTextContent() requires exactly one static argument.`);Q(a.arguments[0],o,t);return}g.forEachChild(a,i);}return a(i,"visit"),i(n),o}a(be,"extractDefinedTextContent");function rt(e){let t=[];if(e==="latin"){for(let n=32;n<=126;n++)t.push(n);for(let n of "\u2018\u2019\u201C\u201D\u2013\u2014\u2026\u2022\xB7\xAB\xBB\u2039\u203A\u20AC\xA3\xA5\xB0\xB1\xD7\xF7\xA9\xAE\u2122\xA0"){let r=n.codePointAt(0);r!==void 0&&t.push(r);}}else {for(let n=12353;n<=12438;n++)t.push(n);for(let n=12443;n<=12447;n++)t.push(n);for(let n=12448;n<=12543;n++)t.push(n);for(let n of "\u3000\u3001\u3002\u300C\u300D\u300E\u300F\uFF08\uFF09\u30FB\u30FC\u301C\u3008\u3009\u300A\u300B\u3010\u3011\uFF01\uFF1F\uFF1A\uFF1B\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\uFF05\uFF06"){let r=n.codePointAt(0);r!==void 0&&t.push(r);}}return t}a(rt,"presetCodePoints");function ye(e,t){for(let n of t.normalize("NFC")){let r=n.codePointAt(0);r!==void 0&&we(r)&&e.add(r);}}a(ye,"addCharacters");function Te(e,t={}){let n=new Set;for(let c of e)ye(n,c);t.additionalCharacters&&ye(n,t.additionalCharacters);for(let c of t.presets??[])for(let s of rt(c))n.add(s);let r=0;for(let c of t.ranges??[]){if(!H(c.start)||!H(c.end)||c.end<c.start)throw new RangeError("Text Unicode ranges must contain ordered Unicode scalar values.");if(r+=c.end-c.start+1,r>ge)throw new RangeError(`Configured Unicode ranges exceed the ${ge}-code-point safety limit.`);for(let s=c.start;s<=c.end;s++)we(s)&&n.add(s);}n.add(32),n.add(63),n.add(65533);let o=[...n].sort((c,s)=>c-s),i=o.map(c=>String.fromCodePoint(c)).join(""),a=createHash("sha256").update(i.normalize("NFC")).digest("hex");return {codePoints:o,characters:i,hash:a}}a(Te,"buildGlyphSet");var it=createRequire(import.meta.url),Ee,p=new Proxy({},{get(e,t){return Ee??=it("typescript"),Reflect.get(Ee,t)}});function st(e){let t=e;for(;p.isParenthesizedExpression(t)||p.isAsExpression(t)||p.isSatisfiesExpression(t)||p.isTypeAssertionExpression(t);)t=t.expression;return t}a(st,"unwrap");function at(e,t){if(p.isIdentifier(e)||p.isStringLiteral(e)||p.isNumericLiteral(e))return e.text;throw new Error(`${t}: text configuration property names must be static.`)}a(at,"propertyName");function V(e,t){let n=st(e);if(p.isStringLiteral(n)||p.isNoSubstitutionTemplateLiteral(n))return n.text;if(p.isNumericLiteral(n))return Number(n.text);if(n.kind===p.SyntaxKind.TrueKeyword)return true;if(n.kind===p.SyntaxKind.FalseKeyword)return false;if(n.kind===p.SyntaxKind.NullKeyword)return null;if(p.isPrefixUnaryExpression(n)&&(n.operator===p.SyntaxKind.MinusToken||n.operator===p.SyntaxKind.PlusToken)){let o=V(n.operand,t);if(typeof o=="number")return n.operator===p.SyntaxKind.MinusToken?-o:o}if(p.isArrayLiteralExpression(n))return n.elements.map(o=>{if(p.isSpreadElement(o))throw new Error(`${t}: text configuration cannot use spread elements.`);return V(o,t)});if(p.isObjectLiteralExpression(n)){let o=Object.create(null);for(let i of n.properties){if(!p.isPropertyAssignment(i))throw new Error(`${t}: text configuration accepts only static property assignments.`);let a=at(i.name,t);if(Object.hasOwn(o,a))throw new Error(`${t}: duplicate text configuration property "${a}".`);o[a]=V(i.initializer,t);}return o}let r=n.getSourceFile().getLineAndCharacterOfPosition(n.getStart()).line+1;throw new Error(`${t}:${r}: text configuration must be statically inspectable.`)}a(V,"evaluateStatic");function ct(e){let t=new Set,n=new Set;for(let r of e.statements){if(!p.isImportDeclaration(r)||!p.isStringLiteral(r.moduleSpecifier)||r.moduleSpecifier.text!=="three-blocks/text")continue;let o=r.importClause?.namedBindings;if(o&&p.isNamespaceImport(o)&&n.add(o.name.text),o&&p.isNamedImports(o))for(let i of o.elements)(i.propertyName?.text??i.name.text)==="defineText"&&t.add(i.name.text);}return {named:t,namespaces:n}}a(ct,"helperNames");function dt(e,t){return p.isIdentifier(e)?t.named.has(e.text):p.isPropertyAccessExpression(e)&&p.isIdentifier(e.expression)&&t.namespaces.has(e.expression.text)&&e.name.text==="defineText"}a(dt,"isDefineTextCall");function $(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string.`);return e}a($,"requiredString");function J(e,t,n=false){if(!Array.isArray(e)||!n&&e.length===0)throw new Error(`${t} must be ${n?"an":"a non-empty"} array of strings.`);return e.map((r,o)=>$(r,`${t}[${o}]`))}a(J,"stringArray");function q(e,t){if(e.includes("\\")||y.posix.isAbsolute(e)||y.posix.normalize(e)!==e||e===".."||e.startsWith("../")||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a safe project-relative path.`);return e}a(q,"safeProjectPath");function lt(e,t){if(!a$1(e))throw new Error(`${t} must be an object.`);let n=Object.keys(e).sort();if(n.length===1&&n[0]==="builtin")return {builtin:$(e.builtin,`${t}.builtin`)};if(n.length===1&&n[0]==="path")return {path:q($(e.path,`${t}.path`),`${t}.path`)};if(n.join(",")==="checksum,file,package")return {package:$(e.package,`${t}.package`),file:q($(e.file,`${t}.file`),`${t}.file`),checksum:$(e.checksum,`${t}.checksum`)};throw new Error(`${t} must select exactly one supported source.`)}a(lt,"parseFontSource");function M(e,t){let n=$(e,t);if(n.includes("\\")||/[\u0000-\u001f\u007f]/u.test(n)||n.split("/").includes(".."))throw new Error(`${t} is unsafe.`);return n}a(M,"deployedPath");function ut(e){if(e===void 0)return {};if(!a$1(e))throw new Error("Text generation options must be an object.");let t=e.presets===void 0?void 0:J(e.presets,"Text generation presets",true).map(s=>{if(s!=="latin"&&s!=="japanese-kana")throw new Error(`Unsupported text preset "${s}".`);return s}),n;if(e.ranges!==void 0){if(!Array.isArray(e.ranges))throw new Error("Text generation ranges must be an array.");n=e.ranges.map((s,u)=>{if(!a$1(s)||typeof s.start!="number"||typeof s.end!="number")throw new Error(`Text generation range ${u} is invalid.`);return {start:s.start,end:s.end}});}let r=a(s=>{let u=e[s];if(u!==void 0){if(typeof u!="number"||!Number.isFinite(u))throw new Error(`Text generation ${s} must be finite.`);return u}},"numeric"),o=r("size"),i=r("distanceRange"),a$2=r("padding"),c=r("maxTextureSize");return {...t===void 0?{}:{presets:t},...n===void 0?{}:{ranges:n},...e.additionalCharacters===void 0?{}:{additionalCharacters:$(e.additionalCharacters,"Text generation additionalCharacters")},...o===void 0?{}:{size:o},...i===void 0?{}:{distanceRange:i},...a$2===void 0?{}:{padding:a$2},...c===void 0?{}:{maxTextureSize:c}}}a(ut,"parseGeneration");function ft(e){if(!a$1(e)||e.schemaVersion!==void 0&&e.schemaVersion!==1)throw new Error("Text configuration must use schemaVersion 1.");let t=J(e.content,"Text content inputs").map(o=>q(o,"Text content input"));if(!a$1(e.fonts)||Object.keys(e.fonts).length===0)throw new Error("Text fonts must be a non-empty object.");let n={},r=0;for(let[o,i]of Object.entries(e.fonts)){if($(o,"Text font key"),!a$1(i))throw new Error(`Text font "${o}" must be an object.`);let a=i.default===true;a&&r++;let c={};if(i.weights!==void 0){if(!a$1(i.weights))throw new Error(`Text font "${o}" weights must be an object.`);for(let[s,u]of Object.entries(i.weights)){let l=Number(s);if(!Number.isInteger(l)||l<1||l>1e3)throw new Error(`Text font "${o}" weight "${s}" must be an integer CSS weight between 1 and 1000.`);if(!a$1(u))throw new Error(`Text font "${o}" weight ${s} must be an object.`);c[String(l)]={atlas:M(u.atlas,`Text font "${o}" weight ${s} atlas path`),metrics:M(u.metrics,`Text font "${o}" weight ${s} metrics path`)};}}n[o]={source:lt(i.source,`Text font "${o}" source`),browser:M(i.browser,`Text font "${o}" browser path`),atlas:M(i.atlas,`Text font "${o}" atlas path`),metrics:M(i.metrics,`Text font "${o}" metrics path`),weights:c,families:J(i.families,`Text font "${o}" families`),languages:i.languages===void 0?[]:J(i.languages,`Text font "${o}" languages`,true),default:a};}if(Object.keys(n).length>1&&r!==1)throw new Error("Multiple text fonts require exactly one default route.");if(r>1)throw new Error("Text fonts can select only one default route.");return {schemaVersion:1,content:t,fonts:n,generation:ut(e.generation)}}a(ft,"validateConfiguration");function pt(e,t="three-blocks.text.ts"){let n=p.createSourceFile(t,e,p.ScriptTarget.Latest,true,p.ScriptKind.TS),r=ct(n),o=[];function i(a){if(p.isCallExpression(a)&&dt(a.expression,r)){if(a.arguments.length!==1||!a.arguments[0])throw new Error(`${t}: defineText() requires one static argument.`);o.push(V(a.arguments[0],t));return}p.forEachChild(a,i);}if(a(i,"visit"),i(n),o.length!==1)throw new Error(`${t} must contain exactly one imported defineText() call.`);return ft(o[0])}a(pt,"parseTextConfiguration");function ee(e,t){if(typeof e=="string")t.push(e);else if(Array.isArray(e))for(let n of e)ee(n,t);else if(a$1(e))for(let n of Object.values(e))ee(n,t);}a(ee,"jsonStrings");async function te(e,t="three-blocks.text.ts"){let n=q(t,"Text configuration path"),r=await j$1(e,y.join(e,n),a$2.semanticInput,"Text configuration");return pt(r.data.toString("utf8"),n)}a(te,"readTextConfiguration");async function ne(e,t){let n=[],r={},o=0;for(let i of t.content){let a=await j$1(e,y.join(e,i),a$2.semanticInput,"Text content input");if(o+=a.data.byteLength,o>a$2.semanticTotal)throw new Error("Text content inputs exceed the total inspection size limit.");r[i]=c(a.data);let c$1=a.data.toString("utf8"),s=y.extname(i).toLowerCase();if(s===".html"||s===".htm")n.push(...xe(c$1));else if([".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"].includes(s))n.push(...be(c$1,i));else if(s===".json")ee(JSON.parse(c$1),n);else if(s===".txt"||s===".md")n.push(c$1);else throw new Error(`Unsupported configured text content type: ${i}.`)}return {values:n,glyphs:Te(n,t.generation),inputs:r}}a(ne,"discoverTextContent");var Ie=1,Z="1.0.0",_t=Object.freeze({"geist-sans":{id:"geist-sans",family:"Geist Sans",version:"1.600",license:"OFL-1.1",licenseFile:"OFL-1.1.txt",sourceFile:"geist-sans/Geist-Variable.ttf",sourceUrl:"https://raw.githubusercontent.com/vercel/geist-font/1.6.0/fonts/Geist/variable/Geist%5Bwght%5D.ttf",sourceBytes:168472,sourceChecksum:"995c579489b33cd28a6732d7aa7ca1b46c2faa832c18b4063933d7652c39932b",browserFile:"geist-sans/Geist-Variable.woff2",browserUrl:"https://raw.githubusercontent.com/vercel/geist-font/1.6.0/fonts/Geist/webfonts/Geist%5Bwght%5D.woff2",browserBytes:69356,browserChecksum:"fd0de7b7c4329443c2fa2fadae90d57af9fa7857a814568f5a529537541a5538"},"noto-sans-jp":{id:"noto-sans-jp",family:"Noto Sans JP",version:"2.004-H2",license:"OFL-1.1",licenseFile:"OFL-1.1.txt",sourceFile:"noto-sans-jp/NotoSansJP[wght].ttf",sourceUrl:"https://raw.githubusercontent.com/google/fonts/295d98a7a0c17c68f1341eaeea354e7960ea70d3/ofl/notosansjp/NotoSansJP%5Bwght%5D.ttf",sourceBytes:9589900,sourceChecksum:"c2f3b4d463500a2ddcd3849cded1fceeb9fd6d1c32e6cbecd568453ba50fc68f",browserFile:"noto-sans-jp/NotoSansJP[wght].woff2",browserUrl:"https://raw.githubusercontent.com/RenaudRohlinger/three-blocks-monorepo/364a50cc5f6f92735a110b50144e8d62404c9d87/packages/three-blocks-devtools/fonts/noto-sans-jp/NotoSansJP%5Bwght%5D.woff2",browserBytes:4350080,browserChecksum:"6fd94964d1990baa2a392cea7a036683d2b80b9dfd590cb3918e8dab98d8e188"}}),Ht="THREE_BLOCKS_FONT_CACHE_DIR",Mt=6e4,X=new Map,Dt=fileURLToPath(new URL("../fonts/",import.meta.url));function A(e,t){if(typeof e!="number"||!Number.isFinite(e))throw new Error(`${t} must be finite.`);return e}a(A,"finiteNumber");function P(e,t){let n=A(e,t);if(!Number.isSafeInteger(n))throw new Error(`${t} must be an integer.`);return n}a(P,"integer");function zt(e){if(!a$1(e)||!a$1(e.info)||!a$1(e.common)||!Array.isArray(e.chars))throw new Error("MSDF generator returned invalid BMFont metadata.");let t=e.chars.map((o,i)=>{if(!a$1(o))throw new Error(`BMFont character ${i} is invalid.`);return {id:P(o.id,`BMFont character ${i}.id`),x:A(o.x,`BMFont character ${i}.x`),y:A(o.y,`BMFont character ${i}.y`),width:A(o.width,`BMFont character ${i}.width`),height:A(o.height,`BMFont character ${i}.height`),xoffset:A(o.xoffset,`BMFont character ${i}.xoffset`),yoffset:A(o.yoffset,`BMFont character ${i}.yoffset`),xadvance:A(o.xadvance,`BMFont character ${i}.xadvance`)}}),n=e.kernings===void 0?[]:e.kernings;if(!Array.isArray(n))throw new Error("BMFont kernings are invalid.");let r=n.map((o,i)=>{if(!a$1(o))throw new Error(`BMFont kerning ${i} is invalid.`);return {first:P(o.first,`BMFont kerning ${i}.first`),second:P(o.second,`BMFont kerning ${i}.second`),amount:A(o.amount,`BMFont kerning ${i}.amount`)}});return {info:{size:A(e.info.size,"BMFont info.size"),face:typeof e.info.face=="string"?e.info.face:"Font"},common:{base:A(e.common.base,"BMFont common.base"),scaleW:P(e.common.scaleW,"BMFont common.scaleW"),scaleH:P(e.common.scaleH,"BMFont common.scaleH")},chars:t,kernings:r}}a(zt,"parseBMFont");function Ne(e){let t=e.generation.size??48,n=e.generation.distanceRange??8,r=e.generation.padding??2,o=e.generation.maxTextureSize??4096;if(!Number.isInteger(t)||t<8||t>256)throw new Error("Text generation size must be an integer from 8 to 256.");if(!Number.isInteger(n)||n<1||n>64)throw new Error("Text generation distanceRange must be an integer from 1 to 64.");if(!Number.isInteger(r)||r<0||r>32)throw new Error("Text generation padding must be an integer from 0 to 32.");if(!Number.isInteger(o)||o<64||o>8192||(o&o-1)!==0)throw new Error("Text generation maxTextureSize must be a power of two from 64 to 8192.");return {size:t,distanceRange:n,padding:r,maxTextureSize:o}}a(Ne,"atlasOptions");function _e(e){let t=_t[e];if(t===void 0)throw new Error(`Unknown built-in font ${JSON.stringify(e)}.`);return t}a(_e,"builtinFontMetadata");function He(e){let t=e.cacheDirectory??process.env[Ht];return t?y.resolve(t):platform()==="darwin"?y.join(homedir(),"Library","Caches","three-blocks","fonts"):platform()==="win32"?y.join(process.env.LOCALAPPDATA?.trim()||y.join(homedir(),"AppData","Local"),"Three Blocks","Cache","fonts"):y.join(process.env.XDG_CACHE_HOME?.trim()||y.join(homedir(),".cache"),"three-blocks","fonts")}a(He,"fontCacheRoot");function Fe(e,t){return t==="source"?{font:e,kind:t,file:e.sourceFile,url:e.sourceUrl,bytes:e.sourceBytes,checksum:e.sourceChecksum,...e.sourceArchive===void 0?{}:{archive:e.sourceArchive}}:{font:e,kind:t,file:e.browserFile,url:e.browserUrl,bytes:e.browserBytes,checksum:e.browserChecksum}}a(Fe,"builtinAsset");function Me(e,t){let n=_e(e),r=t.mapBuiltinFont?.(n)??n;if(r.id!==n.id||r.version!==n.version||r.sourceBytes!==n.sourceBytes||r.sourceChecksum!==n.sourceChecksum||r.browserBytes!==n.browserBytes||r.browserChecksum!==n.browserChecksum)throw new Error(`Runtime metadata for built-in font ${JSON.stringify(e)} changed its pinned identity.`);return r}a(Me,"runtimeBuiltinFontMetadata");function Ut(e,t){return y.join(He(t),e.font.id,e.font.version,e.checksum,y.basename(e.file))}a(Ut,"builtinCachePath");async function jt(e,t){try{let n=await h(e,a$2.texture,`${t.font.id} cached ${t.kind} font`);if(n.data.byteLength===t.bytes&&c(n.data)===t.checksum)return n.data;await rm(e,{force:!0});return}catch(n){if(b(n)==="ENOENT")return;throw n}}a(jt,"readCachedFont");async function Gt(e){try{let t=await h(y.join(Dt,e.file),e.bytes,`${e.font.id} packaged ${e.kind} font`);return t.data.byteLength===e.bytes&&c(t.data)===e.checksum?t.data:void 0}catch(t){if(b(t)==="ENOENT")return;throw t}}a(Gt,"readPackagedFont");async function Kt(e,t){try{let n=await j$1(e.root,e.filePath,t.bytes,`${t.font.id} existing browser font output`);return n.data.byteLength!==t.bytes||c(n.data)!==t.checksum?void 0:n.data}catch{return}}a(Kt,"readBuiltinBrowserSeed");function vt(e,t,n){let r=Math.max(0,e.byteLength-65557),o=-1;for(let u=e.byteLength-22;u>=r;u--)if(e.readUInt32LE(u)===101010256){o=u;break}if(o<0)throw new Error("downloaded ZIP has no end-of-central-directory record");let i=e.readUInt16LE(o+10),a=e.readUInt32LE(o+12),c=e.readUInt32LE(o+16);if(c+a>o)throw new Error("downloaded ZIP central directory is out of bounds");let s=c;for(let u=0;u<i;u++){if(s+46>e.byteLength||e.readUInt32LE(s)!==33639248)throw new Error("downloaded ZIP central directory is invalid");let l=e.readUInt16LE(s+10),f=e.readUInt32LE(s+20),h=e.readUInt32LE(s+24),T=e.readUInt16LE(s+28),w=e.readUInt16LE(s+30),C=e.readUInt16LE(s+32),S=e.readUInt32LE(s+42),F=s+46+T+w+C;if(F>e.byteLength)throw new Error("downloaded ZIP entry metadata is out of bounds");let k=e.subarray(s+46,s+46+T).toString("utf8");if(s=F,k!==t)continue;if(h!==n)throw new Error(`ZIP entry has ${h} bytes; expected ${n}`);if(S+30>e.byteLength||e.readUInt32LE(S)!==67324752)throw new Error("downloaded ZIP local entry is invalid");let R=e.readUInt16LE(S+26),O=e.readUInt16LE(S+28),L=S+30+R+O;if(L+f>e.byteLength)throw new Error("downloaded ZIP entry data is out of bounds");let x=e.subarray(L,L+f);if(l===0)return Buffer.from(x);if(l===8)return G.inflateRawSync(x,{maxOutputLength:n});throw new Error(`ZIP entry uses unsupported compression method ${l}`)}throw new Error(`downloaded ZIP does not contain ${JSON.stringify(t)}`)}a(vt,"zipEntry");async function Wt(e,t){let n=new URL(e.url);if(n.protocol!=="https:")throw new Error(`Built-in font source must use HTTPS: ${e.url}.`);let r;try{r=await t(n,{signal:AbortSignal.timeout(Mt)});}catch(w){throw new Error(`request failed: ${w instanceof Error?w.message:String(w)}`,{cause:w})}if(!r.ok)throw new Error(`server returned HTTP ${r.status} ${r.statusText}`.trim());let o=e.archive?.bytes??e.bytes,i=e.archive?.checksum??e.checksum,a=r.headers.get("content-length");if(a!==null){let w=Number(a);if(!Number.isSafeInteger(w)||w!==o)throw new Error(`server declared ${a} bytes; expected ${o}`)}if(r.body===null)throw new Error("server returned an empty response body");let c$1=r.body.getReader(),s=[],u=0;for(;;){let w=await c$1.read();if(w.done)break;if(u+=w.value.byteLength,u>o||u>a$2.texture)throw await c$1.cancel(),new Error(`download exceeded the expected ${o}-byte size`);s.push(Buffer.from(w.value.buffer,w.value.byteOffset,w.value.byteLength));}let l=Buffer.concat(s,u);if(l.byteLength!==o)throw new Error(`downloaded ${l.byteLength} bytes; expected ${o}`);let f=c(l);if(f!==i)throw new Error(`checksum mismatch: expected ${i}, received ${f}`);let h=e.archive===void 0?l:vt(l,e.archive.entry,e.bytes);if(h.byteLength!==e.bytes)throw new Error(`resolved ${h.byteLength} bytes; expected ${e.bytes}`);let T=c(h);if(T!==e.checksum)throw new Error(`resolved checksum mismatch: expected ${e.checksum}, received ${T}`);return h}a(Wt,"downloadFont");async function oe(e,t){await mkdir(y.dirname(e),{recursive:true});let n=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await writeFile(n,t,{flag:"wx"}),await rename(n,e);}finally{await rm(n,{force:true});}}a(oe,"writeCachedFont");async function Re(e,t,n){let r=Ut(e,t),o=X.get(r);if(o)return o;let i=(async()=>{let a=await jt(r,e);if(a)return a;if(t.fetch===void 0&&t.mapBuiltinFont===void 0){let c=await Gt(e);if(c!==void 0)return await oe(r,c),c}if(n!==void 0){let c=await Kt(n,e);if(c!==void 0)return await oe(r,c),c}try{let c=await Wt(e,t.fetch??globalThis.fetch);return await oe(r,c),c}catch(c){throw new Error(`Could not download the built-in ${e.font.id} ${e.kind} font from ${e.url}: ${c instanceof Error?c.message:String(c)}. Connect once to prewarm the checksum-keyed cache at ${JSON.stringify(He(t))}, or configure source.path/source.package for fully offline text generation.`,{cause:c})}})();X.set(r,i);try{return await i}finally{X.get(r)===i&&X.delete(r);}}a(Re,"cachedBuiltinAsset");async function De(e,t,n){let[r,o]=await Promise.allSettled([Re(Fe(e,"source"),t),Re(Fe(e,"browser"),t,n)]);if(r.status==="rejected")throw r.reason;if(o.status==="rejected")throw o.reason;return [r.value,o.value]}a(De,"cachedBuiltinPair");async function Fn(e,t={}){let n=Me(e,t);await De(n,t);}a(Fn,"prewarmBuiltinFont");async function ze(e,t,n){let r=await h(e,a$2.texture,n),o=c(r.data);if(t!=="pending"&&o!==t)throw new Error(`${n} checksum mismatch: expected ${t}, received ${o}.`);return r.data}a(ze,"checkedExternalFile");function Ue(e,t){if(!/^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+$/iu.test(t))throw new Error("Text font package name is unsafe.");return y.join(e,"node_modules",...t.split("/"))}a(Ue,"packageRoot");async function Vt(e,t){if("builtin"in t){let o=_e(t.builtin);return {sourceHash:o.sourceChecksum,browserHash:o.browserChecksum,description:`builtin:${o.id}@${o.version}`,license:o.license}}if("path"in t){let o=await j$1(e,y.join(e,t.path),a$2.texture,"Text source font");return {sourceHash:c(o.data),browserHash:c(o.data),description:t.path}}let n=y.join(Ue(e,t.package),t.file),r=await ze(n,t.checksum,"Package text source font");return {sourceHash:c(r),browserHash:c(r),description:`${t.package}/${t.file}`}}a(Vt,"resolveFontIdentity");async function Jt(e,t,n,r){if("builtin"in t){let c=Me(t.builtin,n),[s,u]=await De(c,n,r===void 0?void 0:{root:e,filePath:r});return {source:s,sourceHash:c.sourceChecksum,browser:u,browserHash:c.browserChecksum,description:`builtin:${c.id}@${c.version}`,license:c.license}}if("path"in t){let c$1=await j$1(e,y.join(e,t.path),a$2.texture,"Text source font"),s=c(c$1.data);return {source:c$1.data,sourceHash:s,browser:c$1.data,browserHash:s,description:t.path}}let o=y.join(Ue(e,t.package),t.file),i=await ze(o,t.checksum,"Package text source font"),a=c(i);return {source:i,sourceHash:a,browser:i,browserHash:a,description:`${t.package}/${t.file}`}}a(Jt,"resolveFont");function N(e,t){let n=t.replace(/^\/+/,""),r=y.resolve(e,"public",n),o=y.resolve(e,"public"),i=y.relative(o,r);if(i===""||i===".."||i.startsWith(`..${y.sep}`)||y.isAbsolute(i))throw new Error(`Deployed text path ${JSON.stringify(t)} escapes public/.`);return r}a(N,"deployedFile");function ae(e,t){return y.relative(e,t).split(y.sep).join("/")}a(ae,"portablePath");function je(e){return e.endsWith(".json")?`${e.slice(0,-5)}.meta.json`:`${e}.meta.json`}a(je,"metadataPath");function ce(e){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}a(ce,"bufferArray");function qt(e,t){return t.filter(n=>n===65533||e.charToGlyphIndex(String.fromCodePoint(n))!==0)}a(qt,"supportedCodePoints");function Ae(e,t,n,r){return new Promise((o,i)=>{It(e,{filename:n,charset:t.map(a=>String.fromCodePoint(a)),outputType:"json",fieldType:"msdf",fontSize:r.size,distanceRange:r.distanceRange,texturePadding:r.padding,textureSize:[r.maxTextureSize,r.maxTextureSize],smartSize:true,pot:true},(a,c,s)=>{if(a)return i(a);if(c.length!==1||c[0]===void 0)return i(new Error(`Text glyphs require ${c.length} atlas pages; raise maxTextureSize or lower size.`));try{o({png:c[0].texture,data:zt(JSON.parse(s.data))});}catch(u){i(u);}});})}a(Ae,"generateBMFontData");function ke(e,t,n,r){let o=1/e.info.size,i=e.common.base,a$1=t.unitsPerEm,c=t.tables.hhea,s=a(l=>{let f=t.charToGlyph(String.fromCodePoint(l))?.advanceWidth;return typeof f=="number"&&Number.isFinite(f)?f/a$1:void 0},"exactAdvance"),u=a((l,f)=>{try{let h=t.getKerningValue(t.charToGlyph(String.fromCodePoint(l)),t.charToGlyph(String.fromCodePoint(f)));return Number.isFinite(h)&&h!==0?h/a$1:void 0}catch{return}},"exactKerning");return {name:t.names?.fontFamily?.en??e.info.face,atlas:{type:"msdf",distanceRange:n.distanceRange,size:e.info.size,width:e.common.scaleW,height:e.common.scaleH,yOrigin:"top",...r===void 0?{}:{wght:r}},metrics:{emSize:1,lineHeight:(c.ascender-c.descender+c.lineGap)/a$1,ascender:c.ascender/a$1,descender:c.descender/a$1,underlineY:(t.tables.post?.underlinePosition??-a$1*.1)/a$1,underlineThickness:(t.tables.post?.underlineThickness??a$1*.05)/a$1},glyphs:e.chars.slice().sort((l,f)=>l.id-f.id).map(l=>({unicode:l.id,advance:s(l.id)??l.xadvance*o,...l.width>0&&l.height>0?{planeBounds:{left:l.xoffset*o,bottom:(i-l.yoffset-l.height)*o,right:(l.xoffset+l.width)*o,top:(i-l.yoffset)*o},atlasBounds:{left:l.x,top:l.y,right:l.x+l.width,bottom:l.y+l.height}}:{}})),kerning:e.kernings.filter(l=>l.amount!==0).sort((l,f)=>l.first-f.first||l.second-f.second).map(l=>({unicode1:l.first,unicode2:l.second,advance:u(l.first,l.second)??l.amount*o}))}}a(ke,"convertMetrics");function Ge(){return G}a(Ge,"zstdFunctions");function Be(e){let t=PNG.sync.read(e),n=new Uint8Array(t.data.buffer,t.data.byteOffset,t.data.byteLength),o=Ge().zstdCompressSync,i=o===void 0?"none":"zstd",a$1=G.constants.ZSTD_c_compressionLevel,c=o?.(n,a$1===void 0?{}:{params:{[a$1]:19}}),s=createDefaultContainer();s.vkFormat=VK_FORMAT_R8G8B8A8_UNORM,s.typeSize=1,s.pixelWidth=t.width,s.pixelHeight=t.height,s.supercompressionScheme=i==="zstd"?KHR_SUPERCOMPRESSION_ZSTD:KHR_SUPERCOMPRESSION_NONE,s.levels=[{levelData:c===void 0?n:new Uint8Array(c.buffer,c.byteOffset,c.byteLength),uncompressedByteLength:n.byteLength}];let u=a((f,h)=>({bitOffset:f*8,bitLength:7,channelType:h,samplePosition:[0,0,0,0],sampleLower:0,sampleUpper:255}),"sample");s.dataFormatDescriptor=[{vendorId:KHR_DF_VENDORID_KHRONOS,descriptorType:KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,versionNumber:KHR_DF_VERSION,colorModel:KHR_DF_MODEL_RGBSDA,colorPrimaries:KHR_DF_PRIMARIES_BT709,transferFunction:KHR_DF_TRANSFER_LINEAR,flags:KHR_DF_FLAG_ALPHA_STRAIGHT,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[u(0,KHR_DF_CHANNEL_RGBSDA_RED),u(1,KHR_DF_CHANNEL_RGBSDA_GREEN),u(2,KHR_DF_CHANNEL_RGBSDA_BLUE),u(3,KHR_DF_CHANNEL_RGBSDA_ALPHA|KHR_DF_SAMPLE_DATATYPE_LINEAR)]}],s.keyValue.KTXwriter=`three-blocks text ${Z}`,s.keyValue.KTXorientation="rd";let l=write(s,{keepWriter:true});return de(l,t.width,t.height),{bytes:l,width:t.width,height:t.height,compression:i}}a(Be,"createKtx2");function de(e,t,n){let r=read(e);if(r.vkFormat!==VK_FORMAT_R8G8B8A8_UNORM)throw new Error("Text atlas must use RGBA8 KTX2.");if(r.pixelWidth<=0||r.pixelHeight<=0||r.levels.length!==1||r.levels[0]===void 0)throw new Error("Text atlas KTX2 dimensions or levels are invalid.");if(t!==void 0&&r.pixelWidth!==t)throw new Error("Text atlas KTX2 width does not match metrics.");if(n!==void 0&&r.pixelHeight!==n)throw new Error("Text atlas KTX2 height does not match metrics.");if(r.keyValue.KTXorientation!=="rd")throw new Error("Text atlas KTX2 orientation must be rd.");let o=r.levels[0],i,a;if(r.supercompressionScheme===KHR_SUPERCOMPRESSION_ZSTD){let s=Ge().zstdDecompressSync;if(s===void 0)throw new Error("This Node.js runtime cannot validate Zstandard KTX2 text atlases.");i=s(o.levelData),a="zstd";}else if(r.supercompressionScheme===KHR_SUPERCOMPRESSION_NONE)i=o.levelData,a="none";else throw new Error("Text atlas uses an unsupported KTX2 supercompression scheme.");let c=r.pixelWidth*r.pixelHeight*4;if(i.byteLength!==c||o.uncompressedByteLength!==c)throw new Error("Text atlas KTX2 decoded byte length is invalid.");return {width:r.pixelWidth,height:r.pixelHeight,compression:a}}a(de,"validateKtx2Bytes");function ie(e){return `${JSON.stringify(e)}
|
|
3
|
-
`}a(ie,"stableJson");function z(e,t,n){return {path:ae(e,t),sha256:c(n),bytes:n.byteLength}}a(z,"fileReceipt");function le(e){return Object.keys(e.weights).map(Number).sort((t,n)=>t-n)}a(le,"routeWeights");function Ke(e,t,n,r,o){return c(JSON.stringify({generator:Z,fontKey:r,fontHash:e.sourceHash,glyphSetHash:t,options:n,...o.length>0?{weights:o}:{}}))}a(Ke,"createInputHash");async function Xt(e,t,n){let{default:r}=await import('subset-font'),o=t.map(i=>String.fromCodePoint(i)).join("");return r(e,o,{targetFormat:"sfnt",variationAxes:{wght:n}})}a(Xt,"instanceFontWeight");async function Zt(e,t,n,r,o,i,a){if(o.length===0)throw new Error(`Text font ${JSON.stringify(t)} covers no required glyphs.`);let c=se.parse(ce(r.source)),s=await Ae(r.source,o,t,a),u=ke(s.data,c,a),l=Buffer.from(ie(u)),f$1=Be(s.png);if(s.data.common.scaleW!==f$1.width||s.data.common.scaleH!==f$1.height)throw new Error(`Text font ${JSON.stringify(t)} metrics and texture dimensions differ.`);let h=le(n);if(h.length>0&&!c.tables.fvar?.axes?.some(x=>x.tag==="wght"))throw new Error(`Text font ${JSON.stringify(t)} declares weights but its source has no variable wght axis.`);let T=[],w={};for(let x of h){let I=n.weights[String(x)],ue=await Xt(r.source,o,x),ve=se.parse(ce(ue)),K=await Ae(ue,o,`${t}-w${x}`,a),fe=Buffer.from(ie(ke(K.data,ve,a,x))),v=Be(K.png);if(K.data.common.scaleW!==v.width||K.data.common.scaleH!==v.height)throw new Error(`Text font ${JSON.stringify(t)} weight ${x} metrics and texture dimensions differ.`);let pe=N(e,I.atlas),me=N(e,I.metrics);T.push({file:pe,data:v.bytes},{file:me,data:fe}),w[String(x)]={atlas:z(e,pe,v.bytes),metrics:z(e,me,fe)};}let C=N(e,n.browser),S=N(e,n.atlas),F=N(e,n.metrics),k=je(F),R={schemaVersion:Ie,generatorVersion:Z,font:{key:t,source:r.description,sourceHash:r.sourceHash,...r.license===void 0?{}:{license:r.license}},inputHash:Ke(r,i,a,t,h),glyphSetHash:i,codePoints:o,options:a,texture:{format:"RGBA8",orientation:"rd",compression:f$1.compression,width:f$1.width,height:f$1.height},files:{browser:z(e,C,r.browser),atlas:z(e,S,f$1.bytes),metrics:z(e,F,l),...h.length>0?{weights:w}:{}}},O=Buffer.from(ie(R));await f(C,r.browser),await f(S,f$1.bytes),await f(F,l);for(let{file:x,data:I}of T)await f(x,I);await f(k,O);let L=[C,S,F,...T.map(x=>x.file),k].map(x=>ae(e,x));return {font:t,receipt:R,metadataPath:ae(e,k),updatedFiles:L}}a(Zt,"generateRoute");async function Rn(e,t="three-blocks.text.ts",n={}){let r=await te(e,t),o=await ne(e,r),i=Ne(r),a=[];for(let[l,f]of Object.entries(r.fonts).sort((h,T)=>h[0].localeCompare(T[0]))){let h=await Jt(e,f.source,n,"builtin"in f.source?N(e,f.browser):void 0),T=se.parse(ce(h.source));a.push({key:l,route:f,resolved:h,font:T,codePoints:qt(T,o.glyphs.codePoints)});}let c=new Set(a.flatMap(l=>l.codePoints)),s=o.glyphs.codePoints.filter(l=>!c.has(l));if(s.length>0)throw new Error(`Configured fonts do not cover ${s.length} required glyph(s): ${s.map(l=>String.fromCodePoint(l)).join(" ")}`);let u=[];for(let l of a)u.push(await Zt(e,l.key,l.route,l.resolved,l.codePoints,o.glyphs.hash,i));return {glyphs:o.glyphs.codePoints.length,glyphSetHash:o.glyphs.hash,atlases:u,updatedFiles:u.flatMap(l=>l.updatedFiles)}}a(Rn,"generateTextAtlases");function U(e,t){if(!a$1(e)||typeof e.path!="string"||typeof e.sha256!="string"||!/^[a-f0-9]{64}$/u.test(e.sha256)||!Number.isSafeInteger(e.bytes)||e.bytes<0)throw new Error(`${t} receipt is invalid.`);return e}a(U,"parseFileReceipt");function Yt(e){if(!a$1(e)||e.schemaVersion!==Ie||e.generatorVersion!==Z||!a$1(e.font)||typeof e.font.key!="string"||typeof e.font.source!="string"||typeof e.font.sourceHash!="string"||!/^[a-f0-9]{64}$/u.test(e.font.sourceHash)||typeof e.inputHash!="string"||!/^[a-f0-9]{64}$/u.test(e.inputHash)||typeof e.glyphSetHash!="string"||!/^[a-f0-9]{64}$/u.test(e.glyphSetHash)||!Array.isArray(e.codePoints)||!e.codePoints.every(t=>Number.isSafeInteger(t))||!a$1(e.options)||!a$1(e.texture)||!a$1(e.files))throw new Error("Text atlas generation metadata is invalid.");if(e.texture.format!=="RGBA8"||e.texture.orientation!=="rd"||!["zstd","none"].includes(e.texture.compression))throw new Error("Text atlas texture metadata is invalid.");if(U(e.files.browser,"Browser font"),U(e.files.atlas,"Text atlas"),U(e.files.metrics,"Text metrics"),e.files.weights!==void 0){if(!a$1(e.files.weights))throw new Error("Text atlas weight receipts are invalid.");for(let[t,n]of Object.entries(e.files.weights)){let r=Number(t);if(!Number.isInteger(r)||r<1||r>1e3||!a$1(n))throw new Error(`Text atlas weight receipt "${t}" is invalid.`);U(n.atlas,`Text atlas weight ${t}`),U(n.metrics,`Text metrics weight ${t}`);}}return e}a(Yt,"parseTextAtlasReceipt");function $e(e){if(!a$1(e)||!a$1(e.atlas)||!Array.isArray(e.glyphs))throw new Error("Text metrics are invalid.");let t=P(e.atlas.width,"Text metrics atlas.width"),n=P(e.atlas.height,"Text metrics atlas.height"),r=e.glyphs.map((o,i)=>{if(!a$1(o))throw new Error(`Text metrics glyph ${i} is invalid.`);return P(o.unicode,`Text metrics glyph ${i}.unicode`)});return {width:t,height:n,codePoints:r}}a($e,"metricsCoverage");async function j(e,t,n,r){let o=await j$1(e,y.join(e,t.path),n,r);if(o.data.byteLength!==t.bytes||c(o.data)!==t.sha256)throw new Error(`${r} checksum or byte length differs from generation metadata.`);return o.data}a(j,"verifyReceiptFile");async function An(e,t="three-blocks.text.ts"){let n;try{n=await te(e,t);}catch(r){return {state:"invalid",reason:`Text configuration is invalid: ${r instanceof Error?r.message:String(r)}`,missing:[],atlases:[]}}try{let r=await ne(e,n),o=Ne(n),i=[],a=new Set;for(let[s,u]of Object.entries(n.fonts).sort((l,f)=>l[0].localeCompare(f[0]))){let l=await j$1(e,je(N(e,u.metrics)),a$2.metadata,"Text atlas generation metadata"),f=Yt(JSON.parse(l.data.toString("utf8")));if(f.font.key!==s)throw new Error(`Text atlas metadata belongs to ${JSON.stringify(f.font.key)}, not ${JSON.stringify(s)}.`);let h=await Vt(e,u.source),T=Ke(h,f.glyphSetHash,o,s,le(u));if(f.inputHash!==T)return {state:"invalid",reason:`Text atlas ${s} font source, weights, or generation options changed.`,missing:[],atlases:[...i,f]};let[w,C,S]=await Promise.all([j(e,f.files.browser,a$2.texture,"Browser font"),j(e,f.files.atlas,a$2.texture,"Text atlas"),j(e,f.files.metrics,a$2.metrics,"Text metrics")]);if(c(w)!==h.browserHash)throw new Error(`Browser font ${s} differs from its resolved source.`);let F=$e(JSON.parse(S.toString("utf8"))),k=de(C,F.width,F.height);if(k.width!==f.texture.width||k.height!==f.texture.height||k.compression!==f.texture.compression)throw new Error(`Text atlas ${s} texture metadata does not match KTX2.`);for(let R of le(u)){let O=f.files.weights?.[String(R)];if(O===void 0)throw new Error(`Text atlas ${s} weight ${R} has no generation receipt.`);let[L,x]=await Promise.all([j(e,O.atlas,a$2.texture,`Text atlas weight ${R}`),j(e,O.metrics,a$2.metrics,`Text metrics weight ${R}`)]),I=$e(JSON.parse(x.toString("utf8")));de(L,I.width,I.height);}for(let R of F.codePoints)a.add(R);i.push(f);}let c$1=r.glyphs.codePoints.filter(s=>!a.has(s));return c$1.length>0?{state:"missing",reason:`${c$1.length} required glyph(s) are missing.`,missing:c$1,atlases:i}:{state:"ready",reason:`${r.glyphs.codePoints.length} required glyphs are covered by ${i.length} atlas(es).`,missing:[],atlases:i}}catch(r){return (typeof r=="object"&&r!==null&&"code"in r?r.code:void 0)==="ENOENT"?{state:"missing",reason:"Text atlas files or generation metadata are absent.",missing:[],atlases:[]}:{state:"invalid",reason:r instanceof Error?r.message:String(r),missing:[],atlases:[]}}}a(An,"inspectTextAtlases");export{Ie as a,Z as b,_e as c,Fn as d,Rn as e,Yt as f,An as g};
|
|
1
|
+
import {a as a$1}from'./chunk-WNSGAV6N.js';import {j as j$1,a as a$2,c,h,b,f}from'./chunk-ECQE4D2U.js';import {a}from'./chunk-7X4DHW36.js';import {createHash,randomUUID}from'crypto';import {rm,mkdir,writeFile,rename}from'fs/promises';import {platform,homedir}from'os';import y from'path';import {fileURLToPath}from'url';import*as G from'zlib';import {createDefaultContainer,VK_FORMAT_R8G8B8A8_UNORM,KHR_SUPERCOMPRESSION_ZSTD,KHR_SUPERCOMPRESSION_NONE,KHR_DF_FLAG_ALPHA_STRAIGHT,KHR_DF_TRANSFER_LINEAR,KHR_DF_PRIMARIES_BT709,KHR_DF_MODEL_RGBSDA,KHR_DF_VERSION,KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,KHR_DF_VENDORID_KHRONOS,KHR_DF_CHANNEL_RGBSDA_RED,KHR_DF_CHANNEL_RGBSDA_GREEN,KHR_DF_CHANNEL_RGBSDA_BLUE,KHR_DF_CHANNEL_RGBSDA_ALPHA,KHR_DF_SAMPLE_DATATYPE_LINEAR,write,read}from'ktx-parse';import It from'msdf-bmfont-xml';import se from'opentype.js';import {PNG}from'pngjs';import {createRequire}from'module';var Je=createRequire(import.meta.url),he,g=new Proxy({},{get(e,t){return he??=Je("typescript"),Reflect.get(he,t)}}),qe=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),Xe=new Set(["script","style","template"]),ge=2e5,Ze={amp:"&",apos:"'",copy:"\xA9",deg:"\xB0",gt:">",hellip:"\u2026",ldquo:"\u201C",lsquo:"\u2018",lt:"<",mdash:"\u2014",nbsp:"\xA0",ndash:"\u2013",quot:'"',rdquo:"\u201D",rsquo:"\u2019"};function Ye(e){return e.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z][a-z0-9]+);/giu,(t,n)=>{if(n.startsWith("#x")||n.startsWith("#X")){let r=Number.parseInt(n.slice(2),16);return H(r)?String.fromCodePoint(r):t}if(n.startsWith("#")){let r=Number.parseInt(n.slice(1),10);return H(r)?String.fromCodePoint(r):t}return Ze[n.toLowerCase()]??t})}a(Ye,"decodeHtmlEntities");function H(e){return Number.isSafeInteger(e)&&e>=0&&e<=1114111&&!(e>=55296&&e<=57343)}a(H,"validCodePoint");function we(e){return H(e)&&e>=32&&!(e>=127&&e<=159)}a(we,"renderableCodePoint");function Qe(e){return /(?:^|\s)data-canvas-text(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?(?=\s|\/?>)/iu.test(e)}a(Qe,"hasCanvasTextAttribute");function xe(e){let t=[],n=[],r=e.match(/<!--[\s\S]*?-->|<![^>]*>|<[^>]*>|[^<]+/gu)??[];for(let o of r){if(!o.startsWith("<")){if(n.some(s=>s.synchronized)&&!n.some(s=>s.skipped)){let s=Ye(o);s.trim().length>0&&t.push(s);}continue}if(o.startsWith("<!--")||o.startsWith("<!")||o.startsWith("<?"))continue;let i=/^<\s*\//u.test(o),a=/^<\s*\/?\s*([a-z][a-z0-9:-]*)/iu.exec(o)?.[1]?.toLowerCase();if(!a)continue;if(i){let s=n.map(u=>u.tag).lastIndexOf(a);s>=0&&n.splice(s);continue}/\/\s*>$/u.test(o)||qe.has(a)||n.push({tag:a,synchronized:Qe(o),skipped:Xe.has(a)});}return t}a(xe,"extractCanvasTextFromHtml");function et(e){let t=new Set,n=new Set;for(let r of e.statements){if(!g.isImportDeclaration(r)||!g.isStringLiteral(r.moduleSpecifier)||r.moduleSpecifier.text!=="three-blocks/text")continue;let o=r.importClause?.namedBindings;if(o&&g.isNamespaceImport(o)&&n.add(o.name.text),o&&g.isNamedImports(o))for(let i of o.elements)(i.propertyName?.text??i.name.text)==="defineTextContent"&&t.add(i.name.text);}return {named:t,namespaces:n}}a(et,"importedTextHelpers");function tt(e,t){return g.isIdentifier(e)?t.named.has(e.text):g.isPropertyAccessExpression(e)&&g.isIdentifier(e.expression)&&t.namespaces.has(e.expression.text)&&e.name.text==="defineTextContent"}a(tt,"isDefineTextContentCall");function nt(e){let t=e;for(;g.isParenthesizedExpression(t)||g.isAsExpression(t)||g.isSatisfiesExpression(t)||g.isTypeAssertionExpression(t);)t=t.expression;return t}a(nt,"unwrapExpression");function Q(e,t,n){let r=nt(e);if(g.isStringLiteral(r)||g.isNoSubstitutionTemplateLiteral(r)){t.push(r.text);return}if(g.isArrayLiteralExpression(r)){for(let a of r.elements){if(g.isSpreadElement(a))throw new Error(`${n}: defineTextContent() cannot use spread elements.`);Q(a,t,n);}return}if(g.isObjectLiteralExpression(r)){for(let a of r.properties){if(!g.isPropertyAssignment(a))throw new Error(`${n}: defineTextContent() accepts only static property assignments.`);Q(a.initializer,t,n);}return}let o=r.getStart(),i=r.getSourceFile().getLineAndCharacterOfPosition(o).line+1;throw new Error(`${n}:${i}: defineTextContent() contains dynamic text; declare a Unicode range or an explicit static string.`)}a(Q,"collectStaticStrings");function be(e,t="content.ts"){let n=g.createSourceFile(t,e,g.ScriptTarget.Latest,true,t.endsWith(".tsx")?g.ScriptKind.TSX:g.ScriptKind.TS),r=et(n),o=[];function i(a){if(g.isCallExpression(a)&&tt(a.expression,r)){if(a.arguments.length!==1||!a.arguments[0])throw new Error(`${t}: defineTextContent() requires exactly one static argument.`);Q(a.arguments[0],o,t);return}g.forEachChild(a,i);}return a(i,"visit"),i(n),o}a(be,"extractDefinedTextContent");function rt(e){let t=[];if(e==="latin"){for(let n=32;n<=126;n++)t.push(n);for(let n of "\u2018\u2019\u201C\u201D\u2013\u2014\u2026\u2022\xB7\xAB\xBB\u2039\u203A\u20AC\xA3\xA5\xB0\xB1\xD7\xF7\xA9\xAE\u2122\xA0"){let r=n.codePointAt(0);r!==void 0&&t.push(r);}}else {for(let n=12353;n<=12438;n++)t.push(n);for(let n=12443;n<=12447;n++)t.push(n);for(let n=12448;n<=12543;n++)t.push(n);for(let n of "\u3000\u3001\u3002\u300C\u300D\u300E\u300F\uFF08\uFF09\u30FB\u30FC\u301C\u3008\u3009\u300A\u300B\u3010\u3011\uFF01\uFF1F\uFF1A\uFF1B\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\uFF05\uFF06"){let r=n.codePointAt(0);r!==void 0&&t.push(r);}}return t}a(rt,"presetCodePoints");function ye(e,t){for(let n of t.normalize("NFC")){let r=n.codePointAt(0);r!==void 0&&we(r)&&e.add(r);}}a(ye,"addCharacters");function Te(e,t={}){let n=new Set;for(let c of e)ye(n,c);t.additionalCharacters&&ye(n,t.additionalCharacters);for(let c of t.presets??[])for(let s of rt(c))n.add(s);let r=0;for(let c of t.ranges??[]){if(!H(c.start)||!H(c.end)||c.end<c.start)throw new RangeError("Text Unicode ranges must contain ordered Unicode scalar values.");if(r+=c.end-c.start+1,r>ge)throw new RangeError(`Configured Unicode ranges exceed the ${ge}-code-point safety limit.`);for(let s=c.start;s<=c.end;s++)we(s)&&n.add(s);}n.add(32),n.add(63),n.add(65533);let o=[...n].sort((c,s)=>c-s),i=o.map(c=>String.fromCodePoint(c)).join(""),a=createHash("sha256").update(i.normalize("NFC")).digest("hex");return {codePoints:o,characters:i,hash:a}}a(Te,"buildGlyphSet");var it=createRequire(import.meta.url),Ee,p=new Proxy({},{get(e,t){return Ee??=it("typescript"),Reflect.get(Ee,t)}});function st(e){let t=e;for(;p.isParenthesizedExpression(t)||p.isAsExpression(t)||p.isSatisfiesExpression(t)||p.isTypeAssertionExpression(t);)t=t.expression;return t}a(st,"unwrap");function at(e,t){if(p.isIdentifier(e)||p.isStringLiteral(e)||p.isNumericLiteral(e))return e.text;throw new Error(`${t}: text configuration property names must be static.`)}a(at,"propertyName");function V(e,t){let n=st(e);if(p.isStringLiteral(n)||p.isNoSubstitutionTemplateLiteral(n))return n.text;if(p.isNumericLiteral(n))return Number(n.text);if(n.kind===p.SyntaxKind.TrueKeyword)return true;if(n.kind===p.SyntaxKind.FalseKeyword)return false;if(n.kind===p.SyntaxKind.NullKeyword)return null;if(p.isPrefixUnaryExpression(n)&&(n.operator===p.SyntaxKind.MinusToken||n.operator===p.SyntaxKind.PlusToken)){let o=V(n.operand,t);if(typeof o=="number")return n.operator===p.SyntaxKind.MinusToken?-o:o}if(p.isArrayLiteralExpression(n))return n.elements.map(o=>{if(p.isSpreadElement(o))throw new Error(`${t}: text configuration cannot use spread elements.`);return V(o,t)});if(p.isObjectLiteralExpression(n)){let o=Object.create(null);for(let i of n.properties){if(!p.isPropertyAssignment(i))throw new Error(`${t}: text configuration accepts only static property assignments.`);let a=at(i.name,t);if(Object.hasOwn(o,a))throw new Error(`${t}: duplicate text configuration property "${a}".`);o[a]=V(i.initializer,t);}return o}let r=n.getSourceFile().getLineAndCharacterOfPosition(n.getStart()).line+1;throw new Error(`${t}:${r}: text configuration must be statically inspectable.`)}a(V,"evaluateStatic");function ct(e){let t=new Set,n=new Set;for(let r of e.statements){if(!p.isImportDeclaration(r)||!p.isStringLiteral(r.moduleSpecifier)||r.moduleSpecifier.text!=="three-blocks/text")continue;let o=r.importClause?.namedBindings;if(o&&p.isNamespaceImport(o)&&n.add(o.name.text),o&&p.isNamedImports(o))for(let i of o.elements)(i.propertyName?.text??i.name.text)==="defineText"&&t.add(i.name.text);}return {named:t,namespaces:n}}a(ct,"helperNames");function dt(e,t){return p.isIdentifier(e)?t.named.has(e.text):p.isPropertyAccessExpression(e)&&p.isIdentifier(e.expression)&&t.namespaces.has(e.expression.text)&&e.name.text==="defineText"}a(dt,"isDefineTextCall");function $(e,t){if(typeof e!="string"||e.trim().length===0)throw new Error(`${t} must be a non-empty string.`);return e}a($,"requiredString");function J(e,t,n=false){if(!Array.isArray(e)||!n&&e.length===0)throw new Error(`${t} must be ${n?"an":"a non-empty"} array of strings.`);return e.map((r,o)=>$(r,`${t}[${o}]`))}a(J,"stringArray");function q(e,t){if(e.includes("\\")||y.posix.isAbsolute(e)||y.posix.normalize(e)!==e||e===".."||e.startsWith("../")||/[\u0000-\u001f\u007f]/u.test(e))throw new Error(`${t} must be a safe project-relative path.`);return e}a(q,"safeProjectPath");function lt(e,t){if(!a$1(e))throw new Error(`${t} must be an object.`);let n=Object.keys(e).sort();if(n.length===1&&n[0]==="builtin")return {builtin:$(e.builtin,`${t}.builtin`)};if(n.length===1&&n[0]==="path")return {path:q($(e.path,`${t}.path`),`${t}.path`)};if(n.join(",")==="checksum,file,package")return {package:$(e.package,`${t}.package`),file:q($(e.file,`${t}.file`),`${t}.file`),checksum:$(e.checksum,`${t}.checksum`)};throw new Error(`${t} must select exactly one supported source.`)}a(lt,"parseFontSource");function M(e,t){let n=$(e,t);if(n.includes("\\")||/[\u0000-\u001f\u007f]/u.test(n)||n.split("/").includes(".."))throw new Error(`${t} is unsafe.`);return n}a(M,"deployedPath");function ut(e){if(e===void 0)return {};if(!a$1(e))throw new Error("Text generation options must be an object.");let t=e.presets===void 0?void 0:J(e.presets,"Text generation presets",true).map(s=>{if(s!=="latin"&&s!=="japanese-kana")throw new Error(`Unsupported text preset "${s}".`);return s}),n;if(e.ranges!==void 0){if(!Array.isArray(e.ranges))throw new Error("Text generation ranges must be an array.");n=e.ranges.map((s,u)=>{if(!a$1(s)||typeof s.start!="number"||typeof s.end!="number")throw new Error(`Text generation range ${u} is invalid.`);return {start:s.start,end:s.end}});}let r=a(s=>{let u=e[s];if(u!==void 0){if(typeof u!="number"||!Number.isFinite(u))throw new Error(`Text generation ${s} must be finite.`);return u}},"numeric"),o=r("size"),i=r("distanceRange"),a$2=r("padding"),c=r("maxTextureSize");return {...t===void 0?{}:{presets:t},...n===void 0?{}:{ranges:n},...e.additionalCharacters===void 0?{}:{additionalCharacters:$(e.additionalCharacters,"Text generation additionalCharacters")},...o===void 0?{}:{size:o},...i===void 0?{}:{distanceRange:i},...a$2===void 0?{}:{padding:a$2},...c===void 0?{}:{maxTextureSize:c}}}a(ut,"parseGeneration");function ft(e){if(!a$1(e)||e.schemaVersion!==void 0&&e.schemaVersion!==1)throw new Error("Text configuration must use schemaVersion 1.");let t=J(e.content,"Text content inputs").map(o=>q(o,"Text content input"));if(!a$1(e.fonts)||Object.keys(e.fonts).length===0)throw new Error("Text fonts must be a non-empty object.");let n={},r=0;for(let[o,i]of Object.entries(e.fonts)){if($(o,"Text font key"),!a$1(i))throw new Error(`Text font "${o}" must be an object.`);let a=i.default===true;a&&r++;let c={};if(i.weights!==void 0){if(!a$1(i.weights))throw new Error(`Text font "${o}" weights must be an object.`);for(let[s,u]of Object.entries(i.weights)){let l=Number(s);if(!Number.isInteger(l)||l<1||l>1e3)throw new Error(`Text font "${o}" weight "${s}" must be an integer CSS weight between 1 and 1000.`);if(!a$1(u))throw new Error(`Text font "${o}" weight ${s} must be an object.`);c[String(l)]={atlas:M(u.atlas,`Text font "${o}" weight ${s} atlas path`),metrics:M(u.metrics,`Text font "${o}" weight ${s} metrics path`)};}}n[o]={source:lt(i.source,`Text font "${o}" source`),browser:M(i.browser,`Text font "${o}" browser path`),atlas:M(i.atlas,`Text font "${o}" atlas path`),metrics:M(i.metrics,`Text font "${o}" metrics path`),weights:c,families:J(i.families,`Text font "${o}" families`),languages:i.languages===void 0?[]:J(i.languages,`Text font "${o}" languages`,true),default:a};}if(Object.keys(n).length>1&&r!==1)throw new Error("Multiple text fonts require exactly one default route.");if(r>1)throw new Error("Text fonts can select only one default route.");return {schemaVersion:1,content:t,fonts:n,generation:ut(e.generation)}}a(ft,"validateConfiguration");function pt(e,t="three-blocks.text.ts"){let n=p.createSourceFile(t,e,p.ScriptTarget.Latest,true,p.ScriptKind.TS),r=ct(n),o=[];function i(a){if(p.isCallExpression(a)&&dt(a.expression,r)){if(a.arguments.length!==1||!a.arguments[0])throw new Error(`${t}: defineText() requires one static argument.`);o.push(V(a.arguments[0],t));return}p.forEachChild(a,i);}if(a(i,"visit"),i(n),o.length!==1)throw new Error(`${t} must contain exactly one imported defineText() call.`);return ft(o[0])}a(pt,"parseTextConfiguration");function ee(e,t){if(typeof e=="string")t.push(e);else if(Array.isArray(e))for(let n of e)ee(n,t);else if(a$1(e))for(let n of Object.values(e))ee(n,t);}a(ee,"jsonStrings");async function te(e,t="three-blocks.text.ts"){let n=q(t,"Text configuration path"),r=await j$1(e,y.join(e,n),a$2.semanticInput,"Text configuration");return pt(r.data.toString("utf8"),n)}a(te,"readTextConfiguration");async function ne(e,t){let n=[],r={},o=0;for(let i of t.content){let a=await j$1(e,y.join(e,i),a$2.semanticInput,"Text content input");if(o+=a.data.byteLength,o>a$2.semanticTotal)throw new Error("Text content inputs exceed the total inspection size limit.");r[i]=c(a.data);let c$1=a.data.toString("utf8"),s=y.extname(i).toLowerCase();if(s===".html"||s===".htm")n.push(...xe(c$1));else if([".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"].includes(s))n.push(...be(c$1,i));else if(s===".json")ee(JSON.parse(c$1),n);else if(s===".txt"||s===".md")n.push(c$1);else throw new Error(`Unsupported configured text content type: ${i}.`)}return {values:n,glyphs:Te(n,t.generation),inputs:r}}a(ne,"discoverTextContent");var Ie=1,Z="1.0.0",_t=Object.freeze({"geist-sans":{id:"geist-sans",family:"Geist Sans",version:"1.600",license:"OFL-1.1",licenseFile:"OFL-1.1.txt",sourceFile:"geist-sans/Geist-Variable.ttf",sourceUrl:"https://raw.githubusercontent.com/vercel/geist-font/1.6.0/fonts/Geist/variable/Geist%5Bwght%5D.ttf",sourceBytes:168472,sourceChecksum:"995c579489b33cd28a6732d7aa7ca1b46c2faa832c18b4063933d7652c39932b",browserFile:"geist-sans/Geist-Variable.woff2",browserUrl:"https://raw.githubusercontent.com/vercel/geist-font/1.6.0/fonts/Geist/webfonts/Geist%5Bwght%5D.woff2",browserBytes:69356,browserChecksum:"fd0de7b7c4329443c2fa2fadae90d57af9fa7857a814568f5a529537541a5538"},"noto-sans-jp":{id:"noto-sans-jp",family:"Noto Sans JP",version:"2.004-H2",license:"OFL-1.1",licenseFile:"OFL-1.1.txt",sourceFile:"noto-sans-jp/NotoSansJP[wght].ttf",sourceUrl:"https://raw.githubusercontent.com/google/fonts/295d98a7a0c17c68f1341eaeea354e7960ea70d3/ofl/notosansjp/NotoSansJP%5Bwght%5D.ttf",sourceBytes:9589900,sourceChecksum:"c2f3b4d463500a2ddcd3849cded1fceeb9fd6d1c32e6cbecd568453ba50fc68f",browserFile:"noto-sans-jp/NotoSansJP[wght].woff2",browserUrl:"https://raw.githubusercontent.com/RenaudRohlinger/three-blocks-monorepo/364a50cc5f6f92735a110b50144e8d62404c9d87/packages/three-blocks-devtools/fonts/noto-sans-jp/NotoSansJP%5Bwght%5D.woff2",browserBytes:4350080,browserChecksum:"6fd94964d1990baa2a392cea7a036683d2b80b9dfd590cb3918e8dab98d8e188"}}),Ht="THREE_BLOCKS_FONT_CACHE_DIR",Mt=6e4,X=new Map,Dt=fileURLToPath(new URL("../fonts/",import.meta.url));function A(e,t){if(typeof e!="number"||!Number.isFinite(e))throw new Error(`${t} must be finite.`);return e}a(A,"finiteNumber");function P(e,t){let n=A(e,t);if(!Number.isSafeInteger(n))throw new Error(`${t} must be an integer.`);return n}a(P,"integer");function zt(e){if(!a$1(e)||!a$1(e.info)||!a$1(e.common)||!Array.isArray(e.chars))throw new Error("MSDF generator returned invalid BMFont metadata.");let t=e.chars.map((o,i)=>{if(!a$1(o))throw new Error(`BMFont character ${i} is invalid.`);return {id:P(o.id,`BMFont character ${i}.id`),x:A(o.x,`BMFont character ${i}.x`),y:A(o.y,`BMFont character ${i}.y`),width:A(o.width,`BMFont character ${i}.width`),height:A(o.height,`BMFont character ${i}.height`),xoffset:A(o.xoffset,`BMFont character ${i}.xoffset`),yoffset:A(o.yoffset,`BMFont character ${i}.yoffset`),xadvance:A(o.xadvance,`BMFont character ${i}.xadvance`)}}),n=e.kernings===void 0?[]:e.kernings;if(!Array.isArray(n))throw new Error("BMFont kernings are invalid.");let r=n.map((o,i)=>{if(!a$1(o))throw new Error(`BMFont kerning ${i} is invalid.`);return {first:P(o.first,`BMFont kerning ${i}.first`),second:P(o.second,`BMFont kerning ${i}.second`),amount:A(o.amount,`BMFont kerning ${i}.amount`)}});return {info:{size:A(e.info.size,"BMFont info.size"),face:typeof e.info.face=="string"?e.info.face:"Font"},common:{base:A(e.common.base,"BMFont common.base"),scaleW:P(e.common.scaleW,"BMFont common.scaleW"),scaleH:P(e.common.scaleH,"BMFont common.scaleH")},chars:t,kernings:r}}a(zt,"parseBMFont");function Ne(e){let t=e.generation.size??48,n=e.generation.distanceRange??8,r=e.generation.padding??2,o=e.generation.maxTextureSize??4096;if(!Number.isInteger(t)||t<8||t>256)throw new Error("Text generation size must be an integer from 8 to 256.");if(!Number.isInteger(n)||n<1||n>64)throw new Error("Text generation distanceRange must be an integer from 1 to 64.");if(!Number.isInteger(r)||r<0||r>32)throw new Error("Text generation padding must be an integer from 0 to 32.");if(!Number.isInteger(o)||o<64||o>8192||(o&o-1)!==0)throw new Error("Text generation maxTextureSize must be a power of two from 64 to 8192.");return {size:t,distanceRange:n,padding:r,maxTextureSize:o}}a(Ne,"atlasOptions");function _e(e){let t=_t[e];if(t===void 0)throw new Error(`Unknown built-in font ${JSON.stringify(e)}.`);return t}a(_e,"builtinFontMetadata");function He(e){let t=e.cacheDirectory??process.env[Ht];return t?y.resolve(t):platform()==="darwin"?y.join(homedir(),"Library","Caches","three-blocks","fonts"):platform()==="win32"?y.join(process.env.LOCALAPPDATA?.trim()||y.join(homedir(),"AppData","Local"),"Three Blocks","Cache","fonts"):y.join(process.env.XDG_CACHE_HOME?.trim()||y.join(homedir(),".cache"),"three-blocks","fonts")}a(He,"fontCacheRoot");function Fe(e,t){return t==="source"?{font:e,kind:t,file:e.sourceFile,url:e.sourceUrl,bytes:e.sourceBytes,checksum:e.sourceChecksum,...e.sourceArchive===void 0?{}:{archive:e.sourceArchive}}:{font:e,kind:t,file:e.browserFile,url:e.browserUrl,bytes:e.browserBytes,checksum:e.browserChecksum}}a(Fe,"builtinAsset");function Me(e,t){let n=_e(e),r=t.mapBuiltinFont?.(n)??n;if(r.id!==n.id||r.version!==n.version||r.sourceBytes!==n.sourceBytes||r.sourceChecksum!==n.sourceChecksum||r.browserBytes!==n.browserBytes||r.browserChecksum!==n.browserChecksum)throw new Error(`Runtime metadata for built-in font ${JSON.stringify(e)} changed its pinned identity.`);return r}a(Me,"runtimeBuiltinFontMetadata");function Ut(e,t){return y.join(He(t),e.font.id,e.font.version,e.checksum,y.basename(e.file))}a(Ut,"builtinCachePath");async function jt(e,t){try{let n=await h(e,a$2.texture,`${t.font.id} cached ${t.kind} font`);if(n.data.byteLength===t.bytes&&c(n.data)===t.checksum)return n.data;await rm(e,{force:!0});return}catch(n){if(b(n)==="ENOENT")return;throw n}}a(jt,"readCachedFont");async function Gt(e){try{let t=await h(y.join(Dt,e.file),e.bytes,`${e.font.id} packaged ${e.kind} font`);return t.data.byteLength===e.bytes&&c(t.data)===e.checksum?t.data:void 0}catch(t){if(b(t)==="ENOENT")return;throw t}}a(Gt,"readPackagedFont");async function Kt(e,t){try{let n=await j$1(e.root,e.filePath,t.bytes,`${t.font.id} existing browser font output`);return n.data.byteLength!==t.bytes||c(n.data)!==t.checksum?void 0:n.data}catch{return}}a(Kt,"readBuiltinBrowserSeed");function vt(e,t,n){let r=Math.max(0,e.byteLength-65557),o=-1;for(let u=e.byteLength-22;u>=r;u--)if(e.readUInt32LE(u)===101010256){o=u;break}if(o<0)throw new Error("downloaded ZIP has no end-of-central-directory record");let i=e.readUInt16LE(o+10),a=e.readUInt32LE(o+12),c=e.readUInt32LE(o+16);if(c+a>o)throw new Error("downloaded ZIP central directory is out of bounds");let s=c;for(let u=0;u<i;u++){if(s+46>e.byteLength||e.readUInt32LE(s)!==33639248)throw new Error("downloaded ZIP central directory is invalid");let l=e.readUInt16LE(s+10),f=e.readUInt32LE(s+20),h=e.readUInt32LE(s+24),T=e.readUInt16LE(s+28),w=e.readUInt16LE(s+30),C=e.readUInt16LE(s+32),S=e.readUInt32LE(s+42),F=s+46+T+w+C;if(F>e.byteLength)throw new Error("downloaded ZIP entry metadata is out of bounds");let k=e.subarray(s+46,s+46+T).toString("utf8");if(s=F,k!==t)continue;if(h!==n)throw new Error(`ZIP entry has ${h} bytes; expected ${n}`);if(S+30>e.byteLength||e.readUInt32LE(S)!==67324752)throw new Error("downloaded ZIP local entry is invalid");let R=e.readUInt16LE(S+26),O=e.readUInt16LE(S+28),L=S+30+R+O;if(L+f>e.byteLength)throw new Error("downloaded ZIP entry data is out of bounds");let x=e.subarray(L,L+f);if(l===0)return Buffer.from(x);if(l===8)return G.inflateRawSync(x,{maxOutputLength:n});throw new Error(`ZIP entry uses unsupported compression method ${l}`)}throw new Error(`downloaded ZIP does not contain ${JSON.stringify(t)}`)}a(vt,"zipEntry");async function Wt(e,t){let n=new URL(e.url);if(n.protocol!=="https:")throw new Error(`Built-in font source must use HTTPS: ${e.url}.`);let r;try{r=await t(n,{signal:AbortSignal.timeout(Mt)});}catch(w){throw new Error(`request failed: ${w instanceof Error?w.message:String(w)}`,{cause:w})}if(!r.ok)throw new Error(`server returned HTTP ${r.status} ${r.statusText}`.trim());let o=e.archive?.bytes??e.bytes,i=e.archive?.checksum??e.checksum,a=r.headers.get("content-length");if(a!==null){let w=Number(a);if(!Number.isSafeInteger(w)||w!==o)throw new Error(`server declared ${a} bytes; expected ${o}`)}if(r.body===null)throw new Error("server returned an empty response body");let c$1=r.body.getReader(),s=[],u=0;for(;;){let w=await c$1.read();if(w.done)break;if(u+=w.value.byteLength,u>o||u>a$2.texture)throw await c$1.cancel(),new Error(`download exceeded the expected ${o}-byte size`);s.push(Buffer.from(w.value.buffer,w.value.byteOffset,w.value.byteLength));}let l=Buffer.concat(s,u);if(l.byteLength!==o)throw new Error(`downloaded ${l.byteLength} bytes; expected ${o}`);let f=c(l);if(f!==i)throw new Error(`checksum mismatch: expected ${i}, received ${f}`);let h=e.archive===void 0?l:vt(l,e.archive.entry,e.bytes);if(h.byteLength!==e.bytes)throw new Error(`resolved ${h.byteLength} bytes; expected ${e.bytes}`);let T=c(h);if(T!==e.checksum)throw new Error(`resolved checksum mismatch: expected ${e.checksum}, received ${T}`);return h}a(Wt,"downloadFont");async function oe(e,t){await mkdir(y.dirname(e),{recursive:true});let n=`${e}.${process.pid}.${randomUUID()}.tmp`;try{await writeFile(n,t,{flag:"wx"}),await rename(n,e);}finally{await rm(n,{force:true});}}a(oe,"writeCachedFont");async function Re(e,t,n){let r=Ut(e,t),o=X.get(r);if(o)return o;let i=(async()=>{let a=await jt(r,e);if(a)return a;if(t.fetch===void 0&&t.mapBuiltinFont===void 0){let c=await Gt(e);if(c!==void 0)return await oe(r,c),c}if(n!==void 0){let c=await Kt(n,e);if(c!==void 0)return await oe(r,c),c}try{let c=await Wt(e,t.fetch??globalThis.fetch);return await oe(r,c),c}catch(c){throw new Error(`Could not download the built-in ${e.font.id} ${e.kind} font from ${e.url}: ${c instanceof Error?c.message:String(c)}. Connect once to prewarm the checksum-keyed cache at ${JSON.stringify(He(t))}, or configure source.path/source.package for fully offline text generation.`,{cause:c})}})();X.set(r,i);try{return await i}finally{X.get(r)===i&&X.delete(r);}}a(Re,"cachedBuiltinAsset");async function De(e,t,n){let[r,o]=await Promise.allSettled([Re(Fe(e,"source"),t),Re(Fe(e,"browser"),t,n)]);if(r.status==="rejected")throw r.reason;if(o.status==="rejected")throw o.reason;return [r.value,o.value]}a(De,"cachedBuiltinPair");async function Fn(e,t={}){let n=Me(e,t);await De(n,t);}a(Fn,"prewarmBuiltinFont");async function ze(e,t,n){let r=await h(e,a$2.texture,n),o=c(r.data);if(t!=="pending"&&o!==t)throw new Error(`${n} checksum mismatch: expected ${t}, received ${o}.`);return r.data}a(ze,"checkedExternalFile");function Ue(e,t){if(!/^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+$/iu.test(t))throw new Error("Text font package name is unsafe.");return y.join(e,"node_modules",...t.split("/"))}a(Ue,"packageRoot");async function Vt(e,t){if("builtin"in t){let o=_e(t.builtin);return {sourceHash:o.sourceChecksum,browserHash:o.browserChecksum,description:`builtin:${o.id}@${o.version}`,license:o.license}}if("path"in t){let o=await j$1(e,y.join(e,t.path),a$2.texture,"Text source font");return {sourceHash:c(o.data),browserHash:c(o.data),description:t.path}}let n=y.join(Ue(e,t.package),t.file),r=await ze(n,t.checksum,"Package text source font");return {sourceHash:c(r),browserHash:c(r),description:`${t.package}/${t.file}`}}a(Vt,"resolveFontIdentity");async function Jt(e,t,n,r){if("builtin"in t){let c=Me(t.builtin,n),[s,u]=await De(c,n,r===void 0?void 0:{root:e,filePath:r});return {source:s,sourceHash:c.sourceChecksum,browser:u,browserHash:c.browserChecksum,description:`builtin:${c.id}@${c.version}`,license:c.license}}if("path"in t){let c$1=await j$1(e,y.join(e,t.path),a$2.texture,"Text source font"),s=c(c$1.data);return {source:c$1.data,sourceHash:s,browser:c$1.data,browserHash:s,description:t.path}}let o=y.join(Ue(e,t.package),t.file),i=await ze(o,t.checksum,"Package text source font"),a=c(i);return {source:i,sourceHash:a,browser:i,browserHash:a,description:`${t.package}/${t.file}`}}a(Jt,"resolveFont");function N(e,t){let n=t.replace(/^\/+/,""),r=y.resolve(e,"public",n),o=y.resolve(e,"public"),i=y.relative(o,r);if(i===""||i===".."||i.startsWith(`..${y.sep}`)||y.isAbsolute(i))throw new Error(`Deployed text path ${JSON.stringify(t)} escapes public/.`);return r}a(N,"deployedFile");function ae(e,t){return y.relative(e,t).split(y.sep).join("/")}a(ae,"portablePath");function je(e){return e.endsWith(".json")?`${e.slice(0,-5)}.meta.json`:`${e}.meta.json`}a(je,"metadataPath");function ce(e){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}a(ce,"bufferArray");function qt(e,t){return t.filter(n=>n===65533||e.charToGlyphIndex(String.fromCodePoint(n))!==0)}a(qt,"supportedCodePoints");function Ae(e,t,n,r){return new Promise((o,i)=>{It(e,{filename:n,charset:t.map(a=>String.fromCodePoint(a)),outputType:"json",fieldType:"msdf",fontSize:r.size,distanceRange:r.distanceRange,texturePadding:r.padding,textureSize:[r.maxTextureSize,r.maxTextureSize],smartSize:true,pot:true},(a,c,s)=>{if(a)return i(a);if(c.length!==1||c[0]===void 0)return i(new Error(`Text glyphs require ${c.length} atlas pages; raise maxTextureSize or lower size.`));try{o({png:c[0].texture,data:zt(JSON.parse(s.data))});}catch(u){i(u);}});})}a(Ae,"generateBMFontData");function ke(e,t,n,r){let o=1/e.info.size,i=e.common.base,a$1=t.unitsPerEm,c=t.tables.hhea,s=a(l=>{let f=t.charToGlyph(String.fromCodePoint(l))?.advanceWidth;return typeof f=="number"&&Number.isFinite(f)?f/a$1:void 0},"exactAdvance"),u=a((l,f)=>{try{let h=t.getKerningValue(t.charToGlyph(String.fromCodePoint(l)),t.charToGlyph(String.fromCodePoint(f)));return Number.isFinite(h)&&h!==0?h/a$1:void 0}catch{return}},"exactKerning");return {name:t.names?.fontFamily?.en??e.info.face,atlas:{type:"msdf",distanceRange:n.distanceRange,size:e.info.size,width:e.common.scaleW,height:e.common.scaleH,yOrigin:"top",...r===void 0?{}:{wght:r}},metrics:{emSize:1,lineHeight:(c.ascender-c.descender+c.lineGap)/a$1,ascender:c.ascender/a$1,descender:c.descender/a$1,underlineY:(t.tables.post?.underlinePosition??-a$1*.1)/a$1,underlineThickness:(t.tables.post?.underlineThickness??a$1*.05)/a$1},glyphs:e.chars.slice().sort((l,f)=>l.id-f.id).map(l=>({unicode:l.id,advance:s(l.id)??l.xadvance*o,...l.width>0&&l.height>0?{planeBounds:{left:l.xoffset*o,bottom:(i-l.yoffset-l.height)*o,right:(l.xoffset+l.width)*o,top:(i-l.yoffset)*o},atlasBounds:{left:l.x,top:l.y,right:l.x+l.width,bottom:l.y+l.height}}:{}})),kerning:e.kernings.filter(l=>l.amount!==0).sort((l,f)=>l.first-f.first||l.second-f.second).map(l=>({unicode1:l.first,unicode2:l.second,advance:u(l.first,l.second)??l.amount*o}))}}a(ke,"convertMetrics");function Ge(){return G}a(Ge,"zstdFunctions");function Be(e){let t=PNG.sync.read(e),n=new Uint8Array(t.data.buffer,t.data.byteOffset,t.data.byteLength),o=Ge().zstdCompressSync,i=o===void 0?"none":"zstd",a$1=G.constants.ZSTD_c_compressionLevel,c=o?.(n,a$1===void 0?{}:{params:{[a$1]:19}}),s=createDefaultContainer();s.vkFormat=VK_FORMAT_R8G8B8A8_UNORM,s.typeSize=1,s.pixelWidth=t.width,s.pixelHeight=t.height,s.supercompressionScheme=i==="zstd"?KHR_SUPERCOMPRESSION_ZSTD:KHR_SUPERCOMPRESSION_NONE,s.levels=[{levelData:c===void 0?n:new Uint8Array(c.buffer,c.byteOffset,c.byteLength),uncompressedByteLength:n.byteLength}];let u=a((f,h)=>({bitOffset:f*8,bitLength:7,channelType:h,samplePosition:[0,0,0,0],sampleLower:0,sampleUpper:255}),"sample");s.dataFormatDescriptor=[{vendorId:KHR_DF_VENDORID_KHRONOS,descriptorType:KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,versionNumber:KHR_DF_VERSION,colorModel:KHR_DF_MODEL_RGBSDA,colorPrimaries:KHR_DF_PRIMARIES_BT709,transferFunction:KHR_DF_TRANSFER_LINEAR,flags:KHR_DF_FLAG_ALPHA_STRAIGHT,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[u(0,KHR_DF_CHANNEL_RGBSDA_RED),u(1,KHR_DF_CHANNEL_RGBSDA_GREEN),u(2,KHR_DF_CHANNEL_RGBSDA_BLUE),u(3,KHR_DF_CHANNEL_RGBSDA_ALPHA|KHR_DF_SAMPLE_DATATYPE_LINEAR)]}],s.keyValue.KTXwriter=`three-blocks text ${Z}`,s.keyValue.KTXorientation="rd";let l=write(s,{keepWriter:true});return de(l,t.width,t.height),{bytes:l,width:t.width,height:t.height,compression:i}}a(Be,"createKtx2");function de(e,t,n){let r=read(e);if(r.vkFormat!==VK_FORMAT_R8G8B8A8_UNORM)throw new Error("Text atlas must use RGBA8 KTX2.");if(r.pixelWidth<=0||r.pixelHeight<=0||r.levels.length!==1||r.levels[0]===void 0)throw new Error("Text atlas KTX2 dimensions or levels are invalid.");if(t!==void 0&&r.pixelWidth!==t)throw new Error("Text atlas KTX2 width does not match metrics.");if(n!==void 0&&r.pixelHeight!==n)throw new Error("Text atlas KTX2 height does not match metrics.");if(r.keyValue.KTXorientation!=="rd")throw new Error("Text atlas KTX2 orientation must be rd.");let o=r.levels[0],i,a;if(r.supercompressionScheme===KHR_SUPERCOMPRESSION_ZSTD){let s=Ge().zstdDecompressSync;if(s===void 0)throw new Error("This Node.js runtime cannot validate Zstandard KTX2 text atlases.");i=s(o.levelData),a="zstd";}else if(r.supercompressionScheme===KHR_SUPERCOMPRESSION_NONE)i=o.levelData,a="none";else throw new Error("Text atlas uses an unsupported KTX2 supercompression scheme.");let c=r.pixelWidth*r.pixelHeight*4;if(i.byteLength!==c||o.uncompressedByteLength!==c)throw new Error("Text atlas KTX2 decoded byte length is invalid.");return {width:r.pixelWidth,height:r.pixelHeight,compression:a}}a(de,"validateKtx2Bytes");function ie(e){return `${JSON.stringify(e)}
|
|
2
|
+
`}a(ie,"stableJson");function z(e,t,n){return {path:ae(e,t),sha256:c(n),bytes:n.byteLength}}a(z,"fileReceipt");function le(e){return Object.keys(e.weights).map(Number).sort((t,n)=>t-n)}a(le,"routeWeights");function Ke(e,t,n,r,o){return c(JSON.stringify({generator:Z,fontKey:r,fontHash:e.sourceHash,glyphSetHash:t,options:n,...o.length>0?{weights:o}:{}}))}a(Ke,"createInputHash");async function Xt(e,t,n){let{default:r}=await import('subset-font'),o=t.map(i=>String.fromCodePoint(i)).join("");return r(e,o,{targetFormat:"sfnt",variationAxes:{wght:n}})}a(Xt,"instanceFontWeight");async function Zt(e,t,n,r,o,i,a){if(o.length===0)throw new Error(`Text font ${JSON.stringify(t)} covers no required glyphs.`);let c=se.parse(ce(r.source)),s=await Ae(r.source,o,t,a),u=ke(s.data,c,a),l=Buffer.from(ie(u)),f$1=Be(s.png);if(s.data.common.scaleW!==f$1.width||s.data.common.scaleH!==f$1.height)throw new Error(`Text font ${JSON.stringify(t)} metrics and texture dimensions differ.`);let h=le(n);if(h.length>0&&!c.tables.fvar?.axes?.some(x=>x.tag==="wght"))throw new Error(`Text font ${JSON.stringify(t)} declares weights but its source has no variable wght axis.`);let T=[],w={};for(let x of h){let I=n.weights[String(x)],ue=await Xt(r.source,o,x),ve=se.parse(ce(ue)),K=await Ae(ue,o,`${t}-w${x}`,a),fe=Buffer.from(ie(ke(K.data,ve,a,x))),v=Be(K.png);if(K.data.common.scaleW!==v.width||K.data.common.scaleH!==v.height)throw new Error(`Text font ${JSON.stringify(t)} weight ${x} metrics and texture dimensions differ.`);let pe=N(e,I.atlas),me=N(e,I.metrics);T.push({file:pe,data:v.bytes},{file:me,data:fe}),w[String(x)]={atlas:z(e,pe,v.bytes),metrics:z(e,me,fe)};}let C=N(e,n.browser),S=N(e,n.atlas),F=N(e,n.metrics),k=je(F),R={schemaVersion:Ie,generatorVersion:Z,font:{key:t,source:r.description,sourceHash:r.sourceHash,...r.license===void 0?{}:{license:r.license}},inputHash:Ke(r,i,a,t,h),glyphSetHash:i,codePoints:o,options:a,texture:{format:"RGBA8",orientation:"rd",compression:f$1.compression,width:f$1.width,height:f$1.height},files:{browser:z(e,C,r.browser),atlas:z(e,S,f$1.bytes),metrics:z(e,F,l),...h.length>0?{weights:w}:{}}},O=Buffer.from(ie(R));await f(C,r.browser),await f(S,f$1.bytes),await f(F,l);for(let{file:x,data:I}of T)await f(x,I);await f(k,O);let L=[C,S,F,...T.map(x=>x.file),k].map(x=>ae(e,x));return {font:t,receipt:R,metadataPath:ae(e,k),updatedFiles:L}}a(Zt,"generateRoute");async function Rn(e,t="three-blocks.text.ts",n={}){let r=await te(e,t),o=await ne(e,r),i=Ne(r),a=[];for(let[l,f]of Object.entries(r.fonts).sort((h,T)=>h[0].localeCompare(T[0]))){let h=await Jt(e,f.source,n,"builtin"in f.source?N(e,f.browser):void 0),T=se.parse(ce(h.source));a.push({key:l,route:f,resolved:h,font:T,codePoints:qt(T,o.glyphs.codePoints)});}let c=new Set(a.flatMap(l=>l.codePoints)),s=o.glyphs.codePoints.filter(l=>!c.has(l));if(s.length>0)throw new Error(`Configured fonts do not cover ${s.length} required glyph(s): ${s.map(l=>String.fromCodePoint(l)).join(" ")}`);let u=[];for(let l of a)u.push(await Zt(e,l.key,l.route,l.resolved,l.codePoints,o.glyphs.hash,i));return {glyphs:o.glyphs.codePoints.length,glyphSetHash:o.glyphs.hash,atlases:u,updatedFiles:u.flatMap(l=>l.updatedFiles)}}a(Rn,"generateTextAtlases");function U(e,t){if(!a$1(e)||typeof e.path!="string"||typeof e.sha256!="string"||!/^[a-f0-9]{64}$/u.test(e.sha256)||!Number.isSafeInteger(e.bytes)||e.bytes<0)throw new Error(`${t} receipt is invalid.`);return e}a(U,"parseFileReceipt");function Yt(e){if(!a$1(e)||e.schemaVersion!==Ie||e.generatorVersion!==Z||!a$1(e.font)||typeof e.font.key!="string"||typeof e.font.source!="string"||typeof e.font.sourceHash!="string"||!/^[a-f0-9]{64}$/u.test(e.font.sourceHash)||typeof e.inputHash!="string"||!/^[a-f0-9]{64}$/u.test(e.inputHash)||typeof e.glyphSetHash!="string"||!/^[a-f0-9]{64}$/u.test(e.glyphSetHash)||!Array.isArray(e.codePoints)||!e.codePoints.every(t=>Number.isSafeInteger(t))||!a$1(e.options)||!a$1(e.texture)||!a$1(e.files))throw new Error("Text atlas generation metadata is invalid.");if(e.texture.format!=="RGBA8"||e.texture.orientation!=="rd"||!["zstd","none"].includes(e.texture.compression))throw new Error("Text atlas texture metadata is invalid.");if(U(e.files.browser,"Browser font"),U(e.files.atlas,"Text atlas"),U(e.files.metrics,"Text metrics"),e.files.weights!==void 0){if(!a$1(e.files.weights))throw new Error("Text atlas weight receipts are invalid.");for(let[t,n]of Object.entries(e.files.weights)){let r=Number(t);if(!Number.isInteger(r)||r<1||r>1e3||!a$1(n))throw new Error(`Text atlas weight receipt "${t}" is invalid.`);U(n.atlas,`Text atlas weight ${t}`),U(n.metrics,`Text metrics weight ${t}`);}}return e}a(Yt,"parseTextAtlasReceipt");function $e(e){if(!a$1(e)||!a$1(e.atlas)||!Array.isArray(e.glyphs))throw new Error("Text metrics are invalid.");let t=P(e.atlas.width,"Text metrics atlas.width"),n=P(e.atlas.height,"Text metrics atlas.height"),r=e.glyphs.map((o,i)=>{if(!a$1(o))throw new Error(`Text metrics glyph ${i} is invalid.`);return P(o.unicode,`Text metrics glyph ${i}.unicode`)});return {width:t,height:n,codePoints:r}}a($e,"metricsCoverage");async function j(e,t,n,r){let o=await j$1(e,y.join(e,t.path),n,r);if(o.data.byteLength!==t.bytes||c(o.data)!==t.sha256)throw new Error(`${r} checksum or byte length differs from generation metadata.`);return o.data}a(j,"verifyReceiptFile");async function An(e,t="three-blocks.text.ts"){let n;try{n=await te(e,t);}catch(r){return {state:"invalid",reason:`Text configuration is invalid: ${r instanceof Error?r.message:String(r)}`,missing:[],atlases:[]}}try{let r=await ne(e,n),o=Ne(n),i=[],a=new Set;for(let[s,u]of Object.entries(n.fonts).sort((l,f)=>l[0].localeCompare(f[0]))){let l=await j$1(e,je(N(e,u.metrics)),a$2.metadata,"Text atlas generation metadata"),f=Yt(JSON.parse(l.data.toString("utf8")));if(f.font.key!==s)throw new Error(`Text atlas metadata belongs to ${JSON.stringify(f.font.key)}, not ${JSON.stringify(s)}.`);let h=await Vt(e,u.source),T=Ke(h,f.glyphSetHash,o,s,le(u));if(f.inputHash!==T)return {state:"invalid",reason:`Text atlas ${s} font source, weights, or generation options changed.`,missing:[],atlases:[...i,f]};let[w,C,S]=await Promise.all([j(e,f.files.browser,a$2.texture,"Browser font"),j(e,f.files.atlas,a$2.texture,"Text atlas"),j(e,f.files.metrics,a$2.metrics,"Text metrics")]);if(c(w)!==h.browserHash)throw new Error(`Browser font ${s} differs from its resolved source.`);let F=$e(JSON.parse(S.toString("utf8"))),k=de(C,F.width,F.height);if(k.width!==f.texture.width||k.height!==f.texture.height||k.compression!==f.texture.compression)throw new Error(`Text atlas ${s} texture metadata does not match KTX2.`);for(let R of le(u)){let O=f.files.weights?.[String(R)];if(O===void 0)throw new Error(`Text atlas ${s} weight ${R} has no generation receipt.`);let[L,x]=await Promise.all([j(e,O.atlas,a$2.texture,`Text atlas weight ${R}`),j(e,O.metrics,a$2.metrics,`Text metrics weight ${R}`)]),I=$e(JSON.parse(x.toString("utf8")));de(L,I.width,I.height);}for(let R of F.codePoints)a.add(R);i.push(f);}let c$1=r.glyphs.codePoints.filter(s=>!a.has(s));return c$1.length>0?{state:"missing",reason:`${c$1.length} required glyph(s) are missing.`,missing:c$1,atlases:i}:{state:"ready",reason:`${r.glyphs.codePoints.length} required glyphs are covered by ${i.length} atlas(es).`,missing:[],atlases:i}}catch(r){return (typeof r=="object"&&r!==null&&"code"in r?r.code:void 0)==="ENOENT"?{state:"missing",reason:"Text atlas files or generation metadata are absent.",missing:[],atlases:[]}:{state:"invalid",reason:r instanceof Error?r.message:String(r),missing:[],atlases:[]}}}a(An,"inspectTextAtlases");export{xe as a,be as b,Te as c,pt as d,te as e,ne as f,Ie as g,Z as h,_e as i,Fn as j,Rn as k,Yt as l,An as m};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {a as a$2}from'./chunk-TK566QET.js';import {e as e$1,g}from'./chunk-NJITVI23.js';import {a as a$1,c as c$1}from'./chunk-WNSGAV6N.js';import {c,d as d$1,f,e,i}from'./chunk-ECQE4D2U.js';import {a}from'./chunk-7X4DHW36.js';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 {lstat,readFile,unlink,mkdir,readdir}from'fs/promises';import d from'path';function F(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(F,"shaderCompatibilityForThree");var be=64,q="timing.local.json",Y="timing.json",J="parity.json",x=4096,Ee=4096;function U(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(U,"boundedString");function u(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(u,"nonNegativeNumber");function Re(e){if(!a$1(e))throw new Error("Shader capture stats are missing.");let r={buildCalls:u(e.buildCalls,"capture stats.buildCalls"),renderBuilds:u(e.renderBuilds,"capture stats.renderBuilds"),computeBuilds:u(e.computeBuilds,"capture stats.computeBuilds"),registeredBuilds:u(e.registeredBuilds,"capture stats.registeredBuilds"),registeredRenderBuilds:u(e.registeredRenderBuilds,"capture stats.registeredRenderBuilds"),registeredComputeBuilds:u(e.registeredComputeBuilds,"capture stats.registeredComputeBuilds"),buildMs:u(e.buildMs,"capture stats.buildMs",false),syncBuildMs:u(e.syncBuildMs,"capture stats.syncBuildMs",false),asyncBuildElapsedMs:u(e.asyncBuildElapsedMs,"capture stats.asyncBuildElapsedMs",false),precompiledSetupMs:u(e.precompiledSetupMs,"capture stats.precompiledSetupMs",false),maxSyncBuildMs:u(e.maxSyncBuildMs??e.syncBuildMs,"capture stats.maxSyncBuildMs",false),maxPrecompiledSetupMs:u(e.maxPrecompiledSetupMs??e.precompiledSetupMs,"capture stats.maxPrecompiledSetupMs",false),hydrationMs:u(e.hydrationMs??0,"capture stats.hydrationMs",false),maxHydrationMs:u(e.maxHydrationMs??e.hydrationMs??0,"capture stats.maxHydrationMs",false),injected:u(e.injected,"capture stats.injected"),injectedRender:u(e.injectedRender,"capture stats.injectedRender"),injectedCompute:u(e.injectedCompute,"capture stats.injectedCompute"),missed:u(e.missed,"capture stats.missed"),missedRender:u(e.missedRender,"capture stats.missedRender"),missedCompute:u(e.missedCompute,"capture stats.missedCompute"),...Array.isArray(e.missedKeys)&&e.missedKeys.every(t=>typeof t=="string")?{missedKeys:e.missedKeys.slice(0,x)}:{}};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(Re,"captureStats");function Me(e){if(!Array.isArray(e)||e.length>x)throw new Error("Shader capture skipped builds are invalid.");return e.map((r,t)=>{if(!a$1(r)||r.kind!=="render"&&r.kind!=="compute")throw new Error(`Shader capture skipped build ${t} is invalid.`);return {kind:r.kind,name:U(r.name,`skipped build ${t} name`,512),reason:U(r.reason,`skipped build ${t} reason`)}})}a(Me,"skippedBuilds");function ke(e){let r=0,t=0,n=0,i=0;for(let a of Object.values(e.entries)){let o=e.states[a];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(ke,"shaderCoverage");function Le(e,r){if(!a$1(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=F(r.runtime.three,t);if(e.compatibility!==n)throw new Error(`Shader capture compatibility must be "${n}".`);if(!a$1(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>x)throw new Error(`Shader capture must contain at most ${x} entries.`);if(!Array.isArray(e.errors)||e.errors.length>Ee)throw new Error("Shader capture errors are invalid.");let a=e.errors.map((w,s)=>U(w,`capture error ${s}`,64*1024));if(a.length>0)throw new Error(`Shader capture failed:
|
|
2
|
+
- ${a.join(`
|
|
3
|
+
- `)}`);let o=Me(e.skipped);if(i===0&&(t!=="webgl"||o.length===0))throw new Error("Shader capture must contain an entry unless WebGL explicitly skipped every live build.");let l=Re(e.stats),p=a$1(e.timing)?e.timing:void 0,y=p===void 0?void 0:Object.fromEntries(["launch","firstRequest","readiness","lastBuild","settled","posted"].flatMap(w=>{let s=p[w];if(s===void 0)return [];if(typeof s!="number"||!Number.isFinite(s)||s<0)throw new Error(`Shader capture timing.${w} is invalid.`);return [[w,s]]})),m;if(e.provenance!==void 0){if(!a$1(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(w=>typeof w=="string"&&w.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 R=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}}),S=ke(R);if(l.registeredRenderBuilds<S.render||l.registeredComputeBuilds<S.compute)throw new Error("Shader capture did not live-build every distinct registered render/compute entry.");return {scene:r.scene,backend:t,manifest:R,skipped:o,stats:l,coverage:S,...y===void 0?{}:{timing:y},...m===void 0?{}:{provenance:m}}}a(Le,"validateShaderCapture");function E(e,r=0){let t=" ".repeat(r),n=" ".repeat(r+1);if(Array.isArray(e))return e.length===0?"[]":e.every(a=>a===null||["number","string","boolean"].includes(typeof a))?JSON.stringify(e):`[
|
|
4
|
+
${e.map(a=>`${n}${E(a,r+1)}`).join(`,
|
|
5
|
+
`)}
|
|
6
|
+
${t}]`;if(e!==null&&typeof e=="object"){let a=e,o=Object.keys(a).sort();return o.length===0?"{}":`{
|
|
7
|
+
${o.map(l=>{let p=a[l];return `${n}${JSON.stringify(l)}: ${E(p,r+1)}`}).join(`,
|
|
8
|
+
`)}
|
|
9
|
+
${t}}`}let i=JSON.stringify(e);if(i===void 0)throw new Error("Shader artifact contains a non-serializable value.");return i}a(E,"stableStringify");function Be(e){return ["// GENERATED FILE \u2014 do not edit by hand.","// Produced by @three-blocks/devtools.","import type { PrecompiledManifest } from 'three-blocks/shaders';","",`export default ${E(e)} satisfies PrecompiledManifest;`,""].join(`
|
|
10
|
+
`)}a(Be,"serializeShaderManifest");function te(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(te,"timingLabel");function G(e){if(!a$1(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))||!a$1(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||!a$1(i))throw new Error("Shader timing scene is invalid.");let a={builds:u(i.builds,`timing ${n}.builds`),setupMeasured:i.setupMeasured===true,liveBuildMs:u(i.liveBuildMs,`timing ${n}.liveBuildMs`,false),precompiledBuildMs:u(i.precompiledBuildMs,`timing ${n}.precompiledBuildMs`,false),avoidedBuildMs:u(i.avoidedBuildMs,`timing ${n}.avoidedBuildMs`,false),runs:u(i.runs,`timing ${n}.runs`),spreadMs:u(i.spreadMs,`timing ${n}.spreadMs`,false)};if(a.runs<1)throw new Error(`Shader timing runs are invalid for scene "${n}".`);if(Math.abs(a.avoidedBuildMs-Math.max(0,a.liveBuildMs-a.precompiledBuildMs))>.001)throw new Error(`Shader timing delta is inconsistent for scene "${n}".`);r[n]=a;}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:te(e.adapter,"Shader timing adapter"),platform:te(e.platform,"Shader timing platform")}}a(G,"parseShaderTiming");function O(e){return /^[a-z0-9][a-z0-9_-]{0,63}(?:\.webgl)?$/u.test(e)}a(O,"validParityScene");function ne(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}a(ne,"validParityTimestamp");function z(e){if(!a$1(e))throw new Error("Shader parity evidence is invalid.");if(e.schemaVersion===1){if(typeof e.receiptHash!="string"||!/^[a-f0-9]{64}$/u.test(e.receiptHash)||!ne(e.verifiedAt)||!Array.isArray(e.scenes)||e.scenes.length===0||e.scenes.length>64||!e.scenes.every(n=>typeof n=="string"&&O(n)))throw new Error("Shader parity evidence is invalid.");return {schemaVersion:1,receiptHash:e.receiptHash,verifiedAt:e.verifiedAt,scenes:[...new Set(e.scenes)].sort()}}if(e.schemaVersion!==2||!a$1(e.scenes))throw new Error("Shader parity evidence is invalid.");let r=Object.entries(e.scenes);if(r.length===0||r.length>64)throw new Error("Shader parity evidence is invalid.");let t={};for(let[n,i]of r.sort(([a],[o])=>a.localeCompare(o))){if(!O(n)||!a$1(i)||typeof i.fingerprint!="string"||!/^[a-f0-9]{64}$/u.test(i.fingerprint)||!ne(i.verifiedAt))throw new Error("Shader parity evidence is invalid.");if(i.execution!==void 0&&i.execution!=="node"&&i.execution!=="browser")throw new Error("Shader parity execution is invalid.");t[n]={fingerprint:i.fingerprint,verifiedAt:i.verifiedAt,...i.execution===void 0?{}:{execution:i.execution}};}return {schemaVersion:2,scenes:t}}a(z,"parseShaderParityEvidence");function ce(e,r){let t=e.scenes[r];if(t===void 0)throw new Error(`Shader receipt has no scene "${r}" for parity evidence.`);return c(E({runtime:{three:e.runtime.three,threeBlocks:e.runtime.threeBlocks,threeBlocksShaderClosure:e.runtime.threeBlocksShaderClosure},...e.tool===void 0?{}:{tool:e.tool},scene:t}))}a(ce,"shaderSceneParityFingerprint");async function _(e,r,t,n){let i=d.join(e,t);try{if(!await d$1(i))return;let a=await lstat(i);if(a.isSymbolicLink()||!a.isFile()||a.size>1024*1024)return;let o=G(JSON.parse(await readFile(i,"utf8")));return o.source===n&&o.receiptHash===c(r)?o:void 0}catch{return}}a(_,"readShaderTimingFile");async function De(e,r){let t=await _(e,r,q,"latest-local-capture");return t?.source==="latest-local-capture"?t:void 0}a(De,"readShaderLocalTiming");async function Ne(e,r){return await _(e,r,q,"latest-local-capture")??await _(e,r,Y,"committed-capture")}a(Ne,"readShaderTiming");async function ue(e,r){let t=d.join(e,J);try{if(!await d$1(t))return;let n=await lstat(t);if(n.isSymbolicLink()||!n.isFile()||n.size>1024*1024)return;let i=z(JSON.parse(await readFile(t,"utf8"))),a=c$1(JSON.parse(Buffer.from(r).toString("utf8"))),o={};if(i.schemaVersion===1)return;for(let[l,p]of Object.entries(i.scenes))p.execution!=="node"||a.scenes[l]===void 0||p.fingerprint!==ce(a,l)||(o[l]=p);return Object.keys(o).length===0?void 0:{schemaVersion:2,scenes:o}}catch{return}}a(ue,"readShaderParityEvidence");async function ve(e,r){let t=await _(e,r,Y,"committed-capture");return t?.source==="committed-capture"?t:void 0}a(ve,"readShaderCommittedTiming");async function pe(e,r,t){let n=await I(e),i=d.join(n,"meta.json"),a=await lstat(i);if(a.isSymbolicLink()||!a.isFile())throw new Error("Shader receipt must be a regular file before timing.");let o=await readFile(i),l=new Date().toISOString(),p=Object.fromEntries(Object.entries(r).sort(([R],[S])=>R.localeCompare(S))),y=G({schemaVersion:3,receiptHash:c(o),measuredAt:l,source:"latest-local-capture",scenes:p});if(await f(d.join(n,q),`${E(y)}
|
|
11
|
+
`),t===void 0)return {local:y};let m=G({schemaVersion:3,receiptHash:c(o),measuredAt:l,source:"committed-capture",adapter:t.adapter,platform:t.platform,scenes:p});return await f(d.join(n,Y),`${E(m)}
|
|
12
|
+
`),{local:y,committed:m}}a(pe,"writeShaderTimings");async function Fe(e,r){return (await pe(e,r)).local}a(Fe,"writeShaderLocalTiming");async function We(e,r,t){if(r.length===0||r.length>64||r.some(S=>!O(S)))throw new Error("Shader parity evidence must contain 1...64 valid scene keys.");let n=await I(e),i=d.join(n,"meta.json"),a=await lstat(i);if(a.isSymbolicLink()||!a.isFile())throw new Error("Shader receipt must be a regular file before parity evidence.");let o=await readFile(i);if(t!==void 0&&c(o)!==c(t))throw new Error("Shader receipt changed during renderer parity verification; completed observations were not attached to the new receipt.");let l=c$1(JSON.parse(o.toString("utf8"))),p=await ue(n,o),y=new Date().toISOString(),m={...p?.scenes};for(let S of [...new Set(r)].sort())m[S]={execution:"node",fingerprint:ce(l,S),verifiedAt:y};let R=z({schemaVersion:2,scenes:m});return await f(d.join(n,J),`${E(R)}
|
|
13
|
+
`),R}a(We,"writeShaderParityEvidence");async function Ue(e,r,t){if(r.length===0||r.length>64||r.some(m=>!O(m)))throw new Error("Shader parity invalidation must contain 1...64 valid scene keys.");let n=await I(e),i=await readFile(d.join(n,"meta.json"));if(c(i)!==c(t))throw new Error("Shader receipt changed before prior parity evidence could be invalidated.");let a=await ue(n,i);if(a===void 0)return;let o=new Set(r),l=Object.fromEntries(Object.entries(a.scenes).filter(([m])=>!o.has(m))),p=d.join(n,J);if(Object.keys(l).length===0){await unlink(p).catch(m=>{if(!a$1(m)||m.code!=="ENOENT")throw m});return}let y=z({schemaVersion:2,scenes:l});await f(p,`${E(y)}
|
|
14
|
+
`);}a(Ue,"removeShaderParityEvidence");async function Ge(e,r,t){let n=await pe(e,r,t);if(n.committed===void 0)throw new Error("Committed shader timing was not written.");return {local:n.local,committed:n.committed}}a(Ge,"writeShaderTimingTwins");async function ie(e){if(!await d$1(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(ie,"assertDirectory");async function I(e){let r=d.resolve(e),t=d.join(r,".three-blocks");await ie(t);let n=d.join(t,"shaders");return await ie(n),n}a(I,"artifactRoot");async function qe(e$2){let r=await I(e$2.root),t=e$2.backends??["webgpu"],n=Object.fromEntries(t.map(s=>[s,F(e$2.runtime.three,s)])),i$1=d.resolve(e$2.root),a=d.resolve(i$1,e$2.publicDirectory??"public");if(!e(i$1,a)||a===i$1)throw new Error("Shader public directory must stay inside the project root.");let o=d.join(a,"three-blocks","shaders");await mkdir(o,{recursive:true}),await i(i$1,o,"Shader static-asset directory");let l={},p=[];for(let s of [...e$2.scenes].sort((b,k)=>b.key.localeCompare(k.key))){let b=e$2.inputs.get(s.key);if(b===void 0)throw new Error(`Shader input matrix is missing scene "${s.key}".`);for(let k of e$1(s,t)){let T=g(s.key,k),M=e$2.captures.get(T);if(M===void 0){let f=e$2.previousReceipt?.scenes[T];if(f===void 0)continue;let L=await readFile(d.join(r,f.artifact));if(c(L)!==f.artifactHash)throw new Error(`Preserved shader artifact checksum differs for "${T}".`);if(f.asset!==void 0&&f.assetHash!==void 0){let D=await readFile(d.join(a,f.asset));if(c(D)!==f.assetHash)throw new Error(`Preserved static shader manifest checksum differs for "${T}".`)}l[T]={...f,backend:k,inputs:Object.fromEntries(Object.entries(b).sort(([D],[me])=>D.localeCompare(me)))},p.push(f.artifact),f.asset!==void 0&&p.push(d.relative(i$1,d.join(a,f.asset)).split(d.sep).join("/"));continue}if(M.scene!==s.key||M.backend!==k||M.manifest.scene!==s.key)throw new Error(`Capture matrix scene/backend "${T}" is inconsistent.`);let $=`${s.key}.${k}.ts`,H=Be(M.manifest);await f(d.join(r,$),H),p.push($);let V=`three-blocks/shaders/${s.key}.${k}.json`,K=`${E(M.manifest)}
|
|
15
|
+
`;await f(d.join(a,V),K),p.push(d.relative(i$1,d.join(a,V)).split(d.sep).join("/"));let X=M.skipped.filter(f=>f.kind==="render").length,le=M.skipped.length-X;l[T]={backend:k,artifact:$,artifactHash:c(H),asset:V,assetHash:c(K),inputs:Object.fromEntries(Object.entries(b).sort(([f],[L])=>f.localeCompare(L))),coverage:M.coverage,bytes:Buffer.byteLength(H),skipped:{render:X,compute:le}};}}let y=[...e$2.captures.values()].find(s=>s.provenance!==void 0)?.provenance??e$2.previousReceipt?.runtime.capture,m={schemaVersion:2,runtime:{...e$2.runtime,...y===void 0?{}:{capture:y}},tool:{name:"@three-blocks/devtools",version:a$2,compatibility:n[t[0]??"webgpu"],compatibilities:n,transform:be,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION},scenes:l},R=new Set(p);for(let s of await readdir(r,{withFileTypes:true}))if(!(!/\.(?:webgpu|webgl)\.ts$/u.test(s.name)||R.has(s.name))){if(s.isSymbolicLink()||!s.isFile())throw new Error(`Orphan shader artifact is not a regular file: ${s.name}.`);await unlink(d.join(r,s.name));}let S=new Set(e$2.scenes.flatMap(s=>e$1(s,t).map(b=>`${s.key}.${b}.json`))),w=new Set(Object.values(e$2.previousReceipt?.scenes??{}).map(s=>s.asset===void 0?void 0:d.posix.basename(s.asset)).filter(s=>s!==void 0));try{let s=c$1(JSON.parse(await readFile(d.join(r,"meta.json"),"utf8")));for(let b of Object.values(s.scenes))b.asset!==void 0&&w.add(d.posix.basename(b.asset));}catch{}for(let s of await readdir(o,{withFileTypes:true}))if(!(!s.name.endsWith(".json")||S.has(s.name))&&w.has(s.name)){if(s.isSymbolicLink()||!s.isFile())throw new Error(`Orphan shader static asset is not a regular file: ${s.name}.`);await unlink(d.join(o,s.name));}return await f(d.join(r,"meta.json"),`${E(m)}
|
|
16
|
+
`),p.push("meta.json"),{directory:r,receipt:m,files:p}}a(qe,"writeShaderArtifacts");export{F as a,be as b,q as c,Y as d,J as e,ke as f,Le as g,E as h,Be as i,De as j,Ne as k,ue as l,ve as m,Fe as n,We as o,Ue as p,Ge as q,qe as r};
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import {a as a$1,b as b$1}from'./chunk-65VEJRRT.js';import {d,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 c from'path';var S="three-blocks.shaders.json",O=".three-blocks/shaders",U=".three-blocks/shaders/parity",C=/^[a-z0-9][a-z0-9_-]{0,63}$/u,D=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u,x=64,E=64,R={schemaVersion:1,backend:"both",scenes:[{key:"default",url:"/"}]};function V(n="both"){return n==="both"?["webgpu","webgl"]:[n]}a(V,"shaderBackends");function M(n,r){return n.backend===void 0?r:r.filter(e=>e===n.backend)}a(M,"shaderSceneBackends");function z(n,r){return r.flatMap(e=>n.filter(t=>M(t,[e]).length>0).map(t=>({scene:t,backend:e,key:A(t.key,e)})))}a(z,"shaderScenePairs");function A(n,r){return r==="webgpu"?n:`${n}.webgl`}a(A,"shaderReceiptKey");function j(n,r,e){if(n===void 0)return e;if(typeof n!="string"||n.length===0||n.length>512||c.isAbsolute(n)||/[\u0000-\u001f\u007f]/u.test(n))throw new Error(`${r} must be a bounded project-relative directory.`);let t=c.posix.normalize(n.replaceAll("\\","/")).replace(/\/+$/u,"");if(t==="."||t===".."||t.startsWith("../"))throw new Error(`${r} must stay inside the project.`);return t}a(j,"safeProjectDirectory");function B(n,r){let e=j(n,r,"");if(typeof n!="string"||n.endsWith("/"))throw new Error(`${r} must be a project-relative file.`);return e}a(B,"safeProjectFile");function u(n,r,e,t,i){if(n===void 0)return i;if(!Number.isSafeInteger(n)||Number(n)<e||Number(n)>t)throw new Error(`${r} must be an integer in ${e}...${t}.`);return Number(n)}a(u,"boundedInteger");function T(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(T,"finiteRatio");function $(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($,"safeBrowserUrl");function F(n){if(!Array.isArray(n)||n.length===0||n.length>x)throw new Error(`Shader config scenes must contain 1...${x} entries.`);let r=new Set;return n.map((e,t)=>{if(!a$1(e)||typeof e.key!="string"||!C.test(e.key))throw new Error(`Shader config scene ${t} 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 i=e.parityFrames,o=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)=>B(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.runtimeMotion!==void 0&&typeof e.runtimeMotion!="boolean")throw new Error(`Shader config scene "${e.key}" runtimeMotion must be a boolean.`);if(e.backend!==void 0&&e.backend!=="webgpu"&&e.backend!=="webgl")throw new Error(`Shader config scene "${e.key}" backend must be "webgpu" or "webgl".`);return {key:e.key,url:$(e.url,`Shader config scene "${e.key}" URL`),...e.backend===void 0?{}:{backend:e.backend},requiresText:e.requiresText===true,...a===void 0?{}:{inputs:a},...i===void 0?{}:{parityFrames:u(i,`Shader config scene "${e.key}" parityFrames`,0,1e4,0)},...o===void 0?{}:{maxDiffRatio:T(o,`Shader config scene "${e.key}" maxDiffRatio`,.01)},...e.runtimeMotion===true?{runtimeMotion:true}:{}}})}a(F,"parseScenes");function b(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 t=n.bridge;if(t!==void 0&&!a$1(t))throw new Error("Shader config bridge must be an object.");let i=a$1(t)?t.deterministicModule:void 0;i!==void 0&&$(i,"Shader deterministic module");let o=n.readiness;if(o!==void 0&&!a$1(o))throw new Error("Shader config readiness must be an object.");let a=a$1(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 l=a$1(o)?o.global:void 0;if(l!==void 0&&(typeof l!="string"||!D.test(l)))throw new Error("Shader readiness global must be a dot-separated JavaScript property path.");if(n.backend!==void 0&&n.backend!=="webgpu"&&n.backend!=="webgl"&&n.backend!=="both")throw new Error('Shader config backend must be "webgpu", "webgl", or "both".');let h=u(n.timeoutMs,"Shader timeoutMs",1e3,15*6e4,24e4);return {schemaVersion:1,backend:n.backend??"both",scenes:F(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:h,maxTimeoutMs:Math.max(h,u(n.maxTimeoutMs,"Shader maxTimeoutMs",1e3,15*6e4,h)),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:T(a$1(e)?e.maxDiffRatio:void 0,"Shader parity maxDiffRatio",.01)},bridge:{legacyLab:a$1(t)&&t.legacyLab===true,...typeof i=="string"?{deterministicModule:i}:{}},readiness:{...typeof a=="string"?{selector:a}:{},...typeof l=="string"?{global:l}:{}},publicDir:j(n.publicDir,"Shader publicDir","public"),allowLiveBuilds:n.allowLiveBuilds!==false}}a(b,"parseShaderToolConfig");async function J(n=process.cwd()){let r=c.resolve(n);for(;;){if(await d(c.join(r,S))||await d(c.join(r,"three-blocks.json")))return realpath(r);let e=c.join(r,"package.json");if(await d(e)){let i=await j$1(r,e,a$2.packageJson,"Project package.json"),o;try{o=JSON.parse(i.data.toString("utf8"));}catch{throw new Error(`Project package.json is not valid JSON: ${e}.`)}if(a$1(o)&&[o.dependencies,o.devDependencies,o.peerDependencies,o.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 t=c.dirname(r);if(t===r)throw new Error(`No Three Blocks shader project found from ${JSON.stringify(c.resolve(n))}; add Three.js to package.json or pass --root.`);r=t;}}a(J,"findShaderProjectRoot");async function m(n){let r=await realpath(n),e=c.join(r,S);if(await d(e)){let i=await j$1(r,e,a$2.metadata,"Shader configuration");return b(JSON.parse(i.data.toString("utf8")))}let t=c.join(r,"three-blocks.json");if(await d(t)){let i=b$1(JSON.parse(await readFile(t,"utf8")));return b({schemaVersion:1,backend:"both",scenes:[{key:i.template,url:"/",requiresText:i.features.text}]})}return b(R)}a(m,"loadShaderToolConfig");async function v(n){let r=await realpath(n);for(let o of ["vite.config.ts","vite.config.mts","vite.config.js","vite.config.mjs","vite.config.cts","vite.config.cjs"])if(await d(c.join(r,o)))return {driverKind:"vite",reason:`Detected ${o}.`};let e,t=c.join(r,"package.json");if(await d(t)){let o=await j$1(r,t,a$2.packageJson,"Project package.json"),a=JSON.parse(o.data.toString("utf8"));a$1(a)&&(e=a);}let i=a(o=>[e?.dependencies,e?.devDependencies,e?.peerDependencies,e?.optionalDependencies].some(a=>a$1(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 d(c.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(v,"inferShaderCaptureTarget");async function G(n){let r=await realpath(n),e=c.join(r,S);if(await d(e))return {config:await m(r),file:e,created:false};let t=c.join(r,"three-blocks.json");if(await d(t))return {config:await m(r),file:t,created:false};let i=R,o=b(i),a=await g(e,`${JSON.stringify(i,null,2)}
|
|
1
|
+
import {a as a$1,b as b$1}from'./chunk-WNSGAV6N.js';import {d,j as j$1,a as a$2,g}from'./chunk-ECQE4D2U.js';import {a}from'./chunk-7X4DHW36.js';import {realpath,readFile}from'fs/promises';import c from'path';var S="three-blocks.shaders.json",O=".three-blocks/shaders",U=".three-blocks/shaders/parity",C=/^[a-z0-9][a-z0-9_-]{0,63}$/u,D=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/u,x=64,E=64,R={schemaVersion:1,backend:"both",scenes:[{key:"default",url:"/"}]};function V(n="both"){return n==="both"?["webgpu","webgl"]:[n]}a(V,"shaderBackends");function M(n,r){return n.backend===void 0?r:r.filter(e=>e===n.backend)}a(M,"shaderSceneBackends");function z(n,r){return r.flatMap(e=>n.filter(t=>M(t,[e]).length>0).map(t=>({scene:t,backend:e,key:A(t.key,e)})))}a(z,"shaderScenePairs");function A(n,r){return r==="webgpu"?n:`${n}.webgl`}a(A,"shaderReceiptKey");function j(n,r,e){if(n===void 0)return e;if(typeof n!="string"||n.length===0||n.length>512||c.isAbsolute(n)||/[\u0000-\u001f\u007f]/u.test(n))throw new Error(`${r} must be a bounded project-relative directory.`);let t=c.posix.normalize(n.replaceAll("\\","/")).replace(/\/+$/u,"");if(t==="."||t===".."||t.startsWith("../"))throw new Error(`${r} must stay inside the project.`);return t}a(j,"safeProjectDirectory");function B(n,r){let e=j(n,r,"");if(typeof n!="string"||n.endsWith("/"))throw new Error(`${r} must be a project-relative file.`);return e}a(B,"safeProjectFile");function u(n,r,e,t,i){if(n===void 0)return i;if(!Number.isSafeInteger(n)||Number(n)<e||Number(n)>t)throw new Error(`${r} must be an integer in ${e}...${t}.`);return Number(n)}a(u,"boundedInteger");function T(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(T,"finiteRatio");function $(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($,"safeBrowserUrl");function F(n){if(!Array.isArray(n)||n.length===0||n.length>x)throw new Error(`Shader config scenes must contain 1...${x} entries.`);let r=new Set;return n.map((e,t)=>{if(!a$1(e)||typeof e.key!="string"||!C.test(e.key))throw new Error(`Shader config scene ${t} 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 i=e.parityFrames,o=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)=>B(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.runtimeMotion!==void 0&&typeof e.runtimeMotion!="boolean")throw new Error(`Shader config scene "${e.key}" runtimeMotion must be a boolean.`);if(e.backend!==void 0&&e.backend!=="webgpu"&&e.backend!=="webgl")throw new Error(`Shader config scene "${e.key}" backend must be "webgpu" or "webgl".`);return {key:e.key,url:$(e.url,`Shader config scene "${e.key}" URL`),...e.backend===void 0?{}:{backend:e.backend},requiresText:e.requiresText===true,...a===void 0?{}:{inputs:a},...i===void 0?{}:{parityFrames:u(i,`Shader config scene "${e.key}" parityFrames`,0,1e4,0)},...o===void 0?{}:{maxDiffRatio:T(o,`Shader config scene "${e.key}" maxDiffRatio`,.01)},...e.runtimeMotion===true?{runtimeMotion:true}:{}}})}a(F,"parseScenes");function b(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 t=n.bridge;if(t!==void 0&&!a$1(t))throw new Error("Shader config bridge must be an object.");let i=a$1(t)?t.deterministicModule:void 0;i!==void 0&&$(i,"Shader deterministic module");let o=n.readiness;if(o!==void 0&&!a$1(o))throw new Error("Shader config readiness must be an object.");let a=a$1(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 l=a$1(o)?o.global:void 0;if(l!==void 0&&(typeof l!="string"||!D.test(l)))throw new Error("Shader readiness global must be a dot-separated JavaScript property path.");if(n.backend!==void 0&&n.backend!=="webgpu"&&n.backend!=="webgl"&&n.backend!=="both")throw new Error('Shader config backend must be "webgpu", "webgl", or "both".');let h=u(n.timeoutMs,"Shader timeoutMs",1e3,15*6e4,24e4);return {schemaVersion:1,backend:n.backend??"both",scenes:F(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:h,maxTimeoutMs:Math.max(h,u(n.maxTimeoutMs,"Shader maxTimeoutMs",1e3,15*6e4,h)),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:T(a$1(e)?e.maxDiffRatio:void 0,"Shader parity maxDiffRatio",.01)},bridge:{legacyLab:a$1(t)&&t.legacyLab===true,...typeof i=="string"?{deterministicModule:i}:{}},readiness:{...typeof a=="string"?{selector:a}:{},...typeof l=="string"?{global:l}:{}},publicDir:j(n.publicDir,"Shader publicDir","public"),allowLiveBuilds:n.allowLiveBuilds!==false}}a(b,"parseShaderToolConfig");async function J(n=process.cwd()){let r=c.resolve(n);for(;;){if(await d(c.join(r,S))||await d(c.join(r,"three-blocks.json")))return realpath(r);let e=c.join(r,"package.json");if(await d(e)){let i=await j$1(r,e,a$2.packageJson,"Project package.json"),o;try{o=JSON.parse(i.data.toString("utf8"));}catch{throw new Error(`Project package.json is not valid JSON: ${e}.`)}if(a$1(o)&&[o.dependencies,o.devDependencies,o.peerDependencies,o.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 t=c.dirname(r);if(t===r)throw new Error(`No Three Blocks shader project found from ${JSON.stringify(c.resolve(n))}; add Three.js to package.json or pass --root.`);r=t;}}a(J,"findShaderProjectRoot");async function m(n){let r=await realpath(n),e=c.join(r,S);if(await d(e)){let i=await j$1(r,e,a$2.metadata,"Shader configuration");return b(JSON.parse(i.data.toString("utf8")))}let t=c.join(r,"three-blocks.json");if(await d(t)){let i=b$1(JSON.parse(await readFile(t,"utf8")));return b({schemaVersion:1,backend:"both",scenes:[{key:i.template,url:"/",requiresText:i.features.text}]})}return b(R)}a(m,"loadShaderToolConfig");async function v(n){let r=await realpath(n);for(let o of ["vite.config.ts","vite.config.mts","vite.config.js","vite.config.mjs","vite.config.cts","vite.config.cjs"])if(await d(c.join(r,o)))return {driverKind:"vite",reason:`Detected ${o}.`};let e,t=c.join(r,"package.json");if(await d(t)){let o=await j$1(r,t,a$2.packageJson,"Project package.json"),a=JSON.parse(o.data.toString("utf8"));a$1(a)&&(e=a);}let i=a(o=>[e?.dependencies,e?.devDependencies,e?.peerDependencies,e?.optionalDependencies].some(a=>a$1(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 d(c.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(v,"inferShaderCaptureTarget");async function G(n){let r=await realpath(n),e=c.join(r,S);if(await d(e))return {config:await m(r),file:e,created:false};let t=c.join(r,"three-blocks.json");if(await d(t))return {config:await m(r),file:t,created:false};let i=R,o=b(i),a=await g(e,`${JSON.stringify(i,null,2)}
|
|
3
2
|
`);return {config:a?o:await m(r),file:e,created:a}}a(G,"ensureShaderToolConfig");export{S as a,O as b,U as c,V as d,M as e,z as f,A as g,b as h,J as i,m as j,v as k,G as l};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {b,k as k$1,a as a$4,h as h$1,g as g$1,r,q,n,p,o}from'./chunk-NDIPQLTU.js';import {a as a$3}from'./chunk-TK566QET.js';import {i,j as j$1,d as d$1,e as e$1,g,b as b$1,l,f as f$1,k as k$2,c as c$2}from'./chunk-NJITVI23.js';import {a as a$2,c as c$1}from'./chunk-WNSGAV6N.js';import {j,a as a$1,c,d,k,h,e,i as i$1,f}from'./chunk-ECQE4D2U.js';import {a}from'./chunk-7X4DHW36.js';import {realpath,readdir,readFile,lstat,mkdir,writeFile}from'fs/promises';import Ae from'os';import _ from'path';import {SHADER_ADDRESS_SCHEMA_VERSION,SHADER_RECIPE_SCHEMA_VERSION,SHADER_HYDRATION_SCHEMA_VERSION}from'three-blocks/shaders';import {createRequire}from'module';var Je=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".wgsl",".glsl",".vert",".frag",".json",".css"],Ye=new Set(Je),Ge=/^(?:three-blocks\.shaders\.json|(?:precompile|three-blocks\.shaders)\.config\.(?:cjs|cts|js|mjs|mts|ts))$/u,jr=/(?:^|\/)scene\.(?:cjs|cts|js|jsx|mjs|mts|ts|tsx)$/u,Dr=/\b(?:export\s+)?(?:async\s+)?function\s+createScene\b|\bcreateScene\s*=\s*(?:async\s*)?\(/u,Ar=/\b(?:[A-Za-z_$][\w$]*\.)*(?:shaders|shaderCache|sceneShaders)\s*\.\s*(?:material|pipeline|compute|container)\s*\(/u,_r=/\b(import|export)(?!\s*\()\s*(type\b\s*)?(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']/gu,Fr=/\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,Nr=/\b(?:import|export)(?!\s*\()\s*(?:[^"'();]*?\bfrom\s*)?["']([^"']+)["']|\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu,Lr=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/u,Xe=4096,Vr="./shaders";function pr(e,r){let n=_.relative(e,r).split(_.sep).join("/");if(n.length===0||/[\u0000-\u001f\u007f]/u.test(n))throw new Error("Semantic input has an unsafe relative path.");return n}a(pr,"portableRelativePath");function Ze(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(Ze,"sourceText");function er(e,r){let n="",t="code";for(let i=0;i<e.length;i++){let s=e[i]??"",c=e[i+1]??"";if(t==="code"){if(s==="/"&&c==="/"){n+=" ",t="line-comment",i++;continue}if(s==="/"&&c==="*"){n+=" ",t="block-comment",i++;continue}if(s==="'"||s==='"'||s==="`"){t=s==="'"?"single":s==='"'?"double":"template",n+=r?s:" ";continue}n+=s;continue}if(t==="line-comment"){s===`
|
|
2
|
+
`?(n+=`
|
|
3
|
+
`,t="code"):n+=" ";continue}if(t==="block-comment"){s==="*"&&c==="/"?(n+=" ",t="code",i++):n+=s===`
|
|
4
|
+
`?`
|
|
5
|
+
`:" ";continue}let o=t==="single"?"'":t==="double"?'"':"`";if(s==="\\"&&c.length>0){n+=r?`${s}${c}`:" ",i++;continue}n+=r?s:s===`
|
|
6
|
+
`?`
|
|
7
|
+
`:" ",s===o&&(t="code");}return n}a(er,"lexicalSource");function Hr(e){let r=new Set,n=er(e,true);for(let t of n.matchAll(_r))t[2]===void 0&&t[3]!==void 0&&r.add(t[3]);for(let t of n.matchAll(Fr))t[1]!==void 0&&r.add(t[1]);return [...r].sort()}a(Hr,"importSpecifiers");function Wr(e){let r=new Set;for(let n of er(e,true).matchAll(Nr)){let t=n[1]??n[2];t!==void 0&&r.add(t);}return [...r].sort()}a(Wr,"runtimeSpecifiers");function Sr(e){return (e.split(/[?#]/u,1)[0]??e).replaceAll("\\","/")}a(Sr,"cleanSpecifier");function Kr(e,r,n){let t=Sr(r),i;if(t.startsWith("./")||t.startsWith("../"))i=_.posix.normalize(_.posix.join(_.posix.dirname(e),t));else if(t.startsWith("@/"))i=`src/${t.slice(2)}`;else if(t.startsWith("/src/"))i=t.slice(1);else return;if(i===".three-blocks"||i.startsWith(".three-blocks/"))return;let s=_.posix.extname(i).toLowerCase(),c=new Set([i]);if(s.length===0||!Ye.has(s)){for(let o of Je)c.add(`${i}${o}`);for(let o of Je)c.add(`${i}/index${o}`);}else if([".js",".mjs",".cjs",".jsx"].includes(s)){let o=i.slice(0,-s.length);for(let m of [".ts",".tsx",".mts",".cts"])c.add(`${o}${m}`);}return [...c].find(o=>n.has(o))}a(Kr,"resolveProjectImport");function Ur(e,r){let n=er(r,false);return jr.test(e)||Dr.test(n)||Ar.test(n)}a(Ur,"isShaderRoot");async function Ce(e,r){let n=await realpath(e);if(r!==void 0){let a={},u=0;for(let v of r){let F=await j(n,_.join(n,v),a$1.semanticInput,"Declared shader semantic input");if(u+=F.data.byteLength,u>a$1.semanticTotal)throw new Error("Declared shader semantic inputs exceed the total inspection size limit.");a[v]=c(F.data);}return a}let t=new Map,i=_.join(n,"src");if(await d(i))for(let a of await k(n,i,u=>Ye.has(_.extname(u).toLowerCase()))){let u=await j(n,a,a$1.semanticInput,"Shader semantic input");t.set(pr(n,a),u.data);}for(let a of await readdir(n,{withFileTypes:true})){if(!a.isFile()||!Ge.test(a.name)&&!Ye.has(_.extname(a.name).toLowerCase()))continue;let u=await j(n,_.join(n,a.name),a$1.semanticInput,Ge.test(a.name)?"Shader configuration input":"Shader semantic input");t.set(a.name,u.data);}if(t.size>Xe)throw new Error(`Shader input discovery exceeds the ${Xe}-file limit.`);let s=new Set,c$1=new Map;for(let[a,u]of t){if(!a.includes("/")&&Ge.test(a)&&s.add(a),!a.startsWith("src/"))continue;let v=Ze(u,a);c$1.set(a,v),Ur(a,v)&&s.add(a);}if(s.size===0)throw new Error("No shader registration or scene source root was found.");let o=new Set,m=[...s].sort();for(;m.length>0;){let a=m.shift();if(a===void 0||o.has(a))continue;let u=t.get(a);if(u===void 0)continue;o.add(a);let v=c$1.get(a)??Ze(u,a);for(let F of Hr(v)){let N=Kr(a,F,t);N!==void 0&&!o.has(N)&&m.push(N);}m.sort();}let l=0,f={};for(let a of [...o].sort()){let u=t.get(a);if(u===void 0)throw new Error(`Shader input ${JSON.stringify(a)} disappeared during inspection.`);if(l+=u.byteLength,l>a$1.semanticTotal)throw new Error("Semantic shader inputs exceed the total inspection size limit.");f[a]=c(u);}return f}a(Ce,"snapshotShaderInputs");function Qe(e){if(typeof e=="string")return e;if(a$2(e))return Qe(e.import)??Qe(e.default)}a(Qe,"conditionalImportTarget");async function hr(e,r){let n=e;for(;;){let t=_.join(n,"node_modules",...r.split("/"),"package.json");if(await d(t)){let s=await h(t,a$1.packageJson,`${r} package.json`),c=JSON.parse(s.data.toString("utf8"));if(!a$2(c)||c.name!==r||typeof c.version!="string"||!Lr.test(c.version))throw new Error(`Installed ${r} package metadata is invalid.`);return {root:_.dirname(s.path),manifest:c}}let i=_.dirname(n);if(i===n)break;n=i;}throw new Error(`Cannot verify the installed ${r} package.`)}a(hr,"findInstalledPackage");async function zr(e$1,r){if(!a$2(r.exports))throw new Error("Installed three-blocks package has no public exports map.");let n=Qe(r.exports[Vr]);if(n===void 0||!n.startsWith("./"))throw new Error("Installed three-blocks shader export has no import target.");let t=await realpath(e$1),i=[_.resolve(t,n)],s=new Map,c$1=0;for(;i.length>0;){let m=i.shift();if(m===void 0)break;let l=await h(m,a$1.semanticInput,"Three Blocks shader runtime module");if(!e(t,l.path)||l.path===t)throw new Error("Three Blocks shader runtime closure escapes its package.");let f=pr(t,l.path);if(s.has(f))continue;if(c$1+=l.data.byteLength,c$1>a$1.semanticTotal)throw new Error("Three Blocks shader runtime closure exceeds the inspection limit.");s.set(f,c(l.data));let a=Ze(l.data,f);for(let u of Wr(a)){let v=Sr(u);if(!v.startsWith("./")&&!v.startsWith("../"))continue;let F=_.resolve(_.dirname(l.path),v);if(!e(t,F))throw new Error("Three Blocks shader runtime import escapes its package.");i.push(F);}if(i.sort(),s.size+i.length>Xe)throw new Error("Three Blocks shader runtime closure exceeds the file limit.")}let o=[...s].sort((m,l)=>m[0].localeCompare(l[0])).map(([m,l])=>`${m}\0${l}`).join(`
|
|
8
|
+
`);return c(o)}a(zr,"shaderRuntimeClosure");async function be(e){let[r,n]=await Promise.all([hr(e,"three"),hr(e,"three-blocks")]);return {three:String(r.manifest.version),threeBlocks:String(n.manifest.version),threeBlocksShaderClosure:await zr(n.root,n.manifest)}}a(be,"readInstalledShaderRuntime");var gr=4096,Gr=createRequire(import.meta.url),yr,R=new Proxy({},{get(e,r){return yr??=Gr("typescript"),Reflect.get(yr,r)}});function re(e){let r=e;for(;R.isParenthesizedExpression(r)||R.isAsExpression(r)||R.isSatisfiesExpression(r)||R.isNonNullExpression(r);)r=r.expression;return r}a(re,"unwrap");function Jr(e){if(R.isIdentifier(e)||R.isStringLiteral(e)||R.isNumericLiteral(e))return e.text}a(Jr,"propertyName");function ve(e,r){let n=new Map;for(let t of e.properties){if(!R.isPropertyAssignment(t))throw new Error(`${r} may contain only static property assignments.`);let i=Jr(t.name);if(i===void 0||n.has(i))throw new Error(`${r} contains a computed or duplicate property.`);n.set(i,t.initializer);}return n}a(ve,"properties");function ke(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let n=re(e);if(!R.isObjectLiteralExpression(n))throw new Error(`${r} must be a static object literal.`);return n}a(ke,"objectLiteral");function Ee(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let n=re(e);if(!R.isStringLiteral(n)&&!R.isNoSubstitutionTemplateLiteral(n))throw new Error(`${r} must be a string literal.`);return n.text}a(Ee,"stringLiteral");function je(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let n=re(e);if(!R.isNumericLiteral(n))throw new Error(`${r} must be a numeric literal.`);return Number(n.text)}a(je,"numericLiteral");function wr(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let n=re(e);if(!R.isArrayLiteralExpression(n))throw new Error(`${r} must be a static array literal.`);return n.elements}a(wr,"arrayLiteral");function Yr(e,r){if(e===void 0)throw new Error(`${r} is missing.`);let n=re(e);if(n.kind===R.SyntaxKind.NullKeyword)return null;if(!R.isNumericLiteral(n))throw new Error(`${r} must be null or a numeric literal.`);return Number(n.text)}a(Yr,"numericOrNullLiteral");function Xr(e){return e.parseDiagnostics??[]}a(Xr,"parseDiagnostics");function br(e,r,n,t){let i=R.createSourceFile(r,e,R.ScriptTarget.Latest,true,R.ScriptKind.TS),s=Xr(i);if(s.length>0)throw new Error(`Shader manifest is not valid TypeScript: ${R.flattenDiagnosticMessageText(s[0]?.messageText??"parse error"," ")}`);let c=i.statements.filter(R.isExportAssignment).filter(b=>!b.isExportEquals);if(c.length!==1)throw new Error("Shader manifest must contain exactly one default export.");let o=ve(ke(c[0]?.expression,"Shader manifest default export"),"Shader manifest"),m=o.get("version");if(m===void 0||!R.isNumericLiteral(re(m))||Number(re(m).getText(i))!==3)throw new Error("Shader manifest version must be the numeric literal 3.");if(Ee(o.get("scene"),"Shader manifest scene")!==n)throw new Error(`Shader manifest scene does not match "${n}".`);let l=o.get("runtime"),a$1=(t?.compatibility??(l===void 0?"":Ee(ve(ke(l,"Shader manifest runtime"),"Shader manifest runtime").get("id"),"Shader manifest runtime id"))).startsWith("three-webgl-");if(t){if(Ee(o.get("three"),"Shader manifest Three.js version")!==t.three||Ee(o.get("threeBlocks"),"Shader manifest Three Blocks version")!==t.threeBlocks)throw new Error("Shader manifest runtime versions do not match its receipt.");let b=ve(ke(o.get("runtime"),"Shader manifest runtime"),"Shader manifest runtime");if(Ee(b.get("id"),"Shader manifest runtime id")!==t.compatibility||je(b.get("address"),"Shader manifest address schema")!==t.address||je(b.get("recipe"),"Shader manifest recipe schema")!==t.recipe||je(b.get("hydration"),"Shader manifest hydration schema")!==t.hydration)throw new Error("Shader manifest runtime compatibility schemas do not match its receipt.")}let u=ve(ke(o.get("entries"),"Shader manifest entries"),"Shader manifest entries");if(u.size===0&&!a$1||u.size>gr)throw new Error(`Shader manifest must contain ${a$1?"0":"1"}...${gr} entries.`);let v=wr(o.get("modules"),"Shader manifest modules").map((b,T)=>{let D=re(b);if(!R.isStringLiteral(D)&&!R.isNoSubstitutionTemplateLiteral(D))throw new Error(`Shader manifest module ${T} must be a shader string literal.`);if(D.text.length===0)throw new Error(`Shader manifest module ${T} is empty.`);return D.text}),F=wr(o.get("states"),"Shader manifest states").map((b,T)=>{let D=ve(ke(b,`Shader manifest state ${T}`),`Shader manifest state ${T}`),B=a((K,S)=>{let k=Yr(D.get(K),`Shader manifest state ${T} ${K}`);if(k===null)return false;let E=v[k];if(E===void 0||!a$1&&!E.includes(S))throw new Error(`Shader manifest state ${T} ${K} does not reference a ${S} module.`);return true},"moduleAt"),I=B("vertex","@vertex"),A=B("fragment","@fragment"),W=B("compute","@compute");if(W&&(I||A))throw new Error(`Shader manifest state ${T} mixes render and compute stages.`);if(!W&&!I&&!A)throw new Error(`Shader manifest state ${T} contains no shader stage.`);return {vertex:I,fragment:A,compute:W}}),N={render:0,vertex:0,fragment:0,compute:0};for(let[b,T]of u){if(b.length===0||/[\u0000-\u001f\u007f]/.test(b))throw new Error("Shader manifest contains an invalid entry key.");let D=je(T,`Shader manifest entry "${b}"`),B=F[D];if(B===void 0)throw new Error(`Shader manifest entry "${b}" references an absent state.`);(B.vertex||B.fragment)&&(N.render+=1),B.vertex&&(N.vertex+=1),B.fragment&&(N.fragment+=1),B.compute&&(N.compute+=1);}return N}a(br,"inspectPrecompiledManifest");function Zr(e,r){return e.render===r.render&&e.vertex===r.vertex&&e.fragment===r.fragment&&e.compute===r.compute}a(Zr,"sameCoverage");function Qr(e){let r=e.some(t=>t.state==="invalid")?"invalid":e.some(t=>t.state==="missing")?"missing":e.some(t=>t.state==="stale")?"stale":"fresh",n=e.filter(t=>t.state===r);return {state:r,reason:r==="fresh"?`${e.length} configured shader scene${e.length===1?" is":"s are"} fresh.`:n.map(t=>`${t.scene} (${t.backend}): ${t.reason}`).join("; ")}}a(Qr,"classifyMatrix");function et(e,r,n){let t=e.tool;if(!t)return "Shader receipt has no public tool compatibility metadata.";if((t.compatibilities?.[n]??t.compatibility)!==r)return "Shader receipt targets a different runtime compatibility contract.";if(t.transform!==b)return "Shader receipt uses a different provider transform version.";if(t.address!==SHADER_ADDRESS_SCHEMA_VERSION||t.recipe!==SHADER_RECIPE_SCHEMA_VERSION||t.hydration!==SHADER_HYDRATION_SCHEMA_VERSION)return "Shader receipt uses incompatible address, recipe, or hydration schemas."}a(et,"exactToolCompatibility");function rt(e,r){let n=Object.keys(r).filter(s=>Object.hasOwn(e,s)&&e[s]!==r[s]),t=Object.keys(r).filter(s=>!Object.hasOwn(e,s)),i=Object.keys(e).filter(s=>!Object.hasOwn(r,s));return {...n.length>0?{changedInputs:n}:{},...t.length>0?{addedInputs:t}:{},...i.length>0?{removedInputs:i}:{}}}a(rt,"inputChanges");async function De(e=process.cwd(),r,n){let t=await i(e),i$2=await j$1(t),s=d$1(n??i$2.backend),c$2=i$2.scenes.flatMap(l=>e$1(l,s).map(f=>({scene:l,backend:f,key:g(l.key,f)}))),o=_.join(t,b$1),m=a(()=>({schemaVersion:1,root:t,state:"missing",reason:`${b$1}/meta.json is absent.`,scenes:c$2.map(({scene:l,backend:f})=>({scene:l.key,backend:f,state:"missing",reason:"No committed shader receipt."}))}),"missing");if(!await d(o)||!await d(_.join(o,"meta.json")))return m();try{let l=await i$1(t,o,"Shader artifact directory"),f=await j(l,_.join(l,"meta.json"),a$1.receipt,"Shader receipt"),a=c$1(JSON.parse(f.data.toString("utf8"))),u=await k$1(l,f.data),v=r??await be(t),F=new Set(i$2.scenes.flatMap(S=>e$1(S,["webgpu","webgl"]).map(k=>g(S.key,k)))),b=Object.keys(a.scenes).filter(S=>!F.has(S));if(b.length>0)throw new Error(`Shader receipt contains unconfigured scenes: ${b.join(", ")}.`);let T=a.runtime.three!==v.three,D=a.runtime.threeBlocksShaderClosure!==v.threeBlocksShaderClosure,B=a.tool?.version!==a$3,I=_.join(t,i$2.publicDir??"public"),A=[];for(let{scene:S,backend:k,key:E}of c$2){let p=a.scenes[E];if(!p){A.push({scene:S.key,backend:k,state:"missing",reason:"Scene/backend is absent from the complete receipt matrix."});continue}let x=a$4(v.three,k),M=et(a,x,k);if(M)throw new Error(`${E}: ${M}`);let $=await j(l,_.join(l,p.artifact),a$1.manifest,"Shader manifest");if(c($.data)!==p.artifactHash)throw new Error(`Shader artifact checksum differs for scene "${S.key}".`);if(p.asset!==void 0&&p.assetHash!==void 0){let H=await j(I,_.join(I,p.asset),a$1.manifest,"Static shader manifest");if(c(H.data)!==p.assetHash)throw new Error(`Static shader manifest checksum differs for scene "${S.key}".`)}if(p.bytes!==void 0&&p.bytes!==$.data.byteLength)throw new Error(`Shader artifact byte count differs for scene "${S.key}".`);let V=br($.data.toString("utf8"),$.path,S.key,{three:a.runtime.three,threeBlocks:a.runtime.threeBlocks,compatibility:x,address:SHADER_ADDRESS_SCHEMA_VERSION,recipe:SHADER_RECIPE_SCHEMA_VERSION,hydration:SHADER_HYDRATION_SCHEMA_VERSION});if(!Zr(V,p.coverage))throw new Error(`Shader coverage differs for scene "${S.key}".`);if(k==="webgpu"&&!i$2.allowLiveBuilds&&p.skipped&&p.skipped.render+p.skipped.compute>0)throw new Error(`Scene "${S.key}" contains skipped live builds but allowLiveBuilds is false.`);let h=await Ce(t,S.inputs),w=rt(p.inputs,h),y=(w.changedInputs?.length??0)+(w.addedInputs?.length??0)+(w.removedInputs?.length??0),g=T||D||B||y>0,j$1=u?.scenes[E],P=j$1===void 0||u===void 0?void 0:{...j$1,schemaVersion:u.schemaVersion,measuredAt:u.measuredAt,source:u.source,...u.source==="committed-capture"?{adapter:u.adapter,platform:u.platform}:{}};A.push({scene:S.key,backend:k,state:g?"stale":"fresh",reason:T?"Installed Three.js version differs from the receipt.":D?"Installed three-blocks/shaders runtime closure differs from the receipt.":B?`Receipt was generated by @three-blocks/devtools ${a.tool?.version??"unknown"}.`:y>0?`${y} semantic shader input${y===1?"":"s"} changed.`:"Manifest, runtime, schemas, transform, and semantic inputs match.",coverage:V,...!g&&P!==void 0&&P.builds===V.render+V.compute?{timing:P}:{},...w});}let W=Qr(A),K=W.state==="fresh"&&u!==void 0&&A.every(S=>S.timing!==void 0)?u:void 0;return {schemaVersion:1,root:t,...W,scenes:A,runtime:v,receipt:a,...K===void 0?{}:{timing:K}}}catch(l){let f=l instanceof Error?l.message:String(l);return {schemaVersion:1,root:t,state:"invalid",reason:f,scenes:c$2.map(({scene:a,backend:u})=>({scene:a.key,backend:u,state:"invalid",reason:f}))}}}a(De,"inspectShaderMatrix");var Tr=".three-blocks/shaders/pending-capture";function it(e){return (e instanceof Error?`${e.name}: ${e.message}`:String(e)).includes("ShaderHydrationError:")}a(it,"isShaderHydrationFailure");async function st(e,r,n){if(r.length===0)return;let t=_.join(e,b$1,"meta.json"),i=await readFile(t);if(c(i)!==c(n))throw new Error("Shader receipt changed before failed scenes could be marked for recapture.");let s=c$1(JSON.parse(i.toString("utf8"))),c$2=c(n),o=new Set(r),m=c$1({...s,scenes:Object.fromEntries(Object.entries(s.scenes).map(([l,f])=>[l,o.has(l)?{...f,inputs:{...f.inputs,[Tr]:c$2}}:f]))});await f(t,`${h$1(m)}
|
|
9
|
+
`);}a(st,"markShaderScenesForRecapture");function at(e,r){return h$1(e)===h$1(r)}a(at,"equalSnapshot");async function Ht(e={}){let r$1=e.root?await realpath(e.root):await i(e.start),n$1=e.config===void 0?await l(r$1):void 0,t=e.config??n$1?.config??await j$1(r$1),i$1=e.runtime??await be(r$1),s=d$1(e.backend??t.backend),c$1=d$1(t.backend),o=[...new Set([...c$1,...s])],m=[...s].reverse(),l$1=[...f$1(t.scenes,m)],f,a$1={},u;if(e.ifStale){let h=await De(r$1,i$1,e.backend??t.backend);if(h.state==="fresh"&&h.scenes.every(w=>w.timing!==void 0))return {schemaVersion:1,root:r$1,skipped:true,reason:h.reason,scenes:[]};if(h.state!=="invalid"&&h.receipt!==void 0){let w=h.state==="fresh";l$1=l$1.filter(({scene:y,backend:g})=>{let j=h.scenes.find(P=>P.scene===y.key&&P.backend===g);return j?.state!=="fresh"||w&&j.timing===void 0}),f=h.receipt;for(let y of h.scenes){if(y.state!=="fresh"||y.timing===void 0)continue;let{builds:g$1,liveBuildMs:j,precompiledBuildMs:P,avoidedBuildMs:H,runs:U,spreadMs:z}=y.timing;a$1[g(y.scene,y.backend)]={builds:g$1,liveBuildMs:j,precompiledBuildMs:P,avoidedBuildMs:H,runs:U,spreadMs:z},y.timing.source==="committed-capture"&&y.timing.adapter!==void 0&&y.timing.platform!==void 0&&(u={adapter:y.timing.adapter,platform:y.timing.platform});}}}let v=performance.now(),F=f!==void 0&&(f.runtime.three!==i$1.three||f.runtime.threeBlocksShaderClosure!==i$1.threeBlocksShaderClosure||f.tool?.version!==a$3)?c(h$1({runtime:f.runtime,tool:f.tool})):void 0,N=a(async()=>new Map(await Promise.all(t.scenes.map(async h=>[h.key,await Ce(r$1,h.inputs)]))),"snapshotInputs"),b=await N(),T=a(async()=>{let h=await N();for(let w of t.scenes){let y=b.get(w.key),g=h.get(w.key);if(y===void 0||g===void 0||!at(y,g))throw new Error(`Semantic shader inputs changed during capture for scene "${w.key}"; the current scene was not committed.`)}},"assertInputsUnchanged"),D=e.driver===void 0,B=e.driver===void 0&&e.driverKind===void 0&&e.serve===void 0&&e.url===void 0?await k$2(r$1):void 0,I=e.serve??B?.serve,A=e.driverKind??B?.driverKind??(I===void 0?"vite":"static");if(e.url!==void 0&&(e.serve!==void 0||e.driverKind!==void 0))throw new Error("--url cannot be combined with --driver or --serve.");if(A==="vite"&&I!==void 0)throw new Error("--serve requires the static shader driver.");if(A==="static"&&I===void 0&&e.driver===void 0)throw new Error("The static shader driver requires --serve <built-directory>.");let W=e.driver===void 0?await import('./shader-browser-6ICBHK3S.js'):void 0,K=a(()=>W.createShaderDriver({root:r$1,runtime:i$1,...e.url===void 0?{}:{url:e.url},...I===void 0?{}:{serve:I},...e.headed===void 0?{}:{headed:e.headed}}),"createDriver"),S=new Map,k=a(h=>{if(e.driver!==void 0)return e.driver;let w=S.get(h);return w===void 0&&(w=K(),S.set(h,w)),w},"driverFor"),E=new Map,p=[],x=f!==void 0&&t.scenes.every(h=>e$1(h,o).every(w=>f?.scenes[g(h.key,w)]!==void 0)),M=f,$,V=e.attempts??2;if(!Number.isSafeInteger(V)||V<1||V>5)throw new Error("Shader capture attempts must be an integer in 1...5.");try{for(let[g$2,j]of l$1.entries()){let{scene:P,backend:H,key:U}=j,z=k(H);e.onSceneStart?.(U,g$2,l$1.length);let L,ae,oe=0;for(;oe<V;oe++)try{L=g$1(await z.capture(P,t,H),{scene:P.key,backend:H,runtime:i$1});let te=H==="webgl"&&L.skipped.every(J=>J.reason.startsWith("WebGL shader precompilation does not support "));if(L.skipped.length>0&&!t.allowLiveBuilds&&!te)throw new Error(`Scene "${P.key}" contains ${L.skipped.length} unregistered live shader build${L.skipped.length===1?"":"s"} while allowLiveBuilds is false.`);break}catch(te){ae=te,L=void 0,oe+1<V&&e.onSceneRetry?.(P.key,oe+2,V,t.timeoutMs,te);}if(!L)throw new Error(`Shader capture "${P.key}" failed after ${V} attempts: ${ae instanceof Error?ae.message:String(ae)}`);if(E.set(U,L),p.push({scene:P.key,backend:H,attempts:oe+1,coverage:L.coverage,skipped:L.skipped.length,startupBuilds:L.stats.registeredBuilds,startupBuildMs:L.stats.buildMs,...L.timing===void 0?{}:{timing:L.timing}}),x&&M!==void 0){await T();let te=new Map(t.scenes.map(J=>{let Fe=e$1(J,o),ge=J.key===P.key?b.get(J.key):Fe.map(ne=>M?.scenes[g(J.key,ne)]?.inputs).find(ne=>ne!==void 0);if(ge===void 0)throw new Error(`Shader checkpoint is missing scene "${J.key}".`);return F!==void 0&&!Fe.every(ne=>E.has(g(J.key,ne)))&&(ge={...ge,[Tr]:F}),[J.key,ge]}));$=await r({root:r$1,scenes:t.scenes,backends:o,captures:new Map([[U,L]]),runtime:i$1,inputs:te,previousReceipt:M,publicDirectory:t.publicDir??"public"}),M=$.receipt;}}await T(),$=await r({root:r$1,scenes:t.scenes,backends:o,captures:E,runtime:i$1,inputs:b,...f===void 0?{}:{previousReceipt:f},publicDirectory:t.publicDir??"public"});let h={...a$1};for(let g$1 of p)h[g(g$1.scene,g$1.backend)]={builds:g$1.coverage.render+g$1.coverage.compute,setupMeasured:!1,liveBuildMs:g$1.startupBuildMs,precompiledBuildMs:0,avoidedBuildMs:g$1.startupBuildMs,runs:1,spreadMs:0};if(e.commitTiming===!0){let g=u??{adapter:E.values().next().value?.provenance?.adapter??"WebGPU adapter",platform:`${Ae.platform()}/${Ae.arch()}`},j=S.values().next().value??e.driver;await q(r$1,h,await(j?.timingEnvironment?.()??g));}else await n(r$1,h);let w=await readFile(_.join($.directory,"meta.json")),y=await k$1($.directory,w);return {schemaVersion:1,root:r$1,skipped:!1,reason:`Wrote ${p.length} shader scene${p.length===1?"":"s"}.`,durationMs:performance.now()-v,scenes:p,measurement:{beforeBuilds:p.reduce((g,j)=>g+j.startupBuilds,0),afterBuilds:0,firstFrameDeltaMs:-p.reduce((g,j)=>g+j.startupBuildMs,0),source:"capture-build-phase"},...n$1===void 0?{}:{configuration:{created:n$1.created,file:n$1.file}},written:$,...y===void 0?{}:{timing:y}}}finally{D&&await Promise.all([...S.values()].map(h=>h.close()));}}a(Ht,"captureShaders");function ot(e){return ["workerReady","assetsReady",...e.requiresText?["textReady"]:[],"compileEnd","firstFrame"]}a(ot,"requiredReadiness");function xr(e){if(e.length===0)throw new Error("Cannot take the median of an empty shader timing capture.");let r=[...e].sort((s,c)=>s-c),n=Math.floor(r.length/2),t=r[n];if(t===void 0)throw new Error("Shader timing median is unavailable.");if(r.length%2===1)return t;let i=r[n-1];if(i===void 0)throw new Error("Shader timing median pair is unavailable.");return (i+t)/2}a(xr,"median");function rr(e,r,n,t){if(e.scene!==r.key||e.mode!==n)throw new Error(`Browser observation identity differs for scene "${r.key}".`);if(e.compatibility!==t||e.transform!==b)throw new Error(`Browser observation compatibility differs for scene "${r.key}".`);let i=ot(r).filter(s=>e.readiness[s]!==true);if(i.length>0)throw new Error(`Scene "${r.key}" ${n} observation is missing readiness bits: ${i.join(", ")}.`);if(e.errors.length>0)throw new Error(`Scene "${r.key}" ${n} browser errors:
|
|
10
|
+
- ${e.errors.join(`
|
|
11
|
+
- `)}
|
|
12
|
+
${n} demands: ${tr(e.demands)}`)}a(rr,"assertObservation");async function dt(e,r,n){if(n===void 0)return new Set;try{let t=JSON.parse(await readFile(_.join(e,r.publicDir??"public",n),"utf8"));return new Set(Object.keys(t.fallbacks??{}))}catch{return new Set}}a(dt,"manifestFallbackKeys");function ct(e,r,n,t,i,s){if(r.render>0&&n.stats.registeredRenderBuilds===0)throw new Error(`Scene "${e.key}" live baseline exercised no registered render pipeline.`);if(r.compute>0&&n.stats.registeredComputeBuilds===0)throw new Error(`Scene "${e.key}" live baseline exercised no registered compute kernel.`);Br(e,r,t,i,s,n.demands);}a(ct,"assertZeroBuild");function tr(e){return !e||e.length===0?"none recorded":e.map(r=>`${String(r.key??"unregistered")}[${String(r.event)}${r.hit===false?":miss":""}|${String(r.target)}${r.object===void 0?"":`@${String(r.object)}`}]`).join(" ").slice(0,4e3)}a(tr,"describeDemands");function Br(e,r,n,t,i,s){let c=a(()=>`
|
|
13
|
+
Precompiled demands: ${tr(n.demands)}`+(s===void 0?"":`
|
|
14
|
+
Live demands: ${tr(s)}`),"demandEvidence");if(n.stats.registeredRenderBuilds+n.stats.registeredComputeBuilds>t){let o=n.stats.missedKeys??[];throw new Error(`Scene "${e.key}" injected path performed ${n.stats.registeredRenderBuilds} render and ${n.stats.registeredComputeBuilds} compute registered live builds; capture permits ${t}.`+(o.length>0?` Missed keys: ${o.join(", ")}.`:"")+c())}if(n.stats.buildCalls>t)throw new Error(`Scene "${e.key}" injected path performed ${n.stats.buildCalls} total live NodeBuilder build${n.stats.buildCalls===1?"":"s"}; capture permits ${t} skipped live build${t===1?"":"s"}.`);if(r.render>0&&n.stats.injectedRender===0)throw new Error(`Scene "${e.key}" injected no render entries.`);if(r.compute>0&&n.stats.injectedCompute===0)throw new Error(`Scene "${e.key}" injected no compute entries.`);if(n.stats.missed!==0||n.stats.missedRender!==0||n.stats.missedCompute!==0){let o=n.stats.missedKeys??[],m=o.filter(f=>!i.has(f)),l=o.length>0&&n.stats.missed<=t;if(m.length>0||!l)throw new Error(`Scene "${e.key}" injected path reported shader manifest misses.`+(o.length>0?` Missed keys: ${o.join(", ")}.`:"")+(m.length>0&&m.length!==o.length?` Unexpected: ${m.join(", ")}.`:"")+c())}}a(Br,"assertPrecompiledZeroBuild");async function lt(e,r,n,t,i){let s=_.join(e,c$2);if(await d(s)){let o=await lstat(s);if(o.isSymbolicLink()||!o.isDirectory())throw new Error("Shader parity artifact directory is not a real directory.")}else await mkdir(s,{recursive:true});let c=[`${r}.live.png`,`${r}.precompiled.png`,`${r}.diff.png`];return await Promise.all([n,t,i].map(async(o,m)=>{let l=c[m];if(l===void 0)throw new Error("Parity artifact mapping failed.");let f=_.join(s,l);if(await d(f)){let a=await lstat(f);if(a.isSymbolicLink()||!a.isFile())throw new Error(`Shader parity target is not a regular file: ${l}.`)}await writeFile(f,o,{mode:384});})),c.map(o=>`${c$2}/${o}`)}a(lt,"writeParityFailure");async function Wt(e={}){let r=e.root?await realpath(e.root):await i(e.start),n$1=e.runtime??await be(r),t=e.config??await j$1(r),i$1=d$1(e.backend??t.backend),s=f$1(t.scenes,[...i$1].reverse()),c=await De(r,n$1,e.backend??t.backend);if(c.state!=="fresh")throw new Error(`Shader no-GPU validation is ${c.state}: ${c.reason}`);if(e.skipBrowser)return {schemaVersion:1,root:r,noGpu:c,browser:"skipped",scenes:[]};if(e.parityOnly===true&&e.commitTiming===true)throw new Error("Parity-only shader verification cannot commit timing.");let o$1=e.runs??5;if(!Number.isSafeInteger(o$1)||o$1<1||o$1>100)throw new Error("Shader timing runs must be an integer in 1...100.");let m=await readFile(_.join(r,b$1,"meta.json")),l=c$1(JSON.parse(m.toString("utf8")));if(c.receipt===void 0||h$1(l)!==h$1(c.receipt))throw new Error("Shader receipt changed after no-GPU validation; restart browser parity verification.");let f=e.driver===void 0,a$1=e.driver===void 0&&e.driverKind===void 0&&e.serve===void 0&&e.url===void 0?await k$2(r):void 0,u=e.serve??a$1?.serve,v=e.driverKind??a$1?.driverKind??(u===void 0?"vite":"static");if(e.url!==void 0&&(e.serve!==void 0||e.driverKind!==void 0))throw new Error("--url cannot be combined with --driver or --serve.");if(v==="vite"&&u!==void 0)throw new Error("--serve requires the static shader driver.");if(v==="static"&&u===void 0&&e.driver===void 0)throw new Error("The static shader driver requires --serve <built-directory>.");let F=e.driver===void 0?await import('./shader-browser-6ICBHK3S.js'):void 0,{compareShaderScreenshots:N}=await import('./shader-parity-7DEPQEDI.js'),b=a(()=>F.createShaderDriver({root:r,runtime:n$1,...e.url===void 0?{}:{url:e.url},...u===void 0?{}:{serve:u},...e.headed===void 0?{}:{headed:e.headed}}),"createDriver"),T=new Map,D=new Map,B=a((k,E)=>{if(e.driver!==void 0)return e.driver;let p=k.get(E);return p===void 0&&(p=b(),k.set(E,p)),p},"driverFor");await p(r,s.map(k=>k.key),m);let I=[],A=a(()=>I.some(k=>k.live.execution==="node")?{browser:"skipped",native:"passed"}:{browser:"passed"},"executionResult"),W={},K=[],S=new Set;try{for(let[E,p]of s.entries()){let{scene:x,backend:M,key:$}=p;e.onSceneStart?.($,E,s.length);let V=c.scenes.find(O=>O.scene===x.key&&O.backend===M);if(!V?.coverage)throw new Error(`Fresh receipt has no coverage for "${$}".`);let h=V.coverage;if(h.render+h.compute===0)continue;let w=a$4(n$1.three,M),y=c.receipt?.scenes[$]?.skipped,g=(y?.render??0)+(y?.compute??0),j=await dt(r,t,c.receipt?.scenes[$]?.asset),P=a(async O=>{let de=B(T,M),Re=B(D,M),Q=O?"live":"precompiled",xe=O?"precompiled":"live",$e=O?de:Re,Te=O?Re:de,ie=await $e.observe(x,Q,t,void 0,M),C=await Te.observe(x,xe,t,ie.frame,M),ce=ie.mode==="live"?ie:C,le=ie.mode==="precompiled"?ie:C;rr(ce,x,"live",w),rr(le,x,"precompiled",w),ct(x,h,ce,le,g,j);let nr=a(async(Pr,ir,sr)=>{let Y=N(ir,sr,t.parity.channelTolerance,x.maxDiffRatio??t.parity.maxDiffRatio);if(Y.matches)return Y;let Ir=await lt(r,$,ir,sr,Y.diff),Or=Y.nonBlack?`${Y.differentPixels}/${Y.totalPixels} pixels differ (${(Y.diffRatio*100).toFixed(3)}%).`:`rendered output is black (live=${Y.baselineLuminance.toFixed(4)}, precompiled=${Y.precompiledLuminance.toFixed(4)}).`;throw new Error(`Shader ${Pr} parity failed for scene "${x.key}" at completed frames live=${ce.frame}, precompiled=${le.frame}: ${Or} Artifacts: ${Ir.join(", ")}`)},"compare");await nr("first frame",ce.firstFrameScreenshot,le.firstFrameScreenshot);let Mr=await nr("settled",ce.screenshot,le.screenshot);return {live:ce,precompiled:le,parity:Mr}},"observePair"),H,U,z;if(e.parityOnly===!0)try{H=await P(!0);}catch(O){it(O)&&S.add($),K.push({scene:$,error:O}),e.onSceneError?.($,O);continue}else {await P(!0);let O=[];for(let C=0;C<o$1;C++)O.push(await P(C%2===0));let de=O[O.length-1];if(de===void 0)throw new Error(`Shader timing produced no runs for scene "${x.key}".`);if(H=de,U=await B(D,M).observePublished(x,t,M),rr(U,x,"precompiled",w),Br(x,h,U,g,j),z=x.runtimeMotion?N(U.beforeScreenshot,U.screenshot,t.parity.channelTolerance,1):void 0,z&&z.diffRatio<1e-4)throw new Error(`Published scene "${x.key}" stopped animating during its normal 120-frame soak (changed ${z.differentPixels}/${z.totalPixels} canvas pixels).`);let Q=a(C=>C.stats.buildMs+(C.stats.precompiledSetupMs??0)+(C.stats.hydrationMs??0),"observedNodeBuilderMs"),xe=xr(O.map(C=>Q(C.live))),$e=xr(O.map(C=>Q(C.precompiled))),Te=Math.max(0,xe-$e),ie=O.map(C=>Math.max(0,Q(C.live)-Q(C.precompiled)));W[$]={builds:h.render+h.compute,setupMeasured:!0,liveBuildMs:xe,precompiledBuildMs:$e,avoidedBuildMs:Te,runs:o$1,spreadMs:Math.max(...ie.map(C=>Math.abs(C-Te)))};}let{diff:L,...ae}=H.parity,{firstFrameScreenshot:oe,screenshot:te,...J}=H.live,{firstFrameScreenshot:Fe,screenshot:ge,...ne}=H.precompiled,Ne;if(U!==void 0){let{beforeScreenshot:O,firstFrameScreenshot:de,screenshot:Re,...Q}=U;Ne=Q;}I.push({scene:x.key,backend:M,coverage:h,live:J,precompiled:ne,...Ne===void 0?{}:{published:Ne},parity:ae,...z===void 0?{}:{runtimeMotion:{differentPixels:z.differentPixels,totalPixels:z.totalPixels,diffRatio:z.diffRatio}}}),await o(r,[$],m);}if(e.parityOnly===!0){if(await st(r,[...S],m),K.length>0)throw new Error(`Shader parity failed for ${K.length}/${s.length} scene/backend pair(s):
|
|
15
|
+
`+K.map(E=>{let p=E.error instanceof Error?E.error.message:String(E.error);return ` - ${E.scene}: ${p}`}).join(`
|
|
16
|
+
`));return {schemaVersion:1,root:r,noGpu:c,...A(),scenes:I}}if(Object.keys(W).length===0)return {schemaVersion:1,root:r,noGpu:c,...A(),scenes:I};if(e.commitTiming===!0){let E={adapter:i$1.length===1&&i$1[0]==="webgl"?"WebGL adapter":"WebGPU adapter",platform:`${Ae.platform()}/${Ae.arch()}`},x=await((T.values().next().value??e.driver)?.timingEnvironment?.()??E),M=await q(r,W,x);return {schemaVersion:1,root:r,noGpu:c,...A(),scenes:I,timing:M.local,committedTiming:M.committed}}let k=await n(r,W);return {schemaVersion:1,root:r,noGpu:c,...A(),scenes:I,timing:k}}finally{f&&await Promise.all([...T.values(),...D.values()].map(k=>k.close()));}}a(Wt,"testShaders");export{br as a,Ce as b,be as c,De as d,Ht as e,Wt as f};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {d as d$1,e}from'./chunk-4SVF5BRM.js';import {a}from'./chunk-7X4DHW36.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$1,o,r={}){if(!d$1(o))return null;let n=v(r);return e(e$1,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$1={}){let o=e$1.root??process.cwd(),r=b(o),n={version:e$1.threeVersion??r.version,capture:e$1.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:e(i,n.version,{instrumentCapture:n.capture}).code,loader:"js"}});}}}a($,"createEsbuildShaderPlugin");function H(e$1={}){let o=v(e$1);return {name:"three-blocks-shader-provider",enforce:"pre",transform(r,n){return d$1(n)?{code:e(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};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import {h}from'./chunk-NDIPQLTU.js';import {b,a as a$1,c,h as h$1,d,f}from'./chunk-ECQE4D2U.js';import {a}from'./chunk-7X4DHW36.js';import {readFile,lstat,readdir,realpath,mkdir}from'fs/promises';import i from'path';import {read,KHR_DF_PRIMARIES_BT709,write}from'ktx-parse';var U=2,ie="ktx2-encoder@0.6.0;@napi-rs/canvas@1.0.9",ae=i.join(".three-blocks","assets"),ue=i.join(ae,"meta.json"),we=i.join(ae,"cache"),Te=256*1024*1024,Ae=64*1024*1024,ee=115e5,te=64,Ee=163,ve=166,Re=167,Se=1000066e3,de=1,le=2,$e=/baseColor|emissive|diffuse|sheenColor|specularColor/u,Me=/normal/iu,Oe=/(?:^|[_\-.])(?:normal|nrm|nor)(?:[_\-.]|map|$)/iu,Ie=/(?:rough|metal|orm\b|occlusion|ambient|[_\-.]ao(?:[_\-.]|$)|height|disp|thick|mask)/iu;function _e(t){return t.some(e=>Me.test(e))?"normal":t.some(e=>$e.test(e))||t.length===0?"color":"data"}a(_e,"presetForTextureSlots");function De(t){let e=i.basename(t);return Oe.test(e)?"normal":Ie.test(e)?"data":"color"}a(De,"presetForImageName");function V(t){let e=i.extname(t).toLowerCase();return e===".glb"?"glb":e===".png"||e===".jpg"||e===".jpeg"||e===".webp"?"image":e===".hdr"?"hdr":null}a(V,"assetKindFor");function P(t,e){let n=i.relative(t,e);return (n!==""&&!n.startsWith("..")&&!i.isAbsolute(n)?n:e).split(i.sep).join("/")}a(P,"portable");var X;function ce(){return X??=Promise.all([import('ktx2-encoder'),import('@napi-rs/canvas')]).then(([t,e])=>({encodeToKTX2:t.encodeToKTX2,canvas:e})),X}a(ce,"loadEncoderTools");function me(t,e){let n=e.quality==="high";return t==="hdr"?{mode:"uastc-hdr",options:{isHDR:true,imageType:"hdr",isUASTC:true,isYFlip:true,generateMipmap:true,needSupercompression:true,hdrQualityLevel:n?2:1}}:t==="color"&&!n?{mode:"etc1s",options:{isUASTC:false,qualityLevel:160,compressionLevel:2,isPerceptual:true,isSRGB:true,generateMipmap:true}}:{mode:"uastc",options:{isUASTC:true,uastcLDRQualityLevel:n?2:1,enableRDO:true,rdoQualityLevel:1,generateMipmap:true,needSupercompression:true,isPerceptual:t==="color",isSRGB:t==="color",isNormalMap:t==="normal"}}}a(me,"encoderOptionsFor");function Le(t,e){let n=read(t),s=n.dataFormatDescriptor[0];if(s===void 0)return t;let r=e==="color"?le:de;return s.transferFunction===r&&(e!=="color"||s.colorPrimaries===KHR_DF_PRIMARIES_BT709)?t:(s.transferFunction=r,e==="color"&&(s.colorPrimaries=KHR_DF_PRIMARIES_BT709),write(n,{keepWriter:true}))}a(Le,"normalizeDfdTransfer");function he(t,e,n,s){let r=read(t),o=r.dataFormatDescriptor[0];if(o===void 0)throw new Error(`${s} produced a KTX2 container without a data format descriptor.`);if(e==="hdr"){if(r.vkFormat!==Se||o.colorModel!==Re)throw new Error(`${s} is not a UASTC HDR container (vkFormat ${r.vkFormat}, color model ${o.colorModel}).`)}else {let c=n==="etc1s"?Ee:ve;if(r.vkFormat!==0||o.colorModel!==c)throw new Error(`${s} is not a ${n} container (vkFormat ${r.vkFormat}, color model ${o.colorModel}).`)}let a=e==="color",u=o.transferFunction;if(a&&u!==le)throw new Error(`${s} must carry the sRGB transfer function; found ${u}.`);if(!a&&u!==de)throw new Error(`${s} must carry the linear transfer function; found ${u}.`);if(Math.max(r.pixelWidth,r.pixelHeight)>=8&&r.levels.length<2)throw new Error(`${s} is missing its mip chain.`);return {width:r.pixelWidth,height:r.pixelHeight,levels:r.levels.length}}a(he,"verifyKtx2");async function ye(t,e,n,s){let{encodeToKTX2:r,canvas:o}=await ce(),a$1=n.maxDimension,{mode:u,options:c}=me(e,n),d=performance.now(),m=false,p=Le(await r(t,{...c,imageDecoder:a(async M=>{let A=await o.loadImage(M),E=A.width,O=A.height;if(E<1||O<1)throw new Error(`${s} has no decodable dimensions.`);let x=Math.min(1,a$1/Math.max(E,O));E*x*O*x>ee&&(x=Math.sqrt(ee/(E*O)));let R=x<1,f=R?Math.max(4,Math.floor(E*x/4)*4):E,y=R?Math.max(4,Math.floor(O*x/4)*4):O,S=o.createCanvas(f,y).getContext("2d");S.imageSmoothingEnabled=true,S.imageSmoothingQuality="high",S.drawImage(A,0,0,f,y);let{data:h}=S.getImageData(0,0,f,y);for(let $=3;$<h.byteLength;$+=4)if(h[$]!==255){m=true;break}return {data:new Uint8Array(h.buffer,h.byteOffset,h.byteLength),width:f,height:y}},"decode")}),e),{width:g,height:v,levels:b}=he(p,e,u,s);return {bytes:p,width:g,height:v,levels:b,hasAlpha:m,mode:u,durationMs:performance.now()-d}}a(ye,"encodeLdrTexture");function Be(t,e){let n=new TextDecoder("latin1").decode(t.subarray(0,Math.min(t.byteLength,4096))),s=/-Y\s+(\d+)\s+\+X\s+(\d+)/u.exec(n);if(s?.[1]===void 0||s[2]===void 0)throw new Error(`${e} is not a supported Radiance .hdr file (missing "-Y <h> +X <w>" resolution).`);return {width:Number(s[2]),height:Number(s[1])}}a(Be,"hdrDimensions");async function ke(t,e,n){let s=Be(t,n);if(Math.max(s.width,s.height)>e.hdrMaxDimension)throw new Error(`${n} is ${s.width}x${s.height}, above the ${e.hdrMaxDimension}px HDR cap; resize the source (HDR resize is not supported yet).`);let{encodeToKTX2:r}=await ce(),{mode:o,options:a}=me("hdr",e),u=performance.now(),c=await r(t,a),{width:d,height:m,levels:T}=he(c,"hdr",o,n);return {bytes:c,width:d,height:m,levels:T,hasAlpha:false,mode:o,durationMs:performance.now()-u}}a(ke,"encodeHdrTexture");function pe(t,e,n,s){let r=0,o=t,a=e;for(let u=0;u<n;u+=1)r+=o*a*s,o=Math.max(1,o>>1),a=Math.max(1,a>>1);return r}a(pe,"uncompressedMipBytes");function q(t,e,n,s){let r=0,o=t,a=e;for(let u=0;u<n;u+=1)r+=Math.ceil(o/4)*Math.ceil(a/4)*s,o=Math.max(1,o>>1),a=Math.max(1,a>>1);return r}a(q,"compressedMipBytes");function fe(t,e){return t==="etc1s"&&!e?8:16}a(fe,"transcodedBlockBytes");async function Fe(t,e,n){let s=n.preset??De(e),r=`Image ${JSON.stringify(i.basename(e))}`,o=await ye(t,s,n,r),a=[`preset ${s} (${n.preset===null?"from filename":"explicit"})`];return s!=="color"&&a.push("linear DFD: consumers must treat this texture as non-color data"),a.push("compressed textures never flip: sample with glTF-style (flipY=false) UVs"),{bytes:o.bytes,metadata:{vramBytesIn:pe(o.width,o.height,o.levels,4),vramBytesOut:q(o.width,o.height,o.levels,fe(o.mode,o.hasAlpha)),textures:[{name:i.basename(e),slots:[],preset:s,mode:o.mode,width:o.width,height:o.height,bytesIn:t.byteLength,bytesOut:o.bytes.byteLength,durationMs:Math.round(o.durationMs)}],notes:a}}}a(Fe,"buildImageAsset");async function Pe(t,e,n){let s=`Environment ${JSON.stringify(i.basename(e))}`,r=await ke(t,n,s);return {bytes:r.bytes,metadata:{vramBytesIn:r.width*r.height*8,vramBytesOut:q(r.width,r.height,r.levels,16),textures:[{name:i.basename(e),slots:["equirectangular"],preset:"hdr",mode:r.mode,width:r.width,height:r.height,bytesIn:t.byteLength,bytesOut:r.bytes.byteLength,durationMs:Math.round(r.durationMs)}],notes:["BC6H on BC-capable devices; transcodes to RGBA16F elsewhere"]}}}a(Pe,"buildHdrAsset");async function Ne(t,e,n,s){let[{Logger:r,NodeIO:o},{ALL_EXTENSIONS:a,KHRTextureBasisu:u},{dedup:c,listTextureSlots:d,meshopt:m,prune:T,weld:p},{MeshoptDecoder:g,MeshoptEncoder:v}]=await Promise.all([import('@gltf-transform/core'),import('@gltf-transform/extensions'),import('./asset-transforms-ZVZ4RD4L.js'),import('meshoptimizer')]);await v.ready,await g.ready;let b=new o().registerExtensions(a).registerDependencies({"meshopt.encoder":v,"meshopt.decoder":g}),M=`GLB ${JSON.stringify(i.basename(e))}`;b.setLogger(new r(r.Verbosity.SILENT));let A=await b.readBinary(t);A.setLogger(new r(r.Verbosity.SILENT));let E=A.getRoot().listTextures();if(E.length>0&&E.every(h=>h.getMimeType()==="image/ktx2")&&A.getRoot().listExtensionsUsed().some(h=>h.extensionName==="EXT_meshopt_compression"))return {bytes:t,metadata:{vramBytesIn:0,vramBytesOut:0,textures:[],notes:["already optimized (KTX2 + meshopt); copied unchanged"]}};s?.("optimizing geometry"),await A.transform(c(),T({keepAttributes:true,keepExtras:true,keepSolidTextures:true}),p(),m({encoder:v,level:"medium"}));let x=[],R=[],f=0,y=0,_=0;for(let h of E){let $=h.getName()||h.getURI()||`texture-${x.length}`,D=h.getImage(),k=h.getMimeType();if(D===null||D.byteLength===0)continue;if(k==="image/ktx2"){R.push(`${$}: already KTX2, kept`);continue}if(!/^image\/(?:png|jpeg|webp)$/u.test(k)){R.push(`${$}: unsupported ${k}, kept`);continue}let z=h.getSize();if(z!==null&&Math.max(z[0],z[1])<te){R.push(`${$}: below ${te}px, kept`);continue}let W=d(h),j=_e(W);s?.(`encoding ${$} (${j})`);let w=await ye(new Uint8Array(D),j,n,`${M} texture ${JSON.stringify($)}`);h.setImage(w.bytes).setMimeType("image/ktx2");let G=h.getURI();G!==""&&h.setURI(G.replace(/\.(?:png|jpe?g|webp)$/iu,".ktx2")),_+=1,f+=pe(w.width,w.height,w.levels,4),y+=q(w.width,w.height,w.levels,fe(w.mode,w.hasAlpha)),x.push({name:$,slots:W,preset:j,mode:w.mode,width:w.width,height:w.height,bytesIn:D.byteLength,bytesOut:w.bytes.byteLength,durationMs:Math.round(w.durationMs)});}_>0&&A.createExtension(u).setRequired(true);let S=await b.writeBinary(A);return await b.readBinary(S),_>0&&R.push("requires a KTX2-wired loader (three-blocks/assets or GLTFLoader.setKTX2Loader)"),{bytes:S,metadata:{vramBytesIn:f,vramBytesOut:y,textures:x,notes:R}}}a(Ne,"buildGlbAsset");function Ce(t,e,n){let s=i.basename(t,i.extname(t));if(e==="glb"){let r=n===null?i.join(i.dirname(t),`${s}.tb.glb`):i.join(n,`${s}.glb`);if(i.resolve(r)===i.resolve(t))throw new Error(`Output would overwrite the input: ${JSON.stringify(t)}. Pass a different output directory.`);return r}return i.join(n??i.dirname(t),`${s}.ktx2`)}a(Ce,"outputPathFor");async function ge(t){let e={schemaVersion:U,tool:{name:"three-blocks-devtools",assetOptimizeVersion:U,encoder:ie},assets:{}},n;try{n=await readFile(t,"utf8");}catch(s){if(b(s)==="ENOENT")return e;throw s}if(n.length>a$1.receipt)return e;try{let s=JSON.parse(n);if(typeof s!="object"||s===null)return e;let r=s;return r.schemaVersion!==U||typeof r.assets!="object"||r.assets===null?e:{...e,assets:{...r.assets}}}catch{return e}}a(ge,"readReceipt");async function Ue(t){let e=[];for(let n of t){let s=i.resolve(n);if((await lstat(s)).isDirectory()){let o=[s],a=0;for(;o.length>0;){let u=o.shift();if(u===void 0)break;let c=(await readdir(u,{withFileTypes:true})).sort((d,m)=>d.name.localeCompare(m.name));for(let d of c){if(a+=1,a>8192)throw new Error("Input directory expansion exceeds the 8192-entry limit.");if(d.isSymbolicLink()||d.name.startsWith("."))continue;let m=i.join(u,d.name);if(d.isDirectory()){d.name!=="three-blocks"&&o.push(m);continue}d.isFile()&&!d.name.endsWith(".tb.glb")&&V(d.name)!==null&&e.push(m);}}}else e.push(s);}if(e.length===0)throw new Error("No optimizable inputs found (.glb, .png, .jpg, .webp, .hdr).");return e}a(Ue,"expandInputs");async function Ve(t){let e=await realpath(t.root),n={maxDimension:ne(t.maxDimension,2048),hdrMaxDimension:ne(t.hdrMaxDimension,4096),quality:t.quality??"default",preset:t.preset??null},s=t.outDir===void 0?null:i.resolve(e,t.outDir);s!==null&&await mkdir(s,{recursive:true});let r=i.join(e,we),o=i.join(e,ue),a$2=c(h({version:U,encoder:ie,...n})),u=await Ue(t.inputs),c$1=[],d$1=[],m=await ge(o);for(let[T,p]of u.entries()){let g=V(p);try{if(g===null)throw new Error(`Unsupported asset type ${JSON.stringify(i.extname(p))}; expected .glb, .png, .jpg, .webp, or .hdr (EXR sources are not supported yet \u2014 convert environments to .hdr).`);t.onProgress?.(`${i.basename(p)} (${T+1}/${u.length})`);let v=g==="glb"?Te:g==="hdr"?Ae:a$1.texture,b=await h$1(p,v,"Asset input"),M=b.path,A=c(b.data),E=c(`${A}\0${a$2}`),O=g==="glb"?"glb":"ktx2",x=i.join(r,`${E}.${O}`),R=i.join(r,`${E}.json`),f$1,y,_=!1;if(t.force!==!0&&await d(x)&&await d(R))f$1=(await h$1(x,v,"Cached asset")).data,y=JSON.parse((await h$1(R,a$1.metadata,"Cached asset metadata")).data.toString("utf8")),_=!0;else {let $=a(k=>t.onProgress?.(`${i.basename(p)}: ${k}`),"progress"),D=g==="glb"?await Ne(b.data,M,n,$):g==="hdr"?await Pe(b.data,M,n):await Fe(b.data,M,n);f$1=D.bytes,y=D.metadata,await f(x,f$1),await f(R,`${JSON.stringify(y,null," ")}
|
|
2
|
+
`);}let S=Ce(M,g,s);await mkdir(i.dirname(S),{recursive:!0}),await f(S,f$1);let h=c(f$1);m.assets[P(e,M)]={kind:g,inputSha256:A,output:P(e,S),outputSha256:h,settingsSha256:a$2,bytesIn:b.data.byteLength,bytesOut:f$1.byteLength,vramBytesIn:y.vramBytesIn,vramBytesOut:y.vramBytesOut},c$1.push({input:P(e,M),output:P(e,S),kind:g,cached:_,bytesIn:b.data.byteLength,bytesOut:f$1.byteLength,vramBytesIn:y.vramBytesIn,vramBytesOut:y.vramBytesOut,textures:y.textures,notes:y.notes});}catch(v){d$1.push({input:P(e,p),error:v instanceof Error?v.message:String(v)});}}return c$1.length>0&&await f(o,`${JSON.stringify(m,null," ")}
|
|
3
|
+
`),{schemaVersion:1,command:"assets optimize",root:e,results:c$1,failed:d$1,bytesIn:c$1.reduce((T,p)=>T+p.bytesIn,0),bytesOut:c$1.reduce((T,p)=>T+p.bytesOut,0)}}a(Ve,"optimizeAssets");function ne(t,e){if(t===void 0)return e;if(!Number.isInteger(t)||t<64||t>16384)throw new Error("Texture dimension caps must be integers between 64 and 16384.");return t}a(ne,"boundedDimension");function I(t){if(t<1e3)return `${t} B`;if(t<1e6){let n=t/1e3;return `${n>=100?Math.round(n):n.toFixed(1)} kB`}let e=t/1e6;return `${e>=100?Math.round(e):e.toFixed(2)} MB`}a(I,"formatBytes");function re(t,e){if(t===0)return "";let n=Math.round((e-t)/t*100);return n===0?"":` (${n>0?"+":""}${n}%)`}a(re,"percentDelta");function qe(t){let e=[];for(let n of t.results){let s=n.cached?" \xB7 cached":"";e.push(`${n.input} -> ${n.output}`),e.push(` ${I(n.bytesIn)} -> ${I(n.bytesOut)}${re(n.bytesIn,n.bytesOut)}${s}`),n.vramBytesOut>0&&e.push(` VRAM \u2248 ${I(n.vramBytesIn)} -> ${I(n.vramBytesOut)}`);for(let r of n.textures){let o=r.slots.length>0?` [${r.slots.join(", ")}]`:"";e.push(` ${r.name}${o} ${r.preset}/${r.mode} ${r.width}x${r.height} ${I(r.bytesIn)} -> ${I(r.bytesOut)}`);}for(let r of n.notes)e.push(` note: ${r}`);}for(let n of t.failed)e.push(`failed ${n.input}: ${n.error}`);return t.results.length>1&&e.push(`total ${I(t.bytesIn)} -> ${I(t.bytesOut)}${re(t.bytesIn,t.bytesOut)}`),e.join(`
|
|
4
|
+
`)}a(qe,"formatAssetOptimizeReport");async function We(t,e){let n=await realpath(t),s=i.resolve(n,e);if(!await d(s))return [];let r=[],o=[s],a=0;for(;o.length>0;){let u=o.shift();if(u===void 0)break;let c=(await readdir(u,{withFileTypes:true})).sort((d,m)=>d.name.localeCompare(m.name));for(let d of c){if(a+=1,a>8192)throw new Error("Public asset discovery exceeds the 8192-entry limit.");if(d.isSymbolicLink()||d.name.startsWith("."))continue;let m=i.join(u,d.name);if(d.isDirectory()){if(u===s&&d.name==="three-blocks")continue;o.push(m);continue}if(!d.isFile()||d.name.endsWith(".tb.glb"))continue;let T=V(d.name);(T==="glb"||T==="hdr")&&r.push(m);}}return r.sort()}a(We,"discoverPublicAssets");async function Ge(t){let e=await realpath(t),n=await ge(i.join(e,ue)),s=[];for(let[r,o]of Object.entries(n.assets).sort(([a],[u])=>a.localeCompare(u))){let a=i.resolve(e,r),u=i.resolve(e,o.output),c$1="fresh";if(!await d(a))c$1="missing-input";else if(!await d(u))c$1="missing-output";else {let[d,m]=await Promise.all([readFile(a),readFile(u)]);(c(d)!==o.inputSha256||c(m)!==o.outputSha256)&&(c$1="stale");}s.push({input:r,output:o.output,kind:o.kind,state:c$1});}return {schemaVersion:1,command:"assets status",root:e,state:s.length===0?"empty":s.every(r=>r.state==="fresh")?"fresh":"stale",entries:s}}a(Ge,"inspectAssets");function Je(t){if(t.state==="empty")return "No optimized assets recorded. Run `assets optimize <file|directory>` first.";let e=t.entries.map(n=>`${n.state==="fresh"?"fresh ":n.state.padEnd(14)} ${n.input} -> ${n.output}`);return t.state==="stale"&&e.push("Some assets moved or changed; re-run `assets optimize` on the stale inputs."),e.join(`
|
|
5
|
+
`)}a(Je,"formatAssetStatusReport");function Ye(){X=void 0;}a(Ye,"resetAssetOptimizeToolsForTests");export{U as a,ae as b,ue as c,_e as d,De as e,Ve as f,qe as g,We as h,Ge as i,Je as j,Ye as k};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {e}from'./chunk-O5FU2ASS.js';import {i}from'./chunk-NJITVI23.js';import {a}from'./chunk-7X4DHW36.js';import {watch}from'fs';import v from'path';var o=class{static{a(this,"ShaderWatchQueue");}#s;#r;#a;#e;#t;#i=false;#n=false;constructor(r){if(this.#s=r.capture,this.#r=r.debounceMs??200,this.#a=r.onError??(()=>{}),!Number.isSafeInteger(this.#r)||this.#r<0||this.#r>6e4)throw new Error("Shader watch debounce must be an integer in 0...60000ms.")}notify(){this.#n||(this.#i=true,!this.#t&&(this.#e&&clearTimeout(this.#e),this.#e=setTimeout(()=>{this.#e=void 0,this.#o();},this.#r)));}#o(){this.#n||this.#t||!this.#i||(this.#i=false,this.#t=this.#s().catch(r=>{this.#a(r instanceof Error?r:new Error(String(r)));}).finally(()=>{this.#t=void 0,this.#i&&!this.#n&&this.notify();}));}async close(){this.#n=true,this.#i=false,this.#e&&clearTimeout(this.#e),this.#e=void 0,await this.#t;}};function y(e){let r=e.split(v.sep).join("/");return r===""||r.startsWith("node_modules/")||r.startsWith(".git/")||r.startsWith("dist/")||r===".three-blocks"||r.startsWith(".three-blocks/")}a(y,"ignored");async function W(e$1={}){let r=e$1.root??await i(e$1.start),d,l=new Promise(t=>{d=t;}),n=new o({...e$1.debounceMs!==void 0?{debounceMs:e$1.debounceMs}:{},...e$1.onError?{onError:e$1.onError}:{},capture:a(async()=>{let t=await e({root:r,...e$1.config?{config:e$1.config}:{},...e$1.driver?{driver:e$1.driver}:{},...e$1.driverKind?{driverKind:e$1.driverKind}:{},...e$1.serve?{serve:e$1.serve}:{},...e$1.url?{url:e$1.url}:{},...e$1.headed!==void 0?{headed:e$1.headed}:{},...e$1.attempts!==void 0?{attempts:e$1.attempts}:{}});e$1.onResult?.(t);},"capture")}),s,u=false,a$1=a(async()=>{u||(u=true,s?.close(),await n.close(),d?.());},"close");return s=watch(r,{recursive:true},(t,f)=>{y(f??"")||n.notify();}),s.on("error",t=>e$1.onError?.(t)),e$1.signal&&(e$1.signal.aborted?await a$1():e$1.signal.addEventListener("abort",()=>{a$1();},{once:true})),e$1.initial!==false&&n.notify(),{root:r,done:l,close:a$1}}a(W,"watchShaders");export{o as a,W as b};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var o="0.1.0";export{o as a};
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import {a}from'./chunk-HOZDD6PW.js';var d=/^[a-f0-9]{64}$/,g=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/,h=/^[a-z0-9][a-z0-9_-]{0,63}$/,f=/^[0-9A-Za-z][0-9A-Za-z._/-]{0,127}$/;function n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}a(n,"isRecord");function i(e){return typeof e=="string"&&g.test(e)}a(i,"isSafeVersion");function c(e){if(e.length===0||e.length>512||e.includes("\\")||/[\u0000-\u001f\u007f]/.test(e))return false;let o=e.split("/");return !e.startsWith("/")&&o.every(t=>t.length>0&&t!=="."&&t!=="..")}a(c,"isSafeRelativePath");function m(e){if(!n(e)||e.schemaVersion!==2)throw new Error("three-blocks.json must use schemaVersion 2.");if(typeof e.template!="string"||!h.test(e.template))throw new Error("three-blocks.json has an invalid default shader scene key.");if(!Array.isArray(e.layers)||!e.layers.every(o=>typeof o=="string"&&f.test(o))||new Set(e.layers).size!==e.layers.length)throw new Error("three-blocks.json has invalid layers.");if(e.generator!==void 0&&(!n(e.generator)||typeof e.generator.name!="string"||!f.test(e.generator.name)||!i(e.generator.version)))throw new Error("three-blocks.json has invalid generator metadata.");if(!n(e.runtime)||!i(e.runtime.three)||!i(e.runtime.threeBlocks))throw new Error("three-blocks.json has invalid runtime versions.");if(!n(e.features)||typeof e.features.text!="boolean")throw new Error("three-blocks.json has invalid feature metadata.");if(!n(e.protocol)||e.protocol.resultFile!==1)throw new Error("three-blocks.json has an unsupported protocol schema.");if(e.artifacts!==void 0){if(!n(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(m,"parseProjectMetadata");function l(e){if(!n(e))throw new Error("Shader coverage is missing.");for(let o of ["render","vertex","fragment","compute"])if(typeof e[o]!="number"||!Number.isSafeInteger(e[o])||e[o]<0)throw new Error(`Shader coverage.${o} must be a non-negative integer.`);return e}a(l,"parseCoverage");function y(e,o){if(!n(e))throw new Error(`Shader receipt inputs for "${o}" are invalid.`);let t=Object.entries(e);if(t.length===0||t.length>4096)throw new Error(`Shader receipt inputs for "${o}" must contain between 1 and 4096 files.`);for(let[r,a]of t)if(!c(r)||typeof a!="string"||!d.test(a))throw new Error(`Shader receipt input for "${o}" is invalid.`)}a(y,"parseInputs");function b(e){if(!n(e)||e.schemaVersion!==2||!n(e.runtime)||!i(e.runtime.three)||!i(e.runtime.threeBlocks)||typeof e.runtime.threeBlocksShaderClosure!="string"||!d.test(e.runtime.threeBlocksShaderClosure)||!n(e.scenes))throw new Error("Shader meta.json does not match receipt schema 2.");if(e.runtime.capture!==void 0&&(!n(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 o=Object.entries(e.scenes);if(o.length===0)throw new Error("Shader meta.json contains no scenes.");for(let[t,r]of o){let a=t.endsWith(".webgl")?"webgl":"webgpu",p=a==="webgl"?t.slice(0,-6):t;if(!h.test(p)||!n(r)||r.backend!==void 0&&r.backend!==a||typeof r.artifact!="string"||!c(r.artifact)||!r.artifact.endsWith(`.${a}.ts`)||typeof r.artifactHash!="string"||!d.test(r.artifactHash))throw new Error(`Shader receipt for "${t}" is invalid.`);if(r.asset===void 0!=(r.assetHash===void 0)||r.asset!==void 0&&(typeof r.asset!="string"||!c(r.asset)||!r.asset.endsWith(".json")||typeof r.assetHash!="string"||!d.test(r.assetHash)))throw new Error(`Shader static asset receipt for "${t}" is invalid.`);if(y(r.inputs,t),l(r.coverage),r.bytes!==void 0&&(!Number.isSafeInteger(r.bytes)||Number(r.bytes)<0))throw new Error(`Shader receipt byte count for "${t}" is invalid.`);if(r.skipped!==void 0&&(!n(r.skipped)||!Number.isSafeInteger(r.skipped.render)||Number(r.skipped.render)<0||!Number.isSafeInteger(r.skipped.compute)||Number(r.skipped.compute)<0))throw new Error(`Shader receipt skipped-build counts for "${t}" are invalid.`)}if(e.tool!==void 0&&(!n(e.tool)||e.tool.name!=="@three-blocks/devtools"||!i(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(n(e.tool)&&e.tool.compatibilities!==void 0&&(!n(e.tool.compatibilities)||Object.entries(e.tool.compatibilities).some(([t,r])=>t!=="webgpu"&&t!=="webgl"||typeof r!="string"||r.length===0)))throw new Error("Shader meta.json has invalid backend compatibility metadata.");return e}a(b,"parseShaderReceipt");export{n as a,m as b,b as c};
|
|
1
|
+
import {a}from'./chunk-7X4DHW36.js';var d=/^[a-f0-9]{64}$/,g=/^[0-9A-Za-z][0-9A-Za-z.+_-]{0,127}$/,h=/^[a-z0-9][a-z0-9_-]{0,63}$/,f=/^[0-9A-Za-z][0-9A-Za-z._/-]{0,127}$/;function n(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}a(n,"isRecord");function i(e){return typeof e=="string"&&g.test(e)}a(i,"isSafeVersion");function c(e){if(e.length===0||e.length>512||e.includes("\\")||/[\u0000-\u001f\u007f]/.test(e))return false;let o=e.split("/");return !e.startsWith("/")&&o.every(t=>t.length>0&&t!=="."&&t!=="..")}a(c,"isSafeRelativePath");function m(e){if(!n(e)||e.schemaVersion!==2)throw new Error("three-blocks.json must use schemaVersion 2.");if(typeof e.template!="string"||!h.test(e.template))throw new Error("three-blocks.json has an invalid default shader scene key.");if(!Array.isArray(e.layers)||!e.layers.every(o=>typeof o=="string"&&f.test(o))||new Set(e.layers).size!==e.layers.length)throw new Error("three-blocks.json has invalid layers.");if(e.generator!==void 0&&(!n(e.generator)||typeof e.generator.name!="string"||!f.test(e.generator.name)||!i(e.generator.version)))throw new Error("three-blocks.json has invalid generator metadata.");if(!n(e.runtime)||!i(e.runtime.three)||!i(e.runtime.threeBlocks))throw new Error("three-blocks.json has invalid runtime versions.");if(!n(e.features)||typeof e.features.text!="boolean")throw new Error("three-blocks.json has invalid feature metadata.");if(!n(e.protocol)||e.protocol.resultFile!==1)throw new Error("three-blocks.json has an unsupported protocol schema.");if(e.artifacts!==void 0){if(!n(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(m,"parseProjectMetadata");function l(e){if(!n(e))throw new Error("Shader coverage is missing.");for(let o of ["render","vertex","fragment","compute"])if(typeof e[o]!="number"||!Number.isSafeInteger(e[o])||e[o]<0)throw new Error(`Shader coverage.${o} must be a non-negative integer.`);return e}a(l,"parseCoverage");function y(e,o){if(!n(e))throw new Error(`Shader receipt inputs for "${o}" are invalid.`);let t=Object.entries(e);if(t.length===0||t.length>4096)throw new Error(`Shader receipt inputs for "${o}" must contain between 1 and 4096 files.`);for(let[r,a]of t)if(!c(r)||typeof a!="string"||!d.test(a))throw new Error(`Shader receipt input for "${o}" is invalid.`)}a(y,"parseInputs");function b(e){if(!n(e)||e.schemaVersion!==2||!n(e.runtime)||!i(e.runtime.three)||!i(e.runtime.threeBlocks)||typeof e.runtime.threeBlocksShaderClosure!="string"||!d.test(e.runtime.threeBlocksShaderClosure)||!n(e.scenes))throw new Error("Shader meta.json does not match receipt schema 2.");if(e.runtime.capture!==void 0&&(!n(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 o=Object.entries(e.scenes);if(o.length===0)throw new Error("Shader meta.json contains no scenes.");for(let[t,r]of o){let a=t.endsWith(".webgl")?"webgl":"webgpu",p=a==="webgl"?t.slice(0,-6):t;if(!h.test(p)||!n(r)||r.backend!==void 0&&r.backend!==a||typeof r.artifact!="string"||!c(r.artifact)||!r.artifact.endsWith(`.${a}.ts`)||typeof r.artifactHash!="string"||!d.test(r.artifactHash))throw new Error(`Shader receipt for "${t}" is invalid.`);if(r.asset===void 0!=(r.assetHash===void 0)||r.asset!==void 0&&(typeof r.asset!="string"||!c(r.asset)||!r.asset.endsWith(".json")||typeof r.assetHash!="string"||!d.test(r.assetHash)))throw new Error(`Shader static asset receipt for "${t}" is invalid.`);if(y(r.inputs,t),l(r.coverage),r.bytes!==void 0&&(!Number.isSafeInteger(r.bytes)||Number(r.bytes)<0))throw new Error(`Shader receipt byte count for "${t}" is invalid.`);if(r.skipped!==void 0&&(!n(r.skipped)||!Number.isSafeInteger(r.skipped.render)||Number(r.skipped.render)<0||!Number.isSafeInteger(r.skipped.compute)||Number(r.skipped.compute)<0))throw new Error(`Shader receipt skipped-build counts for "${t}" are invalid.`)}if(e.tool!==void 0&&(!n(e.tool)||e.tool.name!=="@three-blocks/devtools"||!i(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(n(e.tool)&&e.tool.compatibilities!==void 0&&(!n(e.tool.compatibilities)||Object.entries(e.tool.compatibilities).some(([t,r])=>t!=="webgpu"&&t!=="webgl"||typeof r!="string"||r.length===0)))throw new Error("Shader meta.json has invalid backend compatibility metadata.");return e}a(b,"parseShaderReceipt");export{n as a,m as b,b as c};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {a as a$1}from'./chunk-7X4DHW36.js';import t from'process';var o=Object.freeze([{id:"three-inspector-invalid-json",pattern:/is not valid JSON/iu},{id:"chromium-webgpu-experimental",pattern:/WebGPU is experimental/iu},{id:"browser-automatic-favicon",pattern:/Failed to load resource:.*404.*\/favicon\.ico/iu}]);function s(r){return o.some(n=>n.pattern.test(r))}a$1(s,"isDocumentedBrowserNoise");function a(r=t.env,n=t.platform){return []}a$1(a,"webgpuBrowserArgs");function p(r=false,n=t.env){return true}a$1(p,"webgpuBrowserHeadless");export{o as a,s as b,a as c,p as d};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {a}from'./chunk-
|
|
1
|
+
import {a}from'./chunk-7X4DHW36.js';import {PNG}from'pngjs';var x=2/255,E=4096*4096,P=64*1024*1024;function u(t){if(t.byteLength<24||t.byteLength>P||t[0]!==137||t[1]!==80||t[2]!==78||t[3]!==71)throw new Error("Shader screenshot is not a bounded PNG file.");let i=new DataView(t.buffer,t.byteOffset,t.byteLength),n=i.getUint32(16)*i.getUint32(20);if(!Number.isSafeInteger(n)||n<=0||n>E)throw new Error("Shader screenshot dimensions are invalid or exceed the inspection limit.");let a=PNG.sync.read(t),e=a.width*a.height;if(!Number.isSafeInteger(e)||e<=0||e>E)throw new Error("Shader screenshot dimensions are invalid or exceed the inspection limit.");if(a.data.byteLength!==e*4)throw new Error("Shader screenshot has invalid RGBA data.");return a}a(u,"decode");function b(t){let i=0;for(let n=0;n<t.data.byteLength;n+=4){let a=t.data[n]??0,e=t.data[n+1]??0,h=t.data[n+2]??0,d=(t.data[n+3]??0)/255;i+=(.2126*a+.7152*e+.0722*h)*d;}return i/(t.width*t.height*255)}a(b,"imageLuminance");function N(t){let i=u(t);return {width:i.width,height:i.height,luminance:b(i)}}a(N,"shaderScreenshotMetrics");function A(t,i,n,a){if(!Number.isSafeInteger(n)||n<0||n>255)throw new Error("Shader parity channel tolerance must be an integer in 0...255.");if(!Number.isFinite(a)||a<0||a>1)throw new Error("Shader parity maximum diff ratio must be in 0...1.");let e=u(t),h=u(i);if(e.width!==h.width||e.height!==h.height)throw new Error(`Shader parity dimensions differ (${e.width}\xD7${e.height} vs ${h.width}\xD7${h.height}).`);let d=new Uint8Array(e.data.byteLength),c=0,f=0;for(let r=0;r<e.data.byteLength;r+=4){let p=false;for(let o=0;o<4;o++){let s=Math.abs((e.data[r+o]??0)-(h.data[r+o]??0));f=Math.max(f,s),s>n&&(p=true);}if(p)c++,d[r]=255,d[r+1]=24,d[r+2]=24,d[r+3]=255;else {let o=Math.round(.2126*(e.data[r]??0)+.7152*(e.data[r+1]??0)+.0722*(e.data[r+2]??0)),s=Math.round(o*.25);d[r]=s,d[r+1]=s,d[r+2]=s,d[r+3]=255;}}let y=e.width*e.height,w=c/y,g=b(e),m=b(h),S=g>x&&m>x;return {width:e.width,height:e.height,luminance:m,differentPixels:c,totalPixels:y,diffRatio:w,maximumChannelDelta:f,baselineLuminance:g,precompiledLuminance:m,nonBlack:S,matches:S&&w<=a,diff:PNG.sync.write({width:e.width,height:e.height,data:d})}}a(A,"compareShaderScreenshots");export{N as a,A as b};
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|