@tscircuit/eval 0.0.334 → 0.0.336
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/.github/workflows/bun-pver-release.yml +16 -4
- package/dist/blob-url.js +1 -1
- package/dist/eval/index.js +2 -2
- package/dist/lib/index.js +2 -2
- package/dist/webworker/entrypoint.js +1 -1
- package/package.json +1 -1
- package/tests/examples/example19-support-backwards-compat.test.tsx +31 -0
- package/webworker/transform-with-sucrase.ts +1 -1
|
@@ -367,7 +367,7 @@ ${n.map(({variableName:i,uniqueLocalName:r})=>` reactHotLoader.register(${i}, "
|
|
|
367
367
|
leaveModule(module);
|
|
368
368
|
})();`}process(){return!1}};var hPt=new Set(["break","case","catch","class","const","continue","debugger","default","delete","do","else","export","extends","finally","for","function","if","import","in","instanceof","new","return","super","switch","this","throw","try","typeof","var","void","while","with","yield","enum","implements","interface","let","package","private","protected","public","static","await","false","null","true"]);function hb(e){if(e.length===0||!Rs[e.charCodeAt(0)])return!1;for(let t=1;t<e.length;t++)if(!Gi[e.charCodeAt(t)])return!1;return!hPt.has(e)}var om=class extends bn{constructor(t,n,i){super(),this.rootTransformer=t,this.tokens=n,this.isImportsTransformEnabled=i}process(){return this.rootTransformer.processPossibleArrowParamEnd()||this.rootTransformer.processPossibleAsyncArrowWithTypeParams()||this.rootTransformer.processPossibleTypeRange()?!0:this.tokens.matches1(_._public)||this.tokens.matches1(_._protected)||this.tokens.matches1(_._private)||this.tokens.matches1(_._abstract)||this.tokens.matches1(_._readonly)||this.tokens.matches1(_._override)||this.tokens.matches1(_.nonNullAssertion)?(this.tokens.removeInitialToken(),!0):this.tokens.matches1(_._enum)||this.tokens.matches2(_._const,_._enum)?(this.processEnum(),!0):this.tokens.matches2(_._export,_._enum)||this.tokens.matches3(_._export,_._const,_._enum)?(this.processEnum(!0),!0):!1}processEnum(t=!1){for(this.tokens.removeInitialToken();this.tokens.matches1(_._const)||this.tokens.matches1(_._enum);)this.tokens.removeToken();let n=this.tokens.identifierName();this.tokens.removeToken(),t&&!this.isImportsTransformEnabled&&this.tokens.appendCode("export "),this.tokens.appendCode(`var ${n}; (function (${n})`),this.tokens.copyExpectedToken(_.braceL),this.processEnumBody(n),this.tokens.copyExpectedToken(_.braceR),t&&this.isImportsTransformEnabled?this.tokens.appendCode(`)(${n} || (exports.${n} = ${n} = {}));`):this.tokens.appendCode(`)(${n} || (${n} = {}));`)}processEnumBody(t){let n=null;for(;!this.tokens.matches1(_.braceR);){let{nameStringCode:i,variableName:r}=this.extractEnumKeyInfo(this.tokens.currentToken());this.tokens.removeInitialToken(),this.tokens.matches3(_.eq,_.string,_.comma)||this.tokens.matches3(_.eq,_.string,_.braceR)?this.processStringLiteralEnumMember(t,i,r):this.tokens.matches1(_.eq)?this.processExplicitValueEnumMember(t,i,r):this.processImplicitValueEnumMember(t,i,r,n),this.tokens.matches1(_.comma)&&this.tokens.removeToken(),r!=null?n=r:n=`${t}[${i}]`}}extractEnumKeyInfo(t){if(t.type===_.name){let n=this.tokens.identifierNameForToken(t);return{nameStringCode:`"${n}"`,variableName:hb(n)?n:null}}else if(t.type===_.string){let n=this.tokens.stringValueForToken(t);return{nameStringCode:this.tokens.code.slice(t.start,t.end),variableName:hb(n)?n:null}}else throw new Error("Expected name or string at beginning of enum element.")}processStringLiteralEnumMember(t,n,i){i!=null?(this.tokens.appendCode(`const ${i}`),this.tokens.copyToken(),this.tokens.copyToken(),this.tokens.appendCode(`; ${t}[${n}] = ${i};`)):(this.tokens.appendCode(`${t}[${n}]`),this.tokens.copyToken(),this.tokens.copyToken(),this.tokens.appendCode(";"))}processExplicitValueEnumMember(t,n,i){let r=this.tokens.currentToken().rhsEndIndex;if(r==null)throw new Error("Expected rhsEndIndex on enum assign.");if(i!=null){for(this.tokens.appendCode(`const ${i}`),this.tokens.copyToken();this.tokens.currentIndex()<r;)this.rootTransformer.processToken();this.tokens.appendCode(`; ${t}[${t}[${n}] = ${i}] = ${n};`)}else{for(this.tokens.appendCode(`${t}[${t}[${n}]`),this.tokens.copyToken();this.tokens.currentIndex()<r;)this.rootTransformer.processToken();this.tokens.appendCode(`] = ${n};`)}}processImplicitValueEnumMember(t,n,i,r){let o=r!=null?`${r} + 1`:"0";i!=null&&(this.tokens.appendCode(`const ${i} = ${o}; `),o=i),this.tokens.appendCode(`${t}[${t}[${n}] = ${o}] = ${n};`)}};var sm=class e{__init(){this.transformers=[]}__init2(){this.generatedVariables=[]}constructor(t,n,i,r){e.prototype.__init.call(this),e.prototype.__init2.call(this),this.nameManager=t.nameManager,this.helperManager=t.helperManager;let{tokenProcessor:o,importProcessor:s}=t;this.tokens=o,this.isImportsTransformEnabled=n.includes("imports"),this.isReactHotLoaderTransformEnabled=n.includes("react-hot-loader"),this.disableESTransforms=!!r.disableESTransforms,r.disableESTransforms||(this.transformers.push(new nm(o,this.nameManager)),this.transformers.push(new tm(o)),this.transformers.push(new em(o,this.nameManager))),n.includes("jsx")&&(r.jsxRuntime!=="preserve"&&this.transformers.push(new Ef(this,o,s,this.nameManager,r)),this.transformers.push(new im(this,o,s,r)));let a=null;if(n.includes("react-hot-loader")){if(!r.filePath)throw new Error("filePath is required when using the react-hot-loader transform.");a=new rm(o,r.filePath),this.transformers.push(a)}if(n.includes("imports")){if(s===null)throw new Error("Expected non-null importProcessor with imports transform enabled.");this.transformers.push(new Zf(this,o,s,this.nameManager,this.helperManager,a,i,!!r.enableLegacyTypeScriptModuleInterop,n.includes("typescript"),n.includes("flow"),!!r.preserveDynamicImport,!!r.keepUnusedImports))}else this.transformers.push(new Kf(o,this.nameManager,this.helperManager,a,n.includes("typescript"),n.includes("flow"),!!r.keepUnusedImports,r));n.includes("flow")&&this.transformers.push(new Jf(this,o,n.includes("imports"))),n.includes("typescript")&&this.transformers.push(new om(this,o,n.includes("imports"))),n.includes("jest")&&this.transformers.push(new Qf(this,o,this.nameManager,s))}transform(){this.tokens.reset(),this.processBalancedCode();let n=this.isImportsTransformEnabled?'"use strict";':"";for(let s of this.transformers)n+=s.getPrefixCode();n+=this.helperManager.emitHelpers(),n+=this.generatedVariables.map(s=>` var ${s};`).join("");for(let s of this.transformers)n+=s.getHoistedCode();let i="";for(let s of this.transformers)i+=s.getSuffixCode();let r=this.tokens.finish(),{code:o}=r;if(o.startsWith("#!")){let s=o.indexOf(`
|
|
369
369
|
`);return s===-1&&(s=o.length,o+=`
|
|
370
|
-
`),{code:o.slice(0,s+1)+n+o.slice(s+1)+i,mappings:this.shiftMappings(r.mappings,n.length)}}else return{code:n+o+i,mappings:this.shiftMappings(r.mappings,n.length)}}processBalancedCode(){let t=0,n=0;for(;!this.tokens.isAtEnd();){if(this.tokens.matches1(_.braceL)||this.tokens.matches1(_.dollarBraceL))t++;else if(this.tokens.matches1(_.braceR)){if(t===0)return;t--}if(this.tokens.matches1(_.parenL))n++;else if(this.tokens.matches1(_.parenR)){if(n===0)return;n--}this.processToken()}}processToken(){if(this.tokens.matches1(_._class)){this.processClass();return}for(let t of this.transformers)if(t.process())return;this.tokens.copyToken()}processNamedClass(){if(!this.tokens.matches2(_._class,_.name))throw new Error("Expected identifier for exported class name.");let t=this.tokens.identifierNameAtIndex(this.tokens.currentIndex()+1);return this.processClass(),t}processClass(){let t=mM(this,this.tokens,this.nameManager,this.disableESTransforms),n=(t.headerInfo.isExpression||!t.headerInfo.className)&&t.staticInitializerNames.length+t.instanceInitializerNames.length>0,i=t.headerInfo.className;n&&(i=this.nameManager.claimFreeName("_class"),this.generatedVariables.push(i),this.tokens.appendCode(` (${i} =`));let o=this.tokens.currentToken().contextId;if(o==null)throw new Error("Expected class to have a context ID.");for(this.tokens.copyExpectedToken(_._class);!this.tokens.matchesContextIdAndLabel(_.braceL,o);)this.processToken();this.processClassBody(t,i);let s=t.staticInitializerNames.map(a=>`${i}.${a}()`);n?this.tokens.appendCode(`, ${s.map(a=>`${a}, `).join("")}${i})`):t.staticInitializerNames.length>0&&this.tokens.appendCode(` ${s.map(a=>`${a};`).join(" ")}`)}processClassBody(t,n){let{headerInfo:i,constructorInsertPos:r,constructorInitializerStatements:o,fields:s,instanceInitializerNames:a,rangesToRemove:c}=t,l=0,u=0,p=this.tokens.currentToken().contextId;if(p==null)throw new Error("Expected non-null context ID on class.");this.tokens.copyExpectedToken(_.braceL),this.isReactHotLoaderTransformEnabled&&this.tokens.appendCode("__reactstandin__regenerateByEval(key, code) {this[key] = eval(code);}");let f=o.length+a.length>0;if(r===null&&f){let y=this.makeConstructorInitCode(o,a,n);if(i.hasSuperclass){let g=this.nameManager.claimFreeName("args");this.tokens.appendCode(`constructor(...${g}) { super(...${g}); ${y}; }`)}else this.tokens.appendCode(`constructor() { ${y}; }`)}for(;!this.tokens.matchesContextIdAndLabel(_.braceR,p);)if(l<s.length&&this.tokens.currentIndex()===s[l].start){let y=!1;for(this.tokens.matches1(_.bracketL)?this.tokens.copyTokenWithPrefix(`${s[l].initializerName}() {this`):this.tokens.matches1(_.string)||this.tokens.matches1(_.num)?(this.tokens.copyTokenWithPrefix(`${s[l].initializerName}() {this[`),y=!0):this.tokens.copyTokenWithPrefix(`${s[l].initializerName}() {this.`);this.tokens.currentIndex()<s[l].end;)y&&this.tokens.currentIndex()===s[l].equalsIndex&&this.tokens.appendCode("]"),this.processToken();this.tokens.appendCode("}"),l++}else if(u<c.length&&this.tokens.currentIndex()>=c[u].start){for(this.tokens.currentIndex()<c[u].end&&this.tokens.removeInitialToken();this.tokens.currentIndex()<c[u].end;)this.tokens.removeToken();u++}else this.tokens.currentIndex()===r?(this.tokens.copyToken(),f&&this.tokens.appendCode(`;${this.makeConstructorInitCode(o,a,n)};`),this.processToken()):this.processToken();this.tokens.copyExpectedToken(_.braceR)}makeConstructorInitCode(t,n,i){return[...t,...n.map(r=>`${i}.prototype.${r}.call(this)`)].join(";")}processPossibleArrowParamEnd(){if(this.tokens.matches2(_.parenR,_.colon)&&this.tokens.tokenAtRelativeIndex(1).isType){let t=this.tokens.currentIndex()+1;for(;this.tokens.tokens[t].isType;)t++;if(this.tokens.matches1AtIndex(t,_.arrow)){for(this.tokens.removeInitialToken();this.tokens.currentIndex()<t;)this.tokens.removeToken();return this.tokens.replaceTokenTrimmingLeftWhitespace(") =>"),!0}}return!1}processPossibleAsyncArrowWithTypeParams(){if(!this.tokens.matchesContextual(Z._async)&&!this.tokens.matches1(_._async))return!1;let t=this.tokens.tokenAtRelativeIndex(1);if(t.type!==_.lessThan||!t.isType)return!1;let n=this.tokens.currentIndex()+1;for(;this.tokens.tokens[n].isType;)n++;if(this.tokens.matches1AtIndex(n,_.parenL)){for(this.tokens.replaceToken("async ("),this.tokens.removeInitialToken();this.tokens.currentIndex()<n;)this.tokens.removeToken();return this.tokens.removeToken(),this.processBalancedCode(),this.processToken(),!0}return!1}processPossibleTypeRange(){if(this.tokens.currentToken().isType){for(this.tokens.removeInitialToken();this.tokens.currentToken().isType;)this.tokens.removeToken();return!0}return!1}shiftMappings(t,n){for(let i=0;i<t.length;i++){let r=t[i];r!==void 0&&(t[i]=r+n)}return t}};var dPt=Zt(EH());function yM(e){let t=new Set;for(let n=0;n<e.tokens.length;n++)e.matches1AtIndex(n,_._import)&&!e.matches3AtIndex(n,_._import,_.name,_.eq)&&fPt(e,n,t);return t}function fPt(e,t,n){t++,!e.matches1AtIndex(t,_.parenL)&&(e.matches1AtIndex(t,_.name)&&(n.add(e.identifierNameAtIndex(t)),t++,e.matches1AtIndex(t,_.comma)&&t++),e.matches1AtIndex(t,_.star)&&(t+=2,n.add(e.identifierNameAtIndex(t)),t++),e.matches1AtIndex(t,_.braceL)&&(t++,mPt(e,t,n)))}function mPt(e,t,n){for(;;){if(e.matches1AtIndex(t,_.braceR))return;let i=jo(e,t);if(t=i.endIndex,i.isType||n.add(i.rightName),e.matches2AtIndex(t,_.comma,_.braceR))return;if(e.matches1AtIndex(t,_.braceR))return;if(e.matches1AtIndex(t,_.comma))t++;else throw new Error(`Unexpected token: ${JSON.stringify(e.tokens[t])}`)}}function CH(e,t){UX(t);try{let n=yPt(e,t),r=new sm(n,t.transforms,!!t.enableLegacyBabel5ModuleInterop,t).transform(),o={code:r.code};if(t.sourceMapOptions){if(!t.filePath)throw new Error("filePath must be specified when generating a source map.");o={...o,sourceMap:vI(r,t.filePath,t.sourceMapOptions,e,n.tokenProcessor.tokens)}}return o}catch(n){throw t.filePath&&(n.message=`Error transforming ${t.filePath}: ${n.message}`),n}}function yPt(e,t){let n=t.transforms.includes("jsx"),i=t.transforms.includes("typescript"),r=t.transforms.includes("flow"),o=t.disableESTransforms===!0,s=PH(e,n,i,r),a=s.tokens,c=s.scopes,l=new Af(e,a),u=new $x(l),p=new Hf(e,a,r,o,u),f=!!t.enableLegacyTypeScriptModuleInterop,y=null;return t.transforms.includes("imports")?(y=new Cf(l,p,f,t,t.transforms.includes("typescript"),!!t.keepUnusedImports,u),y.preprocessTokens(),Bx(p,c,y.getGlobalNames()),t.transforms.includes("typescript")&&!t.keepUnusedImports&&y.pruneTypeOnlyImports()):t.transforms.includes("typescript")&&!t.keepUnusedImports&&Bx(p,c,yM(p)),{tokenProcessor:p,scopes:c,nameManager:l,importProcessor:y,helperManager:u}}var _Pt=new Set([".ts",".tsx",".mts",".cts"]),gPt=new Set([".tsx",".jsx"]),xPt=e=>{let t=e.indexOf("?"),n=e.indexOf("#"),i=e.length;return t!==-1&&n!==-1?i=Math.min(t,n):t!==-1?i=t:n!==-1&&(i=n),e.slice(0,i)},bPt=e=>{let t=xPt(e),n=t.lastIndexOf(".");return n===-1||Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"))>n?"":t.slice(n).toLowerCase()},vPt=e=>{let t=bPt(e),n=["imports"];return _Pt.has(t)&&n.unshift("typescript"),gPt.has(t)&&n.push("jsx"),n},cm=(e,t)=>{let n=vPt(t),{code:i}=CH(e,{filePath:t,production:!0,transforms:n});return i};var sh=(0,kH.default)("tsci:eval:import-local-file"),fb=async(e,t,n=0)=>{sh("importLocalFile called with:",{importName:e});let{fsMap:i,preSuppliedImports:r}=t,o=Cx(e,i);if(sh("fsPath:",o),!t.fsMap[o])throw sh("fsPath not found in fsMap:",o),new Error(`File "${o}" not found`);let s=i[o];if(sh("fileContent:",s?.slice(0,100)),o.endsWith(".json")){let a=JSON.parse(s);r[o]={__esModule:!0,default:a}}else if(iX(o)){let c=`${t.circuit.platform?.projectBaseUrl??""}/${o.startsWith("./")?o.slice(2):o}`;r[o]={__esModule:!0,default:c}}else if(o.endsWith(".tsx")||o.endsWith(".ts")){let a=kx(s);for(let c of a)r[c]||await El(c,t,n+1,{cwd:ho(o)});try{let c=cm(s,o);sh("evalCompiledJs called with:",{code:c.slice(0,100),dirname:ho(o)});let l=vl(c,r,ho(o));sh("importRunResult:",{fsPath:o,importRunResult:l}),r[o]=l.exports}catch(c){throw new Error(`Eval compiled js error for "${e}": ${c.message}`)}}else if(o.endsWith(".js"))r[o]=vl(cm(s,o),r,ho(o)).exports;else throw new Error(`Unsupported file extension "${o.split(".").pop()}" for "${o}"`)};async function AH(e,t,n=0){let{preSuppliedImports:i}=t,r=e.replace("@tsci/","").replace(".","/"),{cjs:o,error:s}=await globalThis.fetch(`${t.cjsRegistryUrl}/${r}`).then(async a=>({cjs:await a.text(),error:null})).catch(a=>({error:a,cjs:null}));if(s){console.error("Error fetching import",e,s);return}try{i[e]=vl(o,i).exports}catch(a){console.error("Error importing snippet",a)}}function wPt(e,t,n){return{fsMap:t,extensions:[".js",".jsx",".ts",".tsx",".json"],basePath:n,modulePath:e}}function SPt(e,t){let n=`${e}/package.json`;if(!t.fsMap[n])return null;try{return JSON.parse(t.fsMap[n])}catch{return null}}function gM(e,t){if(t.fsMap[e])return e;for(let n of t.extensions){let i=e.replace(/\.js$|\.jsx$/,"")+n;if(t.fsMap[i])return i}return null}function _M(e,t,n){let i=`${e}/${t.replace(/^\.\//,"")}`;return gM(i,n)}function PPt(e,t,n,i){if(!t.exports)return null;let r=t.exports["."];if(n===""&&r&&typeof r=="string"){let a=_M(e,r,i);if(a)return a}let o=n?t.exports[`./${n}`]:null;if(o&&typeof o=="string"){let a=_M(e,o,i);if(a)return a}let s=t.exports.import;if(n===""&&s&&typeof s=="string"){let a=_M(e,s,i);if(a)return a}return null}function TPt(e,t,n){let i=t.module||t.main||"index.js",r=`${e}/${i}`;return gM(r,n)}function IPt(e,t,n){if(!t){for(let o of n.extensions){let s=`${e}/index${o}`;if(n.fsMap[s])return s}return null}let i=`${e}/${t}`,r=gM(i,n);if(r)return r;for(let o of n.extensions){let s=`${i}/index${o}`;if(n.fsMap[s])return s}return null}function NH(e,t){let n=t.modulePath.split("/"),i=n[0].startsWith("@")?n.slice(0,2).join("/"):n[0],r=n.slice(i.includes("/")?2:1).join("/"),o=`${e=="."?"":`${e}/`}node_modules/${i}`,s=SPt(o,t);if(s){let l=PPt(o,s,r,t);if(l)return l;let u=TPt(o,s,t);if(u)return u}let a=IPt(o,r,t);if(a)return a;let c=ho(e);return c&&c!==e?NH(c,t):null}function mb(e,t,n){let i=wPt(e,t,n);return NH(i.basePath,i)}var RH=async(e,t,n=0)=>{let{preSuppliedImports:i}=t;if(i[e])return;let r=mb(e,t.fsMap,"");if(!r)throw new Error(`Node module "${e}" not found`);await fb(r,t,n),i[e]=i[r];let o=r.replace(/^node_modules\//,"");if(i[o]=i[r],r.endsWith("/index.tsx")||r.endsWith("/index.ts")||r.endsWith("/index.js")){let a=r.replace(/\/index\.(tsx?|js)$/,"").replace(/^node_modules\//,"");if(i[a]=i[r],a.startsWith("@")){let c=a.split("/");if(c.length>=2){let l=`${c[0]}/${c[1]}`;i[l]=i[r]}}}};var OH=Zt(Nn(),1);var MPt=(0,OH.default)("tsci:eval:import-npm-package");function EPt(e){let t="https://cdn.jsdelivr.net/npm/";return e.startsWith(t)?e.substring(t.length).replace(/\/\+esm$/,""):e}async function xM(e,t,n=0){MPt(`importing npm package: ${e}`);let{preSuppliedImports:i}=t;if(i[e])return;let r=`https://cdn.jsdelivr.net/npm/${e}/+esm`,o,{content:s,error:a}=await globalThis.fetch(r).then(async f=>{if(o=f.url,!f.ok)throw new Error(`Could not fetch "${e}" from jsdelivr: ${f.statusText}`);return{content:await f.text(),error:null}}).catch(f=>({error:f,content:null}));if(a)throw console.error("Error fetching npm import",e,a),a;let c=EPt(o),l=ho(c),u=kx(s);for(let f of u)i[f]||await El(f,t,n+1,{cwd:l});let p=cm(s,c||e);try{let f=vl(p,i,l).exports;i[e]=f,i[c]=f,i[o]=f}catch(f){throw new Error(`Eval npm package error for "${e}": ${f.message}`)}}var FH=Zt(Nn(),1),LH=(0,FH.default)("tsci:eval:import-eval-path");async function El(e,t,n=0,i={}){LH("importEvalPath called with:",{importName:e,depth:n,opts:i}),LH(`${" ".repeat(n)}\u27A1\uFE0F`,e);let{preSuppliedImports:r}=t;if(r[e]||e.startsWith("./")&&r[e.slice(2)])return;if(n>5){console.log("Max depth for imports reached");return}if(e.startsWith("/npm/")){let a=e.replace(/^\/npm\//,"").replace(/\/\+esm$/,"");await xM(a,t,n);let c=r[a];c&&(r[e]=c);return}let o=Pf(e,t.fsMap,i.cwd);if(o)return fb(o,t,n);if(mb(e,t.fsMap,i.cwd||""))return RH(e,t,n);if(e.startsWith("@tsci/"))return AH(e,t,n);if(!e.startsWith(".")&&!e.startsWith("/"))return xM(e,t,n);throw new Error(`Unresolved import "${e}" ${i.cwd?`from directory "${i.cwd}"`:""}`)}var zH=Zt(Nn(),1),CPt=(0,zH.default)("tsci:eval:setupDefaultEntrypointIfNeeded"),DH=e=>{if(!e.entrypoint&&!e.mainComponentPath)if("index.tsx"in e.fsMap)e.mainComponentPath="index.tsx";else if("index.ts"in e.fsMap)e.mainComponentPath="index.ts";else if(Object.keys(e.fsMap).filter(t=>t.endsWith(".tsx")).length===1)e.mainComponentPath=Object.keys(e.fsMap)[0];else if("tscircuit.config.json"in e.fsMap){let t=e.fsMap["tscircuit.config.json"];try{let n=JSON.parse(t);n.mainEntrypoint&&(e.entrypoint=n.mainEntrypoint)}catch(n){console.warn("Failed to parse tscircuit.config.json:",n)}}else throw new Error("Either entrypoint or mainComponentPath must be provided (no index file, could not infer entrypoint)");if(!e.entrypoint&&e.mainComponentPath){if(e.entrypoint="entrypoint.tsx",!e.fsMap[Cx(e.mainComponentPath,e.fsMap)])throw new Error(`Main component path "${e.mainComponentPath}" not found in fsMap. Available paths: ${Object.keys(e.fsMap).join(", ")}`);e.fsMap[e.entrypoint]=`
|
|
370
|
+
`),{code:o.slice(0,s+1)+n+o.slice(s+1)+i,mappings:this.shiftMappings(r.mappings,n.length)}}else return{code:n+o+i,mappings:this.shiftMappings(r.mappings,n.length)}}processBalancedCode(){let t=0,n=0;for(;!this.tokens.isAtEnd();){if(this.tokens.matches1(_.braceL)||this.tokens.matches1(_.dollarBraceL))t++;else if(this.tokens.matches1(_.braceR)){if(t===0)return;t--}if(this.tokens.matches1(_.parenL))n++;else if(this.tokens.matches1(_.parenR)){if(n===0)return;n--}this.processToken()}}processToken(){if(this.tokens.matches1(_._class)){this.processClass();return}for(let t of this.transformers)if(t.process())return;this.tokens.copyToken()}processNamedClass(){if(!this.tokens.matches2(_._class,_.name))throw new Error("Expected identifier for exported class name.");let t=this.tokens.identifierNameAtIndex(this.tokens.currentIndex()+1);return this.processClass(),t}processClass(){let t=mM(this,this.tokens,this.nameManager,this.disableESTransforms),n=(t.headerInfo.isExpression||!t.headerInfo.className)&&t.staticInitializerNames.length+t.instanceInitializerNames.length>0,i=t.headerInfo.className;n&&(i=this.nameManager.claimFreeName("_class"),this.generatedVariables.push(i),this.tokens.appendCode(` (${i} =`));let o=this.tokens.currentToken().contextId;if(o==null)throw new Error("Expected class to have a context ID.");for(this.tokens.copyExpectedToken(_._class);!this.tokens.matchesContextIdAndLabel(_.braceL,o);)this.processToken();this.processClassBody(t,i);let s=t.staticInitializerNames.map(a=>`${i}.${a}()`);n?this.tokens.appendCode(`, ${s.map(a=>`${a}, `).join("")}${i})`):t.staticInitializerNames.length>0&&this.tokens.appendCode(` ${s.map(a=>`${a};`).join(" ")}`)}processClassBody(t,n){let{headerInfo:i,constructorInsertPos:r,constructorInitializerStatements:o,fields:s,instanceInitializerNames:a,rangesToRemove:c}=t,l=0,u=0,p=this.tokens.currentToken().contextId;if(p==null)throw new Error("Expected non-null context ID on class.");this.tokens.copyExpectedToken(_.braceL),this.isReactHotLoaderTransformEnabled&&this.tokens.appendCode("__reactstandin__regenerateByEval(key, code) {this[key] = eval(code);}");let f=o.length+a.length>0;if(r===null&&f){let y=this.makeConstructorInitCode(o,a,n);if(i.hasSuperclass){let g=this.nameManager.claimFreeName("args");this.tokens.appendCode(`constructor(...${g}) { super(...${g}); ${y}; }`)}else this.tokens.appendCode(`constructor() { ${y}; }`)}for(;!this.tokens.matchesContextIdAndLabel(_.braceR,p);)if(l<s.length&&this.tokens.currentIndex()===s[l].start){let y=!1;for(this.tokens.matches1(_.bracketL)?this.tokens.copyTokenWithPrefix(`${s[l].initializerName}() {this`):this.tokens.matches1(_.string)||this.tokens.matches1(_.num)?(this.tokens.copyTokenWithPrefix(`${s[l].initializerName}() {this[`),y=!0):this.tokens.copyTokenWithPrefix(`${s[l].initializerName}() {this.`);this.tokens.currentIndex()<s[l].end;)y&&this.tokens.currentIndex()===s[l].equalsIndex&&this.tokens.appendCode("]"),this.processToken();this.tokens.appendCode("}"),l++}else if(u<c.length&&this.tokens.currentIndex()>=c[u].start){for(this.tokens.currentIndex()<c[u].end&&this.tokens.removeInitialToken();this.tokens.currentIndex()<c[u].end;)this.tokens.removeToken();u++}else this.tokens.currentIndex()===r?(this.tokens.copyToken(),f&&this.tokens.appendCode(`;${this.makeConstructorInitCode(o,a,n)};`),this.processToken()):this.processToken();this.tokens.copyExpectedToken(_.braceR)}makeConstructorInitCode(t,n,i){return[...t,...n.map(r=>`${i}.prototype.${r}.call(this)`)].join(";")}processPossibleArrowParamEnd(){if(this.tokens.matches2(_.parenR,_.colon)&&this.tokens.tokenAtRelativeIndex(1).isType){let t=this.tokens.currentIndex()+1;for(;this.tokens.tokens[t].isType;)t++;if(this.tokens.matches1AtIndex(t,_.arrow)){for(this.tokens.removeInitialToken();this.tokens.currentIndex()<t;)this.tokens.removeToken();return this.tokens.replaceTokenTrimmingLeftWhitespace(") =>"),!0}}return!1}processPossibleAsyncArrowWithTypeParams(){if(!this.tokens.matchesContextual(Z._async)&&!this.tokens.matches1(_._async))return!1;let t=this.tokens.tokenAtRelativeIndex(1);if(t.type!==_.lessThan||!t.isType)return!1;let n=this.tokens.currentIndex()+1;for(;this.tokens.tokens[n].isType;)n++;if(this.tokens.matches1AtIndex(n,_.parenL)){for(this.tokens.replaceToken("async ("),this.tokens.removeInitialToken();this.tokens.currentIndex()<n;)this.tokens.removeToken();return this.tokens.removeToken(),this.processBalancedCode(),this.processToken(),!0}return!1}processPossibleTypeRange(){if(this.tokens.currentToken().isType){for(this.tokens.removeInitialToken();this.tokens.currentToken().isType;)this.tokens.removeToken();return!0}return!1}shiftMappings(t,n){for(let i=0;i<t.length;i++){let r=t[i];r!==void 0&&(t[i]=r+n)}return t}};var dPt=Zt(EH());function yM(e){let t=new Set;for(let n=0;n<e.tokens.length;n++)e.matches1AtIndex(n,_._import)&&!e.matches3AtIndex(n,_._import,_.name,_.eq)&&fPt(e,n,t);return t}function fPt(e,t,n){t++,!e.matches1AtIndex(t,_.parenL)&&(e.matches1AtIndex(t,_.name)&&(n.add(e.identifierNameAtIndex(t)),t++,e.matches1AtIndex(t,_.comma)&&t++),e.matches1AtIndex(t,_.star)&&(t+=2,n.add(e.identifierNameAtIndex(t)),t++),e.matches1AtIndex(t,_.braceL)&&(t++,mPt(e,t,n)))}function mPt(e,t,n){for(;;){if(e.matches1AtIndex(t,_.braceR))return;let i=jo(e,t);if(t=i.endIndex,i.isType||n.add(i.rightName),e.matches2AtIndex(t,_.comma,_.braceR))return;if(e.matches1AtIndex(t,_.braceR))return;if(e.matches1AtIndex(t,_.comma))t++;else throw new Error(`Unexpected token: ${JSON.stringify(e.tokens[t])}`)}}function CH(e,t){UX(t);try{let n=yPt(e,t),r=new sm(n,t.transforms,!!t.enableLegacyBabel5ModuleInterop,t).transform(),o={code:r.code};if(t.sourceMapOptions){if(!t.filePath)throw new Error("filePath must be specified when generating a source map.");o={...o,sourceMap:vI(r,t.filePath,t.sourceMapOptions,e,n.tokenProcessor.tokens)}}return o}catch(n){throw t.filePath&&(n.message=`Error transforming ${t.filePath}: ${n.message}`),n}}function yPt(e,t){let n=t.transforms.includes("jsx"),i=t.transforms.includes("typescript"),r=t.transforms.includes("flow"),o=t.disableESTransforms===!0,s=PH(e,n,i,r),a=s.tokens,c=s.scopes,l=new Af(e,a),u=new $x(l),p=new Hf(e,a,r,o,u),f=!!t.enableLegacyTypeScriptModuleInterop,y=null;return t.transforms.includes("imports")?(y=new Cf(l,p,f,t,t.transforms.includes("typescript"),!!t.keepUnusedImports,u),y.preprocessTokens(),Bx(p,c,y.getGlobalNames()),t.transforms.includes("typescript")&&!t.keepUnusedImports&&y.pruneTypeOnlyImports()):t.transforms.includes("typescript")&&!t.keepUnusedImports&&Bx(p,c,yM(p)),{tokenProcessor:p,scopes:c,nameManager:l,importProcessor:y,helperManager:u}}var _Pt=new Set([".ts",".tsx",".mts",".cts"]),gPt=new Set([".tsx",".jsx",".ts"]),xPt=e=>{let t=e.indexOf("?"),n=e.indexOf("#"),i=e.length;return t!==-1&&n!==-1?i=Math.min(t,n):t!==-1?i=t:n!==-1&&(i=n),e.slice(0,i)},bPt=e=>{let t=xPt(e),n=t.lastIndexOf(".");return n===-1||Math.max(t.lastIndexOf("/"),t.lastIndexOf("\\"))>n?"":t.slice(n).toLowerCase()},vPt=e=>{let t=bPt(e),n=["imports"];return _Pt.has(t)&&n.unshift("typescript"),gPt.has(t)&&n.push("jsx"),n},cm=(e,t)=>{let n=vPt(t),{code:i}=CH(e,{filePath:t,production:!0,transforms:n});return i};var sh=(0,kH.default)("tsci:eval:import-local-file"),fb=async(e,t,n=0)=>{sh("importLocalFile called with:",{importName:e});let{fsMap:i,preSuppliedImports:r}=t,o=Cx(e,i);if(sh("fsPath:",o),!t.fsMap[o])throw sh("fsPath not found in fsMap:",o),new Error(`File "${o}" not found`);let s=i[o];if(sh("fileContent:",s?.slice(0,100)),o.endsWith(".json")){let a=JSON.parse(s);r[o]={__esModule:!0,default:a}}else if(iX(o)){let c=`${t.circuit.platform?.projectBaseUrl??""}/${o.startsWith("./")?o.slice(2):o}`;r[o]={__esModule:!0,default:c}}else if(o.endsWith(".tsx")||o.endsWith(".ts")){let a=kx(s);for(let c of a)r[c]||await El(c,t,n+1,{cwd:ho(o)});try{let c=cm(s,o);sh("evalCompiledJs called with:",{code:c.slice(0,100),dirname:ho(o)});let l=vl(c,r,ho(o));sh("importRunResult:",{fsPath:o,importRunResult:l}),r[o]=l.exports}catch(c){throw new Error(`Eval compiled js error for "${e}": ${c.message}`)}}else if(o.endsWith(".js"))r[o]=vl(cm(s,o),r,ho(o)).exports;else throw new Error(`Unsupported file extension "${o.split(".").pop()}" for "${o}"`)};async function AH(e,t,n=0){let{preSuppliedImports:i}=t,r=e.replace("@tsci/","").replace(".","/"),{cjs:o,error:s}=await globalThis.fetch(`${t.cjsRegistryUrl}/${r}`).then(async a=>({cjs:await a.text(),error:null})).catch(a=>({error:a,cjs:null}));if(s){console.error("Error fetching import",e,s);return}try{i[e]=vl(o,i).exports}catch(a){console.error("Error importing snippet",a)}}function wPt(e,t,n){return{fsMap:t,extensions:[".js",".jsx",".ts",".tsx",".json"],basePath:n,modulePath:e}}function SPt(e,t){let n=`${e}/package.json`;if(!t.fsMap[n])return null;try{return JSON.parse(t.fsMap[n])}catch{return null}}function gM(e,t){if(t.fsMap[e])return e;for(let n of t.extensions){let i=e.replace(/\.js$|\.jsx$/,"")+n;if(t.fsMap[i])return i}return null}function _M(e,t,n){let i=`${e}/${t.replace(/^\.\//,"")}`;return gM(i,n)}function PPt(e,t,n,i){if(!t.exports)return null;let r=t.exports["."];if(n===""&&r&&typeof r=="string"){let a=_M(e,r,i);if(a)return a}let o=n?t.exports[`./${n}`]:null;if(o&&typeof o=="string"){let a=_M(e,o,i);if(a)return a}let s=t.exports.import;if(n===""&&s&&typeof s=="string"){let a=_M(e,s,i);if(a)return a}return null}function TPt(e,t,n){let i=t.module||t.main||"index.js",r=`${e}/${i}`;return gM(r,n)}function IPt(e,t,n){if(!t){for(let o of n.extensions){let s=`${e}/index${o}`;if(n.fsMap[s])return s}return null}let i=`${e}/${t}`,r=gM(i,n);if(r)return r;for(let o of n.extensions){let s=`${i}/index${o}`;if(n.fsMap[s])return s}return null}function NH(e,t){let n=t.modulePath.split("/"),i=n[0].startsWith("@")?n.slice(0,2).join("/"):n[0],r=n.slice(i.includes("/")?2:1).join("/"),o=`${e=="."?"":`${e}/`}node_modules/${i}`,s=SPt(o,t);if(s){let l=PPt(o,s,r,t);if(l)return l;let u=TPt(o,s,t);if(u)return u}let a=IPt(o,r,t);if(a)return a;let c=ho(e);return c&&c!==e?NH(c,t):null}function mb(e,t,n){let i=wPt(e,t,n);return NH(i.basePath,i)}var RH=async(e,t,n=0)=>{let{preSuppliedImports:i}=t;if(i[e])return;let r=mb(e,t.fsMap,"");if(!r)throw new Error(`Node module "${e}" not found`);await fb(r,t,n),i[e]=i[r];let o=r.replace(/^node_modules\//,"");if(i[o]=i[r],r.endsWith("/index.tsx")||r.endsWith("/index.ts")||r.endsWith("/index.js")){let a=r.replace(/\/index\.(tsx?|js)$/,"").replace(/^node_modules\//,"");if(i[a]=i[r],a.startsWith("@")){let c=a.split("/");if(c.length>=2){let l=`${c[0]}/${c[1]}`;i[l]=i[r]}}}};var OH=Zt(Nn(),1);var MPt=(0,OH.default)("tsci:eval:import-npm-package");function EPt(e){let t="https://cdn.jsdelivr.net/npm/";return e.startsWith(t)?e.substring(t.length).replace(/\/\+esm$/,""):e}async function xM(e,t,n=0){MPt(`importing npm package: ${e}`);let{preSuppliedImports:i}=t;if(i[e])return;let r=`https://cdn.jsdelivr.net/npm/${e}/+esm`,o,{content:s,error:a}=await globalThis.fetch(r).then(async f=>{if(o=f.url,!f.ok)throw new Error(`Could not fetch "${e}" from jsdelivr: ${f.statusText}`);return{content:await f.text(),error:null}}).catch(f=>({error:f,content:null}));if(a)throw console.error("Error fetching npm import",e,a),a;let c=EPt(o),l=ho(c),u=kx(s);for(let f of u)i[f]||await El(f,t,n+1,{cwd:l});let p=cm(s,c||e);try{let f=vl(p,i,l).exports;i[e]=f,i[c]=f,i[o]=f}catch(f){throw new Error(`Eval npm package error for "${e}": ${f.message}`)}}var FH=Zt(Nn(),1),LH=(0,FH.default)("tsci:eval:import-eval-path");async function El(e,t,n=0,i={}){LH("importEvalPath called with:",{importName:e,depth:n,opts:i}),LH(`${" ".repeat(n)}\u27A1\uFE0F`,e);let{preSuppliedImports:r}=t;if(r[e]||e.startsWith("./")&&r[e.slice(2)])return;if(n>5){console.log("Max depth for imports reached");return}if(e.startsWith("/npm/")){let a=e.replace(/^\/npm\//,"").replace(/\/\+esm$/,"");await xM(a,t,n);let c=r[a];c&&(r[e]=c);return}let o=Pf(e,t.fsMap,i.cwd);if(o)return fb(o,t,n);if(mb(e,t.fsMap,i.cwd||""))return RH(e,t,n);if(e.startsWith("@tsci/"))return AH(e,t,n);if(!e.startsWith(".")&&!e.startsWith("/"))return xM(e,t,n);throw new Error(`Unresolved import "${e}" ${i.cwd?`from directory "${i.cwd}"`:""}`)}var zH=Zt(Nn(),1),CPt=(0,zH.default)("tsci:eval:setupDefaultEntrypointIfNeeded"),DH=e=>{if(!e.entrypoint&&!e.mainComponentPath)if("index.tsx"in e.fsMap)e.mainComponentPath="index.tsx";else if("index.ts"in e.fsMap)e.mainComponentPath="index.ts";else if(Object.keys(e.fsMap).filter(t=>t.endsWith(".tsx")).length===1)e.mainComponentPath=Object.keys(e.fsMap)[0];else if("tscircuit.config.json"in e.fsMap){let t=e.fsMap["tscircuit.config.json"];try{let n=JSON.parse(t);n.mainEntrypoint&&(e.entrypoint=n.mainEntrypoint)}catch(n){console.warn("Failed to parse tscircuit.config.json:",n)}}else throw new Error("Either entrypoint or mainComponentPath must be provided (no index file, could not infer entrypoint)");if(!e.entrypoint&&e.mainComponentPath){if(e.entrypoint="entrypoint.tsx",!e.fsMap[Cx(e.mainComponentPath,e.fsMap)])throw new Error(`Main component path "${e.mainComponentPath}" not found in fsMap. Available paths: ${Object.keys(e.fsMap).join(", ")}`);e.fsMap[e.entrypoint]=`
|
|
371
371
|
import * as UserComponents from "./${e.mainComponentPath}";
|
|
372
372
|
|
|
373
373
|
${e.mainComponentName?`
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tscircuit/eval",
|
|
3
3
|
"main": "dist/lib/index.js",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.336",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "bun run build:lib && bun run build:webworker && bun run build:blob-url && bun run build:runner && bun run build:worker-wrapper",
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createCircuitWebWorker } from "lib"
|
|
2
|
+
import { expect, test } from "bun:test"
|
|
3
|
+
|
|
4
|
+
test("support backwards compat for the `.ts` extension files", async () => {
|
|
5
|
+
const circuitWebWorker = await createCircuitWebWorker({
|
|
6
|
+
webWorkerUrl: new URL("../../webworker/entrypoint.ts", import.meta.url),
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
await circuitWebWorker.executeWithFsMap({
|
|
10
|
+
fsMap: {
|
|
11
|
+
"index.ts": `
|
|
12
|
+
circuit.add(
|
|
13
|
+
<board width="10mm" height="10mm">
|
|
14
|
+
<resistor name="R1" resistance="1k" />
|
|
15
|
+
</board>
|
|
16
|
+
)
|
|
17
|
+
`,
|
|
18
|
+
},
|
|
19
|
+
entrypoint: "index.ts",
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
await circuitWebWorker.renderUntilSettled()
|
|
23
|
+
|
|
24
|
+
const circuitJson = await circuitWebWorker.getCircuitJson()
|
|
25
|
+
|
|
26
|
+
const component = circuitJson.find((el: any) => el.name === "R1")
|
|
27
|
+
expect(component).toBeDefined()
|
|
28
|
+
expect(component?.type).toBe("source_component")
|
|
29
|
+
|
|
30
|
+
await circuitWebWorker.kill()
|
|
31
|
+
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { transform, type Transform as SucraseTransform } from "sucrase"
|
|
2
2
|
|
|
3
3
|
const TS_EXTENSIONS = new Set([".ts", ".tsx", ".mts", ".cts"])
|
|
4
|
-
const JSX_EXTENSIONS = new Set([".tsx", ".jsx"])
|
|
4
|
+
const JSX_EXTENSIONS = new Set([".tsx", ".jsx", ".ts"])
|
|
5
5
|
|
|
6
6
|
const stripQueryAndHash = (filePath: string) => {
|
|
7
7
|
const queryIndex = filePath.indexOf("?")
|