@adminiumjs/manifest 0.3.5 → 0.3.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.
Files changed (66) hide show
  1. package/dist/capacity.d.ts +786 -0
  2. package/dist/capacity.d.ts.map +1 -0
  3. package/dist/capacity.js +717 -0
  4. package/dist/capacity.js.map +1 -0
  5. package/dist/documents.d.ts +91 -5
  6. package/dist/documents.d.ts.map +1 -1
  7. package/dist/documents.js +129 -32
  8. package/dist/documents.js.map +1 -1
  9. package/dist/formula.d.ts +114 -2
  10. package/dist/formula.d.ts.map +1 -1
  11. package/dist/formula.js +291 -5
  12. package/dist/formula.js.map +1 -1
  13. package/dist/index.d.ts +12 -6
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +12 -6
  16. package/dist/index.js.map +1 -1
  17. package/dist/marketplace-wire.d.ts +230 -0
  18. package/dist/marketplace-wire.d.ts.map +1 -0
  19. package/dist/marketplace-wire.js +138 -0
  20. package/dist/marketplace-wire.js.map +1 -0
  21. package/dist/outbox.d.ts +242 -27
  22. package/dist/outbox.d.ts.map +1 -1
  23. package/dist/outbox.js +553 -27
  24. package/dist/outbox.js.map +1 -1
  25. package/dist/plan-context.d.ts +28 -3
  26. package/dist/plan-context.d.ts.map +1 -1
  27. package/dist/plan-context.js +291 -14
  28. package/dist/plan-context.js.map +1 -1
  29. package/dist/plan-model.d.ts +58 -3
  30. package/dist/plan-model.d.ts.map +1 -1
  31. package/dist/public-access.d.ts +637 -0
  32. package/dist/public-access.d.ts.map +1 -1
  33. package/dist/public-access.js +1593 -12
  34. package/dist/public-access.js.map +1 -1
  35. package/dist/refs.d.ts +86 -0
  36. package/dist/refs.d.ts.map +1 -1
  37. package/dist/refs.js +186 -0
  38. package/dist/refs.js.map +1 -1
  39. package/dist/roles.d.ts +10 -2
  40. package/dist/roles.d.ts.map +1 -1
  41. package/dist/roles.js +27 -5
  42. package/dist/roles.js.map +1 -1
  43. package/dist/sample.d.ts +218 -2
  44. package/dist/sample.d.ts.map +1 -1
  45. package/dist/sample.js +145 -7
  46. package/dist/sample.js.map +1 -1
  47. package/dist/schema.d.ts +2860 -360
  48. package/dist/schema.d.ts.map +1 -1
  49. package/dist/schema.js +1002 -54
  50. package/dist/schema.js.map +1 -1
  51. package/dist/shapes.d.ts +5 -1
  52. package/dist/shapes.d.ts.map +1 -1
  53. package/dist/shapes.js +13 -3
  54. package/dist/shapes.js.map +1 -1
  55. package/dist/states.d.ts +342 -2
  56. package/dist/states.d.ts.map +1 -1
  57. package/dist/states.js +566 -7
  58. package/dist/states.js.map +1 -1
  59. package/dist/table-shapes.d.ts +47 -0
  60. package/dist/table-shapes.d.ts.map +1 -0
  61. package/dist/table-shapes.js +159 -0
  62. package/dist/table-shapes.js.map +1 -0
  63. package/dist/validate.d.ts.map +1 -1
  64. package/dist/validate.js +80 -2
  65. package/dist/validate.js.map +1 -1
  66. package/package.json +2 -2
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,oBAAoB,CAAC;AAEjD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,GAeb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAkB,MAAM,YAAY,CAAC;AAE/E,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GAIjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAoB,MAAM,cAAc,CAAC;AAEjF,OAAO,EACL,cAAc,EACd,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,GAIb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAA8B,MAAM,oBAAoB,CAAC;AAEzI,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,KAAK,IAAI,YAAY,EACrB,aAAa,EACb,QAAQ,EACR,SAAS,EACT,OAAO,GAGR,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,YAAY,GAKb,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAmB,MAAM,cAAc,CAAC;AAEzF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAsC,MAAM,gBAAgB,CAAC;AAE1G,OAAO,EACL,sBAAsB,EACtB,QAAQ,GAKT,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAsB,MAAM,WAAW,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAErE,OAAO,EACL,WAAW,GASZ,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,YAAY,GAQb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,iBAAiB,GAKlB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ /**
2
+ * The marketplace API's wire format, `adminium-marketplace/1` — what
3
+ * `https://adminium.dev/api/v1/marketplace/apps` and `/add-ons` answer, as an
4
+ * Adminium server reads it.
5
+ *
6
+ * ── TWO POSTURES IN ONE DOCUMENT ────────────────────────────────────────────
7
+ *
8
+ * THE ITEM IS LENIENT. Names, art, links and dates are display facts, and a
9
+ * field this server does not know is dropped (zod's default strip). That is
10
+ * what lets the site grow a display field without breaking every server
11
+ * already in service — the reason the static feeds before this had to move to
12
+ * a new address each time they changed (v1, v2, v3).
13
+ *
14
+ * THE RELEASE IS STRICT. `release` is the install contract: the exact version,
15
+ * the fingerprint the downloaded bytes are checked against, the floor, and
16
+ * what the verified file's manifest says. A field here that this server does
17
+ * not know is a refusal of that ITEM, never a warning — which is how "no price
18
+ * reaches an install" holds by construction rather than by nobody sending one.
19
+ * A pricing block at ITEM level is simply stripped: pricing is not shown in
20
+ * this round, and no DTO carries it.
21
+ *
22
+ * ONE ITEM, ONE VERDICT. Items are parsed one at a time: an item whose release
23
+ * this server cannot read is skipped and counted, and the rest of the shelf is
24
+ * still offered. Only a document that is not this format at all is refused.
25
+ *
26
+ * `?adminium=<version>`: the site offers each item's newest release this
27
+ * version can install, and names the newest one in `newerRelease` when that
28
+ * is a different one. An item whose every release is too new comes back with
29
+ * `release: null` and a `newerRelease`.
30
+ */
31
+ import { z } from 'zod';
32
+ export declare const MARKETPLACE_FORMAT = "adminium-marketplace/1";
33
+ /** An item key: the grammar the stores, the payloads and the download paths share. */
34
+ export declare const MARKETPLACE_KEY_PATTERN: RegExp;
35
+ /** An exact version — never a range, never `latest`. One optional tail group (see the add-on catalog client). */
36
+ export declare const MARKETPLACE_VERSION_PATTERN: RegExp;
37
+ /** An add-on release's install facts, strict. */
38
+ export declare const addOnReleaseWireSchema: z.ZodObject<{
39
+ version: z.ZodString;
40
+ integrity: z.ZodString;
41
+ categories: z.ZodArray<z.ZodString>;
42
+ capabilities: z.ZodArray<z.ZodString>;
43
+ connect: z.ZodObject<{
44
+ kind: z.ZodEnum<{
45
+ none: "none";
46
+ "api-key": "api-key";
47
+ oauth2: "oauth2";
48
+ }>;
49
+ }, z.core.$strict>;
50
+ provides: z.ZodArray<z.ZodObject<{
51
+ contract: z.ZodString;
52
+ version: z.ZodNumber;
53
+ }, z.core.$strict>>;
54
+ attaches: z.ZodArray<z.ZodObject<{
55
+ app: z.ZodString;
56
+ range: z.ZodOptional<z.ZodString>;
57
+ }, z.core.$strict>>;
58
+ network: z.ZodObject<{
59
+ allow: z.ZodArray<z.ZodString>;
60
+ }, z.core.$strict>;
61
+ minAdminiumVersion: z.ZodString;
62
+ publisher: z.ZodOptional<z.ZodString>;
63
+ }, z.core.$strict>;
64
+ /** An app release's install facts, strict. */
65
+ export declare const appReleaseWireSchema: z.ZodObject<{
66
+ version: z.ZodString;
67
+ integrity: z.ZodString;
68
+ categories: z.ZodArray<z.ZodString>;
69
+ capabilities: z.ZodArray<z.ZodString>;
70
+ publisher: z.ZodString;
71
+ sides: z.ZodArray<z.ZodEnum<{
72
+ customer: "customer";
73
+ staff: "staff";
74
+ }>>;
75
+ minAdminiumVersion: z.ZodString;
76
+ addOns: z.ZodObject<{
77
+ requires: z.ZodArray<z.ZodObject<{
78
+ key: z.ZodString;
79
+ }, z.core.$loose>>;
80
+ suggests: z.ZodArray<z.ZodObject<{
81
+ key: z.ZodString;
82
+ }, z.core.$loose>>;
83
+ features: z.ZodArray<z.ZodObject<{
84
+ requires: z.ZodArray<z.ZodString>;
85
+ }, z.core.$loose>>;
86
+ }, z.core.$strict>;
87
+ }, z.core.$strict>;
88
+ export declare const addOnItemWireSchema: z.ZodObject<{
89
+ kind: z.ZodLiteral<"add-on">;
90
+ categoryKey: z.ZodDefault<z.ZodNullable<z.ZodString>>;
91
+ release: z.ZodNullable<z.ZodObject<{
92
+ version: z.ZodString;
93
+ integrity: z.ZodString;
94
+ categories: z.ZodArray<z.ZodString>;
95
+ capabilities: z.ZodArray<z.ZodString>;
96
+ connect: z.ZodObject<{
97
+ kind: z.ZodEnum<{
98
+ none: "none";
99
+ "api-key": "api-key";
100
+ oauth2: "oauth2";
101
+ }>;
102
+ }, z.core.$strict>;
103
+ provides: z.ZodArray<z.ZodObject<{
104
+ contract: z.ZodString;
105
+ version: z.ZodNumber;
106
+ }, z.core.$strict>>;
107
+ attaches: z.ZodArray<z.ZodObject<{
108
+ app: z.ZodString;
109
+ range: z.ZodOptional<z.ZodString>;
110
+ }, z.core.$strict>>;
111
+ network: z.ZodObject<{
112
+ allow: z.ZodArray<z.ZodString>;
113
+ }, z.core.$strict>;
114
+ minAdminiumVersion: z.ZodString;
115
+ publisher: z.ZodOptional<z.ZodString>;
116
+ }, z.core.$strict>>;
117
+ key: z.ZodString;
118
+ availability: z.ZodEnum<{
119
+ installable: "installable";
120
+ "coming-soon": "coming-soon";
121
+ "source-only": "source-only";
122
+ }>;
123
+ name: z.ZodRecord<z.ZodString, z.ZodString>;
124
+ tagline: z.ZodRecord<z.ZodString, z.ZodString>;
125
+ author: z.ZodObject<{
126
+ name: z.ZodString;
127
+ url: z.ZodOptional<z.ZodString>;
128
+ }, z.core.$strip>;
129
+ capabilities: z.ZodDefault<z.ZodArray<z.ZodString>>;
130
+ art: z.ZodDefault<z.ZodObject<{
131
+ tint: z.ZodOptional<z.ZodString>;
132
+ iconPaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
133
+ monogram: z.ZodOptional<z.ZodString>;
134
+ }, z.core.$strip>>;
135
+ links: z.ZodObject<{
136
+ page: z.ZodString;
137
+ }, z.core.$strip>;
138
+ lastUpdatedAt: z.ZodString;
139
+ file: z.ZodDefault<z.ZodNullable<z.ZodObject<{
140
+ size: z.ZodNumber;
141
+ publishedAt: z.ZodNullable<z.ZodString>;
142
+ }, z.core.$strip>>>;
143
+ newerRelease: z.ZodOptional<z.ZodObject<{
144
+ version: z.ZodString;
145
+ minAdminiumVersion: z.ZodString;
146
+ }, z.core.$strip>>;
147
+ }, z.core.$strip>;
148
+ export declare const appItemWireSchema: z.ZodObject<{
149
+ kind: z.ZodLiteral<"app">;
150
+ release: z.ZodNullable<z.ZodObject<{
151
+ version: z.ZodString;
152
+ integrity: z.ZodString;
153
+ categories: z.ZodArray<z.ZodString>;
154
+ capabilities: z.ZodArray<z.ZodString>;
155
+ publisher: z.ZodString;
156
+ sides: z.ZodArray<z.ZodEnum<{
157
+ customer: "customer";
158
+ staff: "staff";
159
+ }>>;
160
+ minAdminiumVersion: z.ZodString;
161
+ addOns: z.ZodObject<{
162
+ requires: z.ZodArray<z.ZodObject<{
163
+ key: z.ZodString;
164
+ }, z.core.$loose>>;
165
+ suggests: z.ZodArray<z.ZodObject<{
166
+ key: z.ZodString;
167
+ }, z.core.$loose>>;
168
+ features: z.ZodArray<z.ZodObject<{
169
+ requires: z.ZodArray<z.ZodString>;
170
+ }, z.core.$loose>>;
171
+ }, z.core.$strict>;
172
+ }, z.core.$strict>>;
173
+ key: z.ZodString;
174
+ availability: z.ZodEnum<{
175
+ installable: "installable";
176
+ "coming-soon": "coming-soon";
177
+ "source-only": "source-only";
178
+ }>;
179
+ name: z.ZodRecord<z.ZodString, z.ZodString>;
180
+ tagline: z.ZodRecord<z.ZodString, z.ZodString>;
181
+ author: z.ZodObject<{
182
+ name: z.ZodString;
183
+ url: z.ZodOptional<z.ZodString>;
184
+ }, z.core.$strip>;
185
+ capabilities: z.ZodDefault<z.ZodArray<z.ZodString>>;
186
+ art: z.ZodDefault<z.ZodObject<{
187
+ tint: z.ZodOptional<z.ZodString>;
188
+ iconPaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
189
+ monogram: z.ZodOptional<z.ZodString>;
190
+ }, z.core.$strip>>;
191
+ links: z.ZodObject<{
192
+ page: z.ZodString;
193
+ }, z.core.$strip>;
194
+ lastUpdatedAt: z.ZodString;
195
+ file: z.ZodDefault<z.ZodNullable<z.ZodObject<{
196
+ size: z.ZodNumber;
197
+ publishedAt: z.ZodNullable<z.ZodString>;
198
+ }, z.core.$strip>>>;
199
+ newerRelease: z.ZodOptional<z.ZodObject<{
200
+ version: z.ZodString;
201
+ minAdminiumVersion: z.ZodString;
202
+ }, z.core.$strip>>;
203
+ }, z.core.$strip>;
204
+ /** The shelf document around the items: the items themselves are parsed one by one. */
205
+ export declare const marketplaceShelfSchema: z.ZodObject<{
206
+ format: z.ZodLiteral<"adminium-marketplace/1">;
207
+ generatedAt: z.ZodString;
208
+ items: z.ZodArray<z.ZodUnknown>;
209
+ }, z.core.$strip>;
210
+ export type AddOnReleaseWire = z.infer<typeof addOnReleaseWireSchema>;
211
+ export type AppReleaseWire = z.infer<typeof appReleaseWireSchema>;
212
+ export type AddOnItemWire = z.infer<typeof addOnItemWireSchema>;
213
+ export type AppItemWire = z.infer<typeof appItemWireSchema>;
214
+ export interface ParsedShelf<T> {
215
+ generatedAt: string;
216
+ items: T[];
217
+ /** Items skipped because this server could not read them, with why. */
218
+ skipped: {
219
+ key: string | null;
220
+ reason: string;
221
+ }[];
222
+ }
223
+ /**
224
+ * One shelf, item by item. Null when the document is not this format at all.
225
+ *
226
+ * An `installable` item must carry a release, and the release must be one
227
+ * this reader can read; anything else is skipped with its reason.
228
+ */
229
+ export declare function parseShelf<S extends typeof addOnItemWireSchema | typeof appItemWireSchema>(schema: S, document: unknown): ParsedShelf<z.infer<S>> | null;
230
+ //# sourceMappingURL=marketplace-wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-wire.d.ts","sourceRoot":"","sources":["../src/marketplace-wire.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAE3D,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,QAA2B,CAAC;AAChE,iHAAiH;AACjH,eAAO,MAAM,2BAA2B,QAAuE,CAAC;AAMhH,iDAAiD;AACjD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;kBAaxB,CAAC;AAKZ,8CAA8C;AAC9C,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;kBAkBtB,CAAC;AAuBZ,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAK9B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAI5B,CAAC;AAEH,uFAAuF;AACvF,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,uEAAuE;IACvE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACnD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,mBAAmB,GAAG,OAAO,iBAAiB,EACxF,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,OAAO,GAChB,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAehC"}
@@ -0,0 +1,138 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ /**
3
+ * The marketplace API's wire format, `adminium-marketplace/1` — what
4
+ * `https://adminium.dev/api/v1/marketplace/apps` and `/add-ons` answer, as an
5
+ * Adminium server reads it.
6
+ *
7
+ * ── TWO POSTURES IN ONE DOCUMENT ────────────────────────────────────────────
8
+ *
9
+ * THE ITEM IS LENIENT. Names, art, links and dates are display facts, and a
10
+ * field this server does not know is dropped (zod's default strip). That is
11
+ * what lets the site grow a display field without breaking every server
12
+ * already in service — the reason the static feeds before this had to move to
13
+ * a new address each time they changed (v1, v2, v3).
14
+ *
15
+ * THE RELEASE IS STRICT. `release` is the install contract: the exact version,
16
+ * the fingerprint the downloaded bytes are checked against, the floor, and
17
+ * what the verified file's manifest says. A field here that this server does
18
+ * not know is a refusal of that ITEM, never a warning — which is how "no price
19
+ * reaches an install" holds by construction rather than by nobody sending one.
20
+ * A pricing block at ITEM level is simply stripped: pricing is not shown in
21
+ * this round, and no DTO carries it.
22
+ *
23
+ * ONE ITEM, ONE VERDICT. Items are parsed one at a time: an item whose release
24
+ * this server cannot read is skipped and counted, and the rest of the shelf is
25
+ * still offered. Only a document that is not this format at all is refused.
26
+ *
27
+ * `?adminium=<version>`: the site offers each item's newest release this
28
+ * version can install, and names the newest one in `newerRelease` when that
29
+ * is a different one. An item whose every release is too new comes back with
30
+ * `release: null` and a `newerRelease`.
31
+ */
32
+ import { z } from 'zod';
33
+ export const MARKETPLACE_FORMAT = 'adminium-marketplace/1';
34
+ /** An item key: the grammar the stores, the payloads and the download paths share. */
35
+ export const MARKETPLACE_KEY_PATTERN = /^[a-z][a-z0-9-]{1,79}$/;
36
+ /** An exact version — never a range, never `latest`. One optional tail group (see the add-on catalog client). */
37
+ export const MARKETPLACE_VERSION_PATTERN = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:[-+][0-9A-Za-z.+-]+)?$/;
38
+ const INTEGRITY_PATTERN = /^sha512-[A-Za-z0-9+/]+={0,2}$/;
39
+ const localized = z.record(z.string(), z.string());
40
+ const version = z.string().regex(MARKETPLACE_VERSION_PATTERN);
41
+ /** An add-on release's install facts, strict. */
42
+ export const addOnReleaseWireSchema = z
43
+ .object({
44
+ version,
45
+ integrity: z.string().regex(INTEGRITY_PATTERN),
46
+ categories: z.array(z.string()),
47
+ capabilities: z.array(z.string()),
48
+ connect: z.object({ kind: z.enum(['none', 'api-key', 'oauth2']) }).strict(),
49
+ provides: z.array(z.object({ contract: z.string(), version: z.number().int().positive() }).strict()),
50
+ attaches: z.array(z.object({ app: z.string(), range: z.string().optional() }).strict()),
51
+ network: z.object({ allow: z.array(z.string()) }).strict(),
52
+ minAdminiumVersion: version,
53
+ publisher: z.string().min(1).optional(),
54
+ })
55
+ .strict();
56
+ /** A need as the manifest declares it; read for display, the staged manifest decides the install. */
57
+ const needWire = z.object({ key: z.string().regex(MARKETPLACE_KEY_PATTERN) }).passthrough();
58
+ /** An app release's install facts, strict. */
59
+ export const appReleaseWireSchema = z
60
+ .object({
61
+ version,
62
+ integrity: z.string().regex(INTEGRITY_PATTERN),
63
+ categories: z.array(z.string()),
64
+ capabilities: z.array(z.string()),
65
+ publisher: z.string().min(1),
66
+ sides: z.array(z.enum(['staff', 'customer'])).min(1),
67
+ minAdminiumVersion: version,
68
+ /** Which add-ons the app needs or can use (the "Needs Invoices" line). */
69
+ addOns: z
70
+ .object({
71
+ requires: z.array(needWire),
72
+ suggests: z.array(needWire),
73
+ features: z.array(z.object({ requires: z.array(z.string()) }).passthrough()),
74
+ })
75
+ .strict(),
76
+ })
77
+ .strict();
78
+ const itemBase = {
79
+ key: z.string().regex(MARKETPLACE_KEY_PATTERN),
80
+ /** `installable` offers a release; `coming-soon` is listed and cannot be downloaded; `source-only` has none to offer. */
81
+ availability: z.enum(['installable', 'coming-soon', 'source-only']),
82
+ name: localized.refine((map) => typeof map['en'] === 'string' && map['en'] !== '', 'an English name'),
83
+ tagline: localized,
84
+ author: z.object({ name: z.string(), url: z.string().optional() }),
85
+ capabilities: z.array(z.string()).default([]),
86
+ art: z
87
+ .object({
88
+ tint: z.string().optional(),
89
+ iconPaths: z.array(z.string()).optional(),
90
+ monogram: z.string().optional(),
91
+ })
92
+ .default({}),
93
+ links: z.object({ page: z.string() }),
94
+ lastUpdatedAt: z.string(),
95
+ file: z.object({ size: z.number().int().nonnegative(), publishedAt: z.string().nullable() }).nullable().default(null),
96
+ newerRelease: z.object({ version, minAdminiumVersion: version }).optional(),
97
+ };
98
+ export const addOnItemWireSchema = z.object({
99
+ ...itemBase,
100
+ kind: z.literal('add-on'),
101
+ categoryKey: z.string().nullable().default(null),
102
+ release: addOnReleaseWireSchema.nullable(),
103
+ });
104
+ export const appItemWireSchema = z.object({
105
+ ...itemBase,
106
+ kind: z.literal('app'),
107
+ release: appReleaseWireSchema.nullable(),
108
+ });
109
+ /** The shelf document around the items: the items themselves are parsed one by one. */
110
+ export const marketplaceShelfSchema = z.object({
111
+ format: z.literal(MARKETPLACE_FORMAT),
112
+ generatedAt: z.string().min(1),
113
+ items: z.array(z.unknown()),
114
+ });
115
+ /**
116
+ * One shelf, item by item. Null when the document is not this format at all.
117
+ *
118
+ * An `installable` item must carry a release, and the release must be one
119
+ * this reader can read; anything else is skipped with its reason.
120
+ */
121
+ export function parseShelf(schema, document) {
122
+ const shelf = marketplaceShelfSchema.safeParse(document);
123
+ if (!shelf.success)
124
+ return null;
125
+ const items = [];
126
+ const skipped = [];
127
+ for (const raw of shelf.data.items) {
128
+ const key = typeof raw === 'object' && raw !== null && typeof raw.key === 'string' ? raw.key : null;
129
+ const parsed = schema.safeParse(raw);
130
+ if (!parsed.success) {
131
+ skipped.push({ key, reason: parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ') });
132
+ continue;
133
+ }
134
+ items.push(parsed.data);
135
+ }
136
+ return { generatedAt: shelf.data.generatedAt, items, skipped };
137
+ }
138
+ //# sourceMappingURL=marketplace-wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-wire.js","sourceRoot":"","sources":["../src/marketplace-wire.ts"],"names":[],"mappings":"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"}