hexok 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 (201) hide show
  1. package/dist/app/api-use-case.d.ts +52 -0
  2. package/dist/app/api-use-case.d.ts.map +1 -0
  3. package/dist/app/api-use-case.js +59 -0
  4. package/dist/app/api-use-case.js.map +1 -0
  5. package/dist/app/callable-use-case.d.ts +34 -0
  6. package/dist/app/callable-use-case.d.ts.map +1 -0
  7. package/dist/app/callable-use-case.js +41 -0
  8. package/dist/app/callable-use-case.js.map +1 -0
  9. package/dist/app/contract.d.ts +46 -0
  10. package/dist/app/contract.d.ts.map +1 -0
  11. package/dist/app/contract.js +28 -0
  12. package/dist/app/contract.js.map +1 -0
  13. package/dist/app/error-factory.d.ts +9 -0
  14. package/dist/app/error-factory.d.ts.map +1 -0
  15. package/dist/app/error-factory.js +30 -0
  16. package/dist/app/error-factory.js.map +1 -0
  17. package/dist/app/event-channel.d.ts +133 -0
  18. package/dist/app/event-channel.d.ts.map +1 -0
  19. package/dist/app/event-channel.js +49 -0
  20. package/dist/app/event-channel.js.map +1 -0
  21. package/dist/app/event-use-case.d.ts +47 -0
  22. package/dist/app/event-use-case.d.ts.map +1 -0
  23. package/dist/app/event-use-case.js +54 -0
  24. package/dist/app/event-use-case.js.map +1 -0
  25. package/dist/app/execute-ctx.d.ts +92 -0
  26. package/dist/app/execute-ctx.d.ts.map +1 -0
  27. package/dist/app/execute-ctx.js +2 -0
  28. package/dist/app/execute-ctx.js.map +1 -0
  29. package/dist/app/external-use-case.d.ts +25 -0
  30. package/dist/app/external-use-case.d.ts.map +1 -0
  31. package/dist/app/external-use-case.js +25 -0
  32. package/dist/app/external-use-case.js.map +1 -0
  33. package/dist/app/index.d.ts +9 -0
  34. package/dist/app/index.d.ts.map +1 -0
  35. package/dist/app/index.js +8 -0
  36. package/dist/app/index.js.map +1 -0
  37. package/dist/app/internal-use-case.d.ts +26 -0
  38. package/dist/app/internal-use-case.d.ts.map +1 -0
  39. package/dist/app/internal-use-case.js +26 -0
  40. package/dist/app/internal-use-case.js.map +1 -0
  41. package/dist/app/nest.d.ts +9 -0
  42. package/dist/app/nest.d.ts.map +1 -0
  43. package/dist/app/nest.js +28 -0
  44. package/dist/app/nest.js.map +1 -0
  45. package/dist/app/types.d.ts +153 -0
  46. package/dist/app/types.d.ts.map +1 -0
  47. package/dist/app/types.js +17 -0
  48. package/dist/app/types.js.map +1 -0
  49. package/dist/core/coded-error.d.ts +24 -0
  50. package/dist/core/coded-error.d.ts.map +1 -0
  51. package/dist/core/coded-error.js +32 -0
  52. package/dist/core/coded-error.js.map +1 -0
  53. package/dist/core/error-map.d.ts +21 -0
  54. package/dist/core/error-map.d.ts.map +1 -0
  55. package/dist/core/error-map.js +5 -0
  56. package/dist/core/error-map.js.map +1 -0
  57. package/dist/core/index.d.ts +6 -0
  58. package/dist/core/index.d.ts.map +1 -0
  59. package/dist/core/index.js +5 -0
  60. package/dist/core/index.js.map +1 -0
  61. package/dist/core/result.d.ts +23 -0
  62. package/dist/core/result.d.ts.map +1 -0
  63. package/dist/core/result.js +11 -0
  64. package/dist/core/result.js.map +1 -0
  65. package/dist/core/schema.d.ts +19 -0
  66. package/dist/core/schema.d.ts.map +1 -0
  67. package/dist/core/schema.js +28 -0
  68. package/dist/core/schema.js.map +1 -0
  69. package/dist/core/standard-schema.d.ts +51 -0
  70. package/dist/core/standard-schema.d.ts.map +1 -0
  71. package/dist/core/standard-schema.js +2 -0
  72. package/dist/core/standard-schema.js.map +1 -0
  73. package/dist/domain/capabilities.d.ts +42 -0
  74. package/dist/domain/capabilities.d.ts.map +1 -0
  75. package/dist/domain/capabilities.js +2 -0
  76. package/dist/domain/capabilities.js.map +1 -0
  77. package/dist/domain/catalog.d.ts +46 -0
  78. package/dist/domain/catalog.d.ts.map +1 -0
  79. package/dist/domain/catalog.js +114 -0
  80. package/dist/domain/catalog.js.map +1 -0
  81. package/dist/domain/channel.d.ts +36 -0
  82. package/dist/domain/channel.d.ts.map +1 -0
  83. package/dist/domain/channel.js +2 -0
  84. package/dist/domain/channel.js.map +1 -0
  85. package/dist/domain/cow-draft.d.ts +10 -0
  86. package/dist/domain/cow-draft.d.ts.map +1 -0
  87. package/dist/domain/cow-draft.js +147 -0
  88. package/dist/domain/cow-draft.js.map +1 -0
  89. package/dist/domain/entity.d.ts +120 -0
  90. package/dist/domain/entity.d.ts.map +1 -0
  91. package/dist/domain/entity.js +263 -0
  92. package/dist/domain/entity.js.map +1 -0
  93. package/dist/domain/envelope.d.ts +59 -0
  94. package/dist/domain/envelope.d.ts.map +1 -0
  95. package/dist/domain/envelope.js +2 -0
  96. package/dist/domain/envelope.js.map +1 -0
  97. package/dist/domain/event.d.ts +44 -0
  98. package/dist/domain/event.d.ts.map +1 -0
  99. package/dist/domain/event.js +21 -0
  100. package/dist/domain/event.js.map +1 -0
  101. package/dist/domain/index.d.ts +8 -0
  102. package/dist/domain/index.d.ts.map +1 -0
  103. package/dist/domain/index.js +5 -0
  104. package/dist/domain/index.js.map +1 -0
  105. package/dist/domain/port.d.ts +45 -0
  106. package/dist/domain/port.d.ts.map +1 -0
  107. package/dist/domain/port.js +41 -0
  108. package/dist/domain/port.js.map +1 -0
  109. package/dist/infra/adapter.d.ts +22 -0
  110. package/dist/infra/adapter.d.ts.map +1 -0
  111. package/dist/infra/adapter.js +18 -0
  112. package/dist/infra/adapter.js.map +1 -0
  113. package/dist/infra/index.d.ts +3 -0
  114. package/dist/infra/index.d.ts.map +1 -0
  115. package/dist/infra/index.js +3 -0
  116. package/dist/infra/index.js.map +1 -0
  117. package/dist/infra/mapper.d.ts +48 -0
  118. package/dist/infra/mapper.d.ts.map +1 -0
  119. package/dist/infra/mapper.js +77 -0
  120. package/dist/infra/mapper.js.map +1 -0
  121. package/dist/runtime/app.d.ts +100 -0
  122. package/dist/runtime/app.d.ts.map +1 -0
  123. package/dist/runtime/app.js +292 -0
  124. package/dist/runtime/app.js.map +1 -0
  125. package/dist/runtime/channel.d.ts +34 -0
  126. package/dist/runtime/channel.d.ts.map +1 -0
  127. package/dist/runtime/channel.js +110 -0
  128. package/dist/runtime/channel.js.map +1 -0
  129. package/dist/runtime/client.d.ts +21 -0
  130. package/dist/runtime/client.d.ts.map +1 -0
  131. package/dist/runtime/client.js +2 -0
  132. package/dist/runtime/client.js.map +1 -0
  133. package/dist/runtime/completeness.d.ts +89 -0
  134. package/dist/runtime/completeness.d.ts.map +1 -0
  135. package/dist/runtime/completeness.js +2 -0
  136. package/dist/runtime/completeness.js.map +1 -0
  137. package/dist/runtime/envelope.d.ts +7 -0
  138. package/dist/runtime/envelope.d.ts.map +1 -0
  139. package/dist/runtime/envelope.js +69 -0
  140. package/dist/runtime/envelope.js.map +1 -0
  141. package/dist/runtime/events.d.ts +6 -0
  142. package/dist/runtime/events.d.ts.map +1 -0
  143. package/dist/runtime/events.js +48 -0
  144. package/dist/runtime/events.js.map +1 -0
  145. package/dist/runtime/http-status.d.ts +3 -0
  146. package/dist/runtime/http-status.d.ts.map +1 -0
  147. package/dist/runtime/http-status.js +11 -0
  148. package/dist/runtime/http-status.js.map +1 -0
  149. package/dist/runtime/http.d.ts +4 -0
  150. package/dist/runtime/http.d.ts.map +1 -0
  151. package/dist/runtime/http.js +58 -0
  152. package/dist/runtime/http.js.map +1 -0
  153. package/dist/runtime/index.d.ts +10 -0
  154. package/dist/runtime/index.d.ts.map +1 -0
  155. package/dist/runtime/index.js +6 -0
  156. package/dist/runtime/index.js.map +1 -0
  157. package/dist/runtime/interceptor.d.ts +61 -0
  158. package/dist/runtime/interceptor.d.ts.map +1 -0
  159. package/dist/runtime/interceptor.js +7 -0
  160. package/dist/runtime/interceptor.js.map +1 -0
  161. package/dist/runtime/invoke.d.ts +34 -0
  162. package/dist/runtime/invoke.d.ts.map +1 -0
  163. package/dist/runtime/invoke.js +235 -0
  164. package/dist/runtime/invoke.js.map +1 -0
  165. package/dist/runtime/middleware.d.ts +20 -0
  166. package/dist/runtime/middleware.d.ts.map +1 -0
  167. package/dist/runtime/middleware.js +2 -0
  168. package/dist/runtime/middleware.js.map +1 -0
  169. package/dist/runtime/rpc.d.ts +24 -0
  170. package/dist/runtime/rpc.d.ts.map +1 -0
  171. package/dist/runtime/rpc.js +16 -0
  172. package/dist/runtime/rpc.js.map +1 -0
  173. package/dist/testing/app-test.d.ts +77 -0
  174. package/dist/testing/app-test.d.ts.map +1 -0
  175. package/dist/testing/app-test.js +109 -0
  176. package/dist/testing/app-test.js.map +1 -0
  177. package/dist/testing/in-memory-broker.d.ts +18 -0
  178. package/dist/testing/in-memory-broker.d.ts.map +1 -0
  179. package/dist/testing/in-memory-broker.js +42 -0
  180. package/dist/testing/in-memory-broker.js.map +1 -0
  181. package/dist/testing/in-memory-bus.d.ts +19 -0
  182. package/dist/testing/in-memory-bus.d.ts.map +1 -0
  183. package/dist/testing/in-memory-bus.js +31 -0
  184. package/dist/testing/in-memory-bus.js.map +1 -0
  185. package/dist/testing/in-memory-channel.d.ts +32 -0
  186. package/dist/testing/in-memory-channel.d.ts.map +1 -0
  187. package/dist/testing/in-memory-channel.js +65 -0
  188. package/dist/testing/in-memory-channel.js.map +1 -0
  189. package/dist/testing/in-memory-queue.d.ts +24 -0
  190. package/dist/testing/in-memory-queue.d.ts.map +1 -0
  191. package/dist/testing/in-memory-queue.js +66 -0
  192. package/dist/testing/in-memory-queue.js.map +1 -0
  193. package/dist/testing/in-memory-repository.d.ts +44 -0
  194. package/dist/testing/in-memory-repository.d.ts.map +1 -0
  195. package/dist/testing/in-memory-repository.js +60 -0
  196. package/dist/testing/in-memory-repository.js.map +1 -0
  197. package/dist/testing/index.d.ts +6 -0
  198. package/dist/testing/index.d.ts.map +1 -0
  199. package/dist/testing/index.js +6 -0
  200. package/dist/testing/index.js.map +1 -0
  201. package/package.json +60 -0
