@stacksjs/orm 0.72.16 → 0.72.18

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 (102) hide show
  1. package/dist/index.d.ts +97 -97
  2. package/dist/index.js +7 -7
  3. package/dist/models/Activity.ts +95 -0
  4. package/dist/models/AnalyticsEvent.ts +70 -0
  5. package/dist/models/Automation.ts +23 -0
  6. package/dist/models/AutomationRun.ts +26 -0
  7. package/dist/models/Board.ts +104 -0
  8. package/dist/models/BoardColumn.ts +88 -0
  9. package/dist/models/Campaign.ts +321 -0
  10. package/dist/models/CampaignSend.ts +191 -0
  11. package/dist/models/CampaignVariant.ts +25 -0
  12. package/dist/models/Card.ts +118 -0
  13. package/dist/models/CardComment.ts +68 -0
  14. package/dist/models/Comment.ts +109 -0
  15. package/dist/models/CommunicationSuppression.ts +22 -0
  16. package/dist/models/ConsentEvent.ts +30 -0
  17. package/dist/models/Content/Author.ts +109 -0
  18. package/dist/models/Content/Menu.ts +56 -0
  19. package/dist/models/Content/MenuItem.ts +91 -0
  20. package/dist/models/Content/Page.ts +205 -0
  21. package/dist/models/Content/PageRevision.ts +86 -0
  22. package/dist/models/Content/Post.ts +230 -0
  23. package/dist/models/Content/Redirect.ts +80 -0
  24. package/dist/models/Deployment.ts +117 -0
  25. package/dist/models/EmailIdempotency.ts +64 -0
  26. package/dist/models/EmailList.ts +134 -0
  27. package/dist/models/EmailListSubscriber.ts +91 -0
  28. package/dist/models/EmailSuppression.ts +52 -0
  29. package/dist/models/EmailWebhookEvent.ts +51 -0
  30. package/dist/models/Error.ts +77 -0
  31. package/dist/models/FailedJob.ts +84 -0
  32. package/dist/models/Forms/Form.ts +91 -0
  33. package/dist/models/Forms/FormField.ts +127 -0
  34. package/dist/models/Forms/FormSubmission.ts +114 -0
  35. package/dist/models/Job.ts +69 -0
  36. package/dist/models/Label.ts +67 -0
  37. package/dist/models/Log.ts +134 -0
  38. package/dist/models/MagicLinkToken.ts +97 -0
  39. package/dist/models/MailPreference.ts +213 -0
  40. package/dist/models/Notification.ts +68 -0
  41. package/dist/models/NotificationDelivery.ts +102 -0
  42. package/dist/models/PaymentMethod.ts +98 -0
  43. package/dist/models/PaymentProduct.ts +91 -0
  44. package/dist/models/PaymentTransaction.ts +78 -0
  45. package/dist/models/QueryLog.ts +182 -0
  46. package/dist/models/README.md +31 -0
  47. package/dist/models/Release.ts +90 -0
  48. package/dist/models/Request.ts +133 -0
  49. package/dist/models/SenderDomain.ts +22 -0
  50. package/dist/models/Site.ts +112 -0
  51. package/dist/models/SiteDomain.ts +74 -0
  52. package/dist/models/SmsOptOut.ts +65 -0
  53. package/dist/models/SocialAccount.ts +70 -0
  54. package/dist/models/SocialPost.ts +144 -0
  55. package/dist/models/Subscriber.ts +89 -0
  56. package/dist/models/SubscriberEmail.ts +55 -0
  57. package/dist/models/Subscription.ts +153 -0
  58. package/dist/models/Tag.ts +105 -0
  59. package/dist/models/Team.ts +75 -0
  60. package/dist/models/TeamInvitation.ts +159 -0
  61. package/dist/models/TeamMember.ts +88 -0
  62. package/dist/models/UsageEvent.ts +24 -0
  63. package/dist/models/User.ts +142 -0
  64. package/dist/models/commerce/Auction.ts +173 -0
  65. package/dist/models/commerce/AuctionItem.ts +204 -0
  66. package/dist/models/commerce/Bid.ts +129 -0
  67. package/dist/models/commerce/Cart.ts +140 -0
  68. package/dist/models/commerce/CartItem.ts +138 -0
  69. package/dist/models/commerce/Category.ts +125 -0
  70. package/dist/models/commerce/Coupon.ts +186 -0
  71. package/dist/models/commerce/Customer.ts +132 -0
  72. package/dist/models/commerce/DeliveryRoute.ts +127 -0
  73. package/dist/models/commerce/DeliveryStop.ts +166 -0
  74. package/dist/models/commerce/DigitalDelivery.ts +106 -0
  75. package/dist/models/commerce/Driver.ts +168 -0
  76. package/dist/models/commerce/DriverPing.ts +103 -0
  77. package/dist/models/commerce/GiftCard.ts +195 -0
  78. package/dist/models/commerce/LicenseKey.ts +89 -0
  79. package/dist/models/commerce/LoyaltyPoint.ts +108 -0
  80. package/dist/models/commerce/LoyaltyReward.ts +129 -0
  81. package/dist/models/commerce/Manufacturer.ts +90 -0
  82. package/dist/models/commerce/Order.ts +198 -0
  83. package/dist/models/commerce/OrderIdempotency.ts +34 -0
  84. package/dist/models/commerce/OrderItem.ts +51 -0
  85. package/dist/models/commerce/Payment.ts +182 -0
  86. package/dist/models/commerce/Pledge.ts +112 -0
  87. package/dist/models/commerce/PrintDevice.ts +120 -0
  88. package/dist/models/commerce/Product.ts +153 -0
  89. package/dist/models/commerce/ProductUnit.ts +113 -0
  90. package/dist/models/commerce/ProductVariant.ts +111 -0
  91. package/dist/models/commerce/Receipt.ts +144 -0
  92. package/dist/models/commerce/Review.ts +171 -0
  93. package/dist/models/commerce/ShippingMethod.ts +102 -0
  94. package/dist/models/commerce/ShippingRate.ts +79 -0
  95. package/dist/models/commerce/ShippingZone.ts +116 -0
  96. package/dist/models/commerce/TaxRate.ts +167 -0
  97. package/dist/models/commerce/Transaction.ts +127 -0
  98. package/dist/models/commerce/WaitlistProduct.ts +151 -0
  99. package/dist/models/commerce/WaitlistRestaurant.ts +189 -0
  100. package/dist/models/realtime/Websocket.ts +78 -0
  101. package/dist/password-policy.ts +46 -0
  102. package/package.json +4 -4
