@hyperscale0/adl 1.0.0-beta.6 → 1.0.0-beta.7

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,31 @@
1
+ /** Synthetic conformance metadata, not a real provider requirement. */
2
+ import type { ProviderAdapter } from "../src/index.js";
3
+
4
+ export const subjectAdapter: ProviderAdapter = {
5
+ provider: "conformance_subject",
6
+ capability: "subject",
7
+ domain: "conformance",
8
+ egress: "sync_clearance",
9
+ bindings: {
10
+ subject: "strict",
11
+ },
12
+ config: {},
13
+ operationMap: {
14
+ "subject.check": {
15
+ operation: "subject.check",
16
+ direction: "tenant_initiated",
17
+ envelope: "http_200_body_status",
18
+ obligationKind: "subject_check",
19
+ resourceKind: "subject",
20
+ resourceIdPath: "subjectId",
21
+ subjectRequirements: [
22
+ {
23
+ name: "referenceCode",
24
+ type: "text",
25
+ minLength: 1,
26
+ },
27
+ ],
28
+ },
29
+ },
30
+ webhookMap: {},
31
+ };
@@ -0,0 +1,24 @@
1
+ import { type BoundaryInstruction, type BoundaryObservation, type BoundaryOutcome } from "./index.js";
2
+ /** Deterministic fixture. No transport, clock, accounts or inferred outcome. */
3
+ export declare const genericAdapter: {
4
+ readonly provider: "conformance_boundary";
5
+ readonly capability: "boundary";
6
+ readonly egress: "none";
7
+ readonly config: {};
8
+ readonly bindings: {
9
+ readonly instruction: "strict";
10
+ };
11
+ readonly operationMap: {
12
+ readonly "boundary.observe": {
13
+ readonly operation: "boundary.observe";
14
+ readonly direction: "system_settlement";
15
+ readonly obligationKind: "boundary_observation";
16
+ readonly resourceKind: "instruction";
17
+ readonly resourceIdPath: "instructionId";
18
+ readonly subjectRequirements: readonly [];
19
+ };
20
+ };
21
+ readonly webhookMap: {};
22
+ };
23
+ export declare function observeBoundary(instruction: BoundaryInstruction, outcome: BoundaryOutcome, externalReference: string, observedAt: string): BoundaryObservation;
24
+ //# sourceMappingURL=boundary-fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary-fixture.d.ts","sourceRoot":"","sources":["../src/boundary-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAEpB,gFAAgF;AAChF,eAAO,MAAM,cAAc;uBAEb,sBAAsB;yBACpB,UAAU;qBACd,MAAM;;;iBAEF,WAAW,EAAE,QAAQ;;;iBAE/B,kBAAkB;qBAChB,SAAS,EAAE,kBAAkB;qBAC7B,SAAS,EAAE,mBAAmB;qBAC9B,cAAc,EAAE,sBAAsB;qBACtC,YAAY,EAAE,aAAa;qBAC3B,cAAc,EAAE,eAAe;qBAC/B,mBAAmB;;;;CAKb,CAAC;AAEf,wBAAgB,eAAe,CAC7B,WAAW,EAAE,mBAAmB,EAChC,OAAO,EAAE,eAAe,EACxB,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,GACjB,mBAAmB,CAUrB"}
@@ -0,0 +1,34 @@
1
+ import { createProviderAdapterRegistry, boundaryObservationSchema, } from "./index.js";
2
+ /** Deterministic fixture. No transport, clock, accounts or inferred outcome. */
3
+ export const genericAdapter = createProviderAdapterRegistry()([
4
+ {
5
+ provider: "conformance_boundary",
6
+ capability: "boundary",
7
+ egress: "none",
8
+ config: {},
9
+ bindings: { instruction: "strict" },
10
+ operationMap: {
11
+ "boundary.observe": {
12
+ operation: "boundary.observe",
13
+ direction: "system_settlement",
14
+ obligationKind: "boundary_observation",
15
+ resourceKind: "instruction",
16
+ resourceIdPath: "instructionId",
17
+ subjectRequirements: [],
18
+ },
19
+ },
20
+ webhookMap: {},
21
+ },
22
+ ])[0];
23
+ export function observeBoundary(instruction, outcome, externalReference, observedAt) {
24
+ if (instruction.adapter !== genericAdapter.provider)
25
+ throw new Error("instruction adapter mismatch");
26
+ return boundaryObservationSchema.parse({
27
+ adapter: genericAdapter.provider,
28
+ instructionId: instruction.id,
29
+ outcome,
30
+ externalReference,
31
+ observedAt,
32
+ });
33
+ }
34
+ //# sourceMappingURL=boundary-fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary-fixture.js","sourceRoot":"","sources":["../src/boundary-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,GAI1B,MAAM,YAAY,CAAC;AAEpB,gFAAgF;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,6BAA6B,EAAE,CAAC;IAC5D;QACE,QAAQ,EAAE,sBAAsB;QAChC,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;QACnC,YAAY,EAAE;YACZ,kBAAkB,EAAE;gBAClB,SAAS,EAAE,kBAAkB;gBAC7B,SAAS,EAAE,mBAAmB;gBAC9B,cAAc,EAAE,sBAAsB;gBACtC,YAAY,EAAE,aAAa;gBAC3B,cAAc,EAAE,eAAe;gBAC/B,mBAAmB,EAAE,EAAE;aACxB;SACF;QACD,UAAU,EAAE,EAAE;KACf;CACO,CAAC,CAAC,CAAC,CAAC,CAAC;AAEf,MAAM,UAAU,eAAe,CAC7B,WAAgC,EAChC,OAAwB,EACxB,iBAAyB,EACzB,UAAkB;IAElB,IAAI,WAAW,CAAC,OAAO,KAAK,cAAc,CAAC,QAAQ;QACjD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,OAAO,yBAAyB,CAAC,KAAK,CAAC;QACrC,OAAO,EAAE,cAAc,CAAC,QAAQ;QAChC,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,OAAO;QACP,iBAAiB;QACjB,UAAU;KACX,CAAC,CAAC;AACL,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,56 @@
1
- import { statementAvailabilities, type ChargePosting, type ChargeVatMode, type FinancialAddressMechanism, type FinancialAddressPricing, type FinancialAddressQuota, type FxRateReadBack, type LimitAccessMode, type LimitDimension, type PartnerBankDedupeKey, type PartnerBankLifecycleState, type PartnerBankSigning, type PartnerBankStatementFormat, type PartnerBankWireCodec, type ProviderAuthEnvelope, type ProviderEgressMode, type ProviderNotificationMechanism, type ProviderOperationDirection, type ProviderResourceBinding, type ProviderResponseEnvelope, type ProviderTimestampField, type RailSubstitution, type StatementAvailability, type StatementDebitReference, type StatusEnquiryKey, type ValueDateOffset } from "./vocabulary.js";
2
- export { certifyPartnerBankAdapter, partnerBankConformanceCodes, partnerBankConformanceFindings, type PartnerBankConformanceCode, type PartnerBankConformanceFinding, } from "./conformance.js";
3
- export { statementAvailabilities };
4
- export type { ProviderEgressMode, ProviderOperationDirection, ProviderResourceBinding, ProviderResponseEnvelope, };
1
+ import * as z from "zod";
2
+ import { type UdlObjectField } from "@hyperscale0/udl";
3
+ import { subjectFieldTypes, type ProviderEgressMode, type ProviderOperationDirection, type ProviderResourceBinding, type ProviderResponseEnvelope, type ProviderTimestampField, type SubjectFieldType } from "./vocabulary.js";
4
+ export { subjectFieldTypes };
5
+ export type { ProviderEgressMode, ProviderOperationDirection, ProviderResourceBinding, ProviderResponseEnvelope, SubjectFieldType, };
6
+ export declare const boundaryOutcomeSchema: z.ZodEnum<{
7
+ acknowledged: "acknowledged";
8
+ confirmed: "confirmed";
9
+ rejected: "rejected";
10
+ unknown: "unknown";
11
+ }>;
12
+ export declare const boundaryInstructionSchema: z.ZodReadonly<z.ZodObject<{
13
+ id: z.ZodString;
14
+ environment: z.ZodEnum<{
15
+ live: "live";
16
+ sandbox: "sandbox";
17
+ }>;
18
+ tenantId: z.ZodString;
19
+ productId: z.ZodString;
20
+ productBuildId: z.ZodString;
21
+ buildDigest: z.ZodString;
22
+ target: z.ZodReadonly<z.ZodObject<{
23
+ kind: z.ZodString;
24
+ attachment: z.ZodString;
25
+ instanceId: z.ZodString;
26
+ }, z.core.$strict>>;
27
+ sourceAccountId: z.ZodString;
28
+ destinationAccountId: z.ZodString;
29
+ amount: z.ZodString;
30
+ currency: z.ZodString;
31
+ adapter: z.ZodString;
32
+ }, z.core.$strict>>;
33
+ export declare const boundaryObservationSchema: z.ZodReadonly<z.ZodObject<{
34
+ adapter: z.ZodString;
35
+ externalReference: z.ZodString;
36
+ instructionId: z.ZodString;
37
+ outcome: z.ZodEnum<{
38
+ acknowledged: "acknowledged";
39
+ confirmed: "confirmed";
40
+ rejected: "rejected";
41
+ unknown: "unknown";
42
+ }>;
43
+ observedAt: z.ZodISODateTime;
44
+ }, z.core.$strict>>;
45
+ export type BoundaryInstruction = z.infer<typeof boundaryInstructionSchema>;
46
+ export type BoundaryObservation = z.infer<typeof boundaryObservationSchema>;
47
+ export type BoundaryOutcome = z.infer<typeof boundaryOutcomeSchema>;
48
+ /** Adapter implementation. Dispatch and enquiry never choose money bindings. */
49
+ export interface BoundaryAdapter {
50
+ readonly id: string;
51
+ dispatch(instruction: BoundaryInstruction): Promise<BoundaryObservation | undefined>;
52
+ observe(instruction: BoundaryInstruction): Promise<BoundaryObservation | undefined>;
53
+ }
5
54
  export interface ProviderAdapterVocabulary {
6
55
  readonly capability: string;
7
56
  readonly domain: string;
@@ -20,20 +69,10 @@ export interface ProviderAdapter<Vocabulary extends ProviderAdapterVocabulary =
20
69
  readonly domain?: Vocabulary["domain"];
21
70
  readonly egress: ProviderEgressMode;
22
71
  readonly operationMap: Partial<Record<Vocabulary["operation"], ProviderOperationBinding<Vocabulary>>>;
23
- readonly profile?: PartnerBankAdapterProfile;
24
72
  readonly provider: string;
25
73
  readonly webhookMap: Readonly<Record<string, ProviderWebhookTransitionPlan<Vocabulary>>>;
26
74
  }
