@x12i/memorix-writer 1.0.0

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 (204) hide show
  1. package/README.md +145 -0
  2. package/catalox-seeds/memorix-write-descriptors.manifest.json +164 -0
  3. package/dist/client/create-client.d.ts +3 -0
  4. package/dist/client/create-client.d.ts.map +1 -0
  5. package/dist/client/create-client.js +81 -0
  6. package/dist/client/create-client.js.map +1 -0
  7. package/dist/client/create-from-env.d.ts +3 -0
  8. package/dist/client/create-from-env.d.ts.map +1 -0
  9. package/dist/client/create-from-env.js +21 -0
  10. package/dist/client/create-from-env.js.map +1 -0
  11. package/dist/client/ensure-tier.d.ts +3 -0
  12. package/dist/client/ensure-tier.d.ts.map +1 -0
  13. package/dist/client/ensure-tier.js +4 -0
  14. package/dist/client/ensure-tier.js.map +1 -0
  15. package/dist/client/types.d.ts +165 -0
  16. package/dist/client/types.d.ts.map +1 -0
  17. package/dist/client/types.js +2 -0
  18. package/dist/client/types.js.map +1 -0
  19. package/dist/constants.d.ts +13 -0
  20. package/dist/constants.d.ts.map +1 -0
  21. package/dist/constants.js +13 -0
  22. package/dist/constants.js.map +1 -0
  23. package/dist/content/compute-content-metadata.d.ts +16 -0
  24. package/dist/content/compute-content-metadata.d.ts.map +1 -0
  25. package/dist/content/compute-content-metadata.js +13 -0
  26. package/dist/content/compute-content-metadata.js.map +1 -0
  27. package/dist/content/generate-content-key.d.ts +13 -0
  28. package/dist/content/generate-content-key.d.ts.map +1 -0
  29. package/dist/content/generate-content-key.js +22 -0
  30. package/dist/content/generate-content-key.js.map +1 -0
  31. package/dist/content/generate-preview.d.ts +2 -0
  32. package/dist/content/generate-preview.d.ts.map +1 -0
  33. package/dist/content/generate-preview.js +7 -0
  34. package/dist/content/generate-preview.js.map +1 -0
  35. package/dist/content/map-content-write-errors.d.ts +3 -0
  36. package/dist/content/map-content-write-errors.d.ts.map +1 -0
  37. package/dist/content/map-content-write-errors.js +9 -0
  38. package/dist/content/map-content-write-errors.js.map +1 -0
  39. package/dist/content/resolve-content-write-config.d.ts +25 -0
  40. package/dist/content/resolve-content-write-config.d.ts.map +1 -0
  41. package/dist/content/resolve-content-write-config.js +35 -0
  42. package/dist/content/resolve-content-write-config.js.map +1 -0
  43. package/dist/content/write-content-object.d.ts +40 -0
  44. package/dist/content/write-content-object.d.ts.map +1 -0
  45. package/dist/content/write-content-object.js +117 -0
  46. package/dist/content/write-content-object.js.map +1 -0
  47. package/dist/data/collection-name.d.ts +30 -0
  48. package/dist/data/collection-name.d.ts.map +1 -0
  49. package/dist/data/collection-name.js +86 -0
  50. package/dist/data/collection-name.js.map +1 -0
  51. package/dist/data/identity.d.ts +13 -0
  52. package/dist/data/identity.d.ts.map +1 -0
  53. package/dist/data/identity.js +29 -0
  54. package/dist/data/identity.js.map +1 -0
  55. package/dist/data/memorix-write-adapter.d.ts +33 -0
  56. package/dist/data/memorix-write-adapter.d.ts.map +1 -0
  57. package/dist/data/memorix-write-adapter.js +45 -0
  58. package/dist/data/memorix-write-adapter.js.map +1 -0
  59. package/dist/descriptors/entity-descriptor-types.d.ts +59 -0
  60. package/dist/descriptors/entity-descriptor-types.d.ts.map +1 -0
  61. package/dist/descriptors/entity-descriptor-types.js +2 -0
  62. package/dist/descriptors/entity-descriptor-types.js.map +1 -0
  63. package/dist/descriptors/load-entity-descriptor.d.ts +7 -0
  64. package/dist/descriptors/load-entity-descriptor.d.ts.map +1 -0
  65. package/dist/descriptors/load-entity-descriptor.js +23 -0
  66. package/dist/descriptors/load-entity-descriptor.js.map +1 -0
  67. package/dist/descriptors/load-write-descriptor.d.ts +5 -0
  68. package/dist/descriptors/load-write-descriptor.d.ts.map +1 -0
  69. package/dist/descriptors/load-write-descriptor.js +19 -0
  70. package/dist/descriptors/load-write-descriptor.js.map +1 -0
  71. package/dist/descriptors/secret-scan.d.ts +2 -0
  72. package/dist/descriptors/secret-scan.d.ts.map +1 -0
  73. package/dist/descriptors/secret-scan.js +39 -0
  74. package/dist/descriptors/secret-scan.js.map +1 -0
  75. package/dist/descriptors/validate-write-descriptor.d.ts +4 -0
  76. package/dist/descriptors/validate-write-descriptor.d.ts.map +1 -0
  77. package/dist/descriptors/validate-write-descriptor.js +45 -0
  78. package/dist/descriptors/validate-write-descriptor.js.map +1 -0
  79. package/dist/descriptors/write-descriptor-types.d.ts +112 -0
  80. package/dist/descriptors/write-descriptor-types.d.ts.map +1 -0
  81. package/dist/descriptors/write-descriptor-types.js +2 -0
  82. package/dist/descriptors/write-descriptor-types.js.map +1 -0
  83. package/dist/errors/errors.d.ts +6 -0
  84. package/dist/errors/errors.d.ts.map +1 -0
  85. package/dist/errors/errors.js +12 -0
  86. package/dist/errors/errors.js.map +1 -0
  87. package/dist/errors/issues.d.ts +13 -0
  88. package/dist/errors/issues.d.ts.map +1 -0
  89. package/dist/errors/issues.js +9 -0
  90. package/dist/errors/issues.js.map +1 -0
  91. package/dist/index.d.ts +20 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +15 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/mongo/collection-documents.d.ts +54 -0
  96. package/dist/mongo/collection-documents.d.ts.map +1 -0
  97. package/dist/mongo/collection-documents.js +100 -0
  98. package/dist/mongo/collection-documents.js.map +1 -0
  99. package/dist/mongo/collection-name-validate.d.ts +2 -0
  100. package/dist/mongo/collection-name-validate.d.ts.map +1 -0
  101. package/dist/mongo/collection-name-validate.js +19 -0
  102. package/dist/mongo/collection-name-validate.js.map +1 -0
  103. package/dist/mongo/connection.d.ts +3 -0
  104. package/dist/mongo/connection.d.ts.map +1 -0
  105. package/dist/mongo/connection.js +8 -0
  106. package/dist/mongo/connection.js.map +1 -0
  107. package/dist/mongo/default-collections.d.ts +3 -0
  108. package/dist/mongo/default-collections.d.ts.map +1 -0
  109. package/dist/mongo/default-collections.js +14 -0
  110. package/dist/mongo/default-collections.js.map +1 -0
  111. package/dist/mongo/env.d.ts +6 -0
  112. package/dist/mongo/env.d.ts.map +1 -0
  113. package/dist/mongo/env.js +33 -0
  114. package/dist/mongo/env.js.map +1 -0
  115. package/dist/mongo/id-normalize.d.ts +3 -0
  116. package/dist/mongo/id-normalize.d.ts.map +1 -0
  117. package/dist/mongo/id-normalize.js +23 -0
  118. package/dist/mongo/id-normalize.js.map +1 -0
  119. package/dist/mongo/index.d.ts +5 -0
  120. package/dist/mongo/index.d.ts.map +1 -0
  121. package/dist/mongo/index.js +5 -0
  122. package/dist/mongo/index.js.map +1 -0
  123. package/dist/mongo/target.d.ts +4 -0
  124. package/dist/mongo/target.d.ts.map +1 -0
  125. package/dist/mongo/target.js +9 -0
  126. package/dist/mongo/target.js.map +1 -0
  127. package/dist/mongo/tier-env.d.ts +9 -0
  128. package/dist/mongo/tier-env.d.ts.map +1 -0
  129. package/dist/mongo/tier-env.js +11 -0
  130. package/dist/mongo/tier-env.js.map +1 -0
  131. package/dist/mongo/tier.d.ts +22 -0
  132. package/dist/mongo/tier.d.ts.map +1 -0
  133. package/dist/mongo/tier.js +50 -0
  134. package/dist/mongo/tier.js.map +1 -0
  135. package/dist/utils/path.d.ts +4 -0
  136. package/dist/utils/path.d.ts.map +1 -0
  137. package/dist/utils/path.js +42 -0
  138. package/dist/utils/path.js.map +1 -0
  139. package/dist/validation/validate-content.d.ts +17 -0
  140. package/dist/validation/validate-content.d.ts.map +1 -0
  141. package/dist/validation/validate-content.js +47 -0
  142. package/dist/validation/validate-content.js.map +1 -0
  143. package/dist/validation/validate-fields.d.ts +8 -0
  144. package/dist/validation/validate-fields.d.ts.map +1 -0
  145. package/dist/validation/validate-fields.js +49 -0
  146. package/dist/validation/validate-fields.js.map +1 -0
  147. package/dist/validation/validate-identity.d.ts +3 -0
  148. package/dist/validation/validate-identity.d.ts.map +1 -0
  149. package/dist/validation/validate-identity.js +2 -0
  150. package/dist/validation/validate-identity.js.map +1 -0
  151. package/dist/validation/validate-immutability.d.ts +9 -0
  152. package/dist/validation/validate-immutability.d.ts.map +1 -0
  153. package/dist/validation/validate-immutability.js +35 -0
  154. package/dist/validation/validate-immutability.js.map +1 -0
  155. package/dist/validation/validate-values.d.ts +4 -0
  156. package/dist/validation/validate-values.d.ts.map +1 -0
  157. package/dist/validation/validate-values.js +55 -0
  158. package/dist/validation/validate-values.js.map +1 -0
  159. package/dist/writer/apply-audit.d.ts +10 -0
  160. package/dist/writer/apply-audit.d.ts.map +1 -0
  161. package/dist/writer/apply-audit.js +39 -0
  162. package/dist/writer/apply-audit.js.map +1 -0
  163. package/dist/writer/apply-field-mapping.d.ts +9 -0
  164. package/dist/writer/apply-field-mapping.d.ts.map +1 -0
  165. package/dist/writer/apply-field-mapping.js +32 -0
  166. package/dist/writer/apply-field-mapping.js.map +1 -0
  167. package/dist/writer/apply-timestamps.d.ts +8 -0
  168. package/dist/writer/apply-timestamps.d.ts.map +1 -0
  169. package/dist/writer/apply-timestamps.js +12 -0
  170. package/dist/writer/apply-timestamps.js.map +1 -0
  171. package/dist/writer/build-record.d.ts +28 -0
  172. package/dist/writer/build-record.d.ts.map +1 -0
  173. package/dist/writer/build-record.js +36 -0
  174. package/dist/writer/build-record.js.map +1 -0
  175. package/dist/writer/resolve-conflict.d.ts +12 -0
  176. package/dist/writer/resolve-conflict.d.ts.map +1 -0
  177. package/dist/writer/resolve-conflict.js +32 -0
  178. package/dist/writer/resolve-conflict.js.map +1 -0
  179. package/dist/writer/resolve-idempotency.d.ts +23 -0
  180. package/dist/writer/resolve-idempotency.d.ts.map +1 -0
  181. package/dist/writer/resolve-idempotency.js +69 -0
  182. package/dist/writer/resolve-idempotency.js.map +1 -0
  183. package/dist/writer/resolve-operation.d.ts +4 -0
  184. package/dist/writer/resolve-operation.d.ts.map +1 -0
  185. package/dist/writer/resolve-operation.js +9 -0
  186. package/dist/writer/resolve-operation.js.map +1 -0
  187. package/dist/writer/resolve-write-field-target.d.ts +4 -0
  188. package/dist/writer/resolve-write-field-target.d.ts.map +1 -0
  189. package/dist/writer/resolve-write-field-target.js +7 -0
  190. package/dist/writer/resolve-write-field-target.js.map +1 -0
  191. package/dist/writer/validate-write.d.ts +3 -0
  192. package/dist/writer/validate-write.d.ts.map +1 -0
  193. package/dist/writer/validate-write.js +72 -0
  194. package/dist/writer/validate-write.js.map +1 -0
  195. package/dist/writer/write-record.d.ts +3 -0
  196. package/dist/writer/write-record.d.ts.map +1 -0
  197. package/dist/writer/write-record.js +472 -0
  198. package/dist/writer/write-record.js.map +1 -0
  199. package/dist/writer/write-records.d.ts +3 -0
  200. package/dist/writer/write-records.d.ts.map +1 -0
  201. package/dist/writer/write-records.js +79 -0
  202. package/dist/writer/write-records.js.map +1 -0
  203. package/docs/MEMORIX-DATABASE-CONVENTIONS.md +324 -0
  204. package/package.json +51 -0
