@stacksjs/actions 0.70.84 → 0.70.85

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.
Files changed (87) hide show
  1. package/dist/action.js +1 -1
  2. package/dist/actions.js +1 -1
  3. package/dist/add.js +1 -1
  4. package/dist/ai/request-model-access.js +1 -1
  5. package/dist/blog.js +1 -1
  6. package/dist/build/frontend-static.js +1 -1
  7. package/dist/build.js +1 -1
  8. package/dist/chunk-0c8sd1t6.js +2 -0
  9. package/dist/{chunk-hv8tkjw2.js → chunk-0g2nzhx9.js} +2 -2
  10. package/dist/chunk-0gadhvn7.js +3 -0
  11. package/dist/{chunk-9sx16wyz.js → chunk-0h27aa4r.js} +1 -1
  12. package/dist/{chunk-f8z1aft6.js → chunk-3peh8kqs.js} +1 -1
  13. package/dist/{chunk-73y0wp0s.js → chunk-62gdfav8.js} +2 -2
  14. package/dist/{chunk-d5mbs5zz.js → chunk-6bk53y02.js} +1 -1
  15. package/dist/{chunk-dxvgx0r7.js → chunk-78c5n3s2.js} +2 -2
  16. package/dist/{chunk-heh4x32p.js → chunk-c74qv38e.js} +2 -2
  17. package/dist/{chunk-rft5b6wr.js → chunk-e142dheq.js} +1 -1
  18. package/dist/{chunk-k7n6c9hm.js → chunk-ec4gky40.js} +1 -1
  19. package/dist/chunk-h3d81wrg.js +3 -0
  20. package/dist/{chunk-hr9ndn21.js → chunk-m3q0x4h0.js} +1 -1
  21. package/dist/{chunk-30cc35np.js → chunk-mqgbyhph.js} +1 -1
  22. package/dist/{chunk-t5j470r2.js → chunk-n5eqwhck.js} +2 -2
  23. package/dist/{chunk-8maaf0ze.js → chunk-nsvnqv8y.js} +2 -2
  24. package/dist/{chunk-w363nwy3.js → chunk-nty6mmx4.js} +1 -1
  25. package/dist/{chunk-h10aj7jf.js → chunk-tpb8jgsk.js} +2 -2
  26. package/dist/{chunk-wtnp31q5.js → chunk-tsbk5vne.js} +1 -1
  27. package/dist/{chunk-w4erevzw.js → chunk-y6e448he.js} +2 -2
  28. package/dist/commit.js +1 -1
  29. package/dist/deploy/index.js +2 -2
  30. package/dist/dev/api.js +1 -1
  31. package/dist/dev/dashboard-globals.js +1 -1
  32. package/dist/dev/dashboard-utils.js +1 -1
  33. package/dist/dev/dashboard.js +1 -1
  34. package/dist/dev/index.js +1 -1
  35. package/dist/dev/migrate-watcher.js +1 -1
  36. package/dist/dev/views.js +1 -1
  37. package/dist/discover-packages.js +1 -1
  38. package/dist/examples.js +1 -1
  39. package/dist/generate/component-meta.js +1 -1
  40. package/dist/generate/env-files.js +1 -1
  41. package/dist/generate/ide-helpers.js +1 -1
  42. package/dist/generate/index.js +1 -1
  43. package/dist/generate/lib-entries.js +1 -1
  44. package/dist/generate/vscode-custom-data.js +1 -1
  45. package/dist/helpers/component-meta.js +1 -1
  46. package/dist/helpers/index.js +1 -1
  47. package/dist/helpers/lib-entries.js +1 -1
  48. package/dist/helpers/package-json.js +1 -1
  49. package/dist/helpers/utils.js +1 -1
  50. package/dist/helpers/vscode-custom-data.js +1 -1
  51. package/dist/index.js +1 -1
  52. package/dist/lint/fix.js +1 -1
  53. package/dist/lint/index.js +1 -1
  54. package/dist/lint/lint.js +1 -1
  55. package/dist/make-command.js +44 -1
  56. package/dist/make-job.js +128 -1
  57. package/dist/make-policy.js +93 -1
  58. package/dist/make-resource.js +112 -1
  59. package/dist/make.js +1 -1
  60. package/dist/orm/base.js +1 -1
  61. package/dist/release.js +1 -1
  62. package/dist/run-action.js +1 -1
  63. package/dist/scaffold-crud.js +86 -1
  64. package/dist/setup/index.js +1 -1
  65. package/dist/setup/ssl.js +1 -1
  66. package/dist/stacks.js +1 -1
  67. package/dist/templates.js +1 -1
  68. package/dist/types.js +1 -1
  69. package/dist/upgrade/dependencies.js +1 -1
  70. package/dist/upgrade/framework-utils.js +1 -1
  71. package/dist/upgrade/framework.js +1 -1
  72. package/dist/upgrade/index.js +1 -1
  73. package/dist/upgrade/packages.js +1 -1
  74. package/dist/upgrade.js +1 -1
  75. package/package.json +17 -16
  76. package/dist/chunk-0wyxyqak.js +0 -3
  77. package/dist/chunk-8kvzjd10.js +0 -3
  78. package/dist/chunk-acyw294f.js +0 -130
  79. package/dist/chunk-ay41a7jn.js +0 -3
  80. package/dist/chunk-e87s6b8r.js +0 -46
  81. package/dist/chunk-g6k41p49.js +0 -1
  82. package/dist/chunk-gcjrdkq7.js +0 -95
  83. package/dist/chunk-h63c1v89.js +0 -3
  84. package/dist/chunk-n057zfgw.js +0 -114
  85. package/dist/chunk-v0hqskdk.js +0 -3
  86. package/dist/chunk-vv4nqhgg.js +0 -3
  87. package/dist/chunk-x0cnhg3z.js +0 -88
package/dist/make-job.js CHANGED
@@ -1,2 +1,129 @@
1
1
  // @bun
