@adminiumjs/add-on-contracts 0.2.5 → 0.2.6

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,228 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ /**
3
+ * `document-render@1` (34-invoices-add-on.md §4, Appendices A and B) — the
4
+ * fourth contract, and the first one Adminium ITSELF consumes.
5
+ *
6
+ * It provides KINDS OF DOCUMENT an add-on can describe — an outline of slots,
7
+ * every label written in all eight compiled locales — and render to BYTES. The
8
+ * consumer is the engine document pipeline (profiles, the record trigger, the
9
+ * `document.render` job, the `/documents` routes), which is the first
10
+ * production read of `runtime.providers`: a provider is selected by the
11
+ * profile's add-on key, never by `resolveProvider`'s lowest-key choice.
12
+ *
13
+ * ── THE SUBJECT IS THE ONLY DOOR (31 A.1's rule, applied to a contract) ─────
14
+ *
15
+ * A provider receives VALUES and returns BYTES. It gets no database handle, no
16
+ * network, and — the one that gets forgotten — no clock: `subject.now` is the
17
+ * only time it may read, which is what makes 25 D12's byte-identical claim
18
+ * testable rather than aspirational. `describeDocumentRenderer` renders twice
19
+ * and compares every byte.
20
+ *
21
+ * ── BYTES, NOT A `FileRef` ─────────────────────────────────────────────────
22
+ *
23
+ * {@link RenderedDocument.bytes} is a `Uint8Array`. `FileRef.bytes`
24
+ * (`common.ts:14,22`) is a COUNT, and a provider that returned one would be
25
+ * claiming it had already stored the file — which it cannot do, having no file
26
+ * seam. The engine stores what comes back; the provider never does.
27
+ *
28
+ * ── PER-KIND `formats` AND `coverage`, AND WHY THEY ARE ON THE KIND ────────
29
+ *
30
+ * "HTML always, PDF always" is NOT this contract's law. `label-sheet` is
31
+ * `['pdf']` with nothing to say in HTML; `receipt` draws on 80 mm paper no A4
32
+ * consumer wants. And a writer that draws Helvetica's WinAnsi repertoire
33
+ * cannot draw Arabic or Han — so a kind declares the glyphs it covers and
34
+ * REFUSES what it cannot draw, typed, as {@link DocumentError} `LATIN_ONLY`
35
+ * carrying the offending glyphs. A silent drop would ship an invoice with a
36
+ * customer's name missing letters (34 D6, O11, O12).
37
+ *
38
+ * ── THE `body` CHANNEL IS A ONE-WAY DOOR, AND IT IS OPEN ───────────────────
39
+ *
40
+ * §4.3 ships this module verbatim into eighteen repos before the first
41
+ * provider exists, so a field added later is a second eighteen-repo ceremony
42
+ * plus a second contract release. {@link RenderInput.body} is therefore here in
43
+ * the first release. Its shape is O28(a2) — ruled 2026-09-07 as **D54**: an
44
+ * opaque `Readonly<Record<string, unknown>>` whose schema the PROVIDER owns. A
45
+ * typed union would have frozen the redesigned comp's 27 block kinds
46
+ * (`Invoice Builder.dc.html` blockOrder:1114, custom:1266-1272) into a
47
+ * contract eighteen repos vendor, making every later block a contract release.
48
+ *
49
+ * A starter is a TEMPLATE PRESET, not a kind (O28(b), D54) — which is why
50
+ * `kinds()` stays at three for the invoices provider while the surface offers
51
+ * twelve starters over eight titles.
52
+ */
53
+ import { z } from 'zod';
54
+ /**
55
+ * The eight compiled locales, HYPHENATED — the spelling the add-ons repo
56
+ * already writes (`barcode-labels/src/i18n/strings.ts`, and the `LOCALES`
57
+ * array repeated in `host/src/app-neutral.test.ts:435`).
58
+ *
59
+ * **[DEP-33 — a departure from Appendix B, forced and minimal.]** Appendix B
60
+ * names this type `BuiltinLocaleId`. `@adminium/i18n` ALREADY exports a
61
+ * `BuiltinLocaleId` (`locales.ts:82`) and its members are the UNDERSCORE
62
+ * spellings — `en_US`, `ar_EG`. Two same-named unions with different members
63
+ * is not a nuisance, it is a data bug waiting in `apps/server`, which will
64
+ * import both the moment 34b wires the pipeline: `'en-US'` assigned where
65
+ * `'en_US'` is meant fails no compile and produces a missing translation at
66
+ * run time. So the contract's type is named for the contract. The MEMBERS are
67
+ * Appendix B's, unchanged.
68
+ */
69
+ export const DOCUMENT_LOCALE_IDS = [
70
+ 'ar-EG',
71
+ 'cs-CZ',
72
+ 'da-DK',
73
+ 'de-DE',
74
+ 'en-US',
75
+ 'fr-FR',
76
+ 'zh-CN',
77
+ 'zh-TW',
78
+ ];
79
+ export const localizedTextSchema = z
80
+ .object(Object.fromEntries(DOCUMENT_LOCALE_IDS.map((id) => [id, z.string().min(1)])))
81
+ .strict();
82
+ /** What a kind may be rendered to. */
83
+ export const DOCUMENT_FORMATS = ['html', 'pdf'];
84
+ /** The paper a kind is drawn for. `receipt-80mm` is a till roll, not a sheet. */
85
+ export const DOCUMENT_PAPERS = ['a4', 'letter', 'receipt-80mm'];
86
+ /**
87
+ * Which glyphs the kind's PDF writer can draw.
88
+ *
89
+ * `ascii` — 0x20..0x7E only (barcode-labels' scaffold: every byte is ASCII, so
90
+ * `String.length` is the byte length and the xref offsets are exact).
91
+ * `winansi` — the 224 drawable code points of WinAnsiEncoding, which is base-14
92
+ * Helvetica's repertoire: Latin-1 plus €, the smart quotes and the dashes.
93
+ * `all` — no refusal is possible; nothing claims it yet.
94
+ */
95
+ export const DOCUMENT_COVERAGES = ['ascii', 'winansi', 'all'];
96
+ export const documentKindSchema = z
97
+ .object({
98
+ id: z.string().regex(/^[a-z][a-z0-9-]*$/, 'kind id must be kebab-case'),
99
+ label: localizedTextSchema,
100
+ formats: z.array(z.enum(DOCUMENT_FORMATS)).min(1),
101
+ paper: z.array(z.enum(DOCUMENT_PAPERS)).min(1),
102
+ coverage: z.enum(DOCUMENT_COVERAGES),
103
+ })
104
+ .strict();
105
+ /** The value types a slot can carry. `money` is integer minor units; `percent` is basis points. */
106
+ export const OUTLINE_SLOT_TYPES = [
107
+ 'text',
108
+ 'text[]',
109
+ 'date',
110
+ 'email',
111
+ 'money',
112
+ 'percent',
113
+ 'currency',
114
+ 'number',
115
+ 'collection',
116
+ ];
117
+ /**
118
+ * Where an unmapped slot's value comes from, if anywhere.
119
+ *
120
+ * `sequence` — the engine's CAS document number, minted after render (34 D11).
121
+ * `connection` — the connection's currency.
122
+ * `setting` — one of the add-on's own non-secret settings.
123
+ * `now` — `subject.now.iso`, never the provider's own clock.
124
+ */
125
+ export const OUTLINE_SLOT_DEFAULTS = ['sequence', 'connection', 'setting', 'now'];
126
+ const outlineSlotShape = {
127
+ id: z.string().regex(/^[A-Za-z][A-Za-z0-9_]*$/, 'slot id must be an identifier'),
128
+ label: localizedTextSchema,
129
+ help: localizedTextSchema.optional(),
130
+ type: z.enum(OUTLINE_SLOT_TYPES),
131
+ required: z.boolean(),
132
+ default: z.enum(OUTLINE_SLOT_DEFAULTS).optional(),
133
+ };
134
+ /** One column of a `collection`. A column is never itself a collection. */
135
+ export const outlineLeafSlotSchema = z.object(outlineSlotShape).strict();
136
+ /**
137
+ * The depth limit is in the SCHEMA, not in a comment.
138
+ *
139
+ * `OutlineSlot.columns` is typed `readonly OutlineSlot[]` (Appendix B), which
140
+ * would admit a collection of collections; nothing maps one, no renderer draws
141
+ * one, and the Studio mapping editor has no row for one. So the validator
142
+ * accepts exactly two levels and refuses the third — a provider that returns a
143
+ * nested collection fails `describeDocumentRenderer` with a parse error naming
144
+ * the slot, rather than passing here and rendering an empty table later.
145
+ */
146
+ export const outlineSlotSchema = z
147
+ .object({ ...outlineSlotShape, columns: z.array(outlineLeafSlotSchema).optional() })
148
+ .strict();
149
+ export const documentOutlineSchema = z
150
+ .object({ slots: z.array(outlineSlotSchema) })
151
+ .strict();
152
+ export const publicDocumentRequestSchema = z
153
+ .object({
154
+ kind: z.string().min(1),
155
+ locale: z.string().min(2).optional(),
156
+ fields: z.record(z.string(), z.unknown()),
157
+ collections: z.record(z.string(), z.array(z.record(z.string(), z.unknown()))),
158
+ // Loose on purpose, the way `emailTestSendBody` is
159
+ // (`apps/server/src/routes/email-templates/schema.ts:160-165`): the SMTP
160
+ // relay is the real authority on what it will accept, and this address is
161
+ // stored for a person to review before anything is sent.
162
+ customerEmail: z.string().trim().min(3).max(320).optional(),
163
+ })
164
+ .strict();
165
+ export const documentSubjectSchema = z
166
+ .object({
167
+ now: z.object({ iso: z.string().min(1), timezone: z.string().min(1) }).strict(),
168
+ locale: z.string().min(2),
169
+ currency: z.string().length(3),
170
+ business: z
171
+ .object({
172
+ name: z.string().min(1),
173
+ lines: z.array(z.string()),
174
+ logoDataUrl: z.string().optional(),
175
+ })
176
+ .strict(),
177
+ entity: z
178
+ .object({
179
+ connectionId: z.string(),
180
+ table: z.string(),
181
+ pk: z.record(z.string(), z.unknown()),
182
+ label: z.string(),
183
+ })
184
+ .strict()
185
+ .nullable(),
186
+ number: z.string().nullable(),
187
+ fields: z.record(z.string(), z.unknown()),
188
+ collections: z.record(z.string(), z.array(z.record(z.string(), z.unknown()))),
189
+ })
190
+ .strict();
191
+ export const renderedDocumentSchema = z
192
+ .object({
193
+ format: z.enum(DOCUMENT_FORMATS),
194
+ filename: z.string().min(1),
195
+ mediaType: z.string().min(1),
196
+ bytes: z.instanceof(Uint8Array),
197
+ locale: z.string().min(2),
198
+ warnings: z.array(z.string()),
199
+ })
200
+ .strict();
201
+ /**
202
+ * A refusal is DATA, returned — never thrown, and never a silent partial
203
+ * result. `shipping-carrier`'s `CarrierError` is a class because a carrier's
204
+ * own words have to reach the screen verbatim; here every refusal is one of
205
+ * four things the engine can act on, so a union of codes is the honest shape.
206
+ */
207
+ export const DOCUMENT_ERROR_CODES = [
208
+ /** A glyph the kind's writer cannot draw. `dropped` names them. */
209
+ 'LATIN_ONLY',
210
+ /** `render`/`describe` was called with a kind `kinds()` does not list. */
211
+ 'UNSUPPORTED_KIND',
212
+ /** A slot the outline marks `required` had no value. */
213
+ 'MISSING_SLOT',
214
+ /** The subject did not parse — a wrong type, a malformed body. */
215
+ 'INVALID_SUBJECT',
216
+ ];
217
+ export const documentErrorSchema = z
218
+ .object({
219
+ code: z.enum(DOCUMENT_ERROR_CODES),
220
+ detail: z.string().optional(),
221
+ dropped: z.array(z.string()).optional(),
222
+ })
223
+ .strict();
224
+ /** Narrows `render`'s union without a `code in x` incantation at every call site. */
225
+ export function isDocumentError(value) {
226
+ return !Array.isArray(value);
227
+ }
228
+ //# sourceMappingURL=document-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-render.js","sourceRoot":"","sources":["../src/document-render.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -14,5 +14,6 @@ export { CONTRACT_REGISTRY, CONTRACT_IDS, contractIdSchema, isContractId, hasCon
14
14
  export { ADD_ON_CATEGORIES, ADD_ON_ISSUE_CODES, CONNECT_KINDS, addOnBlockSchema, addOnCategorySchema, addOnConnectSchema, addOnEventSchema, addOnNetworkSchema, attachTargetSchema, connectKindSchema, consumesSchema, providesSchema, slotFillSchema, type AddOnBlock, type AddOnCategory, type AddOnIssueCode, type ConnectKind, } from './add-on-block.js';
