create-pylon 1.1.3-canary-20250207135026.a07eadea02b31ab0b1f8fb4f0c89392cf69a8698 → 1.2.0-canary-20250211153808.b2b63f4e67c55542413f7be6d62ce8139cfcbdbe

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- import{Option as k,program as J}from"commander";import u from"consola";import{input as E,select as W,confirm as N}from"@inquirer/prompts";import c from"path";import m from"chalk";import*as r from"fs";import*as L from"@getcronit/pylon-telemetry";import{fileURLToPath as ne}from"url";import{dirname as re}from"path";import{spawnSync as ce}from"child_process";import*as y from"node:fs";import*as h from"node:path";import M from"node:process";import{execSync as X}from"node:child_process";import I from"consola";function x(e){try{return X(`${e} --version`,{stdio:"ignore"}),!0}catch(a){return console.error(a),!1}}function z(){return typeof Bun<"u"&&x("bun")}function G(){return M.env.npm_execpath?.includes("npm")??!1}function Q(){return M.env.npm_execpath?.includes("yarn")??!1}function Z(){return typeof Deno<"u"&&x("deno")}function ee(){return M.env.npm_execpath?.includes("pnpm")??!1}function te(e){return y.existsSync(h.join(e,"bun.lockb"))?"bun":y.existsSync(h.join(e,"package-lock.json"))?"npm":y.existsSync(h.join(e,"yarn.lock"))?"yarn":y.existsSync(h.join(e,"deno.json"))||y.existsSync(h.join(e,"deno.lock"))?"deno":y.existsSync(h.join(e,"pnpm-lock.yaml"))?"pnpm":null}function R({preferredPm:e,cwd:a=M.cwd()}){if(e&&x(e))return e;if(z())return"bun";if(G())return"npm";if(ee())return"pnpm";if(Z())return"deno";if(Q())return"yarn";let n=te(a);if(n){if(I.info(`Detected package manager by lock file: ${n}`),x(n))return n;I.warn(`Lock file detected, but ${n} is not installed.`)}return"unknown"}function T(e){switch(e){case"bun":return"bun";case"npm":return"npm run";case"yarn":return"yarn";case"pnpm":return"pnpm run";case"deno":return"deno task";default:throw new Error("Unknown package manager")}}var ae=ne(import.meta.url),A=re(ae),U=JSON.parse(r.readFileSync(c.join(A,"..","package.json"),"utf-8")).version;function ie(e){try{r.mkdirSync(e,{recursive:!0})}catch(a){if(a instanceof Error&&"code"in a&&a.code==="EEXIST")return;throw a}}var D=[{key:"bun",name:"Bun.js",website:"https://bunjs.dev",templates:["default"]},{key:"node",name:"Node.js",website:"https://nodejs.org",templates:["default"]},{key:"cf-workers",name:"Cloudflare Workers",website:"https://workers.cloudflare.com",templates:["default"]},{key:"deno",name:"Deno",website:"https://deno.land",templates:["default"]}],q=[{key:"default",name:"Default",description:"Default template"},{key:"database",name:"Database (Prisma)",description:"Template with Prisma ORM"}],se=(e,a)=>{let n=e;return Object.entries(a).forEach(([i,f])=>{n=n.replaceAll(i,f)}),n},B=e=>{let a=n=>{let i=[];return r.readdirSync(n).forEach(b=>{let l=c.join(n,b);r.statSync(l).isDirectory()&&i.push(...a(l)),r.statSync(l).isFile()&&i.push(l)}),i};return a(e).map(n=>n.replace(e,"."))},oe=async e=>{let{runtime:a,template:n,target:i}=e,f=D.find(({key:t})=>t===a)?.name,b=q.find(({key:t})=>t===n)?.name;if(!f)throw new Error(`Invalid runtime: ${a}`);if(!b)throw new Error(`Invalid template: ${n}`);let l=c.join(A,"..","templates","shared");if(!r.existsSync(l))throw new Error(`Shared templates not found: ${l}`);let w=c.join(A,"..","templates",a,n);if(!r.existsSync(w))throw new Error(`Template not found: ${w}`);let P=c.join(process.cwd(),i);u.start(`Creating pylon in ${P}`);let v=t=>se(t,{__PYLON_NAME__:e.name});B(l).forEach(t=>{let d=c.join(l,t),s=c.join(P,t),p=c.dirname(s);if(a==="cf-workers"&&d.includes(".github/workflows/publish.yaml"))return;r.existsSync(p)||r.mkdirSync(p,{recursive:!0}),s.endsWith(".example")&&(s=s.replace(".example",""));let g=v(r.readFileSync(d,"utf-8"));r.writeFileSync(s,g)}),B(w).forEach(t=>{let d=c.join(w,t),s=c.join(P,t),p=c.dirname(s);r.existsSync(p)||r.mkdirSync(p,{recursive:!0}),s.endsWith(".example")&&(s=s.replace(".example",""));let g=v(r.readFileSync(d,"utf-8"));r.writeFileSync(s,g)}),u.success("Pylon created")},le=async e=>{let a=c.resolve(e.target),n=e.packageManager,i="";switch(n){case"yarn":i="yarn";break;case"npm":i="npm install";break;case"pnpm":i="pnpm install";break;case"bun":i="bun install";break;case"deno":i="deno install";break;default:throw new Error(`Invalid package manager: ${n}`)}if(u.start(`Installing dependencies using ${n}`),ce(i,{cwd:a,shell:!0,stdio:"inherit"}).status!==0)throw new Error("Failed to install dependencies");u.success("Dependencies installed")};J.name("create-pylon").version(U).arguments("[target]").addOption(new k("-i, --install","Install dependencies")).addOption(new k("-r, --runtime <runtime>","Runtime").choices(D.map(({key:e})=>e))).addOption(new k("-t, --template <template>","Template")).addOption(new k("-pm, --package-manager <packageManager>","Package manager")).addOption(new k("--client","Enable client generation (https://pylon.cronit.io/docs/integrations/gqty)")).addOption(new k("--client-path <clientPath>","Client path")).addOption(new k("--client-port <clientPort>","Client port")).action(me);var pe=e=>{if(e==="bun")return"bun";if(e==="deno")return"deno"};async function me(e,a,n){try{u.log(`${n.name()} version ${n.version()}`);let{install:i,runtime:f,template:b,packageManager:l,client:w,clientPath:P,clientPort:v}=a,t="";e?(t=e,u.success(`Using target directory \u2026 ${t}`)):t=await E({message:"Target directory",default:"my-pylon"});let d="";t==="."?d=c.basename(process.cwd()):d=c.basename(t);let s=f||await W({message:"Which runtime would you like to use?",choices:D.map(o=>({name:`${o.name} (${o.website})`,value:o.key})),default:0});if(!s)throw new Error("No runtime selected");let p=D.find(({key:o})=>o===s);if(!p)throw new Error(`Invalid runtime selected: ${s}`);let g=b||await W({message:"Which template would you like to use?",choices:q.filter(o=>p.templates?.includes(o.key)).map(o=>({name:o.name,value:o.key})),default:0});if(!g)throw new Error("No template selected");r.existsSync(t)?r.readdirSync(t).length>0&&(await N({message:"Directory not empty. Continue?",default:!1})||process.exit(1)):ie(t);let V=i||await N({message:"Would you like to install dependencies?"});await oe({name:d,runtime:s,template:g,target:t});let F=R({preferredPm:pe(p.key),cwd:t});V&&await le({target:t,packageManager:F});let Y=w||await N({message:"Would you like to enable client generation? (https://pylon.cronit.io/docs/integrations/gqty)",default:!1}),j="",C="",O="";if(Y){P||(j=await E({message:"Path to the root where the client should be generated",default:"."}),C=await E({message:"Path to generate the client to",default:c.join(j,"gqty/index.ts"),validate:K=>K.startsWith(j==="."?"":j)?!0:"Path must start with the client root"})),O=v||await E({message:"Port of the pylon server to generate the client from",default:"3000"}),u.start("Updating pylon dev script to generate client");let o,S;p.key==="deno"?(o=c.join(t,"deno.json"),S="tasks"):(o=c.join(t,"package.json"),S="scripts");let $=JSON.parse(r.readFileSync(o,"utf-8"));$[S]={...$[S],dev:$[S].dev+` --client --client-port ${O} --client-path ${C}`},r.writeFileSync(o,JSON.stringify($,null,2)),u.success("Pylon dev script updated")}let _=T(F),H=`
2
+ import{Option as $,program as F}from"commander";import y from"consola";import{input as Y,select as C,confirm as N}from"@inquirer/prompts";import o from"path";import m from"chalk";import*as t from"fs";import*as O from"@getcronit/pylon-telemetry";import{fileURLToPath as H}from"url";import{dirname as X}from"path";import{spawnSync as Q}from"child_process";import*as h from"node:fs";import*as w from"node:path";import v from"node:process";import{execSync as T}from"node:child_process";import M from"consola";function j(e){try{return T(`${e} --version`,{stdio:"ignore"}),!0}catch(r){return console.error(r),!1}}function B(){return typeof Bun<"u"&&j("bun")}function W(){return v.env.npm_execpath?.includes("npm")??!1}function L(){return v.env.npm_execpath?.includes("yarn")??!1}function J(){return typeof Deno<"u"&&j("deno")}function U(){return v.env.npm_execpath?.includes("pnpm")??!1}function V(e){return h.existsSync(w.join(e,"bun.lockb"))?"bun":h.existsSync(w.join(e,"package-lock.json"))?"npm":h.existsSync(w.join(e,"yarn.lock"))?"yarn":h.existsSync(w.join(e,"deno.json"))||h.existsSync(w.join(e,"deno.lock"))?"deno":h.existsSync(w.join(e,"pnpm-lock.yaml"))?"pnpm":null}function E({preferredPm:e,cwd:r=v.cwd()}){if(e&&j(e))return e;if(B())return"bun";if(W())return"npm";if(U())return"pnpm";if(J())return"deno";if(L())return"yarn";let n=V(r);if(n){if(M.info(`Detected package manager by lock file: ${n}`),j(n))return n;M.warn(`Lock file detected, but ${n} is not installed.`)}return"unknown"}function D(e){switch(e){case"bun":return"bun";case"npm":return"npm run";case"yarn":return"yarn";case"pnpm":return"pnpm run";case"deno":return"deno task";default:throw new Error("Unknown package manager")}}var q=H(import.meta.url),x=X(q),A=JSON.parse(t.readFileSync(o.join(x,"..","package.json"),"utf-8")).version;function z(e){try{t.mkdirSync(e,{recursive:!0})}catch(r){if(r instanceof Error&&"code"in r&&r.code==="EEXIST")return;throw r}}var P=[{key:"bun",name:"Bun.js",website:"https://bunjs.dev",templates:["default","pages"]},{key:"node",name:"Node.js",website:"https://nodejs.org",templates:["default"]},{key:"cf-workers",name:"Cloudflare Workers",website:"https://workers.cloudflare.com",templates:["default"]},{key:"deno",name:"Deno",website:"https://deno.land",templates:["default"]}],I=[{key:"default",name:"Default",description:"Default template"},{key:"database",name:"Database (Prisma)",description:"Template with Prisma ORM"},{key:"pages",name:"Fullstack (Pages)",description:"Build fullstack applications with pages and layouts."}],G=(e,r)=>{let n=e;return Object.entries(r).forEach(([a,k])=>{n=n.replaceAll(a,k)}),n},_=e=>{let r=n=>{let a=[];return t.readdirSync(n).forEach(S=>{let p=o.join(n,S);t.statSync(p).isDirectory()&&a.push(...r(p)),t.statSync(p).isFile()&&a.push(p)}),a};return r(e).map(n=>n.replace(e,"."))},K=async e=>{let{runtime:r,template:n,target:a}=e,k=P.find(({key:i})=>i===r)?.name,S=I.find(({key:i})=>i===n)?.name;if(!k)throw new Error(`Invalid runtime: ${r}`);if(!S)throw new Error(`Invalid template: ${n}`);let p=o.join(x,"..","templates","shared");if(!t.existsSync(p))throw new Error(`Shared templates not found: ${p}`);let s=o.join(x,"..","templates",r,n);if(!t.existsSync(s))throw new Error(`Template not found: ${s}`);let u=o.join(process.cwd(),a);y.start(`Creating pylon in ${u}`);let d=i=>G(i,{__PYLON_NAME__:e.name});_(p).forEach(i=>{let f=o.join(p,i),c=o.join(u,i),g=o.dirname(c);if(r==="cf-workers"&&f.includes(".github/workflows/publish.yaml"))return;t.existsSync(g)||t.mkdirSync(g,{recursive:!0}),c.endsWith(".example")&&(c=c.replace(".example",""));let b=d(t.readFileSync(f,"utf-8"));t.writeFileSync(c,b)}),_(s).forEach(i=>{let f=o.join(s,i),c=o.join(u,i),g=o.dirname(c);t.existsSync(g)||t.mkdirSync(g,{recursive:!0}),c.endsWith(".example")&&(c=c.replace(".example",""));let b=d(t.readFileSync(f,"utf-8"));t.writeFileSync(c,b)}),y.success("Pylon created")},Z=async e=>{let r=o.resolve(e.target),n=e.packageManager,a="";switch(n){case"yarn":a="yarn";break;case"npm":a="npm install";break;case"pnpm":a="pnpm install";break;case"bun":a="bun install";break;case"deno":a="deno install";break;default:throw new Error(`Invalid package manager: ${n}`)}if(y.start(`Installing dependencies using ${n}`),Q(a,{cwd:r,shell:!0,stdio:"inherit"}).status!==0)throw new Error("Failed to install dependencies");y.success("Dependencies installed")};F.name("create-pylon").version(A).arguments("[target]").addOption(new $("-i, --install","Install dependencies")).addOption(new $("-r, --runtime <runtime>","Runtime").choices(P.map(({key:e})=>e))).addOption(new $("-t, --template <template>","Template")).addOption(new $("-pm, --package-manager <packageManager>","Package manager")).action(ne);var ee=e=>{if(e==="bun")return"bun";if(e==="deno")return"deno"};async function ne(e,r,n){try{y.log(`${n.name()} version ${n.version()}`);let{install:a,runtime:k,template:S,packageManager:p}=r,s="";e?(s=e,y.success(`Using target directory \u2026 ${s}`)):s=await Y({message:"Target directory",default:"my-pylon"});let u="";s==="."?u=o.basename(process.cwd()):u=o.basename(s);let d=k||await C({message:"Which runtime would you like to use?",choices:P.map(l=>({name:`${l.name} (${l.website})`,value:l.key})),default:0});if(!d)throw new Error("No runtime selected");let i=P.find(({key:l})=>l===d);if(!i)throw new Error(`Invalid runtime selected: ${d}`);let f=S||await C({message:"Which template would you like to use?",choices:I.filter(l=>i.templates?.includes(l.key)).map(l=>({name:l.name,value:l.key})),default:0});if(!f)throw new Error("No template selected");t.existsSync(s)?t.readdirSync(s).length>0&&(await N({message:"Directory not empty. Continue?",default:!1})||process.exit(1)):z(s);let c=a||await N({message:"Would you like to install dependencies?"});await K({name:u,runtime:d,template:f,target:s});let g=E({preferredPm:ee(i.key),cwd:s});c&&await Z({target:s,packageManager:g});let b=D(g),R=`
3
3
  \u{1F389} ${m.green.bold("Pylon created successfully.")}
4
4
 
5
5
  \u{1F4BB} ${m.cyan.bold("Continue Developing")}
6
- ${m.yellow("Change directories:")} cd ${m.blue(t)}
7
- ${m.yellow("Start dev server:")} ${_} dev
8
- ${m.yellow("Deploy:")} ${_} deploy
6
+ ${m.yellow("Change directories:")} cd ${m.blue(s)}
7
+ ${m.yellow("Start dev server:")} ${b} dev
8
+ ${m.yellow("Deploy:")} ${b} deploy
9
9
 
10
10
  \u{1F4D6} ${m.cyan.bold("Explore Documentation")}
11
11
  ${m.underline.blue("https://pylon.cronit.io/docs")}
12
12
 
13
13
  \u{1F4AC} ${m.cyan.bold("Join our Community")}
14
14
  ${m.underline.blue("https://discord.gg/cbJjkVrnHe")}
15
- `;await L.sendCreateEvent({name:d,pylonCreateVersion:U,runtime:s,template:g,clientPath:C||void 0,clientPort:parseInt(O)||void 0}),u.box(H)}catch(i){u.error(i)}}J.parse();
15
+ `;await O.sendCreateEvent({name:u,pylonCreateVersion:A,runtime:d,template:f}),y.box(R)}catch(a){y.error(a)}}F.parse();
16
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/detect-pm.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n\nimport {Option, program, type Command} from 'commander'\nimport consola from 'consola'\nimport {input, select, confirm} from '@inquirer/prompts'\nimport path from 'path'\nimport chalk from 'chalk'\nimport * as fs from 'fs'\n\nimport * as telemetry from '@getcronit/pylon-telemetry'\n\nimport {fileURLToPath} from 'url'\nimport {dirname} from 'path'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nconst version = (() => {\n return JSON.parse(\n fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8')\n ).version as string\n})()\n\nfunction mkdirp(dir: string) {\n try {\n fs.mkdirSync(dir, {recursive: true})\n } catch (e) {\n if (e instanceof Error) {\n if ('code' in e && e.code === 'EEXIST') return\n }\n throw e\n }\n}\n\nconst runtimes: {\n key: string\n name: string\n website: string\n templates?: string[]\n}[] = [\n {\n key: 'bun',\n name: 'Bun.js',\n website: 'https://bunjs.dev',\n templates: ['default']\n },\n {\n key: 'node',\n name: 'Node.js',\n website: 'https://nodejs.org',\n templates: ['default']\n },\n {\n key: 'cf-workers',\n name: 'Cloudflare Workers',\n website: 'https://workers.cloudflare.com',\n templates: ['default']\n },\n {\n key: 'deno',\n name: 'Deno',\n website: 'https://deno.land',\n templates: ['default']\n }\n]\n\nconst templates: {\n key: string\n name: string\n description: string\n}[] = [\n {\n key: 'default',\n name: 'Default',\n description: 'Default template'\n },\n {\n key: 'database',\n name: 'Database (Prisma)',\n description: 'Template with Prisma ORM'\n }\n]\n\nconst injectVariablesInContent = (\n content: string,\n variables: Record<string, string>\n) => {\n let result = content\n\n Object.entries(variables).forEach(([key, value]) => {\n result = result.replaceAll(key, value)\n })\n\n return result\n}\nconst readdirFilesSyncRecursive = (dir: string): string[] => {\n const run = (dir: string): string[] => {\n const result: string[] = []\n\n const files = fs.readdirSync(dir)\n\n files.forEach(file => {\n const filePath = path.join(dir, file)\n\n if (fs.statSync(filePath).isDirectory()) {\n result.push(...run(filePath))\n }\n\n // Only add files\n if (fs.statSync(filePath).isFile()) {\n result.push(filePath)\n }\n })\n\n return result\n }\n\n return run(dir).map(file => {\n return file.replace(dir, '.')\n })\n}\n\nconst createTemplate = async (options: {\n name: string\n runtime: string\n template: string\n target: string\n}) => {\n const {runtime, template, target} = options\n\n const runtimeName = runtimes.find(({key}) => key === runtime)?.name\n const templateName = templates.find(({key}) => key === template)?.name\n\n if (!runtimeName) {\n throw new Error(`Invalid runtime: ${runtime}`)\n }\n\n if (!templateName) {\n throw new Error(`Invalid template: ${template}`)\n }\n\n // The templates are stored in the `templates` directory\n const sharedTemplateDir = path.join(__dirname, '..', 'templates', 'shared')\n\n if (!fs.existsSync(sharedTemplateDir)) {\n throw new Error(`Shared templates not found: ${sharedTemplateDir}`)\n }\n\n const templateDir = path.join(__dirname, '..', 'templates', runtime, template)\n\n if (!fs.existsSync(templateDir)) {\n throw new Error(`Template not found: ${templateDir}`)\n }\n\n // The target directory is already created\n const targetDirectoryPath = path.join(process.cwd(), target)\n\n consola.start(`Creating pylon in ${targetDirectoryPath}`)\n\n const inject = (content: string) => {\n return injectVariablesInContent(content, {\n __PYLON_NAME__: options.name\n })\n }\n\n // Copy the shared template files\n readdirFilesSyncRecursive(sharedTemplateDir).forEach(file => {\n const source = path.join(sharedTemplateDir, file)\n let target = path.join(targetDirectoryPath, file)\n\n // Create folder recursively and copy file\n\n const targetDir = path.dirname(target)\n\n // Skip the .github/workflows directory for cf-workers runtime\n if (\n runtime === 'cf-workers' &&\n source.includes('.github/workflows/publish.yaml')\n ) {\n return\n }\n\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, {recursive: true})\n }\n\n // If the target ends with `.example`, remove the suffix.\n // This is useful for `.gitignore.example` files because they are not published in\n // the `create-pylon` package when named `.gitignore`.\n if (target.endsWith('.example')) {\n target = target.replace('.example', '')\n }\n\n const injectedContent = inject(fs.readFileSync(source, 'utf-8'))\n\n fs.writeFileSync(target, injectedContent)\n })\n\n // Copy the runtime specific template files\n readdirFilesSyncRecursive(templateDir).forEach(file => {\n const source = path.join(templateDir, file)\n let target = path.join(targetDirectoryPath, file)\n\n // Create folder recursively and copy file\n const targetDir = path.dirname(target)\n\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, {recursive: true})\n }\n\n // If the target ends with `.example`, remove the suffix.\n // This is useful for `.gitignore.example` files because they are not published in\n // the `create-pylon` package when named `.gitignore`.\n if (target.endsWith('.example')) {\n target = target.replace('.example', '')\n }\n\n const injectedContent = inject(fs.readFileSync(source, 'utf-8'))\n\n fs.writeFileSync(target, injectedContent)\n })\n\n consola.success(`Pylon created`)\n}\n\nimport {spawnSync} from 'child_process'\nimport {detectPackageManager, getRunScript, PackageManager} from './detect-pm'\n\nconst installDependencies = async (args: {\n target: string\n packageManager: PackageManager\n}) => {\n const target = path.resolve(args.target)\n const packageManager = args.packageManager\n\n let command = ''\n\n switch (packageManager) {\n case 'yarn':\n command = 'yarn'\n break\n case 'npm':\n command = 'npm install'\n break\n case 'pnpm':\n command = 'pnpm install'\n break\n case 'bun':\n command = 'bun install'\n break\n case 'deno':\n command = 'deno install'\n break\n default:\n throw new Error(`Invalid package manager: ${packageManager}`)\n }\n\n consola.start(`Installing dependencies using ${packageManager}`)\n\n const proc = spawnSync(command, {\n cwd: target,\n shell: true,\n stdio: 'inherit'\n })\n\n if (proc.status !== 0) {\n throw new Error(`Failed to install dependencies`)\n }\n\n consola.success(`Dependencies installed`)\n}\n\nprogram\n .name('create-pylon')\n .version(version)\n .arguments('[target]')\n .addOption(new Option('-i, --install', 'Install dependencies'))\n .addOption(\n new Option('-r, --runtime <runtime>', 'Runtime').choices(\n runtimes.map(({key}) => key)\n )\n )\n .addOption(new Option('-t, --template <template>', 'Template'))\n .addOption(\n new Option('-pm, --package-manager <packageManager>', 'Package manager')\n )\n .addOption(\n new Option(\n '--client',\n 'Enable client generation (https://pylon.cronit.io/docs/integrations/gqty)'\n )\n )\n .addOption(new Option('--client-path <clientPath>', 'Client path'))\n .addOption(new Option('--client-port <clientPort>', 'Client port'))\n .action(main)\n\ntype ArgOptions = {\n install: boolean\n runtime: string\n template: string\n packageManager?: PackageManager\n client?: boolean\n clientPath?: string\n clientPort?: string\n}\n\nconst getPreferredPmByRuntime = (\n runtime: string\n): PackageManager | undefined => {\n if (runtime === 'bun') {\n return 'bun'\n } else if (runtime === 'deno') {\n return 'deno'\n }\n}\n\nasync function main(\n targetDir: string | undefined,\n options: ArgOptions,\n command: Command\n) {\n try {\n consola.log(`${command.name()} version ${command.version()}`)\n\n const {\n install: installArg,\n runtime: runtimeArg,\n template: templateArg,\n packageManager: packageManagerArg,\n client: clientArg,\n clientPath: clientPathArg,\n clientPort: clientPortArg\n } = options\n\n let target = ''\n\n if (targetDir) {\n target = targetDir\n\n consola.success(`Using target directory \u2026 ${target}`)\n } else {\n const answer = await input({\n message: 'Target directory',\n default: 'my-pylon'\n })\n target = answer\n }\n\n let projectName = ''\n\n if (target === '.') {\n projectName = path.basename(process.cwd())\n } else {\n projectName = path.basename(target)\n }\n\n const runtimeName =\n runtimeArg ||\n (await select({\n message: 'Which runtime would you like to use?',\n choices: runtimes.map(runtime => ({\n name: `${runtime.name} (${runtime.website})`,\n value: runtime.key\n })),\n default: 0\n }))\n\n if (!runtimeName) {\n throw new Error('No runtime selected')\n }\n\n const runtime = runtimes.find(({key}) => key === runtimeName)\n\n if (!runtime) {\n throw new Error(`Invalid runtime selected: ${runtimeName}`)\n }\n\n const templateName =\n templateArg ||\n (await select({\n message: 'Which template would you like to use?',\n choices: templates\n .filter(template => runtime.templates?.includes(template.key))\n .map(template => ({\n name: template.name,\n value: template.key\n })),\n default: 0\n }))\n\n if (!templateName) {\n throw new Error('No template selected')\n }\n\n if (fs.existsSync(target)) {\n if (fs.readdirSync(target).length > 0) {\n const response = await confirm({\n message: 'Directory not empty. Continue?',\n default: false\n })\n if (!response) {\n process.exit(1)\n }\n }\n } else {\n mkdirp(target)\n }\n\n const install =\n installArg ||\n (await confirm({message: 'Would you like to install dependencies?'}))\n\n await createTemplate({\n name: projectName,\n runtime: runtimeName,\n template: templateName,\n target\n })\n\n const packageManager = detectPackageManager({\n preferredPm: getPreferredPmByRuntime(runtime.key),\n cwd: target\n })\n\n if (install) {\n await installDependencies({target, packageManager})\n }\n\n const client =\n clientArg ||\n (await confirm({\n message:\n 'Would you like to enable client generation? (https://pylon.cronit.io/docs/integrations/gqty)',\n default: false\n }))\n\n let clientRoot: string = ''\n let clientPath: string = ''\n let clientPort: string = ''\n\n if (client) {\n if (!clientPathArg) {\n clientRoot = await input({\n message: 'Path to the root where the client should be generated',\n default: '.'\n })\n\n clientPath = await input({\n message: 'Path to generate the client to',\n default: path.join(clientRoot, 'gqty/index.ts'),\n validate: value => {\n // Check if the path starts with the client root (take care of .)\n if (!value.startsWith(clientRoot === '.' ? '' : clientRoot)) {\n return 'Path must start with the client root'\n }\n\n return true\n }\n })\n }\n\n clientPort =\n clientPortArg ||\n (await input({\n message: 'Port of the pylon server to generate the client from',\n default: '3000'\n }))\n\n consola.start(`Updating pylon dev script to generate client`)\n\n let packagePath: string\n let scriptKey: string\n if (runtime.key === 'deno') {\n packagePath = path.join(target, 'deno.json')\n scriptKey = 'tasks'\n } else {\n packagePath = path.join(target, 'package.json')\n scriptKey = 'scripts'\n }\n\n const devScript = JSON.parse(fs.readFileSync(packagePath, 'utf-8'))\n\n devScript[scriptKey] = {\n ...devScript[scriptKey],\n dev:\n devScript[scriptKey].dev +\n ` --client --client-port ${clientPort} --client-path ${clientPath}`\n }\n\n fs.writeFileSync(packagePath, JSON.stringify(devScript, null, 2))\n\n consola.success(`Pylon dev script updated`)\n }\n\n const runScript = getRunScript(packageManager)\n\n const message = `\n\uD83C\uDF89 ${chalk.green.bold('Pylon created successfully.')}\n\n\uD83D\uDCBB ${chalk.cyan.bold('Continue Developing')}\n ${chalk.yellow('Change directories:')} cd ${chalk.blue(target)}\n ${chalk.yellow('Start dev server:')} ${runScript} dev\n ${chalk.yellow('Deploy:')} ${runScript} deploy\n\n\uD83D\uDCD6 ${chalk.cyan.bold('Explore Documentation')}\n ${chalk.underline.blue('https://pylon.cronit.io/docs')}\n\n\uD83D\uDCAC ${chalk.cyan.bold('Join our Community')}\n ${chalk.underline.blue('https://discord.gg/cbJjkVrnHe')}\n`\n\n await telemetry.sendCreateEvent({\n name: projectName,\n pylonCreateVersion: version,\n runtime: runtimeName,\n template: templateName,\n clientPath: clientPath || undefined,\n clientPort: parseInt(clientPort) || undefined\n })\n\n consola.box(message)\n } catch (e) {\n consola.error(e)\n }\n}\n\nprogram.parse()\n", "import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport process from 'node:process'\nimport {execSync} from 'node:child_process'\nimport consola from 'consola'\n\n// Helper function to check if a command exists\nfunction isCommandAvailable(command: string): boolean {\n try {\n execSync(`${command} --version`, {stdio: 'ignore'})\n return true\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\n// Detect Bun\nfunction isBun(): boolean {\n // @ts-ignore: Bun may not be defined\n return typeof Bun !== 'undefined' && isCommandAvailable('bun')\n}\n\n// Detect npm\nfunction isNpm(): boolean {\n return process.env.npm_execpath?.includes('npm') ?? false\n}\n\n// Detect Yarn\nfunction isYarn(): boolean {\n return process.env.npm_execpath?.includes('yarn') ?? false\n}\n\n// Detect Deno\nfunction isDeno(): boolean {\n // @ts-ignore: Deno may not be defined\n return typeof Deno !== 'undefined' && isCommandAvailable('deno')\n}\n\n// Detect pnpm\nfunction isPnpm(): boolean {\n return process.env.npm_execpath?.includes('pnpm') ?? false\n}\n\n// Detect based on lock files\nfunction detectByLockFiles(cwd: string): PackageManager | null {\n if (fs.existsSync(path.join(cwd, 'bun.lockb'))) {\n return 'bun'\n }\n if (fs.existsSync(path.join(cwd, 'package-lock.json'))) {\n return 'npm'\n }\n if (fs.existsSync(path.join(cwd, 'yarn.lock'))) {\n return 'yarn'\n }\n if (\n fs.existsSync(path.join(cwd, 'deno.json')) ||\n fs.existsSync(path.join(cwd, 'deno.lock'))\n ) {\n return 'deno'\n }\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n return null\n}\n\nexport type PackageManager =\n | 'bun'\n | 'npm'\n | 'yarn'\n | 'pnpm'\n | 'deno'\n | 'unknown'\n\n// Main detection function\nexport function detectPackageManager({\n preferredPm,\n cwd = process.cwd()\n}: {\n preferredPm?: PackageManager\n cwd?: string\n}): PackageManager {\n // Check the preferred package manager first\n if (preferredPm && isCommandAvailable(preferredPm)) {\n return preferredPm\n }\n\n // Proceed with detection logic\n if (isBun()) {\n return 'bun'\n }\n if (isNpm()) {\n return 'npm'\n }\n if (isPnpm()) {\n return 'pnpm'\n }\n if (isDeno()) {\n return 'deno'\n }\n if (isYarn()) {\n return 'yarn'\n }\n\n // Fallback to lock file detection\n const lockFileDetection = detectByLockFiles(cwd)\n if (lockFileDetection) {\n consola.info(`Detected package manager by lock file: ${lockFileDetection}`)\n if (isCommandAvailable(lockFileDetection)) {\n return lockFileDetection\n } else {\n consola.warn(\n `Lock file detected, but ${lockFileDetection} is not installed.`\n )\n }\n }\n\n return 'unknown'\n}\n\ntype PackageManagerScript =\n | 'bun'\n | 'npm run'\n | 'yarn'\n | 'pnpm run'\n | 'deno task'\n\n// Run script detection\nexport function getRunScript(pm: PackageManager): PackageManagerScript {\n switch (pm) {\n case 'bun':\n return 'bun'\n case 'npm':\n return 'npm run'\n case 'yarn':\n return 'yarn'\n case 'pnpm':\n return 'pnpm run'\n case 'deno':\n return 'deno task'\n default:\n throw new Error('Unknown package manager')\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["Option", "program", "consola", "input", "select", "confirm", "path", "chalk", "fs", "telemetry", "fileURLToPath", "dirname", "spawnSync", "fs", "path", "process", "execSync", "consola", "isCommandAvailable", "command", "e", "isBun", "isNpm", "isYarn", "isDeno", "isPnpm", "detectByLockFiles", "cwd", "detectPackageManager", "preferredPm", "lockFileDetection", "getRunScript", "pm", "__filename", "fileURLToPath", "__dirname", "dirname", "version", "path", "mkdirp", "dir", "e", "runtimes", "templates", "injectVariablesInContent", "content", "variables", "result", "key", "value", "readdirFilesSyncRecursive", "run", "file", "filePath", "createTemplate", "options", "runtime", "template", "target", "runtimeName", "templateName", "sharedTemplateDir", "templateDir", "targetDirectoryPath", "consola", "inject", "source", "targetDir", "injectedContent", "installDependencies", "args", "packageManager", "command", "spawnSync", "program", "Option", "main", "getPreferredPmByRuntime", "installArg", "runtimeArg", "templateArg", "packageManagerArg", "clientArg", "clientPathArg", "clientPortArg", "input", "projectName", "select", "confirm", "install", "detectPackageManager", "client", "clientRoot", "clientPath", "clientPort", "packagePath", "scriptKey", "devScript", "runScript", "getRunScript", "message", "chalk"]
4
+ "sourcesContent": ["#!/usr/bin/env node\n\nimport {Option, program, type Command} from 'commander'\nimport consola from 'consola'\nimport {input, select, confirm} from '@inquirer/prompts'\nimport path from 'path'\nimport chalk from 'chalk'\nimport * as fs from 'fs'\n\nimport * as telemetry from '@getcronit/pylon-telemetry'\n\nimport {fileURLToPath} from 'url'\nimport {dirname} from 'path'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\n\nconst version = (() => {\n return JSON.parse(\n fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8')\n ).version as string\n})()\n\nfunction mkdirp(dir: string) {\n try {\n fs.mkdirSync(dir, {recursive: true})\n } catch (e) {\n if (e instanceof Error) {\n if ('code' in e && e.code === 'EEXIST') return\n }\n throw e\n }\n}\n\nconst runtimes: {\n key: string\n name: string\n website: string\n templates?: string[]\n}[] = [\n {\n key: 'bun',\n name: 'Bun.js',\n website: 'https://bunjs.dev',\n templates: ['default', 'pages']\n },\n {\n key: 'node',\n name: 'Node.js',\n website: 'https://nodejs.org',\n templates: ['default']\n },\n {\n key: 'cf-workers',\n name: 'Cloudflare Workers',\n website: 'https://workers.cloudflare.com',\n templates: ['default']\n },\n {\n key: 'deno',\n name: 'Deno',\n website: 'https://deno.land',\n templates: ['default']\n }\n]\n\nconst templates: {\n key: string\n name: string\n description: string\n}[] = [\n {\n key: 'default',\n name: 'Default',\n description: 'Default template'\n },\n {\n key: 'database',\n name: 'Database (Prisma)',\n description: 'Template with Prisma ORM'\n },\n {\n key: 'pages',\n name: 'Fullstack (Pages)',\n description: 'Build fullstack applications with pages and layouts.'\n }\n]\n\nconst injectVariablesInContent = (\n content: string,\n variables: Record<string, string>\n) => {\n let result = content\n\n Object.entries(variables).forEach(([key, value]) => {\n result = result.replaceAll(key, value)\n })\n\n return result\n}\nconst readdirFilesSyncRecursive = (dir: string): string[] => {\n const run = (dir: string): string[] => {\n const result: string[] = []\n\n const files = fs.readdirSync(dir)\n\n files.forEach(file => {\n const filePath = path.join(dir, file)\n\n if (fs.statSync(filePath).isDirectory()) {\n result.push(...run(filePath))\n }\n\n // Only add files\n if (fs.statSync(filePath).isFile()) {\n result.push(filePath)\n }\n })\n\n return result\n }\n\n return run(dir).map(file => {\n return file.replace(dir, '.')\n })\n}\n\nconst createTemplate = async (options: {\n name: string\n runtime: string\n template: string\n target: string\n}) => {\n const {runtime, template, target} = options\n\n const runtimeName = runtimes.find(({key}) => key === runtime)?.name\n const templateName = templates.find(({key}) => key === template)?.name\n\n if (!runtimeName) {\n throw new Error(`Invalid runtime: ${runtime}`)\n }\n\n if (!templateName) {\n throw new Error(`Invalid template: ${template}`)\n }\n\n // The templates are stored in the `templates` directory\n const sharedTemplateDir = path.join(__dirname, '..', 'templates', 'shared')\n\n if (!fs.existsSync(sharedTemplateDir)) {\n throw new Error(`Shared templates not found: ${sharedTemplateDir}`)\n }\n\n const templateDir = path.join(__dirname, '..', 'templates', runtime, template)\n\n if (!fs.existsSync(templateDir)) {\n throw new Error(`Template not found: ${templateDir}`)\n }\n\n // The target directory is already created\n const targetDirectoryPath = path.join(process.cwd(), target)\n\n consola.start(`Creating pylon in ${targetDirectoryPath}`)\n\n const inject = (content: string) => {\n return injectVariablesInContent(content, {\n __PYLON_NAME__: options.name\n })\n }\n\n // Copy the shared template files\n readdirFilesSyncRecursive(sharedTemplateDir).forEach(file => {\n const source = path.join(sharedTemplateDir, file)\n let target = path.join(targetDirectoryPath, file)\n\n // Create folder recursively and copy file\n\n const targetDir = path.dirname(target)\n\n // Skip the .github/workflows directory for cf-workers runtime\n if (\n runtime === 'cf-workers' &&\n source.includes('.github/workflows/publish.yaml')\n ) {\n return\n }\n\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, {recursive: true})\n }\n\n // If the target ends with `.example`, remove the suffix.\n // This is useful for `.gitignore.example` files because they are not published in\n // the `create-pylon` package when named `.gitignore`.\n if (target.endsWith('.example')) {\n target = target.replace('.example', '')\n }\n\n const injectedContent = inject(fs.readFileSync(source, 'utf-8'))\n\n fs.writeFileSync(target, injectedContent)\n })\n\n // Copy the runtime specific template files\n readdirFilesSyncRecursive(templateDir).forEach(file => {\n const source = path.join(templateDir, file)\n let target = path.join(targetDirectoryPath, file)\n\n // Create folder recursively and copy file\n const targetDir = path.dirname(target)\n\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, {recursive: true})\n }\n\n // If the target ends with `.example`, remove the suffix.\n // This is useful for `.gitignore.example` files because they are not published in\n // the `create-pylon` package when named `.gitignore`.\n if (target.endsWith('.example')) {\n target = target.replace('.example', '')\n }\n\n const injectedContent = inject(fs.readFileSync(source, 'utf-8'))\n\n fs.writeFileSync(target, injectedContent)\n })\n\n consola.success(`Pylon created`)\n}\n\nimport {spawnSync} from 'child_process'\nimport {detectPackageManager, getRunScript, PackageManager} from './detect-pm'\n\nconst installDependencies = async (args: {\n target: string\n packageManager: PackageManager\n}) => {\n const target = path.resolve(args.target)\n const packageManager = args.packageManager\n\n let command = ''\n\n switch (packageManager) {\n case 'yarn':\n command = 'yarn'\n break\n case 'npm':\n command = 'npm install'\n break\n case 'pnpm':\n command = 'pnpm install'\n break\n case 'bun':\n command = 'bun install'\n break\n case 'deno':\n command = 'deno install'\n break\n default:\n throw new Error(`Invalid package manager: ${packageManager}`)\n }\n\n consola.start(`Installing dependencies using ${packageManager}`)\n\n const proc = spawnSync(command, {\n cwd: target,\n shell: true,\n stdio: 'inherit'\n })\n\n if (proc.status !== 0) {\n throw new Error(`Failed to install dependencies`)\n }\n\n consola.success(`Dependencies installed`)\n}\n\nprogram\n .name('create-pylon')\n .version(version)\n .arguments('[target]')\n .addOption(new Option('-i, --install', 'Install dependencies'))\n .addOption(\n new Option('-r, --runtime <runtime>', 'Runtime').choices(\n runtimes.map(({key}) => key)\n )\n )\n .addOption(new Option('-t, --template <template>', 'Template'))\n .addOption(\n new Option('-pm, --package-manager <packageManager>', 'Package manager')\n )\n .action(main)\n\ntype ArgOptions = {\n install: boolean\n runtime: string\n template: string\n packageManager?: PackageManager\n}\n\nconst getPreferredPmByRuntime = (\n runtime: string\n): PackageManager | undefined => {\n if (runtime === 'bun') {\n return 'bun'\n } else if (runtime === 'deno') {\n return 'deno'\n }\n}\n\nasync function main(\n targetDir: string | undefined,\n options: ArgOptions,\n command: Command\n) {\n try {\n consola.log(`${command.name()} version ${command.version()}`)\n\n const {\n install: installArg,\n runtime: runtimeArg,\n template: templateArg,\n packageManager: packageManagerArg\n } = options\n\n let target = ''\n\n if (targetDir) {\n target = targetDir\n\n consola.success(`Using target directory \u2026 ${target}`)\n } else {\n const answer = await input({\n message: 'Target directory',\n default: 'my-pylon'\n })\n target = answer\n }\n\n let projectName = ''\n\n if (target === '.') {\n projectName = path.basename(process.cwd())\n } else {\n projectName = path.basename(target)\n }\n\n const runtimeName =\n runtimeArg ||\n (await select({\n message: 'Which runtime would you like to use?',\n choices: runtimes.map(runtime => ({\n name: `${runtime.name} (${runtime.website})`,\n value: runtime.key\n })),\n default: 0\n }))\n\n if (!runtimeName) {\n throw new Error('No runtime selected')\n }\n\n const runtime = runtimes.find(({key}) => key === runtimeName)\n\n if (!runtime) {\n throw new Error(`Invalid runtime selected: ${runtimeName}`)\n }\n\n const templateName =\n templateArg ||\n (await select({\n message: 'Which template would you like to use?',\n choices: templates\n .filter(template => runtime.templates?.includes(template.key))\n .map(template => ({\n name: template.name,\n value: template.key\n })),\n default: 0\n }))\n\n if (!templateName) {\n throw new Error('No template selected')\n }\n\n if (fs.existsSync(target)) {\n if (fs.readdirSync(target).length > 0) {\n const response = await confirm({\n message: 'Directory not empty. Continue?',\n default: false\n })\n if (!response) {\n process.exit(1)\n }\n }\n } else {\n mkdirp(target)\n }\n\n const install =\n installArg ||\n (await confirm({message: 'Would you like to install dependencies?'}))\n\n await createTemplate({\n name: projectName,\n runtime: runtimeName,\n template: templateName,\n target\n })\n\n const packageManager = detectPackageManager({\n preferredPm: getPreferredPmByRuntime(runtime.key),\n cwd: target\n })\n\n if (install) {\n await installDependencies({target, packageManager})\n }\n\n const runScript = getRunScript(packageManager)\n\n const message = `\n\uD83C\uDF89 ${chalk.green.bold('Pylon created successfully.')}\n\n\uD83D\uDCBB ${chalk.cyan.bold('Continue Developing')}\n ${chalk.yellow('Change directories:')} cd ${chalk.blue(target)}\n ${chalk.yellow('Start dev server:')} ${runScript} dev\n ${chalk.yellow('Deploy:')} ${runScript} deploy\n\n\uD83D\uDCD6 ${chalk.cyan.bold('Explore Documentation')}\n ${chalk.underline.blue('https://pylon.cronit.io/docs')}\n\n\uD83D\uDCAC ${chalk.cyan.bold('Join our Community')}\n ${chalk.underline.blue('https://discord.gg/cbJjkVrnHe')}\n`\n\n await telemetry.sendCreateEvent({\n name: projectName,\n pylonCreateVersion: version,\n runtime: runtimeName,\n template: templateName\n })\n\n consola.box(message)\n } catch (e) {\n consola.error(e)\n }\n}\n\nprogram.parse()\n", "import * as fs from 'node:fs'\nimport * as path from 'node:path'\nimport process from 'node:process'\nimport {execSync} from 'node:child_process'\nimport consola from 'consola'\n\n// Helper function to check if a command exists\nfunction isCommandAvailable(command: string): boolean {\n try {\n execSync(`${command} --version`, {stdio: 'ignore'})\n return true\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\n// Detect Bun\nfunction isBun(): boolean {\n // @ts-ignore: Bun may not be defined\n return typeof Bun !== 'undefined' && isCommandAvailable('bun')\n}\n\n// Detect npm\nfunction isNpm(): boolean {\n return process.env.npm_execpath?.includes('npm') ?? false\n}\n\n// Detect Yarn\nfunction isYarn(): boolean {\n return process.env.npm_execpath?.includes('yarn') ?? false\n}\n\n// Detect Deno\nfunction isDeno(): boolean {\n // @ts-ignore: Deno may not be defined\n return typeof Deno !== 'undefined' && isCommandAvailable('deno')\n}\n\n// Detect pnpm\nfunction isPnpm(): boolean {\n return process.env.npm_execpath?.includes('pnpm') ?? false\n}\n\n// Detect based on lock files\nfunction detectByLockFiles(cwd: string): PackageManager | null {\n if (fs.existsSync(path.join(cwd, 'bun.lockb'))) {\n return 'bun'\n }\n if (fs.existsSync(path.join(cwd, 'package-lock.json'))) {\n return 'npm'\n }\n if (fs.existsSync(path.join(cwd, 'yarn.lock'))) {\n return 'yarn'\n }\n if (\n fs.existsSync(path.join(cwd, 'deno.json')) ||\n fs.existsSync(path.join(cwd, 'deno.lock'))\n ) {\n return 'deno'\n }\n if (fs.existsSync(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n return null\n}\n\nexport type PackageManager =\n | 'bun'\n | 'npm'\n | 'yarn'\n | 'pnpm'\n | 'deno'\n | 'unknown'\n\n// Main detection function\nexport function detectPackageManager({\n preferredPm,\n cwd = process.cwd()\n}: {\n preferredPm?: PackageManager\n cwd?: string\n}): PackageManager {\n // Check the preferred package manager first\n if (preferredPm && isCommandAvailable(preferredPm)) {\n return preferredPm\n }\n\n // Proceed with detection logic\n if (isBun()) {\n return 'bun'\n }\n if (isNpm()) {\n return 'npm'\n }\n if (isPnpm()) {\n return 'pnpm'\n }\n if (isDeno()) {\n return 'deno'\n }\n if (isYarn()) {\n return 'yarn'\n }\n\n // Fallback to lock file detection\n const lockFileDetection = detectByLockFiles(cwd)\n if (lockFileDetection) {\n consola.info(`Detected package manager by lock file: ${lockFileDetection}`)\n if (isCommandAvailable(lockFileDetection)) {\n return lockFileDetection\n } else {\n consola.warn(\n `Lock file detected, but ${lockFileDetection} is not installed.`\n )\n }\n }\n\n return 'unknown'\n}\n\ntype PackageManagerScript =\n | 'bun'\n | 'npm run'\n | 'yarn'\n | 'pnpm run'\n | 'deno task'\n\n// Run script detection\nexport function getRunScript(pm: PackageManager): PackageManagerScript {\n switch (pm) {\n case 'bun':\n return 'bun'\n case 'npm':\n return 'npm run'\n case 'yarn':\n return 'yarn'\n case 'pnpm':\n return 'pnpm run'\n case 'deno':\n return 'deno task'\n default:\n throw new Error('Unknown package manager')\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Option", "program", "consola", "input", "select", "confirm", "path", "chalk", "fs", "telemetry", "fileURLToPath", "dirname", "spawnSync", "fs", "path", "process", "execSync", "consola", "isCommandAvailable", "command", "e", "isBun", "isNpm", "isYarn", "isDeno", "isPnpm", "detectByLockFiles", "cwd", "detectPackageManager", "preferredPm", "lockFileDetection", "getRunScript", "pm", "__filename", "fileURLToPath", "__dirname", "dirname", "version", "path", "mkdirp", "dir", "e", "runtimes", "templates", "injectVariablesInContent", "content", "variables", "result", "key", "value", "readdirFilesSyncRecursive", "run", "file", "filePath", "createTemplate", "options", "runtime", "template", "target", "runtimeName", "templateName", "sharedTemplateDir", "templateDir", "targetDirectoryPath", "consola", "inject", "source", "targetDir", "injectedContent", "installDependencies", "args", "packageManager", "command", "spawnSync", "program", "Option", "main", "getPreferredPmByRuntime", "installArg", "runtimeArg", "templateArg", "packageManagerArg", "input", "projectName", "select", "confirm", "install", "detectPackageManager", "runScript", "getRunScript", "message", "chalk"]
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-pylon",
3
3
  "type": "module",
4
- "version": "1.1.3-canary-20250207135026.a07eadea02b31ab0b1f8fb4f0c89392cf69a8698",
4
+ "version": "1.2.0-canary-20250211153808.b2b63f4e67c55542413f7be6d62ce8139cfcbdbe",
5
5
  "description": "CLI for creating a Pylon",
6
6
  "bin": "./dist/index.js",
7
7
  "files": [
@@ -22,7 +22,7 @@
22
22
  "commander": "^12.1.0",
23
23
  "consola": "^3.2.3",
24
24
  "hono": "^4",
25
- "@getcronit/pylon-telemetry": "^1.0.3-canary-20250207135026.a07eadea02b31ab0b1f8fb4f0c89392cf69a8698"
25
+ "@getcronit/pylon-telemetry": "^1.0.3"
26
26
  },
27
27
  "engines": {
28
28
  "node": ">=18.0.0"
@@ -0,0 +1,57 @@
1
+ import * as React from 'react'
2
+ import {Slot} from '@radix-ui/react-slot'
3
+ import {cva, type VariantProps} from 'class-variance-authority'
4
+
5
+ import {cn} from '@/lib/utils'
6
+
7
+ const buttonVariants = cva(
8
+ 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default:
13
+ 'bg-primary text-primary-foreground shadow hover:bg-primary/90',
14
+ destructive:
15
+ 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',
16
+ outline:
17
+ 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',
18
+ secondary:
19
+ 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',
20
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
21
+ link: 'text-primary underline-offset-4 hover:underline'
22
+ },
23
+ size: {
24
+ default: 'h-9 px-4 py-2',
25
+ sm: 'h-8 rounded-md px-3 text-xs',
26
+ lg: 'h-10 rounded-md px-8',
27
+ icon: 'h-9 w-9'
28
+ }
29
+ },
30
+ defaultVariants: {
31
+ variant: 'default',
32
+ size: 'default'
33
+ }
34
+ }
35
+ )
36
+
37
+ export interface ButtonProps
38
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
39
+ VariantProps<typeof buttonVariants> {
40
+ asChild?: boolean
41
+ }
42
+
43
+ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
44
+ ({className, variant, size, asChild = false, ...props}, ref) => {
45
+ const Comp = asChild ? Slot : 'button'
46
+ return (
47
+ <Comp
48
+ className={cn(buttonVariants({variant, size, className}))}
49
+ ref={ref}
50
+ {...props}
51
+ />
52
+ )
53
+ }
54
+ )
55
+ Button.displayName = 'Button'
56
+
57
+ export {Button, buttonVariants}
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
+ "rsc": false,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "tailwind.config.js",
8
+ "css": "globals.css",
9
+ "baseColor": "zinc",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "aliases": {
14
+ "components": "@/components",
15
+ "utils": "@/lib/utils",
16
+ "ui": "@/components/ui",
17
+ "lib": "@/lib",
18
+ "hooks": "@/hooks"
19
+ },
20
+ "iconLibrary": "lucide"
21
+ }
@@ -0,0 +1,179 @@
1
+ @import 'tailwindcss';
2
+
3
+ @plugin 'tailwindcss-animate';
4
+
5
+ @custom-variant dark (&:is(.dark *));
6
+
7
+ @theme {
8
+ --color-background: hsl(var(--background));
9
+ --color-foreground: hsl(var(--foreground));
10
+
11
+ --color-card: hsl(var(--card));
12
+ --color-card-foreground: hsl(var(--card-foreground));
13
+
14
+ --color-popover: hsl(var(--popover));
15
+ --color-popover-foreground: hsl(var(--popover-foreground));
16
+
17
+ --color-primary: hsl(var(--primary));
18
+ --color-primary-foreground: hsl(var(--primary-foreground));
19
+
20
+ --color-secondary: hsl(var(--secondary));
21
+ --color-secondary-foreground: hsl(var(--secondary-foreground));
22
+
23
+ --color-muted: hsl(var(--muted));
24
+ --color-muted-foreground: hsl(var(--muted-foreground));
25
+
26
+ --color-accent: hsl(var(--accent));
27
+ --color-accent-foreground: hsl(var(--accent-foreground));
28
+
29
+ --color-destructive: hsl(var(--destructive));
30
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
31
+
32
+ --color-border: hsl(var(--border));
33
+ --color-input: hsl(var(--input));
34
+ --color-ring: hsl(var(--ring));
35
+
36
+ --color-chart-1: hsl(var(--chart-1));
37
+ --color-chart-2: hsl(var(--chart-2));
38
+ --color-chart-3: hsl(var(--chart-3));
39
+ --color-chart-4: hsl(var(--chart-4));
40
+ --color-chart-5: hsl(var(--chart-5));
41
+
42
+ --color-sidebar: hsl(var(--sidebar-background));
43
+ --color-sidebar-foreground: hsl(var(--sidebar-foreground));
44
+ --color-sidebar-primary: hsl(var(--sidebar-primary));
45
+ --color-sidebar-primary-foreground: hsl(var(--sidebar-primary-foreground));
46
+ --color-sidebar-accent: hsl(var(--sidebar-accent));
47
+ --color-sidebar-accent-foreground: hsl(var(--sidebar-accent-foreground));
48
+ --color-sidebar-border: hsl(var(--sidebar-border));
49
+ --color-sidebar-ring: hsl(var(--sidebar-ring));
50
+
51
+ --radius-lg: var(--radius);
52
+ --radius-md: calc(var(--radius) - 2px);
53
+ --radius-sm: calc(var(--radius) - 4px);
54
+
55
+ --animate-accordion-down: accordion-down 0.2s ease-out;
56
+ --animate-accordion-up: accordion-up 0.2s ease-out;
57
+
58
+ @keyframes accordion-down {
59
+ from {
60
+ height: 0;
61
+ }
62
+ to {
63
+ height: var(--radix-accordion-content-height);
64
+ }
65
+ }
66
+ @keyframes accordion-up {
67
+ from {
68
+ height: var(--radix-accordion-content-height);
69
+ }
70
+ to {
71
+ height: 0;
72
+ }
73
+ }
74
+ }
75
+
76
+ /*
77
+ The default border color has changed to `currentColor` in Tailwind CSS v4,
78
+ so we've added these compatibility styles to make sure everything still
79
+ looks the same as it did with Tailwind CSS v3.
80
+
81
+ If we ever want to remove these styles, we need to add an explicit border
82
+ color utility to any element that depends on these defaults.
83
+ */
84
+ @layer base {
85
+ *,
86
+ ::after,
87
+ ::before,
88
+ ::backdrop,
89
+ ::file-selector-button {
90
+ border-color: var(--color-gray-200, currentColor);
91
+ }
92
+ }
93
+
94
+ @layer utilities {
95
+ body {
96
+ font-family: Arial, Helvetica, sans-serif;
97
+ }
98
+ }
99
+
100
+ @layer base {
101
+ :root {
102
+ --background: 0 0% 100%;
103
+ --foreground: 0 0% 3.9%;
104
+ --card: 0 0% 100%;
105
+ --card-foreground: 0 0% 3.9%;
106
+ --popover: 0 0% 100%;
107
+ --popover-foreground: 0 0% 3.9%;
108
+ --primary: 0 0% 9%;
109
+ --primary-foreground: 0 0% 98%;
110
+ --secondary: 0 0% 96.1%;
111
+ --secondary-foreground: 0 0% 9%;
112
+ --muted: 0 0% 96.1%;
113
+ --muted-foreground: 0 0% 45.1%;
114
+ --accent: 0 0% 96.1%;
115
+ --accent-foreground: 0 0% 9%;
116
+ --destructive: 0 84.2% 60.2%;
117
+ --destructive-foreground: 0 0% 98%;
118
+ --border: 0 0% 89.8%;
119
+ --input: 0 0% 89.8%;
120
+ --ring: 0 0% 3.9%;
121
+ --chart-1: 12 76% 61%;
122
+ --chart-2: 173 58% 39%;
123
+ --chart-3: 197 37% 24%;
124
+ --chart-4: 43 74% 66%;
125
+ --chart-5: 27 87% 67%;
126
+ --radius: 0.5rem;
127
+ --sidebar-background: 0 0% 98%;
128
+ --sidebar-foreground: 240 5.3% 26.1%;
129
+ --sidebar-primary: 240 5.9% 10%;
130
+ --sidebar-primary-foreground: 0 0% 98%;
131
+ --sidebar-accent: 240 4.8% 95.9%;
132
+ --sidebar-accent-foreground: 240 5.9% 10%;
133
+ --sidebar-border: 220 13% 91%;
134
+ --sidebar-ring: 217.2 91.2% 59.8%;
135
+ }
136
+ .dark {
137
+ --background: 0 0% 3.9%;
138
+ --foreground: 0 0% 98%;
139
+ --card: 0 0% 3.9%;
140
+ --card-foreground: 0 0% 98%;
141
+ --popover: 0 0% 3.9%;
142
+ --popover-foreground: 0 0% 98%;
143
+ --primary: 0 0% 98%;
144
+ --primary-foreground: 0 0% 9%;
145
+ --secondary: 0 0% 14.9%;
146
+ --secondary-foreground: 0 0% 98%;
147
+ --muted: 0 0% 14.9%;
148
+ --muted-foreground: 0 0% 63.9%;
149
+ --accent: 0 0% 14.9%;
150
+ --accent-foreground: 0 0% 98%;
151
+ --destructive: 0 62.8% 30.6%;
152
+ --destructive-foreground: 0 0% 98%;
153
+ --border: 0 0% 14.9%;
154
+ --input: 0 0% 14.9%;
155
+ --ring: 0 0% 83.1%;
156
+ --chart-1: 220 70% 50%;
157
+ --chart-2: 160 60% 45%;
158
+ --chart-3: 30 80% 55%;
159
+ --chart-4: 280 65% 60%;
160
+ --chart-5: 340 75% 55%;
161
+ --sidebar-background: 240 5.9% 10%;
162
+ --sidebar-foreground: 240 4.8% 95.9%;
163
+ --sidebar-primary: 224.3 76.3% 48%;
164
+ --sidebar-primary-foreground: 0 0% 100%;
165
+ --sidebar-accent: 240 3.7% 15.9%;
166
+ --sidebar-accent-foreground: 240 4.8% 95.9%;
167
+ --sidebar-border: 240 3.7% 15.9%;
168
+ --sidebar-ring: 217.2 91.2% 59.8%;
169
+ }
170
+ }
171
+
172
+ @layer base {
173
+ * {
174
+ @apply border-border;
175
+ }
176
+ body {
177
+ @apply bg-background text-foreground;
178
+ }
179
+ }
@@ -0,0 +1,6 @@
1
+ import {clsx, type ClassValue} from 'clsx'
2
+ import {twMerge} from 'tailwind-merge'
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "examples-pages",
3
+ "private": true,
4
+ "version": "0.0.1",
5
+ "type": "module",
6
+ "description": "Generated with `npm create pylon`",
7
+ "scripts": {
8
+ "dev": "pylon dev -c \"bun run .pylon/index.js\"",
9
+ "build": "pylon build"
10
+ },
11
+ "dependencies": {
12
+ "@getcronit/pylon": "^3.0.0",
13
+ "@radix-ui/react-slot": "^1.1.2",
14
+ "bun-types": "^1.1.18",
15
+ "class-variance-authority": "^0.7.1",
16
+ "clsx": "^2.1.1",
17
+ "lucide-react": "^0.474.0",
18
+ "react": "^19.0.0",
19
+ "react-dom": "^19.0.0",
20
+ "tailwind-merge": "^3.0.1",
21
+ "tailwindcss": "^4.0.4",
22
+ "tailwindcss-animate": "^1.0.7"
23
+ },
24
+ "devDependencies": {
25
+ "@getcronit/pylon-dev": "^2.0.0",
26
+ "@types/react": "^19.0.8"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/getcronit/pylon.git"
31
+ },
32
+ "homepage": "https://pylon.cronit.io"
33
+ }
@@ -0,0 +1,9 @@
1
+ import '../globals.css'
2
+
3
+ export default function RootLayout({children}: {children: React.ReactNode}) {
4
+ return (
5
+ <html lang="en">
6
+ <body>{children}</body>
7
+ </html>
8
+ )
9
+ }
@@ -0,0 +1,13 @@
1
+ import {Button} from '@/components/ui/button'
2
+ import {PageProps} from '@getcronit/pylon'
3
+
4
+ const Page: React.FC<PageProps> = ({data}) => {
5
+ return (
6
+ <div>
7
+ <title>{data.hello}</title>
8
+ <Button>{data.hello}</Button>
9
+ </div>
10
+ )
11
+ }
12
+
13
+ export default Page
@@ -0,0 +1,5 @@
1
+ import tailwindPostCss from '@tailwindcss/postcss'
2
+
3
+ export default {
4
+ plugins: [tailwindPostCss]
5
+ }
@@ -0,0 +1,10 @@
1
+ import '@getcronit/pylon'
2
+ import {useQuery} from './.pylon/client'
3
+
4
+ declare module '@getcronit/pylon' {
5
+ interface Bindings {}
6
+
7
+ interface Variables {}
8
+
9
+ interface PageData extends ReturnType<typeof useQuery> {}
10
+ }
@@ -0,0 +1,16 @@
1
+ import {app, usePages, PylonConfig} from '@getcronit/pylon'
2
+
3
+ export const graphql = {
4
+ Query: {
5
+ hello: () => {
6
+ return 'Hello, world!'
7
+ }
8
+ },
9
+ Mutation: {}
10
+ }
11
+
12
+ export const config: PylonConfig = {
13
+ plugins: [usePages()]
14
+ }
15
+
16
+ export default app
@@ -0,0 +1,20 @@
1
+ {
2
+ "extends": "@getcronit/pylon/tsconfig.pylon.json",
3
+ "compilerOptions": {
4
+ // add Bun type definitions
5
+ "types": ["bun-types"],
6
+ "baseUrl": ".",
7
+ "paths": {
8
+ "@/*": ["./*"]
9
+ },
10
+ "jsx": "react-jsx", // support JSX
11
+ "allowJs": true // allow importing `.js` from `.ts`
12
+ },
13
+ "include": [
14
+ "pylon.d.ts",
15
+ "src/**/*.ts",
16
+ "pages",
17
+ "components",
18
+ ".pylon/**/*.ts"
19
+ ]
20
+ }