@contractspec/example.saas-boilerplate 3.7.6 → 3.8.2

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 (143) hide show
  1. package/.turbo/turbo-build.log +39 -27
  2. package/AGENTS.md +50 -27
  3. package/CHANGELOG.md +36 -0
  4. package/README.md +65 -144
  5. package/dist/billing/billing.event.js +1 -1
  6. package/dist/billing/index.d.ts +6 -6
  7. package/dist/billing/index.js +1 -1
  8. package/dist/browser/billing/billing.event.js +1 -1
  9. package/dist/browser/billing/index.js +1 -1
  10. package/dist/browser/index.js +1147 -869
  11. package/dist/browser/project/index.js +209 -209
  12. package/dist/browser/project/project.event.js +1 -1
  13. package/dist/browser/saas-boilerplate.feature.js +208 -0
  14. package/dist/browser/ui/SaasDashboard.js +356 -105
  15. package/dist/browser/ui/SaasDashboard.visualizations.js +249 -0
  16. package/dist/browser/ui/SaasProjectList.js +7 -7
  17. package/dist/browser/ui/SaasSettingsPanel.js +12 -12
  18. package/dist/browser/ui/hooks/index.js +2 -2
  19. package/dist/browser/ui/hooks/useProjectList.js +1 -1
  20. package/dist/browser/ui/hooks/useProjectMutations.js +1 -1
  21. package/dist/browser/ui/index.js +790 -521
  22. package/dist/browser/ui/modals/CreateProjectModal.js +10 -10
  23. package/dist/browser/ui/modals/ProjectActionsModal.js +13 -13
  24. package/dist/browser/ui/modals/index.js +23 -23
  25. package/dist/browser/ui/renderers/index.js +341 -115
  26. package/dist/browser/ui/renderers/project-list.markdown.js +229 -3
  27. package/dist/browser/ui/renderers/project-list.renderer.js +7 -7
  28. package/dist/browser/visualizations/catalog.js +155 -0
  29. package/dist/browser/visualizations/index.js +217 -0
  30. package/dist/browser/visualizations/selectors.js +210 -0
  31. package/dist/handlers/index.d.ts +2 -2
  32. package/dist/index.d.ts +5 -4
  33. package/dist/index.js +1147 -869
  34. package/dist/node/billing/billing.event.js +1 -1
  35. package/dist/node/billing/index.js +1 -1
  36. package/dist/node/index.js +1147 -869
  37. package/dist/node/project/index.js +209 -209
  38. package/dist/node/project/project.event.js +1 -1
  39. package/dist/node/saas-boilerplate.feature.js +208 -0
  40. package/dist/node/ui/SaasDashboard.js +356 -105
  41. package/dist/node/ui/SaasDashboard.visualizations.js +249 -0
  42. package/dist/node/ui/SaasProjectList.js +7 -7
  43. package/dist/node/ui/SaasSettingsPanel.js +12 -12
  44. package/dist/node/ui/hooks/index.js +2 -2
  45. package/dist/node/ui/hooks/useProjectList.js +1 -1
  46. package/dist/node/ui/hooks/useProjectMutations.js +1 -1
  47. package/dist/node/ui/index.js +790 -521
  48. package/dist/node/ui/modals/CreateProjectModal.js +10 -10
  49. package/dist/node/ui/modals/ProjectActionsModal.js +13 -13
  50. package/dist/node/ui/modals/index.js +23 -23
  51. package/dist/node/ui/renderers/index.js +341 -115
  52. package/dist/node/ui/renderers/project-list.markdown.js +229 -3
  53. package/dist/node/ui/renderers/project-list.renderer.js +7 -7
  54. package/dist/node/visualizations/catalog.js +155 -0
  55. package/dist/node/visualizations/index.js +217 -0
  56. package/dist/node/visualizations/selectors.js +210 -0
  57. package/dist/presentations/index.d.ts +1 -1
  58. package/dist/project/index.d.ts +7 -7
  59. package/dist/project/index.js +209 -209
  60. package/dist/project/project.event.js +1 -1
  61. package/dist/saas-boilerplate.feature.js +208 -0
  62. package/dist/settings/index.d.ts +1 -1
  63. package/dist/ui/SaasDashboard.js +356 -105
  64. package/dist/ui/SaasDashboard.visualizations.d.ts +5 -0
  65. package/dist/ui/SaasDashboard.visualizations.js +250 -0
  66. package/dist/ui/SaasProjectList.js +7 -7
  67. package/dist/ui/SaasSettingsPanel.js +12 -12
  68. package/dist/ui/hooks/index.d.ts +2 -2
  69. package/dist/ui/hooks/index.js +2 -2
  70. package/dist/ui/hooks/useProjectList.d.ts +5 -0
  71. package/dist/ui/hooks/useProjectList.js +1 -1
  72. package/dist/ui/hooks/useProjectMutations.d.ts +8 -0
  73. package/dist/ui/hooks/useProjectMutations.js +1 -1
  74. package/dist/ui/index.d.ts +4 -4
  75. package/dist/ui/index.js +790 -521
  76. package/dist/ui/modals/CreateProjectModal.js +10 -10
  77. package/dist/ui/modals/ProjectActionsModal.js +13 -13
  78. package/dist/ui/modals/index.js +23 -23
  79. package/dist/ui/renderers/index.d.ts +1 -1
  80. package/dist/ui/renderers/index.js +341 -115
  81. package/dist/ui/renderers/project-list.markdown.js +229 -3
  82. package/dist/ui/renderers/project-list.renderer.d.ts +1 -1
  83. package/dist/ui/renderers/project-list.renderer.js +7 -7
  84. package/dist/visualizations/catalog.d.ts +11 -0
  85. package/dist/visualizations/catalog.js +156 -0
  86. package/dist/visualizations/index.d.ts +2 -0
  87. package/dist/visualizations/index.js +218 -0
  88. package/dist/visualizations/selectors.d.ts +8 -0
  89. package/dist/visualizations/selectors.js +211 -0
  90. package/dist/visualizations/selectors.test.d.ts +1 -0
  91. package/package.json +70 -14
  92. package/src/billing/billing.entity.ts +132 -132
  93. package/src/billing/billing.enum.ts +9 -9
  94. package/src/billing/billing.event.ts +71 -71
  95. package/src/billing/billing.handler.ts +87 -87
  96. package/src/billing/billing.operations.ts +158 -158
  97. package/src/billing/billing.presentation.ts +45 -45
  98. package/src/billing/billing.schema.ts +76 -76
  99. package/src/billing/index.ts +43 -48
  100. package/src/dashboard/dashboard.presentation.ts +45 -45
  101. package/src/dashboard/index.ts +2 -2
  102. package/src/docs/saas-boilerplate.docblock.ts +43 -43
  103. package/src/example.ts +32 -32
  104. package/src/handlers/index.ts +9 -9
  105. package/src/handlers/saas.handlers.ts +250 -249
  106. package/src/index.ts +41 -41
  107. package/src/presentations/index.ts +18 -20
  108. package/src/project/index.ts +45 -50
  109. package/src/project/project.entity.ts +68 -68
  110. package/src/project/project.enum.ts +8 -8
  111. package/src/project/project.event.ts +79 -79
  112. package/src/project/project.handler.ts +103 -103
  113. package/src/project/project.operations.ts +236 -236
  114. package/src/project/project.presentation.ts +46 -46
  115. package/src/project/project.schema.ts +90 -90
  116. package/src/saas-boilerplate.feature.ts +103 -100
  117. package/src/seeders/index.ts +20 -20
  118. package/src/settings/index.ts +2 -3
  119. package/src/settings/settings.entity.ts +65 -65
  120. package/src/settings/settings.enum.ts +4 -4
  121. package/src/shared/mock-data.ts +92 -92
  122. package/src/shared/overlay-types.ts +23 -23
  123. package/src/tests/operations.test-spec.ts +96 -96
  124. package/src/ui/SaasDashboard.tsx +278 -270
  125. package/src/ui/SaasDashboard.visualizations.tsx +41 -0
  126. package/src/ui/SaasProjectList.tsx +90 -90
  127. package/src/ui/SaasSettingsPanel.tsx +84 -84
  128. package/src/ui/hooks/index.ts +3 -3
  129. package/src/ui/hooks/useProjectList.ts +69 -68
  130. package/src/ui/hooks/useProjectMutations.ts +144 -143
  131. package/src/ui/index.ts +8 -12
  132. package/src/ui/modals/CreateProjectModal.tsx +154 -154
  133. package/src/ui/modals/ProjectActionsModal.tsx +321 -321
  134. package/src/ui/overlays/demo-overlays.ts +49 -49
  135. package/src/ui/renderers/index.ts +5 -4
  136. package/src/ui/renderers/project-list.markdown.ts +229 -205
  137. package/src/ui/renderers/project-list.renderer.tsx +14 -13
  138. package/src/visualizations/catalog.ts +153 -0
  139. package/src/visualizations/index.ts +2 -0
  140. package/src/visualizations/selectors.test.ts +25 -0
  141. package/src/visualizations/selectors.ts +85 -0
  142. package/tsconfig.json +7 -8
  143. package/tsdown.config.js +7 -3