15
15
  export { artworkRefSchema, jobSpecSchema, type ArtworkRef, type ArtworkSource, type AvailabilityVerdict, type JobSpec, } from './artwork-source.js';
16
16
  export { CarrierError, addressSchema, parcelSchema, rateSchema, shipmentSchema, trackEventSchema, type Address, type OrderRef, type Parcel, type Rate, type Shipment, type ShippingCarrier, type TrackEvent, } from './shipping-carrier.js';
17
+ export { DOCUMENT_COVERAGES, DOCUMENT_ERROR_CODES, DOCUMENT_FORMATS, DOCUMENT_LOCALE_IDS, DOCUMENT_PAPERS, OUTLINE_SLOT_DEFAULTS, OUTLINE_SLOT_TYPES, documentErrorSchema, documentKindSchema, documentOutlineSchema, documentSubjectSchema, isDocumentError, localizedTextSchema, outlineSlotSchema, publicDocumentRequestSchema, renderedDocumentSchema, type DocumentCoverage, type DocumentError, type DocumentErrorCode, type DocumentFormat, type DocumentKind, type DocumentLocaleId, type DocumentOutline, type DocumentPaper, type DocumentRenderer, type DocumentSubject, type LocalizedText, type OutlineSlot, type OutlineSlotDefault, type OutlineSlotType, type PublicDocumentRequest, type RecordRef, type RenderInput, type RenderedDocument, } from './document-render.js';
17
18
  export { personalizationSchema, templateSchema, zoneSchema, type Personalization, type PreviewRef, type ProductPersonalizer, type ProductRef, type Template, type Verdict, type Zone, type ZoneFinish, type ZoneKind, } from './product-personalizer.js';