@@ -0,0 +1,95 @@
1
+ import { defineModel } from '@stacksjs/orm'
2
+ import { schema } from '@stacksjs/validation'
3
+
4
+ export default defineModel({
5
+ name: 'Activity',
6
+ table: 'activities',
7
+ primaryKey: 'id',
8
+ autoIncrement: true,
9
+
10
+ traits: {
11
+ useUuid: true,
12
+ useTimestamps: true,
13
+ useSeeder: {
14
+ count: 50,
15
+ },
16
+ useApi: {
17
+ uri: 'activities',
18
+ routes: ['index', 'show'],
19
+ middleware: ['auth'],
20
+ },
21
+ },
22
+
23
+ belongsTo: ['User'],
24
+
25
+ attributes: {
26
+ type: {
27
+ required: true,
28
+ fillable: true,
29
+ validation: {
30
+ rule: schema.string().max(50),
31
+ },
32
+ factory: faker => faker.helpers.arrayElement([
33
+ 'user.created', 'user.updated', 'user.deleted',
34
+ 'order.created', 'order.completed', 'order.cancelled',
35
+ 'product.created', 'product.updated', 'product.deleted',
36
+ 'post.published', 'comment.approved', 'login.success',
37
+ 'login.failed', 'subscription.renewed', 'payment.received',
38
+ ]),
39
+ },
40
+
41
+ description: {
42
+ required: true,
43
+ fillable: true,
44
+ validation: {
45
+ rule: schema.string().max(500),
46
+ },
47
+ factory: faker => faker.lorem.sentence(),
48
+ },
49
+
50
+ subjectType: {
51
+ required: false,
52
+ fillable: true,
53
+ validation: {
54
+ rule: schema.string().max(100),
55
+ },
56
+ factory: faker => faker.helpers.arrayElement(['User', 'Order', 'Product', 'Post', 'Comment', 'Subscription']),
57
+ },
58
+
59
+ subjectId: {
60
+ required: false,
61
+ fillable: true,
62
+ validation: {
63
+ rule: schema.number(),
64
+ },
65
+ factory: faker => faker.number.int({ min: 1, max: 100 }),
66
+ },
67
+
68
+ causer: {
69
+ required: false,
70
+ fillable: true,
71
+ validation: {
72
+ rule: schema.string().max(100),
73
+ },
74
+ factory: faker => faker.person.fullName(),
75
+ },
76
+
77
+ properties: {
78
+ required: false,
79
+ fillable: true,
80
+ validation: {
81
+ rule: schema.string(),
82
+ },
83
+ factory: () => JSON.stringify({ ip: '192.168.1.1', browser: 'Chrome' }),
84
+ },
85
+
86
+ ipAddress: {
87
+ required: false,
88
+ fillable: true,
89
+ validation: {
90
+ rule: schema.string().max(45),
91
+ },
92
+ factory: faker => faker.internet.ip(),
93
+ },
94
+ },
95
+ } as const)
@@ -0,0 +1,70 @@
1
+ import { defineModel } from '@stacksjs/orm'
2
+ import { schema } from '@stacksjs/validation'
3
+
4
+ export default defineModel({
5
+ name: 'AnalyticsEvent',
6
+ table: 'analytics_events',
7
+ primaryKey: 'id',
8
+ autoIncrement: true,
9
+
10
+ traits: {
11
+ useUuid: true,
12
+ useTimestamps: true,
13
+ useApi: {
14
+ uri: 'analytics-events',
15
+ routes: ['index', 'store', 'show', 'destroy'],
16
+ middleware: ['auth'],
17
+ },
18
+ observe: true,
19
+ },
20
+
21
+ attributes: {
22
+ name: {
23
+ required: true,
24
+ fillable: true,
25
+ validation: {
26
+ rule: schema.string().required().max(100),
27
+ },
28
+ },
29
+
30
+ category: {
31
+ required: true,
32
+ fillable: true,
33
+ default: 'custom',
34
+ validation: {
35
+ rule: schema.string().required().max(50),
36
+ },
37
+ },
38
+
39
+ path: {
40
+ fillable: true,
41
+ validation: {
42
+ rule: schema.string().max(2048),
43
+ },
44
+ },
45
+
46
+ value: {
47
+ fillable: true,
48
+ default: 0,
49
+ validation: {
50
+ rule: schema.number().min(0),
51
+ },
52
+ },
53
+
54
+ currency: {
55
+ required: true,
56
+ fillable: true,
57
+ default: 'USD',
58
+ validation: {
59
+ rule: schema.string().required().max(3),
60
+ },
61
+ },
62
+
63
+ properties: {
64
+ fillable: true,
65
+ validation: {
66
+ rule: schema.string(),
67
+ },
68
+ },
69
+ },
70
+ } as const)
@@ -0,0 +1,23 @@
1
+ import { defineModel } from '@stacksjs/orm'
2
+ import { schema } from '@stacksjs/validation'
3
+
4
+ export default defineModel({
5
+ name: 'Automation',
6
+ table: 'automations',
7
+ belongsTo: ['Team'],
8
+ hasMany: ['AutomationRun'],
9
+ traits: {
10
+ useUuid: true,
11
+ useTimestamps: true,
12
+ useApi: { uri: 'automations', routes: ['index', 'store', 'show', 'update', 'destroy'], middleware: ['auth', 'team'] },
13
+ observe: true,
14
+ },
15
+ attributes: {
16
+ name: { required: true, fillable: true, validation: { rule: schema.string().max(255) }, factory: faker => faker.lorem.words(3) },
17
+ status: { required: true, fillable: true, default: 'draft', validation: { rule: schema.enum(['draft', 'active', 'paused', 'archived']) }, factory: () => 'draft' },
18
+ version: { required: true, fillable: true, default: 1, validation: { rule: schema.number().min(1) }, factory: () => 1 },
19
+ trigger: { required: true, fillable: true, validation: { rule: schema.json() }, factory: () => JSON.stringify({ type: 'subscriber_joined' }) },
20
+ graph: { required: true, fillable: true, validation: { rule: schema.json() }, factory: () => JSON.stringify({ nodes: [], edges: [] }) },
21
+ publishedAt: { required: false, fillable: true, validation: { rule: schema.timestamp() }, factory: () => null },
22
+ },
23
+ } as const)
@@ -0,0 +1,26 @@
1
+ import { defineModel } from '@stacksjs/orm'
2
+ import { schema } from '@stacksjs/validation'
3
+
4
+ export default defineModel({
5
+ name: 'AutomationRun',
6
+ table: 'automation_runs',
7
+ belongsTo: ['Team', 'Automation'],
8
+ traits: {
9
+ useUuid: true,
10
+ useTimestamps: true,
11
+ useApi: { uri: 'automation-runs', routes: ['index', 'show'], middleware: ['auth', 'team'] },
12
+ },
13
+ indexes: [{ name: 'automation_runs_idempotency_unique', columns: ['idempotency_key'], unique: true }],
14
+ attributes: {
15
+ status: { required: true, fillable: true, default: 'queued', validation: { rule: schema.enum(['queued', 'running', 'waiting', 'completed', 'failed', 'cancelled']) }, factory: () => 'queued' },
16
+ currentNodeId: { required: false, fillable: true, validation: { rule: schema.string().max(100) }, factory: () => null },
17
+ version: { required: true, fillable: true, default: 1, validation: { rule: schema.number().min(1) }, factory: () => 1 },
18
+ subjectType: { required: false, fillable: true, validation: { rule: schema.string().max(80) }, factory: () => 'contact' },
19
+ subjectId: { required: false, fillable: true, validation: { rule: schema.string().max(120) }, factory: () => null },
20
+ context: { required: true, fillable: true, validation: { rule: schema.json() }, factory: () => JSON.stringify({}) },
21
+ idempotencyKey: { required: true, fillable: true, validation: { rule: schema.string().max(255) }, factory: faker => faker.string.uuid() },
22
+ startedAt: { required: false, fillable: true, validation: { rule: schema.timestamp() }, factory: () => null },
23
+ finishedAt: { required: false, fillable: true, validation: { rule: schema.timestamp() }, factory: () => null },
24
+ error: { required: false, fillable: true, validation: { rule: schema.string() }, factory: () => null },
25
+ },
26
+ } as const)
@@ -0,0 +1,104 @@
1
+ import { defineModel } from '@stacksjs/orm'
2
+ import { schema } from '@stacksjs/validation'
3
+
4
+ /**
5
+ * Kanban board (stacksjs/stacks#1846).
6
+ *
7
+ * A board owns columns, columns own cards, cards carry labels +
8
+ * assignees. The full hierarchy is exposed under the dashboard's
9
+ * Management section as a dev-mode surface — admins and devs see
10
+ * project-management boards; clients don't.
11
+ *
12
+ * Phase 1 scope: this model + read-only API + an index page listing
13
+ * boards. Phase 2 adds the drag-and-drop kanban view + write API.
14
+ */
15
+ export default defineModel({
16
+ name: 'Board',
17
+ table: 'boards',
18
+ primaryKey: 'id',
19
+ autoIncrement: true,
20
+
21
+ traits: {
22
+ useUuid: true,
23
+ useTimestamps: true,
24
+ useSearch: {
25
+ displayable: ['id', 'name', 'description', 'createdAt'],
26
+ searchable: ['name', 'description'],
27
+ sortable: ['name', 'createdAt', 'updatedAt', 'position'],
28
+ filterable: ['archived'],
29
+ },
30
+
31
+ useSeeder: { count: 0 },
32
+
33
+ useApi: {
34
+ uri: 'boards',
35
+ routes: ['index', 'store', 'show', 'update', 'destroy'],
36
+ middleware: ['auth'],
37
+ },
38
+ },
39
+
40
+ hasMany: ['BoardColumn', 'Label'],
41
+
42
+ attributes: {
43
+ name: {
44
+ order: 1,
45
+ fillable: true,
46
+ validation: {
47
+ rule: schema.string().required().min(1).max(120),
48
+ },
49
+ factory: faker => faker.commerce.productName(),
50
+ },
51
+
52
+ description: {
53
+ order: 2,
54
+ fillable: true,
55
+ validation: {
56
+ rule: schema.string().max(2000),
57
+ },
58
+ factory: faker => faker.lorem.sentence(),
59
+ },
60
+
61
+ icon: {
62
+ order: 3,
63
+ fillable: true,
64
+ // SF Symbol name for the native sidebar; web sidebar falls back to a generic table icon.
65
+ validation: { rule: schema.string().max(80) },
66
+ factory: () => 'rectangle.stack.fill',
67
+ },
68
+
69
+ color: {
70
+ order: 4,
71
+ fillable: true,
72
+ // Tailwind-style hue token: stx-blue, stx-violet, etc. Free-form
73
+ // string; the UI maps unknown values to the default theme.
74
+ validation: { rule: schema.string().max(40) },
75
+ factory: faker => faker.helpers.arrayElement(['violet', 'blue', 'emerald', 'amber', 'rose']),
76
+ },
77
+
78
+ position: {
79
+ order: 5,
80
+ fillable: true,
81
+ // Sort order in the "Boards" index. Lower = appears first.
82
+ // Reflowed in bulk on reorder; defaults to "append at end" via
83
+ // server-side max() + 1 on create.
84
+ validation: { rule: schema.number().min(0) },
85
+ factory: faker => faker.number.int({ min: 0, max: 100 }),
86
+ },
87
+
88
+ archived: {
89
+ order: 6,
90
+ fillable: true,
91
+ // Soft-archived boards stay in the DB but drop out of the
92
+ // dashboard's default list view. They're recoverable via the
93
+ // /kanban/archived sub-page (Phase 3).
94
+ validation: { rule: schema.boolean() },
95
+ factory: () => false,
96
+ },
97
+ },
98
+
99
+ // The kanban surface has a dedicated dashboard page (`/kanban`),
100
+ // not the auto-derived `/models/board` viewer — the sidebar entry is
101
+ // hand-added in `dashboard-utils.ts` / `sidebar.ts` and points at
102
+ // the real page. Hiding the auto-row keeps it from double-listing.
103
+ dashboard: { enabled: false },
104
+ } as const)
@@ -0,0 +1,88 @@
1
+ import { defineModel } from '@stacksjs/orm'
2
+ import { schema } from '@stacksjs/validation'
3
+
4
+ /**
5
+ * Column on a kanban board (stacksjs/stacks#1846).
6
+ *
7
+ * Each board owns an ordered list of columns ("Todo", "In Progress",
8
+ * "Review", "Done", …). Cards live inside columns. Column ordering
9
+ * within a board is driven by the `position` integer — Phase 2's drag
10
+ * handler reorders by setting a new `position` and reflowing siblings.
11
+ *
12
+ * Hidden from the sidebar as a standalone model row (`dashboard.enabled:
13
+ * false`) because columns only make sense inside a board. The dashboard
14
+ * surfaces them indirectly through `/kanban/[boardId]`. Direct ORM
15
+ * viewer access via `/models/board-column` still works for ops.
16
+ */
17
+ export default defineModel({
18
+ name: 'BoardColumn',
19
+ table: 'board_columns',
20
+ primaryKey: 'id',
21
+ autoIncrement: true,
22
+
23
+ traits: {
24
+ useUuid: true,
25
+ useTimestamps: true,
26
+ useSearch: {
27
+ displayable: ['id', 'name', 'boardId', 'position'],
28
+ searchable: ['name'],
29
+ sortable: ['position', 'createdAt'],
30
+ filterable: ['boardId'],
31
+ },
32
+
33
+ useSeeder: { count: 0 },
34
+
35
+ useApi: {
36
+ uri: 'board-columns',
37
+ routes: ['index', 'store', 'show', 'update', 'destroy'],
38
+ middleware: ['auth'],
39
+ },
40
+ },
41
+
42
+ belongsTo: ['Board'],
43
+ hasMany: ['Card'],
44
+
45
+ attributes: {
46
+ boardId: {
47
+ order: 1,
48
+ fillable: true,
49
+ validation: { rule: schema.number().required() },
50
+ factory: () => 1,
51
+ },
52
+
53
+ name: {
54
+ order: 2,
55
+ fillable: true,
56
+ validation: { rule: schema.string().required().min(1).max(80) },
57
+ factory: faker => faker.helpers.arrayElement(['Todo', 'In Progress', 'Review', 'Done']),
58
+ },
59
+
60
+ position: {
61
+ order: 3,
62
+ fillable: true,
63
+ // Sort order within the parent board. Drag-reorder rewrites
64
+ // adjacent rows in a single transaction (Phase 2).
65
+ validation: { rule: schema.number().min(0) },
66
+ factory: faker => faker.number.int({ min: 0, max: 10 }),
67
+ },
68
+
69
+ cardLimit: {
70
+ order: 4,
71
+ fillable: true,
72
+ // WIP limit — nullable. The UI shows a warning badge when a
73
+ // column hits its limit but doesn't reject new cards
74
+ // (Phase 2/3 will decide whether the limit is hard or soft).
75
+ validation: { rule: schema.number().min(0) },
76
+ factory: () => null,
77
+ },
78
+
79
+ color: {
80
+ order: 5,
81
+ fillable: true,
82
+ validation: { rule: schema.string().max(40) },
83
+ factory: faker => faker.helpers.arrayElement(['slate', 'amber', 'blue', 'emerald']),
84
+ },
85
+ },
86
+
87
+ dashboard: { enabled: false },
88
+ } as const)