@platforma-sdk/tengo-builder 1.17.0 → 1.17.1

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/index.js CHANGED
@@ -3,10 +3,10 @@
3
3
  `;n.push({src:o,err:Error(a)});continue}switch(o.fullName.type){case"library":this.addLib(o),t.libs.push(o);break;case"software":this.addSoftware(o),t.software.push(o);break;case"asset":this.addAsset(o),t.assets.push(o);break;case"template":try{const a=this.compileAndAddTemplate(o);t.templates.push(a)}catch(a){let c=`Unsatisfied dependencies in ${m(o.fullName)}:
4
4
  `;c+=` - ${a.message}
5
5
  `,n.push({src:o,err:Error(c)})}break;case"test":break;default:x(o.fullName.type)}}if(r.length===n.length){let o="";for(const i of n)o+=`
6
- ${i.err.message}`;throw new Error(o)}r=n.map(({src:o})=>o)}return t}}const ue="[_a-zA-Z][_a-zA-Z0-9]*",F=(s,e)=>new RegExp(`\\b${s}\\.(?<fnCall>(?<fnName>`+e+')\\s*\\(\\s*"(?<templateName>[^"]+)"\\s*\\))'),Ze=s=>F(s,"getTemplateId"),Ke=s=>F(s,"getSoftwareInfo"),me=s=>F(s,"importTemplate"),ge=s=>F(s,"importSoftware"),Xe=s=>F(s,"importAsset"),Ye=/^\s*$/,He=/^\/\/tengo:/,Qe=/^\s*\/\/\s+tengo:/,et=/^\s*(\/\/)|(\/\*.*\*\/)/,tt=/^\s*\/\*/,st=/\*\//,Ne=/\s*:=\s*import\s*\(\s*"(?<moduleName>[^"]+)"\s*\)/,ot=new RegExp(`\\b(?<importName>${ue}(\\.${ue})*)${Ne.source}`),rt=/(?<pkgName>[^"]+)?:(?<depID>[^"]+)/,nt=s=>{const e=s.split(" "),t=e[0].split(":");if(t.length!=2)throw new Error("compiler option format is wrong: expect to have option name after 'tengo:' prefix, like 'tengo:MyOption'");return{name:t[1],args:e.slice(1)}};class oe{constructor(e,t,r,n,o,i){this.compileMode=e,this.fullName=t,this.src=r,this.srcName=n,this.dependencies=o,this.compilerOptions=i}}function $e(s,e,t,r,n){const o=be.readFileSync(t).toString(),{deps:i,normalized:a,opts:c}=it(s,o,r,n);return new oe(e,r,a,t,i.array,c)}function it(s,e,t,r){const n=Je(),o=[],i=e.split(`
6
+ ${i.err.message}`;throw new Error(o)}r=n.map(({src:o})=>o)}return t}}const ue="[_a-zA-Z][_a-zA-Z0-9]*",F=(s,e)=>new RegExp(`\\b${s}\\.(?<fnCall>(?<fnName>`+e+')\\s*\\(\\s*"(?<templateName>[^"]+)"\\s*\\))'),Ze=s=>F(s,"getTemplateId"),Ke=s=>F(s,"getSoftwareInfo"),me=s=>F(s,"importTemplate"),ge=s=>F(s,"importSoftware"),Xe=s=>F(s,"importAsset"),Ye=/^\s*$/,He=/^\/\/tengo:[\w]/,Qe=/^\s*\/\/\s*tengo:\s*./,et=/^\s*(\/\/)|(\/\*.*\*\/)/,tt=/^\s*\/\*/,st=/\*\//,Ne=/\s*:=\s*import\s*\(\s*"(?<moduleName>[^"]+)"\s*\)/,ot=new RegExp(`\\b(?<importName>${ue}(\\.${ue})*)${Ne.source}`),rt=/(?<pkgName>[^"]+)?:(?<depID>[^"]+)/,nt=s=>{const e=s.split(" "),t=e[0].split(":");if(t.length!=2)throw new Error("compiler option format is wrong: expect to have option name after 'tengo:' prefix, like 'tengo:MyOption'");return{name:t[1],args:e.slice(1)}};class oe{constructor(e,t,r,n,o,i){this.compileMode=e,this.fullName=t,this.src=r,this.srcName=n,this.dependencies=o,this.compilerOptions=i}}function $e(s,e,t,r,n){const o=be.readFileSync(t).toString(),{deps:i,normalized:a,opts:c}=it(s,o,r,n);return new oe(e,r,a,t,i.array,c)}function it(s,e,t,r){const n=Je(),o=[],i=e.split(`
7
7
  `),a=[];let c={isInCommentBlock:!1,canDetectOptions:!0,tplDepREs:new Map,lineNo:0};for(const u of i){c.lineNo++;try{const d=at(s,u,c,t.pkg,r);a.push(d.line),c=d.context,d.artifact&&n.add(d.artifact),d.option&&o.push(d.option)}catch(d){throw new Error(`[line ${c.lineNo}]: ${d.message}
8
8
  ${u}`)}}return{normalized:a.join(`
9
- `),deps:n,opts:o}}function at(s,e,t,r,n){if(t.isInCommentBlock)return st.exec(e)&&(t.isInCommentBlock=!1),{line:e,context:t,artifact:void 0,option:void 0};if(He.exec(e))return t.canDetectOptions?{line:e,context:t,artifact:void 0,option:nt(e)}:(s.warn(`[line ${t.lineNo}]: compiler option '//tengo:' was detected, but it cannot be applied as compiler options can be set only at the file header, before any code line'`),{line:e,context:t,artifact:void 0,option:void 0});if(Qe.exec(e)&&t.canDetectOptions)return s.warn(`[line ${t.lineNo}]: text simillar to compiler option ('//tengo:...') was detected, but it has wrong format. Leave it as is, if you did not mean to use a line as compiler option. Or format it to '//tengo:<option>' otherwise (no spaces between '//' and 'tengo', no spaces between ':' and option name)`),{line:e,context:t,artifact:void 0,option:void 0};if(et.exec(e))return{line:e,context:t,artifact:void 0,option:void 0};if(tt.exec(e))return t.isInCommentBlock=!0,{line:e,context:t,artifact:void 0,option:void 0};if(Ye.exec(e))return{line:e,context:t,artifact:void 0,option:void 0};t.canDetectOptions=!1;const o=Ne.exec(e);if(o){const i=lt(e);if(i.module==="plapi")return t.tplDepREs.has(i.module)||t.tplDepREs.set(i.module,[["template",Ze(i.alias)],["software",Ke(i.alias)]]),{line:e,context:t,artifact:void 0,option:void 0};(i.module==="@milaboratory/tengo-sdk:ll"||i.module==="@platforma-sdk/workflow-tengo:ll"||(r==="@milaboratory/tengo-sdk"||r==="@platforma-sdk/workflow-tengo")&&i.module===":ll")&&(t.tplDepREs.has(i.module)||t.tplDepREs.set(i.module,[["template",me(i.alias)],["software",ge(i.alias)]])),(i.module==="@milaboratory/tengo-sdk:assets"||i.module==="@platforma-sdk/workflow-tengo:assets"||(r==="@milaboratory/tengo-sdk"||r==="@platforma-sdk/workflow-tengo")&&i.module===":assets")&&(t.tplDepREs.has(i.module)||t.tplDepREs.set(i.module,[["template",me(i.alias)],["software",ge(i.alias)],["asset",Xe(i.alias)]]));const a=he(i.module,"library",r);return a?(e=e.replace(o[0],` := import("${a.pkg}:${a.id}")`),{line:e,context:t,artifact:a,option:void 0}):{line:e,context:t,artifact:void 0,option:void 0}}if(t.tplDepREs.size>0)for(const[i,a]of t.tplDepREs)for(const[c,u]of a){const d=u.exec(e);if(!d||!d.groups)continue;const{fnCall:b,templateName:y,fnName:v}=d.groups;if(!b||!y||!v)throw Error("failed to parse template import statement");const E=he(y,c,r);if(!E)throw Error(`failed to parse artifact name in ${v} import statement`);return e=e.replace(b,`${v}("${E.pkg}:${E.id}")`),{line:e,context:t,artifact:E,option:void 0}}return{line:e,context:t,artifact:void 0,option:void 0}}function lt(s){const e=ot.exec(s);if(!e||!e.groups)throw Error("failed to parse 'import' statement");const{importName:t,moduleName:r}=e.groups;if(!t||!r)throw Error("failed to parse 'import' statement");return{module:r,alias:t}}function he(s,e,t){const r=rt.exec(s);if(!r)return;if(!r.groups)throw Error("failed to parse dependency name inside 'import' statement. The dependency name should have format '<package>:<templateName>'");const{pkgName:n,depID:o}=r.groups;if(!o)throw Error("failed to parse dependency name inside 'import' statement. The dependency name should have format '<package>:<templateName>'");return{type:e,pkg:n??t,id:o}}const P=".plj.gz",z=".lib.tengo",q=".sw.json",J=".as.json",we=".test.tengo",U=".tpl.tengo",W=".lib.tengo",B=".sw.json",V=".as.json",ct=[W,U,B,V];function M(){return JSON.parse(p.readFileSync("package.json").toString())}function Se(s,e){return f.resolve(e,s,"tengo","lib")}function ke(s,e){return f.resolve(e,s,"tengo","tpl")}function Ae(s,e){return f.resolve(e,s,"tengo","software")}function Te(s,e){return f.resolve(e,s,"tengo","asset")}function De(s,e,t,r,n=!1){const o=f.resolve(r,"package.json");if(N(o)!=="file"){for(const ae of p.readdirSync(r)){const Fe=N(f.join(r,ae))==="link",le=f.resolve(r,ae);N(le)==="dir"&&De(s,e,t,le,Fe)}return}const i=Se("dist",r),a=ke("dist",r),c=Ae("dist",r),u=Te("dist",r),d=N(i)==="dir",b=N(a)==="dir",y=N(c)==="dir",v=N(u)==="dir";if(!d&&!b&&!y&&!v)return;const E=JSON.parse(p.readFileSync(o).toString());if(E.name!==t.name){if(N(f.resolve(r,"node_modules"))==="dir"&&n)throw new Error(`nested node_modules is a sign of library dependencies version incompatibility in ${r}`);d&&dt(s,E,"dist",i,e),b&&ft(s,E,"dist",a,e),y&&pt(s,E,"dist",c,e),v&&ut(s,E,"dist",u,e)}}function dt(s,e,t,r,n){for(const o of p.readdirSync(r)){const i=f.resolve(r,o);if(!o.endsWith(z))throw new Error(`unexpected file in 'lib' folder: ${i}`);const a={type:"library",pkg:e.name,id:o.slice(0,o.length-z.length),version:e.version},c=$e(s,t,i,a,!0);if(n.addLib(c),s.debug(`Adding dependency ${m(a)} from ${i}`),c.dependencies.length>0){s.debug("Dependencies:");for(const u of c.dependencies)s.debug(` - ${g(u)}`)}}}function ft(s,e,t,r,n){for(const o of p.readdirSync(r)){const i=f.resolve(r,o);if(!o.endsWith(P))throw new Error(`unexpected file in 'tpl' folder: ${i}`);const a={type:"template",pkg:e.name,id:o.slice(0,o.length-P.length),version:e.version},c=new Ee(t,a,{content:p.readFileSync(i)});n.addTemplate(c),s.debug(`Adding dependency ${m(a)} from ${i}`)}}function pt(s,e,t,r,n){for(const o of p.readdirSync(r)){const i=f.resolve(r,o);if(!o.endsWith(q))throw new Error(`unexpected file in 'software' folder: ${i}`);const a={type:"software",pkg:e.name,id:o.slice(0,o.length-q.length),version:e.version},c=new oe(t,a,p.readFileSync(i).toString(),i,[],[]);s.debug(`Adding dependency ${m(a)} from ${i}`),n.addSoftware(c)}}function ut(s,e,t,r,n){for(const o of p.readdirSync(r)){const i=f.resolve(r,o);if(!o.endsWith(J))throw new Error(`unexpected file in 'asset' folder: ${i}`);const a={type:"asset",pkg:e.name,id:o.slice(0,o.length-J.length),version:e.version},c=new oe(t,a,p.readFileSync(i).toString(),i,[],[]);s.debug(`Adding dependency ${m(a)} from ${i}`),n.addAsset(c)}}function R(s,e,t,r,n){const o=[];for(const i of p.readdirSync(f.join(r,n))){const a=f.join(n,i),c=f.join(r,a);if(N(c)==="dir"){const v=R(s,e,t,r,a);o.push(...v);continue}const u=i==="index.lib.tengo"?`${f.basename(n)}.lib.tengo`:a,d=mt(e,u.replaceAll(f.sep,"."));if(!d)continue;const b=f.resolve(r,a);s.debug(`Parsing ${m(d)} from ${b}`);const y=$e(s,t,b,d,!0);if(y.dependencies.length>0){s.debug("Detected dependencies:");for(const v of y.dependencies)s.debug(` - ${g(v)}`)}o.push(y)}return o}function re(s,e,t){const r=new Ve(t);return De(s,r,e,_e()),r}function mt(s,e){const t={pkg:s.name,version:s.version};return e.endsWith(W)?{...t,id:e.substring(0,e.length-W.length),type:"library"}:e.endsWith(U)?{...t,id:e.substring(0,e.length-U.length),type:"template"}:e.endsWith(B)?{...t,id:e.substring(0,e.length-B.length),type:"software"}:e.endsWith(V)?{...t,id:e.substring(0,e.length-V.length),type:"asset"}:e.endsWith(we)?{...t,id:e.substring(0,e.length-we.length),type:"test"}:null}function gt(s,e){const t=M(),r=re(s,t,e),n=R(s,t,e,"src","");if(n.length===0){const i=[];for(const a of ct)i.push(`*${a}`);s.error(`Nothing to compile. Looked for ${i.join(", ")}`),process.exit(1)}s.info(`Compiling '${e}'...`);const o=r.compileAndAdd(n);return s.debug("Done."),o}function ht(s,e,t){if(e.libs.length>0){const r=Se(t,".");p.mkdirSync(r,{recursive:!0});for(const n of e.libs){const o=f.resolve(r,n.fullName.id+z);s.info(` - writing ${o}`),p.writeFileSync(o,n.src)}}if(e.templates.length>0){const r=ke(t,".");p.mkdirSync(r,{recursive:!0});for(const n of e.templates){const o=f.resolve(r,n.fullName.id+P);s.info(` - writing ${o}`),p.writeFileSync(o,n.content)}}if(e.software.length>0){const r=Ae(t,".");p.mkdirSync(r,{recursive:!0});for(const n of e.software){const o=f.resolve(r,n.fullName.id+q);s.info(` - writing ${o}`),p.writeFileSync(o,n.src)}}if(e.assets.length>0){const r=Te(t,".");p.mkdirSync(r,{recursive:!0});for(const n of e.software){const o=f.resolve(r,n.fullName.id+J);s.info(` - writing ${o}`),p.writeFileSync(o,n.src)}}}const ne={"log-level":h.Flags.string({description:"logging level",default:"info",options:["error","warn","info","debug"]})},wt={"generate-tags":h.Flags.boolean({description:"generate tags, default false",default:!1}),"tags-file":h.Flags.file({description:'where to put ".tags" file, it should be a root of VS Code project',default:"../../.tags"}),"tags-additional-args":h.Flags.string({description:"additional flags for universal-ctags command: e.g. -e for emacs",default:[],multiple:!0,delimiter:","})},A=class A extends h.Command{async run(){const{flags:e}=await this.parse(A),t=$(e["log-level"]),r=M(),n=gt(t,"dist");ht(t,n,"dist"),t.info("");let o=`declare type TemplateFromFile = { readonly type: "from-file"; readonly path: string; };
9
+ `),deps:n,opts:o}}function at(s,e,t,r,n){if(t.isInCommentBlock)return st.exec(e)&&(t.isInCommentBlock=!1),{line:e,context:t,artifact:void 0,option:void 0};if(He.exec(e)){if(!t.canDetectOptions)throw s.error(`[line ${t.lineNo}]: compiler option '//tengo:' was detected, but it cannot be applied as compiler options can be set only at the file header, before any code line'`),new Error("tengo compiler options ('//tengo:' comments) can be set only in file header");return{line:e,context:t,artifact:void 0,option:nt(e)}}if(Qe.exec(e)&&t.canDetectOptions)return s.warn(`[line ${t.lineNo}]: text simillar to compiler option ('//tengo:...') was detected, but it has wrong format. Leave it as is, if you did not mean to use a line as compiler option. Or format it to '//tengo:<option>' otherwise (no spaces between '//' and 'tengo', no spaces between ':' and option name)`),{line:e,context:t,artifact:void 0,option:void 0};if(et.exec(e))return{line:e,context:t,artifact:void 0,option:void 0};if(tt.exec(e))return t.isInCommentBlock=!0,{line:e,context:t,artifact:void 0,option:void 0};if(Ye.exec(e))return{line:e,context:t,artifact:void 0,option:void 0};t.canDetectOptions=!1;const o=Ne.exec(e);if(o){const i=lt(e);if(i.module==="plapi")return t.tplDepREs.has(i.module)||t.tplDepREs.set(i.module,[["template",Ze(i.alias)],["software",Ke(i.alias)]]),{line:e,context:t,artifact:void 0,option:void 0};(i.module==="@milaboratory/tengo-sdk:ll"||i.module==="@platforma-sdk/workflow-tengo:ll"||(r==="@milaboratory/tengo-sdk"||r==="@platforma-sdk/workflow-tengo")&&i.module===":ll")&&(t.tplDepREs.has(i.module)||t.tplDepREs.set(i.module,[["template",me(i.alias)],["software",ge(i.alias)]])),(i.module==="@milaboratory/tengo-sdk:assets"||i.module==="@platforma-sdk/workflow-tengo:assets"||(r==="@milaboratory/tengo-sdk"||r==="@platforma-sdk/workflow-tengo")&&i.module===":assets")&&(t.tplDepREs.has(i.module)||t.tplDepREs.set(i.module,[["template",me(i.alias)],["software",ge(i.alias)],["asset",Xe(i.alias)]]));const a=he(i.module,"library",r);return a?(e=e.replace(o[0],` := import("${a.pkg}:${a.id}")`),{line:e,context:t,artifact:a,option:void 0}):{line:e,context:t,artifact:void 0,option:void 0}}if(t.tplDepREs.size>0)for(const[i,a]of t.tplDepREs)for(const[c,u]of a){const d=u.exec(e);if(!d||!d.groups)continue;const{fnCall:b,templateName:y,fnName:v}=d.groups;if(!b||!y||!v)throw Error("failed to parse template import statement");const E=he(y,c,r);if(!E)throw Error(`failed to parse artifact name in ${v} import statement`);return e=e.replace(b,`${v}("${E.pkg}:${E.id}")`),{line:e,context:t,artifact:E,option:void 0}}return{line:e,context:t,artifact:void 0,option:void 0}}function lt(s){const e=ot.exec(s);if(!e||!e.groups)throw Error("failed to parse 'import' statement");const{importName:t,moduleName:r}=e.groups;if(!t||!r)throw Error("failed to parse 'import' statement");return{module:r,alias:t}}function he(s,e,t){const r=rt.exec(s);if(!r)return;if(!r.groups)throw Error("failed to parse dependency name inside 'import' statement. The dependency name should have format '<package>:<templateName>'");const{pkgName:n,depID:o}=r.groups;if(!o)throw Error("failed to parse dependency name inside 'import' statement. The dependency name should have format '<package>:<templateName>'");return{type:e,pkg:n??t,id:o}}const P=".plj.gz",z=".lib.tengo",q=".sw.json",J=".as.json",we=".test.tengo",U=".tpl.tengo",W=".lib.tengo",B=".sw.json",V=".as.json",ct=[W,U,B,V];function M(){return JSON.parse(p.readFileSync("package.json").toString())}function Se(s,e){return f.resolve(e,s,"tengo","lib")}function ke(s,e){return f.resolve(e,s,"tengo","tpl")}function Ae(s,e){return f.resolve(e,s,"tengo","software")}function Te(s,e){return f.resolve(e,s,"tengo","asset")}function De(s,e,t,r,n=!1){const o=f.resolve(r,"package.json");if(N(o)!=="file"){for(const ae of p.readdirSync(r)){const Fe=N(f.join(r,ae))==="link",le=f.resolve(r,ae);N(le)==="dir"&&De(s,e,t,le,Fe)}return}const i=Se("dist",r),a=ke("dist",r),c=Ae("dist",r),u=Te("dist",r),d=N(i)==="dir",b=N(a)==="dir",y=N(c)==="dir",v=N(u)==="dir";if(!d&&!b&&!y&&!v)return;const E=JSON.parse(p.readFileSync(o).toString());if(E.name!==t.name){if(N(f.resolve(r,"node_modules"))==="dir"&&n)throw new Error(`nested node_modules is a sign of library dependencies version incompatibility in ${r}`);d&&dt(s,E,"dist",i,e),b&&ft(s,E,"dist",a,e),y&&pt(s,E,"dist",c,e),v&&ut(s,E,"dist",u,e)}}function dt(s,e,t,r,n){for(const o of p.readdirSync(r)){const i=f.resolve(r,o);if(!o.endsWith(z))throw new Error(`unexpected file in 'lib' folder: ${i}`);const a={type:"library",pkg:e.name,id:o.slice(0,o.length-z.length),version:e.version},c=$e(s,t,i,a,!0);if(n.addLib(c),s.debug(`Adding dependency ${m(a)} from ${i}`),c.dependencies.length>0){s.debug("Dependencies:");for(const u of c.dependencies)s.debug(` - ${g(u)}`)}}}function ft(s,e,t,r,n){for(const o of p.readdirSync(r)){const i=f.resolve(r,o);if(!o.endsWith(P))throw new Error(`unexpected file in 'tpl' folder: ${i}`);const a={type:"template",pkg:e.name,id:o.slice(0,o.length-P.length),version:e.version},c=new Ee(t,a,{content:p.readFileSync(i)});n.addTemplate(c),s.debug(`Adding dependency ${m(a)} from ${i}`)}}function pt(s,e,t,r,n){for(const o of p.readdirSync(r)){const i=f.resolve(r,o);if(!o.endsWith(q))throw new Error(`unexpected file in 'software' folder: ${i}`);const a={type:"software",pkg:e.name,id:o.slice(0,o.length-q.length),version:e.version},c=new oe(t,a,p.readFileSync(i).toString(),i,[],[]);s.debug(`Adding dependency ${m(a)} from ${i}`),n.addSoftware(c)}}function ut(s,e,t,r,n){for(const o of p.readdirSync(r)){const i=f.resolve(r,o);if(!o.endsWith(J))throw new Error(`unexpected file in 'asset' folder: ${i}`);const a={type:"asset",pkg:e.name,id:o.slice(0,o.length-J.length),version:e.version},c=new oe(t,a,p.readFileSync(i).toString(),i,[],[]);s.debug(`Adding dependency ${m(a)} from ${i}`),n.addAsset(c)}}function R(s,e,t,r,n){const o=[];for(const i of p.readdirSync(f.join(r,n))){const a=f.join(n,i),c=f.join(r,a);if(N(c)==="dir"){const v=R(s,e,t,r,a);o.push(...v);continue}const u=i==="index.lib.tengo"?`${f.basename(n)}.lib.tengo`:a,d=mt(e,u.replaceAll(f.sep,"."));if(!d)continue;const b=f.resolve(r,a);s.debug(`Parsing ${m(d)} from ${b}`);const y=$e(s,t,b,d,!0);if(y.dependencies.length>0){s.debug("Detected dependencies:");for(const v of y.dependencies)s.debug(` - ${g(v)}`)}o.push(y)}return o}function re(s,e,t){const r=new Ve(t);return De(s,r,e,_e()),r}function mt(s,e){const t={pkg:s.name,version:s.version};return e.endsWith(W)?{...t,id:e.substring(0,e.length-W.length),type:"library"}:e.endsWith(U)?{...t,id:e.substring(0,e.length-U.length),type:"template"}:e.endsWith(B)?{...t,id:e.substring(0,e.length-B.length),type:"software"}:e.endsWith(V)?{...t,id:e.substring(0,e.length-V.length),type:"asset"}:e.endsWith(we)?{...t,id:e.substring(0,e.length-we.length),type:"test"}:null}function gt(s,e){const t=M(),r=re(s,t,e),n=R(s,t,e,"src","");if(n.length===0){const i=[];for(const a of ct)i.push(`*${a}`);s.error(`Nothing to compile. Looked for ${i.join(", ")}`),process.exit(1)}s.info(`Compiling '${e}'...`);const o=r.compileAndAdd(n);return s.debug("Done."),o}function ht(s,e,t){if(e.libs.length>0){const r=Se(t,".");p.mkdirSync(r,{recursive:!0});for(const n of e.libs){const o=f.resolve(r,n.fullName.id+z);s.info(` - writing ${o}`),p.writeFileSync(o,n.src)}}if(e.templates.length>0){const r=ke(t,".");p.mkdirSync(r,{recursive:!0});for(const n of e.templates){const o=f.resolve(r,n.fullName.id+P);s.info(` - writing ${o}`),p.writeFileSync(o,n.content)}}if(e.software.length>0){const r=Ae(t,".");p.mkdirSync(r,{recursive:!0});for(const n of e.software){const o=f.resolve(r,n.fullName.id+q);s.info(` - writing ${o}`),p.writeFileSync(o,n.src)}}if(e.assets.length>0){const r=Te(t,".");p.mkdirSync(r,{recursive:!0});for(const n of e.software){const o=f.resolve(r,n.fullName.id+J);s.info(` - writing ${o}`),p.writeFileSync(o,n.src)}}}const ne={"log-level":h.Flags.string({description:"logging level",default:"info",options:["error","warn","info","debug"]})},wt={"generate-tags":h.Flags.boolean({description:"generate tags, default false",default:!1}),"tags-file":h.Flags.file({description:'where to put ".tags" file, it should be a root of VS Code project',default:"../../.tags"}),"tags-additional-args":h.Flags.string({description:"additional flags for universal-ctags command: e.g. -e for emacs",default:[],multiple:!0,delimiter:","})},A=class A extends h.Command{async run(){const{flags:e}=await this.parse(A),t=$(e["log-level"]),r=M(),n=gt(t,"dist");ht(t,n,"dist"),t.info("");let o=`declare type TemplateFromFile = { readonly type: "from-file"; readonly path: string; };
10
10
  `;o+=`declare type TplName = ${n.templates.map(d=>'"'+d.fullName.id+'"').join(" | ")};
11
11
  `,o+=`declare const Templates: Record<TplName, TemplateFromFile>;
12
12
  `,o+=`export { Templates };