27
75
  export interface ProviderOperationBinding<Vocabulary extends ProviderAdapterVocabulary = ProviderAdapterVocabulary> {
28
- /**
29
- * Authoritative read-after-write status enquiry for a command whose response
30
- * may have been lost. Presence is an explicit provider-readiness commitment;
31
- * runtimes must never infer enquiry support from the command URL.
32
- */
33
- readonly statusEnquiry?: {
34
- readonly keys: StatusEnquiryKey;
35
- readonly pathTemplate: string;
36
- };
37
76
  /**
38
77
  * How THIS operation's response carries its outcome. Per operation, never
39
78
  * per provider and never inherited from another provider's class: one real
@@ -49,6 +88,14 @@ export interface ProviderOperationBinding<Vocabulary extends ProviderAdapterVoca
49
88
  readonly obligationKind: Vocabulary["obligation"];
50
89
  readonly resourceIdPath: string;
51
90
  readonly resourceKind: Vocabulary["resource"];
91
+ /**
92
+ * Stored object metadata fields required by this operation. An array of UDL
93
+ * object fields validated against the exported UDL schema and the closed
94
+ * subject field type vocabulary. Absence means requirements are undeclared;
95
+ * an explicit empty array declares no requirements. Neither implies
96
+ * provider readiness.
97
+ */
98
+ readonly subjectRequirements?: readonly UdlObjectField[];
52
99
  }
