@stacksjs/actions 0.70.44 → 0.70.53
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/LICENSE.md +21 -0
- package/dist/action.d.ts +104 -17
- package/dist/blog.d.ts +12 -0
- package/dist/build/frontend-static.d.ts +16 -0
- package/dist/chunk-00qp27jy.js +93 -0
- package/dist/{chunk-jd1yzkq5.js → chunk-23thftnv.js} +1 -1
- package/dist/chunk-4qzb8g3z.js +3 -0
- package/dist/chunk-5dfz9en9.js +920 -0
- package/dist/{chunk-3beht8ja.js → chunk-5hwp0frq.js} +1 -1
- package/dist/{chunk-aw6d8zr3.js → chunk-5pwpk005.js} +2 -2
- package/dist/chunk-604jy79b.js +5 -0
- package/dist/{chunk-wnrgcx3d.js → chunk-63swek9d.js} +2 -2
- package/dist/chunk-67am4dae.js +688 -0
- package/dist/{chunk-gt77jmb5.js → chunk-8gbewxns.js} +1 -1
- package/dist/chunk-8r76qydb.js +240 -0
- package/dist/{chunk-schcaf73.js → chunk-9x17v4x2.js} +2 -2
- package/dist/chunk-aazd6qpv.js +3 -0
- package/dist/{chunk-n2fd1d0m.js → chunk-ag4fy7cx.js} +1 -1
- package/dist/{chunk-2qchdrf9.js → chunk-badehrwa.js} +1 -1
- package/dist/chunk-dbz9dp2h.js +3 -0
- package/dist/{chunk-v0wnrnaa.js → chunk-e8505qz8.js} +2 -2
- package/dist/chunk-jv7ry09n.js +3 -0
- package/dist/{chunk-w418anbq.js → chunk-jve1p4dz.js} +2 -2
- package/dist/chunk-mcwfmqzb.js +283 -0
- package/dist/chunk-n24m8prb.js +3 -0
- package/dist/{chunk-h93n2j40.js → chunk-nm9h5rye.js} +2 -2
- package/dist/{chunk-60qjz7zb.js → chunk-ny1racy0.js} +2 -2
- package/dist/{chunk-2gh7kgpc.js → chunk-p601xr03.js} +1 -1
- package/dist/{chunk-x471rxrn.js → chunk-pqnzp7x8.js} +2 -2
- package/dist/chunk-rj1cbghx.js +17 -0
- package/dist/chunk-rzhs51h1.js +3 -0
- package/dist/{chunk-7bpdkc40.js → chunk-sp5cjdhd.js} +213 -76
- package/dist/chunk-tqax3gbq.js +16 -0
- package/dist/{chunk-c8qt2xst.js → chunk-vsj8ns4p.js} +1 -1
- package/dist/{chunk-rdajkt2s.js → chunk-x8nrbsk1.js} +2 -2
- package/dist/dev/dashboard-utils.d.ts +19 -1
- package/dist/dev/migrate-watcher.d.ts +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/make.d.ts +19 -0
- package/dist/queue/dlq-purge.d.ts +1 -0
- package/dist/queue/dlq-retry.d.ts +1 -0
- package/dist/queue/dlq.d.ts +1 -0
- package/dist/queue/list.d.ts +1 -0
- package/dist/queue/pause.d.ts +1 -0
- package/dist/queue/quarantine.d.ts +1 -0
- package/dist/queue/resume.d.ts +1 -0
- package/dist/queue/unquarantine.d.ts +1 -0
- package/dist/src/action.js +1 -1
- package/dist/src/actions.js +1 -1
- package/dist/src/add.js +1 -1
- package/dist/src/ai/request-model-access.js +1 -1
- package/dist/src/auth/setup.js +82 -24
- package/dist/src/blog.js +102 -0
- package/dist/src/build/core.js +1 -1
- package/dist/src/build/frontend-static.js +9 -0
- package/dist/src/build/views.js +1 -1
- package/dist/src/build.js +1 -1
- package/dist/src/commit.js +1 -1
- package/dist/src/database/seed.js +1 -1
- package/dist/src/deploy/index.js +38 -45
- package/dist/src/dev/api.js +4 -4
- package/dist/src/dev/dashboard-globals.js +1 -1
- package/dist/src/dev/dashboard-utils.js +1 -1
- package/dist/src/dev/dashboard.js +6 -6
- package/dist/src/dev/docs.js +1 -1
- package/dist/src/dev/index.js +1 -1
- package/dist/src/dev/migrate-watcher.js +2 -0
- package/dist/src/dev/views.js +1 -1
- package/dist/src/discover-packages.js +1 -1
- package/dist/src/examples.js +1 -1
- package/dist/src/generate/component-meta.js +1 -1
- package/dist/src/generate/env-files.js +1 -1
- package/dist/src/generate/ide-helpers.js +1 -1
- package/dist/src/generate/index.js +1 -1
- package/dist/src/generate/lib-entries.js +1 -1
- package/dist/src/generate/vscode-custom-data.js +1 -1
- package/dist/src/helpers/component-meta.js +1 -1
- package/dist/src/helpers/index.js +1 -1
- package/dist/src/helpers/lib-entries.js +1 -1
- package/dist/src/helpers/package-json.js +1 -1
- package/dist/src/helpers/utils.js +1 -1
- package/dist/src/helpers/vscode-custom-data.js +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/key-generate.js +1 -1
- package/dist/src/make-command.js +1 -1
- package/dist/src/make-job.js +1 -1
- package/dist/src/make-policy.js +1 -1
- package/dist/src/make-resource.js +1 -1
- package/dist/src/make.js +1 -1
- package/dist/src/migrate/fresh.js +1 -1
- package/dist/src/orm/base.js +1 -1
- package/dist/src/queue/dlq-purge.js +2 -0
- package/dist/src/queue/dlq-retry.js +2 -0
- package/dist/src/queue/dlq.js +5 -0
- package/dist/src/queue/failed.js +4 -4
- package/dist/src/queue/list.js +5 -0
- package/dist/src/queue/pause.js +2 -0
- package/dist/src/queue/quarantine.js +3 -0
- package/dist/src/queue/resume.js +2 -0
- package/dist/src/queue/unquarantine.js +2 -0
- package/dist/src/release.js +1 -1
- package/dist/src/run-action.js +1 -1
- package/dist/src/scaffold-crud.js +1 -1
- package/dist/src/serve/api.js +1 -1
- package/dist/src/setup/index.js +1 -1
- package/dist/src/setup/ssl.js +1 -1
- package/dist/src/stacks.js +1 -1
- package/dist/src/templates.js +1 -1
- package/dist/src/types.js +1 -1
- package/dist/src/upgrade/dependencies.js +1 -1
- package/dist/src/upgrade/framework-utils.js +1 -1
- package/dist/src/upgrade/framework.js +5 -5
- package/dist/src/upgrade/index.js +1 -1
- package/dist/src/upgrade.js +1 -1
- package/dist/upgrade/framework-utils.d.ts +48 -0
- package/package.json +18 -18
- package/dist/chunk-2kaj93p5.js +0 -3
- package/dist/chunk-3086k7zk.js +0 -184
- package/dist/chunk-67y94dzt.js +0 -658
- package/dist/chunk-6x1m5rkr.js +0 -17
- package/dist/chunk-96b7fcmd.js +0 -3
- package/dist/chunk-d4srk6ma.js +0 -3
- package/dist/chunk-kzhgexj4.js +0 -3
- package/dist/chunk-n1y0gpv6.js +0 -3
- package/dist/chunk-n2x7v39b.js +0 -5
- package/dist/chunk-tc935b45.js +0 -93
- package/dist/chunk-wv5yb5wb.js +0 -101
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
3
|
-
export{T as
|
|
2
|
+
import{$a as z}from"./chunk-e8505qz8.js";import{db as U}from"./chunk-rzhs51h1.js";import{pb as O}from"./chunk-4qzb8g3z.js";import*as Q from"fs";import R from"process";import{runCommand as b}from"@stacksjs/cli";import{Action as Y,NpmScript as H}from"@stacksjs/enums";import{log as B}from"@stacksjs/logging";import{frameworkPath as I,projectPath as K,storagePath as D}from"@stacksjs/path";import{ExitCode as X}from"@stacksjs/types";import{runNpmScript as M}from"@stacksjs/utils";async function T(q){if(q?.types)await W(q);else if(q?.entries)await V(q);else if(q?.webTypes)await v(q);else if(q?.customData)await y();else if(q?.ideHelpers)await E(q);else if(q?.componentMeta)await N();else if(q?.coreSymlink)await x();else if(q?.openApiSpec)await S()}function u(q){return T(q)}async function V(q){let F=await U(Y.GenerateLibraryEntries,{...q,cwd:K()});if(F.isErr)B.error("There was an error generating your library entry points",F.error),R.exit(X.FatalError);B.success("Library entry points generated successfully")}async function v(q){let F=await M(H.GenerateWebTypes,q);if(F.isErr)B.error("There was an error generating the web-types.json file.",F.error),R.exit(X.FatalError);B.success("Successfully generated the web-types.json file")}async function y(){let q=await z();if(q.isErr)B.error("There was an error generating the custom-elements.json file.",q.error),R.exit(X.FatalError);await U(Y.LintFix,{verbose:!0,cwd:K()}),B.success("Successfully generated the custom-elements.json file")}async function E(q){let F=await M(H.GenerateIdeHelpers,q);if(F.isErr)B.error("There was an error generating IDE helpers.",F.error),R.exit(X.FatalError);await U(Y.LintFix,{verbose:!0,cwd:K()}),B.success("Successfully generated IDE helpers")}async function N(){let q=await z();if(q.isErr)B.error("There was an error generating your component meta information.",q.error),R.exit(X.FatalError);await U(Y.LintFix,{verbose:!0,cwd:K()}),B.success("Successfully generated component meta information")}async function W(q){let F=await M(H.GenerateTypes,{cwd:I(),...q});if(F.isErr)throw B.error("There was an error generating your types.",F.error),F.error instanceof Error?F.error:Error(String(F.error));B.success("Types were generated successfully")}async function c(q){try{let G=`${I()}/package.json`,J=Q.existsSync(G)?Q.readFileSync(G,"utf-8"):"";if(!(J?JSON.parse(J):{})?.scripts?.["generate:types"]){B.warn("[generate:types --watch] no `generate:types` script in framework package.json \u2014 type regeneration disabled. dev:api will keep running, but type definitions won't auto-refresh on model/config changes.");return}}catch{}let F=[K("app/Models"),D("framework/defaults/app/Models"),K("config"),K("database/migrations")];B.info(`[generate:types --watch] watching ${F.length} directories`);let Z=null,_=!1,L=()=>{if(Z)clearTimeout(Z);Z=setTimeout(async()=>{if(_)return;_=!0;try{B.info("[generate:types --watch] change detected, regenerating\u2026"),await W(q),B.success("[generate:types --watch] types up to date")}catch(G){B.error("[generate:types --watch] regeneration failed:",G)}finally{_=!1}},200)},$=[];for(let G of F)try{if(!Q.existsSync(G))continue;let J=Q.watch(G,{recursive:!0},()=>L());$.push(J)}catch(J){B.warn(`[generate:types --watch] cannot watch ${G}: ${J}`)}if($.length===0){B.warn("[generate:types --watch] no directories to watch \u2014 exiting");return}await new Promise((G)=>{R.once("SIGINT",()=>{B.info("[generate:types --watch] stopping");for(let J of $)try{J.close()}catch{}G()})})}function g(){B.success("Successfully generated `./pantry.yaml` based on your config")}async function l(){}async function x(){await b(`ln -s ${I()} ${K(".stacks")}`)}async function S(){let{generateOpenApi:q}=await import("@stacksjs/api");await q(),B.success("Successfully generated Open API Spec")}
|
|
3
|
+
export{T as Oa,u as Pa,V as Qa,v as Ra,y as Sa,E as Ta,N as Ua,W as Va,c as Wa,g as Xa,l as Ya,x as Za,S as _a};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
class X{name;description;apiResponse;rate;tries;backoff;enabled;path;method;validations;requestFile;skipCsrf;csrf;authorize;before;handle;model;_dependenciesFactory;_resolvedDeps;_depsOverrides;constructor({name:j,description:A,apiResponse:B,validations:G,handle:H,rate:I,tries:J,backoff:K,enabled:L,path:M,method:N,requestFile:O,model:g,skipCsrf:Q,csrf:S,authorize:U,before:V,dependencies:W}){if(this.name=j,this.description=A,this.apiResponse=B,this.validations=G,this.rate=I,this.tries=J,this.backoff=K,this.enabled=L,this.path=M,this.method=N,this.handle=H,this.requestFile=O,this.skipCsrf=Q,this.csrf=S,this.authorize=U,this.before=V,this._dependenciesFactory=W,g&&typeof g==="object"&&"name"in g)this.model=g.name;else if(typeof g==="string")this.model=g}get deps(){if(!this._resolvedDeps)this._resolvedDeps=this._dependenciesFactory?.()??{};if(this._depsOverrides)return{...this._resolvedDeps,...this._depsOverrides};return this._resolvedDeps}overrideDependencies(j){this._depsOverrides={...this._depsOverrides??{},...j}}resetDependencies(){this._depsOverrides=void 0,this._resolvedDeps=void 0}}
|
|
3
|
+
export{X as cb};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
var b={name:"hello-world",owner:"@stacksjs",repository:"stacksjs/stacks",license:"MIT",author:"Chris Breuer",contributors:["Chris Breuer <chris@stacksjs.com>"],defaultLanguage:"en",releaseable:!0,webComponents:{name:"hello-world-elements",description:"Your framework agnostic web component library description.",keywords:["custom-elements","web-components","library","framework-agnostic","typescript","javascript"],tags:[{name:["HelloWorld","AppHelloWorld"],description:"The Hello World custom element, built via this framework.",attributes:[{name:"greeting",description:"The greeting."}]}]},functions:{name:"hello-world-fx",description:"Your function library description.",keywords:["functions","composables","library","typescript","javascript"],shouldGenerateSourcemap:!1,files:["counter","dark"]}};
|
|
3
|
-
export{b as
|
|
3
|
+
export{b as bb};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import{log as H}from"@stacksjs/logging";import{dirname as T,join as Z,projectPath as A,relative as m,stacksBackupPath as u,stacksLockPath as b}from"@stacksjs/path";import{copyFile as K,createFolder as R,deleteFile as g,deleteEmptyFolders as d,doesFolderExist as P,fs as J}from"@stacksjs/storage";var F=["app","config","database","resources","routes","public","locales"];async function L(){let z=b();try{if(J.existsSync(z)){let q=await Bun.file(z).text();return JSON.parse(q)}}catch{}return{version:1,generatedAt:new Date().toISOString(),stacks:{}}}async function D(z){let q=b(),W=T(q);if(!J.existsSync(W))await R(W);z.generatedAt=new Date().toISOString(),await Bun.write(q,JSON.stringify(z,null,2))}function y(z){let q=A("pantry"),W=Z(q,z);if(J.existsSync(Z(W,"package.json")))return W;let X=Z(q,"@stacksjs",z);if(J.existsSync(Z(X,"package.json")))return X;if(z.startsWith("@")){let Q=Z(q,z);if(J.existsSync(Z(Q,"package.json")))return Q}let M=["*/package.json","@*/*/package.json"];for(let Q of M){let Y=new Bun.Glob(Q);for(let $ of Y.scanSync({cwd:q,absolute:!0,onlyFiles:!0}))try{if(JSON.parse(J.readFileSync($,"utf-8"))?.stacks?.name===z)return T($)}catch{}}return null}function C(z,q){let W=[];if(!J.existsSync(z))return W;let X=J.readdirSync(z,{withFileTypes:!0});for(let M of X){let Q=Z(z,M.name);if(M.isDirectory())W.push(...C(Q,q));else W.push(m(q,Q))}return W}async function n(z){let{name:q,force:W=!1,dryRun:X=!1,verbose:M=!1}=z,Q=W?"overwrite":z.conflict??"skip";H.info(`Installing stack "${q}"...`);let Y=y(q);if(!Y)return H.error(`Stack "${q}" not found in pantry. Install it first with: bun add <package-name>`),null;let $,G;try{let V=await Bun.file(Z(Y,"package.json")).text();if($=JSON.parse(V),G=$.stacks,!G?.name)return H.error(`Package at "${Y}" does not have a valid "stacks" field in package.json`),null}catch(V){return H.error(`Failed to read stack package.json: ${V}`),null}let O=await L(),U=$.name||q;if(O.stacks[U]&&!W)return H.warn(`Stack "${G.name}" is already installed. Use --force to reinstall.`),O.stacks[U];let B=G.directories??F,w=[];for(let V of B){let E=Z(Y,V);if(J.existsSync(E)){let _=C(E,Y);w.push(..._)}}if(w.length===0)return H.warn(`Stack "${G.name}" has no files to install`),null;if(M)H.info(`Found ${w.length} file(s) to install`);let x=[],I=[];for(let V of w){let E=Z(Y,V),_=A(V);if(X){if(J.existsSync(_))if(H.info(`[dry-run] Would ${Q}: ${V}`),Q==="skip")I.push(V);else x.push(V);else H.info(`[dry-run] Would copy: ${V}`),x.push(V);continue}if(J.existsSync(_))switch(Q){case"skip":if(M)H.warn(`Skipping (file exists): ${V}`);I.push(V);continue;case"backup":{let f=u(G.name),v=Z(f,V),j=T(v);if(!J.existsSync(j))await R(j);if(K(_,v),M)H.info(`Backed up: ${V}`);break}case"overwrite":if(M)H.warn(`Overwriting: ${V}`);break}let S=T(_);if(!J.existsSync(S))await R(S);if(K(E,_),x.push(V),M)H.info(`Copied: ${V}`)}if(X)return H.info(`[dry-run] Would install ${x.length} file(s), skip ${I.length} file(s)`),null;let N={packageName:U,name:G.name,version:$.version||"0.0.0",installedAt:new Date().toISOString(),files:x,skipped:I,conflictStrategy:Q};return O.stacks[U]=N,await D(O),H.success(`Installed stack "${G.name}" (${x.length} file(s) copied, ${I.length} skipped)`),N}async function c(z){let{name:q,force:W=!1,verbose:X=!1}=z;H.info(`Uninstalling stack "${q}"...`);let M=await L(),Q=null,Y=null;for(let[O,U]of Object.entries(M.stacks))if(U.name===q||O===q){Q=O,Y=U;break}if(!Y||!Q)return H.error(`Stack "${q}" is not installed`),!1;let $=0;for(let O of Y.files){let U=A(O);if(!J.existsSync(U)){if(X)H.info(`Already removed: ${O}`);continue}if(!W){let B=y(q);if(B){let w=Z(B,O);if(J.existsSync(w)){let x=await Bun.file(w).text(),I=await Bun.file(U).text();if(x!==I){H.warn(`Skipping modified file: ${O} (use --force to remove)`);continue}}}}if(await g(U),$++,X)H.info(`Removed: ${O}`)}let G=u(Y.name);if(J.existsSync(G)&&P(G)){let O=C(G,G);for(let U of O){let B=Z(G,U),w=A(U),x=T(w);if(!J.existsSync(x))await R(x);if(K(B,w),X)H.info(`Restored from backup: ${U}`)}J.rmSync(G,{recursive:!0,force:!0})}for(let O of F){let U=A(O);if(J.existsSync(U))await d(U)}return delete M.stacks[Q],await D(M),H.success(`Uninstalled stack "${Y.name}" (${$} file(s) removed)`),!0}async function i(){let z=[],q=await L(),W=A("pantry");if(J.existsSync(W)){let X=["*/package.json","@*/*/package.json"];for(let M of X){let Q=new Bun.Glob(M);for(let Y of Q.scanSync({cwd:W,absolute:!0,onlyFiles:!0}))try{let $=J.readFileSync(Y,"utf-8"),G=JSON.parse($);if(!G?.stacks?.name)continue;let O=G.name,U=!!q.stacks[O],B=q.stacks[O];z.push({name:G.stacks.name,packageName:O,version:G.version||"0.0.0",description:G.stacks.description,installed:U,installedAt:B?.installedAt,fileCount:B?.files.length})}catch{}}}for(let[X,M]of Object.entries(q.stacks))if(!z.some((Q)=>Q.packageName===X))z.push({name:M.name,packageName:X,version:M.version,installed:!0,installedAt:M.installedAt,fileCount:M.files.length});return z}
|
|
3
|
-
export{n as
|
|
3
|
+
export{n as y,c as z,i as A};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
function s(t){let a=t.replace(/\\/g,"/").split("/").filter(Boolean),e=a.lastIndexOf("layouts"),o=e>=0?a[e+1]:a.at(-1);if(!o)return"app";return o.replace(/\.stx$/i,"")||"app"}function u(t){let n=t.match(/<meta\b[^>]*name=["']stx-layout["'][^>]*content=["']([^"']+)["'][^>]*>/i),a=t.match(/<meta\b[^>]*name=["']stx-layout-group["'][^>]*content=["']([^"']+)["'][^>]*>/i),e=t.match(/<!--\s*stx-layout:\s*([^ ]+)\s*-->/i),o=n?.[1]||e?.[1]||"";return{layout:o,group:a?.[1]||s(o)}}
|
|
3
|
+
export{s as a,u as b};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
2
|
+
import{bb as z}from"./chunk-ag4fy7cx.js";import{err as A,ok as B}from"@stacksjs/error-handling";import{log as q}from"@stacksjs/logging";import{customElementsDataPath as G}from"@stacksjs/path";import{writeTextFile as H}from"@stacksjs/storage";function J(){return`{
|
|
3
3
|
"version": 1.1,
|
|
4
4
|
"tags": ${JSON.stringify(z.webComponents?.tags)}
|
|
5
5
|
}
|
|
6
6
|
`}async function Q(){try{return q.info("Generating custom-elements.json..."),await H({path:G(),data:J()}),q.success("Generated custom-elements.json for IDEs."),B(void 0)}catch(v){return q.error("There was an error generating the custom-elements.json file.",v),A("There was an error generating the custom-elements.json file.")}}async function R(){q.info("Generating web-types.json..."),q.info("This feature is not yet implemented.")}
|
|
7
|
-
export{Q as
|
|
7
|
+
export{Q as $a,R as ab};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var{Glob:E}=globalThis.Bun;import G from"path";var U={user:"person.fill",team:"person.2.fill",subscriber:"envelope.open.fill",subscriberemail:"envelope.fill",post:"doc.text.fill",page:"doc.fill",product:"cube.box.fill",productvariant:"cube.fill",productunit:"scalemass.fill",order:"list.clipboard.fill",orderitem:"list.bullet.clipboard.fill",customer:"person.crop.circle.fill",payment:"creditcard.fill",paymentmethod:"creditcard.and.123",paymentproduct:"creditcard.fill",paymenttransaction:"creditcard.fill",category:"tag.fill",tag:"tag",comment:"bubble.left.fill",author:"person.text.rectangle.fill",notification:"bell.fill",job:"briefcase.fill",log:"list.bullet.rectangle.portrait.fill",campaign:"megaphone.fill",review:"star.fill",coupon:"ticket.fill",giftcard:"giftcard.fill",cart:"cart.fill",cartitem:"cart.badge.plus",taxrate:"percent",transaction:"arrow.left.arrow.right.circle.fill",subscription:"repeat.circle.fill",emaillist:"envelope.badge.person.crop",socialpost:"bubble.left.and.bubble.right.fill",manufacturer:"building.2.fill",shippingmethod:"shippingbox.fill",shippingzone:"map.fill",shippingrate:"dollarsign.circle.fill",deliveryroute:"map.fill",driver:"car.fill",digitaldelivery:"arrow.down.doc.fill",licensekey:"key.fill",loyaltypoint:"star.circle.fill",loyaltyreward:"gift.fill",printdevice:"printer.fill",receipt:"doc.text.fill",waitlistproduct:"clock.fill",waitlistrestaurant:"clock.badge.checkmark.fill",websocket:"antenna.radiowaves.left.and.right",default:"tablecells.fill"},W=new Set(["activity","request","error","failedjob"]),H=new Set(["user","team","subscriber","post","page","product","order","customer","payment","coupon","category","tag","comment","author","notification","job","campaign","review","gift-card"]),_={user:"data",team:"data",subscriber:"data",activity:"data",campaign:"marketing",emaillist:"marketing",socialpost:"marketing",subscriberemail:"marketing",comment:"content",tag:"content",paymentmethod:"commerce",paymentproduct:"commerce",paymenttransaction:"commerce",subscription:"commerce",deployment:"system",error:"system",failedjob:"system",job:"system",log:"system",notification:"system",release:"system",request:"system"};function A(j){return j.replace(/([A-Z])/g,"-$1").toLowerCase().replace(/^-/,"")}function D(j){return U[j.toLowerCase()]||U.default||"database"}function S(j,F,k){if(k)return k;let J=j.includes("/")?(j.split("/")[0]??"").toLowerCase():"";if(J==="commerce")return"commerce";if(J==="content")return"content";if(J==="realtime")return"system";return _[F.replace(/-/g,"")]??"data"}async function T(j){try{let F=await import(j);return(F.default??F).dashboard}catch{return}}async function V(j,F,k,J){try{let K=new E("**/*.ts");for await(let Q of K.scan({cwd:j})){if(Q.includes("README")||Q.includes(".d.ts"))continue;let $=Q.replace(/\.ts$/,"").split("/").pop()||"",Z=$.toLowerCase();if($&&!F.has(Z)&&!W.has(Z)){F.add(Z);let z=A($),X=G.join(j,Q),q=await T(X);k.push({name:$,icon:q?.icon??D($),id:z,category:S(Q,z,J),dashboard:q})}}}catch{}}async function N(j,F){let k=[],J=new Set;return await Promise.all([V(j,J,k,"userland"),V(F,J,k)]),k.sort((K,Q)=>K.name.localeCompare(Q.name))}function C(j){return j.map((F)=>{let k={id:F.id,name:F.name,icon:F.icon,hasDedicatedPage:H.has(F.id),category:F.category??"data"};if(F.dashboard)k.dashboard=F.dashboard;return k})}async function x(j){try{return Bun.serve({port:j,fetch:()=>new Response}).stop(!0),!0}catch{return!1}}async function I(j,F=20){for(let k=0;k<F;k++){let J=j+k;if(await x(J))return J}return j}async function P(j,F=500){let k=Date.now();while(Date.now()-k<F){try{let J=await fetch(`http://localhost:${j}/`,{method:"HEAD"});if(J.ok||J.status===404)return!0}catch{}await new Promise((J)=>setTimeout(J,25))}return!1}function Y(j){if(j.dashboard?.enabled===!1)return;if(j.dashboard?.section)return j.dashboard.section;return j.category??"data"}function B(j,F,k,J){return F.filter((K)=>Y(K)===k).filter((K)=>!H.has(K.id)&&!J.has(K.id)).map((K)=>({id:`model-${K.id}`,label:K.dashboard?.label??K.name,icon:K.icon,url:`${j}/models/${K.id}`,...K.dashboard?.roles&&K.dashboard.roles.length>0?{roles:K.dashboard.roles}:{}}))}function y(j,F,k={}){let J={library:k.library??!0,content:k.content??!0,commerce:k.commerce??!0,marketing:k.marketing??!0,analytics:k.analytics??!0,management:k.management??!0,utilities:k.utilities??!0},K={dashboard:k.data?.dashboard??!0,activity:k.data?.activity??!0,users:k.data?.users??!0,teams:k.data?.teams??!0,subscribers:k.data?.subscribers??!0,allModels:k.data?.allModels??!0},Q=[],$=[{id:"home",label:"Dashboard",icon:"house.fill",url:`${j}/`},{id:"dependencies",label:"Dependencies",icon:"shippingbox.fill",url:`${j}/dependencies`},{id:"health",label:"Health",icon:"heart.text.square.fill",url:`${j}/health`}];if(k.ci)$.push({id:"ci",label:"CI",icon:"checkmark.seal.fill",url:`${j}/ci`});if(Q.push({id:"home",title:"Home",items:$}),J.library)Q.push({id:"library",title:"Library",items:[{id:"functions",label:"Functions",icon:"function",url:`${j}/functions`},{id:"packages",label:"Packages",icon:"shippingbox.fill",url:`${j}/packages`}]});if(J.content)Q.push({id:"content",title:"Content",items:[{id:"content-dashboard",label:"Dashboard",icon:"gauge.with.dots.needle.33percent",url:`${j}/content/dashboard`},{id:"files",label:"Files",icon:"folder.fill",url:`${j}/content/files`},{id:"pages",label:"Pages",icon:"doc.fill",url:`${j}/content/pages`},{id:"posts",label:"Posts",icon:"text.bubble.fill",url:`${j}/content/posts`},{id:"categories",label:"Categories",icon:"tag.fill",url:`${j}/content/categories`},{id:"tags",label:"Tags",icon:"tag",url:`${j}/content/tags`},{id:"comments",label:"Comments",icon:"bubble.left.fill",url:`${j}/content/comments`},{id:"authors",label:"Authors",icon:"person.text.rectangle.fill",url:`${j}/content/authors`},{id:"seo",label:"SEO",icon:"magnifyingglass",url:`${j}/content/seo`},...B(j,F,"content",new Set(["page","post","category","tag","comment","author"]))]});Q.push({id:"app",title:"App",items:[{id:"deployments",label:"Deployments",icon:"rocket.fill",url:`${j}/deployments`},{id:"requests",label:"Requests",icon:"arrow.left.arrow.right",url:`${j}/requests`},{id:"realtime",label:"Realtime",icon:"link",url:`${j}/realtime`},{id:"actions",label:"Actions",icon:"bolt.fill",url:`${j}/actions`},{id:"commands",label:"Commands",icon:"terminal.fill",url:`${j}/commands`},{id:"queue",label:"Queue",icon:"list.bullet.rectangle.fill",url:`${j}/queue`},{id:"jobs",label:"Jobs",icon:"briefcase.fill",url:`${j}/jobs`},{id:"inbox",label:"Inbox",icon:"tray.full.fill",url:`${j}/inbox`},{id:"queries",label:"Queries",icon:"magnifyingglass.circle.fill",url:`${j}/queries`},{id:"notifications",label:"Notifications",icon:"bell.fill",url:`${j}/notifications/dashboard`},...B(j,F,"system",new Set)]});let Z=[];if(K.dashboard)Z.push({id:"data-dashboard",label:"Dashboard",icon:"gauge.with.dots.needle.33percent",url:`${j}/data/dashboard`});if(K.activity)Z.push({id:"activity",label:"Activity",icon:"waveform.path.ecg",url:`${j}/data/activity`});if(K.users)Z.push({id:"users",label:"Users",icon:"person.crop.circle.fill",url:`${j}/data/users`});if(K.teams)Z.push({id:"teams",label:"Teams",icon:"person.3.fill",url:`${j}/data/teams`});if(K.subscribers)Z.push({id:"subscribers",label:"Subscribers",icon:"envelope.fill",url:`${j}/data/subscribers`});if(K.allModels)Z.push({id:"data-models",label:"All Models",icon:"square.grid.2x2.fill",url:`${j}/models`});let z=F.filter((X)=>{let q=Y(X);return q==="userland"||q==="data"}).filter((X)=>!H.has(X.id)).map((X)=>({id:`model-${X.id}`,label:X.dashboard?.label??X.name,icon:X.icon,url:`${j}/models/${X.id}`,...X.dashboard?.roles&&X.dashboard.roles.length>0?{roles:X.dashboard.roles}:{}}));if(Q.push({id:"data",title:"Data",items:[...Z,...z]}),J.commerce)Q.push({id:"commerce",title:"Commerce",items:[{id:"commerce-dashboard",label:"Dashboard",icon:"gauge.with.dots.needle.33percent",url:`${j}/commerce/dashboard`},{id:"customers",label:"Customers",icon:"person.crop.circle.fill",url:`${j}/commerce/customers`},{id:"orders",label:"Orders",icon:"list.clipboard.fill",url:`${j}/commerce/orders`},{id:"products",label:"Products",icon:"cube.box.fill",url:`${j}/commerce/products`},{id:"coupons",label:"Coupons",icon:"ticket.fill",url:`${j}/commerce/coupons`},{id:"gift-cards",label:"Gift Cards",icon:"giftcard.fill",url:`${j}/commerce/gift-cards`},{id:"payments",label:"Payments",icon:"creditcard.fill",url:`${j}/commerce/payments`},{id:"delivery",label:"Delivery",icon:"truck.box.fill",url:`${j}/commerce/delivery`},{id:"taxes",label:"Taxes",icon:"percent",url:`${j}/commerce/taxes`},...B(j,F,"commerce",new Set(["customer","order","product","coupon","gift-card","payment","review","category"]))]});if(J.marketing)Q.push({id:"marketing",title:"Marketing",items:[{id:"lists",label:"Lists",icon:"list.bullet",url:`${j}/marketing/lists`},{id:"social-posts",label:"Social Posts",icon:"clock.fill",url:`${j}/marketing/social-posts`},{id:"campaigns",label:"Campaigns",icon:"megaphone.fill",url:`${j}/marketing/campaigns`},{id:"marketing-reviews",label:"Reviews",icon:"star.fill",url:`${j}/marketing/reviews`},...B(j,F,"marketing",new Set(["campaign"]))]});if(J.analytics)Q.push({id:"analytics",title:"Analytics",items:[{id:"analytics-web",label:"Web",icon:"globe",url:`${j}/analytics/web`},{id:"analytics-blog",label:"Blog",icon:"doc.text.fill",url:`${j}/analytics/blog`},{id:"analytics-commerce",label:"Commerce",icon:"cart.fill",url:`${j}/analytics/commerce/web`},{id:"analytics-marketing",label:"Marketing",icon:"megaphone.fill",url:`${j}/analytics/marketing`}]});if(J.management)Q.push({id:"management",title:"Management",items:[{id:"cloud",label:"Cloud",icon:"cloud.fill",url:`${j}/cloud`},{id:"servers",label:"Servers",icon:"server.rack",url:`${j}/servers`},{id:"serverless",label:"Serverless",icon:"bolt.horizontal.circle.fill",url:`${j}/serverless`},{id:"dns",label:"DNS",icon:"network",url:`${j}/dns`},{id:"mailboxes",label:"Mailboxes",icon:"tray.full.fill",url:`${j}/mailboxes`},{id:"logs",label:"Logs",icon:"list.bullet.rectangle.portrait.fill",url:`${j}/logs`},{id:"kanban",label:"Kanban",icon:"rectangle.stack.fill",url:`${j}/kanban`,roles:["admin","dev"]}]});if(J.utilities)Q.push({id:"utilities",title:"Utilities",items:[{id:"buddy",label:"AI Buddy",icon:"bubble.left.and.bubble.right.fill",url:`${j}/buddy`},{id:"environment",label:"Environment",icon:"key.fill",url:`${j}/environment`},{id:"access-tokens",label:"Access Tokens",icon:"key.horizontal.fill",url:`${j}/access-tokens`},{id:"settings",label:"Settings",icon:"gear",url:`${j}/settings/billing`}]});return{sections:Q,minWidth:200,maxWidth:280}}function v(j){return`http://localhost:${j}/?native-sidebar=1`}
|
|
3
|
+
export{U as qa,W as ra,H as sa,A as ta,D as ua,V as va,N as wa,C as xa,x as ya,I as za,P as Aa,y as Ba,v as Ca};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
2
|
+
import{bb as z}from"./chunk-ag4fy7cx.js";import A from"process";import{log as v}from"@stacksjs/logging";import{componentsPath as J,functionsPath as K,libraryEntryPath as N}from"@stacksjs/path";import{writeTextFile as O}from"@stacksjs/storage";import{kebabCase as M}from"@stacksjs/strings";import{ExitCode as B}from"@stacksjs/types";import{determineResetPreset as U}from"@stacksjs/utils";async function T(k){await V(k)}async function V(k){if(k==="web-components")await X();if(k==="functions")await Y()}async function X(k="web-components"){v.info("Ensuring Web Component Library Entry Point..."),await O({path:N(k),data:Q(k)}).catch((q)=>{v.error("There was an error generating the Web Component library entry point",q),A.exit(B.FatalError)}),v.success("Created Web Component Library Entry Point")}async function Y(k="functions"){v.info("Ensuring Function Library Entry Point..."),await O({path:N(k),data:Q(k)}).catch((q)=>{v.error("There was an error generating Function Library Entry Point",q),A.exit(B.FatalError)}),v.success("Created Functions Library Entry Point")}function Q(k){let q=[];if(k==="functions"){if(!z.functions?.files)v.error(Error("There are no functions defined to be built. Please check your config/library.ts file for potential adjustments")),A.exit(B.FatalError);for(let j of z.functions.files)if(Array.isArray(j))q.push(`export * as ${j[1]} from '${K(j[0])}'`);else q.push(`export * from '${K(j)}'`);return q.join(`\r
|
|
3
3
|
`)}q=U();let G=[...q,"import { defineCustomElement } from 'vue'"],H=[],I=[];if(!z.webComponents?.tags)v.error(Error("There are no components defined to be built. Please check your config/library.ts file for potential adjustments")),A.exit(B.FatalError);for(let j of z.webComponents.tags.map((S)=>S.name))if(Array.isArray(j))G.push(`import ${j[1]} from '${J(j[0])}.vue'`),H.push(`const ${j[1]}CustomElement = defineCustomElement(${j[1]})`),I.push(`customElements.define('${M(j[1])}', ${j[1]}CustomElement)`);else G.push(`import ${j} from '${J(j)}.vue'`),H.push(`const ${j}CustomElement = defineCustomElement(${j})`),I.push(`customElements.define('${M(j)}', ${j}CustomElement)`);return[...G,...H,...I].join(`\r
|
|
4
4
|
`)}
|
|
5
|
-
export{T as
|
|
5
|
+
export{T as ka,V as la,X as ma,Y as na,Q as oa};
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var f={action:`import { Action } from '@stacksjs/actions'
|
|
3
|
+
|
|
4
|
+
export default new Action({
|
|
5
|
+
name: '{0}',
|
|
6
|
+
description: '{0} action',
|
|
7
|
+
|
|
8
|
+
handle() {
|
|
9
|
+
return 'Hello World action'
|
|
10
|
+
},
|
|
11
|
+
})`,actionWithValidation:`import { Action } from '@stacksjs/actions'
|
|
12
|
+
import { schema, validate } from '@stacksjs/validation'
|
|
13
|
+
|
|
14
|
+
export default new Action({
|
|
15
|
+
name: '{0}',
|
|
16
|
+
description: '{0} action',
|
|
17
|
+
|
|
18
|
+
async handle(request) {
|
|
19
|
+
// Replace these rules with whatever this action expects. The
|
|
20
|
+
// returned object is typed to the rule shape; type-narrow further
|
|
21
|
+
// by passing a generic to validate<Payload>().
|
|
22
|
+
const data = await validate(request, {
|
|
23
|
+
// example: title: schema.string().required().min(1),
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
return { ok: true, data }
|
|
27
|
+
},
|
|
28
|
+
})`,actionWithAuth:`import { Action } from '@stacksjs/actions'
|
|
29
|
+
|
|
30
|
+
export default new Action({
|
|
31
|
+
name: '{0}',
|
|
32
|
+
description: '{0} action (authenticated)',
|
|
33
|
+
|
|
34
|
+
async handle(request) {
|
|
35
|
+
const user = await request.user()
|
|
36
|
+
if (!user) {
|
|
37
|
+
return new Response('Unauthorized', { status: 401 })
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return { ok: true, userId: user.id }
|
|
41
|
+
},
|
|
42
|
+
})`,actionWithBoth:`import { Action } from '@stacksjs/actions'
|
|
43
|
+
import { schema, validate } from '@stacksjs/validation'
|
|
44
|
+
|
|
45
|
+
export default new Action({
|
|
46
|
+
name: '{0}',
|
|
47
|
+
description: '{0} action (authenticated + validated)',
|
|
48
|
+
|
|
49
|
+
async handle(request) {
|
|
50
|
+
const user = await request.user()
|
|
51
|
+
if (!user) {
|
|
52
|
+
return new Response('Unauthorized', { status: 401 })
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const data = await validate(request, {
|
|
56
|
+
// example: title: schema.string().required().min(1),
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
return { ok: true, userId: user.id, data }
|
|
60
|
+
},
|
|
61
|
+
})`,component:`<script setup lang="ts">
|
|
62
|
+
console.log('Hello World component created')
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<template>
|
|
66
|
+
<div>
|
|
67
|
+
Some HTML block
|
|
68
|
+
</div>
|
|
69
|
+
</template>`,page:`<script setup lang="ts">
|
|
70
|
+
console.log('Hello World page created')
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<template>
|
|
74
|
+
<div>
|
|
75
|
+
Visit http://127.0.0.1/{0}
|
|
76
|
+
</div>
|
|
77
|
+
</template>`,function:`// reactive state
|
|
78
|
+
const {0} = ref(0)
|
|
79
|
+
|
|
80
|
+
// functions that mutate state and trigger updates
|
|
81
|
+
function increment() {
|
|
82
|
+
{0}.value++
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export {
|
|
86
|
+
{0},
|
|
87
|
+
increment,
|
|
88
|
+
}`,language:`button:
|
|
89
|
+
text: Copy`,notification:`import type { {0} } from '@stacksjs/types'
|
|
90
|
+
|
|
91
|
+
function content(): string {
|
|
92
|
+
return 'example'
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function send(): {0} {
|
|
96
|
+
return {
|
|
97
|
+
content: content(),
|
|
98
|
+
}
|
|
99
|
+
}`,mail:`import { Mailable } from '@stacksjs/email'
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Props passed into the {0} email. Add the fields your template
|
|
103
|
+
* needs and they'll flow through to the stx template's \`props\` \u2014
|
|
104
|
+
* \`Mailable<{0}Props>\` ensures \`.template()\` and \`this.props\`
|
|
105
|
+
* type-check against this shape (stacksjs/stacks#1903).
|
|
106
|
+
*/
|
|
107
|
+
export interface {0}Props extends Record<string, unknown> {
|
|
108
|
+
/** Recipient email address. */
|
|
109
|
+
to: string
|
|
110
|
+
/** Display name for the greeting (falls back to 'there'). */
|
|
111
|
+
userName?: string
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* {0} mailable. Subclass of \`Mailable<{0}Props>\` \u2014 \`build()\` wires the
|
|
116
|
+
* recipient / subject / template (props typed against \`{0}Props\`),
|
|
117
|
+
* then \`send()\` (inherited) dispatches via the configured mail driver.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* \`\`\`ts
|
|
121
|
+
* await new {0}({ to: 'user@example.com', userName: 'Ada' }).send()
|
|
122
|
+
* \`\`\`
|
|
123
|
+
*/
|
|
124
|
+
export class {0} extends Mailable<{0}Props> {
|
|
125
|
+
constructor(private readonly props: {0}Props) {
|
|
126
|
+
super()
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
build(): this {
|
|
130
|
+
return this
|
|
131
|
+
.to(this.props.to)
|
|
132
|
+
.subject('{0}')
|
|
133
|
+
.template('{1}', {
|
|
134
|
+
to: this.props.to,
|
|
135
|
+
userName: this.props.userName ?? 'there',
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
}`,mailTemplate:`<script server>
|
|
139
|
+
// Generated by \`buddy make:mail {0}\`. Edit freely \u2014 \`props\` is the
|
|
140
|
+
// object passed by the Mailable's \`build()\`.
|
|
141
|
+
const appName = props.appName || 'Stacks'
|
|
142
|
+
const appUrl = props.appUrl || 'https://stacksjs.com'
|
|
143
|
+
const userName = props.userName || 'there'
|
|
144
|
+
const primaryColor = props.primaryColor || '#3451b2'
|
|
145
|
+
const primaryColorDark = props.primaryColorDark || '#2a4198'
|
|
146
|
+
const subject = props.subject || '{0}'
|
|
147
|
+
const year = props.year || new Date().getFullYear()
|
|
148
|
+
</script>
|
|
149
|
+
|
|
150
|
+
<!DOCTYPE html>
|
|
151
|
+
<html lang="en">
|
|
152
|
+
<head>
|
|
153
|
+
<meta charset="UTF-8">
|
|
154
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
155
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
156
|
+
<title>{{ subject }}</title>
|
|
157
|
+
<style>
|
|
158
|
+
.button { display: inline-block; padding: 14px 32px; background-color: {{ primaryColor }}; color: #ffffff !important; text-decoration: none; border-radius: 6px; font-weight: 600; font-size: 16px; text-align: center; }
|
|
159
|
+
.button:hover { background-color: {{ primaryColorDark }}; }
|
|
160
|
+
@media only screen and (max-width: 600px) {
|
|
161
|
+
.container { width: 100% !important; padding: 20px !important; }
|
|
162
|
+
.content { padding: 24px !important; }
|
|
163
|
+
.button { display: block !important; width: 100% !important; }
|
|
164
|
+
}
|
|
165
|
+
</style>
|
|
166
|
+
</head>
|
|
167
|
+
<body style="margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background-color: #f4f4f5; line-height: 1.6;">
|
|
168
|
+
<table role="presentation" cellpadding="0" cellspacing="0" style="width: 100%; border-collapse: collapse;">
|
|
169
|
+
<tr>
|
|
170
|
+
<td style="padding: 40px 20px;">
|
|
171
|
+
<table role="presentation" cellpadding="0" cellspacing="0" class="container" style="max-width: 600px; margin: 0 auto; background-color: #ffffff; border-radius: 8px; overflow: hidden; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);">
|
|
172
|
+
<tr>
|
|
173
|
+
<td style="background-color: {{ primaryColor }}; padding: 30px 40px; text-align: center;">
|
|
174
|
+
<h1 style="margin: 0; color: #ffffff; font-size: 24px; font-weight: 600;">{{ appName }}</h1>
|
|
175
|
+
</td>
|
|
176
|
+
</tr>
|
|
177
|
+
<tr>
|
|
178
|
+
<td class="content" style="padding: 40px;">
|
|
179
|
+
<h2 style="margin: 0 0 20px; color: #111827; font-size: 20px; font-weight: 600;">{0}</h2>
|
|
180
|
+
<p style="margin: 0 0 20px; color: #4b5563; font-size: 16px;">Hi {{ userName }},</p>
|
|
181
|
+
<p style="margin: 0 0 20px; color: #4b5563; font-size: 16px;">Your message body goes here.</p>
|
|
182
|
+
<table role="presentation" cellpadding="0" cellspacing="0" style="margin: 30px 0;">
|
|
183
|
+
<tr><td><a href="{{ appUrl }}" class="button">Open {{ appName }}</a></td></tr>
|
|
184
|
+
</table>
|
|
185
|
+
</td>
|
|
186
|
+
</tr>
|
|
187
|
+
<tr>
|
|
188
|
+
<td style="padding: 20px 40px; background-color: #f9fafb; border-top: 1px solid #e5e7eb;">
|
|
189
|
+
<p style="margin: 0; color: #6b7280; font-size: 12px; text-align: center;">This is an automated message from {{ appName }}.</p>
|
|
190
|
+
<p style="margin: 10px 0 0; color: #9ca3af; font-size: 11px; text-align: center;">© {{ year }} {{ appName }}. All rights reserved.</p>
|
|
191
|
+
</td>
|
|
192
|
+
</tr>
|
|
193
|
+
</table>
|
|
194
|
+
</td>
|
|
195
|
+
</tr>
|
|
196
|
+
</table>
|
|
197
|
+
</body>
|
|
198
|
+
</html>`,middleware:`import type { Request } from '@stacksjs/router'
|
|
199
|
+
import { Middleware } from '@stacksjs/router'
|
|
200
|
+
|
|
201
|
+
export default new Middleware({
|
|
202
|
+
name: '{0}',
|
|
203
|
+
priority: 1,
|
|
204
|
+
async handle(request: Request) {
|
|
205
|
+
// Your middleware logic here
|
|
206
|
+
},
|
|
207
|
+
})`,model:`import { defineModel } from '@stacksjs/orm'
|
|
208
|
+
import { schema } from '@stacksjs/validation'
|
|
209
|
+
|
|
210
|
+
export default defineModel({
|
|
211
|
+
name: '{0}',
|
|
212
|
+
table: '{1}',
|
|
213
|
+
primaryKey: 'id',
|
|
214
|
+
autoIncrement: true,
|
|
215
|
+
|
|
216
|
+
traits: {
|
|
217
|
+
useTimestamps: true,
|
|
218
|
+
|
|
219
|
+
useSeeder: {
|
|
220
|
+
count: 10,
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
|
|
224
|
+
attributes: {
|
|
225
|
+
// your attributes here
|
|
226
|
+
},
|
|
227
|
+
} as const)`,migration:`import type { Database } from '@stacksjs/database'
|
|
228
|
+
|
|
229
|
+
export async function up(db: Database): Promise<void> {
|
|
230
|
+
await db.schema
|
|
231
|
+
.createTable('{0}')
|
|
232
|
+
.addColumn('id', 'integer', col => col.autoIncrement().primaryKey())
|
|
233
|
+
.execute()
|
|
234
|
+
}`,stackPackageJson:`{
|
|
235
|
+
"name": "{0}",
|
|
236
|
+
"version": "0.0.1",
|
|
237
|
+
"type": "module",
|
|
238
|
+
"stacks": {
|
|
239
|
+
"name": "{1}",
|
|
240
|
+
"description": "A Stacks extension"
|
|
241
|
+
}
|
|
242
|
+
}`,job:`import { Job } from '@stacksjs/jobs'
|
|
243
|
+
|
|
244
|
+
export default new Job({
|
|
245
|
+
name: '{0}',
|
|
246
|
+
description: '{0} job',
|
|
247
|
+
|
|
248
|
+
async handle() {
|
|
249
|
+
// Your job logic here
|
|
250
|
+
console.log('Job executed')
|
|
251
|
+
},
|
|
252
|
+
})`,event:`import { Event } from '@stacksjs/events'
|
|
253
|
+
|
|
254
|
+
export default new Event({
|
|
255
|
+
name: '{0}',
|
|
256
|
+
description: '{0} event',
|
|
257
|
+
|
|
258
|
+
async handle(data: any) {
|
|
259
|
+
// Your event handler logic here
|
|
260
|
+
console.log('Event handled:', data)
|
|
261
|
+
},
|
|
262
|
+
})`,listener:`import { Listener } from '@stacksjs/events'
|
|
263
|
+
|
|
264
|
+
export default new Listener({
|
|
265
|
+
name: '{0}',
|
|
266
|
+
description: '{0} listener',
|
|
267
|
+
|
|
268
|
+
async handle(data: any) {
|
|
269
|
+
// Your listener logic here
|
|
270
|
+
console.log('Listener triggered:', data)
|
|
271
|
+
},
|
|
272
|
+
})`,command:`import { Command } from '@stacksjs/cli'
|
|
273
|
+
|
|
274
|
+
export default new Command({
|
|
275
|
+
name: '{0}',
|
|
276
|
+
description: '{0} command',
|
|
277
|
+
|
|
278
|
+
async handle() {
|
|
279
|
+
// Your command logic here
|
|
280
|
+
console.log('Command executed')
|
|
281
|
+
},
|
|
282
|
+
})`};
|
|
283
|
+
export{f as ea};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{existsSync as N,readdirSync as z,readFileSync as W,statSync as J,writeFileSync as Y}from"fs";import{homedir as T}from"os";import{join as Z,resolve as I}from"path";import A from"process";function y(q,D){let B=q.version;if(B)return{channel:"stable",ref:B.startsWith("v")?B:`v${B}`,targetVersion:B};if(q.canary)return{channel:"canary",ref:"main"};if(q.stable)return{channel:"stable",ref:"stable"};if(D==="canary")return{channel:"canary",ref:"main"};return{channel:"stable",ref:"stable"}}function S(q,D="storage/framework/core"){return`github:stacksjs/stacks#${q}/${D}`}function w(q){try{if(N(q))return JSON.parse(W(q,"utf-8")).version||null}catch{}return null}function g(q){try{if(N(q)){if(W(q,"utf-8").trim()==="canary")return"canary"}}catch{}return"stable"}function b(q,D){try{Y(q,D,"utf-8")}catch{}}function v(q){try{if(N(q)){let D=W(q,"utf-8").trim(),[B,E]=D.split(/\s+/);if((B==="stable"||B==="canary")&&E&&/^[0-9a-f]{40}$/i.test(E))return{channel:B,sha:E.toLowerCase()}}}catch{}return null}function F(q,D,B){try{Y(q,`${D} ${B}`,"utf-8")}catch{}}function P(q){let{force:D,targetVersion:B,remoteSha:E,synced:H,channel:G}=q;if(D||B)return!1;if(!E||!H)return!1;return H.channel===G&&H.sha===E.toLowerCase()}function x(q,D,B){if(q.targetVersion)return`Installing Stacks v${q.targetVersion.replace(/^v/,"")}...`;if(q.channel==="canary")return"Upgrading to the latest canary build...";if(B&&D==="canary")return"Switching back to the latest stable release...";return"Upgrading to the latest version..."}function f(q,D,B,E,H){if(q.targetVersion){let G=q.targetVersion.replace(/^v/,"");if(D===G&&!H)return`Stacks is already at v${G}`;if(D)return`Installed Stacks v${G} (was v${D})`;return`Installed Stacks v${G}`}if(D&&B&&D===B&&!H){if(q.channel==="canary")return`Stacks is already up to date (canary ${D})`;return`Stacks is already up to date (v${D})`}if(D&&B){let G=E==="canary"?`canary ${D}`:`v${D}`,K=q.channel==="canary"?`canary ${B}`:`v${B}`;return`Upgraded Stacks from ${G} to ${K}`}if(B)return`Upgraded Stacks to ${q.channel==="canary"?`canary ${B}`:`v${B}`}`;return`Upgraded Stacks to ${q.ref} (latest)`}var p=[{localPath:"storage/framework/core",subPath:"storage/framework/core",label:"core",skip:["node_modules","dist","bun.lock",".DS_Store"]},{localPath:"storage/framework/defaults",subPath:"storage/framework/defaults",label:"defaults",skip:["node_modules","dist",".DS_Store",".discovered-models.json"]},{localPath:"buddy",subPath:"buddy",label:"buddy",isFile:!0},{localPath:"bootstrap",subPath:"bootstrap",label:"bootstrap",isFile:!0}];function u(q){let D=[A.env.STACKS_LOCAL_PATH,I(q,"..","stacks"),I(q,"..","..","stacks"),I(T(),"Code","stacks"),I(T(),"code","stacks"),I(T(),"projects","stacks"),I(T(),"src","stacks")];for(let B of D){if(!B)continue;let E=Z(B,"storage","framework","core","buddy","package.json");try{if(N(E)&&I(B)!==I(q))return I(B)}catch{}}return null}async function V(q,D=[]){let B=new Map;if(!N(q))return B;let E=new Set(D),H=[{abs:q,rel:""}],G=[];while(H.length>0){let{abs:K,rel:M}=H.pop(),L;try{L=z(K)}catch{continue}for(let O of L){if(E.has(O))continue;let U=Z(K,O),X=M?`${M}/${O}`:O,Q;try{Q=J(U)}catch{continue}if(Q.isDirectory())H.push({abs:U,rel:X});else if(Q.isFile()){let _=Q.size;G.push((async()=>{let $=await C(U);B.set(X,{size:_,hash:$})})())}}}return await Promise.all(G),B}function d(q,D){let B=0,E=0,H=0;for(let[K,M]of D){let L=q.get(K);if(!L)B++;else if(L.size!==M.size||L.hash!==M.hash)E++;else H++}let G=0;for(let K of q.keys())if(!D.has(K))G++;return{added:B,changed:E,removed:G,unchanged:H}}async function C(q){try{let D=await Bun.file(q).arrayBuffer();return Bun.hash(D)}catch{return 0n}}
|
|
3
|
+
export{y as c,S as d,w as e,g as f,b as g,v as h,F as i,P as j,x as k,f as l,p as m,u as n,V as o,d as p};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
2
|
+
import{pb as O}from"./chunk-4qzb8g3z.js";import{log as B}from"@stacksjs/logging";import*as J from"@stacksjs/path";import{doesExist as Q,get as R,writeFile as L}from"@stacksjs/storage";async function X(q){let b=q.name;if(!b)return B.error("Policy name is required"),!1;let z=b.endsWith("Policy")?b:`${b}Policy`,v=q.model||z.replace("Policy",""),I=T(z,v),H=J.appPath(`Policies/${z}.ts`);try{let G=J.appPath("Policies");if(!Q(G)){let{mkdirSync:K}=await import("@stacksjs/storage");K(G,{recursive:!0})}if(await L(H,I),B.success(`Created policy: ${H}`),q.register!==!1)await U(v,z);return!0}catch(G){return B.error(`Failed to create policy: ${G.message}`),!1}}function T(q,b){return`import type _User from '../models/User'
|
|
3
3
|
import { BasePolicy } from '@stacksjs/auth'
|
|
4
4
|
|
|
5
5
|
type UserModel = _User
|
|
@@ -92,4 +92,4 @@ export default class ${q} extends BasePolicy<${b}> {
|
|
|
92
92
|
`}async function U(q,b){let z=J.appPath("Gates.ts");try{let v=await R(z),I=v.match(/export const policies[^{]*\{([^}]*)\}/);if(I){let H=I[1]??"";if(H.includes(`'${q}'`)){B.info(`Policy for '${q}' already registered in Gates.ts`);return}let G=` '${q}': '${b}',
|
|
93
93
|
`,K=`${H.trimEnd()}
|
|
94
94
|
${G}`;v=v.replace(/export const policies[^{]*\{([^}]*)\}/,`export const policies: Record<string, string | { policy: string, model?: string }> = {${K}}`),await L(z,v),B.success(`Registered policy '${b}' for '${q}' in Gates.ts`)}}catch(v){B.warn(`Could not register policy in Gates.ts: ${v.message}`),B.info("You may need to manually add it to app/Gates.ts")}}
|
|
95
|
-
export{X as
|
|
95
|
+
export{X as ha};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
3
|
-
export{v as
|
|
2
|
+
import{db as o}from"./chunk-rzhs51h1.js";import{Action as r}from"@stacksjs/enums";async function v(e){await o(r.Dev,e)}async function s(e){await o(r.Dev,e)}async function a(e){await n(e)}async function n(e){await o(r.DevApi,e)}async function D(e){await o(r.DevComponents,e)}async function p(e){await o(r.DevDashboard,e)}async function c(e){await o(r.DevSystemTray,e)}async function m(e){await o(r.DevDesktop,e)}async function u(e){await o(r.DevDocs,e)}
|
|
3
|
+
export{v as Da,s as Ea,a as Fa,n as Ga,D as Ha,p as Ia,c as Ja,m as Ka,u as La};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import{NpmScript as i}from"@stacksjs/enums";import{log as t}from"@stacksjs/logging";import{projectPath as m}from"@stacksjs/path";import{runNpmScript as r}from"@stacksjs/utils";async function n(o){t.info("Committing..."),await r(i.Commit,{cwd:m(),...o}),t.success("Committed")}async function a(o){return await n(o)}
|
|
3
|
-
export{n as
|
|
3
|
+
export{n as Ma,a as Na};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{
|
|
2
|
+
import{pb as H}from"./chunk-4qzb8g3z.js";import{execSync as M,spawn as j}from"child_process";import Z from"fs";import E from"os";import $ from"path";import Y from"process";import{log as B}from"@stacksjs/cli";var q=Y.platform==="win32"?$.join(Y.env.windir||"C:\\Windows","System32","drivers","etc","hosts"):"/etc/hosts",X=$.join(E.homedir(),".stacks","ssl");function T(){return Y.stdin.isTTY===!0&&Y.stdout.isTTY===!0}function V(){return Y.env.SUDO_PASSWORD}function k(){return T()||!!V()}function F(z){try{let G=Z.readFileSync(q,"utf-8");return G.includes(`127.0.0.1 ${z}`)||G.includes(`::1 ${z}`)}catch{if(Y.platform!=="win32"){let G=V();if(G)try{let J=M(`echo '${G}' | sudo -S cat "${q}" 2>/dev/null`,{encoding:"utf-8"});return J.includes(`127.0.0.1 ${z}`)||J.includes(`::1 ${z}`)}catch{return!1}}return!1}}async function x(z,G){if(F(z)){if(G)B.info(`${z} already in hosts file`);return!0}let J=`
|
|
3
3
|
# Added by Stacks
|
|
4
4
|
127.0.0.1 ${z}
|
|
5
5
|
::1 ${z}
|
|
6
6
|
`;if(Y.platform==="win32")return B.warn("Please add this to your hosts file manually:"),B.warn(`127.0.0.1 ${z}`),B.warn(`::1 ${z}`),B.warn(`File location: ${q}`),!1;if(!k()){if(G)B.warn(`Cannot add ${z} to hosts file (non-interactive mode and no SUDO_PASSWORD set)`),B.info("Run `buddy setup:ssl` in a terminal or set SUDO_PASSWORD environment variable");return!1}let K=V();return new Promise((Q)=>{let N;if(K)N=j("sh",["-c",`echo '${K}' | sudo -S sh -c "echo '${J}' >> '${q}'"`],{stdio:["pipe","inherit","inherit"]});else N=j("sudo",["sh","-c",`echo '${J}' >> "${q}"`],{stdio:"inherit"});N.on("close",(U)=>{if(U===0){if(G)B.success(`Added ${z} to hosts file`);Q(!0)}else{if(G)B.error(`Failed to add ${z} to hosts file`),B.warn(`Manually add: 127.0.0.1 ${z}`);Q(!1)}}),N.on("error",()=>{B.error("Failed to run sudo command"),Q(!1)})})}function O(z){let G=$.join(X,`${z}.crt`),J=$.join(X,`${z}.key`),K=$.join(X,`${z}.ca.crt`);return Z.existsSync(G)&&Z.existsSync(J)&&Z.existsSync(K)}function y(z){if(Y.platform!=="darwin")return!0;let G=$.join(X,`${z}.crt`);if(!Z.existsSync(G))return!1;try{let J=M(`openssl x509 -noout -fingerprint -sha256 -in "${G}"`,{encoding:"utf-8"}),K=J.indexOf("="),Q=K>=0?J.slice(K+1).trim():"";if(!Q)return!1;return M("security find-certificate -a -Z -p | openssl x509 -noout -fingerprint -sha256 2>/dev/null || true",{encoding:"utf-8"}).includes(Q)}catch{return!1}}async function D(z,G){let J=$.join(X,`${z}.ca.crt`),K=$.join(X,`${z}.crt`);if(!Z.existsSync(J))return B.error(`CA certificate not found: ${J}`),!1;if(y(z)){if(G)B.info("Certificate is already trusted, skipping trust step");return!0}if(!k()){if(G)B.warn("Cannot trust certificate (non-interactive mode and no SUDO_PASSWORD set)"),B.info("Run `buddy setup:ssl` in a terminal or set SUDO_PASSWORD environment variable");return!1}let Q=V();if(Y.platform==="darwin")return new Promise((N)=>{let U=`security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain '${J}' && security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain '${K}'`,W;if(Q)W=j("sh",["-c",`echo '${Q}' | sudo -S sh -c "${U}"`],{stdio:["pipe","inherit","inherit"]});else W=j("sudo",["sh","-c",U],{stdio:"inherit"});W.on("close",(A)=>{if(A===0){try{M(`security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain-db "${K}" 2>/dev/null || true`)}catch{}N(!0)}else{if(G)B.warn("Could not trust certificate automatically"),B.info(` sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${J}"`);N(!1)}}),W.on("error",()=>{B.error("Failed to run sudo command"),N(!1)})});else if(Y.platform==="linux")return new Promise((N)=>{let U=`mkdir -p /usr/local/share/ca-certificates/stacks && cp '${J}' /usr/local/share/ca-certificates/stacks/ && update-ca-certificates`,W;if(Q)W=j("sh",["-c",`echo '${Q}' | sudo -S sh -c "${U}"`],{stdio:["pipe","inherit","inherit"]});else W=j("sudo",["sh","-c",U],{stdio:"inherit"});W.on("close",(A)=>{if(A===0)B.success("Certificate trusted"),N(!0);else B.warn("Could not trust certificate automatically"),N(!1)}),W.on("error",()=>N(!1))});else if(Y.platform==="win32")return B.warn("Please manually trust the certificate in Windows:"),B.warn(` 1. Double-click: ${J}`),B.warn(' 2. Click "Install Certificate"'),B.warn(' 3. Select "Local Machine" and place in "Trusted Root Certification Authorities"'),!1;return!1}async function R(z,G){try{let J=await import("@stacksjs/tlsx"),{generateCertificate:K,createRootCA:Q}=J,N=J.httpsConfig;if(!Z.existsSync(X))Z.mkdirSync(X,{recursive:!0});let U={domain:z,hostCertCN:z,basePath:X,caCertPath:$.join(X,`${z}.ca.crt`),certPath:$.join(X,`${z}.crt`),keyPath:$.join(X,`${z}.key`),altNameIPs:["127.0.0.1","::1"],altNameURIs:["localhost",z],organizationName:"Stacks Development",countryName:"US",stateName:"California",localityName:"Playa Vista",commonName:z,validityDays:825,verbose:G||!1,subjectAltNames:[{type:2,value:z},{type:2,value:`*.${z.split(".").slice(1).join(".")}`},{type:2,value:"localhost"},{type:2,value:"*.localhost"}]};if(G)B.info("Generating Root CA certificate...");let W=await Q(U);if(G)B.info(`Generating host certificate for ${z}...`);let A=await K({...U,rootCA:{certificate:W.certificate,privateKey:W.privateKey}});if(Z.writeFileSync(U.caCertPath,W.certificate),Z.writeFileSync(U.certPath,A.certificate),Z.writeFileSync(U.keyPath,A.privateKey),G)B.success(`SSL certificates generated for ${z}`);return!0}catch(J){return B.error(`Failed to generate certificates: ${J}`),!1}}async function C(z={}){let G=z.domain||Y.env.APP_URL?.replace(/^https?:\/\//,"")||"stacks.localhost";if(G==="localhost"||G.startsWith("localhost:"))return B.info("Skipping SSL setup for localhost"),!0;let J=!0;if(!z.skipHosts){if(!await x(G,z.verbose)&&z.verbose)B.warn("Hosts file not updated - you may need to add the entry manually")}if(!O(G)){if(z.verbose)B.info("Generating SSL certificates...");if(!await R(G,z.verbose))return B.error("Failed to generate SSL certificates"),!1}if(!z.skipTrust&&!y(G)){if(!await D(G,z.verbose))B.warn("Certificate not trusted - you may see browser warnings"),J=!1}return J}function f(z){return F(z)&&O(z)}
|
|
7
|
-
export{F as
|
|
7
|
+
export{F as q,x as r,O as s,y as t,D as u,R as v,C as w,f as x};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{ea as O}from"./chunk-mcwfmqzb.js";import{db as A}from"./chunk-rzhs51h1.js";import{pb as w}from"./chunk-4qzb8g3z.js";import Y from"process";import{existsSync as S}from"fs";import{italic as X,runCommand as K}from"@stacksjs/cli";import{ExitCode as Z}from"@stacksjs/types";import{localUrl as T}from"@stacksjs/config";import{Action as P}from"@stacksjs/enums";import{handleError as v}from"@stacksjs/error-handling";import{log as B}from"@stacksjs/logging";import{frameworkPath as b,path as J,resolve as V}from"@stacksjs/path";import{createFolder as U,doesFolderExist as _,writeTextFile as x}from"@stacksjs/storage";import{kebabCase as j,pascalCase as D,template as y}from"@stacksjs/strings";var L=!1;function Zq(z){L=Boolean(z)}function $q(){return L}function E(z,...q){return y(O[z],...q)}async function W(z,q){if(L){let G=q.split(`
|
|
3
|
+
`),H=G.slice(0,60).map((I)=>` ${I}`).join(`
|
|
4
|
+
`),Q=G.length>60?`
|
|
5
|
+
${X(`\u2026 ${G.length-60} more lines elided`)}`:"";B.info(`[dry-run] would write ${z} (${G.length} lines)`),Y.stdout.write(`${H}${Q}
|
|
6
|
+
|
|
7
|
+
`);return}await x({path:z,data:q})}async function $(z,q,...G){await W(z,E(q,...G))}async function C(z){if(z.component)await F(z);if(z.database)h(z);if(z.function)await l(z);if(z.language)await p(z);if(z.middleware)await a(z);if(z.notification)await d(z);if(z.page)await c(z);if(z.stack)await s(z)}async function Uq(z){return await C(z)}async function _q(z){try{let q=z.name;B.info("Creating your action..."),await N(z),B.success(`Created ${X(q)} action`)}catch(q){B.error("There was an error creating your action",q),Y.exit(Z.FatalError)}}async function F(z){try{let q=z.name;B.info("Creating your component..."),await k(z),B.success(`Created ${X(q)} component`)}catch(q){B.error("There was an error creating your component",q),Y.exit(Z.FatalError)}}async function N(z){let q=z.name,G=z,H=Boolean(G.withValidation||z["with-validation"]),Q=Boolean(G.withAuth||z["with-auth"]),I=H&&Q?"actionWithBoth":H?"actionWithValidation":Q?"actionWithAuth":"action";await $(J.userActionsPath(q),I,q)}async function k(z){let q=z.name;await $(J.userComponentsPath(`${q}.vue`),"component",q)}function h(z){try{let q=z.name;B.info(`Creating your ${X(q)} database...`),f(z),B.success(`Created ${X(q)} database`)}catch(q){B.error("There was an error creating your database",q),Y.exit(Z.FatalError)}}function f(z){B.debug("createDatabase options",z)}function Vq(z){try{let q=z.name;B.info(`Creating your ${X(q)} factory...`),f(z),B.success(`Created ${X(q)} factory`)}catch(q){B.error("There was an error creating your factory",q),Y.exit(Z.FatalError)}}async function Lq(z){let q=z.name||"MyFactory",G=q.endsWith("Factory")?q:`${q}Factory`;try{let{path:H}=await import("@stacksjs/path"),I=`${H.userDatabasePath("factories")}/${G}.ts`;if(await Bun.file(I).exists()){B.warn(`Factory ${G} already exists at ${I}`);return}let R=q.replace(/Factory$/,""),u=`import type { ${R}Model } from '@stacksjs/orm'
|
|
8
|
+
|
|
9
|
+
export function ${G}(): Partial<${R}Model> {
|
|
10
|
+
return {
|
|
11
|
+
// Define your factory attributes here
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export default ${G}
|
|
16
|
+
`;await W(I,u),B.success(`Created factory: ${I}`)}catch(H){throw B.error(`Failed to create factory ${G}`,H),H}}async function d(z){try{let q=z.name;B.info(`Creating your ${X(q)} notification...`),await i(z),B.success(`Created ${X(q)} notification`)}catch(q){B.error("There was an error creating your notification",q),Y.exit(Z.FatalError)}}async function g(z){let q=String(z.name||"").trim();if(!q)return B.error("A mail name is required (e.g. `buddy make:mail OrderShipped`)."),!1;let G=D(q),H=j(q),Q=J.userMailPath(`${G}.ts`),I=J.userEmailsPath(`${H}.stx`);if(!z.force){if(S(Q))return console.error(`${X(Q)} already exists \u2014 re-run with --force to overwrite.`),!1;if(S(I))return console.error(`${X(I)} already exists \u2014 re-run with --force to overwrite.`),!1}if(!_(J.userMailPath()))await U(J.userMailPath());if(!_(J.userEmailsPath()))await U(J.userEmailsPath());try{return await $(Q,"mail",G,H),await $(I,"mailTemplate",G,H),!0}catch(M){return v("Error creating mailable",M),!1}}async function Mq(z){try{let q=z.name;if(B.info(`Creating your ${X(q)} mailable...`),!await g(z))Y.exit(Z.FatalError);B.success(`Created ${X(D(q))} mailable + ${X(j(q))}.stx template`)}catch(q){B.error("There was an error creating your mailable",q),Y.exit(Z.FatalError)}}async function c(z){try{let q=z.name;B.info("Creating your page..."),await m(z),B.success(`Created ${q} page`)}catch(q){B.error("There was an error creating your page",q),Y.exit(Z.FatalError)}}async function m(z){let q=z.name;await $(J.userViewsPath(`${q}.vue`),"page",q)}async function l(z){try{let q=z.name;B.info("Creating your function..."),await r(z),B.success(`Created ${q} function`)}catch(q){B.error("There was an error creating your function",q),Y.exit(Z.FatalError)}}async function r(z){let q=z.name;await $(J.userFunctionsPath(`${q}.ts`),"function",q)}async function p(z){try{let q=z.name;B.info("Creating your translation file..."),await n(z),B.success(`Created ${q} translation file`)}catch(q){B.error("There was an error creating your language.",q),Y.exit(Z.FatalError)}}async function n(z){let q=z.name;await $(J.resourcesPath(`lang/${q}.yml`),"language",q)}async function s(z){try{let q=z.name;B.info(`Creating your ${q} stack...`);let G=V(Y.cwd(),q);if(_(G))B.error(`Directory "${q}" already exists`),Y.exit(Z.FatalError);await U(G);let H=["app/Actions","app/Models","config","database/migrations","resources/views","resources/components","resources/functions","routes","public"];for(let I of H)await U(V(G,I));let Q=q.replace(/^@[^/]+\//,"").replace(/-stack$/,"");await $(V(G,"package.json"),"stackPackageJson",q,Q),B.success(`Successfully scaffolded your "${q}" stack`),B.info(""),B.info(` cd ${q}`),B.info(" # Add your models, actions, views, etc."),B.info(" # Then publish: bun publish"),B.info(""),B.info(" Users install it with:"),B.info(` buddy stack:install ${q}`)}catch(q){B.error("There was an error creating your stack",q),Y.exit(Z.FatalError)}}async function i(z){let q=z.name;try{let G="EmailOptions";if(!_("notifications"))await U("./notifications");if(z.chat)G="ChatOptions";if(z.sms)G="SMSOptions";return await $(J.userNotificationsPath(`${q}.ts`),"notification",G),!0}catch(G){return v("Error creating notification",G),!1}}async function Rq(z){let q=z.name,G="dummy-name";if(!q[0])throw Error("options.name is required and cannot be empty");let H=q[0].toUpperCase()+q.slice(1),Q=b(`database/migrations/${H}.ts`);try{await $(Q,"migration","dummy-name"),B.success(`Successfully created your migration file at stacks/database/migrations/${H}.ts`)}catch(I){B.error(I)}}async function Sq(){await A(P.QueueTable)}async function Kq(){let z=await T();B.info("Creating SSL certificate..."),await K(`tlsx ${z}`,{cwd:J.storagePath("keys")}),B.success("Certificate created"),B.info("Installing SSL certificate..."),await K("tlsx -install",{cwd:J.storagePath("keys")}),B.success("Certificate installed")}async function Aq(z){let q=z.name;if(!q[0])throw Error("options.name is required and cannot be empty");let G=q[0].toUpperCase()+q.slice(1),H=G.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"").replace(/([^s])$/,"$1s"),Q=J.userModelsPath(`${G}.ts`);try{await $(Q,"model",G,H),B.success(`Model created: ${X(`app/Models/${G}.ts`)}`)}catch(I){B.error(I)}}async function a(z){let q=z.name;await $(J.userMiddlewarePath(`${q}.ts`),"middleware",q)}
|
|
17
|
+
export{Zq as E,$q as F,C as G,Uq as H,_q as I,F as J,N as K,k as L,h as M,f as N,Vq as O,Lq as P,d as Q,g as R,Mq as S,c as T,m as U,l as V,r as W,p as X,n as Y,s as Z,i as _,Rq as $,Sq as aa,Kq as ba,Aq as ca,a as da};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{ob as j,pb as D}from"./chunk-4qzb8g3z.js";var k={};j(k,{runActions:()=>A,runAction:()=>v,hasAction:()=>R});import{existsSync as W}from"fs";import T from"process";import{buddyOptions as I,runCommand as F,runCommands as N}from"@stacksjs/cli";import{err as X}from"@stacksjs/error-handling";import{log as V}from"@stacksjs/logging";import*as B from"@stacksjs/path";async function x(q){let z=[];z.push(B.actionsPath(`src/${q}.ts`));try{let H=import.meta.resolve("@stacksjs/actions/package.json");if(H){let J=new URL(H).pathname,G=J.slice(0,J.lastIndexOf("/"));z.push(`${G}/dist/src/${q}.js`),z.push(`${G}/src/${q}.ts`)}}catch{}for(let H of z)if(await Bun.file(H).exists())return H;return null}async function v(q,z){if(V.debug(`[action] Running: ${q}`),q==="dev/views")try{let K=B.projectPath("pantry");if(!T.env.NODE_PATH?.includes(K))T.env.NODE_PATH=T.env.NODE_PATH?`${K}:${T.env.NODE_PATH}`:K,D("module").Module._initPaths?.();let Z=[B.projectPath("storage/framework/core/actions/src/dev/views.ts"),B.frameworkPath("actions/src/dev/views.ts")];for(let Q of Z)if(W(Q))return await import(Q),{ok:!0,value:{}};return X("dev/views entry not found")}catch(K){return X(`Failed to start dev server: ${K}`)}if(!(q.includes("/")||["dev","build","install","upgrade","migrate"].some((K)=>q.startsWith(K)))){let K=new Bun.Glob("**/*.{ts,js}"),Z={cwd:B.userActionsPath(),onlyFiles:!0,absolute:!0},Q=[],b=B.userActionsPath();for await(let L of K.scan(Z)){if(L.replace(`${b}/`,"").replace(/\.(ts|js)$/,"")===q||L.endsWith(`${q}.ts`)||L.endsWith(`${q}.js`))return V.debug(`[action] Resolved: ${q} \u2192 ${L}`),await(await import(L)).default.handle(void 0);Q.push(L)}for(let L of Q)try{let Y=await import(L);if(Y.name===q)return V.debug(`[action] Resolved: ${q} \u2192 ${L}`),await Y.handle()}catch(Y){}}let J=await x(q);if(!J)return X(`Action '${q}' not found in storage/framework/core/actions/src or @stacksjs/actions`);V.debug(`[action] Resolved: ${q} \u2192 ${J}`);let G=q.startsWith("dev/"),M=G?"--watch":"",S=G?"":I(z)||"",U=`bun ${M} ${J} ${S}`.trimEnd(),_=B.projectPath("pantry"),$=T.env.NODE_PATH,w=$?`${_}:${$}`:_,E=z?.verbose||G&&!z?.quiet,C={cwd:z?.cwd||B.projectPath(),...z,stdout:E?"inherit":void 0,stderr:E?"inherit":void 0,env:{...z?.env,NODE_PATH:w,...G?{STACKS_DEV_SERVER:"1"}:{}}},O=await F(U,C);return V.debug(`[action] Completed: ${q}`),O}async function A(q,z){if(!q.length)return X("No actions were specified");for(let M of q)if(!R(M))return X(`The specified action "${M}" does not exist`);let H=I(z)||"",J={cwd:z?.cwd||B.projectPath(),...z},G=q.map((M)=>`bun ${B.relativeActionsPath(`src/${M}.ts`)} ${H}`);return await N(G,J)}function R(q){let z=[`${q}.ts`,`${q}`,`Dashboard/${q}.ts`,`Dashboard/${q}`,`Buddy/${q}.ts`,`Buddy/${q}`],H=[`src/${q}.ts`,`src/${q}`,`${q}.ts`,`${q}`];return[...z.map((G)=>B.userActionsPath(G)),...H.map((G)=>B.actionsPath(G))].some((G)=>W(G))}
|
|
3
|
+
export{v as db,A as eb,R as fb,k as gb};
|