2
- import{ka as a}from"./chunk-acyw294f.js";import"./chunk-v0hqskdk.js";export{a as makeJob};
2
+ import"./chunk-h3d81wrg.js";import{log as A}from"@stacksjs/logging";import*as H from"@stacksjs/path";import{writeFile as L}from"@stacksjs/storage";async function T(v){let x=v,y=v.name;if(!y)return A.error("Job name is required"),!1;let z=y.endsWith("Job")?y:`${y}Job`,I=x.class??!1?Q(z,x):M(z,x),E=H.userJobsPath(`${z}.ts`);try{return await L(E,I),A.success(`Created job: ${E}`),!0}catch(K){return A.error(`Failed to create job: ${K.message}`),!1}}function M(v,x){let y=x.queue??"default",z=x.tries??3,D=x.backoff??3;return`import { Job } from '@stacksjs/queue'
3
+
4
+ export default new Job({
5
+ /**
6
+ * The job name (optional, defaults to filename)
7
+ */
8
+ name: '${v}',
9
+
10
+ /**
11
+ * A description of what this job does (optional)
12
+ */
13
+ description: '${v} job',
14
+
15
+ /**
16
+ * The queue this job should be dispatched to
17
+ */
18
+ queue: '${y}',
19
+
20
+ /**
21
+ * Number of times to retry if the job fails
22
+ */
23
+ tries: ${z},
24
+
25
+ /**
26
+ * Seconds to wait between retry attempts
27
+ */
28
+ backoff: ${D},
29
+
30
+ /**
31
+ * Cron expression for scheduled jobs (optional)
32
+ * Examples:
33
+ * - '* * * * *' - Every minute
34
+ * - '0 * * * *' - Every hour
35
+ * - '0 0 * * *' - Every day at midnight
36
+ */
37
+ // rate: '* * * * *',
38
+
39
+ /**
40
+ * Backoff configuration for advanced retry strategies (optional)
41
+ */
42
+ // backoffConfig: {
43
+ // strategy: 'exponential', // 'fixed' | 'exponential' | 'linear'
44
+ // initialDelay: 1000,
45
+ // factor: 2,
46
+ // maxDelay: 60000,
47
+ // },
48
+
49
+ /**
50
+ * Handle the job
51
+ * @param payload - The job payload data
52
+ * @returns The result of the job processing
53
+ */
54
+ async handle(payload: Record<string, unknown>) {
55
+ // Add your job logic here.
56
+ console.log('Processing job with payload:', payload)
57
+
58
+ return { success: true }
59
+ },
60
+ })
61
+ `}function Q(v,x){let y=x.queue??"default",z=x.tries??3;return`import { log } from '@stacksjs/logging'
62
+
63
+ /**
64
+ * ${v}
65
+ *
66
+ * Generated job class.
67
+ */
68
+ export default class ${v} {
69
+ /**
70
+ * Job configuration
71
+ */
72
+ public static config = {
73
+ /**
74
+ * The queue this job should be dispatched to
75
+ */
76
+ queue: '${y}',
77
+
78
+ /**
79
+ * Cron expression for scheduled jobs (optional)
80
+ * Examples:
81
+ * - '* * * * *' - Every minute
82
+ * - '0 * * * *' - Every hour
83
+ * - '0 0 * * *' - Every day at midnight
84
+ */
85
+ // schedule: '0 0 * * *',
86
+
87
+ /**
88
+ * Prevent overlapping job executions
89
+ */
90
+ withoutOverlapping: false,
91
+
92
+ /**
93
+ * Timeout in seconds
94
+ */
95
+ timeout: 60,
96
+
97
+ /**
98
+ * Number of retry attempts
99
+ */
100
+ retries: ${z},
101
+
102
+ /**
103
+ * Delay between retries in seconds
104
+ */
105
+ retryAfter: [60, 120, 300],
106
+ }
107
+
108
+ /**
109
+ * Execute the job
110
+ * @param payload - The job payload data
111
+ */
112
+ public static async handle(payload?: Record<string, unknown>): Promise<{ success: boolean }> {
113
+ try {
114
+ log.info('${v}: Starting job execution')
115
+
116
+ // Add your job logic here.
117
+ console.log('Processing with payload:', payload)
118
+
119
+ log.info('${v}: Job completed successfully')
120
+
121
+ return { success: true }
122
+ }
123
+ catch (error) {
124
+ log.error('${v}: Job failed:', error)
125
+ throw error
126
+ }
127
+ }
128
+ }
129
+ `}export{T as makeJob};
@@ -1,2 +1,94 @@
1
1
  // @bun
2
- import{D as a}from"./chunk-gcjrdkq7.js";import"./chunk-v0hqskdk.js";export{a as makePolicy};
2
+ import{Lb as O}from"./chunk-h3d81wrg.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
+ import { BasePolicy } from '@stacksjs/auth'
4
+
5
+ type UserModel = _User
6
+
7
+ /**
8
+ * ${q}
9
+ *
10
+ * This policy controls authorization for ${b} model actions.
11
+ *
12
+ * Usage:
13
+ * 1. Register in app/Gates.ts:
14
+ * policies: { '${b}': '${q}' }
15
+ *
16
+ * 2. Use in your code:
17
+ * import { Gate } from '@stacksjs/auth'
18
+ * await Gate.authorize('view', user, ${b.toLowerCase()})
19
+ *
20
+ * 3. Or use the middleware:
21
+ * route.put('/${b.toLowerCase()}s/:${b.toLowerCase()}', 'Update${b}')
22
+ * .middleware('can:update,${b.toLowerCase()}')
23
+ */
24
+
25
+ // TODO: Import or define your ${b} type
26
+ interface ${b} {
27
+ id: number
28
+ user_id: number
29
+ // Add your model properties here
30
+ }
31
+
32
+ export default class ${q} extends BasePolicy<${b}> {
33
+ /**
34
+ * Run before any other checks.
35
+ * Return true to allow, false to deny, null to continue.
36
+ */
37
+ before(user: UserModel | null, ability: string): boolean | null {
38
+ // Example: Admins can do anything
39
+ // if (user?.role === 'admin') return true
40
+ return null
41
+ }
42
+
43
+ /**
44
+ * Determine if the user can view any ${b.toLowerCase()}s.
45
+ */
46
+ viewAny(user: UserModel | null): boolean {
47
+ return true
48
+ }
49
+
50
+ /**
51
+ * Determine if the user can view the ${b.toLowerCase()}.
52
+ */
53
+ view(user: UserModel | null, model: ${b}): boolean {
54
+ return true
55
+ }
56
+
57
+ /**
58
+ * Determine if the user can create ${b.toLowerCase()}s.
59
+ */
60
+ create(user: UserModel | null): boolean {
61
+ return user !== null
62
+ }
63
+
64
+ /**
65
+ * Determine if the user can update the ${b.toLowerCase()}.
66
+ */
67
+ update(user: UserModel | null, model: ${b}): boolean {
68
+ return user?.id === model.user_id
69
+ }
70
+
71
+ /**
72
+ * Determine if the user can delete the ${b.toLowerCase()}.
73
+ */
74
+ delete(user: UserModel | null, model: ${b}): boolean {
75
+ return user?.id === model.user_id
76
+ }
77
+
78
+ /**
79
+ * Determine if the user can restore the ${b.toLowerCase()}.
80
+ */
81
+ restore(user: UserModel | null, model: ${b}): boolean {
82
+ return user?.id === model.user_id
83
+ }
84
+
85
+ /**
86
+ * Determine if the user can permanently delete the ${b.toLowerCase()}.
87
+ */
88
+ forceDelete(user: UserModel | null, model: ${b}): boolean {
89
+ return user?.id === model.user_id
90
+ }
91
+ }
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
+ `,K=`${H.trimEnd()}
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")}}export{X as makePolicy};
@@ -1,2 +1,113 @@
1
1
  // @bun
