@voyant-travel/core 0.109.0 → 0.111.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.
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Custom fields — a typed, validated, visibility-aware extension-field registry
3
+ * for core entities (consolidated-deployments RFC, the "20%": custom fields
4
+ * without forking).
5
+ *
6
+ * The common client ask is "add a few fields to bookings / people / products".
7
+ * The free-form `metadata` jsonb most entities already carry is the unstructured
8
+ * escape hatch (Medusa's model); this registry turns a *declared* subset of that
9
+ * space into fields that are:
10
+ * - **validated** on write (type / required / options / custom rule),
11
+ * - **visibility-aware** — each field declares whether it surfaces in exports,
12
+ * invoices, and search, so those readers can consult the registry instead of
13
+ * dumping or hiding everything,
14
+ * - **PII-aware** — flagged fields can be encrypted at rest / redacted in logs.
15
+ *
16
+ * The registry is **deployment config**: a deployment declares its fields (often
17
+ * discovered from `src/custom-fields/*` via {@link customFieldsFromGlob}) and the
18
+ * framework injects the registry into the services that read/write entities.
19
+ * This module is intentionally dependency-free (no zod / drizzle) so it can live
20
+ * in `@voyant-travel/core` and be imported anywhere.
21
+ */
22
+ /**
23
+ * The supported types a custom field can hold — the canonical superset across
24
+ * code-declared and runtime (DB-defined) fields (see the custom-fields
25
+ * unification ADR). Runtime equivalents map in: `varchar`→`text`, `double`→
26
+ * `number`, `enum`→`select`, `set`→`multiselect`, `address`/`phone`→`json`.
27
+ */
28
+ export type CustomFieldType = "text" | "number" | "boolean" | "date"
29
+ /** One of `options`. */
30
+ | "select"
31
+ /** A subset of `options`, stored as `string[]`. */
32
+ | "multiselect"
33
+ /** Money as `{ amountCents: number, currency: string }` (ISO-4217). */
34
+ | "monetary"
35
+ /** Arbitrary JSON (object/array) — also the home for `address`/`phone`. */
36
+ | "json";
37
+ /** A monetary custom-field value: integer minor units + an ISO-4217 currency. */
38
+ export interface CustomFieldMonetaryValue {
39
+ amountCents: number;
40
+ currency: string;
41
+ }
42
+ /**
43
+ * Per-channel visibility. Defaults (when a channel is unset) are deliberately
44
+ * conservative: visible in exports, hidden from invoices and search.
45
+ */
46
+ export interface CustomFieldVisibility {
47
+ /** Surface in data exports (CSV/JSON). Default `true`. */
48
+ export?: boolean;
49
+ /** Render on generated invoices. Default `false` (invoices are customer-facing). */
50
+ invoice?: boolean;
51
+ /** Index for search. Default `false`. */
52
+ search?: boolean;
53
+ }
54
+ /** A single custom-field declaration attached to one entity. */
55
+ export interface CustomFieldDefinition {
56
+ /** Entity the field attaches to, e.g. `"booking"`, `"person"`, `"product"`. */
57
+ entity: string;
58
+ /** Stable key within the entity's custom-field namespace (typo-proof). */
59
+ key: string;
60
+ type: CustomFieldType;
61
+ /** Human label — an i18n key or literal. */
62
+ label: string;
63
+ /** Reject writes that omit this field. Default `false`. */
64
+ required?: boolean;
65
+ /** Allowed values for `type: "select"`. */
66
+ options?: ReadonlyArray<string>;
67
+ /** Sensitive data — the deployment should encrypt at rest / redact in logs. */
68
+ pii?: boolean;
69
+ visibility?: CustomFieldVisibility;
70
+ /**
71
+ * Extra validation beyond type/required/options. Return an error message to
72
+ * reject, or `null` to accept. Runs only when a value is present.
73
+ */
74
+ validate?: (value: unknown) => string | null;
75
+ }
76
+ /** Identity helper for authoring a field with full type-checking. */
77
+ export declare function defineCustomField<T extends CustomFieldDefinition>(definition: T): T;
78
+ /** A resolved, indexed set of custom-field declarations. */
79
+ export interface CustomFieldRegistry {
80
+ /** All fields declared for `entity`, in declaration order. */
81
+ forEntity(entity: string): CustomFieldDefinition[];
82
+ /** A single field by `(entity, key)`, or `undefined`. */
83
+ field(entity: string, key: string): CustomFieldDefinition | undefined;
84
+ /** Entities that have at least one field. */
85
+ entities(): string[];
86
+ /** Every declared field. */
87
+ all(): CustomFieldDefinition[];
88
+ }
89
+ /**
90
+ * Resolve the registry for a request. The unified system's definitions come
91
+ * from two sources (code-declared + the runtime `custom_field_definitions`
92
+ * table), and the runtime set is read from the DB — so the registry is resolved
93
+ * per request from a `db` handle rather than being a boot-time constant. `db` is
94
+ * `unknown` to keep `core` free of a Drizzle dependency; the deployment's
95
+ * resolver casts it. See the custom-fields unification ADR.
96
+ */
97
+ export type CustomFieldRegistryResolver = (db: unknown) => CustomFieldRegistry | Promise<CustomFieldRegistry>;
98
+ /**
99
+ * Build a {@link CustomFieldRegistry} from declarations. Throws on a duplicate
100
+ * `(entity, key)` — a collision is a config bug, not something to resolve
101
+ * silently.
102
+ */
103
+ export declare function createCustomFieldRegistry(definitions: ReadonlyArray<CustomFieldDefinition>): CustomFieldRegistry;
104
+ /**
105
+ * Merge custom-field declarations from several sources into one duplicate-free
106
+ * list (feed it to {@link createCustomFieldRegistry}). On a `(entity, key)`
107
+ * collision the **earlier** source wins — pass code-declared fields before
108
+ * runtime/DB-defined ones so the framework contract is authoritative. The
109
+ * `onShadow` callback (if given) is notified of each dropped collision.
110
+ *
111
+ * The unification's single registry is built as
112
+ * `createCustomFieldRegistry(mergeCustomFieldDefinitions(codeFields, dbFields))`.
113
+ */
114
+ export declare function mergeCustomFieldDefinitions(sources: ReadonlyArray<ReadonlyArray<CustomFieldDefinition>>, onShadow?: (shadowed: CustomFieldDefinition, winner: CustomFieldDefinition) => void): CustomFieldDefinition[];
115
+ /** Fields of `entity` visible in `channel` (export / invoice / search). */
116
+ export declare function customFieldsVisibleIn(registry: CustomFieldRegistry, entity: string, channel: keyof CustomFieldVisibility): CustomFieldDefinition[];
117
+ /** One field's validation failure. */
118
+ export interface CustomFieldError {
119
+ key: string;
120
+ message: string;
121
+ }
122
+ /** The outcome of {@link validateCustomFields}. */
123
+ export interface CustomFieldValidationResult {
124
+ ok: boolean;
125
+ /** Validated values, unknown/absent keys dropped. Only meaningful when `ok`. */
126
+ value: Record<string, unknown>;
127
+ errors: CustomFieldError[];
128
+ }
129
+ /**
130
+ * Validate a custom-fields payload for `entity` against the registry. Unknown
131
+ * keys are rejected (typo-proofing), missing required fields error, present
132
+ * values are type/options/custom-rule checked. `null`/`undefined` values for a
133
+ * non-required field are treated as "omitted". Returns the cleaned value and any
134
+ * errors — callers persist `value` (e.g. into the entity's `custom_fields` or
135
+ * `metadata` jsonb) only when `ok`.
136
+ */
137
+ export declare function validateCustomFields(registry: CustomFieldRegistry, entity: string, input: Record<string, unknown> | null | undefined): CustomFieldValidationResult;
138
+ /**
139
+ * Discover deployment-local custom-field declarations from a Vite
140
+ * `import.meta.glob` (eager) of `src/custom-fields/*.ts` files — the custom-field
141
+ * half of the "extend without forking" seam (mirrors `modulesFromGlob` etc.).
142
+ * Each file's `default` export is a {@link CustomFieldDefinition} or an array of
143
+ * them; the results flatten into one list to feed
144
+ * {@link createCustomFieldRegistry}. Empty until a deployment adds one.
145
+ *
146
+ * @throws if a matched file has no default export.
147
+ */
148
+ export declare function customFieldsFromGlob(glob: Record<string, unknown>): CustomFieldDefinition[];
149
+ //# sourceMappingURL=custom-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-fields.d.ts","sourceRoot":"","sources":["../src/custom-fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Custom fields — a typed, validated, visibility-aware extension-field registry
3
+ * for core entities (consolidated-deployments RFC, the "20%": custom fields
4
+ * without forking).
5
+ *
6
+ * The common client ask is "add a few fields to bookings / people / products".
7
+ * The free-form `metadata` jsonb most entities already carry is the unstructured
8
+ * escape hatch (Medusa's model); this registry turns a *declared* subset of that
9
+ * space into fields that are:
10
+ * - **validated** on write (type / required / options / custom rule),
11
+ * - **visibility-aware** — each field declares whether it surfaces in exports,
12
+ * invoices, and search, so those readers can consult the registry instead of
13
+ * dumping or hiding everything,
14
+ * - **PII-aware** — flagged fields can be encrypted at rest / redacted in logs.
15
+ *
16
+ * The registry is **deployment config**: a deployment declares its fields (often
17
+ * discovered from `src/custom-fields/*` via {@link customFieldsFromGlob}) and the
18
+ * framework injects the registry into the services that read/write entities.
19
+ * This module is intentionally dependency-free (no zod / drizzle) so it can live
20
+ * in `@voyant-travel/core` and be imported anywhere.
21
+ */
22
+ /** Identity helper for authoring a field with full type-checking. */
23
+ export function defineCustomField(definition) {
24
+ return definition;
25
+ }
26
+ const VISIBILITY_DEFAULTS = {
27
+ export: true,
28
+ invoice: false,
29
+ search: false,
30
+ };
31
+ /**
32
+ * Build a {@link CustomFieldRegistry} from declarations. Throws on a duplicate
33
+ * `(entity, key)` — a collision is a config bug, not something to resolve
34
+ * silently.
35
+ */
36
+ export function createCustomFieldRegistry(definitions) {
37
+ const byEntity = new Map();
38
+ const seen = new Set();
39
+ for (const def of definitions) {
40
+ const id = `${def.entity}.${def.key}`;
41
+ if (seen.has(id)) {
42
+ throw new Error(`[voyant-custom-fields] duplicate custom field "${id}"`);
43
+ }
44
+ seen.add(id);
45
+ const list = byEntity.get(def.entity) ?? [];
46
+ list.push(def);
47
+ byEntity.set(def.entity, list);
48
+ }
49
+ return {
50
+ forEntity: (entity) => [...(byEntity.get(entity) ?? [])],
51
+ field: (entity, key) => byEntity.get(entity)?.find((f) => f.key === key),
52
+ entities: () => [...byEntity.keys()],
53
+ all: () => [...definitions],
54
+ };
55
+ }
56
+ /**
57
+ * Merge custom-field declarations from several sources into one duplicate-free
58
+ * list (feed it to {@link createCustomFieldRegistry}). On a `(entity, key)`
59
+ * collision the **earlier** source wins — pass code-declared fields before
60
+ * runtime/DB-defined ones so the framework contract is authoritative. The
61
+ * `onShadow` callback (if given) is notified of each dropped collision.
62
+ *
63
+ * The unification's single registry is built as
64
+ * `createCustomFieldRegistry(mergeCustomFieldDefinitions(codeFields, dbFields))`.
65
+ */
66
+ export function mergeCustomFieldDefinitions(sources, onShadow) {
67
+ const winners = new Map();
68
+ for (const source of sources) {
69
+ for (const def of source) {
70
+ const id = `${def.entity}.${def.key}`;
71
+ const existing = winners.get(id);
72
+ if (existing) {
73
+ onShadow?.(def, existing);
74
+ continue;
75
+ }
76
+ winners.set(id, def);
77
+ }
78
+ }
79
+ return [...winners.values()];
80
+ }
81
+ /** Fields of `entity` visible in `channel` (export / invoice / search). */
82
+ export function customFieldsVisibleIn(registry, entity, channel) {
83
+ return registry
84
+ .forEntity(entity)
85
+ .filter((f) => f.visibility?.[channel] ?? VISIBILITY_DEFAULTS[channel]);
86
+ }
87
+ function checkType(def, value) {
88
+ switch (def.type) {
89
+ case "text":
90
+ return typeof value === "string" ? null : "must be a string";
91
+ case "number":
92
+ return typeof value === "number" && Number.isFinite(value) ? null : "must be a finite number";
93
+ case "boolean":
94
+ return typeof value === "boolean" ? null : "must be a boolean";
95
+ case "date":
96
+ if (value instanceof Date) {
97
+ return Number.isNaN(value.getTime()) ? "must be a valid date" : null;
98
+ }
99
+ return typeof value === "string" && !Number.isNaN(Date.parse(value))
100
+ ? null
101
+ : "must be an ISO date string";
102
+ case "select":
103
+ return typeof value === "string" && (def.options ?? []).includes(value)
104
+ ? null
105
+ : `must be one of: ${(def.options ?? []).join(", ")}`;
106
+ case "multiselect": {
107
+ const allowed = def.options ?? [];
108
+ if (!Array.isArray(value) ||
109
+ value.some((v) => typeof v !== "string" || !allowed.includes(v))) {
110
+ return `must be a subset of: ${allowed.join(", ")}`;
111
+ }
112
+ return null;
113
+ }
114
+ case "monetary": {
115
+ const v = value;
116
+ const ok = typeof value === "object" &&
117
+ value !== null &&
118
+ typeof v.amountCents === "number" &&
119
+ Number.isInteger(v.amountCents) &&
120
+ typeof v.currency === "string" &&
121
+ v.currency.length === 3;
122
+ return ok ? null : "must be { amountCents: integer, currency: 3-letter code }";
123
+ }
124
+ case "json":
125
+ // Arbitrary JSON (incl. address/phone). Reject only `undefined`; `null`
126
+ // is already handled as "omitted" by the caller.
127
+ return value === undefined ? "must be a JSON value" : null;
128
+ }
129
+ }
130
+ /**
131
+ * Validate a custom-fields payload for `entity` against the registry. Unknown
132
+ * keys are rejected (typo-proofing), missing required fields error, present
133
+ * values are type/options/custom-rule checked. `null`/`undefined` values for a
134
+ * non-required field are treated as "omitted". Returns the cleaned value and any
135
+ * errors — callers persist `value` (e.g. into the entity's `custom_fields` or
136
+ * `metadata` jsonb) only when `ok`.
137
+ */
138
+ export function validateCustomFields(registry, entity, input) {
139
+ const provided = input ?? {};
140
+ const fields = registry.forEntity(entity);
141
+ const known = new Set(fields.map((f) => f.key));
142
+ const errors = [];
143
+ const value = {};
144
+ for (const key of Object.keys(provided)) {
145
+ if (!known.has(key)) {
146
+ errors.push({ key, message: `unknown custom field for "${entity}"` });
147
+ }
148
+ }
149
+ for (const def of fields) {
150
+ const raw = provided[def.key];
151
+ const absent = raw === null || raw === undefined;
152
+ if (absent) {
153
+ if (def.required) {
154
+ errors.push({ key: def.key, message: "is required" });
155
+ }
156
+ continue;
157
+ }
158
+ const typeError = checkType(def, raw);
159
+ if (typeError) {
160
+ errors.push({ key: def.key, message: typeError });
161
+ continue;
162
+ }
163
+ const customError = def.validate?.(raw);
164
+ if (customError) {
165
+ errors.push({ key: def.key, message: customError });
166
+ continue;
167
+ }
168
+ value[def.key] = raw;
169
+ }
170
+ return { ok: errors.length === 0, value, errors };
171
+ }
172
+ /**
173
+ * Discover deployment-local custom-field declarations from a Vite
174
+ * `import.meta.glob` (eager) of `src/custom-fields/*.ts` files — the custom-field
175
+ * half of the "extend without forking" seam (mirrors `modulesFromGlob` etc.).
176
+ * Each file's `default` export is a {@link CustomFieldDefinition} or an array of
177
+ * them; the results flatten into one list to feed
178
+ * {@link createCustomFieldRegistry}. Empty until a deployment adds one.
179
+ *
180
+ * @throws if a matched file has no default export.
181
+ */
182
+ export function customFieldsFromGlob(glob) {
183
+ return Object.entries(glob)
184
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
185
+ .flatMap(([path, namespace]) => {
186
+ const declaration = namespace.default;
187
+ if (declaration == null) {
188
+ throw new Error(`[voyant-custom-fields] "${path}" has no default export — ` +
189
+ "export default defineCustomField(...) (or an array of them)");
190
+ }
191
+ return Array.isArray(declaration)
192
+ ? declaration
193
+ : [declaration];
194
+ });
195
+ }
196
+ //# sourceMappingURL=custom-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-fields.js","sourceRoot":"","sources":["../src/custom-fields.ts"],"names":[],"mappings":"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"}
package/dist/events.d.ts CHANGED
@@ -142,6 +142,15 @@ export interface EventBusOptions {
142
142
  * e-invoicing API) can hold an emit. Set `false` to disable.
143
143
  */
144
144
  handlerTimeoutMs?: number | false;
145
+ /**
146
+ * Invoked when a subscriber throws or times out. The bus already logs to
147
+ * console and keeps the "subscribers are fire-and-forget" contract (the
148
+ * emitter and sibling handlers are unaffected); this is the hook a runtime
149
+ * uses to route the failure to an error reporter (RFC voyant#1553). It MUST
150
+ * NOT throw — the bus guards the call defensively, but keep it best-effort.
151
+ * `error` is an `Error` for timeouts and the thrown value otherwise.
152
+ */
153
+ onSubscriberError?: (event: string, error: unknown) => void;
145
154
  }
146
155
  export interface EventBus {
147
156
  /** Emit an event. Fire-and-forget; subscribers cannot affect the emitter. */
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAA;AAEjD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEpF;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAC5B,KAAK,GAAG,OAAO,EACf,SAAS,SAAS,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS;IAEvE,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,IAAI,EAAE,KAAK,CAAA;IACX,qDAAqD;IACrD,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CACtB,KAAK,GAAG,OAAO,EACf,SAAS,SAAS,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,IACrE,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAEpE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,IAAI,CAAA;CACpB;AAED;;;;;;;;;;GAUG;AACH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IAC9C;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IAC/D,gDAAgD;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC;;;OAGG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/C;AAED,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,oEAAoE;AACpE,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACjC;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAC5D;AAED,MAAM,WAAW,QAAQ;IACvB,6EAA6E;IAC7E,IAAI,CAAC,KAAK,EAAE,SAAS,SAAS,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,EACjF,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,KAAK,EACX,QAAQ,CAAC,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB,oEAAoE;IACpE,SAAS,CAAC,KAAK,EAAE,SAAS,SAAS,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,EACtF,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,EACvC,OAAO,CAAC,EAAE,gBAAgB,GACzB,YAAY,CAAA;IAEf;;;;;;;OAOG;IACH,OAAO,CAAC,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CAC3D;AAQD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAsLtE"}
package/dist/events.js CHANGED
@@ -21,6 +21,17 @@ const DEFAULT_HANDLER_TIMEOUT_MS = 15_000;
21
21
  export function createEventBus(options = {}) {
22
22
  const handlers = new Map();
23
23
  const timeoutMs = options.handlerTimeoutMs ?? DEFAULT_HANDLER_TIMEOUT_MS;
24
+ /** Route a subscriber failure to the optional reporter hook; never throws. */
25
+ function notifySubscriberError(event, error) {
26
+ if (!options.onSubscriberError)
27
+ return;
28
+ try {
29
+ options.onSubscriberError(event, error);
30
+ }
31
+ catch {
32
+ // the reporter hook must never break the bus
33
+ }
34
+ }
24
35
  /**
25
36
  * Runs one handler; never rejects. Returns the error message when the
26
37
  * handler threw or timed out, `null` on success. Errors are always
@@ -47,6 +58,7 @@ export function createEventBus(options = {}) {
47
58
  // on subscriber idempotency.
48
59
  const message = `subscriber for "${event}" exceeded ${timeoutMs}ms; not awaited`;
49
60
  console.error(`[events] ${message}`);
61
+ notifySubscriberError(event, new Error(message));
50
62
  return message;
51
63
  }
52
64
  return null;
@@ -59,6 +71,7 @@ export function createEventBus(options = {}) {
59
71
  catch (err) {
60
72
  // Subscribers are fire-and-forget — log and continue.
61
73
  console.error(`[events] subscriber error for "${event}":`, err);
74
+ notifySubscriberError(event, err);
62
75
  return err instanceof Error ? err.message : String(err);
63
76
  }
64
77
  }
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,8 @@ export type { AdminConfig, AdminRoutesConfig, ConfigValidationIssue, ConfigValid
2
2
  export { defineVoyantConfig, resolveEntry, validateVoyantConfig } from "./config.js";
3
3
  export type { ModuleContainer } from "./container.js";
4
4
  export { createContainer } from "./container.js";
5
+ export type { CustomFieldDefinition, CustomFieldError, CustomFieldMonetaryValue, CustomFieldRegistry, CustomFieldRegistryResolver, CustomFieldType, CustomFieldValidationResult, CustomFieldVisibility, } from "./custom-fields.js";
6
+ export { createCustomFieldRegistry, customFieldsFromGlob, customFieldsVisibleIn, defineCustomField, mergeCustomFieldDefinitions, validateCustomFields, } from "./custom-fields.js";
5
7
  export type { Actor, VoyantAuthContext, VoyantCallerType, VoyantPermission, VoyantVariables, } from "./env.js";
6
8
  export type { DeliveryResult, EmitOptions, EventBus, EventBusOptions, EventCategory, EventEnvelope, EventHandler, EventMetadata, EventSource, OutboxEventStore, SubscribeOptions, Subscription, } from "./events.js";
7
9
  export { createEventBus, generateEventId } from "./events.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACpF,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,YAAY,EACV,KAAK,EACL,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,cAAc,EACd,WAAW,EACX,QAAQ,EACR,eAAe,EACf,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,OAAO,EACP,WAAW,EACX,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAClF,YAAY,EACV,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAA;AACjE,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,SAAS,EACT,MAAM,EACN,kBAAkB,GACnB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC/D,YAAY,EACV,MAAM,EACN,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC3D,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC9E,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACpF,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,2BAA2B,EAC3B,eAAe,EACf,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,KAAK,EACL,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,cAAc,EACd,WAAW,EACX,QAAQ,EACR,eAAe,EACf,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,OAAO,EACP,WAAW,EACX,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAClF,YAAY,EACV,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAA;AACjE,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,SAAS,EACT,MAAM,EACN,kBAAkB,GACnB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC/D,YAAY,EACV,MAAM,EACN,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC3D,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC9E,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { defineVoyantConfig, resolveEntry, validateVoyantConfig } from "./config.js";
2
2
  export { createContainer } from "./container.js";
3
+ export { createCustomFieldRegistry, customFieldsFromGlob, customFieldsVisibleIn, defineCustomField, mergeCustomFieldDefinitions, validateCustomFields, } from "./custom-fields.js";
3
4
  export { createEventBus, generateEventId } from "./events.js";
4
5
  export { hooks } from "./hooks.js";
5
6
  export { defineLink, generateLinkTableSql, resolveLinkFromSpec } from "./links.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAEpF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAsBhD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAgBlC,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAKlF,OAAO,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAA;AAgBjE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAa3D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAW9C,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAEpF,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAWhD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAsB3B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAgBlC,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAKlF,OAAO,EAAE,kCAAkC,EAAE,MAAM,cAAc,CAAA;AAgBjE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAa3D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAW9C,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyant-travel/core",
3
- "version": "0.109.0",
3
+ "version": "0.111.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -49,6 +49,11 @@
49
49
  "import": "./dist/orchestration.js",
50
50
  "default": "./dist/orchestration.js"
51
51
  },
52
+ "./custom-fields": {
53
+ "types": "./dist/custom-fields.d.ts",
54
+ "import": "./dist/custom-fields.js",
55
+ "default": "./dist/custom-fields.js"
56
+ },
52
57
  "./links": {
53
58
  "types": "./dist/links.d.ts",
54
59
  "import": "./dist/links.js",