53
100
  export interface ProviderWebhookTransitionPlan<Vocabulary extends ProviderAdapterVocabulary = ProviderAdapterVocabulary> {
54
101
  readonly eventKind: string;
@@ -72,148 +119,13 @@ export interface ProviderConfig {
72
119
  readonly baseUrl?: string;
73
120
  readonly credentialRef?: ProviderCredentialReference;
74
121
  }
75
- /**
76
- * The fetch window facts for one declared statement format. The paging fields
77
- * are required for an end-of-day format (`availability: "T-1"` pages over
78
- * history) and absent for an intraday one; conformance enforces that split.
79
- */
80
- export interface PartnerBankStatementWindow {
81
- readonly availability: StatementAvailability;
82
- readonly lookbackDays?: number;
83
- readonly statementDaysPerRequest?: number;
84
- }
85
- export interface PartnerBankAdapterProfile {
86
- readonly auth: {
87
- readonly envelope: ProviderAuthEnvelope;
88
- readonly signing: PartnerBankSigning;
89
- };
90
- /**
91
- * How the bank bills its own charges. `posting` says when the charge lands
92
- * (debited separately after the payment, or netted out of the instructed
93
- * amount); `vat` says whether the tax arrives as its own ledger line or
94
- * folded into the charge. Absent when a bank's charge behavior is not
95
- * established -- an unmodeled dimension, not a claim of post-hoc billing.
96
- */
97
- readonly charges?: {
98
- /**
99
- * The text this bank prints on its own charge lines, as prefixes: the
100
- * trailing part names the charged thing. Recognizing a charge is Executor
101
- * knowledge, so it is declared per bank and never inferred downstream, and
102
- * a bank whose charge wording is not established leaves this absent rather
103
- * than borrowing another bank's words.
104
- */
105
- readonly narratives?: {
106
- readonly charge: readonly string[];
107
- readonly vat: readonly string[];
108
- };
109
- readonly posting: ChargePosting;
110
- readonly vat: ChargeVatMode;
111
- };
112
- readonly executedReadBack: {
113
- readonly fxRate: FxRateReadBack;
114
- readonly railSubstitution: RailSubstitution;
115
- };
116
- readonly idempotencySpine: {
117
- readonly dedupeKeys: readonly PartnerBankDedupeKey[];
118
- readonly endToEndId: {
119
- readonly maxLength: number;
120
- };
121
- readonly instructionId: {
122
- readonly maxLength: number;
123
- };
124
- readonly paymentReference: {
125
- readonly maxLength: number;
126
- };
127
- };
128
- readonly kind: "partner_bank";
129
- readonly lifecycleVocabulary: Readonly<Record<string, PartnerBankLifecycleState>>;
130
- readonly limitFacts: {
131
- readonly access: LimitAccessMode;
132
- readonly dimensions: readonly LimitDimension[];
133
- };
134
- readonly notificationMechanisms: readonly ProviderNotificationMechanism[];
135
- /**
136
- * Which reference on a statement debit line names the instruction behind it.
137
- * A statement entry carries two: the bank's own entry reference and the
138
- * client reference the instruction was sent with. Banks disagree about which
139
- * one comes back on the statement, and picking the wrong one makes every
140
- * payout the platform instructed look like an unexplained debit. Absent when
141
- * a bank's statement reference identity is not established.
142
- */
143
- readonly statementDebitReference?: StatementDebitReference;
144
- readonly statementFormats: readonly PartnerBankStatementFormat[];
145
- readonly financialAddressProvisioning: {
146
- readonly mechanism: FinancialAddressMechanism;
147
- readonly pricing: FinancialAddressPricing;
148
- readonly quota: FinancialAddressQuota;
149
- };
150
- readonly windows: {
151
- readonly paymentCutoff: {
152
- readonly afterCutoffValueDate: ValueDateOffset;
153
- readonly beforeCutoffValueDate: ValueDateOffset;
154
- /** Bank-local wall-clock time, HH:MM. */
155
- readonly time: string;
156
- /** The IANA time zone the cutoff time is read in (e.g. Europe/Dublin). */
157
- readonly timeZone: string;
158
- };
159
- /** One window per declared statement format, keyed by that format. */
160
- readonly statements: Partial<Readonly<Record<PartnerBankStatementFormat, PartnerBankStatementWindow>>>;
161
- readonly valueDateMaxDaysAhead: number;
162
- };
163
- readonly wireCodec: PartnerBankWireCodec;
164
- }
165
- /**
166
- * The insurance-distribution marketplace class, the partner bank's opposite
167
- * number: an aggregator API whose whole truth arrives in the command
168
- * response. Every field below is a recorded observation of one such surface,
169
- * not a reading of a standard.
170
- *
171
- * What makes the class distinct from `partner_bank`, and why each field exists:
172
- *
173
- * - **Nothing to poll.** No status enquiry, no list, no read-back, no
174
- * webhook, on any line. `notificationMechanisms` is empty by evidence, and
175
- * the issuance response is the ONLY carrier of the policy identity -- so
176
- * the transport must capture it durably BEFORE acknowledging the caller.
177
- * - **No idempotency header exists anywhere in the corpus.** Dedupe runs on
178
- * caller-minted business reference numbers replayed verbatim at each step,
179
- * which is why the spine is a reference chain rather than a key.
180
- * - **Auth is a bespoke credential exchange**, not OAuth2 client
181
- * credentials: username/password against the provider's own login route
182
- * yields a bearer with no documented lifetime, refresh, or scope.
183
- * - **Errors are prose.** No machine error code appears anywhere, so an
184
- * adapter cannot build a decline taxonomy from the docs alone.
185
- */
186
- export interface InsuranceDistributorAdapterProfile {
187
- readonly kind: "insurance_distributor";
188
- readonly wireCodec: "rest_json";
189
- readonly auth: {
190
- readonly envelope: ProviderAuthEnvelope;
191
- /** How the bearer is obtained, when the provider documents it at all. */
192
- readonly acquisition: "password_login" | "out_of_band";
193
- readonly signing: "none";
194
- };
195
- /**
196
- * Envelope class per DOCUMENTED operation name, because one provider answers
197
- * in more than one shape. Keys are the provider's own operation names, not
198
- * platform operations -- this profile describes a surface no adapter has
199
- * integrated yet.
200
- */
201
- readonly envelopes: Readonly<Record<string, ProviderResponseEnvelope>>;
202
- /**
203
- * The correlation chain that stands in for an idempotency key: which
204
- * references the CALLER mints and which the provider mints, in the order the
205
- * exchange replays them.
206
- */
207
- readonly referenceChain: {
208
- readonly clientMinted: readonly string[];
209
- readonly providerMinted: readonly string[];
210
- };
211
- readonly notificationMechanisms: readonly ProviderNotificationMechanism[];
212
- /** Whether the provider publishes machine-readable failure codes. */
213
- readonly errorModel: "prose_only" | "coded";
214
- /** True when the command response is the only carrier of the created fact. */
215
- readonly captureBeforeAcknowledge: boolean;
216
- }
217
122
  /** Bind a product vocabulary once, then retain literal adapter registry types. */
218
123
  export declare function createProviderAdapterRegistry<Vocabulary extends ProviderAdapterVocabulary>(): <const Adapters extends readonly ProviderAdapter<Vocabulary>[]>(adapters: Adapters) => Adapters;
124
+ export type AdapterConformanceCode = "operation_map_empty" | "resource_binding_missing" | "declaration_invalid";
125
+ export interface AdapterConformanceFinding {
126
+ readonly code: AdapterConformanceCode;
127
+ readonly message: string;
128
+ readonly path: string;
129
+ }
130
+ export declare function adapterConformanceFindings<Vocabulary extends ProviderAdapterVocabulary>(adapter: ProviderAdapter<Vocabulary>): readonly AdapterConformanceFinding[];
219
131
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,45 @@
1
- import { providerKeyPattern, statementAvailabilities, } from "./vocabulary.js";
2
- export { certifyPartnerBankAdapter, partnerBankConformanceCodes, partnerBankConformanceFindings, } from "./conformance.js";
3
- export { statementAvailabilities };
1
+ import * as z from "zod";
2
+ import { udlObjectFieldSchema } from "@hyperscale0/udl";
3
+ import { providerKeyPattern, subjectFieldTypes, } from "./vocabulary.js";
4
+ export { subjectFieldTypes };
5
+ const boundaryId = z.string().min(1).max(240);
6
+ export const boundaryOutcomeSchema = z.enum([
7
+ "acknowledged",
8
+ "unknown",
9
+ "confirmed",
10
+ "rejected",
11
+ ]);
12
+ export const boundaryInstructionSchema = z
13
+ .strictObject({
14
+ id: boundaryId,
15
+ environment: z.enum(["sandbox", "live"]),
16
+ tenantId: boundaryId,
17
+ productId: boundaryId,
18
+ productBuildId: boundaryId,
19
+ buildDigest: boundaryId,
20
+ target: z
21
+ .strictObject({
22
+ kind: boundaryId,
23
+ attachment: boundaryId,
24
+ instanceId: boundaryId,
25
+ })
26
+ .readonly(),
27
+ sourceAccountId: boundaryId,
28
+ destinationAccountId: boundaryId,
29
+ amount: z.string().regex(/^[1-9][0-9]{0,17}$/),
30
+ currency: z.string().regex(/^[A-Z]{3}$/),
31
+ adapter: z.string().regex(providerKeyPattern),
32
+ })
33
+ .readonly();
34
+ export const boundaryObservationSchema = z
35
+ .strictObject({
36
+ adapter: z.string().regex(providerKeyPattern),
37
+ externalReference: boundaryId,
38
+ instructionId: boundaryId,
39
+ outcome: boundaryOutcomeSchema,
40
+ observedAt: z.iso.datetime(),
41
+ })
42
+ .readonly();
4
43
  /** Validate an adapter registry once at load, then preserve its exact type. */
5
44
  function defineProviderAdapters(adapters) {
6
45
  const identities = new Set();
@@ -16,9 +55,6 @@ function defineProviderAdapters(adapters) {
16
55
  validateConfig(adapter.provider, adapter.config);
17
56
  validateOperations(adapter);
18
57
  validateWebhooks(adapter);
19
- if (adapter.profile) {
20
- validatePartnerBankProfile(adapter.provider, adapter.profile);
21
- }
22
58
  }
23
59
  return adapters;
24
60
  }
@@ -51,13 +87,19 @@ function validateOperations(adapter) {
51
87
  throw new Error(`${adapter.provider} operationMap key ${operation} must match operation ${binding.operation}`);
52
88
  }
53
89
  assertNonblank(adapter.provider, `${operation}.resourceIdPath`, binding.resourceIdPath);
54
- if (binding.statusEnquiry) {
55
- assertNonblank(adapter.provider, `${operation}.statusEnquiry.pathTemplate`, binding.statusEnquiry.pathTemplate);
56
- const placeholder = binding.statusEnquiry.keys === "instruction_id"
57
- ? "{instructionId}"
58
- : "{providerReference}";
59
- if (!binding.statusEnquiry.pathTemplate.includes(placeholder)) {
60
- throw new Error(`${adapter.provider} ${operation}.statusEnquiry.pathTemplate must include ${placeholder}`);
90
+ if (binding.subjectRequirements !== undefined) {
91
+ if (!Array.isArray(binding.subjectRequirements) ||
92
+ binding.subjectRequirements.length > 128) {
93
+ throw new Error(`${adapter.provider} ${operation}.subjectRequirements must be an array of at most 128 fields`);
94
+ }
95
+ for (const [index, requirement,] of binding.subjectRequirements.entries()) {
96
+ const result = udlObjectFieldSchema.safeParse(requirement);
97
+ if (!result.success || result.data.optional) {
98
+ throw new Error(`${adapter.provider} ${operation}.subjectRequirements[${index}] does not match UDL object field schema: ${result.success ? "action requirements cannot be optional" : result.error.message}`);
99
+ }
100
+ if (!subjectFieldTypes.includes(requirement.type)) {
101
+ throw new Error(`${adapter.provider} ${operation}.subjectRequirements[${index}] unknown subject field type ${requirement.type}`);
102
+ }
61
103
  }
62
104
  }
63
105
  }
@@ -69,76 +111,57 @@ function validateWebhooks(adapter) {
69
111
  }
70
112
  }
71
113
  }
