monorise 1.0.0 → 1.1.0-dev.1

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 (100) hide show
  1. package/dist/base/index.d.ts +110 -3
  2. package/dist/base/index.js +3 -1
  3. package/dist/base/index.js.map +1 -1
  4. package/dist/cli/cli.js +6 -0
  5. package/dist/cli/cli.js.map +1 -1
  6. package/dist/core/chunk-QV4Q5377.js +76 -0
  7. package/dist/core/chunk-QV4Q5377.js.map +1 -0
  8. package/dist/core/index.d.ts +191 -38
  9. package/dist/core/index.js +1539 -122
  10. package/dist/core/index.js.map +1 -1
  11. package/dist/core/service.config-ZJEZ6EKA.js +13 -0
  12. package/dist/core/service.config-ZJEZ6EKA.js.map +1 -0
  13. package/dist/proxy/index.d.ts +35 -0
  14. package/dist/proxy/index.js +75 -0
  15. package/dist/proxy/index.js.map +1 -0
  16. package/dist/react/actions/websocket.action.d.ts +71 -0
  17. package/dist/react/actions/websocket.action.d.ts.map +1 -0
  18. package/dist/react/chunk-2QOYO3GF.js +182 -0
  19. package/dist/react/chunk-2QOYO3GF.js.map +1 -0
  20. package/dist/react/chunk-4WSYM746.js +383 -0
  21. package/dist/react/chunk-4WSYM746.js.map +1 -0
  22. package/dist/react/chunk-5XIRNUBL.js +43 -0
  23. package/dist/react/chunk-5XIRNUBL.js.map +1 -0
  24. package/dist/react/chunk-7JDOKZGQ.js +172 -0
  25. package/dist/react/chunk-7JDOKZGQ.js.map +1 -0
  26. package/dist/react/chunk-A5TI2FW3.js +13 -0
  27. package/dist/react/chunk-A5TI2FW3.js.map +1 -0
  28. package/dist/react/chunk-BJXCFDMF.js +15 -0
  29. package/dist/react/chunk-BJXCFDMF.js.map +1 -0
  30. package/dist/react/chunk-BUTF5RJU.js +29 -0
  31. package/dist/react/chunk-BUTF5RJU.js.map +1 -0
  32. package/dist/react/chunk-DTRWUIDH.js +402 -0
  33. package/dist/react/chunk-DTRWUIDH.js.map +1 -0
  34. package/dist/react/chunk-GFVCNWVT.js +54 -0
  35. package/dist/react/chunk-GFVCNWVT.js.map +1 -0
  36. package/dist/react/chunk-JT5EZZSL.js +489 -0
  37. package/dist/react/chunk-JT5EZZSL.js.map +1 -0
  38. package/dist/react/chunk-KJX5LOMN.js +43 -0
  39. package/dist/react/chunk-KJX5LOMN.js.map +1 -0
  40. package/dist/react/chunk-KLXK4V6G.js +65 -0
  41. package/dist/react/chunk-KLXK4V6G.js.map +1 -0
  42. package/dist/react/chunk-LJLMKEKI.js +245 -0
  43. package/dist/react/chunk-LJLMKEKI.js.map +1 -0
  44. package/dist/react/chunk-MIXAYX55.js +147 -0
  45. package/dist/react/chunk-MIXAYX55.js.map +1 -0
  46. package/dist/react/chunk-RPNCWADG.js +248 -0
  47. package/dist/react/chunk-RPNCWADG.js.map +1 -0
  48. package/dist/react/chunk-S6RDMHHH.js +47 -0
  49. package/dist/react/chunk-S6RDMHHH.js.map +1 -0
  50. package/dist/react/chunk-U6RIOMF4.js +893 -0
  51. package/dist/react/chunk-U6RIOMF4.js.map +1 -0
  52. package/dist/react/chunk-WCRLJFBW.js +5568 -0
  53. package/dist/react/chunk-WCRLJFBW.js.map +1 -0
  54. package/dist/react/chunk-YF6S7S36.js +588 -0
  55. package/dist/react/chunk-YF6S7S36.js.map +1 -0
  56. package/dist/react/dist-es-5WYA7CWK.js +379 -0
  57. package/dist/react/dist-es-5WYA7CWK.js.map +1 -0
  58. package/dist/react/dist-es-CR5AOOCO.js +333 -0
  59. package/dist/react/dist-es-CR5AOOCO.js.map +1 -0
  60. package/dist/react/dist-es-KZ3GLAJI.js +494 -0
  61. package/dist/react/dist-es-KZ3GLAJI.js.map +1 -0
  62. package/dist/react/dist-es-R4TRTT45.js +22 -0
  63. package/dist/react/dist-es-R4TRTT45.js.map +1 -0
  64. package/dist/react/dist-es-SKDPAJEW.js +169 -0
  65. package/dist/react/dist-es-SKDPAJEW.js.map +1 -0
  66. package/dist/react/dist-es-TOHBZNTZ.js +71 -0
  67. package/dist/react/dist-es-TOHBZNTZ.js.map +1 -0
  68. package/dist/react/dist-es-XNAC47MK.js +90 -0
  69. package/dist/react/dist-es-XNAC47MK.js.map +1 -0
  70. package/dist/react/event-streams-WAZW4P3K.js +277 -0
  71. package/dist/react/event-streams-WAZW4P3K.js.map +1 -0
  72. package/dist/react/index.d.ts +53 -4
  73. package/dist/react/index.d.ts.map +1 -1
  74. package/dist/react/index.js +10991 -190
  75. package/dist/react/index.js.map +1 -1
  76. package/dist/react/loadSso-KXVD6CBM.js +556 -0
  77. package/dist/react/loadSso-KXVD6CBM.js.map +1 -0
  78. package/dist/react/service.config-I7RKP6FE.js +14 -0
  79. package/dist/react/service.config-I7RKP6FE.js.map +1 -0
  80. package/dist/react/services/core.service.d.ts +11 -1
  81. package/dist/react/services/core.service.d.ts.map +1 -1
  82. package/dist/react/signin-SEY3FDQ5.js +653 -0
  83. package/dist/react/signin-SEY3FDQ5.js.map +1 -0
  84. package/dist/react/sso-oidc-REODVHH5.js +786 -0
  85. package/dist/react/sso-oidc-REODVHH5.js.map +1 -0
  86. package/dist/react/sts-I3M4QP37.js +3948 -0
  87. package/dist/react/sts-I3M4QP37.js.map +1 -0
  88. package/dist/react/websocket/WebSocketManager.d.ts +68 -0
  89. package/dist/react/websocket/WebSocketManager.d.ts.map +1 -0
  90. package/dist/react/websocket/index.d.ts +3 -0
  91. package/dist/react/websocket/index.d.ts.map +1 -0
  92. package/dist/react/websocket/optimistic.d.ts +51 -0
  93. package/dist/react/websocket/optimistic.d.ts.map +1 -0
  94. package/dist/react/websocket-OSLLJSNO.js +10 -0
  95. package/dist/react/websocket-OSLLJSNO.js.map +1 -0
  96. package/dist/sst/components/monorise-core.d.ts +10 -0
  97. package/dist/sst/components/monorise-core.d.ts.map +1 -1
  98. package/dist/sst/index.js +75 -12
  99. package/dist/sst/index.js.map +1 -1
  100. package/package.json +9 -1
@@ -1,10 +1,53 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ type WhereOperator = {
4
+ $eq: string | number | boolean;
5
+ } | {
6
+ $ne: string | number | boolean;
7
+ } | {
8
+ $gt: number;
9
+ } | {
10
+ $lt: number;
11
+ } | {
12
+ $gte: number;
13
+ } | {
14
+ $lte: number;
15
+ } | {
16
+ $exists: boolean;
17
+ } | {
18
+ $beginsWith: string;
19
+ };
20
+ type WhereClause = WhereOperator | string | number | boolean;
21
+ type WhereConditions = Record<string, WhereClause>;
22
+ type AdjustmentConditionFn<B extends z.ZodRawShape = z.ZodRawShape> = (data: Partial<z.infer<z.ZodObject<B>>>, adjustments: Record<string, number>) => WhereConditions;
23
+ type AdjustmentCondition<B extends z.ZodRawShape = z.ZodRawShape> = WhereConditions | AdjustmentConditionFn<B>;
24
+ type UpdateConditionFn<B extends z.ZodRawShape = z.ZodRawShape> = (data: Partial<z.infer<z.ZodObject<B>>>) => WhereConditions;
25
+ type UpdateCondition<B extends z.ZodRawShape = z.ZodRawShape> = WhereConditions | UpdateConditionFn<B>;
26
+
3
27
  declare enum Entity {
4
28
  }
5
29
  interface EntitySchemaMap {
6
30
  [key: string]: Record<string, any>;
7
31
  }
32
+ /**
33
+ * @description Configuration for a mutual relationship between two entities.
34
+ * Defines the schema for mutualData validation. Define once, reference from both entity configs.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const enrollmentMutual = createMutualConfig({
39
+ * entities: [Entity.STUDENT, Entity.COURSE],
40
+ * mutualDataSchema: z.object({
41
+ * role: z.enum(['student', 'auditor']),
42
+ * enrolledAt: z.string().datetime(),
43
+ * }),
44
+ * });
45
+ * ```
46
+ */
47
+ interface MutualConfig<MD extends z.ZodRawShape = z.ZodRawShape> {
48
+ entities: [Entity, Entity];
49
+ mutualDataSchema: z.ZodObject<MD>;
50
+ }
8
51
  type DraftEntity<T extends Entity = Entity> = T extends keyof EntitySchemaMap ? EntitySchemaMap[T] : never;
9
52
  type NumericFields<T> = {
10
53
  [K in keyof T as T[K] extends number ? K : never]?: number;
@@ -109,6 +152,11 @@ interface MonoriseEntityConfig<T extends Entity = Entity, B extends z.ZodRawShap
109
152
  * @returns the final state of `mutualData` to be stored in the mutual record. Must be an object.
110
153
  */
111
154
  mutualDataProcessor?: (mutualIds: string[], currentMutual: any, customContext?: Record<string, any>) => Record<string, any>;
155
+ /**
156
+ * @description (Optional) Reference to a mutual config created by `createMutualConfig`.
157
+ * Provides mutualData schema validation for create/update operations on this mutual relationship.
158
+ */
159
+ mutual?: MutualConfig;
112
160
  };
113
161
  };
114
162
  /**
@@ -218,6 +266,8 @@ interface MonoriseEntityConfig<T extends Entity = Entity, B extends z.ZodRawShap
218
266
  * When adjusting numeric fields, these constraints are enforced at the database level.
219
267
  * If an adjustment would violate a constraint, the operation is rejected.
220
268
  *
269
+ * @deprecated Use `conditions` instead. Will be removed in a future version.
270
+ *
221
271
  * @example
222
272
  * ```ts
223
273
  * {
@@ -253,10 +303,59 @@ interface MonoriseEntityConfig<T extends Entity = Entity, B extends z.ZodRawShap
253
303
  };
254
304
  };
255
305
  };
306
+ /**
307
+ * @description Named conditions for adjustEntity operations.
308
+ * Each condition is either a static `WhereConditions` object or a function
309
+ * `(data, adjustments) => WhereConditions` that receives the entity's current data
310
+ * and the adjustment deltas.
311
+ *
312
+ * When defined, `$condition` is **required** in the adjustEntity request body.
313
+ * The client sends a condition name (string), the server resolves it to a
314
+ * DynamoDB ConditionExpression.
315
+ *
316
+ * @example
317
+ * ```ts
318
+ * {
319
+ * adjustmentConditions: {
320
+ * withdraw: (data, adjustments) => ({
321
+ * balance: { $gte: (data.minBalance ?? 0) + Math.abs(adjustments?.balance ?? 0) },
322
+ * }),
323
+ * deposit: (data, adjustments) => ({
324
+ * balance: { $lte: 1000000 - (adjustments.balance ?? 0) },
325
+ * }),
326
+ * }
327
+ * }
328
+ * ```
329
+ */
330
+ adjustmentConditions?: {
331
+ [conditionName: string]: WhereConditions | ((data: Partial<z.infer<z.ZodObject<B>>>, adjustments: Record<string, number>) => WhereConditions);
332
+ };
333
+ /**
334
+ * @description Named conditions for updateEntity operations.
335
+ * Each condition is either a static `WhereConditions` object or a function
336
+ * `(data) => WhereConditions` that receives the entity's current data.
337
+ *
338
+ * `$condition` is always **optional** for updateEntity.
339
+ * The client sends a condition name (string), the server resolves it to a
340
+ * DynamoDB ConditionExpression. Replaces raw `$where` (deprecated).
341
+ *
342
+ * @example
343
+ * ```ts
344
+ * {
345
+ * updateConditions: {
346
+ * publish: { status: { $eq: 'draft' } },
347
+ * archive: (data) => ({ status: { $ne: 'archived' } }),
348
+ * }
349
+ * }
350
+ * ```
351
+ */
352
+ updateConditions?: {
353
+ [conditionName: string]: WhereConditions | ((data: Partial<z.infer<z.ZodObject<B>>>) => WhereConditions);
354
+ };
256
355
  }
