@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.
- package/.turbo/turbo-build$colon$bundle.log +188 -0
- package/.turbo/turbo-build.log +189 -0
- package/CHANGELOG.md +440 -0
- package/LICENSE +21 -0
- package/README.md +155 -0
- package/dist/billing/billing.entity.d.ts +61 -0
- package/dist/billing/billing.entity.d.ts.map +1 -0
- package/dist/billing/billing.entity.js +122 -0
- package/dist/billing/billing.entity.js.map +1 -0
- package/dist/billing/billing.enum.d.ts +16 -0
- package/dist/billing/billing.enum.d.ts.map +1 -0
- package/dist/billing/billing.enum.js +27 -0
- package/dist/billing/billing.enum.js.map +1 -0
- package/dist/billing/billing.event.d.ts +86 -0
- package/dist/billing/billing.event.d.ts.map +1 -0
- package/dist/billing/billing.event.js +153 -0
- package/dist/billing/billing.event.js.map +1 -0
- package/dist/billing/billing.handler.d.ts +82 -0
- package/dist/billing/billing.handler.d.ts.map +1 -0
- package/dist/billing/billing.handler.js +58 -0
- package/dist/billing/billing.handler.js.map +1 -0
- package/dist/billing/billing.operations.d.ts +166 -0
- package/dist/billing/billing.operations.d.ts.map +1 -0
- package/dist/billing/billing.operations.js +181 -0
- package/dist/billing/billing.operations.js.map +1 -0
- package/dist/billing/billing.presentation.d.ts +14 -0
- package/dist/billing/billing.presentation.d.ts.map +1 -0
- package/dist/billing/billing.presentation.js +59 -0
- package/dist/billing/billing.presentation.js.map +1 -0
- package/dist/billing/billing.schema.d.ts +201 -0
- package/dist/billing/billing.schema.d.ts.map +1 -0
- package/dist/billing/billing.schema.js +214 -0
- package/dist/billing/billing.schema.js.map +1 -0
- package/dist/billing/index.d.ts +8 -0
- package/dist/billing/index.js +9 -0
- package/dist/dashboard/dashboard.presentation.d.ts +14 -0
- package/dist/dashboard/dashboard.presentation.d.ts.map +1 -0
- package/dist/dashboard/dashboard.presentation.js +55 -0
- package/dist/dashboard/dashboard.presentation.js.map +1 -0
- package/dist/dashboard/index.d.ts +2 -0
- package/dist/dashboard/index.js +3 -0
- package/dist/docs/index.d.ts +1 -0
- package/dist/docs/index.js +1 -0
- package/dist/docs/saas-boilerplate.docblock.d.ts +1 -0
- package/dist/docs/saas-boilerplate.docblock.js +100 -0
- package/dist/docs/saas-boilerplate.docblock.js.map +1 -0
- package/dist/example.d.ts +7 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +53 -0
- package/dist/example.js.map +1 -0
- package/dist/handlers/index.d.ts +4 -0
- package/dist/handlers/index.js +5 -0
- package/dist/handlers/saas.handlers.d.ts +68 -0
- package/dist/handlers/saas.handlers.d.ts.map +1 -0
- package/dist/handlers/saas.handlers.js +148 -0
- package/dist/handlers/saas.handlers.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +81 -0
- package/dist/index.js.map +1 -0
- package/dist/presentations/index.d.ts +17 -0
- package/dist/presentations/index.d.ts.map +1 -0
- package/dist/presentations/index.js +17 -0
- package/dist/presentations/index.js.map +1 -0
- package/dist/project/index.d.ts +8 -0
- package/dist/project/index.js +9 -0
- package/dist/project/project.entity.d.ts +40 -0
- package/dist/project/project.entity.d.ts.map +1 -0
- package/dist/project/project.entity.js +85 -0
- package/dist/project/project.entity.js.map +1 -0
- package/dist/project/project.enum.d.ts +16 -0
- package/dist/project/project.enum.d.ts.map +1 -0
- package/dist/project/project.enum.js +26 -0
- package/dist/project/project.enum.js.map +1 -0
- package/dist/project/project.event.d.ts +92 -0
- package/dist/project/project.event.d.ts.map +1 -0
- package/dist/project/project.event.js +165 -0
- package/dist/project/project.event.js.map +1 -0
- package/dist/project/project.handler.d.ts +72 -0
- package/dist/project/project.handler.d.ts.map +1 -0
- package/dist/project/project.handler.js +82 -0
- package/dist/project/project.handler.js.map +1 -0
- package/dist/project/project.operations.d.ts +419 -0
- package/dist/project/project.operations.d.ts.map +1 -0
- package/dist/project/project.operations.js +260 -0
- package/dist/project/project.operations.js.map +1 -0
- package/dist/project/project.presentation.d.ts +14 -0
- package/dist/project/project.presentation.d.ts.map +1 -0
- package/dist/project/project.presentation.js +65 -0
- package/dist/project/project.presentation.js.map +1 -0
- package/dist/project/project.schema.d.ts +235 -0
- package/dist/project/project.schema.d.ts.map +1 -0
- package/dist/project/project.schema.js +215 -0
- package/dist/project/project.schema.js.map +1 -0
- package/dist/saas-boilerplate.feature.d.ts +12 -0
- package/dist/saas-boilerplate.feature.d.ts.map +1 -0
- package/dist/saas-boilerplate.feature.js +208 -0
- package/dist/saas-boilerplate.feature.js.map +1 -0
- package/dist/seeders/index.d.ts +10 -0
- package/dist/seeders/index.d.ts.map +1 -0
- package/dist/seeders/index.js +19 -0
- package/dist/seeders/index.js.map +1 -0
- package/dist/settings/index.d.ts +3 -0
- package/dist/settings/index.js +4 -0
- package/dist/settings/settings.entity.d.ts +37 -0
- package/dist/settings/settings.entity.d.ts.map +1 -0
- package/dist/settings/settings.entity.js +78 -0
- package/dist/settings/settings.entity.js.map +1 -0
- package/dist/settings/settings.enum.d.ts +10 -0
- package/dist/settings/settings.enum.d.ts.map +1 -0
- package/dist/settings/settings.enum.js +21 -0
- package/dist/settings/settings.enum.js.map +1 -0
- package/dist/shared/mock-data.d.ts +86 -0
- package/dist/shared/mock-data.d.ts.map +1 -0
- package/dist/shared/mock-data.js +138 -0
- package/dist/shared/mock-data.js.map +1 -0
- package/dist/shared/overlay-types.d.ts +34 -0
- package/dist/shared/overlay-types.d.ts.map +1 -0
- package/dist/shared/overlay-types.js +0 -0
- package/dist/tests/operations.test-spec.d.ts +10 -0
- package/dist/tests/operations.test-spec.d.ts.map +1 -0
- package/dist/tests/operations.test-spec.js +123 -0
- package/dist/tests/operations.test-spec.js.map +1 -0
- package/dist/ui/SaasDashboard.d.ts +7 -0
- package/dist/ui/SaasDashboard.d.ts.map +1 -0
- package/dist/ui/SaasDashboard.js +298 -0
- package/dist/ui/SaasDashboard.js.map +1 -0
- package/dist/ui/SaasProjectList.d.ts +14 -0
- package/dist/ui/SaasProjectList.d.ts.map +1 -0
- package/dist/ui/SaasProjectList.js +76 -0
- package/dist/ui/SaasProjectList.js.map +1 -0
- package/dist/ui/SaasSettingsPanel.d.ts +7 -0
- package/dist/ui/SaasSettingsPanel.d.ts.map +1 -0
- package/dist/ui/SaasSettingsPanel.js +138 -0
- package/dist/ui/SaasSettingsPanel.js.map +1 -0
- package/dist/ui/hooks/index.d.ts +3 -0
- package/dist/ui/hooks/index.js +6 -0
- package/dist/ui/hooks/useProjectList.d.ts +34 -0
- package/dist/ui/hooks/useProjectList.d.ts.map +1 -0
- package/dist/ui/hooks/useProjectList.js +75 -0
- package/dist/ui/hooks/useProjectList.js.map +1 -0
- package/dist/ui/hooks/useProjectMutations.d.ts +28 -0
- package/dist/ui/hooks/useProjectMutations.d.ts.map +1 -0
- package/dist/ui/hooks/useProjectMutations.js +146 -0
- package/dist/ui/hooks/useProjectMutations.js.map +1 -0
- package/dist/ui/index.d.ts +14 -0
- package/dist/ui/index.js +15 -0
- package/dist/ui/modals/CreateProjectModal.d.ts +23 -0
- package/dist/ui/modals/CreateProjectModal.d.ts.map +1 -0
- package/dist/ui/modals/CreateProjectModal.js +139 -0
- package/dist/ui/modals/CreateProjectModal.js.map +1 -0
- package/dist/ui/modals/ProjectActionsModal.d.ts +38 -0
- package/dist/ui/modals/ProjectActionsModal.d.ts.map +1 -0
- package/dist/ui/modals/ProjectActionsModal.js +292 -0
- package/dist/ui/modals/ProjectActionsModal.js.map +1 -0
- package/dist/ui/modals/index.d.ts +3 -0
- package/dist/ui/modals/index.js +4 -0
- package/dist/ui/overlays/demo-overlays.d.ts +19 -0
- package/dist/ui/overlays/demo-overlays.d.ts.map +1 -0
- package/dist/ui/overlays/demo-overlays.js +70 -0
- package/dist/ui/overlays/demo-overlays.js.map +1 -0
- package/dist/ui/overlays/index.d.ts +2 -0
- package/dist/ui/overlays/index.js +3 -0
- package/dist/ui/renderers/index.d.ts +3 -0
- package/dist/ui/renderers/index.js +4 -0
- package/dist/ui/renderers/project-list.markdown.d.ts +31 -0
- package/dist/ui/renderers/project-list.markdown.d.ts.map +1 -0
- package/dist/ui/renderers/project-list.markdown.js +148 -0
- package/dist/ui/renderers/project-list.markdown.js.map +1 -0
- package/dist/ui/renderers/project-list.renderer.d.ts +9 -0
- package/dist/ui/renderers/project-list.renderer.d.ts.map +1 -0
- package/dist/ui/renderers/project-list.renderer.js +17 -0
- package/dist/ui/renderers/project-list.renderer.js.map +1 -0
- package/example.ts +1 -0
- package/package.json +135 -0
- package/src/billing/billing.entity.ts +158 -0
- package/src/billing/billing.enum.ts +23 -0
- package/src/billing/billing.event.ts +108 -0
- package/src/billing/billing.handler.ts +137 -0
- package/src/billing/billing.operations.ts +187 -0
- package/src/billing/billing.presentation.ts +56 -0
- package/src/billing/billing.schema.ts +133 -0
- package/src/billing/index.ts +64 -0
- package/src/dashboard/dashboard.presentation.ts +56 -0
- package/src/dashboard/index.ts +8 -0
- package/src/docs/index.ts +1 -0
- package/src/docs/saas-boilerplate.docblock.ts +98 -0
- package/src/example.ts +38 -0
- package/src/handlers/index.ts +23 -0
- package/src/handlers/saas.handlers.ts +300 -0
- package/src/index.ts +76 -0
- package/src/presentations/index.ts +36 -0
- package/src/project/index.ts +66 -0
- package/src/project/project.entity.ts +93 -0
- package/src/project/project.enum.ts +22 -0
- package/src/project/project.event.ts +128 -0
- package/src/project/project.handler.ts +168 -0
- package/src/project/project.operations.ts +272 -0
- package/src/project/project.presentation.ts +58 -0
- package/src/project/project.schema.ts +147 -0
- package/src/saas-boilerplate.feature.ts +113 -0
- package/src/seeders/index.ts +28 -0
- package/src/settings/index.ts +9 -0
- package/src/settings/settings.entity.ts +89 -0
- package/src/settings/settings.enum.ts +11 -0
- package/src/shared/mock-data.ts +110 -0
- package/src/shared/overlay-types.ts +39 -0
- package/src/tests/operations.test-spec.ts +109 -0
- package/src/ui/SaasDashboard.tsx +325 -0
- package/src/ui/SaasProjectList.tsx +113 -0
- package/src/ui/SaasSettingsPanel.tsx +96 -0
- package/src/ui/hooks/index.ts +10 -0
- package/src/ui/hooks/useProjectList.ts +95 -0
- package/src/ui/hooks/useProjectMutations.ts +166 -0
- package/src/ui/index.ts +18 -0
- package/src/ui/modals/CreateProjectModal.tsx +176 -0
- package/src/ui/modals/ProjectActionsModal.tsx +346 -0
- package/src/ui/modals/index.ts +2 -0
- package/src/ui/overlays/demo-overlays.ts +74 -0
- package/src/ui/overlays/index.ts +1 -0
- package/src/ui/renderers/index.ts +7 -0
- package/src/ui/renderers/project-list.markdown.ts +239 -0
- package/src/ui/renderers/project-list.renderer.tsx +22 -0
- package/tsconfig.json +10 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/tsdown.config.js +7 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as _contractspec_lib_contracts3 from "@contractspec/lib.contracts";
|
|
2
|
+
import * as _contractspec_lib_schema141 from "@contractspec/lib.schema";
|
|
3
|
+
|
|
4
|
+
//#region src/project/project.event.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Event: A new project has been created.
|
|
7
|
+
*/
|
|
8
|
+
declare const ProjectCreatedEvent: _contractspec_lib_contracts3.EventSpec<_contractspec_lib_schema141.SchemaModel<{
|
|
9
|
+
projectId: {
|
|
10
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
11
|
+
isOptional: false;
|
|
12
|
+
};
|
|
13
|
+
name: {
|
|
14
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
15
|
+
isOptional: false;
|
|
16
|
+
};
|
|
17
|
+
organizationId: {
|
|
18
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
19
|
+
isOptional: false;
|
|
20
|
+
};
|
|
21
|
+
createdBy: {
|
|
22
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
23
|
+
isOptional: false;
|
|
24
|
+
};
|
|
25
|
+
createdAt: {
|
|
26
|
+
type: _contractspec_lib_schema141.FieldType<Date, string>;
|
|
27
|
+
isOptional: false;
|
|
28
|
+
};
|
|
29
|
+
}>>;
|
|
30
|
+
/**
|
|
31
|
+
* Event: A project has been updated.
|
|
32
|
+
*/
|
|
33
|
+
declare const ProjectUpdatedEvent: _contractspec_lib_contracts3.EventSpec<_contractspec_lib_schema141.SchemaModel<{
|
|
34
|
+
projectId: {
|
|
35
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
36
|
+
isOptional: false;
|
|
37
|
+
};
|
|
38
|
+
updatedFields: {
|
|
39
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
40
|
+
isArray: true;
|
|
41
|
+
isOptional: false;
|
|
42
|
+
};
|
|
43
|
+
updatedBy: {
|
|
44
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
45
|
+
isOptional: false;
|
|
46
|
+
};
|
|
47
|
+
updatedAt: {
|
|
48
|
+
type: _contractspec_lib_schema141.FieldType<Date, string>;
|
|
49
|
+
isOptional: false;
|
|
50
|
+
};
|
|
51
|
+
}>>;
|
|
52
|
+
/**
|
|
53
|
+
* Event: A project has been deleted.
|
|
54
|
+
*/
|
|
55
|
+
declare const ProjectDeletedEvent: _contractspec_lib_contracts3.EventSpec<_contractspec_lib_schema141.SchemaModel<{
|
|
56
|
+
projectId: {
|
|
57
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
58
|
+
isOptional: false;
|
|
59
|
+
};
|
|
60
|
+
organizationId: {
|
|
61
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
62
|
+
isOptional: false;
|
|
63
|
+
};
|
|
64
|
+
deletedBy: {
|
|
65
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
66
|
+
isOptional: false;
|
|
67
|
+
};
|
|
68
|
+
deletedAt: {
|
|
69
|
+
type: _contractspec_lib_schema141.FieldType<Date, string>;
|
|
70
|
+
isOptional: false;
|
|
71
|
+
};
|
|
72
|
+
}>>;
|
|
73
|
+
/**
|
|
74
|
+
* Event: A project has been archived.
|
|
75
|
+
*/
|
|
76
|
+
declare const ProjectArchivedEvent: _contractspec_lib_contracts3.EventSpec<_contractspec_lib_schema141.SchemaModel<{
|
|
77
|
+
projectId: {
|
|
78
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
79
|
+
isOptional: false;
|
|
80
|
+
};
|
|
81
|
+
archivedBy: {
|
|
82
|
+
type: _contractspec_lib_schema141.FieldType<string, string>;
|
|
83
|
+
isOptional: false;
|
|
84
|
+
};
|
|
85
|
+
archivedAt: {
|
|
86
|
+
type: _contractspec_lib_schema141.FieldType<Date, string>;
|
|
87
|
+
isOptional: false;
|
|
88
|
+
};
|
|
89
|
+
}>>;
|
|
90
|
+
//#endregion
|
|
91
|
+
export { ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectUpdatedEvent };
|
|
92
|
+
//# sourceMappingURL=project.event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.event.d.ts","names":[],"sources":["../../src/project/project.event.ts"],"sourcesContent":[],"mappings":";;;;;;;cAwEa,qBAAmB,4BAAA,CAAA,sCAAA;EAAnB,SAAA,EAAA;IAUX,IAAA,EAAA,2BAAA,CAAA,SAAA,CAAA,MAAA,EAAA,MAAA,CAAA;;;;;;;EAV8B,cAAA,EAAA;IAAA,IAAA,uCAAA,CAAA,MAAA,EAAA,MAAA,CAAA;IAenB,UAAA,EAAA,KAAA;EAUX,CAAA;;;;;;IAV8B,IAAA,uCAAA,KAAA,EAAA,MAAA,CAAA;IAAA,UAAA,EAAA,KAAA;EAenB,CAAA;CAUX,CAAA,CAAA;;;;cAzBW,qBAAmB,4BAAA,CAAA,sCAAA;;IAeA,IAAA,EAL9B,2BAAA,CAAA,SAK8B,CAAA,MAAA,EAAA,MAAA,CAAA;IAAA,UAAA,EAAA,KAAA;EAenB,CAAA;EAUX,aAAA,EAAA;;;;;EAV+B,SAAA,EAAA;IAAA,IAAA,uCAAA,CAAA,MAAA,EAAA,MAAA,CAAA;;;;;;;;;;;cAfpB,qBAAmB,4BAAA,CAAA,sCAAA;;UAU9B,2BAAA,CAAA;;;;;;;;;;;;;;;;;;;cAKW,sBAAoB,4BAAA,CAAA,sCAAA;;UAU/B,2BAAA,CAAA"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { defineEvent } from "@contractspec/lib.contracts";
|
|
2
|
+
import { ScalarTypeEnum, defineSchemaModel } from "@contractspec/lib.schema";
|
|
3
|
+
|
|
4
|
+
//#region src/project/project.event.ts
|
|
5
|
+
/**
|
|
6
|
+
* Payload when a project is created.
|
|
7
|
+
*/
|
|
8
|
+
const ProjectCreatedPayload = defineSchemaModel({
|
|
9
|
+
name: "ProjectCreatedPayload",
|
|
10
|
+
description: "Payload when a project is created",
|
|
11
|
+
fields: {
|
|
12
|
+
projectId: {
|
|
13
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
14
|
+
isOptional: false
|
|
15
|
+
},
|
|
16
|
+
name: {
|
|
17
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
18
|
+
isOptional: false
|
|
19
|
+
},
|
|
20
|
+
organizationId: {
|
|
21
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
22
|
+
isOptional: false
|
|
23
|
+
},
|
|
24
|
+
createdBy: {
|
|
25
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
26
|
+
isOptional: false
|
|
27
|
+
},
|
|
28
|
+
createdAt: {
|
|
29
|
+
type: ScalarTypeEnum.DateTime(),
|
|
30
|
+
isOptional: false
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Payload when a project is updated.
|
|
36
|
+
*/
|
|
37
|
+
const ProjectUpdatedPayload = defineSchemaModel({
|
|
38
|
+
name: "ProjectUpdatedPayload",
|
|
39
|
+
description: "Payload when a project is updated",
|
|
40
|
+
fields: {
|
|
41
|
+
projectId: {
|
|
42
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
43
|
+
isOptional: false
|
|
44
|
+
},
|
|
45
|
+
updatedFields: {
|
|
46
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
47
|
+
isArray: true,
|
|
48
|
+
isOptional: false
|
|
49
|
+
},
|
|
50
|
+
updatedBy: {
|
|
51
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
52
|
+
isOptional: false
|
|
53
|
+
},
|
|
54
|
+
updatedAt: {
|
|
55
|
+
type: ScalarTypeEnum.DateTime(),
|
|
56
|
+
isOptional: false
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
/**
|
|
61
|
+
* Payload when a project is deleted.
|
|
62
|
+
*/
|
|
63
|
+
const ProjectDeletedPayload = defineSchemaModel({
|
|
64
|
+
name: "ProjectDeletedPayload",
|
|
65
|
+
description: "Payload when a project is deleted",
|
|
66
|
+
fields: {
|
|
67
|
+
projectId: {
|
|
68
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
69
|
+
isOptional: false
|
|
70
|
+
},
|
|
71
|
+
organizationId: {
|
|
72
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
73
|
+
isOptional: false
|
|
74
|
+
},
|
|
75
|
+
deletedBy: {
|
|
76
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
77
|
+
isOptional: false
|
|
78
|
+
},
|
|
79
|
+
deletedAt: {
|
|
80
|
+
type: ScalarTypeEnum.DateTime(),
|
|
81
|
+
isOptional: false
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
/**
|
|
86
|
+
* Payload when a project is archived.
|
|
87
|
+
*/
|
|
88
|
+
const ProjectArchivedPayload = defineSchemaModel({
|
|
89
|
+
name: "ProjectArchivedPayload",
|
|
90
|
+
description: "Payload when a project is archived",
|
|
91
|
+
fields: {
|
|
92
|
+
projectId: {
|
|
93
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
94
|
+
isOptional: false
|
|
95
|
+
},
|
|
96
|
+
archivedBy: {
|
|
97
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
98
|
+
isOptional: false
|
|
99
|
+
},
|
|
100
|
+
archivedAt: {
|
|
101
|
+
type: ScalarTypeEnum.DateTime(),
|
|
102
|
+
isOptional: false
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
/**
|
|
107
|
+
* Event: A new project has been created.
|
|
108
|
+
*/
|
|
109
|
+
const ProjectCreatedEvent = defineEvent({
|
|
110
|
+
meta: {
|
|
111
|
+
key: "project.created",
|
|
112
|
+
version: "1.0.0",
|
|
113
|
+
description: "A new project has been created.",
|
|
114
|
+
stability: "stable",
|
|
115
|
+
owners: ["@saas-team"],
|
|
116
|
+
tags: ["project", "created"]
|
|
117
|
+
},
|
|
118
|
+
payload: ProjectCreatedPayload
|
|
119
|
+
});
|
|
120
|
+
/**
|
|
121
|
+
* Event: A project has been updated.
|
|
122
|
+
*/
|
|
123
|
+
const ProjectUpdatedEvent = defineEvent({
|
|
124
|
+
meta: {
|
|
125
|
+
key: "project.updated",
|
|
126
|
+
version: "1.0.0",
|
|
127
|
+
description: "A project has been updated.",
|
|
128
|
+
stability: "stable",
|
|
129
|
+
owners: ["@saas-team"],
|
|
130
|
+
tags: ["project", "updated"]
|
|
131
|
+
},
|
|
132
|
+
payload: ProjectUpdatedPayload
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* Event: A project has been deleted.
|
|
136
|
+
*/
|
|
137
|
+
const ProjectDeletedEvent = defineEvent({
|
|
138
|
+
meta: {
|
|
139
|
+
key: "project.deleted",
|
|
140
|
+
version: "1.0.0",
|
|
141
|
+
description: "A project has been deleted.",
|
|
142
|
+
stability: "stable",
|
|
143
|
+
owners: ["@saas-team"],
|
|
144
|
+
tags: ["project", "deleted"]
|
|
145
|
+
},
|
|
146
|
+
payload: ProjectDeletedPayload
|
|
147
|
+
});
|
|
148
|
+
/**
|
|
149
|
+
* Event: A project has been archived.
|
|
150
|
+
*/
|
|
151
|
+
const ProjectArchivedEvent = defineEvent({
|
|
152
|
+
meta: {
|
|
153
|
+
key: "project.archived",
|
|
154
|
+
version: "1.0.0",
|
|
155
|
+
description: "A project has been archived.",
|
|
156
|
+
stability: "stable",
|
|
157
|
+
owners: ["@saas-team"],
|
|
158
|
+
tags: ["project", "archived"]
|
|
159
|
+
},
|
|
160
|
+
payload: ProjectArchivedPayload
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
//#endregion
|
|
164
|
+
export { ProjectArchivedEvent, ProjectCreatedEvent, ProjectDeletedEvent, ProjectUpdatedEvent };
|
|
165
|
+
//# sourceMappingURL=project.event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.event.js","names":[],"sources":["../../src/project/project.event.ts"],"sourcesContent":["import { ScalarTypeEnum, defineSchemaModel } from '@contractspec/lib.schema';\nimport { defineEvent } from '@contractspec/lib.contracts';\n\n/**\n * Payload when a project is created.\n */\nconst ProjectCreatedPayload = defineSchemaModel({\n name: 'ProjectCreatedPayload',\n description: 'Payload when a project is created',\n fields: {\n projectId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n organizationId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n createdBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Payload when a project is updated.\n */\nconst ProjectUpdatedPayload = defineSchemaModel({\n name: 'ProjectUpdatedPayload',\n description: 'Payload when a project is updated',\n fields: {\n projectId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n updatedFields: {\n type: ScalarTypeEnum.String_unsecure(),\n isArray: true,\n isOptional: false,\n },\n updatedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Payload when a project is deleted.\n */\nconst ProjectDeletedPayload = defineSchemaModel({\n name: 'ProjectDeletedPayload',\n description: 'Payload when a project is deleted',\n fields: {\n projectId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n organizationId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n deletedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n deletedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Payload when a project is archived.\n */\nconst ProjectArchivedPayload = defineSchemaModel({\n name: 'ProjectArchivedPayload',\n description: 'Payload when a project is archived',\n fields: {\n projectId: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n archivedBy: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n archivedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Event: A new project has been created.\n */\nexport const ProjectCreatedEvent = defineEvent({\n meta: {\n key: 'project.created',\n version: '1.0.0',\n description: 'A new project has been created.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['project', 'created'],\n },\n payload: ProjectCreatedPayload,\n});\n\n/**\n * Event: A project has been updated.\n */\nexport const ProjectUpdatedEvent = defineEvent({\n meta: {\n key: 'project.updated',\n version: '1.0.0',\n description: 'A project has been updated.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['project', 'updated'],\n },\n payload: ProjectUpdatedPayload,\n});\n\n/**\n * Event: A project has been deleted.\n */\nexport const ProjectDeletedEvent = defineEvent({\n meta: {\n key: 'project.deleted',\n version: '1.0.0',\n description: 'A project has been deleted.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['project', 'deleted'],\n },\n payload: ProjectDeletedPayload,\n});\n\n/**\n * Event: A project has been archived.\n */\nexport const ProjectArchivedEvent = defineEvent({\n meta: {\n key: 'project.archived',\n version: '1.0.0',\n description: 'A project has been archived.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['project', 'archived'],\n },\n payload: ProjectArchivedPayload,\n});\n"],"mappings":";;;;;;;AAMA,MAAM,wBAAwB,kBAAkB;CAC9C,MAAM;CACN,aAAa;CACb,QAAQ;EACN,WAAW;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACxE,MAAM;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACnE,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,WAAW;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACxE,WAAW;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EAClE;CACF,CAAC;;;;AAKF,MAAM,wBAAwB,kBAAkB;CAC9C,MAAM;CACN,aAAa;CACb,QAAQ;EACN,WAAW;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACxE,eAAe;GACb,MAAM,eAAe,iBAAiB;GACtC,SAAS;GACT,YAAY;GACb;EACD,WAAW;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACxE,WAAW;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EAClE;CACF,CAAC;;;;AAKF,MAAM,wBAAwB,kBAAkB;CAC9C,MAAM;CACN,aAAa;CACb,QAAQ;EACN,WAAW;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACxE,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,WAAW;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACxE,WAAW;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EAClE;CACF,CAAC;;;;AAKF,MAAM,yBAAyB,kBAAkB;CAC/C,MAAM;CACN,aAAa;CACb,QAAQ;EACN,WAAW;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACxE,YAAY;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACzE,YAAY;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EACnE;CACF,CAAC;;;;AAKF,MAAa,sBAAsB,YAAY;CAC7C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM,CAAC,WAAW,UAAU;EAC7B;CACD,SAAS;CACV,CAAC;;;;AAKF,MAAa,sBAAsB,YAAY;CAC7C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM,CAAC,WAAW,UAAU;EAC7B;CACD,SAAS;CACV,CAAC;;;;AAKF,MAAa,sBAAsB,YAAY;CAC7C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM,CAAC,WAAW,UAAU;EAC7B;CACD,SAAS;CACV,CAAC;;;;AAKF,MAAa,uBAAuB,YAAY;CAC9C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM,CAAC,WAAW,WAAW;EAC9B;CACD,SAAS;CACV,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//#region src/project/project.handler.d.ts
|
|
2
|
+
interface Project {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
slug?: string;
|
|
7
|
+
organizationId: string;
|
|
8
|
+
createdBy: string;
|
|
9
|
+
status: 'DRAFT' | 'ACTIVE' | 'ARCHIVED' | 'DELETED';
|
|
10
|
+
isPublic: boolean;
|
|
11
|
+
tags: string[];
|
|
12
|
+
createdAt: Date;
|
|
13
|
+
updatedAt: Date;
|
|
14
|
+
}
|
|
15
|
+
interface CreateProjectInput {
|
|
16
|
+
name: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
slug?: string;
|
|
19
|
+
isPublic?: boolean;
|
|
20
|
+
tags?: string[];
|
|
21
|
+
}
|
|
22
|
+
interface UpdateProjectInput {
|
|
23
|
+
projectId: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
slug?: string;
|
|
27
|
+
isPublic?: boolean;
|
|
28
|
+
tags?: string[];
|
|
29
|
+
status?: 'DRAFT' | 'ACTIVE' | 'ARCHIVED' | 'DELETED';
|
|
30
|
+
}
|
|
31
|
+
interface ListProjectsInput {
|
|
32
|
+
status?: 'DRAFT' | 'ACTIVE' | 'ARCHIVED' | 'all';
|
|
33
|
+
search?: string;
|
|
34
|
+
limit?: number;
|
|
35
|
+
offset?: number;
|
|
36
|
+
}
|
|
37
|
+
interface ListProjectsOutput {
|
|
38
|
+
projects: Project[];
|
|
39
|
+
total: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Mock handler for ListProjectsContract.
|
|
43
|
+
*/
|
|
44
|
+
declare function mockListProjectsHandler(input: ListProjectsInput): Promise<ListProjectsOutput>;
|
|
45
|
+
/**
|
|
46
|
+
* Mock handler for GetProjectContract.
|
|
47
|
+
*/
|
|
48
|
+
declare function mockGetProjectHandler(input: {
|
|
49
|
+
projectId: string;
|
|
50
|
+
}): Promise<Project>;
|
|
51
|
+
/**
|
|
52
|
+
* Mock handler for CreateProjectContract.
|
|
53
|
+
*/
|
|
54
|
+
declare function mockCreateProjectHandler(input: CreateProjectInput, context: {
|
|
55
|
+
organizationId: string;
|
|
56
|
+
userId: string;
|
|
57
|
+
}): Promise<Project>;
|
|
58
|
+
/**
|
|
59
|
+
* Mock handler for UpdateProjectContract.
|
|
60
|
+
*/
|
|
61
|
+
declare function mockUpdateProjectHandler(input: UpdateProjectInput): Promise<Project>;
|
|
62
|
+
/**
|
|
63
|
+
* Mock handler for DeleteProjectContract.
|
|
64
|
+
*/
|
|
65
|
+
declare function mockDeleteProjectHandler(input: {
|
|
66
|
+
projectId: string;
|
|
67
|
+
}): Promise<{
|
|
68
|
+
success: boolean;
|
|
69
|
+
}>;
|
|
70
|
+
//#endregion
|
|
71
|
+
export { CreateProjectInput, ListProjectsInput, ListProjectsOutput, Project, UpdateProjectInput, mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockListProjectsHandler, mockUpdateProjectHandler };
|
|
72
|
+
//# sourceMappingURL=project.handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.handler.d.ts","names":[],"sources":["../../src/project/project.handler.ts"],"sourcesContent":[],"mappings":";UAMiB,OAAA;EAAA,EAAA,EAAA,MAAO;EAcP,IAAA,EAAA,MAAA;EAQA,WAAA,CAAA,EAAA,MAAA;EAUA,IAAA,CAAA,EAAA,MAAA;EAOA,cAAA,EAAA,MAAkB;EAQb,SAAA,EAAA,MAAA;EACb,MAAA,EAAA,OAAA,GAAA,QAAA,GAAA,UAAA,GAAA,SAAA;EACE,QAAA,EAAA,OAAA;EAAR,IAAA,EAAA,MAAA,EAAA;EAAO,SAAA,EAvCG,IAuCH;EAiCY,SAAA,EAvET,IAuES;AAetB;AACS,UApFQ,kBAAA,CAoFR;EAEE,IAAA,EAAA,MAAA;EAAR,WAAA,CAAA,EAAA,MAAA;EAAO,IAAA,CAAA,EAAA,MAAA;EA2BY,QAAA,CAAA,EAAA,OAAA;EACb,IAAA,CAAA,EAAA,MAAA,EAAA;;AACN,UA3Gc,kBAAA,CA2Gd;EAAO,SAAA,EAAA,MAAA;EAsBY,IAAA,CAAA,EAAA,MAAA;;;;;;;UAvHL,iBAAA;;;;;;UAOA,kBAAA;YACL;;;;;;iBAOU,uBAAA,QACb,oBACN,QAAQ;;;;iBAiCW,qBAAA;;IAElB,QAAQ;;;;iBAaU,wBAAA,QACb;;;IAEN,QAAQ;;;;iBA2BW,wBAAA,QACb,qBACN,QAAQ;;;;iBAsBW,wBAAA;;IAElB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { MOCK_PROJECTS } from "../shared/mock-data.js";
|
|
2
|
+
|
|
3
|
+
//#region src/project/project.handler.ts
|
|
4
|
+
/**
|
|
5
|
+
* Mock handlers for Project contracts.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Mock handler for ListProjectsContract.
|
|
9
|
+
*/
|
|
10
|
+
async function mockListProjectsHandler(input) {
|
|
11
|
+
const { status, search, limit = 20, offset = 0 } = input;
|
|
12
|
+
let filtered = [...MOCK_PROJECTS];
|
|
13
|
+
if (status && status !== "all") filtered = filtered.filter((p) => p.status === status);
|
|
14
|
+
if (search) {
|
|
15
|
+
const q = search.toLowerCase();
|
|
16
|
+
filtered = filtered.filter((p) => p.name.toLowerCase().includes(q) || p.description?.toLowerCase().includes(q) || p.tags.some((t) => t.toLowerCase().includes(q)));
|
|
17
|
+
}
|
|
18
|
+
filtered.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());
|
|
19
|
+
const total = filtered.length;
|
|
20
|
+
return {
|
|
21
|
+
projects: filtered.slice(offset, offset + limit),
|
|
22
|
+
total
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Mock handler for GetProjectContract.
|
|
27
|
+
*/
|
|
28
|
+
async function mockGetProjectHandler(input) {
|
|
29
|
+
const project = MOCK_PROJECTS.find((p) => p.id === input.projectId);
|
|
30
|
+
if (!project) throw new Error("NOT_FOUND");
|
|
31
|
+
return project;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Mock handler for CreateProjectContract.
|
|
35
|
+
*/
|
|
36
|
+
async function mockCreateProjectHandler(input, context) {
|
|
37
|
+
if (input.slug) {
|
|
38
|
+
if (MOCK_PROJECTS.some((p) => p.slug === input.slug)) throw new Error("SLUG_EXISTS");
|
|
39
|
+
}
|
|
40
|
+
const now = /* @__PURE__ */ new Date();
|
|
41
|
+
return {
|
|
42
|
+
id: `proj-${Date.now()}`,
|
|
43
|
+
name: input.name,
|
|
44
|
+
description: input.description,
|
|
45
|
+
slug: input.slug ?? input.name.toLowerCase().replace(/\s+/g, "-"),
|
|
46
|
+
organizationId: context.organizationId,
|
|
47
|
+
createdBy: context.userId,
|
|
48
|
+
status: "DRAFT",
|
|
49
|
+
isPublic: input.isPublic ?? false,
|
|
50
|
+
tags: input.tags ?? [],
|
|
51
|
+
createdAt: now,
|
|
52
|
+
updatedAt: now
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Mock handler for UpdateProjectContract.
|
|
57
|
+
*/
|
|
58
|
+
async function mockUpdateProjectHandler(input) {
|
|
59
|
+
const project = MOCK_PROJECTS.find((p) => p.id === input.projectId);
|
|
60
|
+
if (!project) throw new Error("NOT_FOUND");
|
|
61
|
+
return {
|
|
62
|
+
...project,
|
|
63
|
+
name: input.name ?? project.name,
|
|
64
|
+
description: input.description ?? project.description,
|
|
65
|
+
slug: input.slug ?? project.slug,
|
|
66
|
+
isPublic: input.isPublic ?? project.isPublic,
|
|
67
|
+
tags: input.tags ?? project.tags,
|
|
68
|
+
status: input.status ?? project.status,
|
|
69
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Mock handler for DeleteProjectContract.
|
|
74
|
+
*/
|
|
75
|
+
async function mockDeleteProjectHandler(input) {
|
|
76
|
+
if (!MOCK_PROJECTS.find((p) => p.id === input.projectId)) throw new Error("NOT_FOUND");
|
|
77
|
+
return { success: true };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
export { mockCreateProjectHandler, mockDeleteProjectHandler, mockGetProjectHandler, mockListProjectsHandler, mockUpdateProjectHandler };
|
|
82
|
+
//# sourceMappingURL=project.handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.handler.js","names":[],"sources":["../../src/project/project.handler.ts"],"sourcesContent":["/**\n * Mock handlers for Project contracts.\n */\nimport { MOCK_PROJECTS } from '../shared/mock-data';\n\n// Types inferred from contract schemas\nexport interface Project {\n id: string;\n name: string;\n description?: string;\n slug?: string;\n organizationId: string;\n createdBy: string;\n status: 'DRAFT' | 'ACTIVE' | 'ARCHIVED' | 'DELETED';\n isPublic: boolean;\n tags: string[];\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface CreateProjectInput {\n name: string;\n description?: string;\n slug?: string;\n isPublic?: boolean;\n tags?: string[];\n}\n\nexport interface UpdateProjectInput {\n projectId: string;\n name?: string;\n description?: string;\n slug?: string;\n isPublic?: boolean;\n tags?: string[];\n status?: 'DRAFT' | 'ACTIVE' | 'ARCHIVED' | 'DELETED';\n}\n\nexport interface ListProjectsInput {\n status?: 'DRAFT' | 'ACTIVE' | 'ARCHIVED' | 'all';\n search?: string;\n limit?: number;\n offset?: number;\n}\n\nexport interface ListProjectsOutput {\n projects: Project[];\n total: number;\n}\n\n/**\n * Mock handler for ListProjectsContract.\n */\nexport async function mockListProjectsHandler(\n input: ListProjectsInput\n): Promise<ListProjectsOutput> {\n const { status, search, limit = 20, offset = 0 } = input;\n\n let filtered = [...MOCK_PROJECTS];\n\n if (status && status !== 'all') {\n filtered = filtered.filter((p) => p.status === status);\n }\n\n if (search) {\n const q = search.toLowerCase();\n filtered = filtered.filter(\n (p) =>\n p.name.toLowerCase().includes(q) ||\n p.description?.toLowerCase().includes(q) ||\n p.tags.some((t) => t.toLowerCase().includes(q))\n );\n }\n\n filtered.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n\n const total = filtered.length;\n const projects = filtered.slice(offset, offset + limit);\n\n return {\n projects,\n total,\n };\n}\n\n/**\n * Mock handler for GetProjectContract.\n */\nexport async function mockGetProjectHandler(input: {\n projectId: string;\n}): Promise<Project> {\n const project = MOCK_PROJECTS.find((p) => p.id === input.projectId);\n\n if (!project) {\n throw new Error('NOT_FOUND');\n }\n\n return project;\n}\n\n/**\n * Mock handler for CreateProjectContract.\n */\nexport async function mockCreateProjectHandler(\n input: CreateProjectInput,\n context: { organizationId: string; userId: string }\n): Promise<Project> {\n if (input.slug) {\n const exists = MOCK_PROJECTS.some((p) => p.slug === input.slug);\n if (exists) {\n throw new Error('SLUG_EXISTS');\n }\n }\n\n const now = new Date();\n return {\n id: `proj-${Date.now()}`,\n name: input.name,\n description: input.description,\n slug: input.slug ?? input.name.toLowerCase().replace(/\\s+/g, '-'),\n organizationId: context.organizationId,\n createdBy: context.userId,\n status: 'DRAFT',\n isPublic: input.isPublic ?? false,\n tags: input.tags ?? [],\n createdAt: now,\n updatedAt: now,\n };\n}\n\n/**\n * Mock handler for UpdateProjectContract.\n */\nexport async function mockUpdateProjectHandler(\n input: UpdateProjectInput\n): Promise<Project> {\n const project = MOCK_PROJECTS.find((p) => p.id === input.projectId);\n\n if (!project) {\n throw new Error('NOT_FOUND');\n }\n\n return {\n ...project,\n name: input.name ?? project.name,\n description: input.description ?? project.description,\n slug: input.slug ?? project.slug,\n isPublic: input.isPublic ?? project.isPublic,\n tags: input.tags ?? project.tags,\n status: input.status ?? project.status,\n updatedAt: new Date(),\n };\n}\n\n/**\n * Mock handler for DeleteProjectContract.\n */\nexport async function mockDeleteProjectHandler(input: {\n projectId: string;\n}): Promise<{ success: boolean }> {\n const project = MOCK_PROJECTS.find((p) => p.id === input.projectId);\n\n if (!project) {\n throw new Error('NOT_FOUND');\n }\n\n return { success: true };\n}\n"],"mappings":";;;;;;;;;AAqDA,eAAsB,wBACpB,OAC6B;CAC7B,MAAM,EAAE,QAAQ,QAAQ,QAAQ,IAAI,SAAS,MAAM;CAEnD,IAAI,WAAW,CAAC,GAAG,cAAc;AAEjC,KAAI,UAAU,WAAW,MACvB,YAAW,SAAS,QAAQ,MAAM,EAAE,WAAW,OAAO;AAGxD,KAAI,QAAQ;EACV,MAAM,IAAI,OAAO,aAAa;AAC9B,aAAW,SAAS,QACjB,MACC,EAAE,KAAK,aAAa,CAAC,SAAS,EAAE,IAChC,EAAE,aAAa,aAAa,CAAC,SAAS,EAAE,IACxC,EAAE,KAAK,MAAM,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,CAClD;;AAGH,UAAS,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CAAC;CAEtE,MAAM,QAAQ,SAAS;AAGvB,QAAO;EACL,UAHe,SAAS,MAAM,QAAQ,SAAS,MAAM;EAIrD;EACD;;;;;AAMH,eAAsB,sBAAsB,OAEvB;CACnB,MAAM,UAAU,cAAc,MAAM,MAAM,EAAE,OAAO,MAAM,UAAU;AAEnE,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,YAAY;AAG9B,QAAO;;;;;AAMT,eAAsB,yBACpB,OACA,SACkB;AAClB,KAAI,MAAM,MAER;MADe,cAAc,MAAM,MAAM,EAAE,SAAS,MAAM,KAAK,CAE7D,OAAM,IAAI,MAAM,cAAc;;CAIlC,MAAM,sBAAM,IAAI,MAAM;AACtB,QAAO;EACL,IAAI,QAAQ,KAAK,KAAK;EACtB,MAAM,MAAM;EACZ,aAAa,MAAM;EACnB,MAAM,MAAM,QAAQ,MAAM,KAAK,aAAa,CAAC,QAAQ,QAAQ,IAAI;EACjE,gBAAgB,QAAQ;EACxB,WAAW,QAAQ;EACnB,QAAQ;EACR,UAAU,MAAM,YAAY;EAC5B,MAAM,MAAM,QAAQ,EAAE;EACtB,WAAW;EACX,WAAW;EACZ;;;;;AAMH,eAAsB,yBACpB,OACkB;CAClB,MAAM,UAAU,cAAc,MAAM,MAAM,EAAE,OAAO,MAAM,UAAU;AAEnE,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,YAAY;AAG9B,QAAO;EACL,GAAG;EACH,MAAM,MAAM,QAAQ,QAAQ;EAC5B,aAAa,MAAM,eAAe,QAAQ;EAC1C,MAAM,MAAM,QAAQ,QAAQ;EAC5B,UAAU,MAAM,YAAY,QAAQ;EACpC,MAAM,MAAM,QAAQ,QAAQ;EAC5B,QAAQ,MAAM,UAAU,QAAQ;EAChC,2BAAW,IAAI,MAAM;EACtB;;;;;AAMH,eAAsB,yBAAyB,OAEb;AAGhC,KAAI,CAFY,cAAc,MAAM,MAAM,EAAE,OAAO,MAAM,UAAU,CAGjE,OAAM,IAAI,MAAM,YAAY;AAG9B,QAAO,EAAE,SAAS,MAAM"}
|