18
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,+BAA+B,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,OAAO,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,QAAQ,GACd,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,+BAA+B,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,EACd,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,OAAO,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,2BAA2B,EAC3B,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,QAAQ,GACd,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -15,5 +15,6 @@ export { CONTRACT_REGISTRY, CONTRACT_IDS, contractIdSchema, isContractId, hasCon
15
15
  export { ADD_ON_CATEGORIES, ADD_ON_ISSUE_CODES, CONNECT_KINDS, addOnBlockSchema, addOnCategorySchema, addOnConnectSchema, addOnEventSchema, addOnNetworkSchema, attachTargetSchema, connectKindSchema, consumesSchema, providesSchema, slotFillSchema, } from './add-on-block.js';
16
16
  export { artworkRefSchema, jobSpecSchema, } from './artwork-source.js';
17
17
  export { CarrierError, addressSchema, parcelSchema, rateSchema, shipmentSchema, trackEventSchema, } from './shipping-carrier.js';
18
+ export { DOCUMENT_COVERAGES, DOCUMENT_ERROR_CODES, DOCUMENT_FORMATS, DOCUMENT_LOCALE_IDS, DOCUMENT_PAPERS, OUTLINE_SLOT_DEFAULTS, OUTLINE_SLOT_TYPES, documentErrorSchema, documentKindSchema, documentOutlineSchema, documentSubjectSchema, isDocumentError, localizedTextSchema, outlineSlotSchema, publicDocumentRequestSchema, renderedDocumentSchema, } from './document-render.js';
18
19
  export { personalizationSchema, templateSchema, zoneSchema, } from './product-personalizer.js';
19
20
  //# 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":"AAAA,yCAAyC;AACzC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAE1D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,cAAc,GAKf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,GAGnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,GAKf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,aAAa,GAKd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,gBAAgB,GAQjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,UAAU,GAUX,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAE1D,OAAO,EACL,aAAa,EACb,QAAQ,EACR,aAAa,EACb,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,cAAc,GAKf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,GAGnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,cAAc,GAKf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,aAAa,GAKd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,cAAc,EACd,gBAAgB,GAQjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,2BAA2B,EAC3B,sBAAsB,GAmBvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,UAAU,GAUX,MAAM,2BAA2B,CAAC"}
package/dist/slots.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Slot registry v1 — CLOSED (24-marketplace-wave-4.md §5.4; eleven slots, plus
3
- * one bought on 2026-08-28 and named at the end of the list).
3
+ * two bought since and named at the end of the list, in the order they were
4
+ * bought).
4
5
  *