@@ -1,17 +1,17 @@
1
1
  import {
2
- defineCommand,
3
- defineQuery,
2
+ defineCommand,
3
+ defineQuery,
4
4
  } from '@contractspec/lib.contracts-spec/operations';
5
5
  import {
6
- CreateProjectInputModel,
7
- DeleteProjectInputModel,
8
- DeleteProjectOutputModel,
9
- GetProjectInputModel,
10
- ListProjectsInputModel,
11
- ListProjectsOutputModel,
12
- ProjectDeletedPayloadModel,
13
- ProjectModel,
14
- UpdateProjectInputModel,
6
+ CreateProjectInputModel,
7
+ DeleteProjectInputModel,
8
+ DeleteProjectOutputModel,
9
+ GetProjectInputModel,
10
+ ListProjectsInputModel,
11
+ ListProjectsOutputModel,
12
+ ProjectDeletedPayloadModel,
13
+ ProjectModel,
14
+ UpdateProjectInputModel,
15
15
  } from './project.schema';
16
16
 
17
17
  const OWNERS = ['example.saas-boilerplate'] as const;
@@ -20,253 +20,253 @@ const OWNERS = ['example.saas-boilerplate'] as const;
20
20
  * Create a new project.
21
21
  */
22
22
  export const CreateProjectContract = defineCommand({
23
- meta: {
24
- key: 'saas.project.create',
25
- version: '1.0.0',
26
- stability: 'stable',
27
- owners: [...OWNERS],
28
- tags: ['saas', 'project', 'create'],
29
- description: 'Create a new project in the organization.',
30
- goal: 'Allow users to create projects for organizing work.',
31
- context: 'Called from project creation UI or API.',
32
- },
33
- io: {
34
- input: CreateProjectInputModel,
35
- output: ProjectModel,
36
- errors: {
37
- SLUG_EXISTS: {
38
- description: 'A project with this slug already exists',
39
- http: 409,
40
- gqlCode: 'SLUG_EXISTS',
41
- when: 'Slug is already taken in the organization',
42
- },
43
- LIMIT_REACHED: {
44
- description: 'Project limit reached for this plan',
45
- http: 403,
46
- gqlCode: 'LIMIT_REACHED',
47
- when: 'Organization has reached project limit',
48
- },
49
- },
50
- },
51
- policy: {
52
- auth: 'user',
53
- },
54
- sideEffects: {
55
- emits: [
56
- {
57
- key: 'project.created',
58
- version: '1.0.0',
59
- when: 'Project is created',
60
- payload: ProjectModel,
61
- },
62
- ],
63
- audit: ['project.created'],
64
- },
65
- acceptance: {
66
- scenarios: [
67
- {
68
- key: 'create-project-happy-path',
69
- given: ['User is authenticated'],
70
- when: ['User creates project'],
71
- then: ['Project is created', 'ProjectCreated event is emitted'],
72
- },
73
- ],
74
- examples: [
75
- {
76
- key: 'create-basic',
77
- input: { name: 'Website Redesign', slug: 'website-redesign' },
78
- output: { id: 'proj-123', name: 'Website Redesign', isArchived: false },
79
- },
80
- ],
81
- },
23
+ meta: {
24
+ key: 'saas.project.create',
25
+ version: '1.0.0',
26
+ stability: 'stable',
27
+ owners: [...OWNERS],
28
+ tags: ['saas', 'project', 'create'],
29
+ description: 'Create a new project in the organization.',
30
+ goal: 'Allow users to create projects for organizing work.',
31
+ context: 'Called from project creation UI or API.',
32
+ },
33
+ io: {
34
+ input: CreateProjectInputModel,
35
+ output: ProjectModel,
36
+ errors: {
37
+ SLUG_EXISTS: {
38
+ description: 'A project with this slug already exists',
39
+ http: 409,
40
+ gqlCode: 'SLUG_EXISTS',
41
+ when: 'Slug is already taken in the organization',
42
+ },
43
+ LIMIT_REACHED: {
44
+ description: 'Project limit reached for this plan',
45
+ http: 403,
46
+ gqlCode: 'LIMIT_REACHED',
47
+ when: 'Organization has reached project limit',
48
+ },
49
+ },
50
+ },
51
+ policy: {
52
+ auth: 'user',
53
+ },
54
+ sideEffects: {
55
+ emits: [
56
+ {
57
+ key: 'project.created',
58
+ version: '1.0.0',
59
+ when: 'Project is created',
60
+ payload: ProjectModel,
61
+ },
62
+ ],
63
+ audit: ['project.created'],
64
+ },
65
+ acceptance: {
66
+ scenarios: [
67
+ {
68
+ key: 'create-project-happy-path',
69
+ given: ['User is authenticated'],
70
+ when: ['User creates project'],
71
+ then: ['Project is created', 'ProjectCreated event is emitted'],
72
+ },
73
+ ],
74
+ examples: [
75
+ {
76
+ key: 'create-basic',
77
+ input: { name: 'Website Redesign', slug: 'website-redesign' },
78
+ output: { id: 'proj-123', name: 'Website Redesign', isArchived: false },
79
+ },
80
+ ],
81
+ },
82
82
  });