257
356
 
258
357
  declare const createEntityConfig: <T extends Entity, B extends z.ZodRawShape, C extends z.ZodRawShape, M extends z.ZodRawShape, CO extends z.ZodObject<C> | undefined = undefined, MO extends z.ZodObject<M> | undefined = undefined>(config: MonoriseEntityConfig<T, B, C, M, CO, MO>) => {
259
- finalSchema: (CO extends z.AnyZodObject ? MO extends z.AnyZodObject ? z.ZodObject<MO["shape"] & CO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<MO["shape"] & CO["shape"]>, any> extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never, z.baseObjectInputType<MO["shape"] & CO["shape"]> extends infer T_2 ? { [k_1 in keyof T_2]: T_2[k_1]; } : never> : CO : MO extends z.AnyZodObject ? z.ZodObject<MO["shape"] & B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<MO["shape"] & B>, any> extends infer T_3 ? { [k_2 in keyof T_3]: T_3[k_2]; } : never, z.baseObjectInputType<MO["shape"] & B> extends infer T_4 ? { [k_3 in keyof T_4]: T_4[k_3]; } : never> : z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_5 ? { [k_4 in keyof T_5]: T_5[k_4]; } : never, z.baseObjectInputType<B> extends infer T_6 ? { [k_5 in keyof T_6]: T_6[k_5]; } : never>) | z.ZodEffects<CO extends z.AnyZodObject ? MO extends z.AnyZodObject ? z.ZodObject<MO["shape"] & CO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<MO["shape"] & CO["shape"]>, any> extends infer T_7 ? { [k in keyof T_7]: T_7[k]; } : never, z.baseObjectInputType<MO["shape"] & CO["shape"]> extends infer T_8 ? { [k_1 in keyof T_8]: T_8[k_1]; } : never> : CO : MO extends z.AnyZodObject ? z.ZodObject<MO["shape"] & B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<MO["shape"] & B>, any> extends infer T_9 ? { [k_2 in keyof T_9]: T_9[k_2]; } : never, z.baseObjectInputType<MO["shape"] & B> extends infer T_10 ? { [k_3 in keyof T_10]: T_10[k_3]; } : never> : z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_11 ? { [k_4 in keyof T_11]: T_11[k_4]; } : never, z.baseObjectInputType<B> extends infer T_12 ? { [k_5 in keyof T_12]: T_12[k_5]; } : never>, z.output<CO extends z.AnyZodObject ? MO extends z.AnyZodObject ? z.ZodObject<MO["shape"] & CO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<MO["shape"] & CO["shape"]>, any> extends infer T_13 ? { [k in keyof T_13]: T_13[k]; } : never, z.baseObjectInputType<MO["shape"] & CO["shape"]> extends infer T_14 ? { [k_1 in keyof T_14]: T_14[k_1]; } : never> : CO : MO extends z.AnyZodObject ? z.ZodObject<MO["shape"] & B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<MO["shape"] & B>, any> extends infer T_15 ? { [k_2 in keyof T_15]: T_15[k_2]; } : never, z.baseObjectInputType<MO["shape"] & B> extends infer T_16 ? { [k_3 in keyof T_16]: T_16[k_3]; } : never> : z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_17 ? { [k_4 in keyof T_17]: T_17[k_4]; } : never, z.baseObjectInputType<B> extends infer T_18 ? { [k_5 in keyof T_18]: T_18[k_5]; } : never>>, z.input<CO extends z.AnyZodObject ? MO extends z.AnyZodObject ? z.ZodObject<MO["shape"] & CO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<MO["shape"] & CO["shape"]>, any> extends infer T_19 ? { [k in keyof T_19]: T_19[k]; } : never, z.baseObjectInputType<MO["shape"] & CO["shape"]> extends infer T_20 ? { [k_1 in keyof T_20]: T_20[k_1]; } : never> : CO : MO extends z.AnyZodObject ? z.ZodObject<MO["shape"] & B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<MO["shape"] & B>, any> extends infer T_21 ? { [k_2 in keyof T_21]: T_21[k_2]; } : never, z.baseObjectInputType<MO["shape"] & B> extends infer T_22 ? { [k_3 in keyof T_22]: T_22[k_3]; } : never> : z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_23 ? { [k_4 in keyof T_23]: T_23[k_4]; } : never, z.baseObjectInputType<B> extends infer T_24 ? { [k_5 in keyof T_24]: T_24[k_5]; } : never>>>;
358
+ finalSchema: (CO extends z.AnyZodObject ? MO extends z.AnyZodObject ? z.ZodObject<B & CO["shape"] & MO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & CO["shape"] & MO["shape"]>, any> extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never, z.baseObjectInputType<B & CO["shape"] & MO["shape"]> extends infer T_2 ? { [k_1 in keyof T_2]: T_2[k_1]; } : never> : z.ZodObject<B & CO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & CO["shape"]>, any> extends infer T_3 ? { [k_2 in keyof T_3]: T_3[k_2]; } : never, z.baseObjectInputType<B & CO["shape"]> extends infer T_4 ? { [k_3 in keyof T_4]: T_4[k_3]; } : never> : MO extends z.AnyZodObject ? z.ZodObject<B & MO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & MO["shape"]>, any> extends infer T_5 ? { [k_4 in keyof T_5]: T_5[k_4]; } : never, z.baseObjectInputType<B & MO["shape"]> extends infer T_6 ? { [k_5 in keyof T_6]: T_6[k_5]; } : never> : z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_7 ? { [k_6 in keyof T_7]: T_7[k_6]; } : never, z.baseObjectInputType<B> extends infer T_8 ? { [k_7 in keyof T_8]: T_8[k_7]; } : never>) | z.ZodEffects<CO extends z.AnyZodObject ? MO extends z.AnyZodObject ? z.ZodObject<B & CO["shape"] & MO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & CO["shape"] & MO["shape"]>, any> extends infer T_9 ? { [k in keyof T_9]: T_9[k]; } : never, z.baseObjectInputType<B & CO["shape"] & MO["shape"]> extends infer T_10 ? { [k_1 in keyof T_10]: T_10[k_1]; } : never> : z.ZodObject<B & CO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & CO["shape"]>, any> extends infer T_11 ? { [k_2 in keyof T_11]: T_11[k_2]; } : never, z.baseObjectInputType<B & CO["shape"]> extends infer T_12 ? { [k_3 in keyof T_12]: T_12[k_3]; } : never> : MO extends z.AnyZodObject ? z.ZodObject<B & MO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & MO["shape"]>, any> extends infer T_13 ? { [k_4 in keyof T_13]: T_13[k_4]; } : never, z.baseObjectInputType<B & MO["shape"]> extends infer T_14 ? { [k_5 in keyof T_14]: T_14[k_5]; } : never> : z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_15 ? { [k_6 in keyof T_15]: T_15[k_6]; } : never, z.baseObjectInputType<B> extends infer T_16 ? { [k_7 in keyof T_16]: T_16[k_7]; } : never>, z.output<CO extends z.AnyZodObject ? MO extends z.AnyZodObject ? z.ZodObject<B & CO["shape"] & MO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & CO["shape"] & MO["shape"]>, any> extends infer T_17 ? { [k in keyof T_17]: T_17[k]; } : never, z.baseObjectInputType<B & CO["shape"] & MO["shape"]> extends infer T_18 ? { [k_1 in keyof T_18]: T_18[k_1]; } : never> : z.ZodObject<B & CO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & CO["shape"]>, any> extends infer T_19 ? { [k_2 in keyof T_19]: T_19[k_2]; } : never, z.baseObjectInputType<B & CO["shape"]> extends infer T_20 ? { [k_3 in keyof T_20]: T_20[k_3]; } : never> : MO extends z.AnyZodObject ? z.ZodObject<B & MO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & MO["shape"]>, any> extends infer T_21 ? { [k_4 in keyof T_21]: T_21[k_4]; } : never, z.baseObjectInputType<B & MO["shape"]> extends infer T_22 ? { [k_5 in keyof T_22]: T_22[k_5]; } : never> : z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_23 ? { [k_6 in keyof T_23]: T_23[k_6]; } : never, z.baseObjectInputType<B> extends infer T_24 ? { [k_7 in keyof T_24]: T_24[k_7]; } : never>>, z.input<CO extends z.AnyZodObject ? MO extends z.AnyZodObject ? z.ZodObject<B & CO["shape"] & MO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & CO["shape"] & MO["shape"]>, any> extends infer T_25 ? { [k in keyof T_25]: T_25[k]; } : never, z.baseObjectInputType<B & CO["shape"] & MO["shape"]> extends infer T_26 ? { [k_1 in keyof T_26]: T_26[k_1]; } : never> : z.ZodObject<B & CO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & CO["shape"]>, any> extends infer T_27 ? { [k_2 in keyof T_27]: T_27[k_2]; } : never, z.baseObjectInputType<B & CO["shape"]> extends infer T_28 ? { [k_3 in keyof T_28]: T_28[k_3]; } : never> : MO extends z.AnyZodObject ? z.ZodObject<B & MO["shape"], z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B & MO["shape"]>, any> extends infer T_29 ? { [k_4 in keyof T_29]: T_29[k_4]; } : never, z.baseObjectInputType<B & MO["shape"]> extends infer T_30 ? { [k_5 in keyof T_30]: T_30[k_5]; } : never> : z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_31 ? { [k_6 in keyof T_31]: T_31[k_6]; } : never, z.baseObjectInputType<B> extends infer T_32 ? { [k_7 in keyof T_32]: T_32[k_7]; } : never>>>;
260
359
  name: string | T;
261
360
  displayName: string;
262
361
  authMethod?: {
@@ -264,7 +363,7 @@ declare const createEntityConfig: <T extends Entity, B extends z.ZodRawShape, C
264
363
  tokenExpiresIn: number;
265
364
  };
266
365
  };
267
- baseSchema: z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_25 ? { [k_4 in keyof T_25]: T_25[k_4]; } : never, z.baseObjectInputType<B> extends infer T_26 ? { [k_5 in keyof T_26]: T_26[k_5]; } : never>;
366
+ baseSchema: z.ZodObject<B, z.UnknownKeysParam, z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_33 ? { [k_6 in keyof T_33]: T_33[k_6]; } : never, z.baseObjectInputType<B> extends infer T_34 ? { [k_7 in keyof T_34]: T_34[k_7]; } : never>;
268
367
  createSchema?: CO | undefined;
269
368
  searchableFields?: (keyof B)[] | undefined;
270
369
  uniqueFields?: (keyof B)[] | undefined;
@@ -278,6 +377,7 @@ declare const createEntityConfig: <T extends Entity, B extends z.ZodRawShape, C
278
377
  entityType: Entity;
279
378
  toMutualIds?: (context: any) => string[];
280
379
  mutualDataProcessor?: (mutualIds: string[], currentMutual: any, customContext?: Record<string, any>) => Record<string, any>;
380
+ mutual?: MutualConfig;
281
381
  };
282
382
  };