5
6
  * A slot is a named place in a host surface, its payload, and its fill rule.
6
7
  * The registry is closed for the same reason the widget-id vocabulary is: an
@@ -27,6 +28,18 @@
27
28
  * reader does not have to take the distinction on trust. If a second slot ever
28
29
  * lands here on weaker evidence than that, this paragraph is the thing it
29
30
  * should be measured against.
31
+ *
32
+ * A SECOND SLOT DID, AND IT IS MEASURED AGAINST THIS PARAGRAPH IN ITS OWN
33
+ * ENTRY. `shell.overlay` (2026-09-01) carries FOUR exhibits, not seven, and one
34
+ * of the four is an absence. It is therefore the weaker dossier and its entry
35
+ * says so in those words rather than dressing four up as enough. What it has
36
+ * that `record.actions` did not is the thing the paragraph above the last one
37
+ * asks for: it ships WITH its fill, in the same wave, so the registry's founding
38
+ * rule — a slot nobody fills is a guess — is satisfied on the day it lands
39
+ * instead of being owed to a later wave. The two entries are the two ways a
40
+ * purchase can be honest, and neither is the template for a third: a third that
41
+ * has neither seven exhibits nor a fill in the same wave is the guess this
42
+ * registry is closed against.
30
43
  */
31
44
  import { z } from 'zod';