2
- import{E as a}from"./chunk-n057zfgw.js";import"./chunk-v0hqskdk.js";export{a as makeResource};
2
+ import{Lb as G}from"./chunk-h3d81wrg.js";import{log as x}from"@stacksjs/logging";import*as z from"@stacksjs/path";import{doesExist as H,writeFile as I}from"@stacksjs/storage";async function O(q){let j=q.name;if(!j)return x.error("Resource name is required"),!1;let v=j.endsWith("Resource")?j:`${j}Resource`,A=q.model||v.replace("Resource",""),F=q.collection?K(v,A):J(v,A),B=z.appPath("Resources");if(!H(B)){let{mkdirSync:w}=await import("@stacksjs/storage");w(B,{recursive:!0})}let E=z.appPath(`Resources/${v}.ts`);try{return await I(E,F),x.success(`Created resource: ${E}`),!0}catch(w){return x.error(`Failed to create resource: ${w.message}`),!1}}function J(q,j){return`import type { Request } from '@stacksjs/router'
3
+ import { JsonResource } from '@stacksjs/api'
4
+
5
+ /**
6
+ * ${q}
7
+ *
8
+ * Transforms ${j} model data for API responses.
9
+ *
10
+ * @example
11
+ * // Single resource
12
+ * return new ${q}(${j.toLowerCase()}).toResponse()
13
+ *
14
+ * // Collection
15
+ * return ${q}.collection(${j.toLowerCase()}s).toResponse()
16
+ *
17
+ * // With additional data
18
+ * return new ${q}(${j.toLowerCase()})
19
+ * .withAdditional({ message: 'Success' })
20
+ * .toResponse()
21
+ */
22
+
23
+ // TODO: Import or define your ${j} type
24
+ interface ${j} {
25
+ id: number
26
+ name: string
27
+ created_at: Date
28
+ updated_at: Date
29
+ // Add your model properties here
30
+ }
31
+
32
+ export default class ${q} extends JsonResource<${j}> {
33
+ /**
34
+ * Transform the resource into an array.
35
+ */
36
+ toArray(request?: Request): Record<string, any> {
37
+ return {
38
+ id: this.resource.id,
39
+ name: this.resource.name,
40
+
41
+ // Conditional fields
42
+ // secret: this.when(request?.user?.isAdmin, this.resource.secret),
43
+
44
+ // Loaded relationships
45
+ // posts: this.whenLoaded('posts', () =>
46
+ // PostResource.collection(this.resource.posts)
47
+ // ),
48
+
49
+ // Relationship counts
50
+ // posts_count: this.whenCounted('posts'),
51
+
52
+ // Timestamps
53
+ created_at: this.resource.created_at,
54
+ updated_at: this.resource.updated_at,
55
+ }
56
+ }
57
+ }
58
+ `}function K(q,j){let v=q.replace("Collection","");return`import type { Request } from '@stacksjs/router'
59
+ import { JsonResource, ResourceCollection } from '@stacksjs/api'
60
+
61
+ /**
62
+ * ${q}
63
+ *
64
+ * Collection resource for ${j} with custom collection behavior.
65
+ *
66
+ * @example
67
+ * return new ${q}(${j.toLowerCase()}s).toResponse()
68
+ */
69
+
70
+ // TODO: Import or define your ${j} type
71
+ interface ${j} {
72
+ id: number
73
+ name: string
74
+ created_at: Date
75
+ updated_at: Date
76
+ }
77
+
78
+ /**
79
+ * Individual resource for the collection
80
+ */
81
+ class ${v} extends JsonResource<${j}> {
82
+ toArray(request?: Request): Record<string, any> {
83
+ return {
84
+ id: this.resource.id,
85
+ name: this.resource.name,
86
+ created_at: this.resource.created_at,
87
+ updated_at: this.resource.updated_at,
88
+ }
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Collection resource with custom behavior
94
+ */
95
+ export default class ${q} extends ResourceCollection<${j}, ${v}> {
96
+ constructor(resources: ${j}[]) {
97
+ super(resources, ${v})
98
+ }
99
+
100
+ /**
101
+ * Add collection-level data to the response
102
+ */
103
+ toResponse(request?: Request): Record<string, any> {
104
+ return {
105
+ ...super.toResponse(request),
106
+ meta: {
107
+ total: this.count(),
108
+ // Add any collection-level metadata here
109
+ },
110
+ }
111
+ }
112
+ }
113
+ `}export{O as makeResource};
package/dist/make.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{$ as w,F as a,G as b,H as c,I as d,J as e,K as f,L as g,M as h,N as i,O as j,P as k,Q as l,R as m,S as n,T as o,U as p,V as q,W as r,X as s,Y as t,Z as u,_ as v,aa as x,ba as y,ca as z,da as A,ea as B}from"./chunk-heh4x32p.js";import"./chunk-w363nwy3.js";import"./chunk-s735m9mg.js";import"./chunk-8kvzjd10.js";import"./chunk-v0hqskdk.js";export{a as setDryRun,v as makeStack,y as makeQueueTable,p as makePage,m as makeNotification,o as makeMail,t as makeLanguage,r as makeFunction,i as makeDatabase,f as makeComponent,z as makeCertificate,e as makeAction,d as make,b as isDryRunActive,c as invoke,k as factory,q as createPage,w as createNotification,A as createModel,x as createMigration,B as createMiddleware,n as createMail,u as createLanguage,s as createFunction,l as createFactory,j as createDatabase,h as createComponent,g as createAction};
2
+ import{A as k,B as l,C as m,D as n,E as o,F as p,G as q,H as r,I as s,J as t,K as u,L as v,M as w,N as x,O as y,P as z,Q as A,R as B,q as a,r as b,s as c,t as d,u as e,v as f,w as g,x as h,y as i,z as j}from"./chunk-c74qv38e.js";import"./chunk-nty6mmx4.js";import"./chunk-s735m9mg.js";import"./chunk-0gadhvn7.js";import"./chunk-h3d81wrg.js";export{a as setDryRun,v as makeStack,y as makeQueueTable,p as makePage,m as makeNotification,o as makeMail,t as makeLanguage,r as makeFunction,i as makeDatabase,f as makeComponent,z as makeCertificate,e as makeAction,d as make,b as isDryRunActive,c as invoke,k as factory,q as createPage,w as createNotification,A as createModel,x as createMigration,B as createMiddleware,n as createMail,u as createLanguage,s as createFunction,l as createFactory,j as createDatabase,h as createComponent,g as createAction};
package/dist/orm/base.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import"../chunk-v0hqskdk.js";var c=void 0;export{c as default};
2
+ import"../chunk-h3d81wrg.js";var c=void 0;export{c as default};
package/dist/release.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import"./chunk-g6k41p49.js";import"./chunk-0wyxyqak.js";import"./chunk-cdk2r2jd.js";import"./chunk-t5j470r2.js";import"./chunk-x0cnhg3z.js";import"./chunk-gcjrdkq7.js";import"./chunk-n057zfgw.js";import"./chunk-heh4x32p.js";import"./chunk-w363nwy3.js";import"./chunk-rft5b6wr.js";import"./chunk-e87s6b8r.js";import"./chunk-acyw294f.js";import"./chunk-ay41a7jn.js";import"./chunk-73y0wp0s.js";import"./chunk-h63c1v89.js";import"./chunk-dxvgx0r7.js";import"./chunk-h10aj7jf.js";import"./chunk-wtnp31q5.js";import"./chunk-s735m9mg.js";import"./chunk-d5mbs5zz.js";import{hb as C}from"./chunk-8kvzjd10.js";import"./chunk-vv4nqhgg.js";import"./chunk-v0hqskdk.js";import{parseOptions as G}from"@stacksjs/cli";import{app as H}from"@stacksjs/config";import{Action as q}from"@stacksjs/enums";import{log as E}from"@stacksjs/logging";import{projectPath as I}from"@stacksjs/path";var J=G()??{},z={};for(let[B,F]of Object.entries(J)){if(B==="--"||B==="_")continue;z[B]=F}var K=z.dryRun===!0||z.dryRun==="true",L=K?[q.GenerateLibraryEntries,q.Bump]:[q.GenerateLibraryEntries,q.LintFix,q.Bump],x=await C(L,{cwd:I(),...z});if(x&&x.isErr)E.error(`Release failed: ${x.error?.message??String(x.error)}`),process.exit(1);E.success(`Successfully released ${H.name}`);
3
+ import"./chunk-0c8sd1t6.js";import"./chunk-cdk2r2jd.js";import"./chunk-n5eqwhck.js";import"./chunk-62gdfav8.js";import"./chunk-78c5n3s2.js";import"./chunk-tpb8jgsk.js";import"./chunk-tsbk5vne.js";import"./chunk-s735m9mg.js";import"./chunk-6bk53y02.js";import{Jb as C}from"./chunk-0gadhvn7.js";import"./chunk-h3d81wrg.js";import{parseOptions as G}from"@stacksjs/cli";import{app as H}from"@stacksjs/config";import{Action as q}from"@stacksjs/enums";import{log as E}from"@stacksjs/logging";import{projectPath as I}from"@stacksjs/path";var J=G()??{},z={};for(let[B,F]of Object.entries(J)){if(B==="--"||B==="_")continue;z[B]=F}var K=z.dryRun===!0||z.dryRun==="true",L=K?[q.GenerateLibraryEntries,q.Bump]:[q.GenerateLibraryEntries,q.LintFix,q.Bump],x=await C(L,{cwd:I(),...z});if(x&&x.isErr)E.error(`Release failed: ${x.error?.message??String(x.error)}`),process.exit(1);E.success(`Successfully released ${H.name}`);
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{gb as o}from"./chunk-8kvzjd10.js";import"./chunk-v0hqskdk.js";export{o as runAction};
2
+ import"./chunk-h3d81wrg.js";export{i as runAction};
@@ -1,2 +1,87 @@
1
1
  // @bun