83
83
 
84
84
  /**
85
85
  * Get project by ID.
86
86
  */
87
87
  export const GetProjectContract = defineQuery({
88
- meta: {
89
- key: 'saas.project.get',
90
- version: '1.0.0',
91
- stability: 'stable',
92
- owners: [...OWNERS],
93
- tags: ['saas', 'project', 'get'],
94
- description: 'Get a project by ID.',
95
- goal: 'Retrieve project details.',
96
- context: 'Project detail page, API calls.',
97
- },
98
- io: {
99
- input: GetProjectInputModel,
100
- output: ProjectModel,
101
- errors: {
102
- NOT_FOUND: {
103
- description: 'Project not found',
104
- http: 404,
105
- gqlCode: 'NOT_FOUND',
106
- when: 'Project ID is invalid or user lacks access',
107
- },
108
- },
109
- },
110
- policy: {
111
- auth: 'user',
112
- },
113
- acceptance: {
114
- scenarios: [
115
- {
116
- key: 'get-project-happy-path',
117
- given: ['Project exists'],
118
- when: ['User requests project'],
119
- then: ['Project details are returned'],
120
- },
121
- ],
122
- examples: [
123
- {
124
- key: 'get-existing',
125
- input: { projectId: 'proj-123' },
126
- output: { id: 'proj-123', name: 'Website Redesign' },
127
- },
128
- ],
129
- },
88
+ meta: {
89
+ key: 'saas.project.get',
90
+ version: '1.0.0',
91
+ stability: 'stable',
92
+ owners: [...OWNERS],
93
+ tags: ['saas', 'project', 'get'],
94
+ description: 'Get a project by ID.',
95
+ goal: 'Retrieve project details.',
96
+ context: 'Project detail page, API calls.',
97
+ },
98
+ io: {
99
+ input: GetProjectInputModel,
100
+ output: ProjectModel,
101
+ errors: {
102
+ NOT_FOUND: {
103
+ description: 'Project not found',
104
+ http: 404,
105
+ gqlCode: 'NOT_FOUND',
106
+ when: 'Project ID is invalid or user lacks access',
107
+ },
108
+ },
109
+ },
110
+ policy: {
111
+ auth: 'user',
112
+ },
113
+ acceptance: {
114
+ scenarios: [
115
+ {
116
+ key: 'get-project-happy-path',
117
+ given: ['Project exists'],
118
+ when: ['User requests project'],
119
+ then: ['Project details are returned'],
120
+ },
121
+ ],
122
+ examples: [
123
+ {
124
+ key: 'get-existing',
125
+ input: { projectId: 'proj-123' },
126
+ output: { id: 'proj-123', name: 'Website Redesign' },
127
+ },
128
+ ],
129
+ },
130
130
  });
