@contractspec/example.saas-boilerplate 0.0.0-canary-20260113170453

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 (226) hide show
  1. package/.turbo/turbo-build$colon$bundle.log +188 -0
  2. package/.turbo/turbo-build.log +189 -0
  3. package/CHANGELOG.md +440 -0
  4. package/LICENSE +21 -0
  5. package/README.md +155 -0
  6. package/dist/billing/billing.entity.d.ts +61 -0
  7. package/dist/billing/billing.entity.d.ts.map +1 -0
  8. package/dist/billing/billing.entity.js +122 -0
  9. package/dist/billing/billing.entity.js.map +1 -0
  10. package/dist/billing/billing.enum.d.ts +16 -0
  11. package/dist/billing/billing.enum.d.ts.map +1 -0
  12. package/dist/billing/billing.enum.js +27 -0
  13. package/dist/billing/billing.enum.js.map +1 -0
  14. package/dist/billing/billing.event.d.ts +86 -0
  15. package/dist/billing/billing.event.d.ts.map +1 -0
  16. package/dist/billing/billing.event.js +153 -0
  17. package/dist/billing/billing.event.js.map +1 -0
  18. package/dist/billing/billing.handler.d.ts +82 -0
  19. package/dist/billing/billing.handler.d.ts.map +1 -0
  20. package/dist/billing/billing.handler.js +58 -0
  21. package/dist/billing/billing.handler.js.map +1 -0
  22. package/dist/billing/billing.operations.d.ts +166 -0
  23. package/dist/billing/billing.operations.d.ts.map +1 -0
  24. package/dist/billing/billing.operations.js +181 -0
  25. package/dist/billing/billing.operations.js.map +1 -0
  26. package/dist/billing/billing.presentation.d.ts +14 -0
  27. package/dist/billing/billing.presentation.d.ts.map +1 -0
  28. package/dist/billing/billing.presentation.js +59 -0
  29. package/dist/billing/billing.presentation.js.map +1 -0
  30. package/dist/billing/billing.schema.d.ts +201 -0
  31. package/dist/billing/billing.schema.d.ts.map +1 -0
  32. package/dist/billing/billing.schema.js +214 -0
  33. package/dist/billing/billing.schema.js.map +1 -0
  34. package/dist/billing/index.d.ts +8 -0
  35. package/dist/billing/index.js +9 -0
  36. package/dist/dashboard/dashboard.presentation.d.ts +14 -0
  37. package/dist/dashboard/dashboard.presentation.d.ts.map +1 -0
  38. package/dist/dashboard/dashboard.presentation.js +55 -0
  39. package/dist/dashboard/dashboard.presentation.js.map +1 -0
  40. package/dist/dashboard/index.d.ts +2 -0
  41. package/dist/dashboard/index.js +3 -0
  42. package/dist/docs/index.d.ts +1 -0
  43. package/dist/docs/index.js +1 -0
  44. package/dist/docs/saas-boilerplate.docblock.d.ts +1 -0
  45. package/dist/docs/saas-boilerplate.docblock.js +100 -0
  46. package/dist/docs/saas-boilerplate.docblock.js.map +1 -0
  47. package/dist/example.d.ts +7 -0
  48. package/dist/example.d.ts.map +1 -0
  49. package/dist/example.js +53 -0
  50. package/dist/example.js.map +1 -0
  51. package/dist/handlers/index.d.ts +4 -0
  52. package/dist/handlers/index.js +5 -0
  53. package/dist/handlers/saas.handlers.d.ts +68 -0
  54. package/dist/handlers/saas.handlers.d.ts.map +1 -0
  55. package/dist/handlers/saas.handlers.js +148 -0
  56. package/dist/handlers/saas.handlers.js.map +1 -0
  57. package/dist/index.d.ts +54 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +81 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/presentations/index.d.ts +17 -0
  62. package/dist/presentations/index.d.ts.map +1 -0
  63. package/dist/presentations/index.js +17 -0
  64. package/dist/presentations/index.js.map +1 -0
  65. package/dist/project/index.d.ts +8 -0
  66. package/dist/project/index.js +9 -0
  67. package/dist/project/project.entity.d.ts +40 -0
  68. package/dist/project/project.entity.d.ts.map +1 -0
  69. package/dist/project/project.entity.js +85 -0
  70. package/dist/project/project.entity.js.map +1 -0
  71. package/dist/project/project.enum.d.ts +16 -0
  72. package/dist/project/project.enum.d.ts.map +1 -0
  73. package/dist/project/project.enum.js +26 -0
  74. package/dist/project/project.enum.js.map +1 -0
  75. package/dist/project/project.event.d.ts +92 -0
  76. package/dist/project/project.event.d.ts.map +1 -0
  77. package/dist/project/project.event.js +165 -0
  78. package/dist/project/project.event.js.map +1 -0
  79. package/dist/project/project.handler.d.ts +72 -0
  80. package/dist/project/project.handler.d.ts.map +1 -0
  81. package/dist/project/project.handler.js +82 -0
  82. package/dist/project/project.handler.js.map +1 -0
  83. package/dist/project/project.operations.d.ts +419 -0
  84. package/dist/project/project.operations.d.ts.map +1 -0
  85. package/dist/project/project.operations.js +260 -0
  86. package/dist/project/project.operations.js.map +1 -0
  87. package/dist/project/project.presentation.d.ts +14 -0
  88. package/dist/project/project.presentation.d.ts.map +1 -0
  89. package/dist/project/project.presentation.js +65 -0
  90. package/dist/project/project.presentation.js.map +1 -0
  91. package/dist/project/project.schema.d.ts +235 -0
  92. package/dist/project/project.schema.d.ts.map +1 -0
  93. package/dist/project/project.schema.js +215 -0
  94. package/dist/project/project.schema.js.map +1 -0
  95. package/dist/saas-boilerplate.feature.d.ts +12 -0
  96. package/dist/saas-boilerplate.feature.d.ts.map +1 -0
  97. package/dist/saas-boilerplate.feature.js +208 -0
  98. package/dist/saas-boilerplate.feature.js.map +1 -0
  99. package/dist/seeders/index.d.ts +10 -0
  100. package/dist/seeders/index.d.ts.map +1 -0
  101. package/dist/seeders/index.js +19 -0
  102. package/dist/seeders/index.js.map +1 -0
  103. package/dist/settings/index.d.ts +3 -0
  104. package/dist/settings/index.js +4 -0
  105. package/dist/settings/settings.entity.d.ts +37 -0
  106. package/dist/settings/settings.entity.d.ts.map +1 -0
  107. package/dist/settings/settings.entity.js +78 -0
  108. package/dist/settings/settings.entity.js.map +1 -0
  109. package/dist/settings/settings.enum.d.ts +10 -0
  110. package/dist/settings/settings.enum.d.ts.map +1 -0
  111. package/dist/settings/settings.enum.js +21 -0
  112. package/dist/settings/settings.enum.js.map +1 -0
  113. package/dist/shared/mock-data.d.ts +86 -0
  114. package/dist/shared/mock-data.d.ts.map +1 -0
  115. package/dist/shared/mock-data.js +138 -0
  116. package/dist/shared/mock-data.js.map +1 -0
  117. package/dist/shared/overlay-types.d.ts +34 -0
  118. package/dist/shared/overlay-types.d.ts.map +1 -0
  119. package/dist/shared/overlay-types.js +0 -0
  120. package/dist/tests/operations.test-spec.d.ts +10 -0
  121. package/dist/tests/operations.test-spec.d.ts.map +1 -0
  122. package/dist/tests/operations.test-spec.js +123 -0
  123. package/dist/tests/operations.test-spec.js.map +1 -0
  124. package/dist/ui/SaasDashboard.d.ts +7 -0
  125. package/dist/ui/SaasDashboard.d.ts.map +1 -0
  126. package/dist/ui/SaasDashboard.js +298 -0
  127. package/dist/ui/SaasDashboard.js.map +1 -0
  128. package/dist/ui/SaasProjectList.d.ts +14 -0
  129. package/dist/ui/SaasProjectList.d.ts.map +1 -0
  130. package/dist/ui/SaasProjectList.js +76 -0
  131. package/dist/ui/SaasProjectList.js.map +1 -0
  132. package/dist/ui/SaasSettingsPanel.d.ts +7 -0
  133. package/dist/ui/SaasSettingsPanel.d.ts.map +1 -0
  134. package/dist/ui/SaasSettingsPanel.js +138 -0
  135. package/dist/ui/SaasSettingsPanel.js.map +1 -0
  136. package/dist/ui/hooks/index.d.ts +3 -0
  137. package/dist/ui/hooks/index.js +6 -0
  138. package/dist/ui/hooks/useProjectList.d.ts +34 -0
  139. package/dist/ui/hooks/useProjectList.d.ts.map +1 -0
  140. package/dist/ui/hooks/useProjectList.js +75 -0
  141. package/dist/ui/hooks/useProjectList.js.map +1 -0
  142. package/dist/ui/hooks/useProjectMutations.d.ts +28 -0
  143. package/dist/ui/hooks/useProjectMutations.d.ts.map +1 -0
  144. package/dist/ui/hooks/useProjectMutations.js +146 -0
  145. package/dist/ui/hooks/useProjectMutations.js.map +1 -0
  146. package/dist/ui/index.d.ts +14 -0
  147. package/dist/ui/index.js +15 -0
  148. package/dist/ui/modals/CreateProjectModal.d.ts +23 -0
  149. package/dist/ui/modals/CreateProjectModal.d.ts.map +1 -0
  150. package/dist/ui/modals/CreateProjectModal.js +139 -0
  151. package/dist/ui/modals/CreateProjectModal.js.map +1 -0
  152. package/dist/ui/modals/ProjectActionsModal.d.ts +38 -0
  153. package/dist/ui/modals/ProjectActionsModal.d.ts.map +1 -0
  154. package/dist/ui/modals/ProjectActionsModal.js +292 -0
  155. package/dist/ui/modals/ProjectActionsModal.js.map +1 -0
  156. package/dist/ui/modals/index.d.ts +3 -0
  157. package/dist/ui/modals/index.js +4 -0
  158. package/dist/ui/overlays/demo-overlays.d.ts +19 -0
  159. package/dist/ui/overlays/demo-overlays.d.ts.map +1 -0
  160. package/dist/ui/overlays/demo-overlays.js +70 -0
  161. package/dist/ui/overlays/demo-overlays.js.map +1 -0
  162. package/dist/ui/overlays/index.d.ts +2 -0
  163. package/dist/ui/overlays/index.js +3 -0
  164. package/dist/ui/renderers/index.d.ts +3 -0
  165. package/dist/ui/renderers/index.js +4 -0
  166. package/dist/ui/renderers/project-list.markdown.d.ts +31 -0
  167. package/dist/ui/renderers/project-list.markdown.d.ts.map +1 -0
  168. package/dist/ui/renderers/project-list.markdown.js +148 -0
  169. package/dist/ui/renderers/project-list.markdown.js.map +1 -0
  170. package/dist/ui/renderers/project-list.renderer.d.ts +9 -0
  171. package/dist/ui/renderers/project-list.renderer.d.ts.map +1 -0
  172. package/dist/ui/renderers/project-list.renderer.js +17 -0
  173. package/dist/ui/renderers/project-list.renderer.js.map +1 -0
  174. package/example.ts +1 -0
  175. package/package.json +135 -0
  176. package/src/billing/billing.entity.ts +158 -0
  177. package/src/billing/billing.enum.ts +23 -0
  178. package/src/billing/billing.event.ts +108 -0
  179. package/src/billing/billing.handler.ts +137 -0
  180. package/src/billing/billing.operations.ts +187 -0
  181. package/src/billing/billing.presentation.ts +56 -0
  182. package/src/billing/billing.schema.ts +133 -0
  183. package/src/billing/index.ts +64 -0
  184. package/src/dashboard/dashboard.presentation.ts +56 -0
  185. package/src/dashboard/index.ts +8 -0
  186. package/src/docs/index.ts +1 -0
  187. package/src/docs/saas-boilerplate.docblock.ts +98 -0
  188. package/src/example.ts +38 -0
  189. package/src/handlers/index.ts +23 -0
  190. package/src/handlers/saas.handlers.ts +300 -0
  191. package/src/index.ts +76 -0
  192. package/src/presentations/index.ts +36 -0
  193. package/src/project/index.ts +66 -0
  194. package/src/project/project.entity.ts +93 -0
  195. package/src/project/project.enum.ts +22 -0
  196. package/src/project/project.event.ts +128 -0
  197. package/src/project/project.handler.ts +168 -0
  198. package/src/project/project.operations.ts +272 -0
  199. package/src/project/project.presentation.ts +58 -0
  200. package/src/project/project.schema.ts +147 -0
  201. package/src/saas-boilerplate.feature.ts +113 -0
  202. package/src/seeders/index.ts +28 -0
  203. package/src/settings/index.ts +9 -0
  204. package/src/settings/settings.entity.ts +89 -0
  205. package/src/settings/settings.enum.ts +11 -0
  206. package/src/shared/mock-data.ts +110 -0
  207. package/src/shared/overlay-types.ts +39 -0
  208. package/src/tests/operations.test-spec.ts +109 -0
  209. package/src/ui/SaasDashboard.tsx +325 -0
  210. package/src/ui/SaasProjectList.tsx +113 -0
  211. package/src/ui/SaasSettingsPanel.tsx +96 -0
  212. package/src/ui/hooks/index.ts +10 -0
  213. package/src/ui/hooks/useProjectList.ts +95 -0
  214. package/src/ui/hooks/useProjectMutations.ts +166 -0
  215. package/src/ui/index.ts +18 -0
  216. package/src/ui/modals/CreateProjectModal.tsx +176 -0
  217. package/src/ui/modals/ProjectActionsModal.tsx +346 -0
  218. package/src/ui/modals/index.ts +2 -0
  219. package/src/ui/overlays/demo-overlays.ts +74 -0
  220. package/src/ui/overlays/index.ts +1 -0
  221. package/src/ui/renderers/index.ts +7 -0
  222. package/src/ui/renderers/project-list.markdown.ts +239 -0
  223. package/src/ui/renderers/project-list.renderer.tsx +22 -0
  224. package/tsconfig.json +10 -0
  225. package/tsconfig.tsbuildinfo +1 -0
  226. package/tsdown.config.js +7 -0
