@seanhogg/builderforce-webcontainers 2026.10.6 → 2026.10.8
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/dist/assets.js +3 -3
- package/dist/check/worker.js +8 -8
- package/dist/host.d.ts +25 -9
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +39 -25
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/node/index.d.ts +5 -9
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +1 -25
- package/dist/node/index.js.map +1 -1
- package/dist/node/portResponder.d.ts +45 -0
- package/dist/node/portResponder.d.ts.map +1 -0
- package/dist/node/portResponder.js +136 -0
- package/dist/node/portResponder.js.map +1 -0
- package/dist/node/processHost.d.ts +26 -2
- package/dist/node/processHost.d.ts.map +1 -1
- package/dist/node/processHost.js +67 -16
- package/dist/node/processHost.js.map +1 -1
- package/dist/node/protocol.d.ts +42 -9
- package/dist/node/protocol.d.ts.map +1 -1
- package/dist/node/protocol.js.map +1 -1
- package/dist/node/responseWire.d.ts +27 -0
- package/dist/node/responseWire.d.ts.map +1 -0
- package/dist/node/responseWire.js +99 -0
- package/dist/node/responseWire.js.map +1 -0
- package/dist/node/worker.js +143 -127
- package/dist/node/workerProcess.d.ts +3 -1
- package/dist/node/workerProcess.d.ts.map +1 -1
- package/dist/node/workerProcess.js +49 -19
- package/dist/node/workerProcess.js.map +1 -1
- package/dist/previewBridge.d.ts +37 -0
- package/dist/previewBridge.d.ts.map +1 -0
- package/dist/previewBridge.js +116 -0
- package/dist/previewBridge.js.map +1 -0
- package/dist/previewMessages.d.ts +24 -0
- package/dist/previewMessages.d.ts.map +1 -0
- package/dist/previewMessages.js +59 -0
- package/dist/previewMessages.js.map +1 -0
- package/dist/process-worker.js +143 -127
- package/dist/protocol.d.ts +23 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +8 -0
- package/dist/protocol.js.map +1 -1
- package/dist/relay.html +1 -1
- package/dist/snapshotStore.d.ts +30 -0
- package/dist/snapshotStore.d.ts.map +1 -0
- package/dist/snapshotStore.js +115 -0
- package/dist/snapshotStore.js.map +1 -0
- package/dist/sw.js +1 -1
- package/dist/swRouter.d.ts +8 -1
- package/dist/swRouter.d.ts.map +1 -1
- package/dist/swRouter.js +40 -5
- package/dist/swRouter.js.map +1 -1
- package/package.json +3 -2
- package/src/host.ts +62 -31
- package/src/index.ts +8 -3
- package/src/node/index.ts +5 -24
- package/src/node/portResponder.ts +175 -0
- package/src/node/processHost.ts +92 -15
- package/src/node/protocol.ts +25 -4
- package/src/node/responseWire.ts +97 -0
- package/src/node/workerProcess.ts +52 -21
- package/src/previewBridge.ts +148 -0
- package/src/previewMessages.ts +79 -0
- package/src/protocol.ts +35 -1
- package/src/snapshotStore.ts +135 -0
- package/src/sw.ts +2 -0
- package/src/swRouter.ts +35 -6
package/dist/check/worker.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";(()=>{var
|
|
2
|
-
`;)
|
|
3
|
-
`;continue}if(r==="/"&&
|
|
1
|
+
"use strict";(()=>{var ke=Object.defineProperty;var je=(s,e,t)=>e in s?ke(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var S=(s,e,t)=>je(s,typeof e!="symbol"?e+"":e,t);function E(s){let e=[];for(let t of s.replace(/\\/g,"/").split("/"))!t||t==="."||(t===".."?e.pop():e.push(t));return"/"+e.join("/")}function j(s){let e=E(s),t=e.lastIndexOf("/");return t<=0?"/":e.slice(0,t)}function Re(s){let e=E(s);return e.slice(e.lastIndexOf("/")+1)}function w(...s){return E(s.join("/"))}function F(s){let e=Re(s),t=e.lastIndexOf(".");return t<=0?"":e.slice(t).toLowerCase()}var $e=new TextDecoder,P=class{constructor(){S(this,"files",new Map);S(this,"versions",new Map);S(this,"mtimes",new Map);S(this,"children",new Map([["/",new Set]]));S(this,"explicit",new Set);S(this,"listeners",new Set);S(this,"clock",0)}writeFile(e,t){let n=E(e);if(n==="/"||this.children.has(n))throw new Error(`EISDIR: illegal operation on a directory, open '${n}'`);let r=!this.files.has(n);r&&this.link(n),this.files.set(n,t),this.versions.set(n,++this.clock),this.mtimes.set(n,Date.now()),this.emit({type:"write",path:n,created:r})}readFile(e){return this.files.get(E(e))}readText(e){let t=this.readFile(e);if(t!==void 0)return typeof t=="string"?t:$e.decode(t)}isFile(e){return this.files.has(E(e))}isDirectory(e){return this.children.has(E(e))}exists(e){return this.isFile(e)||this.isDirectory(e)}mkdir(e){let t=E(e);if(this.files.has(t))throw new Error(`EEXIST: file already exists, mkdir '${t}'`);if(t==="/")return;let n=this.children.has(t);this.explicit.add(t),!n&&(this.ensureDir(t),this.emit({type:"mkdir",path:t}))}readdir(e){return[...this.children.get(E(e))??[]].sort()}entries(e){let t=E(e);return this.readdir(t).map(n=>({name:n,kind:this.children.has(w(t,n))?"directory":"file"}))}rename(e,t){let n=E(e),r=E(t);if(n===r)return;if(!this.exists(n))throw new Error(`ENOENT: no such file or directory, rename '${n}' -> '${r}'`);if(this.exists(r))throw new Error(`EEXIST: file already exists, rename '${n}' -> '${r}'`);if(r.startsWith(n+"/"))throw new Error(`EINVAL: cannot move '${n}' into itself`);if(this.files.has(n)){let c=this.files.get(n);this.removeFile(n),this.writeFile(r,c);return}let o=n+"/",a=[...this.files].filter(([c])=>c.startsWith(o)),l=[...this.explicit].filter(c=>c===n||c.startsWith(o));this.rm(n),this.mkdir(r);for(let c of l)this.mkdir(r+c.slice(n.length));for(let[c,f]of a)this.writeFile(r+c.slice(n.length),f)}list(){return[...this.files.keys()].sort()}explicitDirectories(){return[...this.explicit].sort()}rm(e){let t=E(e);if(this.files.has(t)){this.removeFile(t);return}if(!this.children.has(t))return;for(let r of[...this.children.get(t)??[]])this.rm(t==="/"?"/"+r:`${t}/${r}`);if(t==="/")return;let n=this.explicit.delete(t);this.children.has(t)&&this.unlinkDir(t),n&&this.emit({type:"remove",path:t})}version(e){return this.versions.get(E(e))}mtime(e){return this.mtimes.get(E(e))}writeTree(e,t="/"){for(let[n,r]of Object.entries(e)){let o=w(t,n);typeof r=="string"||r instanceof Uint8Array?this.writeFile(o,r):(this.mkdir(o),this.writeTree(r,o))}}toFlat(){let e={};for(let[t,n]of this.files)e[t.slice(1)]=n;return e}watch(e,t={}){let n=t.under===void 0?void 0:E(t.under),r=n===void 0||n==="/"?e:o=>(o.path===n||o.path.startsWith(n+"/"))&&e(o);return this.listeners.add(r),()=>this.listeners.delete(r)}removeFile(e){this.files.delete(e),this.versions.delete(e),this.mtimes.delete(e),this.unlink(e),this.emit({type:"remove",path:e})}link(e){let t=j(e);this.ensureDir(t),this.children.get(t).add(e.slice(e.lastIndexOf("/")+1))}ensureDir(e){if(!this.children.has(e)){if(this.files.has(e))throw new Error(`ENOTDIR: not a directory, '${e}'`);this.children.set(e,new Set),this.link(e)}}unlink(e){let t=j(e),n=this.children.get(t);n&&(n.delete(e.slice(e.lastIndexOf("/")+1)),n.size===0&&t!=="/"&&!this.explicit.has(t)&&this.unlinkDir(t))}unlinkDir(e){this.children.delete(e),this.unlink(e)}emit(e){for(let t of this.listeners)t(e)}};function Te(s){return["/.env","/.env.local",`/.env.${s}`,`/.env.${s}.local`]}function z(s){let e="",t=!1;for(let n=0;n<s.length;n++){let r=s[n],o=s[n+1];if(t){e+=r,r==="\\"?(e+=o??"",n++):r==='"'&&(t=!1);continue}if(r==='"'){t=!0,e+=r;continue}if(r==="/"&&o==="/"){for(;n<s.length&&s[n]!==`
|
|
2
|
+
`;)n++;e+=`
|
|
3
|
+
`;continue}if(r==="/"&&o==="*"){for(n+=2;n<s.length&&!(s[n]==="*"&&s[n+1]==="/");)n++;n++;continue}e+=r}return JSON.parse(e.replace(/,(\s*[}\]])/g,"$1"))}function U(s,e){let t=s.readText(e);if(t!==void 0)try{let n=z(t);return n&&typeof n=="object"?n:void 0}catch{return}}function N(s){return s&&typeof s=="object"?s:{}}function Fe(s){let e=U(s,"/package.json")??{},t={};for(let n of["devDependencies","dependencies"])for(let[r,o]of Object.entries(N(e[n])))typeof o=="string"&&(t[r]=o);return t}function Ce(s){let e=U(s,"/tsconfig.json")??U(s,"/jsconfig.json")??{},t={...N(e.compilerOptions)},n=Array.isArray(e.references)?e.references:[];for(let r of n){let o=N(r).path;if(typeof o!="string")continue;let a=o.endsWith(".json")?w("/",o):w("/",o,"tsconfig.json");for(let[l,c]of Object.entries(N(U(s,a)?.compilerOptions)))l in t||(t[l]=c)}return t}function be(s){let e=typeof s.baseUrl=="string"?s.baseUrl:".",t=[];for(let[n,r]of Object.entries(N(s.paths))){if(!Array.isArray(r))continue;let o=n.endsWith("*"),a=r.filter(l=>typeof l=="string").map(l=>{let c=o?l.replace(/\*$/,""):l,f=w("/",e,c);return c.endsWith("/")&&f!=="/"?f+"/":f});t.push({prefix:o?n.slice(0,-1):n,wildcard:o,targets:a})}return t.sort((n,r)=>r.prefix.length-n.prefix.length)}var _e=[{name:"react-native",twin:"react-native-web"}];function De(s){let e={};for(let{name:t,twin:n}of _e)n in s&&(e[t]=n);return e}function Ie(s){let e=typeof s.jsxImportSource=="string"?s.jsxImportSource:"react";return{runtime:s.jsx==="react"?"classic":"automatic",importSource:e}}function Pe(s){let e={};for(let t of s.split(/\r?\n/)){let n=t.trim();if(!n||n.startsWith("#"))continue;let r=n.indexOf("=");if(r<=0)continue;let o=n.slice(0,r).replace(/^export\s+/,"").trim(),a=n.slice(r+1).trim();(a.startsWith('"')&&a.endsWith('"')||a.startsWith("'")&&a.endsWith("'"))&&(a=a.slice(1,-1)),e[o]=a}return e}function Ne(s,e){let t={};for(let n of Te(e)){let r=s.readText(n);r!==void 0&&Object.assign(t,Pe(r))}return t}function ee(s,e="development"){let t=Ce(s),n=Fe(s);return{dependencies:n,aliases:be(t),packageAliases:De(n),jsx:Ie(t),env:Ne(s,e)}}var te=[".tsx",".ts",".jsx",".js",".mjs",".cjs",".json",".css"];function R(s){return s.startsWith(".")||s.startsWith("/")?!1:!/^[a-z][a-z0-9+.-]*:/i.test(s)}function $(s){let e=s.split("/"),t=s.startsWith("@")?2:1;return{name:e.slice(0,t).join("/"),subpath:e.length>t?"/"+e.slice(t).join("/"):""}}function Oe(s,e){if(s.isFile(e))return e;for(let n of te)if(s.isFile(e+n))return e+n;let t=F(e);if(t===".js"||t===".jsx"||t===".mjs"){let n=e.slice(0,-t.length);for(let r of[".ts",".tsx"])if(s.isFile(n+r))return n+r}if(s.isDirectory(e))for(let n of te){let r=w(e,"index"+n);if(s.isFile(r))return r}}function ne(s,e,t){for(let n of e){if(!(n.wildcard?t.startsWith(n.prefix):t===n.prefix))continue;let o=n.wildcard?t.slice(n.prefix.length):"";for(let a of n.targets){let l=Oe(s,E(a+o));if(l)return l}}}var W="/__bfwc_shims__",O=`${W}/ambient.d.ts`,q=`${W}/empty.d.ts`,H=new Set(["vite/client","react-scripts"]),A="{ const src: string; export default src; }",se="{ const value: any; export default value; }",Me=[["*.module.css","{ const classes: { readonly [key: string]: string }; export default classes; }"],["*.module.scss","{ const classes: { readonly [key: string]: string }; export default classes; }"],["*.css","{}"],["*.scss","{}"],["*.sass","{}"],["*.less","{}"],...["svg","png","jpg","jpeg","gif","webp","avif","ico","bmp","woff","woff2","ttf","otf","eot","mp4","webm","mp3","wav","ogg","pdf","txt","md","wasm"].map(s=>[`*.${s}`,A]),["*?raw",A],["*?url",A],["*?inline",A],["*.vue",se],["*.svelte",se]],Le=`interface ImportMetaEnv {
|
|
4
4
|
readonly [key: string]: any;
|
|
5
5
|
readonly MODE: string;
|
|
6
6
|
readonly BASE_URL: string;
|
|
@@ -12,9 +12,9 @@ interface ImportMeta {
|
|
|
12
12
|
readonly env: ImportMetaEnv;
|
|
13
13
|
readonly hot?: any;
|
|
14
14
|
readonly glob: any;
|
|
15
|
-
}`;function Ue(
|
|
15
|
+
}`;function Ue(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ae(s,e){let t=new RegExp(`declare\\s+module\\s+['"]${Ue(e)}['"]`);for(let n of s)if(t.test(n))return!0;return!1}function re(s){let e=[Le];s.existing.some(t=>/declare\s+var\s+process\b/.test(t))||e.push("declare var process: { env: { readonly [key: string]: string | undefined; readonly NODE_ENV: string } };");for(let[t,n]of Me)Ae(s.existing,t)||e.push(`declare module ${JSON.stringify(t)} ${n}`);for(let t of s.untyped)e.push(`declare module ${JSON.stringify(t)};`),e.push(`declare module ${JSON.stringify(`${t}/*`)};`);return e.join(`
|
|
16
16
|
`)+`
|
|
17
|
-
`}function ie(
|
|
18
|
-
`:t.readText(i)??
|
|
19
|
-
`,fileExists:i=>r(i)!==void 0,readFile:r,directoryExists:i=>t.isDirectory(i)||i.startsWith(
|
|
20
|
-
`),
|
|
17
|
+
`}function ie(s){return!/^(workspace|file|link|portal|git\+|git:|github:|https?:)/.test(s)&&!s.includes("/")}var C="/__bfwc_types__",b="/__bfwc_lib__",M="/node_modules",G="https://esm.sh",B="https://cdn.jsdelivr.net/npm";function K(s){return`${B}/typescript@${s}/lib`}function X(s){return`@types/${s.startsWith("@")?s.slice(1).replace("/","__"):s}`}function J(s,e){let t=e[s];return t&&ie(t)?`${s}@${t}`:s}function T(s,e,t){let{name:n,subpath:r}=$(e);return`${s}/${J(n,t)}${r}`}function I(s,e){let t=new URL(s,e).href.replace(/[?#].*$/,"");return/\.d\.[mc]?ts$/.test(t)?[t]:/\.[mc]?js$/.test(t)?[t.replace(/\.([mc]?)js$/,".d.$1ts")]:/\.[mc]?ts$/.test(t)?[t]:[`${t}.d.ts`,`${t}/index.d.ts`]}var _=class{constructor(){S(this,"files",new Map);S(this,"redirects",new Map);S(this,"packages",new Map);S(this,"libs",new Map);S(this,"configs",new Map);S(this,"sourceFiles",new Map)}finalUrl(e){return(this.redirects.get(e)??(this.files.has(e)?e:void 0))||void 0}virtualPath(e){return`${C}/${e.replace(/^[a-z]+:\/\//i,"")}`}urlOf(e){if(!e.startsWith(`${C}/`))return;let t=e.slice(C.length+1);for(let n of["https://","http://"])if(this.files.has(n+t))return n+t}read(e){if(e.startsWith(`${b}/`))return this.libs.get(e.slice(b.length+1))??void 0;if(e.startsWith(`${M}/`))return this.configs.get(e)??void 0;let t=this.urlOf(e);return t?this.files.get(t):void 0}};var We="X-TypeScript-Types";async function oe(s,e,t,n){let{sources:r}=n,o=new Map,a=[],l=u=>a.push(u().catch(()=>{})),c=(u,x)=>(o.has(u)||o.set(u,x()),o.get(u)),f=u=>n.fetch(u).then(x=>x.ok?x:void 0,()=>{});function i(u,x){let m=s.preProcessFile(x,!0,!0);for(let p of m.referencedFiles)l(()=>d(I(p.fileName,u)));for(let p of m.typeReferenceDirectives)l(()=>k(p.fileName));for(let p of m.libReferenceDirectives)l(()=>y(`lib.${p.fileName.toLowerCase()}.d.ts`));for(let p of m.importedFiles){let v=p.fileName;l(()=>R(v)?g(v):d(I(v,u)))}}function h(u){let x=e.redirects.get(u);return x!==void 0?Promise.resolve(x||void 0):e.files.has(u)?Promise.resolve(u):c(`dts:${u}`,async()=>{if(e.files.size>=n.maxFiles)return;let m=await f(u);if(!m){e.redirects.set(u,"");return}let p=m.url||u;if(e.redirects.set(u,p),!e.files.has(p)){let v=await m.text();e.files.set(p,v),i(p,v)}return p})}async function d(u){for(let x of u){let m=await h(x);if(m)return m}}function g(u,x={}){let m=T(r.typesOrigin,u,x);return e.packages.has(m)?Promise.resolve(e.packages.get(m)??void 0):c(`pkg:${m}`,async()=>{let p=await f(m),v=p?.headers.get(We),L=v?await h(new URL(v,p.url||m).href):void 0;return e.packages.set(m,L??null),L})}function k(u,x={}){if(H.has(u))return Promise.resolve();let m=`types:${u}`;return e.packages.has(m)?Promise.resolve():c(m,async()=>{let p=u==="node"?void 0:await g(u,x),{name:v,subpath:L}=$(u),Se=X(v),ve=p?void 0:await h(`${r.typesOrigin}/${J(Se,x)}${L||"/index"}.d.ts`);e.packages.set(m,p??ve??null)})}function y(u){return e.libs.has(u)?Promise.resolve():c(`lib:${u}`,async()=>{let x=await f(`${r.libBaseUrl}/${u}`),m=x?await x.text():null;if(e.libs.set(u,m),m)for(let p of s.preProcessFile(m,!0,!1).libReferenceDirectives)l(()=>y(`lib.${p.fileName.toLowerCase()}.d.ts`))})}for(let u of t.specifiers)l(()=>g(u,t.dependencies));for(let u of t.typeReferences)l(()=>k(u,t.dependencies));for(let u of t.libFiles)l(()=>y(u));for(;a.length;)await Promise.all(a.splice(0))}async function ce(s,e,t,n){let r=[];function o(c){try{let f=z(c).extends;return(Array.isArray(f)?f:[f]).filter(i=>typeof i=="string")}catch{return[]}}function a(c,f){for(let i of o(f)){let h;if(R(i)){let{name:d,subpath:g}=$(i);h=`${M}/${d}${g?g.endsWith(".json")?g:`${g}.json`:"/tsconfig.json"}`}else if(c.startsWith(`${M}/`))h=w(j(c),i.endsWith(".json")?i:`${i}.json`);else continue;e.configs.has(h)||(e.configs.set(h,null),r.push(l(h)))}}async function l(c){let f=c.slice(M.length+1),{name:i,subpath:h}=$(f),d=await n.fetch(`${n.sources.npmBaseUrl}/${J(i,t)}${h}`).catch(()=>{});if(!d?.ok)return;let g=await d.text();e.configs.set(c,g),a(c,g)}for(let c of s.list())/^\/tsconfig[^/]*\.json$/.test(c)&&a(c,s.readText(c)??"");for(;r.length;)await Promise.all(r.splice(0))}var V=[".ts",".tsx",".d.ts",".mts",".cts",".js",".jsx",".mjs",".cjs",".json"];function He(s,e){return e.endsWith(".d.ts")?s.Extension.Dts:e.endsWith(".d.mts")?s.Extension.Dmts:e.endsWith(".d.cts")?s.Extension.Dcts:{".ts":s.Extension.Ts,".tsx":s.Extension.Tsx,".mts":s.Extension.Mts,".cts":s.Extension.Cts,".js":s.Extension.Js,".jsx":s.Extension.Jsx,".mjs":s.Extension.Mjs,".cjs":s.Extension.Cjs,".json":s.Extension.Json}[F(e)]??s.Extension.Ts}function ae(s,e){let t=F(e);if(s.isFile(e)&&V.includes(t))return e;for(let n of V)if(s.isFile(e+n))return e+n;if(t===".js"||t===".jsx"||t===".mjs"||t===".cjs"){let n=e.slice(0,-t.length);for(let r of[".ts",".tsx",".d.ts",".mts",".cts"])if(s.isFile(n+r))return n+r}for(let n of V)if(s.isFile(w(e,`index${n}`)))return w(e,`index${n}`)}function fe(s,e){let{fs:t,store:n}=e,r=i=>i===O?e.shim:i===q?`export {};
|
|
18
|
+
`:t.readText(i)??n.read(i);function o(i){return i?n.virtualPath(i):void 0}function a(i,h){if(R(i))return o(n.packages.get(T(e.typesOrigin,i,{})));for(let d of I(i,h)){let g=n.finalUrl(d);if(g)return o(g)}}function l(i,h){if(!i.includes("?")){if(!R(i)){let d=i.startsWith("/")?E(i):w(j(h),i);return ae(t,d)}for(let d of e.aliases){if(!(d.wildcard?i.startsWith(d.prefix):i===d.prefix))continue;let k=d.wildcard?i.slice(d.prefix.length):"";for(let y of d.targets){let u=ae(t,E(y+k));if(u)return u}}return o(n.packages.get(T(e.typesOrigin,i,e.dependencies)))}}function c(i,h){let d=n.urlOf(h),g=d?a(i,d):l(i,h);if(g)return{resolvedFileName:g,extension:He(s,g),isExternalLibraryImport:g.startsWith(`${C}/`)}}function f(i){return H.has(i)?q:o(n.packages.get(`types:${i}`))}return{getSourceFile(i,h){let d=!t.isFile(i),g=d?n.sourceFiles.get(i):void 0;if(g)return g;let k=r(i);if(k===void 0)return;let y=s.createSourceFile(i,k,h,!0);return d&&i!==O&&n.sourceFiles.set(i,y),y},getDefaultLibFileName:i=>`${b}/${s.getDefaultLibFileName(i)}`,getDefaultLibLocation:()=>b,writeFile:()=>{},getCurrentDirectory:()=>"/",getCanonicalFileName:i=>i,useCaseSensitiveFileNames:()=>!0,getNewLine:()=>`
|
|
19
|
+
`,fileExists:i=>r(i)!==void 0,readFile:r,directoryExists:i=>t.isDirectory(i)||i.startsWith(C)||i===b||i===W,getDirectories:()=>[],resolveModuleNameLiterals:(i,h)=>i.map(d=>({resolvedModule:c(d.text,h)})),resolveTypeReferenceDirectiveReferences:i=>i.map(h=>{let d=f(typeof h=="string"?h:h.fileName);return{resolvedTypeReferenceDirective:d?{primary:!0,resolvedFileName:d,isExternalLibraryImport:!0}:void 0}})}}var Be={0:"warning",1:"error",2:"suggestion",3:"message"};function Q(s,e){let t=s.flattenDiagnosticMessageText(e.messageText,`
|
|
20
|
+
`),n=Be[e.category]??"error";if(!e.file||e.start===void 0)return{line:1,column:1,message:t,code:e.code,category:n};let{line:r,character:o}=e.file.getLineAndCharacterOfPosition(e.start);return{file:e.file.fileName.replace(/^\//,""),line:r+1,column:o+1,message:t,code:e.code,category:n}}function le(s){let e=new Set;return s.filter(t=>{let n=`${t.file??""}:${t.line}:${t.column}:${t.code}:${t.message}`;return e.has(n)?!1:(e.add(n),!0)}).sort((t,n)=>(t.file??"").localeCompare(n.file??"")||t.line-n.line||t.column-n.column)}var ue=/(^|\/)(vite|vitest|svelte|tailwind|postcss|eslint|prettier|playwright)\.config\.[cm]?[jt]s$/,Je=[".ts",".tsx",".mts",".cts"],Ye=18003;function ze(s,e){return{target:s.ScriptTarget.ES2020,lib:["lib.es2020.d.ts","lib.dom.d.ts","lib.dom.iterable.d.ts"],module:s.ModuleKind.ESNext,moduleResolution:s.ModuleResolutionKind.Bundler,jsx:s.JsxEmit.ReactJSX,...e?{jsxImportSource:e}:{},strict:!0,noFallthroughCasesInSwitch:!0,isolatedModules:!0,resolveJsonModule:!0,allowImportingTsExtensions:!0,esModuleInterop:!0,skipLibCheck:!0,noEmit:!0}}function qe(s){return{...s,noEmit:!0,skipLibCheck:!0,composite:!1,incremental:!1,declaration:!1,declarationMap:!1,emitDeclarationOnly:!1,tsBuildInfoFile:void 0}}function Ge(s){let e="";for(let t=0;t<s.length;t++){let n=s[t];n==="*"&&s[t+1]==="*"&&s[t+2]==="/"?(e+="(?:[^/]+/)*",t+=2):n==="*"?e+="[^/]*":n==="?"?e+="[^/]":e+=n.replace(/[.+^${}()|[\]\\]/g,"\\$&")}return new RegExp(`^${e}$`)}function de(s,e){let t=w(s,e),n=t.slice(t.lastIndexOf("/")+1);return!/[*?]/.test(n)&&!F(n)&&(t=`${t==="/"?"":t}/**/*`),Ge(t)}function Ke(s,e){return{useCaseSensitiveFileNames:!0,fileExists:t=>s.isFile(t)||e.read(t)!==void 0,readFile:t=>s.readText(t)??e.read(t),readDirectory(t,n,r,o){let a=(o??["**/*"]).map(c=>de(t,c)),l=(r??[]).map(c=>de(t,c));return s.list().filter(c=>n.some(f=>c.endsWith(f))&&!c.includes("/node_modules/")&&a.some(f=>f.test(c))&&!l.some(f=>f.test(c)))}}}function Xe(s,e,t){let n=e.readFile(t)??"",r=s.parseConfigFileTextToJson(t,n);return r.error?{errors:[r.error]}:s.parseJsonConfigFileContent(r.config,e,j(t),void 0,t)}function Ve(s,e,t){let n=s.parseConfigFileTextToJson(t,e.readFile(t)??"").config,r=n?.references??[],o=(n?.files?.length??0)>0||n?.include!==void 0;return!r.length||o?[]:r.map(a=>typeof a.path=="string"?w(j(t),a.path):void 0).filter(a=>!!a).map(a=>a.endsWith(".json")?a:w(a,"tsconfig.json")).filter(a=>e.fileExists(a))}function pe(s,e,t,n){let r=Ke(e,t),o=["/tsconfig.json","/jsconfig.json"].find(c=>e.isFile(c));if(!o){let c=e.list().filter(f=>Je.some(i=>f.endsWith(i))&&!f.includes("/node_modules/")&&!ue.test(f));return c.length?[{options:ze(s,n),rootNames:c,errors:[]}]:[]}let a=Ve(s,r,o),l=[];for(let c of a.length?a:[o]){let f=Xe(s,r,c),i=f.errors.filter(d=>d.code!==Ye);if(!("options"in f)){l.push({configPath:c,options:{},rootNames:[],errors:i});continue}let h=f.fileNames.filter(d=>!ue.test(d));!h.length&&!i.length||l.push({configPath:c,options:qe(f.options),rootNames:h,errors:i})}return l}function Qe(s){if(s instanceof P)return s;let e=new P;return e.writeTree(s),e}function Ze(s,e,t,n){let r={specifiers:new Set,typeReferences:new Set,libFiles:new Set};for(let o of t){let{options:a}=o;for(let l of o.rootNames){let c=s.preProcessFile(e.readText(l)??"",!0,!0);for(let f of c.importedFiles)R(f.fileName)&&!f.fileName.includes("?")&&!n(f.fileName)&&r.specifiers.add(f.fileName);for(let f of c.typeReferenceDirectives)r.typeReferences.add(f.fileName);for(let f of c.libReferenceDirectives)r.libFiles.add(`lib.${f.fileName.toLowerCase()}.d.ts`)}for(let l of a.types??[])r.typeReferences.add(l);if(a.jsx===s.JsxEmit.ReactJSX||a.jsx===s.JsxEmit.ReactJSXDev){let l=a.jsx===s.JsxEmit.ReactJSXDev?"jsx-dev-runtime":"jsx-runtime";r.specifiers.add(`${a.jsxImportSource??"react"}/${l}`)}if(!a.noLib)for(let l of a.lib??[s.getDefaultLibFileName(a)])r.libFiles.add(l)}return r}async function Z(s,e,t){let n=Qe(e),r=t.store??new _,o={typesOrigin:G,npmBaseUrl:B,libBaseUrl:K(s.version),...t.sources},a=ee(n),{dependencies:l}=a;await ce(n,r,l,{fetch:t.fetch,sources:o});let c=pe(s,n,r,a.jsx.importSource==="react"?void 0:a.jsx.importSource),f=Ze(s,n,c,y=>ne(n,a.aliases,y)!==void 0);await oe(s,r,{specifiers:[...f.specifiers],typeReferences:[...f.typeReferences],libFiles:[...f.libFiles],dependencies:l},{fetch:t.fetch,sources:o,maxFiles:t.maxTypeFiles??2e3});let i=[...new Set([...f.specifiers].filter(y=>!r.packages.get(T(o.typesOrigin,y,l))).map(y=>$(y).name))].sort(),h=n.list().filter(y=>y.endsWith(".d.ts")).map(y=>n.readText(y)??""),d=re({existing:[...h,...r.files.values()],untyped:i}),g=[],k=new Set;for(let y of c){for(let p of y.errors)g.push(Q(s,p));if(!y.rootNames.length)continue;let u=fe(s,{fs:n,store:r,typesOrigin:o.typesOrigin,dependencies:l,aliases:a.aliases,shim:d}),x=s.createProgram({rootNames:[...y.rootNames,O],options:y.options,host:u}),m=[...x.getOptionsDiagnostics(),...x.getGlobalDiagnostics()];for(let p of x.getSourceFiles())n.isFile(p.fileName)&&(k.add(p.fileName.slice(1)),m.push(...x.getSyntacticDiagnostics(p),...x.getSemanticDiagnostics(p)));for(let p of m)p.file&&!n.isFile(p.file.fileName)||g.push(Q(s,p))}return{diagnostics:le(g),untypedPackages:i,files:[...k].sort()}}var et="bfwc-types-v1",tt=/@\d+\.\d+\.\d+(?:[-+][\w.]+)?\//,he="x-bfwc-final-url",Y="x-typescript-types";function me(s,e,t){return{ok:!0,url:s,headers:{get:n=>n.toLowerCase()===Y?t:null},text:async()=>e}}function ge(s=fetch){let e,t=()=>e??(e=typeof caches>"u"?Promise.resolve(void 0):caches.open(et).catch(()=>{}));return async n=>{let o=tt.test(n)?await t():void 0,a=await o?.match(n).catch(()=>{});if(a)return me(a.headers.get(he)??n,await a.text(),a.headers.get(Y));let l=await s(n);if(!l.ok||!o)return l;let c=await l.text(),f=l.headers.get(Y),i={[he]:l.url||n};return f&&(i[Y]=f),await o.put(n,new Response(c,{headers:i})).catch(()=>{}),me(l.url||n,c,f)}}var xe="bfwc:check",ye="bfwc:check-result",Ee="bfwc:check-error";var D=globalThis,nt=new _,st=ge(),we;function rt(s){if((!D.ts||we!==s)&&(D.importScripts(s),we=s),!D.ts)throw new Error(`${s} did not define the TypeScript compiler.`);return D.ts}D.addEventListener("message",s=>{let e=s.data;if(e?.type!==xe)return;let t=Date.now();(async()=>{try{let n=rt(e.typescriptUrl),r=await Z(n,e.files,{fetch:st,store:nt,sources:e.sources});D.postMessage({type:ye,id:e.id,result:r,durationMs:Date.now()-t})}catch(n){D.postMessage({type:Ee,id:e.id,message:n instanceof Error?n.message:String(n)})}})()});})();
|
package/dist/host.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { DevServer, VirtualFileSystem, type BuildResult, type Bundler, type ComponentCompilers, type FileTree, type PackageCdnFactory, type PortChange, type ProcessOptions, type ProjectProfile, type RuntimeProcess, type ServerAddress, type Transformer } from '@seanhogg/builderforce-webcontainers-core';
|
|
1
|
+
import { DevServer, PortCookieJars, VirtualFileSystem, type BuildResult, type Bundler, type ComponentCompilers, type FileTree, type PackageCdnFactory, type PortChange, type ProcessOptions, type ProjectProfile, type RuntimeProcess, type ServerAddress, type Transformer, type ZipExportOptions } from '@seanhogg/builderforce-webcontainers-core';
|
|
2
2
|
import { type WireResponse } from './protocol.js';
|
|
3
|
-
import { type NodeRuntimeOptions } from './node/index.js';
|
|
3
|
+
import { type NodeRuntimeOptions, type ProcessInfo } from './node/index.js';
|
|
4
|
+
import { type PreviewConsoleMessage, type PreviewError } from './previewMessages.js';
|
|
4
5
|
/** Serve previews on THIS page's origin. Only for code the page's own user trusts. */
|
|
5
6
|
export interface SameOriginOptions {
|
|
6
7
|
/** Where the host serves this package's `dist/sw.js` (e.g. `/__bfwc/sw.js`). */
|
|
@@ -36,14 +37,11 @@ export interface CommonRuntimeOptions {
|
|
|
36
37
|
attribution?: boolean;
|
|
37
38
|
/** Reload open previews when files change. Default true. */
|
|
38
39
|
liveReload?: boolean;
|
|
40
|
+
/** Your scripts (JavaScript source), run in every preview page before the app — analytics, test hooks, a mock `fetch`. */
|
|
41
|
+
previewScripts?: string[];
|
|
39
42
|
/** The Node runtime behind `run` (process workers, npm registry). */
|
|
40
43
|
node?: NodeRuntimeOptions;
|
|
41
44
|
}
|
|
42
|
-
export interface PreviewError {
|
|
43
|
-
message: string;
|
|
44
|
-
stack?: string;
|
|
45
|
-
href: string;
|
|
46
|
-
}
|
|
47
45
|
export interface RuntimeBuildOptions {
|
|
48
46
|
/** Where the site will be served from. Default `./` (works from any directory). */
|
|
49
47
|
base?: string;
|
|
@@ -56,8 +54,14 @@ export interface PreviewRuntime {
|
|
|
56
54
|
readonly url: string;
|
|
57
55
|
readonly fs: VirtualFileSystem;
|
|
58
56
|
readonly server: DevServer;
|
|
59
|
-
/** Write files into the runtime (nested or flat; see `FileTree`). Open previews reload. */
|
|
60
|
-
writeTree(files: FileTree): void;
|
|
57
|
+
/** Write files into the runtime (nested or flat; see `FileTree`), under `at` (default `/`). Open previews reload. */
|
|
58
|
+
writeTree(files: FileTree, at?: string): void;
|
|
59
|
+
/** The project as a zip — "Download project" with `exclude: ['node_modules']`, or a full snapshot to restore later. */
|
|
60
|
+
exportZip(options?: ZipExportOptions): Uint8Array;
|
|
61
|
+
/** Write a zip's contents (an `exportZip` snapshot, a downloaded template) into the runtime, under `at`. */
|
|
62
|
+
importZip(zip: Uint8Array, at?: string): void;
|
|
63
|
+
/** Reload every frame showing this preview now (live reload does this on edits by itself). */
|
|
64
|
+
reload(): void;
|
|
61
65
|
/** Whether this runtime can serve the mounted project, and why not. */
|
|
62
66
|
profile(): ProjectProfile;
|
|
63
67
|
/**
|
|
@@ -68,6 +72,10 @@ export interface PreviewRuntime {
|
|
|
68
72
|
build(options?: RuntimeBuildOptions): Promise<BuildResult>;
|
|
69
73
|
/** Uncaught errors and rejections raised inside the preview. */
|
|
70
74
|
onError(listener: (error: PreviewError) => void): () => void;
|
|
75
|
+
/** The preview's `console.log/info/warn/error/debug` output (first 1,000 messages per page load). */
|
|
76
|
+
onPreviewConsole(listener: (message: PreviewConsoleMessage) => void): () => void;
|
|
77
|
+
/** Replace the scripts run in preview pages; open previews reload to pick them up. */
|
|
78
|
+
setPreviewScripts(scripts: string[]): void;
|
|
71
79
|
/**
|
|
72
80
|
* Run a command — `node server.js`, `npm install`, `npm run dev`, `bfsh` for a
|
|
73
81
|
* terminal — in its own Web Worker. Pass `{ terminal: { cols, rows } }` when
|
|
@@ -79,6 +87,14 @@ export interface PreviewRuntime {
|
|
|
79
87
|
onServerListening(listener: (server: ServerAddress) => void): () => void;
|
|
80
88
|
/** A virtual server opened or closed its port. */
|
|
81
89
|
onPortChange(listener: (change: PortChange) => void): () => void;
|
|
90
|
+
/** Processes still running, with the ports their servers listen on. */
|
|
91
|
+
listProcesses(): ProcessInfo[];
|
|
92
|
+
/**
|
|
93
|
+
* Cookies virtual servers set, per port. A service worker cannot set cookies,
|
|
94
|
+
* so the runtime keeps them and sends them back on later requests (and
|
|
95
|
+
* WebSocket handshakes); inspect or `clear()` them here.
|
|
96
|
+
*/
|
|
97
|
+
readonly cookies: PortCookieJars;
|
|
82
98
|
dispose(): void;
|
|
83
99
|
}
|
|
84
100
|
export declare function toWire(reqId: number, served: Awaited<ReturnType<DevServer['handle']>>): {
|
package/dist/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
|
package/dist/host.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { DevServer,
|
|
2
|
-
import { PREVIEW_ID, isPortPath, isWireRequest, previewBase } from './protocol.js';
|
|
3
|
-
import {
|
|
1
|
+
import { DevServer, PortCookieJars, VirtualFileSystem, buildProject, exportZip, importZip, } from '@seanhogg/builderforce-webcontainers-core';
|
|
2
|
+
import { PREVIEW_ID, isPortPath, isWireCancel, isWireRequest, previewBase } from './protocol.js';
|
|
3
|
+
import { createPortResponder, createProcessHost } from './node/index.js';
|
|
4
|
+
import { listenToPreview } from './previewMessages.js';
|
|
5
|
+
import { listenToPreviewBridge } from './previewBridge.js';
|
|
4
6
|
import { relayTransport, sameOriginTransport } from './transport.js';
|
|
5
7
|
import { createEsbuildWasmBundler, createEsbuildWasmTransformer } from './esbuildWasm.js';
|
|
6
8
|
import { createCdnComponentCompilers } from './componentCompilers.js';
|
|
@@ -34,10 +36,12 @@ export async function startPreviewRuntime(options) {
|
|
|
34
36
|
const base = previewBase(transport.scope, id);
|
|
35
37
|
const fs = new VirtualFileSystem();
|
|
36
38
|
const components = options.components ?? createCdnComponentCompilers();
|
|
39
|
+
/** Run in every preview page: dev-server documents and pages virtual servers serve alike. */
|
|
40
|
+
let previewScripts = [...(options.previewScripts ?? [])];
|
|
37
41
|
let server;
|
|
38
42
|
try {
|
|
39
43
|
const transformer = options.transformer ?? (await createEsbuildWasmTransformer());
|
|
40
|
-
server = new DevServer({ fs, transformer, base, cdn: options.cdn, components, attribution: options.attribution });
|
|
44
|
+
server = new DevServer({ fs, transformer, base, cdn: options.cdn, components, attribution: options.attribution, previewScripts });
|
|
41
45
|
}
|
|
42
46
|
catch (error) {
|
|
43
47
|
transport.dispose();
|
|
@@ -47,14 +51,24 @@ export async function startPreviewRuntime(options) {
|
|
|
47
51
|
// In relay mode processes run on the preview origin (the relay starts them), never the host's.
|
|
48
52
|
const node = { ...options.node, createWorker: options.node?.createWorker ?? transport.createWorker?.bind(transport) };
|
|
49
53
|
const processes = createProcessHost({ fs, base, origin: transport.origin, previewUrl, options: node });
|
|
50
|
-
const
|
|
54
|
+
const cookies = new PortCookieJars();
|
|
55
|
+
let responder;
|
|
51
56
|
const attach = () => {
|
|
52
57
|
const channel = new MessageChannel();
|
|
58
|
+
const reply = (message, transfer) => channel.port1.postMessage(message, transfer);
|
|
59
|
+
// Virtual servers' responses stream (one responder per channel: request ids are per worker).
|
|
60
|
+
responder?.dispose();
|
|
61
|
+
const ports = (responder = createPortResponder(processes, { cookies, scripts: () => previewScripts }));
|
|
53
62
|
channel.port1.onmessage = async (event) => {
|
|
63
|
+
if (isWireCancel(event.data))
|
|
64
|
+
return ports.cancel(event.data.reqId);
|
|
54
65
|
if (!isWireRequest(event.data))
|
|
55
66
|
return;
|
|
56
|
-
const
|
|
57
|
-
|
|
67
|
+
const request = event.data;
|
|
68
|
+
if (isPortPath(request.path))
|
|
69
|
+
return ports.serve(request, reply);
|
|
70
|
+
const { message, transfer } = toWire(request.reqId, await server.handle(request.path, request.search));
|
|
71
|
+
reply(message, transfer);
|
|
58
72
|
};
|
|
59
73
|
transport.attach(id, channel.port2);
|
|
60
74
|
};
|
|
@@ -71,40 +85,40 @@ export async function startPreviewRuntime(options) {
|
|
|
71
85
|
clearTimeout(reloadTimer);
|
|
72
86
|
reloadTimer = setTimeout(() => transport.reload(base), RELOAD_DEBOUNCE_MS);
|
|
73
87
|
});
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (data?.type !== ERROR_MESSAGE_TYPE || typeof data.href !== 'string')
|
|
78
|
-
return;
|
|
79
|
-
if (event.origin !== transport.origin || !new URL(data.href).pathname.startsWith(base))
|
|
80
|
-
return; // another runtime's preview
|
|
81
|
-
const error = { message: String(data.message ?? ''), stack: data.stack, href: data.href };
|
|
82
|
-
for (const listener of errorListeners)
|
|
83
|
-
listener(error);
|
|
84
|
-
};
|
|
85
|
-
window.addEventListener('message', onWindowMessage);
|
|
88
|
+
const previewMessages = listenToPreview(window, transport.origin, base);
|
|
89
|
+
// WebSockets and document.cookie for virtual servers, which a service worker cannot carry.
|
|
90
|
+
const bridge = listenToPreviewBridge(window, transport.origin, base, { upgrade: (port, request) => processes.upgrade(port, request), cookies });
|
|
86
91
|
return {
|
|
87
92
|
id,
|
|
88
93
|
url: previewUrl,
|
|
89
94
|
fs,
|
|
90
95
|
server,
|
|
91
|
-
writeTree: (files) => fs.writeTree(files),
|
|
96
|
+
writeTree: (files, at) => fs.writeTree(files, at),
|
|
97
|
+
exportZip: (zipOptions) => exportZip(fs, zipOptions),
|
|
98
|
+
importZip: (zip, at) => importZip(fs, zip, at),
|
|
99
|
+
reload: () => transport.reload(base),
|
|
92
100
|
profile: () => server.profile(),
|
|
93
101
|
async build(buildOptions = {}) {
|
|
94
102
|
const bundler = options.bundler ?? (await createEsbuildWasmBundler());
|
|
95
103
|
return buildProject({ files: fs, bundler, cdn: options.cdn, components, base: buildOptions.base, minify: buildOptions.minify });
|
|
96
104
|
},
|
|
97
|
-
onError(listener)
|
|
98
|
-
|
|
99
|
-
|
|
105
|
+
onError: (listener) => previewMessages.onError(listener),
|
|
106
|
+
onPreviewConsole: (listener) => previewMessages.onConsole(listener),
|
|
107
|
+
setPreviewScripts(scripts) {
|
|
108
|
+
previewScripts = [...scripts];
|
|
109
|
+
server.setPreviewScripts(previewScripts);
|
|
110
|
+
transport.reload(base);
|
|
100
111
|
},
|
|
101
112
|
run: (command, args, runOptions) => processes.run(command, args, runOptions),
|
|
102
113
|
onServerListening: (listener) => processes.servers.onListening(listener),
|
|
103
114
|
onPortChange: (listener) => processes.servers.onPortChange(listener),
|
|
115
|
+
listProcesses: () => processes.list(),
|
|
116
|
+
cookies,
|
|
104
117
|
dispose() {
|
|
118
|
+
bridge.dispose();
|
|
119
|
+
responder?.dispose();
|
|
105
120
|
processes.dispose();
|
|
106
|
-
|
|
107
|
-
errorListeners.clear();
|
|
121
|
+
previewMessages.dispose();
|
|
108
122
|
clearTimeout(reloadTimer);
|
|
109
123
|
stopWatching?.();
|
|
110
124
|
stopReattach();
|
package/dist/host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
export { startPreviewRuntime } from './host.js';
|
|
2
|
-
export type { PreviewRuntimeOptions, SameOriginOptions, RelayOptions, CommonRuntimeOptions, PreviewRuntime,
|
|
2
|
+
export type { PreviewRuntimeOptions, SameOriginOptions, RelayOptions, CommonRuntimeOptions, PreviewRuntime, RuntimeBuildOptions, } from './host.js';
|
|
3
|
+
export { listenToPreview } from './previewMessages.js';
|
|
4
|
+
export { createSnapshotStore } from './snapshotStore.js';
|
|
5
|
+
export type { SnapshotStore, SnapshotStoreOptions } from './snapshotStore.js';
|
|
6
|
+
export type { PreviewError, PreviewConsoleMessage, ConsoleLevel, PreviewMessages } from './previewMessages.js';
|
|
7
|
+
export { listenToPreviewBridge } from './previewBridge.js';
|
|
8
|
+
export type { PreviewBridge, PreviewBridgeOptions, BridgePort } from './previewBridge.js';
|
|
3
9
|
export type { PreviewTransport } from './transport.js';
|
|
4
10
|
export { createEsbuildWasmTransformer, createEsbuildWasmBundler, loadEsbuildWasm } from './esbuildWasm.js';
|
|
5
11
|
export type { EsbuildWasmOptions } from './esbuildWasm.js';
|
|
6
12
|
export { createCdnComponentCompilers, defaultVueCompilerUrl, defaultSvelteCompilerUrl } from './componentCompilers.js';
|
|
7
13
|
export type { CdnComponentCompilerOptions } from './componentCompilers.js';
|
|
8
14
|
export { createCacheStoragePackageCache } from './packageCache.js';
|
|
9
|
-
export { ProcessHost, createWorkerProcess } from './node/index.js';
|
|
10
|
-
export type { NodeRuntimeOptions, ProcessHostOptions, WorkerLike } from './node/index.js';
|
|
15
|
+
export { ProcessHost, createWorkerProcess, servePortRequest, createPortResponder, openPortResponse, injectBridge } from './node/index.js';
|
|
16
|
+
export type { NodeRuntimeOptions, ProcessHostOptions, ProcessInfo, WorkerLike, PortResponder, PortResponderOptions, OpenedPortResponse } from './node/index.js';
|
|
11
17
|
export { createSwRouter } from './swRouter.js';
|
|
12
18
|
export type { SwRouter, SwRouterOptions, PortLike, PreviewTarget, RoutedResponse, RequestDetails } from './swRouter.js';
|
|
13
19
|
export { previewBase, previewPrefix, PREVIEW_SEGMENT, PREVIEW_ID, PORT_SEGMENT, isPortPath } from './protocol.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC3G,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACvH,YAAY,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1I,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAChK,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACxH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClH,cAAc,2CAA2C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
export { startPreviewRuntime } from './host.js';
|
|
2
|
+
export { listenToPreview } from './previewMessages.js';
|
|
3
|
+
export { createSnapshotStore } from './snapshotStore.js';
|
|
4
|
+
export { listenToPreviewBridge } from './previewBridge.js';
|
|
2
5
|
export { createEsbuildWasmTransformer, createEsbuildWasmBundler, loadEsbuildWasm } from './esbuildWasm.js';
|
|
3
6
|
export { createCdnComponentCompilers, defaultVueCompilerUrl, defaultSvelteCompilerUrl } from './componentCompilers.js';
|
|
4
7
|
export { createCacheStoragePackageCache } from './packageCache.js';
|
|
5
|
-
export { ProcessHost, createWorkerProcess } from './node/index.js';
|
|
8
|
+
export { ProcessHost, createWorkerProcess, servePortRequest, createPortResponder, openPortResponse, injectBridge } from './node/index.js';
|
|
6
9
|
export { createSwRouter } from './swRouter.js';
|
|
7
10
|
export { previewBase, previewPrefix, PREVIEW_SEGMENT, PREVIEW_ID, PORT_SEGMENT, isPortPath } from './protocol.js';
|
|
8
11
|
export * from '@seanhogg/builderforce-webcontainers-core';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAShD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,OAAO,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE3G,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEvH,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1I,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClH,cAAc,2CAA2C,CAAC"}
|
package/dist/node/index.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Glue between the preview runtime and the Node process host: options, the
|
|
3
3
|
* default Worker, and answering `/__port/<n>/…` preview requests from the
|
|
4
|
-
* virtual server listening on that port.
|
|
4
|
+
* virtual server listening on that port (portResponder.ts).
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import type { WireRequest, WireResponse } from '../protocol.js';
|
|
6
|
+
import type { VirtualFileSystem } from '@seanhogg/builderforce-webcontainers-core';
|
|
8
7
|
import { ProcessHost, type WorkerLike } from './processHost.js';
|
|
9
8
|
export { ProcessHost } from './processHost.js';
|
|
10
|
-
export type { ProcessHostOptions, WorkerLike } from './processHost.js';
|
|
9
|
+
export type { ProcessHostOptions, ProcessInfo, WorkerLike } from './processHost.js';
|
|
11
10
|
export { createWorkerProcess } from './workerProcess.js';
|
|
11
|
+
export { servePortRequest, createPortResponder, openPortResponse, injectBridge } from './portResponder.js';
|
|
12
|
+
export type { PortResponder, PortResponderOptions, OpenedPortResponse } from './portResponder.js';
|
|
12
13
|
export interface NodeRuntimeOptions {
|
|
13
14
|
/**
|
|
14
15
|
* Where this package's `dist/node/worker.js` is served. Default: resolved
|
|
@@ -34,9 +35,4 @@ export declare function createProcessHost(args: {
|
|
|
34
35
|
previewUrl: string;
|
|
35
36
|
options?: NodeRuntimeOptions;
|
|
36
37
|
}): ProcessHost;
|
|
37
|
-
/** Answer a preview request addressed to a virtual server. */
|
|
38
|
-
export declare function servePortRequest(host: ProcessHost, request: WireRequest): Promise<{
|
|
39
|
-
message: WireResponse;
|
|
40
|
-
transfer: Transferable[];
|
|
41
|
-
}>;
|
|
42
38
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3G,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAElG,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACzB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,UAAU,CAAC;IAChC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,EAAE,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAAG,WAAW,CAgB9J"}
|
package/dist/node/index.js
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Glue between the preview runtime and the Node process host: options, the
|
|
3
|
-
* default Worker, and answering `/__port/<n>/…` preview requests from the
|
|
4
|
-
* virtual server listening on that port.
|
|
5
|
-
*/
|
|
6
|
-
import { parsePortPath } from '@seanhogg/builderforce-webcontainers-core';
|
|
7
1
|
import { ProcessHost } from './processHost.js';
|
|
8
2
|
export { ProcessHost } from './processHost.js';
|
|
9
3
|
export { createWorkerProcess } from './workerProcess.js';
|
|
4
|
+
export { servePortRequest, createPortResponder, openPortResponse, injectBridge } from './portResponder.js';
|
|
10
5
|
export function createProcessHost(args) {
|
|
11
6
|
const { options = {} } = args;
|
|
12
7
|
const createWorker = options.createWorker ??
|
|
@@ -23,23 +18,4 @@ export function createProcessHost(args) {
|
|
|
23
18
|
killGraceMs: options.killGraceMs,
|
|
24
19
|
});
|
|
25
20
|
}
|
|
26
|
-
const TEXT = { 'content-type': 'text/plain; charset=utf-8', 'cache-control': 'no-store' };
|
|
27
|
-
/** Answer a preview request addressed to a virtual server. */
|
|
28
|
-
export async function servePortRequest(host, request) {
|
|
29
|
-
const target = parsePortPath(request.path);
|
|
30
|
-
const response = await host.request(target.port, {
|
|
31
|
-
method: request.method ?? 'GET',
|
|
32
|
-
url: target.path + request.search,
|
|
33
|
-
headers: request.headers ?? {},
|
|
34
|
-
body: request.body ? new Uint8Array(request.body) : null,
|
|
35
|
-
});
|
|
36
|
-
if (!response) {
|
|
37
|
-
return { message: { type: 'response', reqId: request.reqId, status: 502, headers: TEXT, body: `Nothing is listening on port ${target.port}. Start a server (node server.js) first.` }, transfer: [] };
|
|
38
|
-
}
|
|
39
|
-
const headers = {};
|
|
40
|
-
for (const [key, value] of Object.entries(response.headers))
|
|
41
|
-
headers[key] = Array.isArray(value) ? value.join(', ') : String(value);
|
|
42
|
-
const body = response.body.slice().buffer;
|
|
43
|
-
return { message: { type: 'response', reqId: request.reqId, status: response.status, headers, body }, transfer: [body] };
|
|
44
|
-
}
|
|
45
21
|
//# sourceMappingURL=index.js.map
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAsB3G,MAAM,UAAU,iBAAiB,CAAC,IAA+G;IAC/I,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IAC9B,MAAM,YAAY,GAChB,OAAO,CAAC,YAAY;QACpB,CAAC,GAAG,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAA0B,CAAC,CAAC;IACtI,OAAO,IAAI,WAAW,CAAC;QACrB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,YAAY;QACZ,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,WAAW,EAAE,IAAI,CAAC,IAAI;QACtB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Answering preview requests addressed to virtual servers (`/__port/<n>/…`).
|
|
3
|
+
* The request reaches the server carrying the cookies the host holds for that
|
|
4
|
+
* port; the response streams back to the service worker as the server writes
|
|
5
|
+
* it (head, then `chunk` messages, then `end`); its `Set-Cookie`s go into the
|
|
6
|
+
* jar (a service worker could not set them); and an HTML page gets the preview
|
|
7
|
+
* bridge — the WebSocket shim and `document.cookie` — injected after `<head>`.
|
|
8
|
+
*/
|
|
9
|
+
import { type PortCookieJars } from '@seanhogg/builderforce-webcontainers-core';
|
|
10
|
+
import type { WireReply, WireRequest, WireResponse } from '../protocol.js';
|
|
11
|
+
import type { ProcessHost } from './processHost.js';
|
|
12
|
+
export interface PortResponderOptions {
|
|
13
|
+
/** The runtime's cookie jars. Without them, the browser's own `Cookie` header passes through and `Set-Cookie` is lost. */
|
|
14
|
+
cookies?: PortCookieJars;
|
|
15
|
+
/** Inject the preview bridge (errors and console to the host, WebSocket shim, `document.cookie`) into HTML pages. Default true. */
|
|
16
|
+
bridge?: boolean;
|
|
17
|
+
/** The host's preview scripts, read per page so `setPreviewScripts` applies to virtual servers too. */
|
|
18
|
+
scripts?: () => readonly string[];
|
|
19
|
+
}
|
|
20
|
+
export interface OpenedPortResponse {
|
|
21
|
+
status: number;
|
|
22
|
+
/** Flattened for a `Response` (`Set-Cookie` removed — it went to the jar). */
|
|
23
|
+
headers: Record<string, string>;
|
|
24
|
+
body: ReadableStream<Uint8Array>;
|
|
25
|
+
}
|
|
26
|
+
/** Send a preview request to its virtual server; resolves with the head and a body that streams. */
|
|
27
|
+
export declare function openPortResponse(host: ProcessHost, request: WireRequest, options?: PortResponderOptions): Promise<OpenedPortResponse>;
|
|
28
|
+
/** Insert `script` into a streamed document, after `<head>` (see `bridgeInsertionPoint`), passing the rest through as it arrives. */
|
|
29
|
+
export declare function injectBridge(body: ReadableStream<Uint8Array>, script: string): ReadableStream<Uint8Array>;
|
|
30
|
+
/** Answer a preview request with the whole body (tests, simple hosts). The preview path streams instead: {@link createPortResponder}. */
|
|
31
|
+
export declare function servePortRequest(host: ProcessHost, request: WireRequest, options?: PortResponderOptions): Promise<{
|
|
32
|
+
message: WireResponse;
|
|
33
|
+
transfer: Transferable[];
|
|
34
|
+
}>;
|
|
35
|
+
export interface PortResponder {
|
|
36
|
+
/** Answer one preview request: post the head, then the body chunk by chunk as the server writes it. */
|
|
37
|
+
serve(request: WireRequest, post: (reply: WireReply, transfer: Transferable[]) => void): Promise<void>;
|
|
38
|
+
/** The preview stopped reading `reqId`: hang up on the server. */
|
|
39
|
+
cancel(reqId: number): void;
|
|
40
|
+
/** Hang up on every response still streaming. */
|
|
41
|
+
dispose(): void;
|
|
42
|
+
}
|
|
43
|
+
/** One per service-worker channel (request ids are unique within a channel). */
|
|
44
|
+
export declare function createPortResponder(host: ProcessHost, options?: PortResponderOptions): PortResponder;
|
|
45
|
+
//# sourceMappingURL=portResponder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portResponder.d.ts","sourceRoot":"","sources":["../../src/node/portResponder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAWL,KAAK,cAAc,EACpB,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,0HAA0H;IAC1H,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,mIAAmI;IACnI,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uGAAuG;IACvG,OAAO,CAAC,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;CAClC;AAQD,oGAAoG;AACpG,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgC/I;AAOD,qIAAqI;AACrI,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CA8BzG;AAKD,yIAAyI;AACzI,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAI5K;AAED,MAAM,WAAW,aAAa;IAC5B,uGAAuG;IACvG,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvG,kEAAkE;IAClE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iDAAiD;IACjD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa,CAmCpG"}
|