72
- function validatePartnerBankProfile(provider, profile) {
73
- if (!profile.notificationMechanisms.includes("poll")) {
74
- throw new Error(`${provider} partner-bank profile must support polling`);
75
- }
76
- if (Object.keys(profile.lifecycleVocabulary).length === 0) {
77
- throw new Error(`${provider} partner-bank profile has no lifecycle vocabulary`);
78
- }
79
- assertUnique(provider, "statementFormats", profile.statementFormats);
80
- assertUnique(provider, "notificationMechanisms", profile.notificationMechanisms);
81
- assertUnique(provider, "limitFacts.dimensions", profile.limitFacts.dimensions);
82
- const spine = profile.idempotencySpine;
83
- // The dedupe keys widened from a fixed triple to a list, so the list now
84
- // carries the guarantees the tuple used to give for free.
85
- if (spine.dedupeKeys.length === 0) {
86
- throw new Error(`${provider} idempotencySpine.dedupeKeys is empty`);
87
- }
88
- assertUnique(provider, "idempotencySpine.dedupeKeys", spine.dedupeKeys);
89
- const spineLimits = {
90
- endToEndId: spine.endToEndId,
91
- instructionId: spine.instructionId,
92
- paymentReference: spine.paymentReference,
93
- };
94
- for (const [field, limit] of Object.entries(spineLimits)) {
95
- assertPositiveInteger(provider, `idempotencySpine.${field}.maxLength`, limit.maxLength);
96
- }
97
- const windows = profile.windows;
98
- if (!/^\d{2}:\d{2}$/.test(windows.paymentCutoff.time)) {
99
- throw new Error(`${provider} windows.paymentCutoff.time must be HH:MM`);
100
- }
101
- // Intl.DateTimeFormat treats an undefined timeZone as the runtime default,
102
- // so presence must be checked before validity.
103
- const timeZone = windows.paymentCutoff.timeZone;
104
- if (typeof timeZone !== "string") {
105
- throw new Error(`${provider} windows.paymentCutoff.timeZone must be a valid IANA time zone`);
114
+ function assertNonblank(provider, field, value) {
115
+ if (value.trim().length === 0) {
116
+ throw new Error(`${provider} ${field} must not be blank`);
106
117
  }
118
+ }
119
+ export function adapterConformanceFindings(adapter) {
120
+ const findings = bindingFindings(adapter);
121
+ if (Object.keys(adapter.operationMap).length === 0)
122
+ findings.unshift({
123
+ code: "operation_map_empty",
124
+ path: "operationMap",
125
+ message: "An adapter must declare an operation.",
126
+ });
107
127
  try {
108
- new Intl.DateTimeFormat("en", { timeZone });
128
+ createProviderAdapterRegistry()([adapter]);
109
129
  }
110
- catch {
111
- throw new Error(`${provider} windows.paymentCutoff.timeZone must be a valid IANA time zone`);
112
- }
113
- assertPositiveInteger(provider, "windows.valueDateMaxDaysAhead", windows.valueDateMaxDaysAhead);
114
- for (const [format, window] of Object.entries(windows.statements)) {
115
- // TS requires availability, but a plain-JS consumer can send a window
116
- // without one, and an availability-less window is unschedulable.
117
- if (!statementAvailabilities.includes(window.availability)) {
118
- throw new Error(`${provider} windows.statements.${format}.availability must be one ` +
119
- `of ${statementAvailabilities.join(", ")}`);
120
- }
121
- if (window.lookbackDays !== undefined) {
122
- assertPositiveInteger(provider, `windows.statements.${format}.lookbackDays`, window.lookbackDays);
123
- }
124
- if (window.statementDaysPerRequest !== undefined) {
125
- assertPositiveInteger(provider, `windows.statements.${format}.statementDaysPerRequest`, window.statementDaysPerRequest);
126
- }
127
- }
128
- }
129
- function assertPositiveInteger(provider, field, value) {
130
- if (!Number.isInteger(value) || value <= 0) {
131
- throw new Error(`${provider} ${field} must be a positive integer`);
130
+ catch (error) {
131
+ findings.push({
132
+ code: "declaration_invalid",
133
+ path: "",
134
+ message: error instanceof Error ? error.message : String(error),
135
+ });
132
136
  }
137
+ return findings;
133
138
  }
134
- function assertUnique(provider, field, values) {
135
- if (new Set(values).size !== values.length) {
136
- throw new Error(`${provider} ${field} contains duplicates`);
139
+ function bindingFindings(adapter) {
140
+ const findings = [];
141
+ const bindings = adapter.bindings;
142
+ const claimed = new Set();
143
+ const require = (kind, path) => {
144
+ if (bindings[kind] !== undefined || claimed.has(kind))
145
+ return;
146
+ claimed.add(kind);
147
+ // Provider facts commit onto platform resources through a declared match
148
+ // mode; a resource the adapter settles without one has no lawful way to
149
+ // bind the observation.
150
+ findings.push({
151
+ code: "resource_binding_missing",
152
+ message: `resource kind ${kind} is settled by this adapter but declares no ` +
153
+ "binding mode, so provider facts have no lawful way to commit",
154
+ path,
155
+ });
156
+ };
157
+ for (const binding of Object.values(adapter.operationMap)) {
158
+ if (!binding)
159
+ continue;
160
+ require(binding.resourceKind, `bindings.${binding.resourceKind}`);
137
161
  }
138
- }
139
- function assertNonblank(provider, field, value) {
140
- if (value.trim().length === 0) {
141
- throw new Error(`${provider} ${field} must not be blank`);
162
+ for (const plan of Object.values(adapter.webhookMap)) {
163
+ require(plan.resourceKind, `bindings.${plan.resourceKind}`);
142
164
  }
165
+ return findings;
143
166
  }
144
167
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAuB,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAOlB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAS7B,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC;IAC1C,cAAc;IACd,SAAS;IACT,WAAW;IACX,UAAU;CACX,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,YAAY,CAAC;IACZ,EAAE,EAAE,UAAU;IACd,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,UAAU;IACrB,cAAc,EAAE,UAAU;IAC1B,WAAW,EAAE,UAAU;IACvB,MAAM,EAAE,CAAC;SACN,YAAY,CAAC;QACZ,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,UAAU;QACtB,UAAU,EAAE,UAAU;KACvB,CAAC;SACD,QAAQ,EAAE;IACb,eAAe,EAAE,UAAU;IAC3B,oBAAoB,EAAE,UAAU;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC;IAC9C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;CAC9C,CAAC;KACD,QAAQ,EAAE,CAAC;AACd,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,YAAY,CAAC;IACZ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;IAC7C,iBAAiB,EAAE,UAAU;IAC7B,aAAa,EAAE,UAAU;IACzB,OAAO,EAAE,qBAAqB;IAC9B,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;CAC7B,CAAC;KACD,QAAQ,EAAE,CAAC;AAwGd,+EAA+E;AAC/E,SAAS,sBAAsB,CAG7B,QAAkB;IAClB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7D,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzB,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5B,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,6BAA6B;IAK3C,OAAO,CAAC,QAAQ,EAAE,EAAE,CAClB,sBAAsB,CAA8B,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,MAAsB;IAC9D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,yCAAyC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC;IACxC,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACxC,cAAc,CAAC,QAAQ,EAAE,2BAA2B,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IACD,cAAc,CAAC,QAAQ,EAAE,8BAA8B,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC7E,cAAc,CAAC,QAAQ,EAAE,8BAA8B,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAoC;IAEpC,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAGnE,EAAE,CAAC;QACJ,IAAI,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,QAAQ,qBAAqB,SAAS,yBAAyB,OAAO,CAAC,SAAS,EAAE,CAC9F,CAAC;QACJ,CAAC;QACD,cAAc,CACZ,OAAO,CAAC,QAAQ,EAChB,GAAG,SAAS,iBAAiB,EAC7B,OAAO,CAAC,cAAc,CACvB,CAAC;QACF,IAAI,OAAO,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;YAC9C,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;gBAC3C,OAAO,CAAC,mBAAmB,CAAC,MAAM,GAAG,GAAG,EACxC,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,6DAA6D,CAC9F,CAAC;YACJ,CAAC;YACD,KAAK,MAAM,CACT,KAAK,EACL,WAAW,EACZ,IAAI,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC5C,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,wBAAwB,KAAK,6CAA6C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAC7L,CAAC;gBACJ,CAAC;gBACD,IACE,CAAC,iBAAiB,CAAC,QAAQ,CACzB,WAAW,CAAC,IAA0C,CACvD,EACD,CAAC;oBACD,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,wBAAwB,KAAK,gCAAgC,WAAW,CAAC,IAAI,EAAE,CAChH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAoC;IAEpC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,QAAQ,mBAAmB,KAAK,yBAAyB,IAAI,CAAC,SAAS,EAAE,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,KAAa,EAAE,KAAa;IACpE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,IAAI,KAAK,oBAAoB,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAYD,MAAM,UAAU,0BAA0B,CAExC,OAAoC;IACpC,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC;QAChD,QAAQ,CAAC,OAAO,CAAC;YACf,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,uCAAuC;SACjD,CAAC,CAAC;IACL,IAAI,CAAC;QACH,6BAA6B,EAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CACtB,OAAoC;IAEpC,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAExB,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE;QAC7C,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QAC9D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,yEAAyE;QACzE,wEAAwE;QACxE,wBAAwB;QACxB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,0BAA0B;YAChC,OAAO,EACL,iBAAiB,IAAI,8CAA8C;gBACnE,8DAA8D;YAChE,IAAI;SACL,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAGrD,EAAE,CAAC;QACJ,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}