@tailorkit/cli 0.1.0-beta.1 → 0.1.0-beta.3

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.
@@ -0,0 +1,2 @@
1
+ import{fileURLToPath as e}from"node:url";import{dirname as t}from"node:path";const n=e(import.meta.url);t(n);import{t as r}from"../index.js";import{z as i}from"zod";import{writeFile as a}from"fs/promises";import o from"path";import{createRequire as s}from"module";import{build as c}from"vite";var l=10,u=e=>{let t=/^(\d+)\./u.exec(e);if(!t?.[1])throw Error(`Unable to parse Preact version "${e}".`);return{major:Number.parseInt(t[1],10),version:e}},d=e=>{let t=u(e);if(t.major<l)throw Error(`TailorKit requires Preact ${l}.0.0 or newer, but found ${e}.`);return t},f=i.object({assets:i.object({client:i.literal(`client.js`)}),version:i.literal(1)}),p=()=>f.parse({assets:{client:`client.js`},version:1}),m=/^preact(?:\/.*)?$/u,h=`preact/package.json`,g=`\0tailorkit-preact-package-json`,_=async(e={})=>{let t=await r(e.configPath,e.cwd),n=e.entry??t.config.client?.entry??`./src/client.ts`,i=e.outDir??t.config.build?.outDir??`.tailorkit`,s=v(t.root);d(s);let l=o.resolve(t.root,i),u=await c({build:{emptyOutDir:!0,lib:{entry:o.resolve(t.root,n),fileName:`client`,formats:[`es`]},outDir:l,watch:e.watch?{}:null,minify:`oxc`,rollupOptions:{external:e=>e!==h&&e!==g&&m.test(e),output:{comments:{annotation:!1,jsdoc:!1,legal:!1},minify:!0,minifyInternalExports:!0}}},configFile:!1,mode:e.mode,plugins:[{name:`tailorkit-preact-package-json`,enforce:`pre`,resolveId(e){return e===h?g:null},load(e){if(e===g){let e=JSON.stringify(s);return`export const version = ${e}; export default { version: ${e} };`}return null}}],root:t.root});return await a(o.join(l,`tailorkit-upload.json`),`${JSON.stringify(p(),null,2)}
2
+ `,`utf-8`),u};function v(e){let t=s(o.join(e,`package.json`));try{let e=t(t.resolve(`preact/package.json`));if(typeof e.version==`string`)return e.version}catch(e){throw Error(`TailorKit requires Preact to build an app. Install preact@^10 and try again.`,{cause:e})}throw Error(`Unable to read the installed Preact version.`)}export{_ as buildApp,f as tailorkitUploadManifestSchema};
package/dist/index.js CHANGED
@@ -45,9 +45,9 @@ data: `)}
45
45
 
46
46
  `);p=a.pop()??``;for(let e of a){let t=e.split(`
47
47
  `),a=[],o;for(let e of t)if(e.startsWith(`data:`))a.push(e.replace(/^data:\s*/,``));else if(e.startsWith(`event:`))o=e.replace(/^event:\s*/,``);else if(e.startsWith(`id:`))d=e.replace(/^id:\s*/,``);else if(e.startsWith(`retry:`)){let t=Number.parseInt(e.replace(/^retry:\s*/,``),10);Number.isNaN(t)||(c=t)}let s,l=!1;if(a.length){let e=a.join(`
48
- `);try{s=JSON.parse(e),l=!0}catch{s=e}}l&&(i&&await i(s),r&&(s=await r(s))),n?.({data:s,event:o,id:d,retry:c}),a.length&&(yield s)}}}finally{m.removeEventListener(`abort`,h),f.releaseLock()}break}catch(e){if(t?.(e),o!==void 0&&p>=o)break;let n=Math.min(c*2**(p-1),s??3e4);await f(n)}}}()}}var K=((e={})=>{let t=pr(br(),e),n=()=>({...t}),r=e=>(t=pr(t,e),n()),i=_r(),a=async e=>{let n={...t,...e,fetch:e.fetch??t.fetch??globalThis.fetch,headers:hr(t.headers,e.headers),serializedBody:void 0};n.security&&await dr(n),n.requestValidator&&await n.requestValidator(n),n.body!==void 0&&n.bodySerializer&&(n.serializedBody=n.bodySerializer(n.body)),(n.body===void 0||n.serializedBody===``)&&n.headers.delete(`Content-Type`);let r=n;return{opts:r,url:fr(r)}},o=async e=>{let n=e.throwOnError??t.throwOnError,r=e.responseStyle??t.responseStyle,o,s;try{let{opts:t,url:n}=await a(e),r={redirect:`follow`,...t,body:ar(t)};o=new Request(n,r);for(let e of i.request.fns)e&&(o=await e(o,t));let c=t.fetch;s=await c(o);for(let e of i.response.fns)e&&(s=await e(s,o,t));let l={request:o,response:s};if(s.ok){let e=(t.parseAs===`auto`?lr(s.headers.get(`Content-Type`)):t.parseAs)??`json`;if(s.status===204||s.headers.get(`Content-Length`)===`0`){let n;switch(e){case`arrayBuffer`:case`blob`:case`text`:n=await s[e]();break;case`formData`:n=new FormData;break;case`stream`:n=s.body;break;default:n={}}return t.responseStyle===`data`?n:{data:n,...l}}let n;switch(e){case`arrayBuffer`:case`blob`:case`formData`:case`text`:n=await s[e]();break;case`json`:{let e=await s.text();n=e?JSON.parse(e):{};break}case`stream`:return t.responseStyle===`data`?s.body:{data:s.body,...l}}return e===`json`&&(t.responseValidator&&await t.responseValidator(n),t.responseTransformer&&(n=await t.responseTransformer(n))),t.responseStyle===`data`?n:{data:n,...l}}let u=await s.text(),d;try{d=JSON.parse(u)}catch{}throw d??u}catch(t){let a=t;for(let t of i.error.fns)t&&(a=await t(a,s,o,e));if(a||={},n)throw a;return r===`data`?void 0:{error:a,request:o,response:s}}},s=e=>t=>o({...t,method:e}),c=e=>async t=>{let{opts:n,url:r}=await a(t);return xr({...n,body:n.body,method:e,onRequest:async(e,t)=>{let r=new Request(e,t);for(let e of i.request.fns)e&&(r=await e(r,n));return r},serializedBody:ar(n),url:r})};return{buildUrl:e=>fr({...t,...e}),connect:s(`CONNECT`),delete:s(`DELETE`),get:s(`GET`),getConfig:n,head:s(`HEAD`),interceptors:i,options:s(`OPTIONS`),patch:s(`PATCH`),post:s(`POST`),put:s(`PUT`),request:o,setConfig:r,sse:{connect:c(`CONNECT`),delete:c(`DELETE`),get:c(`GET`),head:c(`HEAD`),options:c(`OPTIONS`),patch:c(`PATCH`),post:c(`POST`),put:c(`PUT`),trace:c(`TRACE`)},trace:s(`TRACE`)}})(br({baseUrl:`https://tailorkit.dev/api/platform`})),Sr=e=>(e.client??K).get({url:`/apps`,...e}),Cr=e=>(e.client??K).post({url:`/apps`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),wr=e=>(e.client??K).delete({url:`/apps/{appId}`,...e}),Tr=e=>(e.client??K).get({url:`/apps/{appId}`,...e}),Er=e=>(e.client??K).put({url:`/apps/{appId}`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Dr=e=>(e.client??K).post({url:`/apps/{appId}/deploy`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Or=e=>(e.client??K).post({url:`/cli-auth/approve`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),kr=e=>(e.client??K).post({url:`/cli-auth/deny`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Ar=e=>(e.client??K).post({url:`/cli-auth/poll`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),jr=e=>(e.client??K).post({url:`/cli-auth/start`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Mr=e=>(e.client??K).post({url:`/cli-auth/verify-token`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Nr=e=>(e.client??K).get({url:`/deployments`,...e}),Pr=e=>(e.client??K).post({url:`/deployments`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Fr=e=>(e.client??K).get({url:`/deployments/{deploymentId}`,...e}),Ir=e=>(e.client??K).post({url:`/deployments/{deploymentId}`,...e,headers:{"Content-Type":`application/json`,...e.headers}});Object.entries({$body_:`body`,$headers_:`headers`,$path_:`path`,$query_:`query`});var Lr={initialInputValidationIndex:0,initialOutputValidationIndex:0,dedupeLeadingMiddlewares:!0};function q(e,t){return t===void 0?Lr[e]:t}function Rr(e){let t=((...t)=>e(...t));return t.mapInput=t=>Rr((n,r,...i)=>e(n,t(r),...i)),t.concat=(t,n)=>{let r=n?Rr(t).mapInput(n):t;return Rr((t,n,i,...a)=>e({...t,next:(...[e])=>r({...t,context:{...t.context,...e?.context},next:(...[n])=>t.next({context:{...e?.context,...n?.context}})},n,i,...a)},n,i,...a))},t}function zr(e){return async t=>{try{return[null,await e(t)]}catch(e){if(e instanceof Error&&`digest`in e&&typeof e.digest==`string`&&e.digest.startsWith(`NEXT_`)||e instanceof Response&&`options`in e&&$e(e.options)||$e(e)&&e.isNotFound===!0)throw e;return[mt(e).toJSON(),void 0]}}}var Br=class e extends Rn{errors(t){return new e({...this[`~orpc`],errorMap:vn(this[`~orpc`].errorMap,t)})}meta(t){return new e({...this[`~orpc`],meta:Sn(this[`~orpc`].meta,t)})}route(t){return new e({...this[`~orpc`],route:Cn(this[`~orpc`].route,t)})}use(t,n){let r=n?Rr(t).mapInput(n):t;return new e({...this[`~orpc`],middlewares:Ln(this[`~orpc`].middlewares,r)})}callable(...e){let t=Un(this,...e);return new Proxy(t,{get:(e,t)=>Reflect.has(this,t)?Reflect.get(this,t):Reflect.get(e,t),has:(e,t)=>Reflect.has(this,t)||Reflect.has(e,t)})}actionable(...e){let t=zr(Un(this,...e));return new Proxy(t,{get:(e,t)=>Reflect.has(this,t)?Reflect.get(this,t):Reflect.get(e,t),has:(e,t)=>Reflect.has(this,t)||Reflect.has(e,t)})}},Vr=new class e{"~orpc";constructor(e){this[`~orpc`]=e}$config(t){let n=this[`~orpc`].inputValidationIndex-q(`initialInputValidationIndex`,this[`~orpc`].config.initialInputValidationIndex),r=this[`~orpc`].outputValidationIndex-q(`initialOutputValidationIndex`,this[`~orpc`].config.initialOutputValidationIndex);return new e({...this[`~orpc`],config:t,dedupeLeadingMiddlewares:q(`dedupeLeadingMiddlewares`,t.dedupeLeadingMiddlewares),inputValidationIndex:q(`initialInputValidationIndex`,t.initialInputValidationIndex)+n,outputValidationIndex:q(`initialOutputValidationIndex`,t.initialOutputValidationIndex)+r})}$context(){return new e({...this[`~orpc`],middlewares:[],inputValidationIndex:q(`initialInputValidationIndex`,this[`~orpc`].config.initialInputValidationIndex),outputValidationIndex:q(`initialOutputValidationIndex`,this[`~orpc`].config.initialOutputValidationIndex)})}$meta(t){return new e({...this[`~orpc`],meta:t})}$route(t){return new e({...this[`~orpc`],route:t})}$input(t){return new e({...this[`~orpc`],inputSchema:t})}middleware(e){return Rr(e)}errors(t){return new e({...this[`~orpc`],errorMap:vn(this[`~orpc`].errorMap,t)})}use(t,n){let r=n?Rr(t).mapInput(n):t;return new e({...this[`~orpc`],middlewares:Ln(this[`~orpc`].middlewares,r)})}meta(t){return new e({...this[`~orpc`],meta:Sn(this[`~orpc`].meta,t)})}route(t){return new e({...this[`~orpc`],route:Cn(this[`~orpc`].route,t)})}input(t){return new e({...this[`~orpc`],inputSchema:t,inputValidationIndex:q(`initialInputValidationIndex`,this[`~orpc`].config.initialInputValidationIndex)+this[`~orpc`].middlewares.length})}output(t){return new e({...this[`~orpc`],outputSchema:t,outputValidationIndex:q(`initialOutputValidationIndex`,this[`~orpc`].config.initialOutputValidationIndex)+this[`~orpc`].middlewares.length})}handler(e){return new Br({...this[`~orpc`],handler:e})}prefix(t){return new e({...this[`~orpc`],prefix:En(this[`~orpc`].prefix,t)})}tag(...t){return new e({...this[`~orpc`],tags:Dn(this[`~orpc`].tags,t)})}router(e){return Yn(e,this[`~orpc`])}lazy(e){return Yn(jn(e),this[`~orpc`])}}({config:{},route:{},meta:{},errorMap:{},inputValidationIndex:q(`initialInputValidationIndex`),outputValidationIndex:q(`initialOutputValidationIndex`),middlewares:[],dedupeLeadingMiddlewares:!0});function Hr(e){return Yt(new gn({async fetch(t,n){let r=await(typeof e.headers==`function`?e.headers():e.headers),i=new Headers(r);return new Headers(n?.headers).forEach((e,t)=>{i.set(t,e)}),(e.fetch??fetch)(t,{...n,headers:i})},method:`POST`,url:e.url}))}var J=Vr.$context();function Ur(e){if(!e.tailorkit)throw new W(`UNAUTHORIZED`,{message:`Unauthorized.`});return e.tailorkit}function Y(e){return Ur(e).scopeId}function Wr(e){let[t,n]=e.headers.get(`authorization`)?.split(` `)??[];if(t!==`Bearer`||!n)throw new W(`UNAUTHORIZED`,{message:`Missing CLI deploy token.`});return n}var X=J.middleware(async({context:e,next:t})=>{let n=await Mr({body:{deployToken:Wr(e.request)},client:e.platform,headers:e.platformHeaders}),r=`data`in n?n.data:n;if(!r?.scopeId)throw new W(`UNAUTHORIZED`,{message:`Invalid CLI deploy token.`});return t({context:{tailorkit:{scopeId:r.scopeId}}})}),Gr=J.middleware(async({context:e,next:t})=>{let n=await e.authenticate({request:e.request});if(!n)throw new W(`UNAUTHORIZED`,{message:`Unauthorized.`});return t({context:{tailorkit:n}})}),Kr=async(e,t)=>{if(e===void 0)return t;let n=await e[`~standard`].validate(t);if(`issues`in n)throw new W(`BAD_REQUEST`,{message:`Invalid TailorKit payload`});return n.value};J.use(Gr).input(w.object({input:w.unknown().optional(),path:w.string()})).handler(async({context:e,input:t})=>{let n=e.actions.get(t.path);if(n===void 0)throw new W(`NOT_FOUND`,{message:`Action not found`});let r=await Kr(n.definition.input,t.input),i=await n.handler({context:Ur(e).actionContext,input:r});return Kr(n.definition.output,i)});var qr=w.object({page:w.number().int().min(1).optional(),pageSize:w.number().int().min(1).max(100).optional()}),Jr=w.object({description:w.string().nullable(),name:w.string()});J.use(X).input(Jr).handler(async({context:e,input:t})=>await Cr({body:{...t,scopeId:Y(e)},client:e.platform,headers:e.platformHeaders})),J.use(X).input(w.object({appId:w.string()})).handler(async({context:e,input:t})=>await wr({client:e.platform,headers:e.platformHeaders,path:{appId:t.appId},query:{scopeId:Y(e)}})),J.use(X).input(w.object({appId:w.string(),deploymentId:w.string()})).handler(async({context:e,input:t})=>await Dr({body:{deploymentId:t.deploymentId},client:e.platform,headers:e.platformHeaders,path:{appId:t.appId},query:{scopeId:Y(e)}})),J.use(X).input(w.object({appId:w.string()})).handler(async({context:e,input:t})=>await Tr({client:e.platform,headers:e.platformHeaders,path:{appId:t.appId},query:{scopeId:Y(e)}})),J.use(X).input(qr.optional()).handler(async({context:e,input:t})=>await Sr({client:e.platform,headers:e.platformHeaders,query:{page:t?.page,pageSize:t?.pageSize,scopeId:Y(e)}})),J.use(X).input(w.object({appId:w.string()}).extend(Jr.shape)).handler(async({context:e,input:t})=>await Er({body:{description:t.description,name:t.name},client:e.platform,headers:e.platformHeaders,path:{appId:t.appId},query:{scopeId:Y(e)}}));var Yr=async e=>{try{return await e}catch(e){throw typeof e==`string`&&e.toLowerCase()===`unauthorized`?new W(`UNAUTHORIZED`,{message:`TailorKit platform rejected the host project key. Check TAILORKIT_PROJECT_KEY.`}):e}};J.use(Gr).input(w.object({userCode:w.string().min(1)})).handler(async({context:e,input:t})=>await Yr(Or({body:{scopeId:Y(e),userCode:t.userCode},client:e.platform,headers:e.platformHeaders}))),J.use(Gr).input(w.object({userCode:w.string().min(1)})).handler(async({context:e,input:t})=>await Yr(kr({body:{userCode:t.userCode},client:e.platform,headers:e.platformHeaders}))),J.input(w.object({deviceCode:w.string().min(1)})).handler(async({context:e,input:t})=>await Yr(Ar({body:{deviceCode:t.deviceCode},client:e.platform,headers:e.platformHeaders}))),J.input(w.object({})).handler(async({context:e})=>await Yr(jr({body:{},client:e.platform,headers:e.platformHeaders}))),J.input(w.object({})).use(X).handler(({context:e})=>({scopeId:Y(e)}));var Xr=w.object({page:w.number().int().min(1).optional(),pageSize:w.number().int().min(1).max(100).optional()}),Zr=w.object({checksum:w.string(),contentLength:w.number().int().min(1),contentType:w.literal(`application/javascript`),encoding:w.literal(`utf-8`),objectKey:w.string()}),Qr=e=>{if(e instanceof Error)return e.message;if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`message`in e){let t=e.message;return typeof t==`string`?t:void 0}},$r=e=>Qr(e)?.toLowerCase().includes(`not found`)??!1,ei=e=>{throw $r(e)?new W(`NOT_FOUND`,{message:`App not found.`}):e};J.use(X).input(w.object({appId:w.string(),assets:w.tuple([Zr])})).handler(async({context:e,input:t})=>{try{return await Pr({body:{appId:t.appId,assets:t.assets,scopeId:Y(e)},client:e.platform,headers:e.platformHeaders})}catch(e){ei(e)}}),J.use(X).input(w.object({deploymentId:w.string()})).handler(async({context:e,input:t})=>await Fr({client:e.platform,headers:e.platformHeaders,path:{deploymentId:t.deploymentId},query:{scopeId:Y(e)}})),J.use(X).input(w.object({appId:w.string()}).merge(Xr)).handler(async({context:e,input:t})=>await Nr({client:e.platform,headers:e.platformHeaders,query:{appId:t.appId,page:t.page,pageSize:t.pageSize,scopeId:Y(e)}})),J.use(X).input(w.object({deploymentId:w.string(),rollout:w.boolean().optional()})).handler(async({context:e,input:t})=>await Ir({body:{scopeId:Y(e),rollout:t.rollout},client:e.platform,headers:e.platformHeaders,path:{deploymentId:t.deploymentId}}));var ti=e=>{let t=new URL(e);return t.hash=``,t.search=``,t.pathname=t.pathname.replace(/\/+$/u,``),t.toString().replace(/\/$/u,``)},ni=C.join(x(),`.tailorkit`,`auth.json`),ri=18e5,ii=2e3,ai=w.object({deployToken:w.string().min(1),scopeId:w.string().min(1).optional()}),oi=w.object({hosts:w.record(w.string(),ai).optional()}).passthrough(),si=e=>new Promise(t=>setTimeout(t,e)),ci=e=>{if(e&&typeof e==`object`&&`error`in e&&e.error!==void 0)throw e.error},li=async()=>{try{return oi.parse(JSON.parse(await _(ni,`utf-8`)))}catch(e){if(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)return{};throw e}},ui=async e=>{await g(C.dirname(ni),{recursive:!0}),await b(ni,`${JSON.stringify(e,null,2)}\n`,{encoding:`utf-8`,mode:384}),await h(ni,384)},di=async e=>{let t=await Me(e.configPath,e.cwd);if(t.config.host)return ti(t.config.host);throw Error(`Missing TailorKit host URL. Set host in tailorkit.config.ts.`)},fi=(e,t)=>{let n=new URL(e);return n.pathname=`${n.pathname.replace(/\/+$/u,``)}/cli-auth/approve`,n.search=``,n.searchParams.set(`code`,t),n.hash=``,n.toString()},pi=e=>Error(`Not logged in for ${e}. Run tailorkit login after checking host in tailorkit.config.ts.`),mi=async(e,t)=>{let n=await li();await ui({...n,hosts:{...n.hosts,[e]:t}})},hi=async e=>{let t=await li();if(!t.hosts?.[e])return!1;let{[e]:n,...r}=t.hosts,i={...t,hosts:r};return Object.keys(r).length===0?(await v(ni,{force:!0}),!0):(await ui(i),!0)},gi=async e=>(await li()).hosts?.[e],_i=async(e,t)=>{let n=await di(e),r=Hr({url:n}),i=await r.cliAuth.start({});ci(i);let a=`data`in i?i.data:i,o=new Date(a.expiresAt),s=Date.now()+(e.timeout??ri);for(t({expiresAt:o,hostUrl:n,userCode:a.userCode});Date.now()<s&&Date.now()<o.getTime();){await si(ii);let e=await r.cliAuth.poll({deviceCode:a.deviceCode});ci(e);let t=`data`in e?e.data:e;switch(t.status){case`pending`:continue;case`denied`:throw Error(`CLI login was denied.`);case`expired`:throw Error(`CLI login expired.`);case`approved`:return await mi(n,{deployToken:t.deployToken,scopeId:t.scopeId}),{hostUrl:n,scopeId:t.scopeId};default:throw Error(`Unexpected CLI login status.`)}}throw Error(`Timed out waiting for CLI login approval.`)},vi=async e=>{let t=await di(e),n=await gi(t);if(!n?.deployToken)throw pi(t);let r=Hr({headers:{authorization:`Bearer ${n.deployToken}`},url:t}),i;try{let e=await r.cliAuth.verifyToken({});ci(e),i=`data`in e?e.data:e}catch{throw pi(t)}return await mi(t,{deployToken:n.deployToken,scopeId:i.scopeId}),{hostUrl:t,scopeId:i.scopeId}},yi=async e=>{let t=await di(e);return{hostUrl:t,removed:await hi(t)}},bi=1048576,xi=re(ie),Si=e=>{if(e&&typeof e==`object`&&`error`in e&&e.error!==void 0)throw e.error;let t=e&&typeof e==`object`&&`data`in e?e.data:e;return t&&typeof t==`object`&&`body`in t?t.body:t},Ci=e=>{if(e instanceof Error)return e.message;if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`message`in e){let t=e.message;return typeof t==`string`?t:void 0}},wi=e=>Ci(e)?.toLowerCase().includes(`not found`)??!1,Ti=async(e,t)=>{let n=C.join(e,`tailorkit-upload.json`);return t.parse(JSON.parse(await _(n,`utf-8`)))},Ei=e=>te(`sha256`).update(e).digest(`hex`),Di=async e=>{try{let t=JSON.parse(await _(C.join(e,`package.json`),`utf-8`));if(typeof t.name==`string`&&t.name.trim())return t.name.trim()}catch{}return C.basename(e)},Oi=async(e,t)=>{let n=await _(e,`utf-8`),r=` appId: ${JSON.stringify(t)},`;if(/^\s*appId\s*:/mu.test(n)){await b(e,n.replace(/^(\s*)appId\s*:\s*(['"]).*?\2\s*,?/mu,`$1appId: ${JSON.stringify(t)},`),`utf-8`);return}let i=/(export\s+default\s+\{)(\r?\n)/u;if(i.test(n)){await b(e,n.replace(i,`$1$2${r}$2`),`utf-8`);return}let a=/(export\s+default\s+(?:defineTailorKitConfig|defineConfig)\(\s*\{)(\r?\n)/u;if(a.test(n)){await b(e,n.replace(a,`$1$2${r}$2`),`utf-8`);return}throw Error(`Could not write appId to ${e}. Add appId: ${JSON.stringify(t)} manually.`)},ki=async(e,t)=>{if(t.byteLength>bi)throw Error(`Deployment asset exceeds ${bi} bytes.`);let n=new Headers(e.headers);n.has(`content-type`)||n.set(`content-type`,`application/javascript`);let r=await fetch(e.uploadUrl,{body:new Uint8Array(t),headers:n,method:`PUT`});if(!r.ok)throw Error(`Asset upload failed with ${r.status} ${r.statusText}.`)},Ai=e=>{for(let t of[`tsconfig.json`,`jsconfig.json`]){let n=C.join(e,t);if(ne(n))return n}},ji=e=>{let t=r(C.join(e,`package.json`));try{return t(`typescript`)}catch{return}},Mi=(e,t,n)=>t.map(t=>{let r=t,i=e.flattenDiagnosticMessageText(r.messageText,`
48
+ `);try{s=JSON.parse(e),l=!0}catch{s=e}}l&&(i&&await i(s),r&&(s=await r(s))),n?.({data:s,event:o,id:d,retry:c}),a.length&&(yield s)}}}finally{m.removeEventListener(`abort`,h),f.releaseLock()}break}catch(e){if(t?.(e),o!==void 0&&p>=o)break;let n=Math.min(c*2**(p-1),s??3e4);await f(n)}}}()}}var K=((e={})=>{let t=pr(br(),e),n=()=>({...t}),r=e=>(t=pr(t,e),n()),i=_r(),a=async e=>{let n={...t,...e,fetch:e.fetch??t.fetch??globalThis.fetch,headers:hr(t.headers,e.headers),serializedBody:void 0};n.security&&await dr(n),n.requestValidator&&await n.requestValidator(n),n.body!==void 0&&n.bodySerializer&&(n.serializedBody=n.bodySerializer(n.body)),(n.body===void 0||n.serializedBody===``)&&n.headers.delete(`Content-Type`);let r=n;return{opts:r,url:fr(r)}},o=async e=>{let n=e.throwOnError??t.throwOnError,r=e.responseStyle??t.responseStyle,o,s;try{let{opts:t,url:n}=await a(e),r={redirect:`follow`,...t,body:ar(t)};o=new Request(n,r);for(let e of i.request.fns)e&&(o=await e(o,t));let c=t.fetch;s=await c(o);for(let e of i.response.fns)e&&(s=await e(s,o,t));let l={request:o,response:s};if(s.ok){let e=(t.parseAs===`auto`?lr(s.headers.get(`Content-Type`)):t.parseAs)??`json`;if(s.status===204||s.headers.get(`Content-Length`)===`0`){let n;switch(e){case`arrayBuffer`:case`blob`:case`text`:n=await s[e]();break;case`formData`:n=new FormData;break;case`stream`:n=s.body;break;default:n={}}return t.responseStyle===`data`?n:{data:n,...l}}let n;switch(e){case`arrayBuffer`:case`blob`:case`formData`:case`text`:n=await s[e]();break;case`json`:{let e=await s.text();n=e?JSON.parse(e):{};break}case`stream`:return t.responseStyle===`data`?s.body:{data:s.body,...l}}return e===`json`&&(t.responseValidator&&await t.responseValidator(n),t.responseTransformer&&(n=await t.responseTransformer(n))),t.responseStyle===`data`?n:{data:n,...l}}let u=await s.text(),d;try{d=JSON.parse(u)}catch{}throw d??u}catch(t){let a=t;for(let t of i.error.fns)t&&(a=await t(a,s,o,e));if(a||={},n)throw a;return r===`data`?void 0:{error:a,request:o,response:s}}},s=e=>t=>o({...t,method:e}),c=e=>async t=>{let{opts:n,url:r}=await a(t);return xr({...n,body:n.body,method:e,onRequest:async(e,t)=>{let r=new Request(e,t);for(let e of i.request.fns)e&&(r=await e(r,n));return r},serializedBody:ar(n),url:r})};return{buildUrl:e=>fr({...t,...e}),connect:s(`CONNECT`),delete:s(`DELETE`),get:s(`GET`),getConfig:n,head:s(`HEAD`),interceptors:i,options:s(`OPTIONS`),patch:s(`PATCH`),post:s(`POST`),put:s(`PUT`),request:o,setConfig:r,sse:{connect:c(`CONNECT`),delete:c(`DELETE`),get:c(`GET`),head:c(`HEAD`),options:c(`OPTIONS`),patch:c(`PATCH`),post:c(`POST`),put:c(`PUT`),trace:c(`TRACE`)},trace:s(`TRACE`)}})(br({baseUrl:`https://tailorkit.dev/api/platform`})),Sr=e=>(e.client??K).get({url:`/apps`,...e}),Cr=e=>(e.client??K).post({url:`/apps`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),wr=e=>(e.client??K).delete({url:`/apps/{appId}`,...e}),Tr=e=>(e.client??K).get({url:`/apps/{appId}`,...e}),Er=e=>(e.client??K).put({url:`/apps/{appId}`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Dr=e=>(e.client??K).post({url:`/apps/{appId}/deploy`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Or=e=>(e.client??K).post({url:`/cli-auth/approve`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),kr=e=>(e.client??K).post({url:`/cli-auth/deny`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Ar=e=>(e.client??K).post({url:`/cli-auth/poll`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),jr=e=>(e.client??K).post({url:`/cli-auth/start`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Mr=e=>(e.client??K).post({url:`/cli-auth/verify-token`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Nr=e=>(e.client??K).get({url:`/deployments`,...e}),Pr=e=>(e.client??K).post({url:`/deployments`,...e,headers:{"Content-Type":`application/json`,...e.headers}}),Fr=e=>(e.client??K).get({url:`/deployments/{deploymentId}`,...e}),Ir=e=>(e.client??K).post({url:`/deployments/{deploymentId}`,...e,headers:{"Content-Type":`application/json`,...e.headers}});Object.entries({$body_:`body`,$headers_:`headers`,$path_:`path`,$query_:`query`});var Lr={initialInputValidationIndex:0,initialOutputValidationIndex:0,dedupeLeadingMiddlewares:!0};function q(e,t){return t===void 0?Lr[e]:t}function Rr(e){let t=((...t)=>e(...t));return t.mapInput=t=>Rr((n,r,...i)=>e(n,t(r),...i)),t.concat=(t,n)=>{let r=n?Rr(t).mapInput(n):t;return Rr((t,n,i,...a)=>e({...t,next:(...[e])=>r({...t,context:{...t.context,...e?.context},next:(...[n])=>t.next({context:{...e?.context,...n?.context}})},n,i,...a)},n,i,...a))},t}function zr(e){return async t=>{try{return[null,await e(t)]}catch(e){if(e instanceof Error&&`digest`in e&&typeof e.digest==`string`&&e.digest.startsWith(`NEXT_`)||e instanceof Response&&`options`in e&&$e(e.options)||$e(e)&&e.isNotFound===!0)throw e;return[mt(e).toJSON(),void 0]}}}var Br=class e extends Rn{errors(t){return new e({...this[`~orpc`],errorMap:vn(this[`~orpc`].errorMap,t)})}meta(t){return new e({...this[`~orpc`],meta:Sn(this[`~orpc`].meta,t)})}route(t){return new e({...this[`~orpc`],route:Cn(this[`~orpc`].route,t)})}use(t,n){let r=n?Rr(t).mapInput(n):t;return new e({...this[`~orpc`],middlewares:Ln(this[`~orpc`].middlewares,r)})}callable(...e){let t=Un(this,...e);return new Proxy(t,{get:(e,t)=>Reflect.has(this,t)?Reflect.get(this,t):Reflect.get(e,t),has:(e,t)=>Reflect.has(this,t)||Reflect.has(e,t)})}actionable(...e){let t=zr(Un(this,...e));return new Proxy(t,{get:(e,t)=>Reflect.has(this,t)?Reflect.get(this,t):Reflect.get(e,t),has:(e,t)=>Reflect.has(this,t)||Reflect.has(e,t)})}},Vr=new class e{"~orpc";constructor(e){this[`~orpc`]=e}$config(t){let n=this[`~orpc`].inputValidationIndex-q(`initialInputValidationIndex`,this[`~orpc`].config.initialInputValidationIndex),r=this[`~orpc`].outputValidationIndex-q(`initialOutputValidationIndex`,this[`~orpc`].config.initialOutputValidationIndex);return new e({...this[`~orpc`],config:t,dedupeLeadingMiddlewares:q(`dedupeLeadingMiddlewares`,t.dedupeLeadingMiddlewares),inputValidationIndex:q(`initialInputValidationIndex`,t.initialInputValidationIndex)+n,outputValidationIndex:q(`initialOutputValidationIndex`,t.initialOutputValidationIndex)+r})}$context(){return new e({...this[`~orpc`],middlewares:[],inputValidationIndex:q(`initialInputValidationIndex`,this[`~orpc`].config.initialInputValidationIndex),outputValidationIndex:q(`initialOutputValidationIndex`,this[`~orpc`].config.initialOutputValidationIndex)})}$meta(t){return new e({...this[`~orpc`],meta:t})}$route(t){return new e({...this[`~orpc`],route:t})}$input(t){return new e({...this[`~orpc`],inputSchema:t})}middleware(e){return Rr(e)}errors(t){return new e({...this[`~orpc`],errorMap:vn(this[`~orpc`].errorMap,t)})}use(t,n){let r=n?Rr(t).mapInput(n):t;return new e({...this[`~orpc`],middlewares:Ln(this[`~orpc`].middlewares,r)})}meta(t){return new e({...this[`~orpc`],meta:Sn(this[`~orpc`].meta,t)})}route(t){return new e({...this[`~orpc`],route:Cn(this[`~orpc`].route,t)})}input(t){return new e({...this[`~orpc`],inputSchema:t,inputValidationIndex:q(`initialInputValidationIndex`,this[`~orpc`].config.initialInputValidationIndex)+this[`~orpc`].middlewares.length})}output(t){return new e({...this[`~orpc`],outputSchema:t,outputValidationIndex:q(`initialOutputValidationIndex`,this[`~orpc`].config.initialOutputValidationIndex)+this[`~orpc`].middlewares.length})}handler(e){return new Br({...this[`~orpc`],handler:e})}prefix(t){return new e({...this[`~orpc`],prefix:En(this[`~orpc`].prefix,t)})}tag(...t){return new e({...this[`~orpc`],tags:Dn(this[`~orpc`].tags,t)})}router(e){return Yn(e,this[`~orpc`])}lazy(e){return Yn(jn(e),this[`~orpc`])}}({config:{},route:{},meta:{},errorMap:{},inputValidationIndex:q(`initialInputValidationIndex`),outputValidationIndex:q(`initialOutputValidationIndex`),middlewares:[],dedupeLeadingMiddlewares:!0});function Hr(e){return Yt(new gn({async fetch(t,n){let r=await(typeof e.headers==`function`?e.headers():e.headers),i=new Headers(r);return new Headers(n?.headers).forEach((e,t)=>{i.set(t,e)}),(e.fetch??fetch)(t,{...n,headers:i})},method:`POST`,url:e.url}))}var J=Vr.$context();function Ur(e){if(!e.tailorkit)throw new W(`UNAUTHORIZED`,{message:`Unauthorized.`});return e.tailorkit}function Y(e){return Ur(e).scopeId}function Wr(e){let[t,n]=e.headers.get(`authorization`)?.split(` `)??[];if(t!==`Bearer`||!n)throw new W(`UNAUTHORIZED`,{message:`Missing CLI deploy token.`});return n}var X=J.middleware(async({context:e,next:t})=>{let n=await Mr({body:{deployToken:Wr(e.request)},client:e.platform,headers:e.platformHeaders}),r=`data`in n?n.data:n;if(!r?.scopeId)throw new W(`UNAUTHORIZED`,{message:`Invalid CLI deploy token.`});return t({context:{tailorkit:{scopeId:r.scopeId}}})}),Gr=J.middleware(async({context:e,next:t})=>{let n=await e.authenticate({request:e.request});if(!n)throw new W(`UNAUTHORIZED`,{message:`Unauthorized.`});return t({context:{tailorkit:n}})}),Kr=async(e,t)=>{if(e===void 0)return t;let n=await e[`~standard`].validate(t);if(`issues`in n)throw new W(`BAD_REQUEST`,{message:`Invalid TailorKit payload`});return n.value};J.use(Gr).input(w.object({input:w.unknown().optional(),path:w.string()})).handler(async({context:e,input:t})=>{let n=e.actions.get(t.path);if(n===void 0)throw new W(`NOT_FOUND`,{message:`Action not found`});let r=await Kr(n.definition.input,t.input),i=await n.handler({context:Ur(e).actionContext,input:r});return Kr(n.definition.output,i)});var qr=w.object({page:w.number().int().min(1).optional(),pageSize:w.number().int().min(1).max(100).optional()}),Jr=w.object({description:w.string().nullable(),name:w.string()});J.use(X).input(Jr).handler(async({context:e,input:t})=>await Cr({body:{...t,scopeId:Y(e)},client:e.platform,headers:e.platformHeaders})),J.use(X).input(w.object({appId:w.string()})).handler(async({context:e,input:t})=>await wr({client:e.platform,headers:e.platformHeaders,path:{appId:t.appId},query:{scopeId:Y(e)}})),J.use(X).input(w.object({appId:w.string(),deploymentId:w.string()})).handler(async({context:e,input:t})=>await Dr({body:{deploymentId:t.deploymentId},client:e.platform,headers:e.platformHeaders,path:{appId:t.appId},query:{scopeId:Y(e)}})),J.use(X).input(w.object({appId:w.string()})).handler(async({context:e,input:t})=>await Tr({client:e.platform,headers:e.platformHeaders,path:{appId:t.appId},query:{scopeId:Y(e)}})),J.use(X).input(qr.optional()).handler(async({context:e,input:t})=>await Sr({client:e.platform,headers:e.platformHeaders,query:{page:t?.page,pageSize:t?.pageSize,scopeId:Y(e)}})),J.use(X).input(w.object({appId:w.string()}).extend(Jr.shape)).handler(async({context:e,input:t})=>await Er({body:{description:t.description,name:t.name},client:e.platform,headers:e.platformHeaders,path:{appId:t.appId},query:{scopeId:Y(e)}}));var Yr=async e=>{try{return await e}catch(e){throw typeof e==`string`&&e.toLowerCase()===`unauthorized`?new W(`UNAUTHORIZED`,{message:`TailorKit platform rejected the host project key. Check TAILORKIT_PROJECT_KEY.`}):e}};J.use(Gr).input(w.object({userCode:w.string().min(1)})).handler(async({context:e,input:t})=>await Yr(Or({body:{scopeId:Y(e),userCode:t.userCode},client:e.platform,headers:e.platformHeaders}))),J.use(Gr).input(w.object({userCode:w.string().min(1)})).handler(async({context:e,input:t})=>await Yr(kr({body:{userCode:t.userCode},client:e.platform,headers:e.platformHeaders}))),J.input(w.object({deviceCode:w.string().min(1)})).handler(async({context:e,input:t})=>await Yr(Ar({body:{deviceCode:t.deviceCode},client:e.platform,headers:e.platformHeaders}))),J.input(w.object({})).handler(async({context:e})=>await Yr(jr({body:{},client:e.platform,headers:e.platformHeaders}))),J.input(w.object({})).use(X).handler(({context:e})=>({scopeId:Y(e)}));var Xr=w.object({page:w.number().int().min(1).optional(),pageSize:w.number().int().min(1).max(100).optional()}),Zr=w.object({checksum:w.string(),contentLength:w.number().int().min(1),contentType:w.literal(`application/javascript`),encoding:w.literal(`utf-8`),objectKey:w.literal(`client.js`)}),Qr=e=>{if(e instanceof Error)return e.message;if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`message`in e){let t=e.message;return typeof t==`string`?t:void 0}},$r=e=>Qr(e)?.toLowerCase().includes(`not found`)??!1,ei=e=>{throw $r(e)?new W(`NOT_FOUND`,{message:`App not found.`}):e};J.use(X).input(w.object({appId:w.string(),assets:w.tuple([Zr])})).handler(async({context:e,input:t})=>{try{return await Pr({body:{appId:t.appId,assets:t.assets,scopeId:Y(e)},client:e.platform,headers:e.platformHeaders})}catch(e){ei(e)}}),J.use(X).input(w.object({deploymentId:w.string()})).handler(async({context:e,input:t})=>await Fr({client:e.platform,headers:e.platformHeaders,path:{deploymentId:t.deploymentId},query:{scopeId:Y(e)}})),J.use(X).input(w.object({appId:w.string()}).merge(Xr)).handler(async({context:e,input:t})=>await Nr({client:e.platform,headers:e.platformHeaders,query:{appId:t.appId,page:t.page,pageSize:t.pageSize,scopeId:Y(e)}})),J.use(X).input(w.object({deploymentId:w.string(),rollout:w.boolean().optional()})).handler(async({context:e,input:t})=>await Ir({body:{scopeId:Y(e),rollout:t.rollout},client:e.platform,headers:e.platformHeaders,path:{deploymentId:t.deploymentId}}));var ti=e=>{let t=new URL(e);return t.hash=``,t.search=``,t.pathname=t.pathname.replace(/\/+$/u,``),t.toString().replace(/\/$/u,``)},ni=C.join(x(),`.tailorkit`,`auth.json`),ri=18e5,ii=2e3,ai=w.object({deployToken:w.string().min(1),scopeId:w.string().min(1).optional()}),oi=w.object({hosts:w.record(w.string(),ai).optional()}).passthrough(),si=e=>new Promise(t=>setTimeout(t,e)),ci=e=>{if(e&&typeof e==`object`&&`error`in e&&e.error!==void 0)throw e.error},li=async()=>{try{return oi.parse(JSON.parse(await _(ni,`utf-8`)))}catch(e){if(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)return{};throw e}},ui=async e=>{await g(C.dirname(ni),{recursive:!0}),await b(ni,`${JSON.stringify(e,null,2)}\n`,{encoding:`utf-8`,mode:384}),await h(ni,384)},di=async e=>{let t=await Me(e.configPath,e.cwd);if(t.config.host)return ti(t.config.host);throw Error(`Missing TailorKit host URL. Set host in tailorkit.config.ts.`)},fi=(e,t)=>{let n=new URL(e);return n.pathname=`${n.pathname.replace(/\/+$/u,``)}/cli-auth/approve`,n.search=``,n.searchParams.set(`code`,t),n.hash=``,n.toString()},pi=e=>Error(`Not logged in for ${e}. Run tailorkit login after checking host in tailorkit.config.ts.`),mi=async(e,t)=>{let n=await li();await ui({...n,hosts:{...n.hosts,[e]:t}})},hi=async e=>{let t=await li();if(!t.hosts?.[e])return!1;let{[e]:n,...r}=t.hosts,i={...t,hosts:r};return Object.keys(r).length===0?(await v(ni,{force:!0}),!0):(await ui(i),!0)},gi=async e=>(await li()).hosts?.[e],_i=async(e,t)=>{let n=await di(e),r=Hr({url:n}),i=await r.cliAuth.start({});ci(i);let a=`data`in i?i.data:i,o=new Date(a.expiresAt),s=Date.now()+(e.timeout??ri);for(t({expiresAt:o,hostUrl:n,userCode:a.userCode});Date.now()<s&&Date.now()<o.getTime();){await si(ii);let e=await r.cliAuth.poll({deviceCode:a.deviceCode});ci(e);let t=`data`in e?e.data:e;switch(t.status){case`pending`:continue;case`denied`:throw Error(`CLI login was denied.`);case`expired`:throw Error(`CLI login expired.`);case`approved`:return await mi(n,{deployToken:t.deployToken,scopeId:t.scopeId}),{hostUrl:n,scopeId:t.scopeId};default:throw Error(`Unexpected CLI login status.`)}}throw Error(`Timed out waiting for CLI login approval.`)},vi=async e=>{let t=await di(e),n=await gi(t);if(!n?.deployToken)throw pi(t);let r=Hr({headers:{authorization:`Bearer ${n.deployToken}`},url:t}),i;try{let e=await r.cliAuth.verifyToken({});ci(e),i=`data`in e?e.data:e}catch{throw pi(t)}return await mi(t,{deployToken:n.deployToken,scopeId:i.scopeId}),{hostUrl:t,scopeId:i.scopeId}},yi=async e=>{let t=await di(e);return{hostUrl:t,removed:await hi(t)}},bi=1048576,xi=re(ie),Si=e=>{if(e&&typeof e==`object`&&`error`in e&&e.error!==void 0)throw e.error;let t=e&&typeof e==`object`&&`data`in e?e.data:e;return t&&typeof t==`object`&&`body`in t?t.body:t},Ci=e=>{if(e instanceof Error)return e.message;if(typeof e==`string`)return e;if(e&&typeof e==`object`&&`message`in e){let t=e.message;return typeof t==`string`?t:void 0}},wi=e=>Ci(e)?.toLowerCase().includes(`not found`)??!1,Ti=async(e,t)=>{let n=C.join(e,`tailorkit-upload.json`);return t.parse(JSON.parse(await _(n,`utf-8`)))},Ei=e=>te(`sha256`).update(e).digest(`hex`),Di=async e=>{try{let t=JSON.parse(await _(C.join(e,`package.json`),`utf-8`));if(typeof t.name==`string`&&t.name.trim())return t.name.trim()}catch{}return C.basename(e)},Oi=async(e,t)=>{let n=await _(e,`utf-8`),r=` appId: ${JSON.stringify(t)},`;if(/^\s*appId\s*:/mu.test(n)){await b(e,n.replace(/^(\s*)appId\s*:\s*(['"]).*?\2\s*,?/mu,`$1appId: ${JSON.stringify(t)},`),`utf-8`);return}let i=/(export\s+default\s+\{)(\r?\n)/u;if(i.test(n)){await b(e,n.replace(i,`$1$2${r}$2`),`utf-8`);return}let a=/(export\s+default\s+(?:defineTailorKitConfig|defineConfig)\(\s*\{)(\r?\n)/u;if(a.test(n)){await b(e,n.replace(a,`$1$2${r}$2`),`utf-8`);return}throw Error(`Could not write appId to ${e}. Add appId: ${JSON.stringify(t)} manually.`)},ki=async(e,t)=>{if(t.byteLength>bi)throw Error(`Deployment asset exceeds ${bi} bytes.`);let n=new Headers(e.headers);n.has(`content-type`)||n.set(`content-type`,`application/javascript`);let r=await fetch(e.uploadUrl,{body:new Uint8Array(t),headers:n,method:`PUT`});if(!r.ok)throw Error(`Asset upload failed with ${r.status} ${r.statusText}.`)},Ai=e=>{for(let t of[`tsconfig.json`,`jsconfig.json`]){let n=C.join(e,t);if(ne(n))return n}},ji=e=>{let t=r(C.join(e,`package.json`));try{return t(`typescript`)}catch{return}},Mi=(e,t,n)=>t.map(t=>{let r=t,i=e.flattenDiagnosticMessageText(r.messageText,`
49
49
  `);if(r.file===void 0||r.start===void 0)return`TS${r.code}: ${i}`;let a=e.getLineAndCharacterOfPosition(r.file,r.start);return`${C.relative(n,r.file.fileName)}(${a.line+1},${a.character+1}): error TS${r.code}: ${i}`}).join(`
50
- `),Ni=(e,t)=>{let n=ji(e.root),r=Ai(e.root);if(n===void 0||r===void 0)return;let i=t.entry??e.config.client?.entry??`./src/client.ts`,a=C.resolve(e.root,i),o=n.readConfigFile(r,n.sys.readFile);if(o.error!==void 0)return{command:`tsc --noEmit ${C.relative(e.root,a)}`,exitCode:1,output:Mi(n,[o.error],e.root)};let s=n.parseJsonConfigFileContent(o.config,n.sys,e.root,{noEmit:!0},r);if(s.errors.length>0)return{command:`tsc --noEmit ${C.relative(e.root,a)}`,exitCode:1,output:Mi(n,s.errors,e.root)};let c=n.createCompilerHost(s.options),l=n.createProgram({host:c,options:s.options,rootNames:[a]}),u=[...n.getPreEmitDiagnostics(l),...l.emit().diagnostics];if(u.length!==0)return{command:`tsc --noEmit ${C.relative(e.root,a)}`,exitCode:1,output:Mi(n,u,e.root)}},Pi=async e=>{let t=await Me(e.configPath,e.cwd),n=t.config.appId,r=!1,i=await vi(e),a=await gi(i.hostUrl);if(!a?.deployToken)throw Error(`Not logged in for ${i.hostUrl}. Run tailorkit login after checking host in tailorkit.config.ts.`);let{buildApp:o,tailorkitUploadManifestSchema:s}=await import(`./assets/builder-BWGULlBO.js`),[c,l]=await Promise.allSettled([o(e),Ni(t,e)]);if(c.status===`rejected`)throw c.reason;if(l.status===`rejected`)throw l.reason;if(l.value!==void 0&&!await e.onTypecheckFailed?.(l.value))throw Error(`Deployment cancelled because type check failed.`);let u=C.resolve(t.root,e.outDir??t.config.build?.outDir??`.tailorkit`),d=await Ti(u,s),f=C.join(u,d.assets.client),p=await _(f),m=await xi(p),h=Hr({headers:{authorization:`Bearer ${a.deployToken}`},url:i.hostUrl}),g=async a=>{let o=await Di(t.root);if(!await e.onMissingAppId?.({appName:o,configPath:t.filepath,hostUrl:i.hostUrl,reason:a}))throw Error(`Deployment cancelled.`);return n=Si(await h.apps.create({description:null,name:o})).id,r=!0,await Oi(t.filepath,n),n};n||=await g(`missing`);let v=async e=>Si(await h.deployments.create({appId:e,assets:[{checksum:Ei(p),contentLength:p.byteLength,contentType:`application/javascript`,encoding:`utf-8`,objectKey:d.assets.client}]})),y;try{y=await v(n)}catch(e){if(!wi(e))throw e;n=await g(`not-found`),y=await v(n)}await ki(y.assets[0],p);let b=Si(await h.deployments.publish({deploymentId:y.deployment.id,rollout:!0}));return{appId:n,createdApp:r,deploymentId:b.id,hostUrl:i.hostUrl,status:b.status,uploadedFiles:[{gzipSize:m.byteLength,path:d.assets.client,size:p.byteLength}]}},Fi=`/* eslint-disable */
50
+ `),Ni=(e,t)=>{let n=ji(e.root),r=Ai(e.root);if(n===void 0||r===void 0)return;let i=t.entry??e.config.client?.entry??`./src/client.ts`,a=C.resolve(e.root,i),o=n.readConfigFile(r,n.sys.readFile);if(o.error!==void 0)return{command:`tsc --noEmit ${C.relative(e.root,a)}`,exitCode:1,output:Mi(n,[o.error],e.root)};let s=n.parseJsonConfigFileContent(o.config,n.sys,e.root,{noEmit:!0},r);if(s.errors.length>0)return{command:`tsc --noEmit ${C.relative(e.root,a)}`,exitCode:1,output:Mi(n,s.errors,e.root)};let c=n.createCompilerHost(s.options),l=n.createProgram({host:c,options:s.options,rootNames:[a]}),u=[...n.getPreEmitDiagnostics(l),...l.emit().diagnostics];if(u.length!==0)return{command:`tsc --noEmit ${C.relative(e.root,a)}`,exitCode:1,output:Mi(n,u,e.root)}},Pi=async e=>{let t=await Me(e.configPath,e.cwd),n=t.config.appId,r=!1,i=await vi(e),a=await gi(i.hostUrl);if(!a?.deployToken)throw Error(`Not logged in for ${i.hostUrl}. Run tailorkit login after checking host in tailorkit.config.ts.`);let{buildApp:o,tailorkitUploadManifestSchema:s}=await import(`./assets/builder-wgJqHM_A.js`),[c,l]=await Promise.allSettled([o(e),Ni(t,e)]);if(c.status===`rejected`)throw c.reason;if(l.status===`rejected`)throw l.reason;if(l.value!==void 0&&!await e.onTypecheckFailed?.(l.value))throw Error(`Deployment cancelled because type check failed.`);let u=C.resolve(t.root,e.outDir??t.config.build?.outDir??`.tailorkit`),d=await Ti(u,s),f=C.join(u,d.assets.client),p=await _(f),m=await xi(p),h=Hr({headers:{authorization:`Bearer ${a.deployToken}`},url:i.hostUrl}),g=async a=>{let o=await Di(t.root);if(!await e.onMissingAppId?.({appName:o,configPath:t.filepath,hostUrl:i.hostUrl,reason:a}))throw Error(`Deployment cancelled.`);return n=Si(await h.apps.create({description:null,name:o})).id,r=!0,await Oi(t.filepath,n),n};n||=await g(`missing`);let v=async e=>Si(await h.deployments.create({appId:e,assets:[{checksum:Ei(p),contentLength:p.byteLength,contentType:`application/javascript`,encoding:`utf-8`,objectKey:d.assets.client}]})),y;try{y=await v(n)}catch(e){if(!wi(e))throw e;n=await g(`not-found`),y=await v(n)}await ki(y.assets[0],p);let b=Si(await h.deployments.publish({deploymentId:y.deployment.id,rollout:!0}));return{appId:n,createdApp:r,deploymentId:b.id,hostUrl:i.hostUrl,status:b.status,uploadedFiles:[{gzipSize:m.byteLength,path:d.assets.client,size:p.byteLength}]}},Fi=`/* eslint-disable */
51
51
 
52
52
  // This file was automatically generated by TailorKit.
53
53
  // Documentation: https://tailorkit.dev/docs
@@ -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.1`),$.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-wgJqHM_A.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-wgJqHM_A.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.3`),$.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.1",
3
+ "version": "0.1.0-beta.3",
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.1",
36
- "@tailorkit/core": "0.1.0-beta.1",
35
+ "@tailorkit/app": "0.1.0-beta.3",
36
+ "@tailorkit/core": "0.1.0-beta.3",
37
37
  "cac": "^7.0.0",
38
38
  "liquidjs": "^10.29.0",
39
39
  "picocolors": "^1.1.1",
@@ -1,2 +0,0 @@
1
- import{fileURLToPath as e}from"node:url";import{dirname as t}from"node:path";const n=e(import.meta.url);t(n);import{t as r}from"../index.js";import{z as i}from"zod";import{writeFile as a}from"fs/promises";import o from"path";import{createRequire as s}from"module";import{build as c}from"vite";var l=10,u=e=>{let t=/^(\d+)\./u.exec(e);if(!t?.[1])throw Error(`Unable to parse Preact version "${e}".`);return{major:Number.parseInt(t[1],10),version:e}},d=e=>{let t=u(e);if(t.major<l)throw Error(`TailorKit requires Preact ${l}.0.0 or newer, but found ${e}.`);return t},f=i.object({assets:i.object({client:i.string().min(1)}),version:i.literal(1)}),p=()=>f.parse({assets:{client:`client.js`},version:1}),m=/^preact(?:\/.*)?$/u,h=`preact/package.json`,g=`\0tailorkit-preact-package-json`,_=async(e={})=>{let t=await r(e.configPath,e.cwd),n=e.entry??t.config.client?.entry??`./src/client.ts`,i=e.outDir??t.config.build?.outDir??`.tailorkit`,s=v(t.root);d(s);let l=o.resolve(t.root,i),u=await c({build:{emptyOutDir:!0,lib:{entry:o.resolve(t.root,n),fileName:`client`,formats:[`es`]},outDir:l,watch:e.watch?{}:null,minify:`oxc`,rollupOptions:{external:e=>e!==h&&e!==g&&m.test(e),output:{comments:{annotation:!1,jsdoc:!1,legal:!1},minify:!0,minifyInternalExports:!0}}},configFile:!1,mode:e.mode,plugins:[{name:`tailorkit-preact-package-json`,enforce:`pre`,resolveId(e){return e===h?g:null},load(e){if(e===g){let e=JSON.stringify(s);return`export const version = ${e}; export default { version: ${e} };`}return null}}],root:t.root});return await a(o.join(l,`tailorkit-upload.json`),`${JSON.stringify(p(),null,2)}
2
- `,`utf-8`),u};function v(e){let t=s(o.join(e,`package.json`));try{let e=t(t.resolve(`preact/package.json`));if(typeof e.version==`string`)return e.version}catch(e){throw Error(`TailorKit requires Preact to build an app. Install preact@^10 and try again.`,{cause:e})}throw Error(`Unable to read the installed Preact version.`)}export{_ as buildApp,f as tailorkitUploadManifestSchema};