@@ -0,0 +1,147 @@
1
+ const DRAFT = Symbol('hexok.cow');
2
+ export function isPlainObject(value) {
3
+ if (value === null || typeof value !== 'object')
4
+ return false;
5
+ if (Array.isArray(value) || value instanceof Date)
6
+ return false;
7
+ const proto = Object.getPrototypeOf(value);
8
+ return proto === Object.prototype || proto === null;
9
+ }
10
+ function isCowNode(value) {
11
+ return isPlainObject(value) || Array.isArray(value);
12
+ }
13
+ export function applyCowDraft(root, owned, producer) {
14
+ const copies = new WeakMap();
15
+ const proxies = new WeakMap();
16
+ const parents = new WeakMap();
17
+ const nextOwned = owned ?? new WeakSet();
18
+ let wrote = false;
19
+ let currentRoot = root;
20
+ const sourceOf = (obj) => copies.get(obj) ?? obj;
21
+ const dest = (obj, asWrite = true) => {
22
+ const copied = copies.get(obj);
23
+ if (copied)
24
+ return copied;
25
+ if (nextOwned.has(obj) && !Object.isFrozen(obj))
26
+ return obj;
27
+ if (asWrite)
28
+ wrote = true;
29
+ const clone = (Array.isArray(obj) ? obj.slice() : { ...obj });
30
+ copies.set(obj, clone);
31
+ nextOwned.add(clone);
32
+ const link = parents.get(obj);
33
+ if (link) {
34
+ const parentDest = dest(link.parent, asWrite);
35
+ parentDest[link.key] = clone;
36
+ }
37
+ else {
38
+ currentRoot = clone;
39
+ }
40
+ return clone;
41
+ };
42
+ const unwrap = (value) => {
43
+ if (value !== null && typeof value === 'object') {
44
+ const raw = value[DRAFT];
45
+ if (raw !== undefined)
46
+ return raw;
47
+ }
48
+ return value;
49
+ };
50
+ const wrap = (obj) => {
51
+ const existing = proxies.get(obj);
52
+ if (existing)
53
+ return existing;
54
+ // Frozen objects cannot be proxy targets: non-writable, non-configurable
55
+ // keys reject a nested draft proxy (get) and a differing assignment (set).
56
+ const target = Object.isFrozen(obj) ? dest(obj, false) : obj;
57
+ const proxy = new Proxy(target, handler);
58
+ proxies.set(obj, proxy);
59
+ if (target !== obj)
60
+ proxies.set(target, proxy);
61
+ return proxy;
62
+ };
63
+ const handler = {
64
+ get(target, key) {
65
+ if (key === DRAFT)
66
+ return sourceOf(target);
67
+ const value = Reflect.get(sourceOf(target), key);
68
+ if (isCowNode(value)) {
69
+ parents.set(value, { parent: target, key });
70
+ return wrap(value);
71
+ }
72
+ return value;
73
+ },
74
+ set(target, key, value) {
75
+ wrote = true;
76
+ const next = unwrap(value);
77
+ const targetDest = dest(target);
78
+ targetDest[key] = next;
79
+ if (isCowNode(next))
80
+ nextOwned.add(next);
81
+ return true;
82
+ },
83
+ deleteProperty(target, key) {
84
+ wrote = true;
85
+ return Reflect.deleteProperty(dest(target), key);
86
+ },
87
+ has(target, key) {
88
+ return Reflect.has(sourceOf(target), key);
89
+ },
90
+ ownKeys(target) {
91
+ return Reflect.ownKeys(sourceOf(target));
92
+ },
93
+ getOwnPropertyDescriptor(target, key) {
94
+ return Reflect.getOwnPropertyDescriptor(sourceOf(target), key);
95
+ },
96
+ defineProperty(target, key, attributes) {
97
+ wrote = true;
98
+ return Reflect.defineProperty(dest(target), key, attributes);
99
+ },
100
+ };
101
+ producer(wrap(root));
102
+ if (!wrote)
103
+ return { root, owned, wrote: false };
104
+ return { root: currentRoot, owned: nextOwned, wrote: true };
105
+ }
106
+ export function frozenSnapshot(value) {
107
+ return deepFreeze(deepClone(value));
108
+ }
109
+ /** Unfrozen deep clone of plain objects, arrays, and `Date`. */
110
+ export function cloneValue(value) {
111
+ return deepClone(value);
112
+ }
113
+ function deepClone(value) {
114
+ if (value instanceof Date)
115
+ return new Date(value.getTime());
116
+ if (Array.isArray(value)) {
117
+ return value.map((item) => deepClone(item));
118
+ }
119
+ if (isPlainObject(value)) {
120
+ const out = {};
121
+ for (const key of Object.keys(value)) {
122
+ out[key] = deepClone(value[key]);
123
+ }
124
+ return out;
125
+ }
126
+ return value;
127
+ }
128
+ function deepFreeze(value) {
129
+ if (value instanceof Date) {
130
+ Object.freeze(value);
131
+ return value;
132
+ }
133
+ if (Array.isArray(value)) {
134
+ for (const item of value)
135
+ deepFreeze(item);
136
+ Object.freeze(value);
137
+ return value;
138
+ }
139
+ if (isPlainObject(value)) {
140
+ for (const key of Object.keys(value)) {
141
+ deepFreeze(value[key]);
142
+ }
143
+ Object.freeze(value);
144
+ }
145
+ return value;
146
+ }
147
+ //# sourceMappingURL=cow-draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cow-draft.js","sourceRoot":"","sources":["../../src/domain/cow-draft.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import { type ErrorMap, type Infer, type StandardSchemaV1 } from '../core/index.js';
2
+ /** Recursively readonly view of entity props. `Date` values stay `Date`. */
3
+ export type DeepReadonly<T> = T extends Date ? T : T extends readonly (infer U)[] ? ReadonlyArray<DeepReadonly<U>> : T extends object ? {
4
+ readonly [K in keyof T]: DeepReadonly<T[K]>;
5
+ } : T;
6
+ /**
7
+ * Aggregates mutate **this** via `set` and return `this`.
8
+ * They never I/O, never publish, never hold ports.
9
+ *
10
+ * Validation, invariants, and declared refusals **throw**.
11
+ * `create` / `parse` run the schema. `restore` does not — it rehydrates
12
+ * mapper output as-is. `set` re-runs the schema after a write.
13
+ * `validate()` is the optional fail-fast for a restored instance.
14
+ *
15
+ * ```ts
16
+ * class Incident extends Entity<IncidentProps> {
17
+ * static readonly key = 'Incident'
18
+ * static readonly schema = z.object({ id: z.string(), status: z.enum(['open', 'closed']) })
19
+ * static readonly errors = { ALREADY_CLOSED: { message: 'Incident already closed' } } as const
20
+ * close(now: Date): this {
21
+ * if (this.props.status === 'closed') Incident.error('ALREADY_CLOSED')
22
+ * return this.set((draft) => {
23
+ * draft.status = 'closed'
24
+ * draft.closedAt = now
25
+ * })
26
+ * }
27
+ * }
28
+ * ```
29
+ */
30
+ export declare abstract class Entity<P extends object> {
31
+ #private;
32
+ /** Entity name used in validation and undeclared-error messages. Declare on each subclass. */
33
+ static readonly key: string;
34
+ /** Standard Schema for `create` / `parse` / `set` / `validate()`. Declare on each subclass. */
35
+ static readonly schema: StandardSchemaV1;
36
+ /** Declared refusal codes. Keys are the `error()` union. Declare on each subclass. */
37
+ static readonly errors: ErrorMap;
38
+ protected _props: P;
39
+ /** Live props. Read-only; write through `set`. */
40
+ get props(): DeepReadonly<P>;
41
+ /** True after `create` until `commit`. `restore` / `parse` start false. */
42
+ get isNew(): boolean;
43
+ /**
44
+ * True after `create`, `parse`, a writing `set`, or `validate()`.
45
+ * `restore` starts false — the schema has not run.
46
+ */
47
+ get isValidated(): boolean;
48
+ /**
49
+ * Pre-mutation props after the first `set` on a restored entity.
50
+ * `undefined` when same-ref (clean) or `create`d and never `commit`ted.
51
+ */
52
+ get original(): DeepReadonly<P> | undefined;
53
+ protected constructor(props: P);
54
+ /** Copy-on-write mutate. Edit `draft` and return `this`. Re-validates the schema after a write. */
55
+ set(producer: (draft: P) => void): this;
56
+ /**
57
+ * Run the schema if it has not already passed on this instance.
58
+ * No-op when `isValidated`. Does not rewrite props (no strip/defaults).
59
+ * Throws `CodedError` `VALIDATION` if the schema rejects current props.
60
+ */
61
+ validate(): this;
62
+ /** Shallow keys that differ from `original`. `{ deep: true }` returns dotted leaf paths. */
63
+ getChangedKeys(): Array<ChangedKey<P>>;
64
+ getChangedKeys(opts: {
65
+ deep: true;
66
+ }): string[];
67
+ getChangedKeys(opts?: {
68
+ deep?: boolean;
69
+ }): string[];
70
+ /** True when `create`d and not yet `commit`ted, or any shallow key changed. */
71
+ isDirty(): boolean;
72
+ /** Accept current props as original; `isNew` becomes false. Adapters after persist; not use-cases. */
73
+ commit(): this;
74
+ /** Deep frozen snapshot for persistence and use-case output. Reused until the next `set`. */
75
+ toProps(): DeepReadonly<P>;
76
+ /** JSON serialization is the plain props snapshot. */
77
+ toJSON(): DeepReadonly<P>;
78
+ /**
79
+ * Throw a declared entity error. Codes are the keys of the subclass
80
+ * `static errors` when called as `Incident.error('ALREADY_CLOSED')`.
81
+ * An undeclared code is a type error on that call, and a programming
82
+ * error at runtime.
83
+ */
84
+ static error<E extends object, K extends keyof E & string>(this: {
85
+ errors: E;
86
+ key: string;
87
+ }, code: K, data?: unknown): never;
88
+ /**
89
+ * Validate typed props and construct a new instance (`isNew: true`).
90
+ * Throws `CodedError` `VALIDATION` if the schema rejects the props.
91
+ */
92
+ static create<T extends EntityConstructor>(this: T, props: SchemaOutput<T> | DeepReadonly<SchemaOutput<T>>): T['prototype'];
93
+ /**
94
+ * Reconstruct an existing instance (`isNew: false`) without running the
95
+ * schema. Props are stored as given (no strip/defaults). `isValidated`
96
+ * starts false until `set` writes or `validate()` runs.
97
+ */
98
+ static restore<T extends EntityConstructor>(this: T, props: SchemaOutput<T> | DeepReadonly<SchemaOutput<T>>): T['prototype'];
99
+ /**
100
+ * Trust boundary for untyped input. Validates like `create`;
101
+ * tracking matches `restore` (`isNew: false`).
102
+ * Throws `CodedError` `VALIDATION` if the schema rejects the value.
103
+ */
104
+ static parse<T extends EntityConstructor>(this: T, value: unknown): T['prototype'];
105
+ }
106
+ /** Subclass constructor shape for `create` / `restore` / `parse`. */
107
+ export type EntityConstructor = {
108
+ /** Entity name used in validation and error messages. */
109
+ readonly key: string;
110
+ /** Standard Schema for `create` / `parse` / `set` / `validate()`. Declare on each subclass. */
111
+ readonly schema: StandardSchemaV1;
112
+ /** Declared refusal codes. Keys are the `error()` union. Declare on each subclass. */
113
+ readonly errors: ErrorMap;
114
+ readonly prototype: Entity<any>;
115
+ };
116
+ type SchemaOutput<T extends EntityConstructor> = Infer<T['schema']>;
117
+ /** `keyof object` is `never`; widen so `Entity<P>` stays assignable to `Entity<object>`. */
118
+ type ChangedKey<P extends object> = keyof P extends never ? string : keyof P & string;
119
+ export {};
120
+ //# sourceMappingURL=entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/domain/entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,263 @@
1
+ import { CodedError, validate, validationError, } from '../core/index.js';
2
+ import { applyCowDraft, cloneValue, frozenSnapshot, isPlainObject, } from './cow-draft.js';
3
+ const EMPTY_CHANGED_KEYS = Object.freeze([]);
4
+ /**
5
+ * Aggregates mutate **this** via `set` and return `this`.
6
+ * They never I/O, never publish, never hold ports.
7
+ *
8
+ * Validation, invariants, and declared refusals **throw**.
9
+ * `create` / `parse` run the schema. `restore` does not — it rehydrates
10
+ * mapper output as-is. `set` re-runs the schema after a write.
11
+ * `validate()` is the optional fail-fast for a restored instance.
12
+ *
13
+ * ```ts
14
+ * class Incident extends Entity<IncidentProps> {
15
+ * static readonly key = 'Incident'
16
+ * static readonly schema = z.object({ id: z.string(), status: z.enum(['open', 'closed']) })
17
+ * static readonly errors = { ALREADY_CLOSED: { message: 'Incident already closed' } } as const
18
+ * close(now: Date): this {
19
+ * if (this.props.status === 'closed') Incident.error('ALREADY_CLOSED')
20
+ * return this.set((draft) => {
21
+ * draft.status = 'closed'
22
+ * draft.closedAt = now
23
+ * })
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+ export class Entity {
29
+ /** Entity name used in validation and undeclared-error messages. Declare on each subclass. */
30
+ static key;
31
+ /** Standard Schema for `create` / `parse` / `set` / `validate()`. Declare on each subclass. */
32
+ static schema;
33
+ /** Declared refusal codes. Keys are the `error()` union. Declare on each subclass. */
34
+ static errors;
35
+ #isNew = false;
36
+ #validated = false;
37
+ #original = undefined;
38
+ #owned = undefined;
39
+ #snapshot = undefined;
40
+ _props;
41
+ /** Live props. Read-only; write through `set`. */
42
+ get props() {
43
+ return this._props;
44
+ }
45
+ /** True after `create` until `commit`. `restore` / `parse` start false. */
46
+ get isNew() {
47
+ return this.#isNew;
48
+ }
49
+ /**
50
+ * True after `create`, `parse`, a writing `set`, or `validate()`.
51
+ * `restore` starts false — the schema has not run.
52
+ */
53
+ get isValidated() {
54
+ return this.#validated;
55
+ }
56
+ /**
57
+ * Pre-mutation props after the first `set` on a restored entity.
58
+ * `undefined` when same-ref (clean) or `create`d and never `commit`ted.
59
+ */
60
+ get original() {
61
+ if (this.#original === undefined ||
62
+ Object.is(this._props, this.#original)) {
63
+ return undefined;
64
+ }
65
+ return this.#original;
66
+ }
67
+ constructor(props) {
68
+ this._props = props;
69
+ }
70
+ /** Copy-on-write mutate. Edit `draft` and return `this`. Re-validates the schema after a write. */
71
+ set(producer) {
72
+ const previousRoot = this._props;
73
+ const backup = cloneValue(this._props);
74
+ const previousSnapshot = this.#snapshot;
75
+ const wasOwned = this.#owned?.has(this._props) === true;
76
+ const result = applyCowDraft(this._props, this.#owned, producer);
77
+ this._props = result.root;
78
+ this.#owned = result.owned;
79
+ if (result.wrote) {
80
+ this.#snapshot = undefined;
81
+ try {
82
+ this.#assertSchema();
83
+ }
84
+ catch (error) {
85
+ this._props = wasOwned ? backup : previousRoot;
86
+ this.#owned = wasOwned ? new WeakSet([backup]) : undefined;
87
+ this.#snapshot = previousSnapshot;
88
+ throw error;
89
+ }
90
+ this.#validated = true;
91
+ }
92
+ return this;
93
+ }
94
+ /**
95
+ * Run the schema if it has not already passed on this instance.
96
+ * No-op when `isValidated`. Does not rewrite props (no strip/defaults).
97
+ * Throws `CodedError` `VALIDATION` if the schema rejects current props.
98
+ */
99
+ validate() {
100
+ if (this.#validated)
101
+ return this;
102
+ this.#assertSchema();
103
+ this.#validated = true;
104
+ return this;
105
+ }
106
+ getChangedKeys(opts) {
107
+ if (!this.#isNew &&
108
+ (this.#original === undefined || Object.is(this._props, this.#original))) {
109
+ return EMPTY_CHANGED_KEYS;
110
+ }
111
+ if (opts?.deep) {
112
+ const out = [];
113
+ diffDeep(this._props, this.#isNew ? undefined : this.#original, '', out);
114
+ return out.length === 0 ? EMPTY_CHANGED_KEYS : out;
115
+ }
116
+ if (this.#isNew) {
117
+ return Object.keys(this._props);
118
+ }
119
+ const current = this._props;
120
+ const original = this.#original;
121
+ const keys = new Set([
122
+ ...Object.keys(current),
123
+ ...Object.keys(original),
124
+ ]);
125
+ const changed = [];
126
+ for (const key of keys) {
127
+ const k = key;
128
+ if (!Object.is(current[k], original[k]))
129
+ changed.push(key);
130
+ }
131
+ return changed.length === 0 ? EMPTY_CHANGED_KEYS : changed;
132
+ }
133
+ /** True when `create`d and not yet `commit`ted, or any shallow key changed. */
134
+ isDirty() {
135
+ return this.#isNew || this.getChangedKeys().length > 0;
136
+ }
137
+ /** Accept current props as original; `isNew` becomes false. Adapters after persist; not use-cases. */
138
+ commit() {
139
+ this.#original = this._props;
140
+ this.#isNew = false;
141
+ this.#owned = undefined;
142
+ return this;
143
+ }
144
+ /** Deep frozen snapshot for persistence and use-case output. Reused until the next `set`. */
145
+ toProps() {
146
+ if (this.#snapshot === undefined) {
147
+ this.#snapshot = frozenSnapshot(this._props);
148
+ }
149
+ return this.#snapshot;
150
+ }
151
+ /** JSON serialization is the plain props snapshot. */
152
+ toJSON() {
153
+ return this.toProps();
154
+ }
155
+ /**
156
+ * Throw a declared entity error. Codes are the keys of the subclass
157
+ * `static errors` when called as `Incident.error('ALREADY_CLOSED')`.
158
+ * An undeclared code is a type error on that call, and a programming
159
+ * error at runtime.
160
+ */
161
+ static error(code, data) {
162
+ throwEntityError(this, code, data);
163
+ }
164
+ /**
165
+ * Validate typed props and construct a new instance (`isNew: true`).
166
+ * Throws `CodedError` `VALIDATION` if the schema rejects the props.
167
+ */
168
+ static create(props) {
169
+ const instance = instantiate(this, props);
170
+ instance.#markNew();
171
+ instance.#validated = true;
172
+ return instance;
173
+ }
174
+ /**
175
+ * Reconstruct an existing instance (`isNew: false`) without running the
176
+ * schema. Props are stored as given (no strip/defaults). `isValidated`
177
+ * starts false until `set` writes or `validate()` runs.
178
+ */
179
+ static restore(props) {
180
+ const instance = construct(this, props);
181
+ instance.#markRestored();
182
+ return instance;
183
+ }
184
+ /**
185
+ * Trust boundary for untyped input. Validates like `create`;
186
+ * tracking matches `restore` (`isNew: false`).
187
+ * Throws `CodedError` `VALIDATION` if the schema rejects the value.
188
+ */
189
+ static parse(value) {
190
+ const instance = instantiate(this, value);
191
+ instance.#markRestored();
192
+ instance.#validated = true;
193
+ return instance;
194
+ }
195
+ #markNew() {
196
+ this._props = { ...this._props };
197
+ this.#original = undefined;
198
+ this.#isNew = true;
199
+ this.#owned = new WeakSet();
200
+ this.#owned.add(this._props);
201
+ this.#snapshot = undefined;
202
+ }
203
+ #markRestored() {
204
+ this.#original = this._props;
205
+ this.#isNew = false;
206
+ this.#owned = undefined;
207
+ this.#snapshot = undefined;
208
+ }
209
+ #assertSchema() {
210
+ const Ctor = this.constructor;
211
+ const parsed = validate(Ctor.schema, this._props);
212
+ if (!parsed.ok) {
213
+ throw validationError(`hexok: ${Ctor.key} validation failed`, parsed.issues);
214
+ }
215
+ }
216
+ }
217
+ function instantiate(Ctor, value) {
218
+ const parsed = validate(Ctor.schema, value);
219
+ if (!parsed.ok) {
220
+ throw validationError(`hexok: ${Ctor.key} validation failed`, parsed.issues);
221
+ }
222
+ return construct(Ctor, parsed.value);
223
+ }
224
+ function construct(Ctor, value) {
225
+ const CtorImpl = Ctor;
226
+ return new CtorImpl(value);
227
+ }
228
+ function diffDeep(current, original, path, out) {
229
+ if (Object.is(current, original))
230
+ return;
231
+ const currentPlain = isPlainObject(current);
232
+ const originalPlain = isPlainObject(original);
233
+ if (currentPlain || originalPlain) {
234
+ const keys = new Set([
235
+ ...(currentPlain ? Object.keys(current) : []),
236
+ ...(originalPlain ? Object.keys(original) : []),
237
+ ]);
238
+ if (keys.size === 0) {
239
+ if (path)
240
+ out.push(path);
241
+ return;
242
+ }
243
+ for (const key of keys) {
244
+ const next = path ? `${path}.${key}` : key;
245
+ diffDeep(currentPlain ? current[key] : undefined, originalPlain ? original[key] : undefined, next, out);
246
+ }
247
+ return;
248
+ }
249
+ if (path)
250
+ out.push(path);
251
+ }
252
+ function throwEntityError(ctor, code, data) {
253
+ const def = ctor.errors[code];
254
+ if (def === undefined) {
255
+ throw new Error(`hexok: undeclared error "${code}" on ${ctor.key}`);
256
+ }
257
+ throw new CodedError({
258
+ code,
259
+ message: def.message ?? code,
260
+ ...(data !== undefined ? { data } : {}),
261
+ });
262
+ }
263
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../../src/domain/entity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /** `'bus'` is fan-out; `'queue'` is competing consumers with ack/nack. */
2
+ export type CatalogKind = 'bus' | 'queue';
3
+ /**
4
+ * Runtime value on the wire. `kind` is copied from the catalog.
5
+ */
6
+ export type Envelope<K extends string = string, P = unknown, Cat extends string = string, Kind extends CatalogKind = CatalogKind, Ctx = unknown> = {
7
+ /** Event class key, e.g. `'incident.closed'`. */
8
+ key: K;
9
+ /** Event payload. */
10
+ payload: P;
11
+ /** Catalog name this event was published through. */
12
+ catalog: Cat;
13
+ /** Copied from the catalog: `'bus'` or `'queue'`. */
14
+ kind: Kind;
15
+ /** When the event was wrapped for the wire. */
16
+ occurredAt: Date;
17
+ /** Catalog ctx when `.ctx()` was declared; omitted otherwise. */
18
+ ctx?: Ctx;
19
+ /** Copied from request ctx when that field is a string. */
20
+ correlationId?: string;
21
+ /** Copied from request ctx when that field is a string. */
22
+ causationId?: string;
23
+ /** Adapter/interceptor scratch. Hexok writes `{}`; domain code should not. */
24
+ meta: Record<string, unknown>;
25
+ };
26
+ /** Fire-and-forget pub/sub. No ack, no consumer group, no persistence in the contract. */
27
+ export interface BusAdapter {
28
+ /** Discriminant. Must be `'bus'`. */
29
+ kind: 'bus';
30
+ /** Put one envelope on the bus. */
31
+ publish(envelope: Envelope): Promise<void>;
32
+ /** Register a handler for one event key. */
33
+ subscribe(key: string, handler: (envelope: Envelope) => Promise<void>): void;
34
+ /** Tear down the adapter. Optional. */
35
+ stop?(): Promise<void>;
36
+ }
37
+ /** Ack/nack and delivery attempt for one queue message. */
38
+ export interface QueueConsumeCtx {
39
+ /** 1-based delivery attempt. */
40
+ attempt: number;
41
+ /** Mark this delivery succeeded. */
42
+ ack: () => Promise<void>;
43
+ /** Reject this delivery so it can retry. */
44
+ nack: () => Promise<void>;
45
+ }
46
+ /** Work queue. One consumer in a group; ack/nack; `attempt`. */
47
+ export interface QueueAdapter {
48
+ /** Discriminant. Must be `'queue'`. */
49
+ kind: 'queue';
50
+ /** Put one envelope on the queue. */
51
+ publish(envelope: Envelope): Promise<void>;
52
+ /** Register a competing consumer for one event key in `group`. */
53
+ consume(key: string, group: string, handler: (envelope: Envelope, ctx: QueueConsumeCtx) => Promise<void>): void;
54
+ /** Tear down the adapter. Optional. */
55
+ stop?(): Promise<void>;
56
+ }
57
+ /** Bound event transport: a bus or a queue. */
58
+ export type EventAdapter = BusAdapter | QueueAdapter;
59
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/domain/envelope.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,CAAC;AAE1C;;GAEG;AACH,MAAM,MAAM,QAAQ,CAClB,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,GAAG,OAAO,EACX,GAAG,SAAS,MAAM,GAAG,MAAM,EAC3B,IAAI,SAAS,WAAW,GAAG,WAAW,EACtC,GAAG,GAAG,OAAO,IACX;IACF,iDAAiD;IACjD,GAAG,EAAE,CAAC,CAAC;IACP,qBAAqB;IACrB,OAAO,EAAE,CAAC,CAAC;IACX,qDAAqD;IACrD,OAAO,EAAE,GAAG,CAAC;IACb,qDAAqD;IACrD,IAAI,EAAE,IAAI,CAAC;IACX,+CAA+C;IAC/C,UAAU,EAAE,IAAI,CAAC;IACjB,iEAAiE;IACjE,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF,0FAA0F;AAC1F,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,IAAI,EAAE,KAAK,CAAC;IACZ,mCAAmC;IACnC,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,4CAA4C;IAC5C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7E,uCAAuC;IACvC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,gEAAgE;AAChE,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,qCAAqC;IACrC,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,kEAAkE;IAClE,OAAO,CACL,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GACnE,IAAI,CAAC;IACR,uCAAuC;IACvC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/domain/envelope.ts"],"names":[],"mappings":""}