131
131
 
132
132
  /**
133
133
  * Update a project.
134
134
  */
135
135
  export const UpdateProjectContract = defineCommand({
136
- meta: {
137
- key: 'saas.project.update',
138
- version: '1.0.0',
139
- stability: 'stable',
140
- owners: [...OWNERS],
141
- tags: ['saas', 'project', 'update'],
142
- description: 'Update project details.',
143
- goal: 'Allow project owners/editors to modify project.',
144
- context: 'Project settings page.',
145
- },
146
- io: {
147
- input: UpdateProjectInputModel,
148
- output: ProjectModel,
149
- },
150
- policy: {
151
- auth: 'user',
152
- },
153
- sideEffects: {
154
- emits: [
155
- {
156
- key: 'project.updated',
157
- version: '1.0.0',
158
- when: 'Project is updated',
159
- payload: ProjectModel,
160
- },
161
- ],
162
- audit: ['project.updated'],
163
- },
164
- acceptance: {
165
- scenarios: [
166
- {
167
- key: 'update-project-happy-path',
168
- given: ['Project exists'],
169
- when: ['User updates description'],
170
- then: ['Project is updated', 'ProjectUpdated event is emitted'],
171
- },
172
- ],
173
- examples: [
174
- {
175
- key: 'update-desc',
176
- input: { projectId: 'proj-123', description: 'New description' },
177
- output: { id: 'proj-123', description: 'New description' },
178
- },
179
- ],
180
- },
136
+ meta: {
137
+ key: 'saas.project.update',
138
+ version: '1.0.0',
139
+ stability: 'stable',
140
+ owners: [...OWNERS],
141
+ tags: ['saas', 'project', 'update'],
142
+ description: 'Update project details.',
143
+ goal: 'Allow project owners/editors to modify project.',
144
+ context: 'Project settings page.',
145
+ },
146
+ io: {
147
+ input: UpdateProjectInputModel,
148
+ output: ProjectModel,
149
+ },
150
+ policy: {
151
+ auth: 'user',
152
+ },
153
+ sideEffects: {
154
+ emits: [
155
+ {
156
+ key: 'project.updated',
157
+ version: '1.0.0',
158
+ when: 'Project is updated',
159
+ payload: ProjectModel,
160
+ },
161
+ ],
162
+ audit: ['project.updated'],
163
+ },
164
+ acceptance: {
165
+ scenarios: [
166
+ {
167
+ key: 'update-project-happy-path',
168
+ given: ['Project exists'],
169
+ when: ['User updates description'],
170
+ then: ['Project is updated', 'ProjectUpdated event is emitted'],
171
+ },
172
+ ],
173
+ examples: [
174
+ {
175
+ key: 'update-desc',
176
+ input: { projectId: 'proj-123', description: 'New description' },
177
+ output: { id: 'proj-123', description: 'New description' },
178
+ },
179
+ ],
180
+ },
181
181
  });
