@h3ravel/console 11.4.0 → 11.5.0

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 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));Object.defineProperty(exports,`__toESM`,{enumerable:!0,get:function(){return s}});
package/bin/fire.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));require(`tsx/esm`);let c=require(`@h3ravel/core`);c=s(c);let l=require(`@h3ravel/shared`);l=s(l);let u=require(`execa`);u=s(u);let d=require(`preferred-pm`);d=s(d);let f=require(`node:fs/promises`);f=s(f);let p=require(`@h3ravel/support`);p=s(p);let m=require(`dayjs`);m=s(m);let h=require(`node:path`);h=s(h);let g=require(`commander`);g=s(g);let _=require(`node:fs`);_=s(_);let v=require(`child_process`);v=s(v);let y=require(`path`);y=s(y);let b=require(`tsdown`);b=s(b);var x=class extends c.ConsoleCommand{signature=`build:
2
+ const e=require(`./chunk-CUT6urMc.cjs`);require(`tsx/esm`);let t=require(`@h3ravel/core`);t=e.__toESM(t);let n=require(`@h3ravel/shared`);n=e.__toESM(n);let r=require(`execa`);r=e.__toESM(r);let i=require(`preferred-pm`);i=e.__toESM(i);let a=require(`node:fs/promises`);a=e.__toESM(a);let o=require(`@h3ravel/support`);o=e.__toESM(o);let s=require(`dayjs`);s=e.__toESM(s);let c=require(`node:path`);c=e.__toESM(c);let l=require(`commander`);l=e.__toESM(l);let u=require(`node:fs`);u=e.__toESM(u);let d=require(`child_process`);d=e.__toESM(d);let f=require(`path`);f=e.__toESM(f);let p=require(`tsdown`);p=e.__toESM(p);var m=class extends t.ConsoleCommand{signature=`build:
3
3
  {--m|minify=false : Minify your bundle output}
4
- `;description=`Build the app for production`;async handle(){try{await this.fire()}catch(e){l.Logger.error(e)}}async fire(){let e=env(`DIST_DIR`,`dist`),t=(await(0,d.default)(base_path()))?.name??`pnpm`,n=this.option(`minify`),r={EXTENDED_DEBUG:Number(this.option(`verbose`,0))>0?`true`:`false`,CLI_BUILD:`true`,NODE_ENV:`production`,DIST_DIR:e,DIST_MINIFY:n,LOG_LEVEL:[`silent`,`info`,`warn`,`error`][Number(this.option(`verbose`,0))]},i=r.LOG_LEVEL===`silent`?`--silent`:null;l.Logger.log([[`
5
- INFO `,`bgBlue`],[` Creating Production Bundle`,`white`]],``),console.log(``),await l.TaskManager.taskRunner(l.Logger.log([[` SUCCESS `,`bgGreen`],[` Production Bundle Created`,`white`]],``,!1),async()=>{await(0,u.execa)(t,[`tsdown`,i,`--config-loader`,`unconfig`,`-c`,`tsdown.default.config.ts`].filter(e=>e!==null),{stdout:`inherit`,stderr:`inherit`,cwd:base_path(),env:Object.assign({},process.env,r)}),console.log(``)})}},S=class extends c.ConsoleCommand{};const C=String.raw`
4
+ `;description=`Build the app for production`;async handle(){try{await this.fire()}catch(e){n.Logger.error(e)}}async fire(){let e=env(`DIST_DIR`,`dist`),t=(await(0,i.default)(base_path()))?.name??`pnpm`,a=this.option(`minify`),o={EXTENDED_DEBUG:Number(this.option(`verbose`,0))>0?`true`:`false`,CLI_BUILD:`true`,NODE_ENV:`production`,DIST_DIR:e,DIST_MINIFY:a,LOG_LEVEL:[`silent`,`info`,`warn`,`error`][Number(this.option(`verbose`,0))]},s=o.LOG_LEVEL===`silent`?`--silent`:null;n.Logger.log([[`
5
+ INFO `,`bgBlue`],[` Creating Production Bundle`,`white`]],``),console.log(``),await n.TaskManager.taskRunner(n.Logger.log([[` SUCCESS `,`bgGreen`],[` Production Bundle Created`,`white`]],``,!1),async()=>{await(0,r.execa)(t,[`tsdown`,s,`--config-loader`,`unconfig`,`-c`,`tsdown.default.config.ts`].filter(e=>e!==null),{stdout:`inherit`,stderr:`inherit`,cwd:base_path(),env:Object.assign({},process.env,o)}),console.log(``)})}},h=class extends t.ConsoleCommand{};const g=String.raw`
6
6
  111
7
7
  111111111
8
8
  1111111111 111111
@@ -24,19 +24,19 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=
24
24
  111111 111 111111
25
25
  111111111
26
26
  110
27
- `,w=String.raw`
27
+ `,_=String.raw`
28
28
  _ _ _____ _
29
29
  | | | |___ / _ __ __ ___ _____| |
30
30
  | |_| | |_ \| '__/ _ \ \ / / _ \ |
31
31
  | _ |___) | | | (_| |\ V / __/ |
32
32
  |_| |_|____/|_| \__,_| \_/ \___|_|
33
33
 
34
- `;var T=class extends S{signature=`list`;description=`List all available commands`;async handle(){let e=[{short:`-h`,long:`--help`,description:`Display help for the given command. When no command is given display help for the list command`}].concat(this.program.options).map(e=>l.Logger.describe(l.Logger.log(` `+[e.short,e.long].filter(e=>!!e).join(`, `),`green`,!1),e.description,25,!1).join(``)),t=this.program.commands.map(e=>l.Logger.describe(l.Logger.log(` `+e.name(),`green`,!1),e.description(),25,!1).join(``)).reduce((e,t)=>{let n=t.replace(/\x1b\[\d+m/g,``),r=n.includes(`:`)?n.split(`:`)[0].trim():`__root__`;return e[r]??=[],e[r].push(t),e},{}),n=Object.entries(t).map(([e,t])=>{let n=e===`__root__`?``:e;return[l.Logger.log(n,`yellow`,!1),t.join(`
34
+ `;var v=class extends h{signature=`list`;description=`List all available commands`;async handle(){let e=[{short:`-h`,long:`--help`,description:`Display help for the given command. When no command is given display help for the list command`}].concat(this.program.options).map(e=>n.Logger.describe(n.Logger.log(` `+[e.short,e.long].filter(e=>!!e).join(`, `),`green`,!1),e.description,25,!1).join(``)),t=this.program.commands.map(e=>n.Logger.describe(n.Logger.log(` `+e.name(),`green`,!1),e.description(),25,!1).join(``)).reduce((e,t)=>{let n=t.replace(/\x1b\[\d+m/g,``),r=n.includes(`:`)?n.split(`:`)[0].trim():`__root__`;return e[r]??=[],e[r].push(t),e},{}),r=Object.entries(t).map(([e,t])=>{let r=e===`__root__`?``:e;return[n.Logger.log(r,`yellow`,!1),t.join(`
35
35
  `)].join(`
36
- `)});l.Logger.log([[`H3ravel Framework`,`white`],[this.kernel.modulePackage.version,`green`]],` `),console.log(``),console.log(w),console.log(``),l.Logger.log(`Usage:`,`yellow`),l.Logger.log(` command [options] [arguments]`,`white`),console.log(``),l.Logger.log(`Options:`,`yellow`),console.log(e.join(`
37
- `).trim()),console.log(``),l.Logger.log(`Available Commands:`,`yellow`),console.log(n.join(`
36
+ `)});n.Logger.log([[`H3ravel Framework`,`white`],[this.kernel.modulePackage.version,`green`]],` `),console.log(``),console.log(_),console.log(``),n.Logger.log(`Usage:`,`yellow`),n.Logger.log(` command [options] [arguments]`,`white`),console.log(``),n.Logger.log(`Options:`,`yellow`),console.log(e.join(`
37
+ `).trim()),console.log(``),n.Logger.log(`Available Commands:`,`yellow`),console.log(r.join(`
38
38
 
39
- `).trim())}},E=class e{static CREATE_PATTERNS=[/^create_(\w+)_table$/,/^create_(\w+)$/];static CHANGE_PATTERNS=[/.+_(to|from|in)_(\w+)_table$/,/.+_(to|from|in)_(\w+)$/];static guess(t){for(let n of e.CREATE_PATTERNS){let e=t.match(n);if(e)return[e[1],!0]}for(let n of e.CHANGE_PATTERNS){let e=t.match(n);if(e)return[e[2],!1]}return[]}},D=class extends S{signature=`#make:
39
+ `).trim())}},y=class e{static CREATE_PATTERNS=[/^create_(\w+)_table$/,/^create_(\w+)$/];static CHANGE_PATTERNS=[/.+_(to|from|in)_(\w+)_table$/,/.+_(to|from|in)_(\w+)$/];static guess(t){for(let n of e.CREATE_PATTERNS){let e=t.match(n);if(e)return[e[1],!0]}for(let n of e.CHANGE_PATTERNS){let e=t.match(n);if(e)return[e[2],!1]}return[]}},b=class extends h{signature=`#make:
40
40
  {controller : Create a new controller class.
41
41
  | {--a|api : Exclude the create and edit methods from the controller}
42
42
  | {--m|model= : Generate a resource controller for the given model}
@@ -73,5 +73,5 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=
73
73
  | {--force : Create the model even if it already exists}
74
74
  }
75
75
  {^name : The name of the [name] to generate}
76
- `;description=`Generate component classes`;async handle(){let e=this.dictionary.baseCommand??this.dictionary.name;this.argument(`name`)||this.program.error(`Please provide a valid name for the `+e);let t={controller:`makeController`,resource:`makeResource`,migration:`makeMigration`,factory:`makeFactory`,seeder:`makeSeeder`,model:`makeModel`,view:`makeView`,command:`makeCommand`};try{await this?.[t[e]]()}catch(e){l.Logger.error(e)}}async makeController(){let e=this.option(`api`)?`-resource`:``,t=this.argument(`name`),n=this.option(`force`),r=l.FileSystem.findModulePkg(`@h3ravel/http`,this.kernel.cwd)??``,i=h.default.join(r,`dist/stubs/controller${e}.stub`),a=app_path(`Http/Controllers/${t}.ts`);t.includes(`/`)&&await(0,f.mkdir)((0,p.beforeLast)(a,`/`),{recursive:!0}),!n&&await l.FileSystem.fileExists(a)&&l.Logger.error(`ERORR: ${t} controller already exists`);let o=await(0,f.readFile)(i,`utf-8`);o=o.replace(/{{ name }}/g,t),await(0,f.writeFile)(a,o),l.Logger.split(`INFO: Controller Created`,l.Logger.log(h.default.basename(a),`gray`,!1))}makeResource(){l.Logger.success(`Resource support is not yet available`)}async makeMigration(){let e=this.argument(`name`),t=(0,m.default)().format(`YYYY_MM_DD_HHmmss`),n=database_path(`migrations/${t}_${e}.ts`),r=l.FileSystem.findModulePkg(`@h3ravel/database`,this.kernel.cwd)??``,i=this.option(`create`,!1),a=this.option(`table`);if(!a&&typeof i==`string`&&(a=i,i=!0),!a){let t=E.guess(e);a=t[0],i=!!t[1]}let o=h.default.join(r,this.getMigrationStubName(a,i)),s=await(0,f.readFile)(o,`utf-8`);a!==null&&(s=s.replace(/DummyTable|{{\s*table\s*}}/g,a)),l.Logger.info(`INFO: Creating Migration`),await this.kernel.ensureDirectoryExists(h.default.dirname(n)),await(0,f.writeFile)(n,s),l.Logger.split(`INFO: Migration Created`,l.Logger.log(h.default.basename(n),`gray`,!1))}makeFactory(){l.Logger.success(`Factory support is not yet available`)}makeCommand(){l.Logger.success(`Musket command creation is not yet available`)}makeSeeder(){l.Logger.success(`Seeder support is not yet available`)}async makeModel(){let e=this.option(`type`,`ts`),t=this.argument(`name`),n=this.option(`force`),r=app_path(`Models/${t.toLowerCase()}.${e}`);t.includes(`/`)&&await(0,f.mkdir)((0,p.beforeLast)(r,`/`),{recursive:!0}),!n&&await l.FileSystem.fileExists(r)&&l.Logger.error(`ERORR: ${t} model already exists`);let i=l.FileSystem.findModulePkg(`@h3ravel/database`,this.kernel.cwd)??``,a=h.default.join(i,`dist/stubs/model-${e}.stub`),o=await(0,f.readFile)(a,`utf-8`);o=o.replace(/{{ name }}/g,t),await(0,f.writeFile)(r,o),l.Logger.split(`INFO: ${t} Model Created`,l.Logger.log(h.default.basename(r),`gray`,!1))}async makeView(){let e=this.argument(`name`),t=this.option(`force`),n=base_path(`src/resources/views/${e}.edge`);e.includes(`/`)&&await(0,f.mkdir)((0,p.beforeLast)(n,`/`),{recursive:!0}),!t&&await l.FileSystem.fileExists(n)&&l.Logger.error(`ERORR: ${e} view already exists`),await(0,f.writeFile)(n,`{{-- src/resources/views/${e}.edge --}}`),l.Logger.split(`INFO: View Created`,l.Logger.log(`src/resources/views/${e}.edge`,`gray`,!1))}getMigrationStubName(e,t=!1,n=`ts`){let r;return r=e?t?`migration.create-${n}.stub`:`migration.update-${n}.stub`:`migration-${n}.stub`,`dist/stubs/`+r}},O=class extends S{signature=`postinstall`;description=`Default post installation command`;async handle(){this.createSqliteDB()}async createSqliteDB(){config(`database.default`)===`sqlite`&&(await l.FileSystem.fileExists(database_path())||await(0,f.mkdir)(database_path(),{recursive:!0}),await l.FileSystem.fileExists(database_path(`db.sqlite`))||await(0,f.writeFile)(database_path(`db.sqlite`),``))}},k=class e{static parseOptions(t){let n=[],r=/\{([^{}]+(?:\{[^{}]*\}[^{}]*)*)\}/g,i;for(;(i=r.exec(t))!==null;){let t=i[1][0]===`^`||/:[#^]/.test(i[1]),r=([`#`,`^`].includes(i[1][0])||/:[#^]/.test(i[1]))&&!t,a=i[1].trim().replace(/[#^]/,``),o=a.indexOf(`:`);if(o===-1){n.push({name:a});continue}let s=a.substring(0,o).trim(),c=a.substring(o+1).trim(),l=c,u,d=c.indexOf(`|`);if(d!==-1){l=c.substring(0,d).trim();let t=c.substring(d+1).trim().replace(/^\{/,``).trim();u=e.parseOptions(`{`+t+`}`)}else l=l.trim();let f=s,p=/[^a-zA-Z0-9_|-]/.test(f),m=!1;f.endsWith(`?*`)?(p=!1,m=!0,f=f.slice(0,-2)):f.endsWith(`*`)?(m=!0,f=f.slice(0,-1)):f.endsWith(`?`)&&(p=!1,f=f.slice(0,-1));let h=f.startsWith(`--`),g,_;if(h){let e=f.split(`|`).map(e=>e.trim());g=[];for(let t of e){t.startsWith(`--`)&&t.slice(2).length===1?t=`-`+t.slice(2):t.startsWith(`-`)&&!t.startsWith(`--`)&&t.slice(1).length>1?t=`--`+t.slice(1):!t.startsWith(`-`)&&t.slice(1).length>1&&(t=`--`+t);let e=t.indexOf(`=`);if(e!==-1){g.push(t.substring(0,e));let n=t.substring(e+1);_=n===`*`?[]:n===`true`||n===`false`||!n&&!p?n===`true`:isNaN(Number(n))?n:Number(n)}else g.push(t)}}n.push({name:h?g[g.length-1]:f,required:p,multiple:m,description:l,flags:g,shared:t,isFlag:h,isHidden:r,defaultValue:_,nestedOptions:u})}return n}static parseSignature(t,n){let r=t.split(`
77
- `).map(e=>e.trim()).filter(e=>e.length>0),i=[`#`,`^`].includes(r[0][0])||/:[#^]/.test(r[0]),a=r[0].replace(/[^\w=:-]/g,``),o=n.getDescription(),s=a.endsWith(`:`),c=r.slice(1).join(` `),l=e.parseOptions(c);return s?{baseCommand:a.slice(0,-1),isNamespaceCommand:s,subCommands:l.filter(e=>!e.flags&&!e.isHidden),description:o,commandClass:n,options:l.filter(e=>!!e.flags),isHidden:i}:{baseCommand:a,isNamespaceCommand:s,options:l,description:o,commandClass:n,isHidden:i}}};function A(e={}){let t,n,r=e.args||[],i=e.allowRestarts||!1,a=e.input,o=e.options||e;return delete o.args,delete o.allowRestarts,{name:`run`,buildStart(e){let n=a??e.input;if(typeof n==`string`&&(n=[n]),typeof n==`object`&&(n=Object.values(n)),n.length>1)throw Error("@rollup/plugin-run must have a single entry point; consider setting the `input` option");t=(0,y.resolve)(n[0])},generateBundle(e,t,n){n||this.error(`@rollup/plugin-run currently only works with bundles that are written to disk`)},writeBundle(e,a){let s=(e,t)=>{n&&n.kill(),n=(0,v.fork)((0,y.join)(e,t),r,o)},c=e.dir||(0,y.dirname)(e.file),l=Object.keys(a).find(e=>{let n=a[e];return n.isEntry&&n.facadeModuleId===t});l?(s(c,l),i&&(process.stdin.resume(),process.stdin.setEncoding(`utf8`),process.stdin.on(`data`,e=>{let t=e.toString().trim().toLowerCase();t===`rs`||t===`restart`||e.toString().charCodeAt(0)===11?s(c,l):(t===`cls`||t===`clear`||e.toString().charCodeAt(0)===12)&&console.clear()}))):this.error(`@rollup/plugin-run could not find output chunk`)}}}const j=process.env.NODE_ENV||`development`;let M=j===`development`?`.h3ravel/serve`:`dist`;process.env.DIST_DIR&&(M=process.env.DIST_DIR);const N={outDir:M,entry:[`src/**/*.ts`],format:[`esm`],target:`node22`,sourcemap:j===`development`,minify:!!process.env.DIST_MINIFY,clean:!0,shims:!0,copy:[{from:`public`,to:M},`src/resources`,`src/database`],env:j===`development`?{NODE_ENV:j,DIST_DIR:M}:{},watch:j===`development`&&process.env.CLI_BUILD!==`true`?[`.env`,`.env.*`,`src`,`../../packages`]:!1,dts:!1,logLevel:`silent`,nodeProtocol:!0,skipNodeModulesBundle:!0,hooks(e){e.hook(`build:done`,async()=>{let e=[`database/migrations`,`database/factories`,`database/seeders`];for(let t=0;t<e.length;t++){let n=e[t];(0,_.existsSync)(h.default.join(M,n))&&await(0,f.rm)(h.default.join(M,n),{recursive:!0})}})},plugins:j===`development`&&process.env.CLI_BUILD!==`true`?[A({env:Object.assign({},process.env,{NODE_ENV:j,DIST_DIR:M}),execArgv:[`-r`,`source-map-support/register`],allowRestarts:!1,input:process.cwd()+`/src/server.ts`})]:[]};var P=N,F=class e{commands=[];constructor(e,t){this.app=e,this.kernel=t}async build(){return this.loadBaseCommands(),await this.loadDiscoveredCommands(),this.initialize()}loadBaseCommands(){[new D(this.app,this.kernel),new T(this.app,this.kernel),new O(this.app,this.kernel),new x(this.app,this.kernel)].forEach(e=>this.addCommand(e))}async loadDiscoveredCommands(){let e=`/${env(`DIST_DIR`,`.h3ravel/serve`)}/`.replaceAll(`//`,``),t=[...this.app.registeredCommands.map(e=>new e(this.app,this.kernel))],n=app_path(`Console/Commands/*.js`).replace(`/src/`,e);for await(let e of(0,f.glob)(n)){let n=h.default.basename(e).replace(`.js`,``);try{let r=(await import(e))[n];t.push(new r(this.app,this.kernel))}catch{}}t.forEach(e=>this.addCommand(e))}addCommand(e){this.commands.push(k.parseSignature(e.getSignature(),e))}initialize(){let e=l.Logger.parse([[`Musket CLI:`,`white`],[this.kernel.consolePackage.version,`green`]],` `,!1),t=l.Logger.parse([[`H3ravel Framework:`,`white`],[this.kernel.modulePackage.version,`green`]],` `,!1),n={quiet:[`-q, --quiet`,`Do not output any message`],silent:[`--silent`,`Do not output any message`],verbose:[`-v, --verbose <number>`,`Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug`],lock:[`--lock`,`Locked and loaded, do not ask any interactive question`]};g.program.name(`musket`).version(`${e}\n${t}`).description(w).addOption(new g.Option(n.quiet[0],n.quiet[1]).implies({silent:!0})).addOption(new g.Option(n.silent[0],n.silent[1]).implies({quiet:!0})).addOption(new g.Option(n.verbose[0],n.verbose[1]).choices([`1`,`2`,`3`])).addOption(new g.Option(n.lock[0],n.lock[1])).action(async()=>{let e=new T(this.app,this.kernel);e.setInput(g.program.opts(),g.program.args,g.program.registeredArguments,{},g.program),e.handle()}),g.program.command(`init`).description(`Initialize H3ravel.`).action(async()=>{l.Logger.success(`Initialized: H3ravel has been initialized!`)});for(let e=0;e<this.commands.length;e++){let t=this.commands[e],r=t.commandClass;if(t.isNamespaceCommand&&t.subCommands){let e=t.isHidden?g.program:g.program.command(t.baseCommand).description(t.description??``).addOption(new g.Option(n.quiet[0],n.quiet[1]).implies({silent:!0})).addOption(new g.Option(n.silent[0],n.silent[1]).implies({quiet:!0})).addOption(new g.Option(n.verbose[0],n.verbose[1]).choices([`1`,`2`,`3`])).addOption(new g.Option(n.lock[0],n.lock[1])).action(async()=>{r.setInput(e.opts(),e.args,e.registeredArguments,t,g.program),await r.handle()});(t.options?.length??0)>0&&t.options?.filter((e,t,n)=>n.findIndex(t=>t.name===e.name)===t).forEach(t=>{this.makeOption(t,e)}),t.subCommands.filter((e,t,n)=>!e.shared&&n.findIndex(t=>t.name===e.name)===t).forEach(e=>{let i=g.program.command(`${t.baseCommand}:${e.name}`).description(e.description||``).addOption(new g.Option(n.quiet[0],n.quiet[1]).implies({silent:!0})).addOption(new g.Option(n.silent[0],n.silent[1]).implies({quiet:!0})).addOption(new g.Option(n.verbose[0],n.verbose[1]).choices([`1`,`2`,`3`])).addOption(new g.Option(n.lock[0],n.lock[1])).action(async()=>{r.setInput(i.opts(),i.args,i.registeredArguments,e,g.program),await r.handle()});t.subCommands?.filter(e=>e.shared).forEach(t=>{this.makeOption(t,i,!1,e)}),t.options?.filter(e=>e.shared).forEach(t=>{this.makeOption(t,i,!1,e)}),e.nestedOptions&&e.nestedOptions.filter((e,t,n)=>n.findIndex(t=>t.name===e.name)===t).forEach(e=>{this.makeOption(e,i)})})}else{let e=g.program.command(t.baseCommand).description(t.description??``);t?.options?.filter((e,t,n)=>n.findIndex(t=>t.name===e.name)===t).forEach(t=>{this.makeOption(t,e,!0)}),e.action(async()=>{r.setInput(e.opts(),e.args,e.registeredArguments,t,g.program),await r.handle()})}}return g.program.hook(`preAction`,async(e,t)=>{t.name()!==`fire`&&await(0,b.build)({...P,watch:!1,plugins:[]})}),g.program}makeOption(e,t,n,r){let i=e.description?.replace(/\[(\w+)\]/g,(e,t)=>r?.[t]??`[${t}]`)??``,a=e.name.replaceAll(`-`,``);if(e.isFlag)if(n){let n=e.flags?.map(e=>e.length===1?`-${e}`:`--${e}`).join(`, `).replaceAll(`----`,`--`).replaceAll(`---`,`-`);t.option(n||``,i,String(e.defaultValue)||void 0)}else t.option(e.flags?.join(`, `)+(e.required?` <${a}>`:``),i,e.defaultValue);else t.argument(e.required?`<${e.name}>`:`[${e.name}]`,i,e.defaultValue)}static async parse(t){return(await new e(t.app,t).build()).parseAsync()}},I=class e extends c.ConsoleKernel{constructor(e){super(e),this.app=e}static init(t){let n=new e(t);Promise.all([n.loadRequirements()]).then(([e])=>e.run())}async run(){await F.parse(this),process.exit(0)}async loadRequirements(){this.cwd=h.default.join(process.cwd(),this.basePath),this.modulePath=l.FileSystem.findModulePkg(`@h3ravel/core`,this.cwd)??``,this.consolePath=l.FileSystem.findModulePkg(`@h3ravel/console`,this.cwd)??``;try{this.modulePackage=await import(h.default.join(this.modulePath,`package.json`))}catch{this.modulePackage={version:`N/A`}}try{this.consolePackage=await import(h.default.join(this.consolePath,`package.json`))}catch{this.consolePackage={version:`N/A`}}return this}},L=class extends c.ServiceProvider{static priority=992;static console=!0;console=!0;register(){}boot(){I.init(this.app),process.on(`SIGINT`,()=>{process.exit(0)}),process.on(`SIGTERM`,()=>{process.exit(0)})}},R=class{async fire(){let e=process.env.DIST_DIR??`/.h3ravel/serve/`,t=[],n=new c.Application(process.cwd()),r=base_path(h.default.join(e,`bootstrap/providers.js`));t.push(...(await import(r)).default),t.push(L),await n.quickStartup(t,[`CoreServiceProvider`])}};new R().fire();
76
+ `;description=`Generate component classes`;async handle(){let e=this.dictionary.baseCommand??this.dictionary.name;this.argument(`name`)||this.program.error(`Please provide a valid name for the `+e);let t={controller:`makeController`,resource:`makeResource`,migration:`makeMigration`,factory:`makeFactory`,seeder:`makeSeeder`,model:`makeModel`,view:`makeView`,command:`makeCommand`};try{await this?.[t[e]]()}catch(e){n.Logger.error(e)}}async makeController(){let e=this.option(`api`)?`-resource`:``,t=this.argument(`name`),r=this.option(`force`),i=n.FileSystem.findModulePkg(`@h3ravel/http`,this.kernel.cwd)??``,s=c.default.join(i,`dist/stubs/controller${e}.stub`),l=app_path(`Http/Controllers/${t}.ts`);t.includes(`/`)&&await(0,a.mkdir)((0,o.beforeLast)(l,`/`),{recursive:!0}),!r&&await n.FileSystem.fileExists(l)&&n.Logger.error(`ERORR: ${t} controller already exists`);let u=await(0,a.readFile)(s,`utf-8`);u=u.replace(/{{ name }}/g,t),await(0,a.writeFile)(l,u),n.Logger.split(`INFO: Controller Created`,n.Logger.log(c.default.basename(l),`gray`,!1))}makeResource(){n.Logger.success(`Resource support is not yet available`)}async makeMigration(){let e=this.argument(`name`),t=(0,s.default)().format(`YYYY_MM_DD_HHmmss`),r=database_path(`migrations/${t}_${e}.ts`),i=n.FileSystem.findModulePkg(`@h3ravel/database`,this.kernel.cwd)??``,o=this.option(`create`,!1),l=this.option(`table`);if(!l&&typeof o==`string`&&(l=o,o=!0),!l){let t=y.guess(e);l=t[0],o=!!t[1]}let u=c.default.join(i,this.getMigrationStubName(l,o)),d=await(0,a.readFile)(u,`utf-8`);l!==null&&(d=d.replace(/DummyTable|{{\s*table\s*}}/g,l)),n.Logger.info(`INFO: Creating Migration`),await this.kernel.ensureDirectoryExists(c.default.dirname(r)),await(0,a.writeFile)(r,d),n.Logger.split(`INFO: Migration Created`,n.Logger.log(c.default.basename(r),`gray`,!1))}makeFactory(){n.Logger.success(`Factory support is not yet available`)}makeCommand(){n.Logger.success(`Musket command creation is not yet available`)}makeSeeder(){n.Logger.success(`Seeder support is not yet available`)}async makeModel(){let e=this.option(`type`,`ts`),t=this.argument(`name`),r=this.option(`force`),i=app_path(`Models/${t.toLowerCase()}.${e}`);t.includes(`/`)&&await(0,a.mkdir)((0,o.beforeLast)(i,`/`),{recursive:!0}),!r&&await n.FileSystem.fileExists(i)&&n.Logger.error(`ERORR: ${t} model already exists`);let s=n.FileSystem.findModulePkg(`@h3ravel/database`,this.kernel.cwd)??``,l=c.default.join(s,`dist/stubs/model-${e}.stub`),u=await(0,a.readFile)(l,`utf-8`);u=u.replace(/{{ name }}/g,t),await(0,a.writeFile)(i,u),n.Logger.split(`INFO: ${t} Model Created`,n.Logger.log(c.default.basename(i),`gray`,!1))}async makeView(){let e=this.argument(`name`),t=this.option(`force`),r=base_path(`src/resources/views/${e}.edge`);e.includes(`/`)&&await(0,a.mkdir)((0,o.beforeLast)(r,`/`),{recursive:!0}),!t&&await n.FileSystem.fileExists(r)&&n.Logger.error(`ERORR: ${e} view already exists`),await(0,a.writeFile)(r,`{{-- src/resources/views/${e}.edge --}}`),n.Logger.split(`INFO: View Created`,n.Logger.log(`src/resources/views/${e}.edge`,`gray`,!1))}getMigrationStubName(e,t=!1,n=`ts`){let r;return r=e?t?`migration.create-${n}.stub`:`migration.update-${n}.stub`:`migration-${n}.stub`,`dist/stubs/`+r}},x=class extends h{signature=`postinstall`;description=`Default post installation command`;async handle(){this.createSqliteDB()}async createSqliteDB(){config(`database.default`)===`sqlite`&&(await n.FileSystem.fileExists(database_path())||await(0,a.mkdir)(database_path(),{recursive:!0}),await n.FileSystem.fileExists(database_path(`db.sqlite`))||await(0,a.writeFile)(database_path(`db.sqlite`),``))}},S=class e{static parseOptions(t){let n=[],r=/\{([^{}]+(?:\{[^{}]*\}[^{}]*)*)\}/g,i;for(;(i=r.exec(t))!==null;){let t=i[1][0]===`^`||/:[#^]/.test(i[1]),r=([`#`,`^`].includes(i[1][0])||/:[#^]/.test(i[1]))&&!t,a=i[1].trim().replace(/[#^]/,``),o=a.indexOf(`:`);if(o===-1){n.push({name:a});continue}let s=a.substring(0,o).trim(),c=a.substring(o+1).trim(),l=c,u,d=c.indexOf(`|`);if(d!==-1){l=c.substring(0,d).trim();let t=c.substring(d+1).trim().replace(/^\{/,``).trim();u=e.parseOptions(`{`+t+`}`)}else l=l.trim();let f=s,p=/[^a-zA-Z0-9_|-]/.test(f),m=!1;f.endsWith(`?*`)?(p=!1,m=!0,f=f.slice(0,-2)):f.endsWith(`*`)?(m=!0,f=f.slice(0,-1)):f.endsWith(`?`)&&(p=!1,f=f.slice(0,-1));let h=f.startsWith(`--`),g,_;if(h){let e=f.split(`|`).map(e=>e.trim());g=[];for(let t of e){t.startsWith(`--`)&&t.slice(2).length===1?t=`-`+t.slice(2):t.startsWith(`-`)&&!t.startsWith(`--`)&&t.slice(1).length>1?t=`--`+t.slice(1):!t.startsWith(`-`)&&t.slice(1).length>1&&(t=`--`+t);let e=t.indexOf(`=`);if(e!==-1){g.push(t.substring(0,e));let n=t.substring(e+1);_=n===`*`?[]:n===`true`||n===`false`||!n&&!p?n===`true`:isNaN(Number(n))?n:Number(n)}else g.push(t)}}n.push({name:h?g[g.length-1]:f,required:p,multiple:m,description:l,flags:g,shared:t,isFlag:h,isHidden:r,defaultValue:_,nestedOptions:u})}return n}static parseSignature(t,n){let r=t.split(`
77
+ `).map(e=>e.trim()).filter(e=>e.length>0),i=[`#`,`^`].includes(r[0][0])||/:[#^]/.test(r[0]),a=r[0].replace(/[^\w=:-]/g,``),o=n.getDescription(),s=a.endsWith(`:`),c=r.slice(1).join(` `),l=e.parseOptions(c);return s?{baseCommand:a.slice(0,-1),isNamespaceCommand:s,subCommands:l.filter(e=>!e.flags&&!e.isHidden),description:o,commandClass:n,options:l.filter(e=>!!e.flags),isHidden:i}:{baseCommand:a,isNamespaceCommand:s,options:l,description:o,commandClass:n,isHidden:i}}};function C(e={}){let t,n,r=e.args||[],i=e.allowRestarts||!1,a=e.input,o=e.options||e;return delete o.args,delete o.allowRestarts,{name:`run`,buildStart(e){let n=a??e.input;if(typeof n==`string`&&(n=[n]),typeof n==`object`&&(n=Object.values(n)),n.length>1)throw Error("@rollup/plugin-run must have a single entry point; consider setting the `input` option");t=(0,f.resolve)(n[0])},generateBundle(e,t,n){n||this.error(`@rollup/plugin-run currently only works with bundles that are written to disk`)},writeBundle(e,a){let s=(e,t)=>{n&&n.kill(),n=(0,d.fork)((0,f.join)(e,t),r,o)},c=e.dir||(0,f.dirname)(e.file),l=Object.keys(a).find(e=>{let n=a[e];return n.isEntry&&n.facadeModuleId===t});l?(s(c,l),i&&(process.stdin.resume(),process.stdin.setEncoding(`utf8`),process.stdin.on(`data`,e=>{let t=e.toString().trim().toLowerCase();t===`rs`||t===`restart`||e.toString().charCodeAt(0)===11?s(c,l):(t===`cls`||t===`clear`||e.toString().charCodeAt(0)===12)&&console.clear()}))):this.error(`@rollup/plugin-run could not find output chunk`)}}}const w=process.env.NODE_ENV||`development`;let T=w===`development`?`.h3ravel/serve`:`dist`;process.env.DIST_DIR&&(T=process.env.DIST_DIR);const E={outDir:T,entry:[`src/**/*.ts`],format:[`esm`],target:`node22`,sourcemap:w===`development`,minify:!!process.env.DIST_MINIFY,clean:!0,shims:!0,copy:[{from:`public`,to:T},`src/resources`,`src/database`],env:w===`development`?{NODE_ENV:w,DIST_DIR:T}:{},watch:w===`development`&&process.env.CLI_BUILD!==`true`?[`.env`,`.env.*`,`src`,`../../packages`]:!1,dts:!1,logLevel:`silent`,nodeProtocol:!0,skipNodeModulesBundle:!0,hooks(e){e.hook(`build:done`,async()=>{let e=[`database/migrations`,`database/factories`,`database/seeders`];for(let t=0;t<e.length;t++){let n=e[t];(0,u.existsSync)(c.default.join(T,n))&&await(0,a.rm)(c.default.join(T,n),{recursive:!0})}})},plugins:w===`development`&&process.env.CLI_BUILD!==`true`?[C({env:Object.assign({},process.env,{NODE_ENV:w,DIST_DIR:T}),execArgv:[`-r`,`source-map-support/register`],allowRestarts:!1,input:process.cwd()+`/src/server.ts`})]:[]};var D=E,O=class e{commands=[];constructor(e,t){this.app=e,this.kernel=t}async build(){return this.loadBaseCommands(),await this.loadDiscoveredCommands(),this.initialize()}loadBaseCommands(){[new b(this.app,this.kernel),new v(this.app,this.kernel),new x(this.app,this.kernel),new m(this.app,this.kernel)].forEach(e=>this.addCommand(e))}async loadDiscoveredCommands(){let e=`/${env(`DIST_DIR`,`.h3ravel/serve`)}/`.replaceAll(`//`,``),t=[...this.app.registeredCommands.map(e=>new e(this.app,this.kernel))],n=app_path(`Console/Commands/*.js`).replace(`/src/`,e);for await(let e of(0,a.glob)(n)){let n=c.default.basename(e).replace(`.js`,``);try{let r=(await import(e))[n];t.push(new r(this.app,this.kernel))}catch{}}t.forEach(e=>this.addCommand(e))}addCommand(e){this.commands.push(S.parseSignature(e.getSignature(),e))}initialize(){let e=n.Logger.parse([[`Musket CLI:`,`white`],[this.kernel.consolePackage.version,`green`]],` `,!1),t=n.Logger.parse([[`H3ravel Framework:`,`white`],[this.kernel.modulePackage.version,`green`]],` `,!1),r={quiet:[`-q, --quiet`,`Do not output any message`],silent:[`--silent`,`Do not output any message`],verbose:[`-v, --verbose <number>`,`Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug`],lock:[`--lock`,`Locked and loaded, do not ask any interactive question`]};l.program.name(`musket`).version(`${e}\n${t}`).description(_).addOption(new l.Option(r.quiet[0],r.quiet[1]).implies({silent:!0})).addOption(new l.Option(r.silent[0],r.silent[1]).implies({quiet:!0})).addOption(new l.Option(r.verbose[0],r.verbose[1]).choices([`1`,`2`,`3`])).addOption(new l.Option(r.lock[0],r.lock[1])).action(async()=>{let e=new v(this.app,this.kernel);e.setInput(l.program.opts(),l.program.args,l.program.registeredArguments,{},l.program),e.handle()}),l.program.command(`init`).description(`Initialize H3ravel.`).action(async()=>{n.Logger.success(`Initialized: H3ravel has been initialized!`)});for(let e=0;e<this.commands.length;e++){let t=this.commands[e],n=t.commandClass;if(t.isNamespaceCommand&&t.subCommands){let e=t.isHidden?l.program:l.program.command(t.baseCommand).description(t.description??``).addOption(new l.Option(r.quiet[0],r.quiet[1]).implies({silent:!0})).addOption(new l.Option(r.silent[0],r.silent[1]).implies({quiet:!0})).addOption(new l.Option(r.verbose[0],r.verbose[1]).choices([`1`,`2`,`3`])).addOption(new l.Option(r.lock[0],r.lock[1])).action(async()=>{n.setInput(e.opts(),e.args,e.registeredArguments,t,l.program),await n.handle()});(t.options?.length??0)>0&&t.options?.filter((e,t,n)=>n.findIndex(t=>t.name===e.name)===t).forEach(t=>{this.makeOption(t,e)}),t.subCommands.filter((e,t,n)=>!e.shared&&n.findIndex(t=>t.name===e.name)===t).forEach(e=>{let i=l.program.command(`${t.baseCommand}:${e.name}`).description(e.description||``).addOption(new l.Option(r.quiet[0],r.quiet[1]).implies({silent:!0})).addOption(new l.Option(r.silent[0],r.silent[1]).implies({quiet:!0})).addOption(new l.Option(r.verbose[0],r.verbose[1]).choices([`1`,`2`,`3`])).addOption(new l.Option(r.lock[0],r.lock[1])).action(async()=>{n.setInput(i.opts(),i.args,i.registeredArguments,e,l.program),await n.handle()});t.subCommands?.filter(e=>e.shared).forEach(t=>{this.makeOption(t,i,!1,e)}),t.options?.filter(e=>e.shared).forEach(t=>{this.makeOption(t,i,!1,e)}),e.nestedOptions&&e.nestedOptions.filter((e,t,n)=>n.findIndex(t=>t.name===e.name)===t).forEach(e=>{this.makeOption(e,i)})})}else{let e=l.program.command(t.baseCommand).description(t.description??``);t?.options?.filter((e,t,n)=>n.findIndex(t=>t.name===e.name)===t).forEach(t=>{this.makeOption(t,e,!0)}),e.action(async()=>{n.setInput(e.opts(),e.args,e.registeredArguments,t,l.program),await n.handle()})}}return l.program.hook(`preAction`,async(e,t)=>{t.name()!==`fire`&&await(0,p.build)({...D,watch:!1,plugins:[]})}),l.program}makeOption(e,t,n,r){let i=e.description?.replace(/\[(\w+)\]/g,(e,t)=>r?.[t]??`[${t}]`)??``,a=e.name.replaceAll(`-`,``);if(e.isFlag)if(n){let n=e.flags?.map(e=>e.length===1?`-${e}`:`--${e}`).join(`, `).replaceAll(`----`,`--`).replaceAll(`---`,`-`);t.option(n||``,i,String(e.defaultValue)||void 0)}else t.option(e.flags?.join(`, `)+(e.required?` <${a}>`:``),i,e.defaultValue);else t.argument(e.required?`<${e.name}>`:`[${e.name}]`,i,e.defaultValue)}static async parse(t){return(await new e(t.app,t).build()).parseAsync()}},k=class e extends t.ConsoleKernel{constructor(e){super(e),this.app=e}static init(t){let n=new e(t);Promise.all([n.loadRequirements()]).then(([e])=>e.run())}async run(){await O.parse(this),process.exit(0)}async loadRequirements(){this.cwd=c.default.join(process.cwd(),this.basePath),this.modulePath=n.FileSystem.findModulePkg(`@h3ravel/core`,this.cwd)??``,this.consolePath=n.FileSystem.findModulePkg(`@h3ravel/console`,this.cwd)??``;try{this.modulePackage=await import(c.default.join(this.modulePath,`package.json`))}catch{this.modulePackage={version:`N/A`}}try{this.consolePackage=await import(c.default.join(this.consolePath,`package.json`))}catch{this.consolePackage={version:`N/A`}}return this}},A=class extends t.ServiceProvider{static priority=992;static console=!0;console=!0;register(){}boot(){k.init(this.app),process.on(`SIGINT`,()=>{process.exit(0)}),process.on(`SIGTERM`,()=>{process.exit(0)})}},j=class{async fire(){let e=process.env.DIST_DIR??`/.h3ravel/serve/`,n=[],r=new t.Application(process.cwd()),i=base_path(c.default.join(e,`bootstrap/providers.js`));n.push(...(await import(i)).default),n.push(A),await r.quickStartup(n,[`CoreServiceProvider`])}};new j().fire();
package/bin/spawn.cjs ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ const e=require(`./chunk-CUT6urMc.cjs`);let t=require(`execa`);t=e.__toESM(t);let n=require(`preferred-pm`);n=e.__toESM(n);let r=require(`node:path`);r=e.__toESM(r);const i=async()=>{let e=(await(0,n.default)(process.cwd()))?.name??`npm`,i=(0,r.join)(process.env.DIST_DIR??`.h3ravel/serve`),a={EXTENDED_DEBUG:`false`,CLI_BUILD:`true`,NODE_ENV:`production`,DIST_DIR:i,LOG_LEVEL:`silent`};console.log(i,a),await(0,t.execa)(e,[`tsdown`,`--silent`,`--config-loader`,`unconfig`,`-c`,`tsdown.default.config.ts`].filter(e=>e!==null),{stdout:`inherit`,stderr:`inherit`,cwd:(0,r.join)(process.cwd()),env:Object.assign({},process.env,a)})};i();
package/bin/spawn.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{execa as e}from"execa";import t from"preferred-pm";import{join as n}from"node:path";(async()=>{let r=(await t(process.cwd()))?.name??`npm`,i=n(process.env.DIST_DIR??`.h3ravel/serve`),a={EXTENDED_DEBUG:`false`,CLI_BUILD:`true`,NODE_ENV:`production`,DIST_DIR:i,LOG_LEVEL:`silent`};console.log(i,a),await e(r,[`tsdown`,`--silent`,`--config-loader`,`unconfig`,`-c`,`tsdown.default.config.ts`].filter(e=>e!==null),{stdout:`inherit`,stderr:`inherit`,cwd:n(process.cwd()),env:Object.assign({},process.env,a)})})();export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@h3ravel/console",
3
- "version": "11.4.0",
3
+ "version": "11.5.0",
4
4
  "description": "CLI utilities for scaffolding, running migrations, tasks and for H3ravel.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -24,7 +24,8 @@
24
24
  }
25
25
  },
26
26
  "bin": {
27
- "musket": "bin/fire.js"
27
+ "musket": "bin/fire.js",
28
+ "spawn": "bin/spawn.js"
28
29
  },
29
30
  "files": [
30
31
  "bin",