32
45
  /** Which persona's surface the slot lives in. */
@@ -121,6 +134,12 @@ export declare const SLOT_REGISTRY: readonly [{
121
134
  readonly fill: "multi";
122
135
  readonly payload: "what kind of record it is, the record, and a way to write back";
123
136
  readonly renders: "an action and the panel its result lands in";
137
+ }, {
138
+ readonly id: "shell.overlay";
139
+ readonly surface: "customer";
140
+ readonly fill: "multi";
141
+ readonly payload: "the host shell: brand, screen, locale, clock, what it knows of the visitor, an open request, and the environment handles (token, storage, public client, suggest, handoff)";
142
+ readonly renders: "a floating affordance and its panel, stacked at the inline-end corner";
124
143
  }];
125
144
  export type SlotId = (typeof SLOT_REGISTRY)[number]['id'];
126
145
  export declare const SLOT_IDS: readonly SlotId[];
@@ -137,6 +156,7 @@ export declare const slotIdSchema: z.ZodEnum<{
137
156
  "order.line.actions": "order.line.actions";
138
157
  "record.editor.panel": "record.editor.panel";
139
158
  "record.actions": "record.actions";
159
+ "shell.overlay": "shell.overlay";
140
160
  }>;
141
161
  export declare function isSlotId(v: unknown): v is SlotId;
142
162
  export declare function slotDefinition(id: SlotId): SlotDefinition;