182
182
 
183
183
  /**
184
184
  * Delete a project.
185
185
  */
186
186
  export const DeleteProjectContract = defineCommand({
187
- meta: {
188
- key: 'saas.project.delete',
189
- version: '1.0.0',
190
- stability: 'stable',
191
- owners: [...OWNERS],
192
- tags: ['saas', 'project', 'delete'],
193
- description: 'Delete a project (soft delete).',
194
- goal: 'Allow project owners to remove projects.',
195
- context: 'Project settings page.',
196
- },
197
- io: {
198
- input: DeleteProjectInputModel,
199
- output: DeleteProjectOutputModel,
200
- },
201
- policy: {
202
- auth: 'user',
203
- },
204
- sideEffects: {
205
- emits: [
206
- {
207
- key: 'project.deleted',
208
- version: '1.0.0',
209
- when: 'Project is deleted',
210
- payload: ProjectDeletedPayloadModel,
211
- },
212
- ],
213
- audit: ['project.deleted'],
214
- },
215
- acceptance: {
216
- scenarios: [
217
- {
218
- key: 'delete-project-happy-path',
219
- given: ['Project exists'],
220
- when: ['User deletes project'],
221
- then: ['Project is deleted', 'ProjectDeleted event is emitted'],
222
- },
223
- ],
224
- examples: [
225
- {
226
- key: 'delete-existing',
227
- input: { projectId: 'proj-123' },
228
- output: { success: true },
229
- },
230
- ],
231
- },
187
+ meta: {
188
+ key: 'saas.project.delete',
189
+ version: '1.0.0',
190
+ stability: 'stable',
191
+ owners: [...OWNERS],
192
+ tags: ['saas', 'project', 'delete'],
193
+ description: 'Delete a project (soft delete).',
194
+ goal: 'Allow project owners to remove projects.',
195
+ context: 'Project settings page.',
196
+ },
197
+ io: {
198
+ input: DeleteProjectInputModel,
199
+ output: DeleteProjectOutputModel,
200
+ },
201
+ policy: {
202
+ auth: 'user',
203
+ },
204
+ sideEffects: {
205
+ emits: [
206
+ {
207
+ key: 'project.deleted',
208
+ version: '1.0.0',
209
+ when: 'Project is deleted',
210
+ payload: ProjectDeletedPayloadModel,
211
+ },
212
+ ],
213
+ audit: ['project.deleted'],
214
+ },
215
+ acceptance: {
216
+ scenarios: [
217
+ {
218
+ key: 'delete-project-happy-path',
219
+ given: ['Project exists'],
220
+ when: ['User deletes project'],
221
+ then: ['Project is deleted', 'ProjectDeleted event is emitted'],
222
+ },
223
+ ],
224
+ examples: [
225
+ {
226
+ key: 'delete-existing',
227
+ input: { projectId: 'proj-123' },
228
+ output: { success: true },
229
+ },
230
+ ],
231
+ },
232
232
  });