2
- import{B as a,C as b}from"./chunk-x0cnhg3z.js";import"./chunk-heh4x32p.js";import"./chunk-w363nwy3.js";import"./chunk-s735m9mg.js";import"./chunk-8kvzjd10.js";import"./chunk-v0hqskdk.js";export{b as scaffoldCrud,a as parseFields};
2
+ import{r as x}from"./chunk-c74qv38e.js";import"./chunk-nty6mmx4.js";import"./chunk-s735m9mg.js";import"./chunk-0gadhvn7.js";import"./chunk-h3d81wrg.js";import{italic as I}from"@stacksjs/cli";import{log as W}from"@stacksjs/logging";import{path as Z}from"@stacksjs/path";import{writeTextFile as L}from"@stacksjs/storage";var P={str:"string",string:"string",varchar:"string",text:"text",longtext:"text",int:"number",integer:"number",number:"number",num:"number",bool:"boolean",boolean:"boolean",date:"date",datetime:"date",json:"json"};function U(G){if(!G)return[];let H=G.split(",").map((q)=>q.trim()).filter(Boolean),J=[];for(let q of H){let[K,O="string"]=q.split(":"),Q=K?.trim();if(!Q)continue;let B=P[O.trim().toLowerCase()]??"string";J.push({name:Q,type:B})}return J}function V(G){if(!G)return G;let H=G.toLowerCase();if(H.endsWith("s")||H.endsWith("x")||H.endsWith("z")||H.endsWith("ch")||H.endsWith("sh"))return`${G}es`;if(H.endsWith("y")&&!/[aeiou]y$/.test(H))return`${G.slice(0,-1)}ies`;return`${G}s`}function v(G){return G.replace(/(^|[-_\s])(\w)/g,(H,J,q)=>String(q).toUpperCase())}function X(G){return G.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[-\s]+/g,"_").toLowerCase()}function Y(G){if(G.length===0)return" title: { type: 'string', fillable: true, validation: { rule: schema.string().required() } },";return G.map((H)=>{let J=H.type,q=J==="number"?"schema.number()":J==="boolean"?"schema.boolean()":J==="date"?"schema.date()":J==="json"?"schema.object({})":"schema.string()",K=J==="number"?"number":J==="boolean"?"boolean":J==="date"?"date":J==="json"?"json":"string";return` ${H.name}: { type: '${K}', fillable: true, validation: { rule: ${q} } },`}).join(`
3
+ `)}function _(G){if(G.length===0)return" .addColumn('title', 'varchar(255)', col => col.notNull())";return G.map((H)=>{switch(H.type){case"number":return` .addColumn('${H.name}', 'integer')`;case"boolean":return` .addColumn('${H.name}', 'boolean', col => col.defaultTo(false))`;case"text":return` .addColumn('${H.name}', 'text')`;case"date":return` .addColumn('${H.name}', 'timestamp')`;case"json":return` .addColumn('${H.name}', 'text')`;default:return` .addColumn('${H.name}', 'varchar(255)')`}}).join(`
4
+ `)}function D(G,H,J){let q=v(G);switch(H){case"Index":return`import { Action } from '@stacksjs/actions'
5
+ import ${q} from '~/app/Models/${q}'
6
+
7
+ export default new Action({
8
+ name: '${q}IndexAction',
9
+ description: 'List ${V(q)}',
10
+
11
+ async handle() {
12
+ return await ${q}.all()
13
+ },
14
+ })`;case"Show":return`import { Action } from '@stacksjs/actions'
15
+ import ${q} from '~/app/Models/${q}'
16
+
17
+ export default new Action({
18
+ name: '${q}ShowAction',
19
+ description: 'Show a single ${q}',
20
+
21
+ async handle(request) {
22
+ const id = Number(request.get('id'))
23
+ return await ${q}.findOrFail(id)
24
+ },
25
+ })`;case"Store":{let K=(J.length>0?J:[{name:"title",type:"string"}]).map((O)=>`'${O.name}'`).join(", ");return`import { Action } from '@stacksjs/actions'
26
+ import ${q} from '~/app/Models/${q}'
27
+
28
+ export default new Action({
29
+ name: '${q}StoreAction',
30
+ description: 'Create a new ${q}',
31
+
32
+ async handle(request) {
33
+ const data = request.only([${K}])
34
+ return await ${q}.create(data)
35
+ },
36
+ })`}case"Update":{let K=(J.length>0?J:[{name:"title",type:"string"}]).map((O)=>`'${O.name}'`).join(", ");return`import { Action } from '@stacksjs/actions'
37
+ import ${q} from '~/app/Models/${q}'
38
+
39
+ export default new Action({
40
+ name: '${q}UpdateAction',
41
+ description: 'Update an existing ${q}',
42
+
43
+ async handle(request) {
44
+ const id = Number(request.get('id'))
45
+ const data = request.only([${K}])
46
+ return await ${q}.update(id, data)
47
+ },
48
+ })`}case"Destroy":return`import { Action } from '@stacksjs/actions'
49
+ import ${q} from '~/app/Models/${q}'
50
+
51
+ export default new Action({
52
+ name: '${q}DestroyAction',
53
+ description: 'Delete a ${q}',
54
+
55
+ async handle(request) {
56
+ const id = Number(request.get('id'))
57
+ const deleted = await ${q}.delete(id)
58
+ return { deleted }
59
+ },
60
+ })`}}function E(G,H){return`import { defineModel } from '@stacksjs/orm'
61
+ import { schema } from '@stacksjs/validation'
62
+
63
+ export default defineModel({
64
+ name: '${v(G)}',
65
+ table: '${V(X(G))}',
66
+ attributes: {
67
+ ${Y(H)}
68
+ },
69
+ traits: { useTimestamps: true, useUuid: false },
70
+ } as const)
71
+ `}function N(G,H){return`import type { Database } from '@stacksjs/database'
72
+ import { sql } from '@stacksjs/database'
73
+
74
+ export async function up(db: Database<any>) {
75
+ await db.schema
76
+ .createTable('${V(X(G))}')
77
+ .addColumn('id', 'serial', col => col.primaryKey())
78
+ ${_(H)}
79
+ .addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
80
+ .addColumn('updated_at', 'timestamp')
81
+ .execute()
82
+ }
83
+ `}async function $(G,H){if(x()){let J=H.split(`
84
+ `);W.info(`[dry-run] would write ${G} (${J.length} lines)`),process.stdout.write(`${J.slice(0,60).map((q)=>` ${q}`).join(`
85
+ `)}
86
+
87
+ `);return}await L({path:G,data:H})}async function h(G,H){let J=v(G);if(!J)throw Error("scaffold:crud requires a non-empty resource name");let q=U(H.fields);W.info(`Scaffolding CRUD for ${I(J)} (${q.length||"no"} fields)`),await $(Z.userModelsPath(`${J}.ts`),E(J,q));let O=`${Date.now().toString()}-create-${V(X(G))}-table.ts`;await $(Z.userMigrationsPath(O),N(G,q));for(let Q of["Index","Show","Store","Update","Destroy"])await $(Z.userActionsPath(`${J}${Q}Action.ts`),D(G,Q,q));W.success(`CRUD scaffold complete: model + migration + 5 actions for ${J}`),W.info(`Next: register \`route.resource('${V(X(G))}', '${J}')\` in routes/api.ts`)}export{h as scaffoldCrud,U as parseFields};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import"../chunk-cdk2r2jd.js";import{A as h,t as a,u as b,v as c,w as d,x as e,y as f,z as g}from"../chunk-t5j470r2.js";import"../chunk-v0hqskdk.js";export{e as trustCertificate,c as sslCertificatesExist,g as setupSSL,h as isSSLSetupComplete,a as isDomainInHosts,d as isCertificateTrusted,f as generateCertificates,b as addDomainToHosts};
2
+ import"../chunk-cdk2r2jd.js";import{Fa as a,Ga as b,Ha as c,Ia as d,Ja as e,Ka as f,La as g,Ma as h}from"../chunk-n5eqwhck.js";import"../chunk-h3d81wrg.js";export{e as trustCertificate,c as sslCertificatesExist,g as setupSSL,h as isSSLSetupComplete,a as isDomainInHosts,d as isCertificateTrusted,f as generateCertificates,b as addDomainToHosts};
package/dist/setup/ssl.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{A as h,t as a,u as b,v as c,w as d,x as e,y as f,z as g}from"../chunk-t5j470r2.js";import"../chunk-v0hqskdk.js";export{e as trustCertificate,c as sslCertificatesExist,g as setupSSL,h as isSSLSetupComplete,a as isDomainInHosts,d as isCertificateTrusted,f as generateCertificates,b as addDomainToHosts};
2
+ import{Fa as a,Ga as b,Ha as c,Ia as d,Ja as e,Ka as f,La as g,Ma as h}from"../chunk-n5eqwhck.js";import"../chunk-h3d81wrg.js";export{e as trustCertificate,c as sslCertificatesExist,g as setupSSL,h as isSSLSetupComplete,a as isDomainInHosts,d as isCertificateTrusted,f as generateCertificates,b as addDomainToHosts};
package/dist/stacks.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{q as a,r as b,s as c}from"./chunk-0wyxyqak.js";import"./chunk-v0hqskdk.js";export{b as uninstallStack,c as listStacks,a as installStack};
2
+ import"./chunk-h3d81wrg.js";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}export{c as uninstallStack,i as listStacks,n as installStack};
package/dist/templates.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{fa as a}from"./chunk-w363nwy3.js";import"./chunk-v0hqskdk.js";export{a as CODE_TEMPLATES};
2
+ import{S as a}from"./chunk-nty6mmx4.js";import"./chunk-h3d81wrg.js";export{a as CODE_TEMPLATES};
package/dist/types.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import"./chunk-v0hqskdk.js";import t from"process";import{NpmScript as e}from"@stacksjs/enums";import{log as s}from"@stacksjs/logging";import{ExitCode as i}from"@stacksjs/types";import{runNpmScript as p}from"@stacksjs/utils";async function m(r){let o=await p(e.TypesFix,r);if(o.isErr)s.error("There was an error fixing your types.",o.error),t.exit(i.FatalError);s.success("Types are set")}async function u(r){return await m(r)}export{u as types,m as invoke};
2
+ import"./chunk-h3d81wrg.js";import t from"process";import{NpmScript as e}from"@stacksjs/enums";import{log as s}from"@stacksjs/logging";import{ExitCode as i}from"@stacksjs/types";import{runNpmScript as p}from"@stacksjs/utils";async function m(r){let o=await p(e.TypesFix,r);if(o.isErr)s.error("There was an error fixing your types.",o.error),t.exit(i.FatalError);s.success("Types are set")}async function u(r){return await m(r)}export{u as types,m as invoke};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import"../chunk-v0hqskdk.js";var c=void 0;export{c as default};
2
+ import"../chunk-h3d81wrg.js";var c=void 0;export{c as default};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i,l as j,m as k,n as l,o as m,p as n}from"../chunk-n24m8prb.js";import"../chunk-v0hqskdk.js";export{g as writeSyncedVersion,e as writeChannel,m as snapshotTree,h as shouldShortCircuit,i as resolveUpgradeMessage,a as resolveUpgradeContext,j as resolveSuccessMessage,c as readVersion,f as readSyncedVersion,d as readChannel,n as diffSnapshots,l as detectLocalStacks,b as buildTemplateString,k as MANAGED_PATHS};
2
+ import{c as a,d as b,e as c,f as d,g as e,h as f,i as g,j as h,k as i,l as j,m as k,n as l,o as m,p as n}from"../chunk-n24m8prb.js";import"../chunk-h3d81wrg.js";export{g as writeSyncedVersion,e as writeChannel,m as snapshotTree,h as shouldShortCircuit,i as resolveUpgradeMessage,a as resolveUpgradeContext,j as resolveSuccessMessage,c as readVersion,f as readSyncedVersion,d as readChannel,n as diffSnapshots,l as detectLocalStacks,b as buildTemplateString,k as MANAGED_PATHS};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{c as R,d as x,e as w,f as S,g as u,h as y,i as h,j as p,k as g,l as d,m as D,n as l,o as H,p as m}from"../chunk-n24m8prb.js";import{qb as j}from"../chunk-v0hqskdk.js";import{copyFileSync as i,cpSync as a,existsSync as B,mkdirSync as f,readFileSync as e,rmSync as qq}from"fs";import{dirname as zq,join as U}from"path";import I from"process";import{parseOptions as Kq}from"@stacksjs/cli";import{downloadTemplate as n}from"@stacksjs/gitit";import{path as N}from"@stacksjs/path";import{ExitCode as C}from"@stacksjs/types";var Y=Kq(),O=N.projectPath();if(!B(N.projectPath("storage/framework/core"))){let{upgradeStacksPackages:q}=await import("./packages.js");await q(O,{version:Y.version,canary:Y.canary,stable:Y.stable,force:Y.force,dryRun:Y.dryRun,noPostinstall:Y.noPostinstall??Y.postinstall===!1})}var c=U(O,".stacks-channel"),s=U(O,".stacks-version"),A=S(c),$=R(Y,A),r=N.projectPath("storage/framework/core/buddy/package.json"),Qq=w(r),Wq=Y.from?N.projectPath(Y.from):null,_=Wq??l(O),E=!!_;console.log(g($,A,!!Y.stable));console.log(E?` source: local checkout at ${_}`:` source: github:stacksjs/stacks#${$.ref}`);if(!Y.force){let q=await Jq(O);if(q.length>0){console.warn(`
2
+ import{c as R,d as x,e as w,f as S,g as u,h as y,i as h,j as p,k as g,l as d,m as D,n as l,o as H,p as m}from"../chunk-n24m8prb.js";import{Lb as j}from"../chunk-h3d81wrg.js";import{copyFileSync as i,cpSync as a,existsSync as B,mkdirSync as f,readFileSync as e,rmSync as qq}from"fs";import{dirname as zq,join as U}from"path";import I from"process";import{parseOptions as Kq}from"@stacksjs/cli";import{downloadTemplate as n}from"@stacksjs/gitit";import{path as N}from"@stacksjs/path";import{ExitCode as C}from"@stacksjs/types";var Y=Kq(),O=N.projectPath();if(!B(N.projectPath("storage/framework/core"))){let{upgradeStacksPackages:q}=await import("./packages.js");await q(O,{version:Y.version,canary:Y.canary,stable:Y.stable,force:Y.force,dryRun:Y.dryRun,noPostinstall:Y.noPostinstall??Y.postinstall===!1})}var c=U(O,".stacks-channel"),s=U(O,".stacks-version"),A=S(c),$=R(Y,A),r=N.projectPath("storage/framework/core/buddy/package.json"),Qq=w(r),Wq=Y.from?N.projectPath(Y.from):null,_=Wq??l(O),E=!!_;console.log(g($,A,!!Y.stable));console.log(E?` source: local checkout at ${_}`:` source: github:stacksjs/stacks#${$.ref}`);if(!Y.force){let q=await Jq(O);if(q.length>0){console.warn(`
3
3
  \u26A0 The following framework-managed paths have uncommitted changes:`);for(let z of q)console.warn(` - ${z}`);console.warn(`
4
4
  Aborting to avoid clobbering your edits.`),console.warn(` Re-run with --force to overwrite, or commit / stash the changes first.
5
5
  `),I.exit(C.FatalError)}}var G=null;if(!Y.force&&!$.targetVersion){G=await t($,E,_);let q=y(s);if(p({force:!!Y.force,targetVersion:$.targetVersion,remoteSha:G,synced:q,channel:$.channel}))console.log(`\u2714 Already on the latest ${$.channel} (${G.slice(0,7)}).`),I.exit(C.Success)}var b=N.frameworkPath("core/actions/src/upgrade/framework.ts"),k=await o(b),V={added:0,changed:0,removed:0,unchanged:0},v=[];try{for(let q of D){let z=U(O,q.localPath),K=q.isFile?await T(z):await H(z,q.skip);if(E&&_)await Bq(_,q,z);else{if(q.isFile)continue;await Iq($.ref,q,z,!!Y.force)}let Q=q.isFile?await T(z):await H(z,q.skip),W=m(K,Q);V.added+=W.added,V.changed+=W.changed,V.removed+=W.removed,V.unchanged+=W.unchanged,v.push({managed:q,summary:W})}if(!E)await Uq($.ref)}catch(q){console.error("\u2718 Failed to upgrade Stacks framework:",q?.message||q),I.exit(C.FatalError)}var Xq=w(r),P=await o(b),Yq=I.argv.includes("--__restarted");if(k!==0n&&P!==0n&&k!==P&&!Yq){console.log(`Upgrade pulled a newer version of the upgrade action \u2014 re-running once to pick up new sync paths and hooks.
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import"../chunk-s735m9mg.js";import{gb as r}from"../chunk-8kvzjd10.js";import"../chunk-v0hqskdk.js";import e from"process";import{parseArgs as o}from"@stacksjs/cli";import{Action as i}from"@stacksjs/enums";import{ExitCode as t}from"@stacksjs/types";var a=o();if(a?.framework||a?.all)await r(i.UpgradeFramework,a);if(a?.dependencies||a?.all)await r(i.UpgradeDeps,a);if(a?.bun||a?.all)await r(i.UpgradeBun,a);if(a?.shell||a?.all)await r(i.UpgradeShell,a);if(a?.binary||a?.all)await r(i.UpgradeBinary,a);e.exit(t.Success);
2
+ import"../chunk-s735m9mg.js";import{Ib as r}from"../chunk-0gadhvn7.js";import"../chunk-h3d81wrg.js";import e from"process";import{parseArgs as o}from"@stacksjs/cli";import{Action as i}from"@stacksjs/enums";import{ExitCode as t}from"@stacksjs/types";var a=o();if(a?.framework||a?.all)await r(i.UpgradeFramework,a);if(a?.dependencies||a?.all)await r(i.UpgradeDeps,a);if(a?.bun||a?.all)await r(i.UpgradeBun,a);if(a?.shell||a?.all)await r(i.UpgradeShell,a);if(a?.binary||a?.all)await r(i.UpgradeBinary,a);e.exit(t.Success);
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import"../chunk-v0hqskdk.js";import{existsSync as U,readFileSync as V,writeFileSync as W}from"fs";import{join as X}from"path";import M from"process";import{runCommand as Y}from"@stacksjs/cli";async function Z(A){let z=await fetch("https://registry.npmjs.org/stacks").catch(()=>null);if(!z||!z.ok)throw Error("Could not reach the npm registry to resolve the target `stacks` version.");let I=await z.json(),J=I["dist-tags"]??{},G=I.versions??{},q;if(A.version){if(!G[A.version])throw Error(`stacks@${A.version} was not found on the npm registry.`);q=A.version}else{let H=A.canary?"canary":"latest",b=J[H];if(!b)throw Error(`The \`${H}\` dist-tag is not published for \`stacks\`.`);q=b}let E=new Set(Object.keys(G[q]?.dependencies??{}));return{version:q,coreDeps:E}}function _(A,z,I){let J=[],G=(q)=>q==="stacks"||q.startsWith("@stacksjs/")&&I.has(q);for(let q of["dependencies","devDependencies"]){let E=A[q];if(!E)continue;for(let[H,b]of Object.entries(E)){if(!G(H))continue;let O=`${/^[\^~]/.test(b)?b[0]:/^\d/.test(b)?"":"^"}${z}`;if(b!==O)J.push({name:H,from:b,to:O}),E[H]=O}}return J}async function T(A,z){let I=X(A,"package.json");if(!U(I))console.error("No package.json found \u2014 nothing to upgrade."),M.exit(1);let J=V(I,"utf-8"),G=JSON.parse(J),q=G.dependencies?.stacks??G.devDependencies?.stacks,{version:E,coreDeps:H}=await Z(z).catch((K)=>{console.error(`\u2717 ${K.message}`),M.exit(1)});if(console.log(`
2
+ import"../chunk-h3d81wrg.js";import{existsSync as U,readFileSync as V,writeFileSync as W}from"fs";import{join as X}from"path";import M from"process";import{runCommand as Y}from"@stacksjs/cli";async function Z(A){let z=await fetch("https://registry.npmjs.org/stacks").catch(()=>null);if(!z||!z.ok)throw Error("Could not reach the npm registry to resolve the target `stacks` version.");let I=await z.json(),J=I["dist-tags"]??{},G=I.versions??{},q;if(A.version){if(!G[A.version])throw Error(`stacks@${A.version} was not found on the npm registry.`);q=A.version}else{let H=A.canary?"canary":"latest",b=J[H];if(!b)throw Error(`The \`${H}\` dist-tag is not published for \`stacks\`.`);q=b}let E=new Set(Object.keys(G[q]?.dependencies??{}));return{version:q,coreDeps:E}}function _(A,z,I){let J=[],G=(q)=>q==="stacks"||q.startsWith("@stacksjs/")&&I.has(q);for(let q of["dependencies","devDependencies"]){let E=A[q];if(!E)continue;for(let[H,b]of Object.entries(E)){if(!G(H))continue;let O=`${/^[\^~]/.test(b)?b[0]:/^\d/.test(b)?"":"^"}${z}`;if(b!==O)J.push({name:H,from:b,to:O}),E[H]=O}}return J}async function T(A,z){let I=X(A,"package.json");if(!U(I))console.error("No package.json found \u2014 nothing to upgrade."),M.exit(1);let J=V(I,"utf-8"),G=JSON.parse(J),q=G.dependencies?.stacks??G.devDependencies?.stacks,{version:E,coreDeps:H}=await Z(z).catch((K)=>{console.error(`\u2717 ${K.message}`),M.exit(1)});if(console.log(`
3
3
  Upgrading the Stacks framework${z.canary?" (canary)":""} \u2192 ${E}`),q)console.log(` current \`stacks\` constraint: ${q}
4
4
  `);let b=_(G,E,H);if(b.length===0&&!z.force)console.log(`\u2714 Already up to date \u2014 every framework dependency matches the target.
5
5
  `),M.exit(0);if(b.length>0){console.log(" The following dependencies will be updated:");let K=Math.max(...b.map((N)=>N.name.length));for(let N of b)console.log(` ${N.name.padEnd(K)} ${N.from} \u2192 ${N.to}`);console.log("")}if(z.dryRun)console.log(` --dry-run: no files were written and nothing was installed.
package/dist/upgrade.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import"./chunk-v0hqskdk.js";import{readFileSync as K}from"fs";import A from"process";import{intro as L,outro as B,runCommand as I}from"@stacksjs/cli";import{NpmScript as M}from"@stacksjs/enums";import{log as G}from"@stacksjs/logging";import{projectPath as J}from"@stacksjs/path";import*as w from"@stacksjs/storage";import{ExitCode as H}from"@stacksjs/types";var{version:Q}=JSON.parse(K(new URL("../package.json",import.meta.url),"utf8"));function _(b){try{console.log("checkForUncommittedChanges",b)}catch(q){console.error(q)}}async function $(b){let z=J("updates");if(w.doesFolderExist(z))await w.deleteFolder(z);G.info("Downloading framework updates..."),await I("giget stacks updates",b),G.success(`Your framework updated correctly to version: v${Q}`)}async function v(){let b=await L("buddy upgrade:dependencies"),q=await I(M.UpgradeDependencies,{cwd:J()});if(q.isErr)await B("While running the upgrade:dependencies command, there was an issue",{startTime:b,useSeconds:!0},q.error),A.exit(H.FatalError);await B("Freshly updated your dependencies.",{startTime:b,useSeconds:!0}),A.exit(H.Success)}export{v as updateDependencies,$ as downloadFrameworkUpdate,_ as checkForUncommittedChanges};
2
+ import"./chunk-h3d81wrg.js";import{readFileSync as K}from"fs";import A from"process";import{intro as L,outro as B,runCommand as I}from"@stacksjs/cli";import{NpmScript as M}from"@stacksjs/enums";import{log as G}from"@stacksjs/logging";import{projectPath as J}from"@stacksjs/path";import*as w from"@stacksjs/storage";import{ExitCode as H}from"@stacksjs/types";var{version:Q}=JSON.parse(K(new URL("../package.json",import.meta.url),"utf8"));function _(b){try{console.log("checkForUncommittedChanges",b)}catch(q){console.error(q)}}async function $(b){let z=J("updates");if(w.doesFolderExist(z))await w.deleteFolder(z);G.info("Downloading framework updates..."),await I("giget stacks updates",b),G.success(`Your framework updated correctly to version: v${Q}`)}async function v(){let b=await L("buddy upgrade:dependencies"),q=await I(M.UpgradeDependencies,{cwd:J()});if(q.isErr)await B("While running the upgrade:dependencies command, there was an issue",{startTime:b,useSeconds:!0},q.error),A.exit(H.FatalError);await B("Freshly updated your dependencies.",{startTime:b,useSeconds:!0}),A.exit(H.Success)}export{v as updateDependencies,$ as downloadFrameworkUpdate,_ as checkForUncommittedChanges};
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@stacksjs/actions",
3
3
  "type": "module",
4
- "version": "0.70.84",
4
+ "sideEffects": false,
5
+ "version": "0.70.85",
5
6
  "description": "The Stacks actions.",
6
7
  "author": "Chris Breuer",
7
8
  "contributors": [
@@ -68,23 +69,23 @@
68
69
  "@stacksjs/ts-md": "^0.1.1"
69
70
  },
70
71
  "devDependencies": {
71
- "@stacksjs/api": "0.70.84",
72
- "@stacksjs/cli": "0.70.84",
73
- "@stacksjs/config": "0.70.84",
74
- "@stacksjs/database": "0.70.84",
72
+ "@stacksjs/api": "0.70.85",
73
+ "@stacksjs/cli": "0.70.85",
74
+ "@stacksjs/config": "0.70.85",
75
+ "@stacksjs/database": "0.70.85",
75
76
  "@stacksjs/tlsx": "^0.13.2",
76
77
  "better-dx": "^0.2.16",
77
- "@stacksjs/dns": "0.70.84",
78
- "@stacksjs/enums": "0.70.84",
79
- "@stacksjs/env": "0.70.84",
80
- "@stacksjs/error-handling": "0.70.84",
81
- "@stacksjs/logging": "0.70.84",
82
- "@stacksjs/path": "0.70.84",
83
- "@stacksjs/security": "0.70.84",
84
- "@stacksjs/storage": "0.70.84",
85
- "@stacksjs/strings": "0.70.84",
86
- "@stacksjs/utils": "0.70.84",
87
- "@stacksjs/validation": "0.70.84"
78
+ "@stacksjs/dns": "0.70.85",
79
+ "@stacksjs/enums": "0.70.85",
80
+ "@stacksjs/env": "0.70.85",
81
+ "@stacksjs/error-handling": "0.70.85",
82
+ "@stacksjs/logging": "0.70.85",
83
+ "@stacksjs/path": "0.70.85",
84
+ "@stacksjs/security": "0.70.85",
85
+ "@stacksjs/storage": "0.70.85",
86
+ "@stacksjs/strings": "0.70.85",
87
+ "@stacksjs/utils": "0.70.85",
88
+ "@stacksjs/validation": "0.70.85"
88
89
  },
89
90
  "peerDependencies": {
90
91
  "pickier": "^0.1.28"
@@ -1,3 +0,0 @@
1
- // @bun
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 q,c as r,i as s};