283
383
  prejoins?: {
@@ -312,6 +412,13 @@ declare const createEntityConfig: <T extends Entity, B extends z.ZodRawShape, C
312
412
  maxField?: (keyof { [K_2 in keyof B as B[K_2] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K_2 : never]: K_2; } extends never ? string : keyof { [K_3 in keyof B as B[K_3] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K_3 : never]: K_3; }) | undefined;
313
413
  };
314
414
  } | undefined;
415
+ adjustmentConditions?: {
416
+ [conditionName: string]: undefined | ((data: Partial<z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_35 ? { [k_6 in keyof T_35]: T_35[k_6]; } : never>, adjustments: Record<string, number>) => undefined);
417
+ } | undefined;
418
+ updateConditions?: {
419
+ [conditionName: string]: undefined | ((data: Partial<z.objectUtil.addQuestionMarks<z.baseObjectOutputType<B>, any> extends infer T_35 ? { [k_6 in keyof T_35]: T_35[k_6]; } : never>) => undefined);
420
+ } | undefined;
315
421
  };
422
+ declare const createMutualConfig: <MD extends z.ZodRawShape>(config: MutualConfig<MD>) => MutualConfig<MD>;
316
423
 
317
- export { type CreatedEntity, type DraftEntity, Entity, type EntitySchemaMap, type MonoriseEntityConfig, type NumericFields, createEntityConfig };
424
+ export { type AdjustmentCondition, type AdjustmentConditionFn, type CreatedEntity, type DraftEntity, Entity, type EntitySchemaMap, type MonoriseEntityConfig, type MutualConfig, type NumericFields, type UpdateCondition, type UpdateConditionFn, type WhereClause, type WhereConditions, type WhereOperator, createEntityConfig, createMutualConfig };
@@ -37,8 +37,10 @@ function makeSchema(config) {
37
37
  var createEntityConfig = (config) => __spreadProps(__spreadValues({}, config), {
38
38
  finalSchema: makeSchema(config)
39
39
  });
40
+ var createMutualConfig = (config) => config;
40
41
  export {
41
42
  Entity,
42
- createEntityConfig
43
+ createEntityConfig,
44
+ createMutualConfig
43
45
  };
44
46
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../types/monorise.type.ts","../utils/index.ts"],"sourcesContent":["import type { z } from 'zod';\n\nexport enum Entity {}\n\nexport interface EntitySchemaMap {\n [key: string]: Record<string, any>;\n}\n\nexport type DraftEntity<T extends Entity = Entity> =\n T extends keyof EntitySchemaMap ? EntitySchemaMap[T] : never;\n\nexport type NumericFields<T> = {\n [K in keyof T as T[K] extends number ? K : never]?: number;\n};\n\nexport type CreatedEntity<T extends Entity = Entity> = {\n entityId: string;\n entityType: string;\n data: T extends keyof EntitySchemaMap ? EntitySchemaMap[T] : never;\n createdAt: string;\n updatedAt: string;\n};\n\n/**\n * @description Configuration for a monorise entity, a shared configuration that is used across frontend and backend.\n * This can be served as a single source of truth for the entity configuration.\n * It is used to define the schema, and mutual relationships between this entity and other entities.\n *\n * @example\n * ```ts\n * const baseSchema = z.object({\n * title: z.string(),\n * }).partial();\n *\n * const createSchema = baseSchema.extend({\n * title: z.string(),\n * })\n *\n * const config = createEntityConfig({\n * name: 'learner',\n * displayName: 'Learner',\n * baseSchema,\n * createSchema,\n * });\n * ```\n */\nexport interface MonoriseEntityConfig<\n T extends Entity = Entity,\n B extends z.ZodRawShape = z.ZodRawShape,\n C extends z.ZodRawShape = z.ZodRawShape,\n M extends z.ZodRawShape = z.ZodRawShape,\n CO extends z.ZodObject<C> | undefined = undefined,\n MO extends z.ZodObject<M> | undefined = undefined,\n> {\n /**\n * @description Name of the entity. Must be in **lower-kebab-case** and **unique** across all entities\n *\n * @example `learner`, `learning-activity`\n */\n name: string | T;\n\n /**\n * @description Display name of the entity. It is not required to be unique\n */\n displayName: string;\n\n /**\n * @description (DEPRECATED) Use `uniqueFields` instead, Monorise should not handle auth mechanism\n * @description (Optional) Specify the authentication method to be used for the entity\n */\n authMethod?: {\n /**\n * @description Authentication method using email\n *\n * Note: The email used for authentication is unique per entity.\n * For example, if `johndoe@mail.com` is used for `learner` entity,\n * it can be reused again on `admin` entity. However, the same email\n * address cannot be repeated for the same entity.\n */\n email: {\n /**\n * @description Number of milliseconds before the token expires\n */\n tokenExpiresIn: number;\n };\n };\n\n /**\n * @description Base schema for the entity\n */\n baseSchema: z.ZodObject<B>;\n\n /**\n * @description Minimal schema required to create an entity\n */\n createSchema?: CO;\n searchableFields?: (keyof B)[];\n uniqueFields?: (keyof B)[];\n\n /**\n * @description Define mutual relationship of this entity with other entities\n */\n mutual?: {\n /**\n * @description Subscribes to update events from specified entities in the array.\n * These events will be used to run prejoin processor.\n */\n subscribes?: { entityType: Entity }[];\n /**\n * @description Virtual schema for mutual relationship. The schema is only used for validation purpose, but these fields are not stored in the database\n */\n mutualSchema: MO;\n\n /**\n * @description Keys of `mutualFields` are fields defined in `mutualSchema`.\n * Each field is a mutual relationship between this entity and another entity.\n */\n mutualFields: {\n [key: string]: {\n entityType: Entity;\n toMutualIds?: (context: any) => string[];\n /**\n * @description (Optional) Custom function to process `mutualData`. If not provided, `mutualData` will be empty.\n *\n * @returns the final state of `mutualData` to be stored in the mutual record. Must be an object.\n */\n mutualDataProcessor?: (\n mutualIds: string[],\n currentMutual: any,\n customContext?: Record<string, any>,\n ) => Record<string, any>;\n };\n };\n\n /**\n * @description (Optional) Better known as tree processor\n * This is used to prejoin entities that are not directly related as mutual.\n * For example, if `learner` entity is related to `course` entity, and `course` entity is related to `module` entity,\n * prejoins can be used to join `learner` and `module` entities.\n * With this, the `learner` entity can access the `module` entity without having to go through the `course` entity,\n * hence reducing the number of queries.\n *\n * DynamoDB best practices: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-general-normalization.html\n *\n */\n prejoins?: {\n mutualField: string;\n targetEntityType: Entity;\n entityPaths: {\n skipCache?: boolean;\n entityType: Entity;\n processor?: (items: any[], context: Record<string, any>) => any;\n }[];\n }[];\n };\n /**\n * Use this function to perform side effects on the final schema for example refine/superRefine the schema\n *\n * @param schema The final schema of the entity (the combination of `baseSchema`/`createSchema` and `mutualSchema` if specified)\n * @returns void\n *\n * @example\n * ```ts\n * effect: (schema) => {\n * schema.refine(\n * // refinement logic here\n * )\n * }\n */\n effect?: (\n schema: z.ZodObject<z.ZodRawShape>,\n ) => z.ZodEffects<z.ZodObject<z.ZodRawShape>>;\n\n /**\n * @description (Optional) Use tags to create additional access patterns for the entity.\n * Time complexity for retrieving tagged entities is O(1).\n *\n * The following configuration will create a tag named `region` for the `organization` entity grouped by `region`.\n * You would then be able to retrieve all organizations in a specific region by:\n * GET `/core/tag/organization/region?group={region_name}`\n *\n * @example\n *\n * ```ts\n * {\n * name: 'organization',\n * tags: [\n * {\n * name: 'region',\n * processor: (entity) => {\n * return [\n * {\n * group: entity.data.region\n * }\n * ]\n * },\n * }\n * ]\n * }\n * ```\n *\n * @description\n *\n * The following configuration will create a tag named `dob` for the `user` entity sorted by `dob`.\n * You would then be able to retrieve all users sorted by `dob` by:\n * GET `/core/tag/user/dob?start=2000-01-01&end=2020-12-31`\n *\n * @example\n * ```ts\n * {\n * name: 'user',\n * tags: [\n * {\n * name: 'dob',\n * processor: (entity) => {\n * return [\n * {\n * sortValue: entity.data.dob\n * }\n * ]\n * },\n * }\n * ]\n * }\n * ```\n */\n tags?: {\n name: string;\n processor: (entity: { entityId: string; entityType: string; data: Record<string, any>; createdAt: string; updatedAt: string }) => {\n group?: string;\n sortValue?: string;\n }[];\n }[];\n\n /**\n * @description (Optional) Constraints for `adjustEntity` operations.\n * When adjusting numeric fields, these constraints are enforced at the database level.\n * If an adjustment would violate a constraint, the operation is rejected.\n *\n * @example\n * ```ts\n * {\n * adjustmentConstraints: {\n * // Static: same for all entities of this type\n * balance: { min: 0 },\n * credits: { min: 0, max: 10000 },\n *\n * // Dynamic: reads constraint value from entity's own data\n * balance: { minField: 'minBalance' },\n * credits: { min: 0, maxField: 'creditLimit' },\n * }\n * }\n * ```\n */\n adjustmentConstraints?: {\n [fieldName: string]: {\n /** Static minimum value */\n min?: number;\n /** Static maximum value */\n max?: number;\n /** Field name on the entity whose value is used as the minimum (must be a numeric field) */\n minField?: keyof {\n [K in keyof B as B[K] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K : never]: K;\n } extends never ? string : keyof {\n [K in keyof B as B[K] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K : never]: K;\n };\n /** Field name on the entity whose value is used as the maximum (must be a numeric field) */\n maxField?: keyof {\n [K in keyof B as B[K] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K : never]: K;\n } extends never ? string : keyof {\n [K in keyof B as B[K] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K : never]: K;\n };\n };\n };\n}\n","import type { Entity, MonoriseEntityConfig } from '../types/monorise.type';\nimport { z } from 'zod';\n\nfunction makeSchema<\n T extends Entity,\n B extends z.ZodRawShape,\n C extends z.ZodRawShape,\n M extends z.ZodRawShape,\n CO extends z.ZodObject<C> | undefined = undefined,\n MO extends z.ZodObject<M> | undefined = undefined,\n>(config: MonoriseEntityConfig<T, B, C, M, CO, MO>) {\n const { baseSchema, createSchema, mutual, effect } = config;\n const { mutualSchema } = mutual || {};\n\n type FinalSchemaType = CO extends z.AnyZodObject\n ? MO extends z.AnyZodObject\n ? z.ZodObject<MO['shape'] & CO['shape']>\n : CO\n : MO extends z.AnyZodObject\n ? z.ZodObject<MO['shape'] & B>\n : z.ZodObject<B>;\n\n const finalSchema = z.object({\n ...baseSchema.shape,\n ...createSchema?.shape,\n ...mutualSchema?.shape,\n }) as FinalSchemaType;\n\n if (effect) {\n return effect(finalSchema) as z.ZodEffects<FinalSchemaType>;\n }\n\n return finalSchema;\n}\n\nconst createEntityConfig = <\n T extends Entity,\n B extends z.ZodRawShape,\n C extends z.ZodRawShape,\n M extends z.ZodRawShape,\n CO extends z.ZodObject<C> | undefined = undefined,\n MO extends z.ZodObject<M> | undefined = undefined,\n>(\n config: MonoriseEntityConfig<T, B, C, M, CO, MO>,\n) => ({\n ...config,\n finalSchema: makeSchema(config),\n});\n\nexport { createEntityConfig };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAEO,IAAK,SAAL,kBAAKA,YAAL;AAAK,SAAAA;AAAA,GAAA;;;ACDZ,SAAS,SAAS;AAElB,SAAS,WAOP,QAAkD;AAClD,QAAM,EAAE,YAAY,cAAc,QAAQ,OAAO,IAAI;AACrD,QAAM,EAAE,aAAa,IAAI,UAAU,CAAC;AAUpC,QAAM,cAAc,EAAE,OAAO,iDACxB,WAAW,QACX,6CAAc,QACd,6CAAc,MAClB;AAED,MAAI,QAAQ;AACV,WAAO,OAAO,WAAW;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,IAAM,qBAAqB,CAQzB,WACI,iCACD,SADC;AAAA,EAEJ,aAAa,WAAW,MAAM;AAChC;","names":["Entity"]}
1
+ {"version":3,"sources":["../types/monorise.type.ts","../utils/index.ts"],"sourcesContent":["import type { z } from 'zod';\nimport type { WhereConditions } from './conditions.type';\n\nexport enum Entity {}\n\nexport interface EntitySchemaMap {\n [key: string]: Record<string, any>;\n}\n\n/**\n * @description Configuration for a mutual relationship between two entities.\n * Defines the schema for mutualData validation. Define once, reference from both entity configs.\n *\n * @example\n * ```ts\n * const enrollmentMutual = createMutualConfig({\n * entities: [Entity.STUDENT, Entity.COURSE],\n * mutualDataSchema: z.object({\n * role: z.enum(['student', 'auditor']),\n * enrolledAt: z.string().datetime(),\n * }),\n * });\n * ```\n */\nexport interface MutualConfig<\n MD extends z.ZodRawShape = z.ZodRawShape,\n> {\n entities: [Entity, Entity];\n mutualDataSchema: z.ZodObject<MD>;\n}\n\nexport type DraftEntity<T extends Entity = Entity> =\n T extends keyof EntitySchemaMap ? EntitySchemaMap[T] : never;\n\nexport type NumericFields<T> = {\n [K in keyof T as T[K] extends number ? K : never]?: number;\n};\n\nexport type CreatedEntity<T extends Entity = Entity> = {\n entityId: string;\n entityType: string;\n data: T extends keyof EntitySchemaMap ? EntitySchemaMap[T] : never;\n createdAt: string;\n updatedAt: string;\n};\n\n/**\n * @description Configuration for a monorise entity, a shared configuration that is used across frontend and backend.\n * This can be served as a single source of truth for the entity configuration.\n * It is used to define the schema, and mutual relationships between this entity and other entities.\n *\n * @example\n * ```ts\n * const baseSchema = z.object({\n * title: z.string(),\n * }).partial();\n *\n * const createSchema = baseSchema.extend({\n * title: z.string(),\n * })\n *\n * const config = createEntityConfig({\n * name: 'learner',\n * displayName: 'Learner',\n * baseSchema,\n * createSchema,\n * });\n * ```\n */\nexport interface MonoriseEntityConfig<\n T extends Entity = Entity,\n B extends z.ZodRawShape = z.ZodRawShape,\n C extends z.ZodRawShape = z.ZodRawShape,\n M extends z.ZodRawShape = z.ZodRawShape,\n CO extends z.ZodObject<C> | undefined = undefined,\n MO extends z.ZodObject<M> | undefined = undefined,\n> {\n /**\n * @description Name of the entity. Must be in **lower-kebab-case** and **unique** across all entities\n *\n * @example `learner`, `learning-activity`\n */\n name: string | T;\n\n /**\n * @description Display name of the entity. It is not required to be unique\n */\n displayName: string;\n\n /**\n * @description (DEPRECATED) Use `uniqueFields` instead, Monorise should not handle auth mechanism\n * @description (Optional) Specify the authentication method to be used for the entity\n */\n authMethod?: {\n /**\n * @description Authentication method using email\n *\n * Note: The email used for authentication is unique per entity.\n * For example, if `johndoe@mail.com` is used for `learner` entity,\n * it can be reused again on `admin` entity. However, the same email\n * address cannot be repeated for the same entity.\n */\n email: {\n /**\n * @description Number of milliseconds before the token expires\n */\n tokenExpiresIn: number;\n };\n };\n\n /**\n * @description Base schema for the entity\n */\n baseSchema: z.ZodObject<B>;\n\n /**\n * @description Minimal schema required to create an entity\n */\n createSchema?: CO;\n searchableFields?: (keyof B)[];\n uniqueFields?: (keyof B)[];\n\n /**\n * @description Define mutual relationship of this entity with other entities\n */\n mutual?: {\n /**\n * @description Subscribes to update events from specified entities in the array.\n * These events will be used to run prejoin processor.\n */\n subscribes?: { entityType: Entity }[];\n /**\n * @description Virtual schema for mutual relationship. The schema is only used for validation purpose, but these fields are not stored in the database\n */\n mutualSchema: MO;\n\n /**\n * @description Keys of `mutualFields` are fields defined in `mutualSchema`.\n * Each field is a mutual relationship between this entity and another entity.\n */\n mutualFields: {\n [key: string]: {\n entityType: Entity;\n toMutualIds?: (context: any) => string[];\n /**\n * @description (Optional) Custom function to process `mutualData`. If not provided, `mutualData` will be empty.\n *\n * @returns the final state of `mutualData` to be stored in the mutual record. Must be an object.\n */\n mutualDataProcessor?: (\n mutualIds: string[],\n currentMutual: any,\n customContext?: Record<string, any>,\n ) => Record<string, any>;\n /**\n * @description (Optional) Reference to a mutual config created by `createMutualConfig`.\n * Provides mutualData schema validation for create/update operations on this mutual relationship.\n */\n mutual?: MutualConfig;\n };\n };\n\n /**\n * @description (Optional) Better known as tree processor\n * This is used to prejoin entities that are not directly related as mutual.\n * For example, if `learner` entity is related to `course` entity, and `course` entity is related to `module` entity,\n * prejoins can be used to join `learner` and `module` entities.\n * With this, the `learner` entity can access the `module` entity without having to go through the `course` entity,\n * hence reducing the number of queries.\n *\n * DynamoDB best practices: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-general-normalization.html\n *\n */\n prejoins?: {\n mutualField: string;\n targetEntityType: Entity;\n entityPaths: {\n skipCache?: boolean;\n entityType: Entity;\n processor?: (items: any[], context: Record<string, any>) => any;\n }[];\n }[];\n };\n /**\n * Use this function to perform side effects on the final schema for example refine/superRefine the schema\n *\n * @param schema The final schema of the entity (the combination of `baseSchema`/`createSchema` and `mutualSchema` if specified)\n * @returns void\n *\n * @example\n * ```ts\n * effect: (schema) => {\n * schema.refine(\n * // refinement logic here\n * )\n * }\n */\n effect?: (\n schema: z.ZodObject<z.ZodRawShape>,\n ) => z.ZodEffects<z.ZodObject<z.ZodRawShape>>;\n\n /**\n * @description (Optional) Use tags to create additional access patterns for the entity.\n * Time complexity for retrieving tagged entities is O(1).\n *\n * The following configuration will create a tag named `region` for the `organization` entity grouped by `region`.\n * You would then be able to retrieve all organizations in a specific region by:\n * GET `/core/tag/organization/region?group={region_name}`\n *\n * @example\n *\n * ```ts\n * {\n * name: 'organization',\n * tags: [\n * {\n * name: 'region',\n * processor: (entity) => {\n * return [\n * {\n * group: entity.data.region\n * }\n * ]\n * },\n * }\n * ]\n * }\n * ```\n *\n * @description\n *\n * The following configuration will create a tag named `dob` for the `user` entity sorted by `dob`.\n * You would then be able to retrieve all users sorted by `dob` by:\n * GET `/core/tag/user/dob?start=2000-01-01&end=2020-12-31`\n *\n * @example\n * ```ts\n * {\n * name: 'user',\n * tags: [\n * {\n * name: 'dob',\n * processor: (entity) => {\n * return [\n * {\n * sortValue: entity.data.dob\n * }\n * ]\n * },\n * }\n * ]\n * }\n * ```\n */\n tags?: {\n name: string;\n processor: (entity: { entityId: string; entityType: string; data: Record<string, any>; createdAt: string; updatedAt: string }) => {\n group?: string;\n sortValue?: string;\n }[];\n }[];\n\n /**\n * @description (Optional) Constraints for `adjustEntity` operations.\n * When adjusting numeric fields, these constraints are enforced at the database level.\n * If an adjustment would violate a constraint, the operation is rejected.\n *\n * @deprecated Use `conditions` instead. Will be removed in a future version.\n *\n * @example\n * ```ts\n * {\n * adjustmentConstraints: {\n * // Static: same for all entities of this type\n * balance: { min: 0 },\n * credits: { min: 0, max: 10000 },\n *\n * // Dynamic: reads constraint value from entity's own data\n * balance: { minField: 'minBalance' },\n * credits: { min: 0, maxField: 'creditLimit' },\n * }\n * }\n * ```\n */\n adjustmentConstraints?: {\n [fieldName: string]: {\n /** Static minimum value */\n min?: number;\n /** Static maximum value */\n max?: number;\n /** Field name on the entity whose value is used as the minimum (must be a numeric field) */\n minField?: keyof {\n [K in keyof B as B[K] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K : never]: K;\n } extends never ? string : keyof {\n [K in keyof B as B[K] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K : never]: K;\n };\n /** Field name on the entity whose value is used as the maximum (must be a numeric field) */\n maxField?: keyof {\n [K in keyof B as B[K] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K : never]: K;\n } extends never ? string : keyof {\n [K in keyof B as B[K] extends z.ZodNumber | z.ZodOptional<z.ZodNumber> ? K : never]: K;\n };\n };\n };\n\n /**\n * @description Named conditions for adjustEntity operations.\n * Each condition is either a static `WhereConditions` object or a function\n * `(data, adjustments) => WhereConditions` that receives the entity's current data\n * and the adjustment deltas.\n *\n * When defined, `$condition` is **required** in the adjustEntity request body.\n * The client sends a condition name (string), the server resolves it to a\n * DynamoDB ConditionExpression.\n *\n * @example\n * ```ts\n * {\n * adjustmentConditions: {\n * withdraw: (data, adjustments) => ({\n * balance: { $gte: (data.minBalance ?? 0) + Math.abs(adjustments?.balance ?? 0) },\n * }),\n * deposit: (data, adjustments) => ({\n * balance: { $lte: 1000000 - (adjustments.balance ?? 0) },\n * }),\n * }\n * }\n * ```\n */\n adjustmentConditions?: {\n [conditionName: string]:\n | WhereConditions\n | ((\n data: Partial<z.infer<z.ZodObject<B>>>,\n adjustments: Record<string, number>,\n ) => WhereConditions);\n };\n\n /**\n * @description Named conditions for updateEntity operations.\n * Each condition is either a static `WhereConditions` object or a function\n * `(data) => WhereConditions` that receives the entity's current data.\n *\n * `$condition` is always **optional** for updateEntity.\n * The client sends a condition name (string), the server resolves it to a\n * DynamoDB ConditionExpression. Replaces raw `$where` (deprecated).\n *\n * @example\n * ```ts\n * {\n * updateConditions: {\n * publish: { status: { $eq: 'draft' } },\n * archive: (data) => ({ status: { $ne: 'archived' } }),\n * }\n * }\n * ```\n */\n updateConditions?: {\n [conditionName: string]:\n | WhereConditions\n | ((data: Partial<z.infer<z.ZodObject<B>>>) => WhereConditions);\n };\n}\n","import type { Entity, MonoriseEntityConfig, MutualConfig } from '../types/monorise.type';\nimport { z } from 'zod';\n\nfunction makeSchema<\n T extends Entity,\n B extends z.ZodRawShape,\n C extends z.ZodRawShape,\n M extends z.ZodRawShape,\n CO extends z.ZodObject<C> | undefined = undefined,\n MO extends z.ZodObject<M> | undefined = undefined,\n>(config: MonoriseEntityConfig<T, B, C, M, CO, MO>) {\n const { baseSchema, createSchema, mutual, effect } = config;\n const { mutualSchema } = mutual || {};\n\n type FinalSchemaType = CO extends z.AnyZodObject\n ? MO extends z.AnyZodObject\n ? z.ZodObject<B & CO['shape'] & MO['shape']>\n : z.ZodObject<B & CO['shape']>\n : MO extends z.AnyZodObject\n ? z.ZodObject<B & MO['shape']>\n : z.ZodObject<B>;\n\n const finalSchema = z.object({\n ...baseSchema.shape,\n ...createSchema?.shape,\n ...mutualSchema?.shape,\n }) as FinalSchemaType;\n\n if (effect) {\n return effect(finalSchema) as z.ZodEffects<FinalSchemaType>;\n }\n\n return finalSchema;\n}\n\nconst createEntityConfig = <\n T extends Entity,\n B extends z.ZodRawShape,\n C extends z.ZodRawShape,\n M extends z.ZodRawShape,\n CO extends z.ZodObject<C> | undefined = undefined,\n MO extends z.ZodObject<M> | undefined = undefined,\n>(\n config: MonoriseEntityConfig<T, B, C, M, CO, MO>,\n) => ({\n ...config,\n finalSchema: makeSchema(config),\n});\n\nconst createMutualConfig = <MD extends z.ZodRawShape>(\n config: MutualConfig<MD>,\n) => config;\n\nexport { createEntityConfig, createMutualConfig };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAGO,IAAK,SAAL,kBAAKA,YAAL;AAAK,SAAAA;AAAA,GAAA;;;ACFZ,SAAS,SAAS;AAElB,SAAS,WAOP,QAAkD;AAClD,QAAM,EAAE,YAAY,cAAc,QAAQ,OAAO,IAAI;AACrD,QAAM,EAAE,aAAa,IAAI,UAAU,CAAC;AAUpC,QAAM,cAAc,EAAE,OAAO,iDACxB,WAAW,QACX,6CAAc,QACd,6CAAc,MAClB;AAED,MAAI,QAAQ;AACV,WAAO,OAAO,WAAW;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,IAAM,qBAAqB,CAQzB,WACI,iCACD,SADC;AAAA,EAEJ,aAAa,WAAW,MAAM;AAChC;AAEA,IAAM,qBAAqB,CACzB,WACG;","names":["Entity"]}
package/dist/cli/cli.js CHANGED
@@ -200,6 +200,12 @@ export const mutualHandler = coreFactory.mutualProcessor;
200
200
  export const tagHandler = coreFactory.tagProcessor;
201
201
  export const treeHandler = coreFactory.prejoinProcessor;
202
202
  export const appHandler = coreFactory.appHandler(${appHandlerPayload});
203
+
204
+ // WebSocket handlers (wrapped with DependencyContainer for SST to resolve)
205
+ export const wsConnect = coreFactory.wsConnect;
206
+ export const wsDisconnect = coreFactory.wsDisconnect;
207
+ export const wsDefault = coreFactory.wsDefault;
208
+ export const wsBroadcast = coreFactory.wsBroadcast;
203
209
  `;
204
210
  fs2.writeFileSync(handleOutputPath, combinedContent);
205
211
  console.log("Successfully generated handle.ts!");
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli.ts","../commands/utils/detect-package.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport 'tsx';\nimport 'tsconfig-paths/register.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport chokidar from 'chokidar';\nimport { detectCombinedPackage } from './commands/utils/detect-package';\n\nfunction kebabToCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction kebabToPascal(kebab: string): string {\n return kebab\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n}\n\nasync function generateConfigFile(\n configDir: string,\n monoriseOutputDir: string,\n projectRoot: string,\n): Promise<string> {\n const configOutputPath = path.join(monoriseOutputDir, 'config.ts');\n const initialConfigContent = `\nexport enum Entity {}\n`;\n fs.writeFileSync(configOutputPath, initialConfigContent);\n\n const files = fs\n .readdirSync(configDir)\n .filter((file) => file.endsWith('.ts') && file !== 'index.ts');\n\n const names = new Set<string>();\n const nameRegex = /^[a-z]+(-[a-z]+)*$/;\n const imports: string[] = [];\n\n const enumEntries: string[] = [];\n const typeEntries: string[] = [];\n const schemaMapEntries: string[] = [];\n const configEntries: string[] = [];\n const schemaEntries: string[] = [];\n const allowedEntityEntries: string[] = [];\n const entityWithEmailAuthEntries: string[] = [];\n\n const relativePathToConfigDir = path.relative(monoriseOutputDir, configDir);\n const importPathPrefix = relativePathToConfigDir\n ? `${relativePathToConfigDir}/`\n : './';\n\n for (const file of files) {\n const fullPath = path.join(configDir, file);\n const module = await import(fullPath);\n const config = module.default;\n\n if (!nameRegex.test(config.name)) {\n throw new Error(\n `Invalid name format: ${config.name} in ${file}. Must be kebab-case.`,\n );\n }\n\n if (names.has(config.name)) {\n throw new Error(`Duplicate name found: ${config.name} in ${file}`);\n }\n names.add(config.name);\n\n const fileName = file.replace(/\\.ts$/, '');\n const variableName = kebabToCamel(fileName);\n imports.push(\n `import ${variableName} from '${importPathPrefix}${fileName}';`,\n );\n\n const enumKey = config.name.toUpperCase().replace(/-/g, '_');\n enumEntries.push(`${enumKey} = '${config.name}'`);\n typeEntries.push(\n `export type ${kebabToPascal(config.name)}Type = z.infer<(typeof ${variableName})['finalSchema']>;`,\n );\n schemaMapEntries.push(\n `[Entity.${enumKey}]: ${kebabToPascal(config.name)}Type;`,\n );\n\n configEntries.push(`[Entity.${enumKey}]: ${kebabToCamel(config.name)},`);\n schemaEntries.push(\n `[Entity.${enumKey}]: ${kebabToCamel(config.name)}.finalSchema,`,\n );\n\n allowedEntityEntries.push(`Entity.${enumKey}`);\n\n if (config.authMethod?.email) {\n entityWithEmailAuthEntries.push(`Entity.${enumKey}`);\n }\n }\n\n // Detect whether the consumer uses the combined 'monorise' package or scoped '@monorise/*' packages\n const usesCombinedPackage = detectCombinedPackage(projectRoot);\n\n // Build module augmentation block\n const augmentationBlock = (moduleName: string) => `\ndeclare module '${moduleName}' {\n export enum Entity {\n ${enumEntries.join(',\\n ')}\n }\n\n ${typeEntries.join('\\n ')}\n\n export interface EntitySchemaMap {\n ${schemaMapEntries.join('\\n ')}\n }\n}`;\n\n // Augment the correct module based on which package is installed\n const moduleAugmentations = usesCombinedPackage\n ? augmentationBlock('monorise/base')\n : augmentationBlock('@monorise/base');\n\n const configOutputContent = `\nimport type { z } from 'zod';\n${imports.join('\\n')}\n\nexport enum Entity {\n ${enumEntries.join(',\\n ')}\n}\n\n${typeEntries.join('\\n')}\n\nexport interface EntitySchemaMap {\n ${schemaMapEntries.join('\\n ')}\n}\n\nconst EntityConfig = {\n ${configEntries.join('\\n ')}\n};\n\nconst FormSchema = {\n ${schemaEntries.join('\\n ')}\n};\n\nconst AllowedEntityTypes = [\n ${allowedEntityEntries.join(',\\n ')}\n];\n\nconst EmailAuthEnabledEntities: Entity[] = [${entityWithEmailAuthEntries.join(', ')}];\n\nexport {\n EntityConfig,\n FormSchema,\n AllowedEntityTypes,\n EmailAuthEnabledEntities,\n};\n\nconst config = {\n EntityConfig,\n FormSchema,\n AllowedEntityTypes,\n EmailAuthEnabledEntities,\n};\n\nexport default config;\n${moduleAugmentations}\n`;\n\n fs.writeFileSync(configOutputPath, configOutputContent);\n console.log('Successfully generated config.ts!');\n return configOutputPath;\n}\n\nasync function generateHandleFile(\n monoriseConfig: { customRoutes?: string; configDir: string },\n projectRoot: string,\n monoriseOutputDir: string,\n): Promise<string> {\n const handleOutputPath = path.join(monoriseOutputDir, 'handle.ts');\n const customRoutesPath = monoriseConfig.customRoutes;\n\n let routesImportLine = '';\n let appHandlerPayload = '{}'; // Default to an empty object for appHandler if no custom routes\n\n if (customRoutesPath) {\n const absoluteCustomRoutesPath = path.resolve(\n projectRoot,\n customRoutesPath,\n );\n\n if (\n !fs.existsSync(absoluteCustomRoutesPath) &&\n !fs.existsSync(`${absoluteCustomRoutesPath}.ts`) &&\n !fs.existsSync(`${absoluteCustomRoutesPath}.js`)\n ) {\n throw new Error(\n `Custom routes file not found: '${absoluteCustomRoutesPath}'. Please ensure 'customRoutes' in monorise.config.ts points to a valid file.`,\n );\n }\n\n let routesModule;\n try {\n routesModule = await import(absoluteCustomRoutesPath);\n } catch (e: any) {\n throw new Error(\n `Failed to load custom routes file at '${absoluteCustomRoutesPath}'. Ensure it's a valid JavaScript/TypeScript module. Error: ${e.message}`,\n );\n }\n\n const routesExport = routesModule.default;\n\n if (\n !routesExport ||\n routesExport === null ||\n (typeof routesExport === 'object' &&\n !(\n 'get' in routesExport &&\n 'post' in routesExport &&\n 'use' in routesExport\n ))\n ) {\n throw new Error(\n `Custom routes file at '${absoluteCustomRoutesPath}' must default export an instance of Hono (or an object with .get, .post, .use methods). Or a function that consume the dependency container provided by route handler.`,\n );\n }\n\n let relativePathToRoutes = path.relative(\n monoriseOutputDir,\n absoluteCustomRoutesPath,\n );\n relativePathToRoutes = relativePathToRoutes.replace(\n /\\.(ts|js|mjs|cjs)$/,\n '',\n );\n\n // If custom routes are provided, include the import statement and pass 'routes' to appHandler\n routesImportLine = `import routes from '${relativePathToRoutes}';`;\n appHandlerPayload = '{ routes }';\n }\n // If customRoutesPath is not provided, routesImportLine remains empty and appHandlerPayload remains `{}`\n\n // Detect whether the consumer uses the combined 'monorise' package or scoped '@monorise/*' packages\n const usesCombinedPackage = detectCombinedPackage(projectRoot);\n const coreImportPath = usesCombinedPackage ? 'monorise/core' : '@monorise/core';\n\n const combinedContent = `\nimport CoreFactory from '${coreImportPath}';\nimport config from './config';\n${routesImportLine ? `${routesImportLine}\\n` : ''}const coreFactory = new CoreFactory(config);\n\nexport const replicationHandler = coreFactory.replicationProcessor;\nexport const mutualHandler = coreFactory.mutualProcessor;\nexport const tagHandler = coreFactory.tagProcessor;\nexport const treeHandler = coreFactory.prejoinProcessor;\nexport const appHandler = coreFactory.appHandler(${appHandlerPayload});\n`;\n fs.writeFileSync(handleOutputPath, combinedContent);\n console.log('Successfully generated handle.ts!');\n\n return handleOutputPath;\n}\n\nasync function generateFiles(rootPath?: string): Promise<string> {\n const baseDir = rootPath ? path.resolve(rootPath) : process.cwd();\n const configFilePathTS = path.join(baseDir, 'monorise.config.ts');\n const configFilePathJS = path.join(baseDir, 'monorise.config.js');\n\n let configFilePath: string;\n if (fs.existsSync(configFilePathTS)) {\n configFilePath = configFilePathTS;\n } else if (fs.existsSync(configFilePathJS)) {\n configFilePath = configFilePathJS;\n } else {\n throw new Error(\n 'Neither monorise.config.ts nor monorise.config.js found in the root of the project.',\n );\n }\n\n const projectRoot = path.dirname(configFilePath);\n const monoriseConfigModule = await import(configFilePath);\n const monoriseConfig = monoriseConfigModule.default;\n\n const configDir = path.resolve(projectRoot, monoriseConfig.configDir);\n const monoriseOutputDir = path.join(projectRoot, '.monorise');\n\n fs.mkdirSync(monoriseOutputDir, { recursive: true });\n\n await generateConfigFile(configDir, monoriseOutputDir, projectRoot);\n await generateHandleFile(monoriseConfig, projectRoot, monoriseOutputDir);\n\n return configDir;\n}\n\nconst MONORISE_LOGO = `\n\n\n\n ░░░░░░░\n ░░▒▒▒░░░░░░▒▒▒░\n ░▒▒░ ░▒▒░\n ░▒▒░ ░▒▒░\n ░▒░ ░▒▒░\n ░▒▒░ ▒▒▒░\n ░▒░░░▒░ ░▒░░▒▒░\n ░▒▒░ ░▒▒▒░ ░▒▒░ ░▒░░\n ░▒▒ ░▒▒░ ░▒▒░ ░▒░ ░▒░ ░▒░\n ░▒▒░ ░▒░ ░▒░░▒▒░░░ ░░▒▒░░▒░ ░▒▒ ░▒░\n ░░▒░ ░▒░ ░▒░ ░▒▒░░▒▒▒▒▒▒░░▒░ ░▒░░ ░▒░ ░▒░\n ░▒░ ░░▒░ ░▒░ ░░░ ░▒░ ░░ ░▒░ ░▒░ ░▒░░ ░░▒░\n ░▒░ ░▒░ ░▒░ ░▒ ░░ ░▒░ ░▒░ ░▒░ ░▒░ ░░░░\n ░░░ ░░░░ ░░░ ░░ ▒░ ░░░ ░░░ ░░░ ░░░ ░░░░\n ░░░ ░░░░ ░░░ ░░░ ░░░ ░░ ░░░ ░░░ ░░░ ░░░░\n ░░░ ░░░ ░░░ ░░░ ░░ ░░ ░░░ ░░░ ░░░ ░░░\n ░░░ ░░░░ ░░░ ░░░ ░░ ░░░ ░░ ░░░ ░░░ ░░░\n ░░ ░░░ ░░░ ░░░ ░░░ ░░ ░░░ ░░░ ░░░ ░░░\n ░░ ░░ ░░ ░░ ░░ ░░░ ░░░ ░░░ ░░░░ ░░░\n ░░░ ░░ ░░░ ░░░ ░░░\n ░░░░░▒░░░░░░░░░▒░░░░░░░░░ ░ ░░ ░░░ ░░░ ░░\n ░░░ ░░░░░░░░░ ░░░ ░░░\n ░░░ ░░░░░░ ░░ ░░░░░▒░░░░░░▒░░░░\n ░░░░░░░░░░░░░░░░░ ░░░░░ ░░░░░░░░ ░░\n ░░░░░░░ ░░░░░░░░░░░░░░ ░░░░ ░░░░░ ░▒░\n ░░░ ░░░░░░░ ░░░░░░ ░░░░░░░░\n ░░░░░░░░░░░░ ░░░░░░ ░░░░ ░░░░░░░░░░░░░\n ░▒▒░░░░░░░░░░░▒▒░░ ░░▒▒▒░░ ░▒▒░░ ░░░░\n ░▒░ ░░▒▒░ ░▒░ ░▒▒░ ░░▒░\n ░▒░ ░░░░▒▒▒▒▒▒▒▒▒▒░░ ░▒░ ▒▒░ ░░▒▒▒░\n ░▒▒▒▒▒░░░ ░░░▒▒▒▒▒░ ▒▒░ ░▒▒▒▒▒▒░\n ░▒▒░ ░▒▒▒▒ ▒▒▒ ▒▒▒\n ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░ ░▒▒▒▒▒░ ░▒▒\n ▒▒▒ ░░▒▒▒▒▒▒░ ▒▒▒ ░▒▒\n ▒▒▒ ░▒▒▒▒ ░▒▒▒░\n ▒▓▓▓▒▒▒▓▓▒▒▒░ ▒▒▒░░▒▒░\n ▒▓░ ░▒▒▓▓▒░ ▒▓▓░\n ░▒▓░ ░▒▓▒░▒▓▒\n ░▒▓▒░ ░▒▓▓▒\n ░▒▒▓▓▓▓▓▓▒▒░\n\n\n\n`;\n\nasync function runInitCommand(rootPath?: string) {\n const projectRoot = rootPath ? path.resolve(rootPath) : process.cwd();\n console.log(MONORISE_LOGO);\n console.log(`Initializing Monorise project in ${projectRoot}...`);\n\n // 1. Create monorise.config.ts\n const monoriseConfigTsPath = path.join(projectRoot, 'monorise.config.ts');\n const monoriseConfigContent = `\nconst config = {\n configDir: './monorise/entities',\n // custom route file should export default an Hono object.\n // customRoutes: './path/to/custom/routes.ts'\n};\n\nexport default config;\n`;\n if (!fs.existsSync(monoriseConfigTsPath)) {\n fs.writeFileSync(monoriseConfigTsPath, monoriseConfigContent.trimStart());\n console.log(`Created ${path.relative(projectRoot, monoriseConfigTsPath)}`);\n } else {\n console.log(\n `${path.relative(projectRoot, monoriseConfigTsPath)} already exists. Skipping.`,\n );\n }\n\n // 2. Create ./monorise/entities/user.ts\n const monoriseEntitiesDir = path.join(projectRoot, 'monorise', 'entities');\n fs.mkdirSync(monoriseEntitiesDir, { recursive: true });\n\n const userEntityTsPath = path.join(monoriseEntitiesDir, 'user.ts');\n const userEntityContent = `\nimport { createEntityConfig } from 'monorise/base';\nimport { z } from 'zod';\n\nconst baseSchema = z\n .object({\n displayName: z\n .string()\n .min(1, 'Please provide a name for this user account'),\n firstName: z.string().min(1, 'Please provide first name'),\n lastName: z.string().min(1, 'Please provide last name'),\n jobTitle: z.string(),\n })\n .partial();\n\nconst config = createEntityConfig({\n name: 'user',\n baseSchema,\n});\n\nexport default config;\n`;\n if (!fs.existsSync(userEntityTsPath)) {\n fs.writeFileSync(userEntityTsPath, userEntityContent.trimStart());\n console.log(`Created ${path.relative(projectRoot, userEntityTsPath)}`);\n } else {\n console.log(\n `${path.relative(projectRoot, userEntityTsPath)} already exists. Skipping.`,\n );\n }\n\n // 3. Update package.json\n const packageJsonPath = path.join(projectRoot, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf8');\n const packageJson = JSON.parse(packageJsonContent);\n\n if (packageJson.type !== 'module') {\n packageJson.type = 'module';\n fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));\n console.log(\n `Updated 'type' to 'module' in ${path.relative(projectRoot, packageJsonPath)}`,\n );\n } else {\n console.log(\n `'type: \"module\"' already set in ${path.relative(projectRoot, packageJsonPath)}. Skipping.`,\n );\n }\n } catch (error) {\n console.error(\n `Error reading or parsing ${path.relative(projectRoot, packageJsonPath)}:`,\n error,\n );\n }\n } else {\n console.warn(\n `Warning: ${path.relative(projectRoot, packageJsonPath)} not found. Cannot update 'type'.`,\n );\n }\n\n // 4. Add tsconfig path alias for .monorise directory\n const tsconfigPath = path.join(projectRoot, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n try {\n const tsconfigContent = fs.readFileSync(tsconfigPath, 'utf8');\n const tsconfig = JSON.parse(tsconfigContent);\n\n if (!tsconfig.compilerOptions) {\n tsconfig.compilerOptions = {};\n }\n if (!tsconfig.compilerOptions.paths) {\n tsconfig.compilerOptions.paths = {};\n }\n\n const pathKey = '#/monorise/*';\n const pathValue = ['./.monorise/*'];\n\n if (!tsconfig.compilerOptions.paths[pathKey]) {\n tsconfig.compilerOptions.paths[pathKey] = pathValue;\n fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2));\n console.log(\n `Added '${pathKey}' path alias in ${path.relative(projectRoot, tsconfigPath)}`,\n );\n } else {\n console.log(\n `'${pathKey}' path alias already set in ${path.relative(projectRoot, tsconfigPath)}. Skipping.`,\n );\n }\n } catch (error) {\n console.error(\n `Error updating ${path.relative(projectRoot, tsconfigPath)}:`,\n error,\n );\n }\n } else {\n console.warn(\n `Warning: ${path.relative(projectRoot, tsconfigPath)} not found. Cannot add path alias.`,\n );\n }\n\n console.log('Monorise initialization complete!');\n}\n\nasync function runDevCommand(configDir: string, rootPath?: string) {\n console.log(MONORISE_LOGO);\n console.log(`Watching for changes in ${configDir}...`);\n const watcher = chokidar.watch(configDir, {\n ignored: (watchedPath: string) => {\n const fileName = path.basename(watchedPath);\n return (\n fileName === 'index.ts' || // Old name, still ignore in case it exists\n fileName === 'config.ts' || // Generated config file\n fileName === 'processors.ts' || // Generated processors file\n fileName === 'app.ts' || // Generated app file\n fileName.startsWith('.') ||\n watchedPath.endsWith('.js') ||\n watchedPath.endsWith('.jsx') ||\n watchedPath.endsWith('.d.ts')\n );\n },\n persistent: true,\n ignoreInitial: true,\n });\n\n watcher.on('add', async (filePath) => {\n console.log(`File ${filePath} has been added. Regenerating...`);\n try {\n await generateFiles(rootPath);\n } catch (err) {\n console.error('Regeneration failed:', err);\n }\n });\n\n watcher.on('change', async (filePath) => {\n console.log(`File ${filePath} has been changed. Regenerating...`);\n try {\n await generateFiles(rootPath);\n } catch (err) {\n console.error('Regeneration failed:', err);\n }\n });\n\n watcher.on('unlink', async (filePath) => {\n console.log(`File ${filePath} has been removed. Regenerating...`);\n try {\n await generateFiles(rootPath);\n } catch (err) {\n console.error('Regeneration failed:', err);\n }\n });\n\n process.on('SIGINT', () => {\n console.log('Monorise dev terminated. Closing watcher and sst dev...');\n watcher.close();\n process.exit(0);\n });\n process.on('SIGTERM', () => {\n console.log('Monorise dev terminated. Closing watcher and sst dev...');\n watcher.close();\n process.exit(0);\n });\n}\n\nasync function runBuildCommand(rootPath?: string) {\n console.log('Starting sst build...');\n await generateFiles(rootPath);\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n let rootPath: string | undefined;\n const rootFlagIndex = args.indexOf('--config-root');\n if (rootFlagIndex > -1 && args[rootFlagIndex + 1]) {\n rootPath = args[rootFlagIndex + 1];\n }\n\n try {\n if (command === 'dev') {\n const configDir = await generateFiles(rootPath);\n await runDevCommand(configDir, rootPath);\n } else if (command === 'build') {\n await runBuildCommand(rootPath);\n } else if (command === 'init') {\n await runInitCommand(rootPath);\n } else {\n console.error(\n 'Unknown command. Usage: monorise [dev|build|init] [--config-root <path>]',\n );\n process.exit(1);\n }\n } catch (err) {\n console.error('Monorise process failed:', err);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error('Monorise encountered an unhandled error:', err);\n process.exit(1);\n});\n","import fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Detects whether the combined 'monorise' package is installed by walking up\n * the directory tree. This handles monorepo setups where dependencies are\n * hoisted to the root node_modules.\n */\nexport function detectCombinedPackage(startDir: string): boolean {\n let dir = startDir;\n while (true) {\n if (fs.existsSync(path.join(dir, 'node_modules', 'monorise'))) {\n return true;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break; // reached filesystem root\n dir = parent;\n }\n return false;\n}\n"],"mappings":"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","names":["fs","path","path","fs"]}
1
+ {"version":3,"sources":["../cli.ts","../commands/utils/detect-package.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport 'tsx';\nimport 'tsconfig-paths/register.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport chokidar from 'chokidar';\nimport { detectCombinedPackage } from './commands/utils/detect-package';\n\nfunction kebabToCamel(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nfunction kebabToPascal(kebab: string): string {\n return kebab\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n}\n\nasync function generateConfigFile(\n configDir: string,\n monoriseOutputDir: string,\n projectRoot: string,\n): Promise<string> {\n const configOutputPath = path.join(monoriseOutputDir, 'config.ts');\n const initialConfigContent = `\nexport enum Entity {}\n`;\n fs.writeFileSync(configOutputPath, initialConfigContent);\n\n const files = fs\n .readdirSync(configDir)\n .filter((file) => file.endsWith('.ts') && file !== 'index.ts');\n\n const names = new Set<string>();\n const nameRegex = /^[a-z]+(-[a-z]+)*$/;\n const imports: string[] = [];\n\n const enumEntries: string[] = [];\n const typeEntries: string[] = [];\n const schemaMapEntries: string[] = [];\n const configEntries: string[] = [];\n const schemaEntries: string[] = [];\n const allowedEntityEntries: string[] = [];\n const entityWithEmailAuthEntries: string[] = [];\n\n const relativePathToConfigDir = path.relative(monoriseOutputDir, configDir);\n const importPathPrefix = relativePathToConfigDir\n ? `${relativePathToConfigDir}/`\n : './';\n\n for (const file of files) {\n const fullPath = path.join(configDir, file);\n const module = await import(fullPath);\n const config = module.default;\n\n if (!nameRegex.test(config.name)) {\n throw new Error(\n `Invalid name format: ${config.name} in ${file}. Must be kebab-case.`,\n );\n }\n\n if (names.has(config.name)) {\n throw new Error(`Duplicate name found: ${config.name} in ${file}`);\n }\n names.add(config.name);\n\n const fileName = file.replace(/\\.ts$/, '');\n const variableName = kebabToCamel(fileName);\n imports.push(\n `import ${variableName} from '${importPathPrefix}${fileName}';`,\n );\n\n const enumKey = config.name.toUpperCase().replace(/-/g, '_');\n enumEntries.push(`${enumKey} = '${config.name}'`);\n typeEntries.push(\n `export type ${kebabToPascal(config.name)}Type = z.infer<(typeof ${variableName})['finalSchema']>;`,\n );\n schemaMapEntries.push(\n `[Entity.${enumKey}]: ${kebabToPascal(config.name)}Type;`,\n );\n\n configEntries.push(`[Entity.${enumKey}]: ${kebabToCamel(config.name)},`);\n schemaEntries.push(\n `[Entity.${enumKey}]: ${kebabToCamel(config.name)}.finalSchema,`,\n );\n\n allowedEntityEntries.push(`Entity.${enumKey}`);\n\n if (config.authMethod?.email) {\n entityWithEmailAuthEntries.push(`Entity.${enumKey}`);\n }\n }\n\n // Detect whether the consumer uses the combined 'monorise' package or scoped '@monorise/*' packages\n const usesCombinedPackage = detectCombinedPackage(projectRoot);\n\n // Build module augmentation block\n const augmentationBlock = (moduleName: string) => `\ndeclare module '${moduleName}' {\n export enum Entity {\n ${enumEntries.join(',\\n ')}\n }\n\n ${typeEntries.join('\\n ')}\n\n export interface EntitySchemaMap {\n ${schemaMapEntries.join('\\n ')}\n }\n}`;\n\n // Augment the correct module based on which package is installed\n const moduleAugmentations = usesCombinedPackage\n ? augmentationBlock('monorise/base')\n : augmentationBlock('@monorise/base');\n\n const configOutputContent = `\nimport type { z } from 'zod';\n${imports.join('\\n')}\n\nexport enum Entity {\n ${enumEntries.join(',\\n ')}\n}\n\n${typeEntries.join('\\n')}\n\nexport interface EntitySchemaMap {\n ${schemaMapEntries.join('\\n ')}\n}\n\nconst EntityConfig = {\n ${configEntries.join('\\n ')}\n};\n\nconst FormSchema = {\n ${schemaEntries.join('\\n ')}\n};\n\nconst AllowedEntityTypes = [\n ${allowedEntityEntries.join(',\\n ')}\n];\n\nconst EmailAuthEnabledEntities: Entity[] = [${entityWithEmailAuthEntries.join(', ')}];\n\nexport {\n EntityConfig,\n FormSchema,\n AllowedEntityTypes,\n EmailAuthEnabledEntities,\n};\n\nconst config = {\n EntityConfig,\n FormSchema,\n AllowedEntityTypes,\n EmailAuthEnabledEntities,\n};\n\nexport default config;\n${moduleAugmentations}\n`;\n\n fs.writeFileSync(configOutputPath, configOutputContent);\n console.log('Successfully generated config.ts!');\n return configOutputPath;\n}\n\nasync function generateHandleFile(\n monoriseConfig: { customRoutes?: string; configDir: string },\n projectRoot: string,\n monoriseOutputDir: string,\n): Promise<string> {\n const handleOutputPath = path.join(monoriseOutputDir, 'handle.ts');\n const customRoutesPath = monoriseConfig.customRoutes;\n\n let routesImportLine = '';\n let appHandlerPayload = '{}'; // Default to an empty object for appHandler if no custom routes\n\n if (customRoutesPath) {\n const absoluteCustomRoutesPath = path.resolve(\n projectRoot,\n customRoutesPath,\n );\n\n if (\n !fs.existsSync(absoluteCustomRoutesPath) &&\n !fs.existsSync(`${absoluteCustomRoutesPath}.ts`) &&\n !fs.existsSync(`${absoluteCustomRoutesPath}.js`)\n ) {\n throw new Error(\n `Custom routes file not found: '${absoluteCustomRoutesPath}'. Please ensure 'customRoutes' in monorise.config.ts points to a valid file.`,\n );\n }\n\n let routesModule;\n try {\n routesModule = await import(absoluteCustomRoutesPath);\n } catch (e: any) {\n throw new Error(\n `Failed to load custom routes file at '${absoluteCustomRoutesPath}'. Ensure it's a valid JavaScript/TypeScript module. Error: ${e.message}`,\n );\n }\n\n const routesExport = routesModule.default;\n\n if (\n !routesExport ||\n routesExport === null ||\n (typeof routesExport === 'object' &&\n !(\n 'get' in routesExport &&\n 'post' in routesExport &&\n 'use' in routesExport\n ))\n ) {\n throw new Error(\n `Custom routes file at '${absoluteCustomRoutesPath}' must default export an instance of Hono (or an object with .get, .post, .use methods). Or a function that consume the dependency container provided by route handler.`,\n );\n }\n\n let relativePathToRoutes = path.relative(\n monoriseOutputDir,\n absoluteCustomRoutesPath,\n );\n relativePathToRoutes = relativePathToRoutes.replace(\n /\\.(ts|js|mjs|cjs)$/,\n '',\n );\n\n // If custom routes are provided, include the import statement and pass 'routes' to appHandler\n routesImportLine = `import routes from '${relativePathToRoutes}';`;\n appHandlerPayload = '{ routes }';\n }\n // If customRoutesPath is not provided, routesImportLine remains empty and appHandlerPayload remains `{}`\n\n // Detect whether the consumer uses the combined 'monorise' package or scoped '@monorise/*' packages\n const usesCombinedPackage = detectCombinedPackage(projectRoot);\n const coreImportPath = usesCombinedPackage ? 'monorise/core' : '@monorise/core';\n\n const combinedContent = `\nimport CoreFactory from '${coreImportPath}';\nimport config from './config';\n${routesImportLine ? `${routesImportLine}\\n` : ''}const coreFactory = new CoreFactory(config);\n\nexport const replicationHandler = coreFactory.replicationProcessor;\nexport const mutualHandler = coreFactory.mutualProcessor;\nexport const tagHandler = coreFactory.tagProcessor;\nexport const treeHandler = coreFactory.prejoinProcessor;\nexport const appHandler = coreFactory.appHandler(${appHandlerPayload});\n\n// WebSocket handlers (wrapped with DependencyContainer for SST to resolve)\nexport const wsConnect = coreFactory.wsConnect;\nexport const wsDisconnect = coreFactory.wsDisconnect;\nexport const wsDefault = coreFactory.wsDefault;\nexport const wsBroadcast = coreFactory.wsBroadcast;\n`;\n fs.writeFileSync(handleOutputPath, combinedContent);\n console.log('Successfully generated handle.ts!');\n\n return handleOutputPath;\n}\n\nasync function generateFiles(rootPath?: string): Promise<string> {\n const baseDir = rootPath ? path.resolve(rootPath) : process.cwd();\n const configFilePathTS = path.join(baseDir, 'monorise.config.ts');\n const configFilePathJS = path.join(baseDir, 'monorise.config.js');\n\n let configFilePath: string;\n if (fs.existsSync(configFilePathTS)) {\n configFilePath = configFilePathTS;\n } else if (fs.existsSync(configFilePathJS)) {\n configFilePath = configFilePathJS;\n } else {\n throw new Error(\n 'Neither monorise.config.ts nor monorise.config.js found in the root of the project.',\n );\n }\n\n const projectRoot = path.dirname(configFilePath);\n const monoriseConfigModule = await import(configFilePath);\n const monoriseConfig = monoriseConfigModule.default;\n\n const configDir = path.resolve(projectRoot, monoriseConfig.configDir);\n const monoriseOutputDir = path.join(projectRoot, '.monorise');\n\n fs.mkdirSync(monoriseOutputDir, { recursive: true });\n\n await generateConfigFile(configDir, monoriseOutputDir, projectRoot);\n await generateHandleFile(monoriseConfig, projectRoot, monoriseOutputDir);\n\n return configDir;\n}\n\nconst MONORISE_LOGO = `\n\n\n\n ░░░░░░░\n ░░▒▒▒░░░░░░▒▒▒░\n ░▒▒░ ░▒▒░\n ░▒▒░ ░▒▒░\n ░▒░ ░▒▒░\n ░▒▒░ ▒▒▒░\n ░▒░░░▒░ ░▒░░▒▒░\n ░▒▒░ ░▒▒▒░ ░▒▒░ ░▒░░\n ░▒▒ ░▒▒░ ░▒▒░ ░▒░ ░▒░ ░▒░\n ░▒▒░ ░▒░ ░▒░░▒▒░░░ ░░▒▒░░▒░ ░▒▒ ░▒░\n ░░▒░ ░▒░ ░▒░ ░▒▒░░▒▒▒▒▒▒░░▒░ ░▒░░ ░▒░ ░▒░\n ░▒░ ░░▒░ ░▒░ ░░░ ░▒░ ░░ ░▒░ ░▒░ ░▒░░ ░░▒░\n ░▒░ ░▒░ ░▒░ ░▒ ░░ ░▒░ ░▒░ ░▒░ ░▒░ ░░░░\n ░░░ ░░░░ ░░░ ░░ ▒░ ░░░ ░░░ ░░░ ░░░ ░░░░\n ░░░ ░░░░ ░░░ ░░░ ░░░ ░░ ░░░ ░░░ ░░░ ░░░░\n ░░░ ░░░ ░░░ ░░░ ░░ ░░ ░░░ ░░░ ░░░ ░░░\n ░░░ ░░░░ ░░░ ░░░ ░░ ░░░ ░░ ░░░ ░░░ ░░░\n ░░ ░░░ ░░░ ░░░ ░░░ ░░ ░░░ ░░░ ░░░ ░░░\n ░░ ░░ ░░ ░░ ░░ ░░░ ░░░ ░░░ ░░░░ ░░░\n ░░░ ░░ ░░░ ░░░ ░░░\n ░░░░░▒░░░░░░░░░▒░░░░░░░░░ ░ ░░ ░░░ ░░░ ░░\n ░░░ ░░░░░░░░░ ░░░ ░░░\n ░░░ ░░░░░░ ░░ ░░░░░▒░░░░░░▒░░░░\n ░░░░░░░░░░░░░░░░░ ░░░░░ ░░░░░░░░ ░░\n ░░░░░░░ ░░░░░░░░░░░░░░ ░░░░ ░░░░░ ░▒░\n ░░░ ░░░░░░░ ░░░░░░ ░░░░░░░░\n ░░░░░░░░░░░░ ░░░░░░ ░░░░ ░░░░░░░░░░░░░\n ░▒▒░░░░░░░░░░░▒▒░░ ░░▒▒▒░░ ░▒▒░░ ░░░░\n ░▒░ ░░▒▒░ ░▒░ ░▒▒░ ░░▒░\n ░▒░ ░░░░▒▒▒▒▒▒▒▒▒▒░░ ░▒░ ▒▒░ ░░▒▒▒░\n ░▒▒▒▒▒░░░ ░░░▒▒▒▒▒░ ▒▒░ ░▒▒▒▒▒▒░\n ░▒▒░ ░▒▒▒▒ ▒▒▒ ▒▒▒\n ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░ ░▒▒▒▒▒░ ░▒▒\n ▒▒▒ ░░▒▒▒▒▒▒░ ▒▒▒ ░▒▒\n ▒▒▒ ░▒▒▒▒ ░▒▒▒░\n ▒▓▓▓▒▒▒▓▓▒▒▒░ ▒▒▒░░▒▒░\n ▒▓░ ░▒▒▓▓▒░ ▒▓▓░\n ░▒▓░ ░▒▓▒░▒▓▒\n ░▒▓▒░ ░▒▓▓▒\n ░▒▒▓▓▓▓▓▓▒▒░\n\n\n\n`;\n\nasync function runInitCommand(rootPath?: string) {\n const projectRoot = rootPath ? path.resolve(rootPath) : process.cwd();\n console.log(MONORISE_LOGO);\n console.log(`Initializing Monorise project in ${projectRoot}...`);\n\n // 1. Create monorise.config.ts\n const monoriseConfigTsPath = path.join(projectRoot, 'monorise.config.ts');\n const monoriseConfigContent = `\nconst config = {\n configDir: './monorise/entities',\n // custom route file should export default an Hono object.\n // customRoutes: './path/to/custom/routes.ts'\n};\n\nexport default config;\n`;\n if (!fs.existsSync(monoriseConfigTsPath)) {\n fs.writeFileSync(monoriseConfigTsPath, monoriseConfigContent.trimStart());\n console.log(`Created ${path.relative(projectRoot, monoriseConfigTsPath)}`);\n } else {\n console.log(\n `${path.relative(projectRoot, monoriseConfigTsPath)} already exists. Skipping.`,\n );\n }\n\n // 2. Create ./monorise/entities/user.ts\n const monoriseEntitiesDir = path.join(projectRoot, 'monorise', 'entities');\n fs.mkdirSync(monoriseEntitiesDir, { recursive: true });\n\n const userEntityTsPath = path.join(monoriseEntitiesDir, 'user.ts');\n const userEntityContent = `\nimport { createEntityConfig } from 'monorise/base';\nimport { z } from 'zod';\n\nconst baseSchema = z\n .object({\n displayName: z\n .string()\n .min(1, 'Please provide a name for this user account'),\n firstName: z.string().min(1, 'Please provide first name'),\n lastName: z.string().min(1, 'Please provide last name'),\n jobTitle: z.string(),\n })\n .partial();\n\nconst config = createEntityConfig({\n name: 'user',\n baseSchema,\n});\n\nexport default config;\n`;\n if (!fs.existsSync(userEntityTsPath)) {\n fs.writeFileSync(userEntityTsPath, userEntityContent.trimStart());\n console.log(`Created ${path.relative(projectRoot, userEntityTsPath)}`);\n } else {\n console.log(\n `${path.relative(projectRoot, userEntityTsPath)} already exists. Skipping.`,\n );\n }\n\n // 3. Update package.json\n const packageJsonPath = path.join(projectRoot, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf8');\n const packageJson = JSON.parse(packageJsonContent);\n\n if (packageJson.type !== 'module') {\n packageJson.type = 'module';\n fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));\n console.log(\n `Updated 'type' to 'module' in ${path.relative(projectRoot, packageJsonPath)}`,\n );\n } else {\n console.log(\n `'type: \"module\"' already set in ${path.relative(projectRoot, packageJsonPath)}. Skipping.`,\n );\n }\n } catch (error) {\n console.error(\n `Error reading or parsing ${path.relative(projectRoot, packageJsonPath)}:`,\n error,\n );\n }\n } else {\n console.warn(\n `Warning: ${path.relative(projectRoot, packageJsonPath)} not found. Cannot update 'type'.`,\n );\n }\n\n // 4. Add tsconfig path alias for .monorise directory\n const tsconfigPath = path.join(projectRoot, 'tsconfig.json');\n if (fs.existsSync(tsconfigPath)) {\n try {\n const tsconfigContent = fs.readFileSync(tsconfigPath, 'utf8');\n const tsconfig = JSON.parse(tsconfigContent);\n\n if (!tsconfig.compilerOptions) {\n tsconfig.compilerOptions = {};\n }\n if (!tsconfig.compilerOptions.paths) {\n tsconfig.compilerOptions.paths = {};\n }\n\n const pathKey = '#/monorise/*';\n const pathValue = ['./.monorise/*'];\n\n if (!tsconfig.compilerOptions.paths[pathKey]) {\n tsconfig.compilerOptions.paths[pathKey] = pathValue;\n fs.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2));\n console.log(\n `Added '${pathKey}' path alias in ${path.relative(projectRoot, tsconfigPath)}`,\n );\n } else {\n console.log(\n `'${pathKey}' path alias already set in ${path.relative(projectRoot, tsconfigPath)}. Skipping.`,\n );\n }\n } catch (error) {\n console.error(\n `Error updating ${path.relative(projectRoot, tsconfigPath)}:`,\n error,\n );\n }\n } else {\n console.warn(\n `Warning: ${path.relative(projectRoot, tsconfigPath)} not found. Cannot add path alias.`,\n );\n }\n\n console.log('Monorise initialization complete!');\n}\n\nasync function runDevCommand(configDir: string, rootPath?: string) {\n console.log(MONORISE_LOGO);\n console.log(`Watching for changes in ${configDir}...`);\n const watcher = chokidar.watch(configDir, {\n ignored: (watchedPath: string) => {\n const fileName = path.basename(watchedPath);\n return (\n fileName === 'index.ts' || // Old name, still ignore in case it exists\n fileName === 'config.ts' || // Generated config file\n fileName === 'processors.ts' || // Generated processors file\n fileName === 'app.ts' || // Generated app file\n fileName.startsWith('.') ||\n watchedPath.endsWith('.js') ||\n watchedPath.endsWith('.jsx') ||\n watchedPath.endsWith('.d.ts')\n );\n },\n persistent: true,\n ignoreInitial: true,\n });\n\n watcher.on('add', async (filePath) => {\n console.log(`File ${filePath} has been added. Regenerating...`);\n try {\n await generateFiles(rootPath);\n } catch (err) {\n console.error('Regeneration failed:', err);\n }\n });\n\n watcher.on('change', async (filePath) => {\n console.log(`File ${filePath} has been changed. Regenerating...`);\n try {\n await generateFiles(rootPath);\n } catch (err) {\n console.error('Regeneration failed:', err);\n }\n });\n\n watcher.on('unlink', async (filePath) => {\n console.log(`File ${filePath} has been removed. Regenerating...`);\n try {\n await generateFiles(rootPath);\n } catch (err) {\n console.error('Regeneration failed:', err);\n }\n });\n\n process.on('SIGINT', () => {\n console.log('Monorise dev terminated. Closing watcher and sst dev...');\n watcher.close();\n process.exit(0);\n });\n process.on('SIGTERM', () => {\n console.log('Monorise dev terminated. Closing watcher and sst dev...');\n watcher.close();\n process.exit(0);\n });\n}\n\nasync function runBuildCommand(rootPath?: string) {\n console.log('Starting sst build...');\n await generateFiles(rootPath);\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n let rootPath: string | undefined;\n const rootFlagIndex = args.indexOf('--config-root');\n if (rootFlagIndex > -1 && args[rootFlagIndex + 1]) {\n rootPath = args[rootFlagIndex + 1];\n }\n\n try {\n if (command === 'dev') {\n const configDir = await generateFiles(rootPath);\n await runDevCommand(configDir, rootPath);\n } else if (command === 'build') {\n await runBuildCommand(rootPath);\n } else if (command === 'init') {\n await runInitCommand(rootPath);\n } else {\n console.error(\n 'Unknown command. Usage: monorise [dev|build|init] [--config-root <path>]',\n );\n process.exit(1);\n }\n } catch (err) {\n console.error('Monorise process failed:', err);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error('Monorise encountered an unhandled error:', err);\n process.exit(1);\n});\n","import fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Detects whether the combined 'monorise' package is installed by walking up\n * the directory tree. This handles monorepo setups where dependencies are\n * hoisted to the root node_modules.\n */\nexport function detectCombinedPackage(startDir: string): boolean {\n let dir = startDir;\n while (true) {\n if (fs.existsSync(path.join(dir, 'node_modules', 'monorise'))) {\n return true;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break; // reached filesystem root\n dir = parent;\n }\n return false;\n}\n"],"mappings":"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","names":["fs","path","path","fs"]}
@@ -0,0 +1,76 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __objRest = (source, exclude) => {
21
+ var target = {};
22
+ for (var prop in source)
23
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
+ target[prop] = source[prop];
25
+ if (source != null && __getOwnPropSymbols)
26
+ for (var prop of __getOwnPropSymbols(source)) {
27
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
+ target[prop] = source[prop];
29
+ }
30
+ return target;
31
+ };
32
+ var __export = (target, all) => {
33
+ for (var name in all)
34
+ __defProp(target, name, { get: all[name], enumerable: true });
35
+ };
36
+ var __async = (__this, __arguments, generator) => {
37
+ return new Promise((resolve, reject) => {
38
+ var fulfilled = (value) => {
39
+ try {
40
+ step(generator.next(value));
41
+ } catch (e) {
42
+ reject(e);
43
+ }
44
+ };
45
+ var rejected = (value) => {
46
+ try {
47
+ step(generator.throw(value));
48
+ } catch (e) {
49
+ reject(e);
50
+ }
51
+ };
52
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
53
+ step((generator = generator.apply(__this, __arguments)).next());
54
+ });
55
+ };
56
+
57
+ // constants/table.ts
58
+ var ENTITY_REPLICATION_INDEX = "ENTITY_REPLICATION_INDEX";
59
+ var MUTUAL_REPLICATION_INDEX = "MUTUAL_REPLICATION_INDEX";
60
+
61
+ // configs/service.config.ts
62
+ var CORE_TABLE = process.env.CORE_TABLE || "";
63
+ var CORE_EVENT_BUS = process.env.CORE_EVENT_BUS || "";
64
+
65
+ export {
66
+ __spreadValues,
67
+ __spreadProps,
68
+ __objRest,
69
+ __export,
70
+ __async,
71
+ ENTITY_REPLICATION_INDEX,
72
+ MUTUAL_REPLICATION_INDEX,
73
+ CORE_TABLE,
74
+ CORE_EVENT_BUS
75
+ };
76
+ //# sourceMappingURL=chunk-QV4Q5377.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../constants/table.ts","../configs/service.config.ts"],"sourcesContent":["export const ENTITY_REPLICATION_INDEX = 'ENTITY_REPLICATION_INDEX';\nexport const MUTUAL_REPLICATION_INDEX = 'MUTUAL_REPLICATION_INDEX';\n","import {\n ENTITY_REPLICATION_INDEX,\n MUTUAL_REPLICATION_INDEX,\n} from '../constants/table';\n\nconst CORE_TABLE = process.env.CORE_TABLE || '';\nconst CORE_EVENT_BUS = process.env.CORE_EVENT_BUS || '';\n\nexport {\n CORE_TABLE,\n CORE_EVENT_BUS,\n ENTITY_REPLICATION_INDEX,\n MUTUAL_REPLICATION_INDEX,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;;;ACIxC,IAAM,aAAa,QAAQ,IAAI,cAAc;AAC7C,IAAM,iBAAiB,QAAQ,IAAI,kBAAkB;","names":[]}