@tailorkit/cli 0.1.0-beta.0 → 0.1.0-beta.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 +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -241,4 +241,4 @@ export interface CardProps {
|
|
|
241
241
|
export const Card = createRemoteComponent<CardProps, readonly ["header", "content", "footer"]>("Card", {
|
|
242
242
|
slots: ["header", "content", "footer"] as const,
|
|
243
243
|
});
|
|
244
|
-
`,ha=new oe({strictVariables:!0}),ga=(e,t)=>ha.parseAndRender(e,t),_a=e=>g(e,{recursive:!0}).then(()=>{}),va=async(e,t,n)=>{if(!n&&ne(e))throw Error(`${e} already exists. Use --force to overwrite it.`);await b(e,t,`utf-8`)},ya=async e=>{let{targetDirectory:t,force:n,formatting:r,hostUrl:i,linting:a,packageName:o,packageVersions:s,useWorkspaceDependencies:c}=e,l=c?`workspace:*`:s.tailorkitApp,u=c?`workspace:*`:s.tailorkitCLI,d=[],f=[];a&&(d.push(`pnpm run lint`),f.push(`pnpm run lint:fix`)),r&&(d.push(`pnpm run format`),f.push(`pnpm run format:fix`));let p={checkScript:d.join(` && `),fixScript:f.join(` && `),formatting:r,hostUrl:i,linting:a,oxfmtVersion:s.oxfmt,oxlintVersion:s.oxlint,packageName:o,preactVersion:s.preact,tailorkitAppVersion:l,tailorkitCLIVersion:u,typescriptVersion:s.typescript};await _a(C.join(t,`src`,`screens`));let m=[{template:oa,dest:`package.json`},{template:sa,dest:`tsconfig.json`},{template:ca,dest:`tailorkit.config.ts`},{template:la,dest:`.gitignore`},{template:ua,dest:`oxlint.config.ts`,condition:a},{template:da,dest:`oxfmt.config.ts`,condition:r},{template:fa,dest:C.join(`src`,`client.ts`)},{template:pa,dest:C.join(`src`,`screens`,`default.tsx`)},{template:ma,dest:C.join(`src`,`tailorkit.gen.ts`)}];await Promise.all(m.filter(e=>e.condition!==!1).map(async({template:e,dest:r})=>{let i=await ga(e,p);await va(C.join(t,r),i,n)}))},ba=`https://registry.npmjs.org`,xa=5e3,Sa={oxfmt:{fallback:`^0.46.0`,matcher:`^0`,packageName:`oxfmt`},oxlint:{fallback:`^1.61.0`,matcher:`^1`,packageName:`oxlint`},preact:{fallback:`^10.29.1`,matcher:`^10`,packageName:`preact`},tailorkitCLI:{fallback:`latest`,matcher:`^0`,packageName:`@tailorkit/cli`},tailorkitApp:{fallback:`latest`,matcher:`^0`,packageName:`@tailorkit/app`},typescript:{fallback:`^6.0.3`,matcher:`^6`,packageName:`typescript`}},Ca=e=>{let t=/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)$/u.exec(e);if(!t?.groups)return;let{major:n,minor:r,patch:i}=t.groups;if(!(!n||!r||!i))return{major:Number.parseInt(n,10),minor:Number.parseInt(r,10),patch:Number.parseInt(i,10),raw:e}},wa=(e,t)=>e.major===t.major?e.minor===t.minor?e.patch-t.patch:e.minor-t.minor:e.major-t.major,Ta=(e,t)=>{let n=/^\^(?<major>\d+)(?:\.(?<minor>\d+))?/u.exec(t);if(!n?.groups?.major)return!1;let r=Number.parseInt(n.groups.major,10),i=Number.parseInt(n.groups.minor??`0`,10);return e.major===r&&e.minor>=i},Ea=async({fallback:e,matcher:t,packageName:n})=>{try{let r=await fetch(`${ba}/${encodeURIComponent(n)}`,{signal:AbortSignal.timeout(xa)});if(!r.ok)return e;let i=await r.json(),a=Object.keys(i.versions??{}).map(Ca).filter(e=>e!==void 0).filter(e=>Ta(e,t)).toSorted(wa).at(-1);return a?`^${a.raw}`:e}catch{return e}},Da=async()=>{let[e,t,n,r,i,a]=await Promise.all([Ea(Sa.oxfmt),Ea(Sa.oxlint),Ea(Sa.preact),Ea(Sa.tailorkitCLI),Ea(Sa.tailorkitApp),Ea(Sa.typescript)]);return{oxfmt:e,oxlint:t,preact:n,tailorkitCLI:r,tailorkitApp:i,typescript:a}},Oa=[`pnpm`,`yarn`,`npm`,`bun`],ka=e=>Oa.includes(e),Aa=e=>e.trim().toLowerCase().replaceAll(/[^a-z0-9._/-]+/gu,`-`).replaceAll(/^-+|-+$/gu,``),ja=e=>(s(e)&&(i(`Init cancelled.`),process.exit(0)),e),Ma=(e,t)=>C.resolve(t,e??`.`),Na=async(e,t)=>{let n=Aa(C.basename(t))||`tailorkit-app`;return Aa(e===void 0?ja(await f({defaultValue:n,message:`Package name`,placeholder:n,validate:e=>Aa(e??``).length===0?`Enter a package name.`:void 0})):e)},Pa=async e=>{if(e!==void 0){if(ka(e))return e;throw Error(`--package-manager must be one of: ${Oa.join(`, `)}.`)}return ja(await u({initialValue:`pnpm`,message:`Package manager`,options:Oa.map(e=>({label:e,value:e}))}))},Fa=async e=>e===void 0?ja(await a({initialValue:!0,message:`Add linting with oxlint?`})):e,Ia=async e=>e===void 0?ja(await a({initialValue:!0,message:`Add formatting with oxfmt?`})):e,La=e=>{try{ti(e??``);return}catch{return`Enter a valid host URL.`}},Ra=async e=>{if(e!==void 0){let t=La(e);if(t!==void 0)throw Error(t);return ti(e)}let t=`https://example.com/api/tailorkit`;return ti(ja(await f({defaultValue:t,message:`Host URL`,placeholder:t,validate:La})))},za=async e=>e===void 0?ja(await a({initialValue:!0,message:`Install dependencies?`})):e,Ba=async(e,t)=>t||!ne(e)?t:ja(await a({initialValue:!1,message:`${m.cyan(e)} already exists. Overwrite matching files?`})),Va=(e,t,n)=>new Promise((r,i)=>{let a=ae(e,t,{cwd:n,stdio:`inherit`});a.on(`close`,r),a.on(`error`,i)}),Ha=async(e,t)=>{let n=d();n.start(`Installing dependencies with ${t}`);let r=await Va(t,[`install`],e);if(r!==0)throw n.stop(`Install failed.`),Error(`${t} install exited with code ${r}.`);n.stop(`Installed dependencies.`)},Ua=async(e,t)=>{let n=d();n.start(`Formatting project`);let r=await Va(t,[`run`,`format:fix`],e);if(r!==0)throw n.stop(`Formatting failed.`),Error(`${t} run format:fix exited with code ${r}.`);n.stop(`Formatted project.`)},Wa=async e=>{let t=Ma(e.directory,e.cwd),n=await Na(e.name,t),r=C.join(t,n),i=await Ba(r,e.force??!1),a=await Pa(e.packageManager),o=await Ra(e.host),s=await Fa(e.linting),c=await Ia(e.formatting),l=await za(e.install),u=d();u.start(`Resolving package versions`);let f=await Da();return u.stop(`Resolved package versions.`),await g(r,{recursive:!0}),await ya({force:i,formatting:c,hostUrl:o,linting:s,packageName:n,packageVersions:f,targetDirectory:r}),l&&(await Ha(r,a),c&&await Ua(r,a)),r},Ga={".css":`text/css; charset=utf-8`,".html":`text/html; charset=utf-8`,".js":`text/javascript; charset=utf-8`,".json":`application/json; charset=utf-8`,".map":`application/json; charset=utf-8`},Ka=e=>Ga[C.extname(e)]??`application/octet-stream`,qa=e=>{if(e===void 0)return;let t=Number.parseInt(String(e),10);if(!Number.isInteger(t)||t<=0)throw Error(`--port must be a positive integer.`);return t},Ja=e=>({configPath:e.config,cwd:String(e.cwd??`.`),entry:e.entry,host:e.host,mode:e.mode,outDir:e.outDir,port:qa(e.port)}),Ya=(e,t)=>T(async(n,r)=>{try{let i=new URL(n.url??`/`,`http://localhost`);if(i.pathname===`/apps`){r.writeHead(200,{"access-control-allow-origin":`*`,"content-type":`application/json; charset=utf-8`}),r.end(JSON.stringify(t));return}let a=decodeURIComponent(i.pathname),o=a===`/`?`client.js`:a.slice(1),s=C.resolve(e,o),c=C.relative(e,s);if(c.startsWith(`..`)||C.isAbsolute(c)){r.writeHead(403),r.end(`Forbidden`);return}if(!(await y(s).catch(()=>null))?.isFile()){r.writeHead(404),r.end(`Not found`);return}r.writeHead(200,{"access-control-allow-origin":`*`,"content-type":Ka(s)}),r.end(await _(s))}catch(e){r.writeHead(500),r.end(e instanceof Error?e.message:String(e))}}),Xa=async e=>{let t=C.join(e,`package.json`),n=JSON.parse(await _(t,`utf-8`)),r=typeof n.name==`string`?n.name:C.basename(e);return[{clientPath:`/client.js`,description:typeof n.description==`string`?n.description:void 0,id:r,name:typeof n.name==`string`?n.name:void 0}]},Za=async e=>{let t=await Me(e.configPath,e.cwd),n=C.resolve(t.root,e.outDir??t.config.build?.outDir??`.tailorkit`),r=e.host??`127.0.0.1`,i=e.port??4175,{buildApp:a}=await import(`./assets/builder-BWGULlBO.js`),o=await a({configPath:e.configPath,cwd:e.cwd,entry:e.entry,mode:e.mode,outDir:e.outDir,watch:!0}),s=()=>{o&&typeof o==`object`&&`close`in o&&o.close()},l=Ya(n,await Xa(t.root));await new Promise((e,t)=>{l.once(`error`,t),l.listen(i,r,e)}),l.removeAllListeners(`error`),process.once(`SIGINT`,()=>{s(),l.close(),process.exit(0)}),process.once(`SIGTERM`,()=>{s(),l.close(),process.exit(0)}),c.info(m.green(`Experimental preview running at http://${r}:${i}`)),c.info(m.dim(`Serving built worker assets from ${n}`))},Qa=e=>{let t=S();return t===`darwin`?{args:[e],command:`open`}:t===`win32`?{args:[`/c`,`start`,``,e],command:`cmd`}:{args:[e],command:`xdg-open`}},$a=e=>new Promise(t=>{let{args:n,command:r}=Qa(e),i=ae(r,n,{detached:!0,stdio:`ignore`,windowsHide:!0});i.once(`error`,()=>{t(!1)}),i.once(`spawn`,()=>{i.unref(),t(!0)})}),$=p(`tailorkit`),eo=e=>{if(e<1024)return`${e} B`;let t=[`KB`,`MB`,`GB`],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n.toFixed(n>=10?1:2)} ${t[r]}`};$.option(`--cwd <path>`,`Working directory`,{default:`.`}),$.command(`login`,`Authenticate the TailorKit CLI with a host app`).option(`--config <path>`,`Path to tailorkit config`).option(`--open`,`Open the approval URL in the default browser`,{default:!0}).option(`--timeout <seconds>`,`Seconds to wait for approval`,{default:1800}).action(async e=>{o(m.bold(`TailorKit`));let t=d(),n=!1;try{let r=Number.parseInt(String(e.timeout??`1800`),10);if(!Number.isInteger(r)||r<=0)throw Error(`--timeout must be a positive integer.`);await _i({configPath:e.config,cwd:String(e.cwd??`.`),timeout:r*1e3},({expiresAt:r,hostUrl:i,userCode:a})=>{let o=fi(i,a);e.open!==!1&&$a(o),c.info(`Enter this code in the host app: ${m.bold(a)}`),c.info(`Approval URL: ${m.cyan(o)}`),c.info(`Code expires at ${r.toLocaleString()}.`),c.info(`Waiting for approval...`),t.start(`Checking approval status`),n=!0}),n&&t.stop(`Approved.`),l(`Authenticated successfully.`)}catch(e){n&&t.stop(`Approval failed.`),c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`logout`,`Remove stored TailorKit CLI credentials for a host app`).option(`--config <path>`,`Path to tailorkit config`).action(async e=>{o(m.bold(`TailorKit`));try{let t=await yi({configPath:e.config,cwd:String(e.cwd??`.`)});l(t.removed?`Logged out of ${m.cyan(t.hostUrl)}.`:`No stored credentials found for ${m.cyan(t.hostUrl)}.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`whoami`,`Show the current TailorKit CLI authentication scope`).option(`--config <path>`,`Path to tailorkit config`).action(async e=>{o(m.bold(`TailorKit`));try{let t=await vi({configPath:e.config,cwd:String(e.cwd??`.`)});c.info(`Host: ${m.cyan(t.hostUrl)}`),c.info(`Scope: ${m.cyan(t.scopeId)}`),l(`Authenticated.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`deploy`,`Build and deploy the TailorKit app`).option(`--config <path>`,`Path to tailorkit config`).option(`--entry <path>`,`Client entry file`).option(`--out-dir <path>`,`Build output directory`).option(`--mode <mode>`,`Vite mode`).action(async e=>{o(m.bold(`TailorKit`));let t=d();try{t.start(`Building and deploying app`);let n=await Pi({configPath:e.config,cwd:String(e.cwd??`.`),entry:e.entry,mode:e.mode,onMissingAppId:async({appName:e,configPath:n,hostUrl:r,reason:i})=>{t.stop(`App not linked.`),c.info(i===`missing`?`No appId found in ${m.cyan(n)}.`:`The appId in ${m.cyan(n)} does not exist.`),c.info(`Host: ${m.cyan(r)}`);let o=await a({initialValue:!0,message:i===`missing`?`Create a TailorKit app named ${e}?`:`Create a new TailorKit app named ${e} and update the config?`});return!s(o)&&(o&&t.start(`Creating app and deploying`),o)},onTypecheckFailed:async({command:e,output:n})=>{t.stop(`Type check failed.`),c.error(`Type check failed while running ${m.cyan(e)}.`),n&&c.error(n);let r=await a({initialValue:!1,message:`Type check failed, but the app built successfully. Upload anyway?`});return!s(r)&&(r&&t.start(`Uploading app`),r)},outDir:e.outDir});t.stop(`Deployed app.`),n.createdApp&&c.info(`Created app and updated tailorkit.config.ts with ${m.cyan(n.appId)}.`),c.info(`Host: ${m.cyan(n.hostUrl)}`),c.info(`App: ${m.cyan(n.appId)}`),c.info(`Deployment: ${m.cyan(n.deploymentId)}`),c.info(`Uploaded files:`);for(let e of n.uploadedFiles)c.info(` ${m.cyan(e.path)} ${m.dim(`${eo(e.size)} raw, ${eo(e.gzipSize)} gzip`)}`);n.status&&c.info(`Status: ${m.cyan(n.status)}`),l(`Deployment published.`)}catch(e){t.stop(`Deployment failed.`),c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`build`,`Build the TailorKit app`).option(`--config <path>`,`Path to tailorkit config`).option(`--entry <path>`,`Client entry file`).option(`--out-dir <path>`,`Build output directory`).option(`--mode <mode>`,`Vite mode`).action(async e=>{o(m.bold(`TailorKit`));try{let{buildApp:t}=await import(`./assets/builder-BWGULlBO.js`);await t({configPath:e.config,cwd:String(e.cwd??`.`),entry:e.entry,mode:e.mode,outDir:e.outDir}),l(`Built app.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`experimental-preview`,`Build and preview the TailorKit worker`).option(`--config <path>`,`Path to tailorkit config`).option(`--entry <path>`,`Client entry file`).option(`--out-dir <path>`,`Build output directory`).option(`--host <host>`,`Preview host`).option(`--port <port>`,`Preview port`).option(`--mode <mode>`,`Vite mode`).action(async e=>{o(m.bold(`TailorKit`));try{await Za(Ja(e))}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`generate`,`Generate TailorKit app bindings`).option(`--config <path>`,`Path to tailorkit config`).option(`--out <path>`,`Generated TypeScript output file`).action(async e=>{o(m.bold(`TailorKit`));try{let t=await aa({configPath:e.config,cwd:String(e.cwd??`.`),outFile:e.out});l(`Generated ${m.cyan(t)}.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`init [directory]`,`Create a new TailorKit app`).option(`--name <name>`,`Package name`).option(`--host <url>`,`TailorKit host URL`).option(`--package-manager <pm>`,`Package manager: bun, yarn, pnpm, or npm`).option(`--lint`,`Add oxlint (use --no-lint to skip)`).option(`--format`,`Add oxfmt (use --no-format to skip)`).option(`--install`,`Install dependencies after scaffolding (use --no-install to skip)`).option(`--force`,`Overwrite existing files`).action(async(e,t)=>{o(m.bold(`TailorKit`));try{let n=await Wa({cwd:String(t.cwd??`.`),directory:e,force:t.force,formatting:t.format,host:t.host,install:t.install,linting:t.lint,name:t.name,packageManager:t.packageManager});l(`Created app at ${m.cyan(n)}.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.help(),$.version(`0.1.0-beta.0`),$.parse();export{Me as t};
|
|
244
|
+
`,ha=new oe({strictVariables:!0}),ga=(e,t)=>ha.parseAndRender(e,t),_a=e=>g(e,{recursive:!0}).then(()=>{}),va=async(e,t,n)=>{if(!n&&ne(e))throw Error(`${e} already exists. Use --force to overwrite it.`);await b(e,t,`utf-8`)},ya=async e=>{let{targetDirectory:t,force:n,formatting:r,hostUrl:i,linting:a,packageName:o,packageVersions:s,useWorkspaceDependencies:c}=e,l=c?`workspace:*`:s.tailorkitApp,u=c?`workspace:*`:s.tailorkitCLI,d=[],f=[];a&&(d.push(`pnpm run lint`),f.push(`pnpm run lint:fix`)),r&&(d.push(`pnpm run format`),f.push(`pnpm run format:fix`));let p={checkScript:d.join(` && `),fixScript:f.join(` && `),formatting:r,hostUrl:i,linting:a,oxfmtVersion:s.oxfmt,oxlintVersion:s.oxlint,packageName:o,preactVersion:s.preact,tailorkitAppVersion:l,tailorkitCLIVersion:u,typescriptVersion:s.typescript};await _a(C.join(t,`src`,`screens`));let m=[{template:oa,dest:`package.json`},{template:sa,dest:`tsconfig.json`},{template:ca,dest:`tailorkit.config.ts`},{template:la,dest:`.gitignore`},{template:ua,dest:`oxlint.config.ts`,condition:a},{template:da,dest:`oxfmt.config.ts`,condition:r},{template:fa,dest:C.join(`src`,`client.ts`)},{template:pa,dest:C.join(`src`,`screens`,`default.tsx`)},{template:ma,dest:C.join(`src`,`tailorkit.gen.ts`)}];await Promise.all(m.filter(e=>e.condition!==!1).map(async({template:e,dest:r})=>{let i=await ga(e,p);await va(C.join(t,r),i,n)}))},ba=`https://registry.npmjs.org`,xa=5e3,Sa={oxfmt:{fallback:`^0.46.0`,matcher:`^0`,packageName:`oxfmt`},oxlint:{fallback:`^1.61.0`,matcher:`^1`,packageName:`oxlint`},preact:{fallback:`^10.29.1`,matcher:`^10`,packageName:`preact`},tailorkitCLI:{fallback:`latest`,matcher:`^0`,packageName:`@tailorkit/cli`},tailorkitApp:{fallback:`latest`,matcher:`^0`,packageName:`@tailorkit/app`},typescript:{fallback:`^6.0.3`,matcher:`^6`,packageName:`typescript`}},Ca=e=>{let t=/^(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)$/u.exec(e);if(!t?.groups)return;let{major:n,minor:r,patch:i}=t.groups;if(!(!n||!r||!i))return{major:Number.parseInt(n,10),minor:Number.parseInt(r,10),patch:Number.parseInt(i,10),raw:e}},wa=(e,t)=>e.major===t.major?e.minor===t.minor?e.patch-t.patch:e.minor-t.minor:e.major-t.major,Ta=(e,t)=>{let n=/^\^(?<major>\d+)(?:\.(?<minor>\d+))?/u.exec(t);if(!n?.groups?.major)return!1;let r=Number.parseInt(n.groups.major,10),i=Number.parseInt(n.groups.minor??`0`,10);return e.major===r&&e.minor>=i},Ea=async({fallback:e,matcher:t,packageName:n})=>{try{let r=await fetch(`${ba}/${encodeURIComponent(n)}`,{signal:AbortSignal.timeout(xa)});if(!r.ok)return e;let i=await r.json(),a=Object.keys(i.versions??{}).map(Ca).filter(e=>e!==void 0).filter(e=>Ta(e,t)).toSorted(wa).at(-1);return a?`^${a.raw}`:e}catch{return e}},Da=async()=>{let[e,t,n,r,i,a]=await Promise.all([Ea(Sa.oxfmt),Ea(Sa.oxlint),Ea(Sa.preact),Ea(Sa.tailorkitCLI),Ea(Sa.tailorkitApp),Ea(Sa.typescript)]);return{oxfmt:e,oxlint:t,preact:n,tailorkitCLI:r,tailorkitApp:i,typescript:a}},Oa=[`pnpm`,`yarn`,`npm`,`bun`],ka=e=>Oa.includes(e),Aa=e=>e.trim().toLowerCase().replaceAll(/[^a-z0-9._/-]+/gu,`-`).replaceAll(/^-+|-+$/gu,``),ja=e=>(s(e)&&(i(`Init cancelled.`),process.exit(0)),e),Ma=(e,t)=>C.resolve(t,e??`.`),Na=async(e,t)=>{let n=Aa(C.basename(t))||`tailorkit-app`;return Aa(e===void 0?ja(await f({defaultValue:n,message:`Package name`,placeholder:n,validate:e=>Aa(e??``).length===0?`Enter a package name.`:void 0})):e)},Pa=async e=>{if(e!==void 0){if(ka(e))return e;throw Error(`--package-manager must be one of: ${Oa.join(`, `)}.`)}return ja(await u({initialValue:`pnpm`,message:`Package manager`,options:Oa.map(e=>({label:e,value:e}))}))},Fa=async e=>e===void 0?ja(await a({initialValue:!0,message:`Add linting with oxlint?`})):e,Ia=async e=>e===void 0?ja(await a({initialValue:!0,message:`Add formatting with oxfmt?`})):e,La=e=>{try{ti(e??``);return}catch{return`Enter a valid host URL.`}},Ra=async e=>{if(e!==void 0){let t=La(e);if(t!==void 0)throw Error(t);return ti(e)}let t=`https://example.com/api/tailorkit`;return ti(ja(await f({defaultValue:t,message:`Host URL`,placeholder:t,validate:La})))},za=async e=>e===void 0?ja(await a({initialValue:!0,message:`Install dependencies?`})):e,Ba=async(e,t)=>t||!ne(e)?t:ja(await a({initialValue:!1,message:`${m.cyan(e)} already exists. Overwrite matching files?`})),Va=(e,t,n)=>new Promise((r,i)=>{let a=ae(e,t,{cwd:n,stdio:`inherit`});a.on(`close`,r),a.on(`error`,i)}),Ha=async(e,t)=>{let n=d();n.start(`Installing dependencies with ${t}`);let r=await Va(t,[`install`],e);if(r!==0)throw n.stop(`Install failed.`),Error(`${t} install exited with code ${r}.`);n.stop(`Installed dependencies.`)},Ua=async(e,t)=>{let n=d();n.start(`Formatting project`);let r=await Va(t,[`run`,`format:fix`],e);if(r!==0)throw n.stop(`Formatting failed.`),Error(`${t} run format:fix exited with code ${r}.`);n.stop(`Formatted project.`)},Wa=async e=>{let t=Ma(e.directory,e.cwd),n=await Na(e.name,t),r=C.join(t,n),i=await Ba(r,e.force??!1),a=await Pa(e.packageManager),o=await Ra(e.host),s=await Fa(e.linting),c=await Ia(e.formatting),l=await za(e.install),u=d();u.start(`Resolving package versions`);let f=await Da();return u.stop(`Resolved package versions.`),await g(r,{recursive:!0}),await ya({force:i,formatting:c,hostUrl:o,linting:s,packageName:n,packageVersions:f,targetDirectory:r}),l&&(await Ha(r,a),c&&await Ua(r,a)),r},Ga={".css":`text/css; charset=utf-8`,".html":`text/html; charset=utf-8`,".js":`text/javascript; charset=utf-8`,".json":`application/json; charset=utf-8`,".map":`application/json; charset=utf-8`},Ka=e=>Ga[C.extname(e)]??`application/octet-stream`,qa=e=>{if(e===void 0)return;let t=Number.parseInt(String(e),10);if(!Number.isInteger(t)||t<=0)throw Error(`--port must be a positive integer.`);return t},Ja=e=>({configPath:e.config,cwd:String(e.cwd??`.`),entry:e.entry,host:e.host,mode:e.mode,outDir:e.outDir,port:qa(e.port)}),Ya=(e,t)=>T(async(n,r)=>{try{let i=new URL(n.url??`/`,`http://localhost`);if(i.pathname===`/apps`){r.writeHead(200,{"access-control-allow-origin":`*`,"content-type":`application/json; charset=utf-8`}),r.end(JSON.stringify(t));return}let a=decodeURIComponent(i.pathname),o=a===`/`?`client.js`:a.slice(1),s=C.resolve(e,o),c=C.relative(e,s);if(c.startsWith(`..`)||C.isAbsolute(c)){r.writeHead(403),r.end(`Forbidden`);return}if(!(await y(s).catch(()=>null))?.isFile()){r.writeHead(404),r.end(`Not found`);return}r.writeHead(200,{"access-control-allow-origin":`*`,"content-type":Ka(s)}),r.end(await _(s))}catch(e){r.writeHead(500),r.end(e instanceof Error?e.message:String(e))}}),Xa=async e=>{let t=C.join(e,`package.json`),n=JSON.parse(await _(t,`utf-8`)),r=typeof n.name==`string`?n.name:C.basename(e);return[{clientPath:`/client.js`,description:typeof n.description==`string`?n.description:void 0,id:r,name:typeof n.name==`string`?n.name:void 0}]},Za=async e=>{let t=await Me(e.configPath,e.cwd),n=C.resolve(t.root,e.outDir??t.config.build?.outDir??`.tailorkit`),r=e.host??`127.0.0.1`,i=e.port??4175,{buildApp:a}=await import(`./assets/builder-BWGULlBO.js`),o=await a({configPath:e.configPath,cwd:e.cwd,entry:e.entry,mode:e.mode,outDir:e.outDir,watch:!0}),s=()=>{o&&typeof o==`object`&&`close`in o&&o.close()},l=Ya(n,await Xa(t.root));await new Promise((e,t)=>{l.once(`error`,t),l.listen(i,r,e)}),l.removeAllListeners(`error`),process.once(`SIGINT`,()=>{s(),l.close(),process.exit(0)}),process.once(`SIGTERM`,()=>{s(),l.close(),process.exit(0)}),c.info(m.green(`Experimental preview running at http://${r}:${i}`)),c.info(m.dim(`Serving built worker assets from ${n}`))},Qa=e=>{let t=S();return t===`darwin`?{args:[e],command:`open`}:t===`win32`?{args:[`/c`,`start`,``,e],command:`cmd`}:{args:[e],command:`xdg-open`}},$a=e=>new Promise(t=>{let{args:n,command:r}=Qa(e),i=ae(r,n,{detached:!0,stdio:`ignore`,windowsHide:!0});i.once(`error`,()=>{t(!1)}),i.once(`spawn`,()=>{i.unref(),t(!0)})}),$=p(`tailorkit`),eo=e=>{if(e<1024)return`${e} B`;let t=[`KB`,`MB`,`GB`],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n.toFixed(n>=10?1:2)} ${t[r]}`};$.option(`--cwd <path>`,`Working directory`,{default:`.`}),$.command(`login`,`Authenticate the TailorKit CLI with a host app`).option(`--config <path>`,`Path to tailorkit config`).option(`--open`,`Open the approval URL in the default browser`,{default:!0}).option(`--timeout <seconds>`,`Seconds to wait for approval`,{default:1800}).action(async e=>{o(m.bold(`TailorKit`));let t=d(),n=!1;try{let r=Number.parseInt(String(e.timeout??`1800`),10);if(!Number.isInteger(r)||r<=0)throw Error(`--timeout must be a positive integer.`);await _i({configPath:e.config,cwd:String(e.cwd??`.`),timeout:r*1e3},({expiresAt:r,hostUrl:i,userCode:a})=>{let o=fi(i,a);e.open!==!1&&$a(o),c.info(`Enter this code in the host app: ${m.bold(a)}`),c.info(`Approval URL: ${m.cyan(o)}`),c.info(`Code expires at ${r.toLocaleString()}.`),c.info(`Waiting for approval...`),t.start(`Checking approval status`),n=!0}),n&&t.stop(`Approved.`),l(`Authenticated successfully.`)}catch(e){n&&t.stop(`Approval failed.`),c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`logout`,`Remove stored TailorKit CLI credentials for a host app`).option(`--config <path>`,`Path to tailorkit config`).action(async e=>{o(m.bold(`TailorKit`));try{let t=await yi({configPath:e.config,cwd:String(e.cwd??`.`)});l(t.removed?`Logged out of ${m.cyan(t.hostUrl)}.`:`No stored credentials found for ${m.cyan(t.hostUrl)}.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`whoami`,`Show the current TailorKit CLI authentication scope`).option(`--config <path>`,`Path to tailorkit config`).action(async e=>{o(m.bold(`TailorKit`));try{let t=await vi({configPath:e.config,cwd:String(e.cwd??`.`)});c.info(`Host: ${m.cyan(t.hostUrl)}`),c.info(`Scope: ${m.cyan(t.scopeId)}`),l(`Authenticated.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`deploy`,`Build and deploy the TailorKit app`).option(`--config <path>`,`Path to tailorkit config`).option(`--entry <path>`,`Client entry file`).option(`--out-dir <path>`,`Build output directory`).option(`--mode <mode>`,`Vite mode`).action(async e=>{o(m.bold(`TailorKit`));let t=d();try{t.start(`Building and deploying app`);let n=await Pi({configPath:e.config,cwd:String(e.cwd??`.`),entry:e.entry,mode:e.mode,onMissingAppId:async({appName:e,configPath:n,hostUrl:r,reason:i})=>{t.stop(`App not linked.`),c.info(i===`missing`?`No appId found in ${m.cyan(n)}.`:`The appId in ${m.cyan(n)} does not exist.`),c.info(`Host: ${m.cyan(r)}`);let o=await a({initialValue:!0,message:i===`missing`?`Create a TailorKit app named ${e}?`:`Create a new TailorKit app named ${e} and update the config?`});return!s(o)&&(o&&t.start(`Creating app and deploying`),o)},onTypecheckFailed:async({command:e,output:n})=>{t.stop(`Type check failed.`),c.error(`Type check failed while running ${m.cyan(e)}.`),n&&c.error(n);let r=await a({initialValue:!1,message:`Type check failed, but the app built successfully. Upload anyway?`});return!s(r)&&(r&&t.start(`Uploading app`),r)},outDir:e.outDir});t.stop(`Deployed app.`),n.createdApp&&c.info(`Created app and updated tailorkit.config.ts with ${m.cyan(n.appId)}.`),c.info(`Host: ${m.cyan(n.hostUrl)}`),c.info(`App: ${m.cyan(n.appId)}`),c.info(`Deployment: ${m.cyan(n.deploymentId)}`),c.info(`Uploaded files:`);for(let e of n.uploadedFiles)c.info(` ${m.cyan(e.path)} ${m.dim(`${eo(e.size)} raw, ${eo(e.gzipSize)} gzip`)}`);n.status&&c.info(`Status: ${m.cyan(n.status)}`),l(`Deployment published.`)}catch(e){t.stop(`Deployment failed.`),c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`build`,`Build the TailorKit app`).option(`--config <path>`,`Path to tailorkit config`).option(`--entry <path>`,`Client entry file`).option(`--out-dir <path>`,`Build output directory`).option(`--mode <mode>`,`Vite mode`).action(async e=>{o(m.bold(`TailorKit`));try{let{buildApp:t}=await import(`./assets/builder-BWGULlBO.js`);await t({configPath:e.config,cwd:String(e.cwd??`.`),entry:e.entry,mode:e.mode,outDir:e.outDir}),l(`Built app.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`experimental-preview`,`Build and preview the TailorKit worker`).option(`--config <path>`,`Path to tailorkit config`).option(`--entry <path>`,`Client entry file`).option(`--out-dir <path>`,`Build output directory`).option(`--host <host>`,`Preview host`).option(`--port <port>`,`Preview port`).option(`--mode <mode>`,`Vite mode`).action(async e=>{o(m.bold(`TailorKit`));try{await Za(Ja(e))}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`generate`,`Generate TailorKit app bindings`).option(`--config <path>`,`Path to tailorkit config`).option(`--out <path>`,`Generated TypeScript output file`).action(async e=>{o(m.bold(`TailorKit`));try{let t=await aa({configPath:e.config,cwd:String(e.cwd??`.`),outFile:e.out});l(`Generated ${m.cyan(t)}.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.command(`init [directory]`,`Create a new TailorKit app`).option(`--name <name>`,`Package name`).option(`--host <url>`,`TailorKit host URL`).option(`--package-manager <pm>`,`Package manager: bun, yarn, pnpm, or npm`).option(`--lint`,`Add oxlint (use --no-lint to skip)`).option(`--format`,`Add oxfmt (use --no-format to skip)`).option(`--install`,`Install dependencies after scaffolding (use --no-install to skip)`).option(`--force`,`Overwrite existing files`).action(async(e,t)=>{o(m.bold(`TailorKit`));try{let n=await Wa({cwd:String(t.cwd??`.`),directory:e,force:t.force,formatting:t.format,host:t.host,install:t.install,linting:t.lint,name:t.name,packageManager:t.packageManager});l(`Created app at ${m.cyan(n)}.`)}catch(e){c.error(e instanceof Error?e.message:String(e)),process.exit(1)}}),$.help(),$.version(`0.1.0-beta.1`),$.parse();export{Me as t};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tailorkit/cli",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.1",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@clack/prompts": "^1.7.0",
|
|
35
|
-
"@tailorkit/app": "0.1.0-beta.
|
|
36
|
-
"@tailorkit/core": "0.1.0-beta.
|
|
35
|
+
"@tailorkit/app": "0.1.0-beta.1",
|
|
36
|
+
"@tailorkit/core": "0.1.0-beta.1",
|
|
37
37
|
"cac": "^7.0.0",
|
|
38
38
|
"liquidjs": "^10.29.0",
|
|
39
39
|
"picocolors": "^1.1.1",
|