@@ -0,0 +1,148 @@
1
+ import { web } from "@contractspec/lib.runtime-sandbox";
2
+
3
+ //#region src/handlers/saas.handlers.ts
4
+ const { generateId } = web;
5
+ function rowToProject(row) {
6
+ return {
7
+ id: row.id,
8
+ projectId: row.projectId,
9
+ organizationId: row.organizationId,
10
+ name: row.name,
11
+ description: row.description ?? void 0,
12
+ status: row.status,
13
+ tier: row.tier,
14
+ createdAt: new Date(row.createdAt),
15
+ updatedAt: new Date(row.updatedAt)
16
+ };
17
+ }
18
+ function rowToSubscription(row) {
19
+ return {
20
+ id: row.id,
21
+ projectId: row.projectId,
22
+ organizationId: row.organizationId,
23
+ plan: row.plan,
24
+ status: row.status,
25
+ billingCycle: row.billingCycle,
26
+ currentPeriodStart: new Date(row.currentPeriodStart),
27
+ currentPeriodEnd: new Date(row.currentPeriodEnd),
28
+ cancelAtPeriodEnd: Boolean(row.cancelAtPeriodEnd)
29
+ };
30
+ }
31
+ function createSaasHandlers(db) {
32
+ /**
33
+ * List projects
34
+ */
35
+ async function listProjects(input) {
36
+ const { projectId, organizationId, status, search, limit = 20, offset = 0 } = input;
37
+ let whereClause = "WHERE projectId = ?";
38
+ const params = [projectId];
39
+ if (organizationId) {
40
+ whereClause += " AND organizationId = ?";
41
+ params.push(organizationId);
42
+ }
43
+ if (status && status !== "all") {
44
+ whereClause += " AND status = ?";
45
+ params.push(status);
46
+ }
47
+ if (search) {
48
+ whereClause += " AND (name LIKE ? OR description LIKE ?)";
49
+ params.push(`%${search}%`, `%${search}%`);
50
+ }
51
+ const total = (await db.query(`SELECT COUNT(*) as count FROM saas_project ${whereClause}`, params)).rows[0]?.count ?? 0;
52
+ const rows = (await db.query(`SELECT * FROM saas_project ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`, [
53
+ ...params,
54
+ limit,
55
+ offset
56
+ ])).rows;
57
+ return {
58
+ items: rows.map(rowToProject),
59
+ total,
60
+ hasMore: offset + rows.length < total
61
+ };
62
+ }
63
+ /**
64
+ * Get a single project
65
+ */
66
+ async function getProject(id) {
67
+ const rows = (await db.query(`SELECT * FROM saas_project WHERE id = ?`, [id])).rows;
68
+ return rows[0] ? rowToProject(rows[0]) : null;
69
+ }
70
+ /**
71
+ * Create a project
72
+ */
73
+ async function createProject(input, context) {
74
+ const id = generateId("proj");
75
+ const now = (/* @__PURE__ */ new Date()).toISOString();
76
+ await db.execute(`INSERT INTO saas_project (id, projectId, organizationId, name, description, status, tier, createdAt, updatedAt)
77
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
78
+ id,
79
+ context.projectId,
80
+ context.organizationId,
81
+ input.name,
82
+ input.description ?? null,
83
+ "DRAFT",
84
+ input.tier ?? "FREE",
85
+ now,
86
+ now
87
+ ]);
88
+ const rows = (await db.query(`SELECT * FROM saas_project WHERE id = ?`, [id])).rows;
89
+ return rowToProject(rows[0]);
90
+ }
91
+ /**
92
+ * Update a project
93
+ */
94
+ async function updateProject(input) {
95
+ const now = (/* @__PURE__ */ new Date()).toISOString();
96
+ const updates = ["updatedAt = ?"];
97
+ const params = [now];
98
+ if (input.name !== void 0) {
99
+ updates.push("name = ?");
100
+ params.push(input.name);
101
+ }
102
+ if (input.description !== void 0) {
103
+ updates.push("description = ?");
104
+ params.push(input.description);
105
+ }
106
+ if (input.status !== void 0) {
107
+ updates.push("status = ?");
108
+ params.push(input.status);
109
+ }
110
+ params.push(input.id);
111
+ await db.execute(`UPDATE saas_project SET ${updates.join(", ")} WHERE id = ?`, params);
112
+ const rows = (await db.query(`SELECT * FROM saas_project WHERE id = ?`, [input.id])).rows;
113
+ if (!rows[0]) throw new Error("NOT_FOUND");
114
+ return rowToProject(rows[0]);
115
+ }
116
+ /**
117
+ * Delete a project
118
+ */
119
+ async function deleteProject(id) {
120
+ await db.execute(`DELETE FROM saas_project WHERE id = ?`, [id]);
121
+ }
122
+ /**
123
+ * Get subscription for an organization
124
+ */
125
+ async function getSubscription(input) {
126
+ let query = `SELECT * FROM saas_subscription WHERE projectId = ?`;
127
+ const params = [input.projectId];
128
+ if (input.organizationId) {
129
+ query += " AND organizationId = ?";
130
+ params.push(input.organizationId);
131
+ }
132
+ query += " LIMIT 1";
133
+ const rows = (await db.query(query, params)).rows;
134
+ return rows[0] ? rowToSubscription(rows[0]) : null;
135
+ }
136
+ return {
137
+ listProjects,
138
+ getProject,
139
+ createProject,
140
+ updateProject,
141
+ deleteProject,
142
+ getSubscription
143
+ };
144
+ }
145
+
146
+ //#endregion
147
+ export { createSaasHandlers };
148
+ //# sourceMappingURL=saas.handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saas.handlers.js","names":[],"sources":["../../src/handlers/saas.handlers.ts"],"sourcesContent":["/**\n * Runtime-local SaaS Boilerplate handlers\n *\n * Database-backed handlers for project and billing management.\n */\nimport type { DatabasePort } from '@contractspec/lib.runtime-sandbox';\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { web } from '@contractspec/lib.runtime-sandbox';\nconst { generateId } = web;\n\n// ============ Types ============\n\nexport interface Project {\n id: string;\n projectId: string;\n organizationId: string;\n name: string;\n description?: string;\n status: 'DRAFT' | 'ACTIVE' | 'ARCHIVED';\n tier: 'FREE' | 'PRO' | 'ENTERPRISE';\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Subscription {\n id: string;\n projectId: string;\n organizationId: string;\n plan: 'FREE' | 'PRO' | 'ENTERPRISE';\n status: 'ACTIVE' | 'PAST_DUE' | 'CANCELED';\n billingCycle: 'MONTHLY' | 'YEARLY';\n currentPeriodStart: Date;\n currentPeriodEnd: Date;\n cancelAtPeriodEnd: boolean;\n}\n\nexport interface ListProjectsInput {\n projectId: string;\n organizationId?: string;\n status?: Project['status'] | 'all';\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface ListProjectsOutput {\n items: Project[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface CreateProjectInput {\n name: string;\n description?: string;\n tier?: Project['tier'];\n}\n\nexport interface UpdateProjectInput {\n id: string;\n name?: string;\n description?: string;\n status?: Project['status'];\n}\n\n// ============ Row Types ============\n\ninterface ProjectRow extends Record<string, unknown> {\n id: string;\n projectId: string;\n organizationId: string;\n name: string;\n description: string | null;\n status: string;\n tier: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface SubscriptionRow extends Record<string, unknown> {\n id: string;\n projectId: string;\n organizationId: string;\n plan: string;\n status: string;\n billingCycle: string;\n currentPeriodStart: string;\n currentPeriodEnd: string;\n cancelAtPeriodEnd: number;\n}\n\nfunction rowToProject(row: ProjectRow): Project {\n return {\n id: row.id,\n projectId: row.projectId,\n organizationId: row.organizationId,\n name: row.name,\n description: row.description ?? undefined,\n status: row.status as Project['status'],\n tier: row.tier as Project['tier'],\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n}\n\nfunction rowToSubscription(row: SubscriptionRow): Subscription {\n return {\n id: row.id,\n projectId: row.projectId,\n organizationId: row.organizationId,\n plan: row.plan as Subscription['plan'],\n status: row.status as Subscription['status'],\n billingCycle: row.billingCycle as Subscription['billingCycle'],\n currentPeriodStart: new Date(row.currentPeriodStart),\n currentPeriodEnd: new Date(row.currentPeriodEnd),\n cancelAtPeriodEnd: Boolean(row.cancelAtPeriodEnd),\n };\n}\n\n// ============ Handler Factory ============\n\nexport function createSaasHandlers(db: DatabasePort) {\n /**\n * List projects\n */\n async function listProjects(\n input: ListProjectsInput\n ): Promise<ListProjectsOutput> {\n const {\n projectId,\n organizationId,\n status,\n search,\n limit = 20,\n offset = 0,\n } = input;\n\n let whereClause = 'WHERE projectId = ?';\n const params: (string | number)[] = [projectId];\n\n if (organizationId) {\n whereClause += ' AND organizationId = ?';\n params.push(organizationId);\n }\n\n if (status && status !== 'all') {\n whereClause += ' AND status = ?';\n params.push(status);\n }\n\n if (search) {\n whereClause += ' AND (name LIKE ? OR description LIKE ?)';\n params.push(`%${search}%`, `%${search}%`);\n }\n\n const countResult = (\n await db.query(\n `SELECT COUNT(*) as count FROM saas_project ${whereClause}`,\n params\n )\n ).rows as unknown as { count: number }[];\n const total = countResult[0]?.count ?? 0;\n\n const rows = (\n await db.query(\n `SELECT * FROM saas_project ${whereClause} ORDER BY createdAt DESC LIMIT ? OFFSET ?`,\n [...params, limit, offset]\n )\n ).rows as unknown as ProjectRow[];\n\n return {\n items: rows.map(rowToProject),\n total,\n hasMore: offset + rows.length < total,\n };\n }\n\n /**\n * Get a single project\n */\n async function getProject(id: string): Promise<Project | null> {\n const rows = (\n await db.query(`SELECT * FROM saas_project WHERE id = ?`, [id])\n ).rows as unknown as ProjectRow[];\n return rows[0] ? rowToProject(rows[0]) : null;\n }\n\n /**\n * Create a project\n */\n async function createProject(\n input: CreateProjectInput,\n context: { projectId: string; organizationId: string }\n ): Promise<Project> {\n const id = generateId('proj');\n const now = new Date().toISOString();\n\n await db.execute(\n `INSERT INTO saas_project (id, projectId, organizationId, name, description, status, tier, createdAt, updatedAt)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n context.projectId,\n context.organizationId,\n input.name,\n input.description ?? null,\n 'DRAFT',\n input.tier ?? 'FREE',\n now,\n now,\n ]\n );\n\n const rows = (\n await db.query(`SELECT * FROM saas_project WHERE id = ?`, [id])\n ).rows as unknown as ProjectRow[];\n\n return rowToProject(rows[0]!);\n }\n\n /**\n * Update a project\n */\n async function updateProject(input: UpdateProjectInput): Promise<Project> {\n const now = new Date().toISOString();\n const updates: string[] = ['updatedAt = ?'];\n const params: (string | null)[] = [now];\n\n if (input.name !== undefined) {\n updates.push('name = ?');\n params.push(input.name);\n }\n\n if (input.description !== undefined) {\n updates.push('description = ?');\n params.push(input.description);\n }\n\n if (input.status !== undefined) {\n updates.push('status = ?');\n params.push(input.status);\n }\n\n params.push(input.id);\n\n await db.execute(\n `UPDATE saas_project SET ${updates.join(', ')} WHERE id = ?`,\n params\n );\n\n const rows = (\n await db.query(`SELECT * FROM saas_project WHERE id = ?`, [input.id])\n ).rows as unknown as ProjectRow[];\n\n if (!rows[0]) {\n throw new Error('NOT_FOUND');\n }\n\n return rowToProject(rows[0]);\n }\n\n /**\n * Delete a project\n */\n async function deleteProject(id: string): Promise<void> {\n await db.execute(`DELETE FROM saas_project WHERE id = ?`, [id]);\n }\n\n /**\n * Get subscription for an organization\n */\n async function getSubscription(input: {\n projectId: string;\n organizationId?: string;\n }): Promise<Subscription | null> {\n let query = `SELECT * FROM saas_subscription WHERE projectId = ?`;\n const params: string[] = [input.projectId];\n\n if (input.organizationId) {\n query += ' AND organizationId = ?';\n params.push(input.organizationId);\n }\n\n query += ' LIMIT 1';\n\n const rows = (await db.query(query, params))\n .rows as unknown as SubscriptionRow[];\n return rows[0] ? rowToSubscription(rows[0]) : null;\n }\n\n return {\n listProjects,\n getProject,\n createProject,\n updateProject,\n deleteProject,\n getSubscription,\n };\n}\n\nexport type SaasHandlers = ReturnType<typeof createSaasHandlers>;\n"],"mappings":";;;AAQA,MAAM,EAAE,eAAe;AAkFvB,SAAS,aAAa,KAA0B;AAC9C,QAAO;EACL,IAAI,IAAI;EACR,WAAW,IAAI;EACf,gBAAgB,IAAI;EACpB,MAAM,IAAI;EACV,aAAa,IAAI,eAAe;EAChC,QAAQ,IAAI;EACZ,MAAM,IAAI;EACV,WAAW,IAAI,KAAK,IAAI,UAAU;EAClC,WAAW,IAAI,KAAK,IAAI,UAAU;EACnC;;AAGH,SAAS,kBAAkB,KAAoC;AAC7D,QAAO;EACL,IAAI,IAAI;EACR,WAAW,IAAI;EACf,gBAAgB,IAAI;EACpB,MAAM,IAAI;EACV,QAAQ,IAAI;EACZ,cAAc,IAAI;EAClB,oBAAoB,IAAI,KAAK,IAAI,mBAAmB;EACpD,kBAAkB,IAAI,KAAK,IAAI,iBAAiB;EAChD,mBAAmB,QAAQ,IAAI,kBAAkB;EAClD;;AAKH,SAAgB,mBAAmB,IAAkB;;;;CAInD,eAAe,aACb,OAC6B;EAC7B,MAAM,EACJ,WACA,gBACA,QACA,QACA,QAAQ,IACR,SAAS,MACP;EAEJ,IAAI,cAAc;EAClB,MAAM,SAA8B,CAAC,UAAU;AAE/C,MAAI,gBAAgB;AAClB,kBAAe;AACf,UAAO,KAAK,eAAe;;AAG7B,MAAI,UAAU,WAAW,OAAO;AAC9B,kBAAe;AACf,UAAO,KAAK,OAAO;;AAGrB,MAAI,QAAQ;AACV,kBAAe;AACf,UAAO,KAAK,IAAI,OAAO,IAAI,IAAI,OAAO,GAAG;;EAS3C,MAAM,SALJ,MAAM,GAAG,MACP,8CAA8C,eAC9C,OACD,EACD,KACwB,IAAI,SAAS;EAEvC,MAAM,QACJ,MAAM,GAAG,MACP,8BAA8B,YAAY,4CAC1C;GAAC,GAAG;GAAQ;GAAO;GAAO,CAC3B,EACD;AAEF,SAAO;GACL,OAAO,KAAK,IAAI,aAAa;GAC7B;GACA,SAAS,SAAS,KAAK,SAAS;GACjC;;;;;CAMH,eAAe,WAAW,IAAqC;EAC7D,MAAM,QACJ,MAAM,GAAG,MAAM,2CAA2C,CAAC,GAAG,CAAC,EAC/D;AACF,SAAO,KAAK,KAAK,aAAa,KAAK,GAAG,GAAG;;;;;CAM3C,eAAe,cACb,OACA,SACkB;EAClB,MAAM,KAAK,WAAW,OAAO;EAC7B,MAAM,uBAAM,IAAI,MAAM,EAAC,aAAa;AAEpC,QAAM,GAAG,QACP;4CAEA;GACE;GACA,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,MAAM,eAAe;GACrB;GACA,MAAM,QAAQ;GACd;GACA;GACD,CACF;EAED,MAAM,QACJ,MAAM,GAAG,MAAM,2CAA2C,CAAC,GAAG,CAAC,EAC/D;AAEF,SAAO,aAAa,KAAK,GAAI;;;;;CAM/B,eAAe,cAAc,OAA6C;EACxE,MAAM,uBAAM,IAAI,MAAM,EAAC,aAAa;EACpC,MAAM,UAAoB,CAAC,gBAAgB;EAC3C,MAAM,SAA4B,CAAC,IAAI;AAEvC,MAAI,MAAM,SAAS,QAAW;AAC5B,WAAQ,KAAK,WAAW;AACxB,UAAO,KAAK,MAAM,KAAK;;AAGzB,MAAI,MAAM,gBAAgB,QAAW;AACnC,WAAQ,KAAK,kBAAkB;AAC/B,UAAO,KAAK,MAAM,YAAY;;AAGhC,MAAI,MAAM,WAAW,QAAW;AAC9B,WAAQ,KAAK,aAAa;AAC1B,UAAO,KAAK,MAAM,OAAO;;AAG3B,SAAO,KAAK,MAAM,GAAG;AAErB,QAAM,GAAG,QACP,2BAA2B,QAAQ,KAAK,KAAK,CAAC,gBAC9C,OACD;EAED,MAAM,QACJ,MAAM,GAAG,MAAM,2CAA2C,CAAC,MAAM,GAAG,CAAC,EACrE;AAEF,MAAI,CAAC,KAAK,GACR,OAAM,IAAI,MAAM,YAAY;AAG9B,SAAO,aAAa,KAAK,GAAG;;;;;CAM9B,eAAe,cAAc,IAA2B;AACtD,QAAM,GAAG,QAAQ,yCAAyC,CAAC,GAAG,CAAC;;;;;CAMjE,eAAe,gBAAgB,OAGE;EAC/B,IAAI,QAAQ;EACZ,MAAM,SAAmB,CAAC,MAAM,UAAU;AAE1C,MAAI,MAAM,gBAAgB;AACxB,YAAS;AACT,UAAO,KAAK,MAAM,eAAe;;AAGnC,WAAS;EAET,MAAM,QAAQ,MAAM,GAAG,MAAM,OAAO,OAAO,EACxC;AACH,SAAO,KAAK,KAAK,kBAAkB,KAAK,GAAG,GAAG;;AAGhD,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACD"}
@@ -0,0 +1,54 @@
1
+ import { BillingUsageEntity, SubscriptionEntity, SubscriptionStatusEnum, UsageLimitEntity } from "./billing/billing.entity.js";
2
+ import { FeatureAccessReasonEnum, SubscriptionStatusSchemaEnum } from "./billing/billing.enum.js";
3
+ import { SubscriptionChangedEvent, UsageLimitReachedEvent, UsageRecordedEvent } from "./billing/billing.event.js";
4
+ import { CheckFeatureAccessInput, CheckFeatureAccessOutput, RecordUsageInput, Subscription, UsageSummary, mockCheckFeatureAccessHandler, mockGetSubscriptionHandler, mockGetUsageSummaryHandler, mockRecordUsageHandler } from "./billing/billing.handler.js";
5
+ import { CheckFeatureAccessContract, GetSubscriptionContract, GetUsageSummaryContract, RecordUsageContract } from "./billing/billing.operations.js";
6
+ import { SubscriptionPresentation, UsageDashboardPresentation } from "./billing/billing.presentation.js";
7
+ import { CheckFeatureAccessInputModel, CheckFeatureAccessOutputModel, GetUsageSummaryInputModel, GetUsageSummaryOutputModel, RecordUsageInputModel, RecordUsageOutputModel, SubscriptionModel, UsageRecordedPayloadModel, UsageSummaryModel } from "./billing/billing.schema.js";
8
+ import "./billing/index.js";
9
+ import { SaasDashboardPresentation, SettingsPanelPresentation } from "./dashboard/dashboard.presentation.js";
10
+ import "./dashboard/index.js";
11
+ import example from "./example.js";
12
+ import { CreateProjectInput, ListProjectsInput, ListProjectsOutput, Project, UpdateProjectInput, mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockListProjectsHandler, mockUpdateProjectHandler } from "./project/project.handler.js";
13
+ import { SaasHandlers, createSaasHandlers } from "./handlers/saas.handlers.js";
14
+ import { ProjectStatusFilterEnum, ProjectStatusSchemaEnum } from "./project/project.enum.js";
15
+ import { CreateProjectInputModel, DeleteProjectInputModel, DeleteProjectOutputModel, GetProjectInputModel, ListProjectsInputModel, ListProjectsOutputModel, ProjectDeletedPayloadModel, ProjectModel, UpdateProjectInputModel } from "./project/project.schema.js";
16
+ import { CreateProjectContract, DeleteProjectContract, GetProjectContract, ListProjectsContract, UpdateProjectContract } from "./project/project.operations.js";
17
+ import { ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectUpdatedEvent } from "./project/project.event.js";
18
+ import { ProjectEntity, ProjectMemberEntity, ProjectStatusEnum } from "./project/project.entity.js";
19
+ import { ProjectDetailPresentation, ProjectListPresentation } from "./project/project.presentation.js";
20
+ import "./project/index.js";
21
+ import { SettingsScopeEnum } from "./settings/settings.enum.js";
22
+ import { FeatureFlagEntity, SettingsEntity } from "./settings/settings.entity.js";
23
+ import "./settings/index.js";
24
+ import { SaasBoilerplateFeature } from "./saas-boilerplate.feature.js";
25
+ import { SaasDashboard } from "./ui/SaasDashboard.js";
26
+ import { SaasProjectList } from "./ui/SaasProjectList.js";
27
+ import { SaasSettingsPanel } from "./ui/SaasSettingsPanel.js";
28
+ import { CreateProjectModal } from "./ui/modals/CreateProjectModal.js";
29
+ import { ProjectActionsModal } from "./ui/modals/ProjectActionsModal.js";
30
+ import { UseProjectListOptions, useProjectList } from "./ui/hooks/useProjectList.js";
31
+ import { UseProjectMutationsOptions, useProjectMutations } from "./ui/hooks/useProjectMutations.js";
32
+ import { projectListReactRenderer } from "./ui/renderers/project-list.renderer.js";
33
+ import { projectListMarkdownRenderer, saasBillingMarkdownRenderer, saasDashboardMarkdownRenderer } from "./ui/renderers/project-list.markdown.js";
34
+ import { saasDemoOverlay, saasFreeUserOverlay, saasOverlays } from "./ui/overlays/demo-overlays.js";
35
+ import "./ui/index.js";
36
+ import { ModuleSchemaContribution } from "@contractspec/lib.schema";
37
+
38
+ //#region src/index.d.ts
39
+ /**
40
+ * SaaS boilerplate schema contribution.
41
+ */
42
+ declare const saasBoilerplateSchemaContribution: ModuleSchemaContribution;
43
+ /**
44
+ * Complete schema composition for SaaS Boilerplate.
45
+ * Use with `database schema:compose` to generate Prisma schema.
46
+ */
47
+ declare const schemaComposition: {
48
+ modules: ModuleSchemaContribution[];
49
+ provider: "postgresql";
50
+ outputPath: string;
51
+ };
52
+ //#endregion
53
+ export { BillingUsageEntity, CheckFeatureAccessContract, CheckFeatureAccessInput, CheckFeatureAccessInputModel, CheckFeatureAccessOutput, CheckFeatureAccessOutputModel, CreateProjectContract, CreateProjectInput, CreateProjectInputModel, CreateProjectModal, DeleteProjectContract, DeleteProjectInputModel, DeleteProjectOutputModel, FeatureAccessReasonEnum, FeatureFlagEntity, GetProjectContract, GetProjectInputModel, GetSubscriptionContract, GetUsageSummaryContract, GetUsageSummaryInputModel, GetUsageSummaryOutputModel, ListProjectsContract, ListProjectsInput, ListProjectsInputModel, ListProjectsOutput, ListProjectsOutputModel, Project, ProjectActionsModal, ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectDeletedPayloadModel, ProjectDetailPresentation, ProjectEntity, ProjectListPresentation, ProjectMemberEntity, ProjectModel, ProjectStatusEnum, ProjectStatusFilterEnum, ProjectStatusSchemaEnum, ProjectUpdatedEvent, RecordUsageContract, RecordUsageInput, RecordUsageInputModel, RecordUsageOutputModel, SaasBoilerplateFeature, SaasDashboard, SaasDashboardPresentation, type SaasHandlers, SaasProjectList, SaasSettingsPanel, SettingsEntity, SettingsPanelPresentation, SettingsScopeEnum, Subscription, SubscriptionChangedEvent, SubscriptionEntity, SubscriptionModel, SubscriptionPresentation, SubscriptionStatusEnum, SubscriptionStatusSchemaEnum, UpdateProjectContract, UpdateProjectInput, UpdateProjectInputModel, UsageDashboardPresentation, UsageLimitEntity, UsageLimitReachedEvent, UsageRecordedEvent, UsageRecordedPayloadModel, UsageSummary, UsageSummaryModel, UseProjectListOptions, UseProjectMutationsOptions, createSaasHandlers, example, mockCheckFeatureAccessHandler, mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockGetSubscriptionHandler, mockGetUsageSummaryHandler, mockListProjectsHandler, mockRecordUsageHandler, mockUpdateProjectHandler, projectListMarkdownRenderer, projectListReactRenderer, saasBillingMarkdownRenderer, saasBoilerplateSchemaContribution, saasDashboardMarkdownRenderer, saasDemoOverlay, saasFreeUserOverlay, saasOverlays, schemaComposition, useProjectList, useProjectMutations };
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+Ca,mCAAmC;;;;;cAkBnC;WAUZ"}
package/dist/index.js ADDED
@@ -0,0 +1,81 @@
1
+ import example_default from "./example.js";
2
+ import { FeatureAccessReasonEnum, SubscriptionStatusSchemaEnum } from "./billing/billing.enum.js";
3
+ import { CheckFeatureAccessInputModel, CheckFeatureAccessOutputModel, GetUsageSummaryInputModel, GetUsageSummaryOutputModel, RecordUsageInputModel, RecordUsageOutputModel, SubscriptionModel, UsageRecordedPayloadModel, UsageSummaryModel } from "./billing/billing.schema.js";
4
+ import { CheckFeatureAccessContract, GetSubscriptionContract, GetUsageSummaryContract, RecordUsageContract } from "./billing/billing.operations.js";
5
+ import { SubscriptionChangedEvent, UsageLimitReachedEvent, UsageRecordedEvent } from "./billing/billing.event.js";
6
+ import { BillingUsageEntity, SubscriptionEntity, SubscriptionStatusEnum, UsageLimitEntity } from "./billing/billing.entity.js";
7
+ import { SubscriptionPresentation, UsageDashboardPresentation } from "./billing/billing.presentation.js";
8
+ import { mockCheckFeatureAccessHandler, mockGetSubscriptionHandler, mockGetUsageSummaryHandler, mockRecordUsageHandler } from "./billing/billing.handler.js";
9
+ import "./billing/index.js";
10
+ import { ProjectStatusFilterEnum, ProjectStatusSchemaEnum } from "./project/project.enum.js";
11
+ import { CreateProjectInputModel, DeleteProjectInputModel, DeleteProjectOutputModel, GetProjectInputModel, ListProjectsInputModel, ListProjectsOutputModel, ProjectDeletedPayloadModel, ProjectModel, UpdateProjectInputModel } from "./project/project.schema.js";
12
+ import { CreateProjectContract, DeleteProjectContract, GetProjectContract, ListProjectsContract, UpdateProjectContract } from "./project/project.operations.js";
13
+ import { ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectUpdatedEvent } from "./project/project.event.js";
14
+ import { ProjectEntity, ProjectMemberEntity, ProjectStatusEnum } from "./project/project.entity.js";
15
+ import { ProjectDetailPresentation, ProjectListPresentation } from "./project/project.presentation.js";
16
+ import { mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockListProjectsHandler, mockUpdateProjectHandler } from "./project/project.handler.js";
17
+ import "./project/index.js";
18
+ import { SettingsScopeEnum } from "./settings/settings.enum.js";
19
+ import { FeatureFlagEntity, SettingsEntity } from "./settings/settings.entity.js";
20
+ import "./settings/index.js";
21
+ import { SaasDashboardPresentation, SettingsPanelPresentation } from "./dashboard/dashboard.presentation.js";
22
+ import "./dashboard/index.js";
23
+ import { SaasBoilerplateFeature } from "./saas-boilerplate.feature.js";
24
+ import { useProjectList } from "./ui/hooks/useProjectList.js";
25
+ import { useProjectMutations } from "./ui/hooks/useProjectMutations.js";
26
+ import { CreateProjectModal } from "./ui/modals/CreateProjectModal.js";
27
+ import { ProjectActionsModal } from "./ui/modals/ProjectActionsModal.js";
28
+ import { SaasDashboard } from "./ui/SaasDashboard.js";
29
+ import { SaasProjectList } from "./ui/SaasProjectList.js";
30
+ import { SaasSettingsPanel } from "./ui/SaasSettingsPanel.js";
31
+ import { projectListReactRenderer } from "./ui/renderers/project-list.renderer.js";
32
+ import { projectListMarkdownRenderer, saasBillingMarkdownRenderer, saasDashboardMarkdownRenderer } from "./ui/renderers/project-list.markdown.js";
33
+ import { saasDemoOverlay, saasFreeUserOverlay, saasOverlays } from "./ui/overlays/demo-overlays.js";
34
+ import "./ui/index.js";
35
+ import { createSaasHandlers } from "./handlers/saas.handlers.js";
36
+ import "./docs/index.js";
37
+ import { identityRbacSchemaContribution } from "@contractspec/lib.identity-rbac";
38
+ import { jobsSchemaContribution } from "@contractspec/lib.jobs";
39
+ import { auditTrailSchemaContribution } from "@contractspec/module.audit-trail";
40
+ import { notificationsSchemaContribution } from "@contractspec/module.notifications";
41
+
42
+ //#region src/index.ts
43
+ /**
44
+ * SaaS boilerplate schema contribution.
45
+ */
46
+ const saasBoilerplateSchemaContribution = {
47
+ moduleId: "@contractspec/example.saas-boilerplate",
48
+ entities: [
49
+ ProjectEntity,
50
+ ProjectMemberEntity,
51
+ SettingsEntity,
52
+ FeatureFlagEntity,
53
+ SubscriptionEntity,
54
+ BillingUsageEntity,
55
+ UsageLimitEntity
56
+ ],
57
+ enums: [
58
+ ProjectStatusEnum,
59
+ SettingsScopeEnum,
60
+ SubscriptionStatusEnum
61
+ ]
62
+ };
63
+ /**
64
+ * Complete schema composition for SaaS Boilerplate.
65
+ * Use with `database schema:compose` to generate Prisma schema.
66
+ */
67
+ const schemaComposition = {
68
+ modules: [
69
+ identityRbacSchemaContribution,
70
+ jobsSchemaContribution,
71
+ auditTrailSchemaContribution,
72
+ notificationsSchemaContribution,
73
+ saasBoilerplateSchemaContribution
74
+ ],
75
+ provider: "postgresql",
76
+ outputPath: "./prisma/schema/generated.prisma"
77
+ };
78
+
79
+ //#endregion
80
+ export { BillingUsageEntity, CheckFeatureAccessContract, CheckFeatureAccessInputModel, CheckFeatureAccessOutputModel, CreateProjectContract, CreateProjectInputModel, CreateProjectModal, DeleteProjectContract, DeleteProjectInputModel, DeleteProjectOutputModel, FeatureAccessReasonEnum, FeatureFlagEntity, GetProjectContract, GetProjectInputModel, GetSubscriptionContract, GetUsageSummaryContract, GetUsageSummaryInputModel, GetUsageSummaryOutputModel, ListProjectsContract, ListProjectsInputModel, ListProjectsOutputModel, ProjectActionsModal, ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectDeletedPayloadModel, ProjectDetailPresentation, ProjectEntity, ProjectListPresentation, ProjectMemberEntity, ProjectModel, ProjectStatusEnum, ProjectStatusFilterEnum, ProjectStatusSchemaEnum, ProjectUpdatedEvent, RecordUsageContract, RecordUsageInputModel, RecordUsageOutputModel, SaasBoilerplateFeature, SaasDashboard, SaasDashboardPresentation, SaasProjectList, SaasSettingsPanel, SettingsEntity, SettingsPanelPresentation, SettingsScopeEnum, SubscriptionChangedEvent, SubscriptionEntity, SubscriptionModel, SubscriptionPresentation, SubscriptionStatusEnum, SubscriptionStatusSchemaEnum, UpdateProjectContract, UpdateProjectInputModel, UsageDashboardPresentation, UsageLimitEntity, UsageLimitReachedEvent, UsageRecordedEvent, UsageRecordedPayloadModel, UsageSummaryModel, createSaasHandlers, example_default as example, mockCheckFeatureAccessHandler, mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockGetSubscriptionHandler, mockGetUsageSummaryHandler, mockListProjectsHandler, mockRecordUsageHandler, mockUpdateProjectHandler, projectListMarkdownRenderer, projectListReactRenderer, saasBillingMarkdownRenderer, saasBoilerplateSchemaContribution, saasDashboardMarkdownRenderer, saasDemoOverlay, saasFreeUserOverlay, saasOverlays, schemaComposition, useProjectList, useProjectMutations };
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["// SaaS Boilerplate Example\n// Demonstrates ContractSpec principles for a complete SaaS application\n\n// Export all domain modules\nexport * from './billing';\nexport * from './project';\nexport * from './settings';\nexport * from './dashboard';\n\n// Export feature and example metadata\nexport * from './saas-boilerplate.feature';\nexport * from './ui';\nexport {\n createSaasHandlers,\n type SaasHandlers,\n} from './handlers/saas.handlers';\nexport { default as example } from './example';\n\n// Import docs for registration\nimport './docs';\n\n// Schema composition configuration\nimport { identityRbacSchemaContribution } from '@contractspec/lib.identity-rbac';\nimport { jobsSchemaContribution } from '@contractspec/lib.jobs';\nimport { auditTrailSchemaContribution } from '@contractspec/module.audit-trail';\nimport { notificationsSchemaContribution } from '@contractspec/module.notifications';\nimport type { ModuleSchemaContribution } from '@contractspec/lib.schema';\nimport {\n ProjectEntity,\n ProjectMemberEntity,\n ProjectStatusEnum,\n} from './project/project.entity';\nimport {\n SettingsEntity,\n FeatureFlagEntity,\n SettingsScopeEnum,\n} from './settings';\nimport {\n SubscriptionEntity,\n BillingUsageEntity,\n UsageLimitEntity,\n SubscriptionStatusEnum,\n} from './billing/billing.entity';\n\n/**\n * SaaS boilerplate schema contribution.\n */\nexport const saasBoilerplateSchemaContribution: ModuleSchemaContribution = {\n moduleId: '@contractspec/example.saas-boilerplate',\n entities: [\n ProjectEntity,\n ProjectMemberEntity,\n SettingsEntity,\n FeatureFlagEntity,\n SubscriptionEntity,\n BillingUsageEntity,\n UsageLimitEntity,\n ],\n enums: [ProjectStatusEnum, SettingsScopeEnum, SubscriptionStatusEnum],\n};\n\n/**\n * Complete schema composition for SaaS Boilerplate.\n * Use with `database schema:compose` to generate Prisma schema.\n */\nexport const schemaComposition = {\n modules: [\n identityRbacSchemaContribution,\n jobsSchemaContribution,\n auditTrailSchemaContribution,\n notificationsSchemaContribution,\n saasBoilerplateSchemaContribution,\n ],\n provider: 'postgresql' as const,\n outputPath: './prisma/schema/generated.prisma',\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,MAAa,oCAA8D;CACzE,UAAU;CACV,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,OAAO;EAAC;EAAmB;EAAmB;EAAuB;CACtE;;;;;AAMD,MAAa,oBAAoB;CAC/B,SAAS;EACP;EACA;EACA;EACA;EACA;EACD;CACD,UAAU;CACV,YAAY;CACb"}
@@ -0,0 +1,17 @@
1
+ import { SubscriptionPresentation, UsageDashboardPresentation } from "../billing/billing.presentation.js";
2
+ import { SaasDashboardPresentation, SettingsPanelPresentation } from "../dashboard/dashboard.presentation.js";
3
+ import { ProjectDetailPresentation, ProjectListPresentation } from "../project/project.presentation.js";
4
+
5
+ //#region src/presentations/index.d.ts
6
+
7
+ declare const SaasBoilerplatePresentations: {
8
+ SubscriptionPresentation: undefined;
9
+ UsageDashboardPresentation: undefined;
10
+ ProjectListPresentation: undefined;
11
+ ProjectDetailPresentation: undefined;
12
+ SaasDashboardPresentation: undefined;
13
+ SettingsPanelPresentation: undefined;
14
+ };
15
+ //#endregion
16
+ export { ProjectDetailPresentation, ProjectListPresentation, SaasBoilerplatePresentations, SaasDashboardPresentation, SettingsPanelPresentation, SubscriptionPresentation, UsageDashboardPresentation };
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/presentations/index.ts"],"sourcesContent":[],"mappings":";;;;;;cAuBa"}
@@ -0,0 +1,17 @@
1
+ import { SubscriptionPresentation, UsageDashboardPresentation } from "../billing/billing.presentation.js";
2
+ import { ProjectDetailPresentation, ProjectListPresentation } from "../project/project.presentation.js";
3
+ import { SaasDashboardPresentation, SettingsPanelPresentation } from "../dashboard/dashboard.presentation.js";
4
+
5
+ //#region src/presentations/index.ts
6
+ const SaasBoilerplatePresentations = {
7
+ SubscriptionPresentation: void 0,
8
+ UsageDashboardPresentation: void 0,
9
+ ProjectListPresentation: void 0,
10
+ ProjectDetailPresentation: void 0,
11
+ SaasDashboardPresentation: void 0,
12
+ SettingsPanelPresentation: void 0
13
+ };
14
+
15
+ //#endregion
16
+ export { ProjectDetailPresentation, ProjectListPresentation, SaasBoilerplatePresentations, SaasDashboardPresentation, SettingsPanelPresentation, SubscriptionPresentation, UsageDashboardPresentation };
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/presentations/index.ts"],"sourcesContent":["/**\n * SaaS Boilerplate Presentations - re-exports from domain modules for backward compatibility.\n */\n\n// Billing presentations\nexport {\n SubscriptionPresentation,\n UsageDashboardPresentation,\n} from '../billing/billing.presentation';\n\n// Project presentations\nexport {\n ProjectListPresentation,\n ProjectDetailPresentation,\n} from '../project/project.presentation';\n\n// Dashboard presentations\nexport {\n SaasDashboardPresentation,\n SettingsPanelPresentation,\n} from '../dashboard/dashboard.presentation';\n\n// All presentations collection\nexport const SaasBoilerplatePresentations = {\n // Billing\n SubscriptionPresentation: undefined,\n UsageDashboardPresentation: undefined,\n\n // Project\n ProjectListPresentation: undefined,\n ProjectDetailPresentation: undefined,\n\n // Dashboard\n SaasDashboardPresentation: undefined,\n SettingsPanelPresentation: undefined,\n};\n"],"mappings":";;;;;AAuBA,MAAa,+BAA+B;CAE1C,0BAA0B;CAC1B,4BAA4B;CAG5B,yBAAyB;CACzB,2BAA2B;CAG3B,2BAA2B;CAC3B,2BAA2B;CAC5B"}
@@ -0,0 +1,8 @@
1
+ import { CreateProjectInput, ListProjectsInput, ListProjectsOutput, Project, UpdateProjectInput, mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockListProjectsHandler, mockUpdateProjectHandler } from "./project.handler.js";
2
+ import { ProjectStatusFilterEnum, ProjectStatusSchemaEnum } from "./project.enum.js";
3
+ import { CreateProjectInputModel, DeleteProjectInputModel, DeleteProjectOutputModel, GetProjectInputModel, ListProjectsInputModel, ListProjectsOutputModel, ProjectDeletedPayloadModel, ProjectModel, UpdateProjectInputModel } from "./project.schema.js";
4
+ import { CreateProjectContract, DeleteProjectContract, GetProjectContract, ListProjectsContract, UpdateProjectContract } from "./project.operations.js";
5
+ import { ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectUpdatedEvent } from "./project.event.js";
6
+ import { ProjectEntity, ProjectMemberEntity, ProjectStatusEnum } from "./project.entity.js";
7
+ import { ProjectDetailPresentation, ProjectListPresentation } from "./project.presentation.js";
8
+ export { CreateProjectContract, type CreateProjectInput, CreateProjectInputModel, DeleteProjectContract, DeleteProjectInputModel, DeleteProjectOutputModel, GetProjectContract, GetProjectInputModel, ListProjectsContract, type ListProjectsInput, ListProjectsInputModel, type ListProjectsOutput, ListProjectsOutputModel, type Project, ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectDeletedPayloadModel, ProjectDetailPresentation, ProjectEntity, ProjectListPresentation, ProjectMemberEntity, ProjectModel, ProjectStatusEnum, ProjectStatusFilterEnum, ProjectStatusSchemaEnum, ProjectUpdatedEvent, UpdateProjectContract, type UpdateProjectInput, UpdateProjectInputModel, mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockListProjectsHandler, mockUpdateProjectHandler };
@@ -0,0 +1,9 @@
1
+ import { ProjectStatusFilterEnum, ProjectStatusSchemaEnum } from "./project.enum.js";
2
+ import { CreateProjectInputModel, DeleteProjectInputModel, DeleteProjectOutputModel, GetProjectInputModel, ListProjectsInputModel, ListProjectsOutputModel, ProjectDeletedPayloadModel, ProjectModel, UpdateProjectInputModel } from "./project.schema.js";
3
+ import { CreateProjectContract, DeleteProjectContract, GetProjectContract, ListProjectsContract, UpdateProjectContract } from "./project.operations.js";
4
+ import { ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectUpdatedEvent } from "./project.event.js";
5
+ import { ProjectEntity, ProjectMemberEntity, ProjectStatusEnum } from "./project.entity.js";
6
+ import { ProjectDetailPresentation, ProjectListPresentation } from "./project.presentation.js";
7
+ import { mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockListProjectsHandler, mockUpdateProjectHandler } from "./project.handler.js";
8
+
9
+ export { CreateProjectContract, CreateProjectInputModel, DeleteProjectContract, DeleteProjectInputModel, DeleteProjectOutputModel, GetProjectContract, GetProjectInputModel, ListProjectsContract, ListProjectsInputModel, ListProjectsOutputModel, ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectDeletedPayloadModel, ProjectDetailPresentation, ProjectEntity, ProjectListPresentation, ProjectMemberEntity, ProjectModel, ProjectStatusEnum, ProjectStatusFilterEnum, ProjectStatusSchemaEnum, ProjectUpdatedEvent, UpdateProjectContract, UpdateProjectInputModel, mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockListProjectsHandler, mockUpdateProjectHandler };
@@ -0,0 +1,40 @@
1
+ import * as _contractspec_lib_schema92 from "@contractspec/lib.schema";
2
+
3
+ //#region src/project/project.entity.d.ts
4
+ /**
5
+ * Project status enum for entities.
6
+ */
7
+ declare const ProjectStatusEnum: _contractspec_lib_schema92.EntityEnumDef;
8
+ /**
9
+ * Project entity - team-scoped work container.
10
+ */
11
+ declare const ProjectEntity: _contractspec_lib_schema92.EntitySpec<{
12
+ id: _contractspec_lib_schema92.EntityScalarField;
13
+ name: _contractspec_lib_schema92.EntityScalarField;
14
+ description: _contractspec_lib_schema92.EntityScalarField;
15
+ slug: _contractspec_lib_schema92.EntityScalarField;
16
+ organizationId: _contractspec_lib_schema92.EntityScalarField;
17
+ createdBy: _contractspec_lib_schema92.EntityScalarField;
18
+ status: _contractspec_lib_schema92.EntityEnumField;
19
+ isPublic: _contractspec_lib_schema92.EntityScalarField;
20
+ settings: _contractspec_lib_schema92.EntityScalarField;
21
+ tags: _contractspec_lib_schema92.EntityScalarField;
22
+ metadata: _contractspec_lib_schema92.EntityScalarField;
23
+ createdAt: _contractspec_lib_schema92.EntityScalarField;
24
+ updatedAt: _contractspec_lib_schema92.EntityScalarField;
25
+ archivedAt: _contractspec_lib_schema92.EntityScalarField;
26
+ }>;
27
+ /**
28
+ * ProjectMember entity - project-level access.
29
+ */
30
+ declare const ProjectMemberEntity: _contractspec_lib_schema92.EntitySpec<{
31
+ id: _contractspec_lib_schema92.EntityScalarField;
32
+ projectId: _contractspec_lib_schema92.EntityScalarField;
33
+ userId: _contractspec_lib_schema92.EntityScalarField;
34
+ role: _contractspec_lib_schema92.EntityScalarField;
35
+ addedBy: _contractspec_lib_schema92.EntityScalarField;
36
+ createdAt: _contractspec_lib_schema92.EntityScalarField;
37
+ }>;
38
+ //#endregion
39
+ export { ProjectEntity, ProjectMemberEntity, ProjectStatusEnum };
40
+ //# sourceMappingURL=project.entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.entity.d.ts","names":[],"sources":["../../src/project/project.entity.ts"],"sourcesContent":[],"mappings":";;;;;;AAUa,cAAA,iBAKX,EAAA,0BAAA,CAL4B,aAK5B;AAKF;;;cAAa,0CAAa;MAmDxB,0BAAA,CAAA;;;;;;;;;;;yDAnDwB;EAAA,SAAA,8CAAA;EAwDb,UAAA,8CAgBX;CAAA,CAAA;;;;cAhBW,gDAAmB;MAgB9B,0BAAA,CAAA;yDAhB8B;EAAA,MAAA,8CAAA"}
@@ -0,0 +1,85 @@
1
+ import { defineEntity, defineEntityEnum, field, index } from "@contractspec/lib.schema";
2
+
3
+ //#region src/project/project.entity.ts
4
+ /**
5
+ * Project status enum for entities.
6
+ */
7
+ const ProjectStatusEnum = defineEntityEnum({
8
+ name: "ProjectStatus",
9
+ values: [
10
+ "DRAFT",
11
+ "ACTIVE",
12
+ "ARCHIVED",
13
+ "DELETED"
14
+ ],
15
+ schema: "saas_app",
16
+ description: "Status of a project."
17
+ });
18
+ /**
19
+ * Project entity - team-scoped work container.
20
+ */
21
+ const ProjectEntity = defineEntity({
22
+ name: "Project",
23
+ description: "A project belonging to an organization.",
24
+ schema: "saas_app",
25
+ map: "project",
26
+ fields: {
27
+ id: field.id({ description: "Unique project ID" }),
28
+ name: field.string({ description: "Project name" }),
29
+ description: field.string({
30
+ isOptional: true,
31
+ description: "Project description"
32
+ }),
33
+ slug: field.string({
34
+ isOptional: true,
35
+ description: "URL-friendly identifier"
36
+ }),
37
+ organizationId: field.foreignKey({ description: "Owning organization" }),
38
+ createdBy: field.foreignKey({ description: "User who created the project" }),
39
+ status: field.enum("ProjectStatus", { default: "DRAFT" }),
40
+ isPublic: field.boolean({
41
+ default: false,
42
+ description: "Whether project is publicly visible"
43
+ }),
44
+ settings: field.json({
45
+ isOptional: true,
46
+ description: "Project-specific settings"
47
+ }),
48
+ tags: field.string({
49
+ isArray: true,
50
+ description: "Project tags"
51
+ }),
52
+ metadata: field.json({ isOptional: true }),
53
+ createdAt: field.createdAt(),
54
+ updatedAt: field.updatedAt(),
55
+ archivedAt: field.dateTime({ isOptional: true })
56
+ },
57
+ indexes: [
58
+ index.on(["organizationId", "status"]),
59
+ index.on(["organizationId", "createdAt"]),
60
+ index.unique(["organizationId", "slug"])
61
+ ],
62
+ enums: [ProjectStatusEnum]
63
+ });
64
+ /**
65
+ * ProjectMember entity - project-level access.
66
+ */
67
+ const ProjectMemberEntity = defineEntity({
68
+ name: "ProjectMember",
69
+ description: "User access to a specific project.",
70
+ schema: "saas_app",
71
+ map: "project_member",
72
+ fields: {
73
+ id: field.id(),
74
+ projectId: field.foreignKey(),
75
+ userId: field.foreignKey(),
76
+ role: field.string({ description: "Role in project (owner, editor, viewer)" }),
77
+ addedBy: field.string({ isOptional: true }),
78
+ createdAt: field.createdAt()
79
+ },
80
+ indexes: [index.unique(["projectId", "userId"])]
81
+ });
82
+
83
+ //#endregion
84
+ export { ProjectEntity, ProjectMemberEntity, ProjectStatusEnum };
85
+ //# sourceMappingURL=project.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.entity.js","names":[],"sources":["../../src/project/project.entity.ts"],"sourcesContent":["import {\n defineEntity,\n defineEntityEnum,\n field,\n index,\n} from '@contractspec/lib.schema';\n\n/**\n * Project status enum for entities.\n */\nexport const ProjectStatusEnum = defineEntityEnum({\n name: 'ProjectStatus',\n values: ['DRAFT', 'ACTIVE', 'ARCHIVED', 'DELETED'] as const,\n schema: 'saas_app',\n description: 'Status of a project.',\n});\n\n/**\n * Project entity - team-scoped work container.\n */\nexport const ProjectEntity = defineEntity({\n name: 'Project',\n description: 'A project belonging to an organization.',\n schema: 'saas_app',\n map: 'project',\n fields: {\n id: field.id({ description: 'Unique project ID' }),\n name: field.string({ description: 'Project name' }),\n description: field.string({\n isOptional: true,\n description: 'Project description',\n }),\n slug: field.string({\n isOptional: true,\n description: 'URL-friendly identifier',\n }),\n\n // Ownership\n organizationId: field.foreignKey({ description: 'Owning organization' }),\n createdBy: field.foreignKey({\n description: 'User who created the project',\n }),\n\n // Status\n status: field.enum('ProjectStatus', { default: 'DRAFT' }),\n\n // Settings\n isPublic: field.boolean({\n default: false,\n description: 'Whether project is publicly visible',\n }),\n settings: field.json({\n isOptional: true,\n description: 'Project-specific settings',\n }),\n\n // Metadata\n tags: field.string({ isArray: true, description: 'Project tags' }),\n metadata: field.json({ isOptional: true }),\n\n // Timestamps\n createdAt: field.createdAt(),\n updatedAt: field.updatedAt(),\n archivedAt: field.dateTime({ isOptional: true }),\n },\n indexes: [\n index.on(['organizationId', 'status']),\n index.on(['organizationId', 'createdAt']),\n index.unique(['organizationId', 'slug']),\n ],\n enums: [ProjectStatusEnum],\n});\n\n/**\n * ProjectMember entity - project-level access.\n */\nexport const ProjectMemberEntity = defineEntity({\n name: 'ProjectMember',\n description: 'User access to a specific project.',\n schema: 'saas_app',\n map: 'project_member',\n fields: {\n id: field.id(),\n projectId: field.foreignKey(),\n userId: field.foreignKey(),\n role: field.string({\n description: 'Role in project (owner, editor, viewer)',\n }),\n addedBy: field.string({ isOptional: true }),\n createdAt: field.createdAt(),\n },\n indexes: [index.unique(['projectId', 'userId'])],\n});\n"],"mappings":";;;;;;AAUA,MAAa,oBAAoB,iBAAiB;CAChD,MAAM;CACN,QAAQ;EAAC;EAAS;EAAU;EAAY;EAAU;CAClD,QAAQ;CACR,aAAa;CACd,CAAC;;;;AAKF,MAAa,gBAAgB,aAAa;CACxC,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,GAAG,EAAE,aAAa,qBAAqB,CAAC;EAClD,MAAM,MAAM,OAAO,EAAE,aAAa,gBAAgB,CAAC;EACnD,aAAa,MAAM,OAAO;GACxB,YAAY;GACZ,aAAa;GACd,CAAC;EACF,MAAM,MAAM,OAAO;GACjB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,gBAAgB,MAAM,WAAW,EAAE,aAAa,uBAAuB,CAAC;EACxE,WAAW,MAAM,WAAW,EAC1B,aAAa,gCACd,CAAC;EAGF,QAAQ,MAAM,KAAK,iBAAiB,EAAE,SAAS,SAAS,CAAC;EAGzD,UAAU,MAAM,QAAQ;GACtB,SAAS;GACT,aAAa;GACd,CAAC;EACF,UAAU,MAAM,KAAK;GACnB,YAAY;GACZ,aAAa;GACd,CAAC;EAGF,MAAM,MAAM,OAAO;GAAE,SAAS;GAAM,aAAa;GAAgB,CAAC;EAClE,UAAU,MAAM,KAAK,EAAE,YAAY,MAAM,CAAC;EAG1C,WAAW,MAAM,WAAW;EAC5B,WAAW,MAAM,WAAW;EAC5B,YAAY,MAAM,SAAS,EAAE,YAAY,MAAM,CAAC;EACjD;CACD,SAAS;EACP,MAAM,GAAG,CAAC,kBAAkB,SAAS,CAAC;EACtC,MAAM,GAAG,CAAC,kBAAkB,YAAY,CAAC;EACzC,MAAM,OAAO,CAAC,kBAAkB,OAAO,CAAC;EACzC;CACD,OAAO,CAAC,kBAAkB;CAC3B,CAAC;;;;AAKF,MAAa,sBAAsB,aAAa;CAC9C,MAAM;CACN,aAAa;CACb,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,IAAI,MAAM,IAAI;EACd,WAAW,MAAM,YAAY;EAC7B,QAAQ,MAAM,YAAY;EAC1B,MAAM,MAAM,OAAO,EACjB,aAAa,2CACd,CAAC;EACF,SAAS,MAAM,OAAO,EAAE,YAAY,MAAM,CAAC;EAC3C,WAAW,MAAM,WAAW;EAC7B;CACD,SAAS,CAAC,MAAM,OAAO,CAAC,aAAa,SAAS,CAAC,CAAC;CACjD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import * as _contractspec_lib_schema138 from "@contractspec/lib.schema";
2
+
3
+ //#region src/project/project.enum.d.ts
4
+
5
+ /**
6
+ * Project status enum for contract schemas.
7
+ * Note: Entity enum is defined separately in project.entity.ts
8
+ */
9
+ declare const ProjectStatusSchemaEnum: _contractspec_lib_schema138.EnumType<[string, string, string, string]>;
10
+ /**
11
+ * Project status filter enum (includes 'all' option).
12
+ */
13
+ declare const ProjectStatusFilterEnum: _contractspec_lib_schema138.EnumType<[string, string, string, string]>;
14
+ //#endregion
15
+ export { ProjectStatusFilterEnum, ProjectStatusSchemaEnum };
16
+ //# sourceMappingURL=project.enum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.enum.d.ts","names":[],"sources":["../../src/project/project.enum.ts"],"sourcesContent":[],"mappings":";;;;;;;AAMA;AAUa,cAVA,uBAeX,EAVA,2BAAA,CALkC,QAUA,CAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,CAAA,CAAA;;;;cAAvB,yBAKX,2BAAA,CALkC"}
@@ -0,0 +1,26 @@
1
+ import { defineEnum } from "@contractspec/lib.schema";
2
+
3
+ //#region src/project/project.enum.ts
4
+ /**
5
+ * Project status enum for contract schemas.
6
+ * Note: Entity enum is defined separately in project.entity.ts
7
+ */
8
+ const ProjectStatusSchemaEnum = defineEnum("ProjectStatus", [
9
+ "DRAFT",
10
+ "ACTIVE",
11
+ "ARCHIVED",
12
+ "DELETED"
13
+ ]);
14
+ /**
15
+ * Project status filter enum (includes 'all' option).
16
+ */
17
+ const ProjectStatusFilterEnum = defineEnum("ProjectStatusFilter", [
18
+ "DRAFT",
19
+ "ACTIVE",
20
+ "ARCHIVED",
21
+ "all"
22
+ ]);
23
+
24
+ //#endregion
25
+ export { ProjectStatusFilterEnum, ProjectStatusSchemaEnum };
26
+ //# sourceMappingURL=project.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.enum.js","names":[],"sources":["../../src/project/project.enum.ts"],"sourcesContent":["import { defineEnum } from '@contractspec/lib.schema';\n\n/**\n * Project status enum for contract schemas.\n * Note: Entity enum is defined separately in project.entity.ts\n */\nexport const ProjectStatusSchemaEnum = defineEnum('ProjectStatus', [\n 'DRAFT',\n 'ACTIVE',\n 'ARCHIVED',\n 'DELETED',\n]);\n\n/**\n * Project status filter enum (includes 'all' option).\n */\nexport const ProjectStatusFilterEnum = defineEnum('ProjectStatusFilter', [\n 'DRAFT',\n 'ACTIVE',\n 'ARCHIVED',\n 'all',\n]);\n"],"mappings":";;;;;;;AAMA,MAAa,0BAA0B,WAAW,iBAAiB;CACjE;CACA;CACA;CACA;CACD,CAAC;;;;AAKF,MAAa,0BAA0B,WAAW,uBAAuB;CACvE;CACA;CACA;CACA;CACD,CAAC"}