@@ -0,0 +1,13 @@
1
+ export const DEFAULT_MEMORIX_APP_ID = "memorix";
2
+ export const MEMORIX_WRITE_DESCRIPTORS_CATALOG_ID = "memorix-write-descriptors";
3
+ export const MEMORIX_ENTITY_DESCRIPTORS_CATALOG_ID = "memorix-entity-descriptors";
4
+ export const DEFAULT_CANONICAL_CONTENT_TYPE = "snapshots";
5
+ export const DEFAULT_DATA_ROOT = "data";
6
+ export const DEFAULT_EFFECTIVE_DATE_PATH = "modifiedAt";
7
+ export const DEFAULT_CONTENT_MAX_BYTES = 5 * 1024 * 1024;
8
+ export const DEFAULT_MEMORIX_METADATA_PATH = "_memorix";
9
+ export const DEFAULT_AUDIT_PATH = "_memorix.audit";
10
+ export const DEFAULT_IDEMPOTENCY_KEY_PATH = "_memorix.idempotencyKey";
11
+ export const DEFAULT_PAYLOAD_HASH_PATH = "_memorix.payloadHash";
12
+ export const DEFAULT_CONTENT_KEY_TEMPLATE = "{{entity}}/{{contentType}}/{{id}}/{{recordId}}/{{field}}.md";
13
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,SAAS,CAAC;AAEhD,MAAM,CAAC,MAAM,oCAAoC,GAAG,2BAA2B,CAAC;AAChF,MAAM,CAAC,MAAM,qCAAqC,GAAG,4BAA4B,CAAC;AAElF,MAAM,CAAC,MAAM,8BAA8B,GAAG,WAAW,CAAC;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,2BAA2B,GAAG,YAAY,CAAC;AACxD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AACzD,MAAM,CAAC,MAAM,6BAA6B,GAAG,UAAU,CAAC;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AACnD,MAAM,CAAC,MAAM,4BAA4B,GAAG,yBAAyB,CAAC;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAEhE,MAAM,CAAC,MAAM,4BAA4B,GACvC,6DAA6D,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type MemorixWrittenContentMetadata = {
2
+ sizeBytes: number;
3
+ words?: number;
4
+ chars?: number;
5
+ contentType: "text/markdown" | "text/plain";
6
+ format: "markdown" | "text";
7
+ createdAt: string;
8
+ hash?: string;
9
+ };
10
+ export declare function computeContentMetadata(args: {
11
+ body: string;
12
+ format: "markdown" | "text";
13
+ createdAt: string;
14
+ hash?: string;
15
+ }): MemorixWrittenContentMetadata;
16
+ //# sourceMappingURL=compute-content-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-content-metadata.d.ts","sourceRoot":"","sources":["../../src/content/compute-content-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,eAAe,GAAG,YAAY,CAAC;IAC5C,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,6BAA6B,CAWhC"}
@@ -0,0 +1,13 @@
1
+ export function computeContentMetadata(args) {
2
+ const words = args.body.trim().split(/\s+/).filter(Boolean).length;
3
+ return {
4
+ sizeBytes: Buffer.byteLength(args.body, "utf8"),
5
+ words,
6
+ chars: args.body.length,
7
+ contentType: args.format === "markdown" ? "text/markdown" : "text/plain",
8
+ format: args.format,
9
+ createdAt: args.createdAt,
10
+ hash: args.hash,
11
+ };
12
+ }
13
+ //# sourceMappingURL=compute-content-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-content-metadata.js","sourceRoot":"","sources":["../../src/content/compute-content-metadata.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,sBAAsB,CAAC,IAKtC;IACC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACnE,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QAC/C,KAAK;QACL,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;QACvB,WAAW,EAAE,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY;QACxE,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type ContentKeyTemplateContext = {
2
+ entity: string;
3
+ contentType: string;
4
+ entityId?: string;
5
+ eventId?: string;
6
+ field: string;
7
+ timestamp: string;
8
+ recordId: string;
9
+ idempotencyKey?: string;
10
+ hash?: string;
11
+ };
12
+ export declare function generateContentKey(template: string, ctx: ContentKeyTemplateContext, bodyForHash?: string): string;
13
+ //# sourceMappingURL=generate-content-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-content-key.d.ts","sourceRoot":"","sources":["../../src/content/generate-content-key.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,yBAAyB,EAC9B,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAsBR"}
@@ -0,0 +1,22 @@
1
+ import { createHash } from "node:crypto";
2
+ export function generateContentKey(template, ctx, bodyForHash) {
3
+ const id = ctx.entityId ?? ctx.eventId ?? "unknown";
4
+ const hash = ctx.hash ??
5
+ (bodyForHash
6
+ ? createHash("sha256").update(bodyForHash).digest("hex").slice(0, 12)
7
+ : "");
8
+ const vars = {
9
+ entity: ctx.entity,
10
+ contentType: ctx.contentType,
11
+ entityId: ctx.entityId ?? "",
12
+ eventId: ctx.eventId ?? "",
13
+ field: ctx.field,
14
+ timestamp: ctx.timestamp,
15
+ recordId: ctx.recordId,
16
+ id: id,
17
+ idempotencyKey: ctx.idempotencyKey ?? "",
18
+ hash,
19
+ };
20
+ return template.replace(/\{\{(\w+)\}\}/g, (_, key) => vars[key] ?? "");
21
+ }
22
+ //# sourceMappingURL=generate-content-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-content-key.js","sourceRoot":"","sources":["../../src/content/generate-content-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAczC,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,GAA8B,EAC9B,WAAoB;IAEpB,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IACpD,MAAM,IAAI,GACR,GAAG,CAAC,IAAI;QACR,CAAC,WAAW;YACV,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACrE,CAAC,CAAC,EAAE,CAAC,CAAC;IAEV,MAAM,IAAI,GAA2B;QACnC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;QAC1B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,EAAE,EAAE,EAAE;QACN,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE;QACxC,IAAI;KACL,CAAC;IAEF,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generatePreview(body: string, maxChars: number): string;
2
+ //# sourceMappingURL=generate-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-preview.d.ts","sourceRoot":"","sources":["../../src/content/generate-preview.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAItE"}
@@ -0,0 +1,7 @@
1
+ export function generatePreview(body, maxChars) {
2
+ const trimmed = body.trim();
3
+ if (trimmed.length <= maxChars)
4
+ return trimmed;
5
+ return `${trimmed.slice(0, maxChars)}…`;
6
+ }
7
+ //# sourceMappingURL=generate-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-preview.js","sourceRoot":"","sources":["../../src/content/generate-preview.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAgB;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC/C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MemorixWriteIssue } from "../errors/issues.js";
2
+ export declare function mapContentWriteError(fieldName: string, err: unknown): MemorixWriteIssue;
3
+ //# sourceMappingURL=map-content-write-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-content-write-errors.d.ts","sourceRoot":"","sources":["../../src/content/map-content-write-errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,OAAO,GACX,iBAAiB,CAOnB"}
@@ -0,0 +1,9 @@
1
+ import { writeIssue } from "../errors/issues.js";
2
+ export function mapContentWriteError(fieldName, err) {
3
+ const message = err instanceof Error ? err.message : "content object write failed";
4
+ return writeIssue("CONTENT_WRITE_FAILED", message, {
5
+ path: fieldName,
6
+ details: err instanceof Error ? { name: err.name } : undefined,
7
+ });
8
+ }
9
+ //# sourceMappingURL=map-content-write-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-content-write-errors.js","sourceRoot":"","sources":["../../src/content/map-content-write-errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,GAAY;IAEZ,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;IACrE,OAAO,UAAU,CAAC,sBAAsB,EAAE,OAAO,EAAE;QACjD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { MemorixContentStorageDescriptor, MemorixEntityDescriptor } from "../descriptors/entity-descriptor-types.js";
2
+ import type { MemorixWriteFieldDescriptor } from "../descriptors/write-descriptor-types.js";
3
+ import type { MemorixWriterDefaults } from "../client/types.js";
4
+ export type ResolvedContentWriteConfig = {
5
+ storage: MemorixContentStorageDescriptor;
6
+ maxBytes: number;
7
+ contentKeyTemplate?: string;
8
+ generatePreview: boolean;
9
+ previewMaxChars: number;
10
+ computeMetadata: boolean;
11
+ };
12
+ export declare function resolveMemorixContentWriteConfig(args: {
13
+ entity: MemorixEntityDescriptor;
14
+ propertyName?: string;
15
+ field?: MemorixWriteFieldDescriptor;
16
+ defaults: MemorixWriterDefaults;
17
+ writeContentDefaults?: {
18
+ maxBytes?: number;
19
+ contentKeyTemplate?: string;
20
+ generatePreview?: boolean;
21
+ previewMaxChars?: number;
22
+ computeMetadata?: boolean;
23
+ };
24
+ }): ResolvedContentWriteConfig;
25
+ //# sourceMappingURL=resolve-content-write-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-content-write-config.d.ts","sourceRoot":"","sources":["../../src/content/resolve-content-write-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,+BAA+B,EAC/B,uBAAuB,EAExB,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGhE,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,+BAA+B,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,MAAM,EAAE,uBAAuB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,2BAA2B,CAAC;IACpC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,oBAAoB,CAAC,EAAE;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH,GAAG,0BAA0B,CA6C7B"}
@@ -0,0 +1,35 @@
1
+ import { throwWriterError } from "../errors/errors.js";
2
+ export function resolveMemorixContentWriteConfig(args) {
3
+ const property = args.propertyName
4
+ ? args.entity.properties[args.propertyName]
5
+ : undefined;
6
+ const storage = args.field?.content?.storage ??
7
+ property?.content?.storage ??
8
+ args.entity.contentDefaults?.storage;
9
+ if (!storage?.provider || !storage?.bucket) {
10
+ throwWriterError("CONTENT_WRITE_FAILED", "content storage provider and bucket must be configured in descriptors");
11
+ }
12
+ const maxBytes = args.field?.content?.maxBytes ??
13
+ property?.content?.maxBytes ??
14
+ args.entity.contentDefaults?.maxBytes ??
15
+ args.writeContentDefaults?.maxBytes ??
16
+ args.defaults.packageMaxContentBytes ??
17
+ args.defaults.contentMaxBytes;
18
+ return {
19
+ storage,
20
+ maxBytes,
21
+ contentKeyTemplate: args.field?.content?.contentKeyTemplate ??
22
+ args.writeContentDefaults?.contentKeyTemplate ??
23
+ args.defaults.contentKeyTemplate,
24
+ generatePreview: args.field?.content?.generatePreview ??
25
+ args.writeContentDefaults?.generatePreview ??
26
+ true,
27
+ previewMaxChars: args.field?.content?.previewMaxChars ??
28
+ args.writeContentDefaults?.previewMaxChars ??
29
+ 500,
30
+ computeMetadata: args.field?.content?.computeMetadata ??
31
+ args.writeContentDefaults?.computeMetadata ??
32
+ true,
33
+ };
34
+ }
35
+ //# sourceMappingURL=resolve-content-write-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-content-write-config.js","sourceRoot":"","sources":["../../src/content/resolve-content-write-config.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAWvD,MAAM,UAAU,gCAAgC,CAAC,IAYhD;IACC,MAAM,QAAQ,GAA0C,IAAI,CAAC,YAAY;QACvE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO;QAC5B,QAAQ,EAAE,OAAO,EAAE,OAAO;QAC1B,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC;IAEvC,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAC3C,gBAAgB,CACd,sBAAsB,EACtB,uEAAuE,CACxE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GACZ,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ;QAC7B,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ;QACrC,IAAI,CAAC,oBAAoB,EAAE,QAAQ;QACnC,IAAI,CAAC,QAAQ,CAAC,sBAAsB;QACpC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;IAEhC,OAAO;QACL,OAAO;QACP,QAAQ;QACR,kBAAkB,EAChB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,kBAAkB;YACvC,IAAI,CAAC,oBAAoB,EAAE,kBAAkB;YAC7C,IAAI,CAAC,QAAQ,CAAC,kBAAkB;QAClC,eAAe,EACb,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe;YACpC,IAAI,CAAC,oBAAoB,EAAE,eAAe;YAC1C,IAAI;QACN,eAAe,EACb,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe;YACpC,IAAI,CAAC,oBAAoB,EAAE,eAAe;YAC1C,GAAG;QACL,eAAe,EACb,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,eAAe;YACpC,IAAI,CAAC,oBAAoB,EAAE,eAAe;YAC1C,IAAI;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { MemorixContentObject } from "../descriptors/entity-descriptor-types.js";
2
+ import type { MemorixWriteFieldDescriptor } from "../descriptors/write-descriptor-types.js";
3
+ import type { MemorixWriterClient } from "../client/types.js";
4
+ import type { MemorixEntityDescriptor } from "../descriptors/entity-descriptor-types.js";
5
+ import type { MemorixWriteDescriptor } from "../descriptors/write-descriptor-types.js";
6
+ export type ContentWriteResult = {
7
+ pointer: MemorixContentObject;
8
+ written: boolean;
9
+ sizeBytes?: number;
10
+ format?: "markdown" | "text";
11
+ storageKey: string;
12
+ };
13
+ export type WrittenContentHandle = {
14
+ fieldName: string;
15
+ storageKey: string;
16
+ provider: "gcs" | "s3";
17
+ };
18
+ export declare function writeMemorixContentObject(args: {
19
+ client: MemorixWriterClient;
20
+ entity: MemorixEntityDescriptor;
21
+ writeDescriptor: MemorixWriteDescriptor;
22
+ fieldName: string;
23
+ field: MemorixWriteFieldDescriptor;
24
+ body?: string;
25
+ format?: "markdown" | "text";
26
+ existingPointer?: MemorixContentObject;
27
+ context: {
28
+ entityId?: string;
29
+ eventId?: string;
30
+ recordId: string;
31
+ timestamp: string;
32
+ idempotencyKey?: string;
33
+ };
34
+ skipUpload?: boolean;
35
+ }): Promise<{
36
+ result: ContentWriteResult;
37
+ handle?: WrittenContentHandle;
38
+ }>;
39
+ export declare function cleanupWrittenContent(client: MemorixWriterClient, handles: WrittenContentHandle[]): Promise<void>;
40
+ //# sourceMappingURL=write-content-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-content-object.d.ts","sourceRoot":"","sources":["../../src/content/write-content-object.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAQvF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,oBAAoB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC;CACxB,CAAC;AAoBF,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,uBAAuB,CAAC;IAChC,eAAe,EAAE,sBAAsB,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,2BAA2B,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC,OAAO,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,MAAM,CAAC,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAwGzE;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,oBAAoB,EAAE,GAC9B,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,117 @@
1
+ import { createHash } from "node:crypto";
2
+ import { generateContentKey } from "./generate-content-key.js";
3
+ import { generatePreview } from "./generate-preview.js";
4
+ import { computeContentMetadata } from "./compute-content-metadata.js";
5
+ import { resolveMemorixContentWriteConfig } from "./resolve-content-write-config.js";
6
+ import { mapContentWriteError } from "./map-content-write-errors.js";
7
+ import { isMemorixContentPointer } from "../validation/validate-content.js";
8
+ function resolveObjectWriter(client, provider) {
9
+ const w = client.contentWriters[provider];
10
+ if (!w) {
11
+ throw new Error(`MemorixWriter: content writer for provider "${provider}" is not configured`);
12
+ }
13
+ return w;
14
+ }
15
+ function fullStorageKey(prefix, contentKey) {
16
+ const p = prefix?.replace(/\/+$/, "") ?? "";
17
+ return p ? `${p}/${contentKey.replace(/^\/+/, "")}` : contentKey.replace(/^\/+/, "");
18
+ }
19
+ export async function writeMemorixContentObject(args) {
20
+ const { client, entity, writeDescriptor, fieldName, field } = args;
21
+ if (args.existingPointer && isMemorixContentPointer(args.existingPointer)) {
22
+ if (field.content?.acceptPointer === false) {
23
+ throw new Error(`pointer not accepted for field "${fieldName}"`);
24
+ }
25
+ return {
26
+ result: {
27
+ pointer: args.existingPointer,
28
+ written: false,
29
+ sizeBytes: typeof args.existingPointer.metadata?.sizeBytes === "number"
30
+ ? args.existingPointer.metadata.sizeBytes
31
+ : undefined,
32
+ format: args.existingPointer.metadata?.format ??
33
+ undefined,
34
+ storageKey: args.existingPointer.contentKey,
35
+ },
36
+ };
37
+ }
38
+ if (!args.body) {
39
+ throw new Error(`content body required for field "${fieldName}"`);
40
+ }
41
+ const config = resolveMemorixContentWriteConfig({
42
+ entity,
43
+ propertyName: fieldName,
44
+ field,
45
+ defaults: client.defaults,
46
+ writeContentDefaults: writeDescriptor.content,
47
+ });
48
+ const fmt = args.format ?? field.content?.format ?? "markdown";
49
+ const hash = createHash("sha256").update(args.body).digest("hex").slice(0, 12);
50
+ const contentKey = generateContentKey(config.contentKeyTemplate ?? client.defaults.contentKeyTemplate, {
51
+ entity: entity.entityName,
52
+ contentType: writeDescriptor.target.contentType,
53
+ entityId: args.context.entityId,
54
+ eventId: args.context.eventId,
55
+ field: fieldName,
56
+ timestamp: args.context.timestamp,
57
+ recordId: args.context.recordId,
58
+ idempotencyKey: args.context.idempotencyKey,
59
+ hash,
60
+ }, args.body);
61
+ const storageKey = fullStorageKey(config.storage.prefix, contentKey);
62
+ const mime = fmt === "markdown" ? "text/markdown" : "text/plain";
63
+ if (!args.skipUpload) {
64
+ try {
65
+ const writer = resolveObjectWriter(client, config.storage.provider);
66
+ await writer.uploadObject({
67
+ key: storageKey,
68
+ body: args.body,
69
+ contentType: mime,
70
+ });
71
+ }
72
+ catch (err) {
73
+ throw mapContentWriteError(fieldName, err);
74
+ }
75
+ }
76
+ const metadata = config.computeMetadata
77
+ ? computeContentMetadata({
78
+ body: args.body,
79
+ format: fmt,
80
+ createdAt: args.context.timestamp,
81
+ hash,
82
+ })
83
+ : { sizeBytes: Buffer.byteLength(args.body, "utf8"), format: fmt, contentType: mime, createdAt: args.context.timestamp };
84
+ const preview = config.generatePreview
85
+ ? generatePreview(args.body, config.previewMaxChars)
86
+ : undefined;
87
+ const pointer = {
88
+ contentKey,
89
+ metadata,
90
+ preview,
91
+ };
92
+ return {
93
+ result: {
94
+ pointer,
95
+ written: !args.skipUpload,
96
+ sizeBytes: metadata.sizeBytes,
97
+ format: fmt,
98
+ storageKey,
99
+ },
100
+ handle: args.skipUpload
101
+ ? undefined
102
+ : {
103
+ fieldName,
104
+ storageKey,
105
+ provider: config.storage.provider,
106
+ },
107
+ };
108
+ }
109
+ export async function cleanupWrittenContent(client, handles) {
110
+ for (const h of handles) {
111
+ const w = client.contentWriters[h.provider];
112
+ if (w?.deleteObject) {
113
+ await w.deleteObject({ key: h.storageKey });
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=write-content-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-content-object.js","sourceRoot":"","sources":["../../src/content/write-content-object.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { MemorixDataTier } from "../mongo/tier.js";
2
+ import type { MemorixEntityDescriptor } from "../descriptors/entity-descriptor-types.js";
3
+ import type { MemorixWriteDescriptor } from "../descriptors/write-descriptor-types.js";
4
+ import type { MemorixTarget } from "../mongo/target.js";
5
+ export type ResolveMemorixWriteCollectionOptions = {
6
+ override?: string;
7
+ env?: NodeJS.ProcessEnv;
8
+ };
9
+ export declare function resolveEntityType(entity: MemorixEntityDescriptor): string;
10
+ export declare function buildMemorixWriteCollectionCandidates(args: {
11
+ entity: MemorixEntityDescriptor;
12
+ writeDescriptor: MemorixWriteDescriptor;
13
+ override?: string;
14
+ env?: NodeJS.ProcessEnv;
15
+ }): string[];
16
+ /** Sync resolver: returns the first configured candidate (no Mongo existence check). */
17
+ export declare function resolveMemorixWriteCollectionName(entity: MemorixEntityDescriptor, writeDescriptor: MemorixWriteDescriptor, options?: ResolveMemorixWriteCollectionOptions): string;
18
+ export declare function resolveMemorixWriteTargetCollection(args: {
19
+ tier: MemorixDataTier;
20
+ entity: MemorixEntityDescriptor;
21
+ writeDescriptor: MemorixWriteDescriptor;
22
+ override?: string;
23
+ env?: NodeJS.ProcessEnv;
24
+ verifyExists?: boolean;
25
+ }): Promise<{
26
+ collection: string;
27
+ target: MemorixTarget;
28
+ database: string;
29
+ }>;
30
+ //# sourceMappingURL=collection-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-name.d.ts","sourceRoot":"","sources":["../../src/data/collection-name.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAQvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,MAAM,oCAAoC,GAAG;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,CAEzE;AAED,wBAAgB,qCAAqC,CAAC,IAAI,EAAE;IAC1D,MAAM,EAAE,uBAAuB,CAAC;IAChC,eAAe,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,GAAG,MAAM,EAAE,CAkDX;AAED,wFAAwF;AACxF,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,uBAAuB,EAC/B,eAAe,EAAE,sBAAsB,EACvC,OAAO,GAAE,oCAAyC,GACjD,MAAM,CAQR;AAED,wBAAsB,mCAAmC,CAAC,IAAI,EAAE;IAC9D,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,uBAAuB,CAAC;IAChC,eAAe,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA8B3E"}
@@ -0,0 +1,86 @@
1
+ import { throwWriterError } from "../errors/errors.js";
2
+ import { DEFAULT_ENTITY_COLLECTION_CANDIDATES, DEFAULT_EVENT_COLLECTION_CANDIDATES, } from "../mongo/default-collections.js";
3
+ import { resolveMemorixDbName, targetCollectionEnvKey } from "../mongo/env.js";
4
+ import { resolveMemorixWriteTarget } from "../mongo/target.js";
5
+ export function resolveEntityType(entity) {
6
+ return entity.entityType?.trim() || entity.entityName.trim();
7
+ }
8
+ export function buildMemorixWriteCollectionCandidates(args) {
9
+ const env = args.env ?? process.env;
10
+ const target = resolveMemorixWriteTarget(args.writeDescriptor);
11
+ const entityType = resolveEntityType(args.entity);
12
+ const contentTypeKey = args.writeDescriptor.target.contentType;
13
+ const contentType = args.entity.contentTypes[contentTypeKey];
14
+ if (!contentType) {
15
+ throwWriterError("UNKNOWN_CONTENT_TYPE", `unknown content type "${contentTypeKey}" for entity "${args.entity.entityName}"`);
16
+ }
17
+ const candidates = [];
18
+ if (args.override?.trim())
19
+ candidates.push(args.override.trim());
20
+ if (args.writeDescriptor.target.targetCollection?.trim()) {
21
+ candidates.push(args.writeDescriptor.target.targetCollection.trim());
22
+ }
23
+ if (contentType.collection?.trim()) {
24
+ candidates.push(contentType.collection.trim());
25
+ }
26
+ const envKey = targetCollectionEnvKey(target, entityType);
27
+ const fromEnv = env[envKey]?.trim();
28
+ if (fromEnv)
29
+ candidates.push(fromEnv);
30
+ if (args.writeDescriptor.target.targetCollectionCandidates?.length) {
31
+ candidates.push(...args.writeDescriptor.target.targetCollectionCandidates);
32
+ }
33
+ const prefix = args.entity.collectionPrefix.trim();
34
+ const postfix = contentType.postfix?.trim();
35
+ if (prefix && postfix) {
36
+ candidates.push(`${prefix}-${postfix}`);
37
+ }
38
+ const defaultCandidates = target === "entity"
39
+ ? DEFAULT_ENTITY_COLLECTION_CANDIDATES
40
+ : DEFAULT_EVENT_COLLECTION_CANDIDATES;
41
+ if (defaultCandidates[entityType]) {
42
+ candidates.push(...defaultCandidates[entityType]);
43
+ }
44
+ candidates.push(target === "entity" ? entityType : `${entityType}-events`);
45
+ return [...new Set(candidates.filter(Boolean))];
46
+ }
47
+ /** Sync resolver: returns the first configured candidate (no Mongo existence check). */
48
+ export function resolveMemorixWriteCollectionName(entity, writeDescriptor, options = {}) {
49
+ const candidates = buildMemorixWriteCollectionCandidates({
50
+ entity,
51
+ writeDescriptor,
52
+ override: options.override,
53
+ env: options.env,
54
+ });
55
+ return candidates[0];
56
+ }
57
+ export async function resolveMemorixWriteTargetCollection(args) {
58
+ const env = args.env ?? process.env;
59
+ const target = resolveMemorixWriteTarget(args.writeDescriptor);
60
+ const database = resolveMemorixDbName(target, env);
61
+ const candidates = buildMemorixWriteCollectionCandidates({
62
+ entity: args.entity,
63
+ writeDescriptor: args.writeDescriptor,
64
+ override: args.override,
65
+ env,
66
+ });
67
+ if (args.verifyExists === false) {
68
+ return { collection: candidates[0], target, database };
69
+ }
70
+ const db = args.tier.client.db(database);
71
+ const existing = await listCollectionNames(db);
72
+ for (const name of candidates) {
73
+ if (existing.has(name)) {
74
+ return { collection: name, target, database };
75
+ }
76
+ }
77
+ const envKey = targetCollectionEnvKey(target, resolveEntityType(args.entity));
78
+ throwWriterError("UNKNOWN_COLLECTION", `No ${target} collection found for entityType=${resolveEntityType(args.entity)} ` +
79
+ `(database=${database}). Tried: ${candidates.join(", ")}. Set ` +
80
+ `write descriptor targetCollection, ${envKey}, or create one of the collections.`);
81
+ }
82
+ async function listCollectionNames(db) {
83
+ const existing = await db.listCollections().toArray();
84
+ return new Set(existing.map((c) => c.name));
85
+ }
86
+ //# sourceMappingURL=collection-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-name.js","sourceRoot":"","sources":["../../src/data/collection-name.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type ResolvedIdentity = {
2
+ entityId?: string;
3
+ eventId?: string;
4
+ idField: "entityId" | "eventId";
5
+ idValue: string;
6
+ };
7
+ export declare function resolveRequestIdentity(args: {
8
+ entityId?: string;
9
+ eventId?: string;
10
+ descriptorIdField?: "entityId" | "eventId";
11
+ }): ResolvedIdentity;
12
+ export declare function assertDescriptorIdField(identity: ResolvedIdentity, descriptorIdField: "entityId" | "eventId"): void;
13
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/data/identity.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC5C,GAAG,gBAAgB,CA8BnB;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,gBAAgB,EAC1B,iBAAiB,EAAE,UAAU,GAAG,SAAS,GACxC,IAAI,CAON"}
@@ -0,0 +1,29 @@
1
+ import { throwWriterError } from "../errors/errors.js";
2
+ export function resolveRequestIdentity(args) {
3
+ const hasEntity = Boolean(args.entityId?.trim());
4
+ const hasEvent = Boolean(args.eventId?.trim());
5
+ if (hasEntity && hasEvent) {
6
+ throwWriterError("INVALID_IDENTITY", "request must contain exactly one of entityId or eventId, not both");
7
+ }
8
+ if (!hasEntity && !hasEvent) {
9
+ throwWriterError("INVALID_IDENTITY", "request must contain exactly one of entityId or eventId");
10
+ }
11
+ if (hasEntity) {
12
+ return {
13
+ entityId: args.entityId.trim(),
14
+ idField: "entityId",
15
+ idValue: args.entityId.trim(),
16
+ };
17
+ }
18
+ return {
19
+ eventId: args.eventId.trim(),
20
+ idField: "eventId",
21
+ idValue: args.eventId.trim(),
22
+ };
23
+ }
24
+ export function assertDescriptorIdField(identity, descriptorIdField) {
25
+ if (identity.idField !== descriptorIdField) {
26
+ throwWriterError("INVALID_IDENTITY", `write descriptor requires idField "${descriptorIdField}" but request used "${identity.idField}"`);
27
+ }
28
+ }
29
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/data/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AASvD,MAAM,UAAU,sBAAsB,CAAC,IAItC;IACC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;QAC1B,gBAAgB,CACd,kBAAkB,EAClB,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,gBAAgB,CACd,kBAAkB,EAClB,yDAAyD,CAC1D,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAS,CAAC,IAAI,EAAE;YAC/B,OAAO,EAAE,UAAU;YACnB,OAAO,EAAE,IAAI,CAAC,QAAS,CAAC,IAAI,EAAE;SAC/B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAQ,CAAC,IAAI,EAAE;QAC7B,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,IAAI,CAAC,OAAQ,CAAC,IAAI,EAAE;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,QAA0B,EAC1B,iBAAyC;IAEzC,IAAI,QAAQ,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QAC3C,gBAAgB,CACd,kBAAkB,EAClB,sCAAsC,iBAAiB,uBAAuB,QAAQ,CAAC,OAAO,GAAG,CAClG,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { MemorixDataTier } from "../mongo/tier.js";
2
+ import type { MemorixTarget } from "../mongo/target.js";
3
+ export type MemorixWriteAdapter = {
4
+ target: MemorixTarget;
5
+ database: string;
6
+ findOne(collection: string, filter: Record<string, unknown>): Promise<Record<string, unknown> | null>;
7
+ findMany(collection: string, filter: Record<string, unknown>, opts?: {
8
+ limit?: number;
9
+ sort?: Record<string, unknown>;
10
+ }): Promise<Record<string, unknown>[]>;
11
+ insert(collection: string, document: Record<string, unknown>): Promise<{
12
+ insertedId: unknown;
13
+ }>;
14
+ patch(collection: string, filter: Record<string, unknown>, $set: Record<string, unknown>): Promise<{
15
+ matchedCount: number;
16
+ modifiedCount: number;
17
+ }>;
18
+ replace(collection: string, filter: Record<string, unknown>, replacement: Record<string, unknown>, upsert?: boolean): Promise<{
19
+ matchedCount: number;
20
+ modifiedCount: number;
21
+ upsertedCount: number;
22
+ }>;
23
+ update(collection: string, filter: Record<string, unknown>, update: Record<string, unknown>): Promise<{
24
+ matchedCount: number;
25
+ modifiedCount: number;
26
+ }>;
27
+ };
28
+ export type CreateMemorixWriteAdapterOptions = {
29
+ target: MemorixTarget;
30
+ env?: NodeJS.ProcessEnv;
31
+ };
32
+ export declare function createMemorixWriteAdapter(tier: MemorixDataTier, options: CreateMemorixWriteAdapterOptions): MemorixWriteAdapter;
33
+ //# sourceMappingURL=memorix-write-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memorix-write-adapter.d.ts","sourceRoot":"","sources":["../../src/data/memorix-write-adapter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CACL,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3C,QAAQ,CACN,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GACxD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,MAAM,CACJ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpC,KAAK,CACH,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,OAAO,CACL,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnF,MAAM,CACJ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,CAAC;AAgBF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,gCAAgC,GACxC,mBAAmB,CA2CrB"}