233
233
 
234
234
  /**
235
235
  * List organization projects.
236
236
  */
237
237
  export const ListProjectsContract = defineQuery({
238
- meta: {
239
- key: 'saas.project.list',
240
- version: '1.0.0',
241
- stability: 'stable',
242
- owners: [...OWNERS],
243
- tags: ['saas', 'project', 'list'],
244
- description: 'List projects in the organization.',
245
- goal: 'Show all projects user has access to.',
246
- context: 'Project list page, dashboard.',
247
- },
248
- io: {
249
- input: ListProjectsInputModel,
250
- output: ListProjectsOutputModel,
251
- },
252
- policy: {
253
- auth: 'user',
254
- },
255
- acceptance: {
256
- scenarios: [
257
- {
258
- key: 'list-projects-happy-path',
259
- given: ['Projects exist'],
260
- when: ['User lists projects'],
261
- then: ['List of projects is returned'],
262
- },
263
- ],
264
- examples: [
265
- {
266
- key: 'list-all',
267
- input: { limit: 10 },
268
- output: { items: [], total: 5 },
269
- },
270
- ],
271
- },
238
+ meta: {
239
+ key: 'saas.project.list',
240
+ version: '1.0.0',
241
+ stability: 'stable',
242
+ owners: [...OWNERS],
243
+ tags: ['saas', 'project', 'list'],
244
+ description: 'List projects in the organization.',
245
+ goal: 'Show all projects user has access to.',
246
+ context: 'Project list page, dashboard.',
247
+ },
248
+ io: {
249
+ input: ListProjectsInputModel,
250
+ output: ListProjectsOutputModel,
251
+ },
252
+ policy: {
253
+ auth: 'user',
254
+ },
255
+ acceptance: {
256
+ scenarios: [
257
+ {
258
+ key: 'list-projects-happy-path',
259
+ given: ['Projects exist'],
260
+ when: ['User lists projects'],
261
+ then: ['List of projects is returned'],
262
+ },
263
+ ],
264
+ examples: [
265
+ {
266
+ key: 'list-all',
267
+ input: { limit: 10 },
268
+ output: { items: [], total: 5 },
269
+ },
270
+ ],
271
+ },
272
272
  });