@@ -1 +1 @@
1
- {"version":3,"file":"slots.d.ts","sourceRoot":"","sources":["../src/slots.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iDAAiD;AACjD,eAAO,MAAM,aAAa,iDAAkD,CAAC;AAC7E,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,4CAA6C,CAAC;AACrE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmKoB,CAAC;AAE/C,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAE1D,eAAO,MAAM,QAAQ,EAAqC,SAAS,MAAM,EAAE,CAAC;AAE5E,eAAO,MAAM,YAAY;;;;;;;;;;;;;EAAuD,CAAC;AAIjF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAEhD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAKzD"}
1
+ {"version":3,"file":"slots.d.ts","sourceRoot":"","sources":["../src/slots.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iDAAiD;AACjD,eAAO,MAAM,aAAa,iDAAkD,CAAC;AAC7E,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,4CAA6C,CAAC;AACrE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoPoB,CAAC;AAE/C,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAE1D,eAAO,MAAM,QAAQ,EAAqC,SAAS,MAAM,EAAE,CAAC;AAE5E,eAAO,MAAM,YAAY;;;;;;;;;;;;;;EAAuD,CAAC;AAIjF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAEhD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,CAKzD"}
package/dist/slots.js CHANGED
@@ -1,7 +1,8 @@
1
1
  // SPDX-License-Identifier: AGPL-3.0-only
2
2
  /**
3
3
  * Slot registry v1 — CLOSED (24-marketplace-wave-4.md §5.4; eleven slots, plus
4
- * one bought on 2026-08-28 and named at the end of the list).
4
+ * two bought since and named at the end of the list, in the order they were
5
+ * bought).
5
6
  *
6
7
  * A slot is a named place in a host surface, its payload, and its fill rule.
7
8
  * The registry is closed for the same reason the widget-id vocabulary is: an
@@ -28,6 +29,18 @@
28
29
  * reader does not have to take the distinction on trust. If a second slot ever
29
30
  * lands here on weaker evidence than that, this paragraph is the thing it
30
31
  * should be measured against.
32
+ *
33
+ * A SECOND SLOT DID, AND IT IS MEASURED AGAINST THIS PARAGRAPH IN ITS OWN
34
+ * ENTRY. `shell.overlay` (2026-09-01) carries FOUR exhibits, not seven, and one
35
+ * of the four is an absence. It is therefore the weaker dossier and its entry
36
+ * says so in those words rather than dressing four up as enough. What it has
37
+ * that `record.actions` did not is the thing the paragraph above the last one
38
+ * asks for: it ships WITH its fill, in the same wave, so the registry's founding
39
+ * rule — a slot nobody fills is a guess — is satisfied on the day it lands
40
+ * instead of being owed to a later wave. The two entries are the two ways a
41
+ * purchase can be honest, and neither is the template for a third: a third that
42
+ * has neither seven exhibits nor a fill in the same wave is the guess this
43
+ * registry is closed against.
31
44
  */
32
45
  import { z } from 'zod';
33
46
  /** Which persona's surface the slot lives in. */
@@ -202,6 +215,86 @@ export const SLOT_REGISTRY = [
202
215
  payload: 'what kind of record it is, the record, and a way to write back',
203
216
  renders: 'an action and the panel its result lands in',
204
217
  },
218
+ {
219
+ /*
220
+ * THE THIRTEENTH, BOUGHT ON 2026-09-01 (33-live-chat-add-on.md O1 → D17).
221
+ *
222
+ * The first slot on a CUSTOMER SHELL. Every other customer id in this list
223
+ * is a place inside a flow — a product being configured, a basket line, a
224
+ * checkout's delivery step, a dispatch being read. This one is the layer
225
+ * ABOVE the page: a floating affordance a visitor can reach from any screen
226
+ * in the app, and the panel it opens.
227
+ *
228
+ * ── ITS DOSSIER IS WEAKER THAN `record.actions`', AND SAYS SO ────────────
229
+ *
230
+ * Four exhibits, not seven, written down in 33 Appendix A (deposited into
231
+ * 31 Appendix A as A.4):
232
+ *
233
+ * 1. one shipped implementation — the help desk's chat panel, a
234
+ * store-connected overlay mounted once at the shell and therefore
235
+ * present on all 54 of its views, with SIX host entry points and a
236
+ * hand-off into the host's own ticket model
237
+ * (`support-desk/src/components/ChatWidget.tsx`, `app/App.tsx:320`)
238
+ * 2. the gap the previous purchase's own review recorded — 31 A.3,
239
+ * "neither the 11 nor A.1 covers a customer surface"
240
+ * 3. a dead affordance in the flagship — the storefront footer's
241
+ * "Contact", wired to a demo toast (`Footer.tsx:107-110`)
242
+ * 4. ABSENCE, MEASURED: ten customer-side repos grepped for any way to
243
+ * reach the operator from the shell; zero hits outside the help desk
244
+ *
245
+ * Exhibit 4 is an absence, and an absence is the weakest kind of evidence
246
+ * there is — it says nobody built this, which is equally consistent with
247
+ * nobody wanting it. It is in the list because it is the honest state of
248
+ * the fleet and not because it carries the purchase. What carries the
249
+ * purchase is exhibit 1 plus the condition below.
250
+ *
251
+ * ── WHAT IT HAS THAT THE TWELFTH DID NOT: IT SHIPS WITH ITS FILL ────────
252
+ *
253
+ * `record.actions` arrives unfilled and its entry spends four paragraphs
254
+ * on why that is not a guess. This id needs none of them: `live-chat` fills
255
+ * it in the same wave, from the same plan, and the help desk's own widget
256
+ * is what becomes the fill. The registry's founding rule is therefore met
257
+ * on the day the id lands rather than owed to a later one — which is the
258
+ * whole of the difference, and the reason a four-exhibit dossier was
259
+ * accepted here and would not have been for the twelfth.
260
+ *
261
+ * ── `customer`, AND WHY NOT `both` ──────────────────────────────────────
262
+ *
263
+ * The temptation is `both`: a staff app could hang a floating panel in its
264
+ * corner too. Nothing in the fleet does, and ruling it `both` on that
265
+ * reasoning would be buying a second surface on no exhibits at all — the
266
+ * mistake this entry has just spent forty lines refusing. A staff overlay
267
+ * can be bought the day a staff screen wants one, on its own evidence.
268
+ * `record.actions` went the other way on exhibits, not on symmetry: two of
269
+ * its seven were a reader's own record, so `staff` would have excluded
270
+ * them.
271
+ *
272
+ * ── THE ALTERNATIVE THAT WAS REJECTED, AND IS STILL ON FILE ─────────────
273
+ *
274
+ * Adminium injecting a script into every hosted customer surface, with no
275
+ * slot at all. Rejected for v1 (D3): demo mode needs the seam regardless —
276
+ * an example app running on fixtures has no Adminium to inject anything —
277
+ * and a second mount mechanism is the duplication this layer exists to
278
+ * prevent. It stays on file as the way to reach OPERATOR-BUILT customer
279
+ * pages, which have no seam to mount into (33 D22).
280
+ *
281
+ * ── THE ONE THING A READER SHOULD HOLD AGAINST IT ───────────────────────
282
+ *
283
+ * `fill: 'multi'` promises stacked overlays and there has never been more
284
+ * than one. A second overlay add-on would want to open A PARTICULAR fill
285
+ * from a host entry point, and the payload's `openRequest` is a bare
286
+ * counter that opens every one of them. That is recorded as un-purchased
287
+ * standing evidence (33 D16) rather than pre-solved with a `target` field
288
+ * nothing would pass: `multi` is right because two overlays must coexist
289
+ * without one of them winning, and the day a second one exists the request
290
+ * widens. Until then a host with one fill gets the behaviour it wants.
291
+ */
292
+ id: 'shell.overlay',
293
+ surface: 'customer',
294
+ fill: 'multi',
295
+ payload: 'the host shell: brand, screen, locale, clock, what it knows of the visitor, an open request, and the environment handles (token, storage, public client, suggest, handoff)',
296
+ renders: 'a floating affordance and its panel, stacked at the inline-end corner',
297
+ },
205
298
  ];
206
299
  export const SLOT_IDS = SLOT_REGISTRY.map((s) => s.id);
207
300
  export const slotIdSchema = z.enum(SLOT_IDS);
package/dist/slots.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"slots.js","sourceRoot":"","sources":["../src/slots.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slots.js","sourceRoot":"","sources":["../src/slots.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@
12
12
  * storefront, the SPAs and Electron can all use it (01 §3).
13
13
  */
14
14
  import { type ArtworkSource, type JobSpec } from '../artwork-source.js';
15
+ import { type DocumentKind, type DocumentRenderer, type DocumentSubject } from '../document-render.js';
15
16
  import { type Personalization, type ProductPersonalizer, type ProductRef, type Template } from '../product-personalizer.js';
16
17
  import { type Address, type OrderRef, type Parcel, type ShippingCarrier } from '../shipping-carrier.js';
17
18
  export interface ArtworkSourceFixtures {
@@ -45,4 +46,64 @@ export interface ProductPersonalizerFixtures {
45
46
  angle: string;
46
47
  }
47
48
  export declare function describeProductPersonalizer(impl: ProductPersonalizer, fixtures: ProductPersonalizerFixtures): void;
49
+ /**
50
+ * What an implementer supplies. Deliberately three fields, not ten.
51
+ *
52
+ * Every hard case this suite exercises — a missing required slot, an accented
53
+ * subject, an Arabic one, a different clock — is DERIVED here from the one
54
+ * valid subject, by rewriting the fields the outline already describes. That
55
+ * keeps the derivations identical across providers (a fixture author cannot
56
+ * accidentally make `MISSING_SLOT` easy by omitting an optional slot instead
57
+ * of a required one), and it keeps the cost of a second implementer near zero,
58
+ * which is the claim `shipping-carrier` makes and this contract inherits.
59
+ */
60
+ export interface DocumentRendererFixtures {
61
+ /** The add-on's own non-secret values, as the engine would pass them. */
62
+ settings: Readonly<Record<string, unknown>>;
63
+ /** One subject the provider renders happily, per kind. */
64
+ subject: (kind: DocumentKind) => DocumentSubject;
65
+ /** The authored composition, for a provider that takes one (34 D54). */
66
+ body?: (kind: DocumentKind) => Readonly<Record<string, unknown>> | undefined;
67
+ /**
68
+ * The id of a slot whose value the renderer DRAWS VERBATIM — where the suite
69
+ * puts `<script>`, `é ß ø €` and Arabic to see what comes back.
70
+ *
71
+ * It defaults to the kind's first `text` slot, which is right for most
72
+ * providers and wrong for two kinds this suite has already met:
73
+ *
74
+ * · a slot the provider VALIDATES. Push `é` into a slot holding a
75
+ * barcode number and the refusal that comes back is `INVALID_SUBJECT`
76
+ * from the check digit, never `LATIN_ONLY` from the writer — the
77
+ * assertion goes green on the wrong evidence, or red for the wrong
78
+ * reason;
79
+ * · a slot the provider does not PRINT. `barcode-labels`' first text slot
80
+ * is the row key, which is a lookup and appears nowhere on the sheet, so
81
+ * the accented subject rendered perfectly happily and the coverage
82
+ * assertion failed with the provider being entirely correct (found
83
+ * 2026-09-10, 34-T06).
84
+ *
85
+ * A provider with no drawn free-text slot at all returns `undefined` and the
86
+ * escaping and coverage assertions skip — loudly, in the name.
87
+ */
88
+ textSlot?: (kind: DocumentKind) => string | undefined;
89
+ }
90
+ /**
91
+ * Walk a PDF's cross-reference table back to the objects it points at.
92
+ *
93
+ * This is the assertion that a hand-rolled writer cannot fake. Every offset in
94
+ * the table is a BYTE offset, so a writer that computed them from
95
+ * `String.length` over a stream containing one multi-byte character produces a
96
+ * file every viewer opens and every parser mis-seeks — the exact failure 34's
97
+ * §0.3 trap 8 sends the invoices writer over byte buffers to avoid. Seeking to
98
+ * each offset and requiring `<n> 0 obj` there catches it on the first render.
99
+ *
100
+ * Exported so a writer's own tests can walk its table with the same rules the
101
+ * suite applies, rather than re-deriving a second walker that drifts from
102
+ * this one. Every refusal throws an `Error` naming what it found.
103
+ */
104
+ export declare function parseXrefBack(bytes: Uint8Array): {
105
+ objects: number;
106
+ offsets: number[];
107
+ };
108
+ export declare function describeDocumentRenderer(impl: DocumentRenderer, fixtures: DocumentRendererFixtures): void;
48
109
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAoB,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAKL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAIhC,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,GAAG,EAAE,OAAO,CAAC;IACb,yEAAyE;IACzE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,qBAAqB,GAC9B,IAAI,CA2CN;AAID,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;IACZ,8EAA8E;IAC9E,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,uBAAuB,GAChC,IAAI,CAkFN;AAID,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,kCAAkC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,4EAA4E;IAC5E,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,2BAA2B,GACpC,IAAI,CAqDN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAoB,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAOL,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EAGrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAKL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAIhC,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,GAAG,EAAE,OAAO,CAAC;IACb,yEAAyE;IACzE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,qBAAqB,GAC9B,IAAI,CA2CN;AAID,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,OAAO,CAAC;IACZ,8EAA8E;IAC9E,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,uBAAuB,GAChC,IAAI,CAoHN;AAID,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,kCAAkC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,4EAA4E;IAC5E,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,2BAA2B,GACpC,IAAI,CAqDN;AAID;;;;;;;;;;GAUG;AACH,MAAM,WAAW,wBAAwB;IACvC,yEAAyE;IACzE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,0DAA0D;IAC1D,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,eAAe,CAAC;IACjD,wEAAwE;IACxE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAC7E;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,GAAG,SAAS,CAAC;CACvD;AAyDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA0CvF;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,wBAAwB,GACjC,IAAI,CAoSN"}