@@ -1,6 +1,6 @@
1
1
  import {
2
- definePresentation,
3
- StabilityEnum,
2
+ definePresentation,
3
+ StabilityEnum,
4
4
  } from '@contractspec/lib.contracts-spec';
5
5
  import { ProjectModel } from './project.schema';
6
6
 
@@ -8,54 +8,54 @@ import { ProjectModel } from './project.schema';
8
8
  * Presentation for displaying a list of projects.
9
9
  */
10
10
  export const ProjectListPresentation = definePresentation({
11
- meta: {
12
- key: 'saas.project.list',
13
- version: '1.0.0',
14
- title: 'Project List',
15
- description:
16
- 'List view of projects with status, tags, and last updated info',
17
- domain: 'saas-boilerplate',
18
- owners: ['@saas-team'],
19
- tags: ['project', 'list', 'dashboard'],
20
- stability: StabilityEnum.Beta,
21
- goal: 'Browse and manage projects',
22
- context: 'Project list page',
23
- },
24
- source: {
25
- type: 'component',
26
- framework: 'react',
27
- componentKey: 'ProjectListView',
28
- props: ProjectModel,
29
- },
30
- targets: ['react', 'markdown', 'application/json'],
31
- policy: {
32
- flags: ['saas.projects.enabled'],
33
- },
11
+ meta: {
12
+ key: 'saas.project.list',
13
+ version: '1.0.0',
14
+ title: 'Project List',
15
+ description:
16
+ 'List view of projects with status, tags, and last updated info',
17
+ domain: 'saas-boilerplate',
18
+ owners: ['@saas-team'],
19
+ tags: ['project', 'list', 'dashboard'],
20
+ stability: StabilityEnum.Beta,
21
+ goal: 'Browse and manage projects',
22
+ context: 'Project list page',
23
+ },
24
+ source: {
25
+ type: 'component',
26
+ framework: 'react',
27
+ componentKey: 'ProjectListView',
28
+ props: ProjectModel,
29
+ },
30
+ targets: ['react', 'markdown', 'application/json'],
31
+ policy: {
32
+ flags: ['saas.projects.enabled'],
33
+ },
34
34
  });
35
35
 
36
36
  /**
37
37
  * Presentation for project detail view.
38
38
  */
39
39
  export const ProjectDetailPresentation = definePresentation({
40
- meta: {
41
- key: 'saas.project.detail',
42
- version: '1.0.0',
43
- title: 'Project Details',
44
- description: 'Detailed view of a project with settings and activity',
45
- domain: 'saas-boilerplate',
46
- owners: ['@saas-team'],
47
- tags: ['project', 'detail'],
48
- stability: StabilityEnum.Beta,
49
- goal: 'View and edit project details',
50
- context: 'Project detail page',
51
- },
52
- source: {
53
- type: 'component',
54
- framework: 'react',
55
- componentKey: 'ProjectDetailView',
56
- },
57
- targets: ['react', 'markdown'],
58
- policy: {
59
- flags: ['saas.projects.enabled'],
60
- },
40
+ meta: {
41
+ key: 'saas.project.detail',
42
+ version: '1.0.0',
43
+ title: 'Project Details',
44
+ description: 'Detailed view of a project with settings and activity',
45
+ domain: 'saas-boilerplate',
46
+ owners: ['@saas-team'],
47
+ tags: ['project', 'detail'],
48
+ stability: StabilityEnum.Beta,
49
+ goal: 'View and edit project details',
50
+ context: 'Project detail page',
51
+ },
52
+ source: {
53
+ type: 'component',
54
+ framework: 'react',
55
+ componentKey: 'ProjectDetailView',
56
+ },
57
+ targets: ['react', 'markdown'],
58
+ policy: {
59
+ flags: ['saas.projects.enabled'],
60
+ },
61
61
  });