@mailwoman/api-kit 9.3.0 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -32,9 +32,15 @@ export const EngineStampSchema = z
32
32
  * field. Applied at the ROUTE, never on an outcome schema, so an outcome schema keeps describing what the engine
33
33
  * produces (the schema drift pin in `mailwoman` depends on that) and the OpenAPI document references the outcome
34
34
  * component through `allOf` instead of cloning it.
35
+ *
36
+ * `name` registers the stamped shape as its own component, and it is required rather than optional because an unnamed
37
+ * intersection is inlined at every use: a generator then has no name to give the type and invents one from the position
38
+ * it appears in — `PhotonResponse::Variant0`, or a flattened per-operation clone of an outcome that already has a name.
39
+ * Naming it keeps one `$ref` per stamped shape, which is what makes a generated client's type names follow the
40
+ * document's.
35
41
  */
36
- export function stampedResponseSchema<S extends z.ZodTypeAny>(schema: S) {
37
- return z.intersection(schema, z.object({ engine: EngineStampSchema.optional() }))
42
+ export function stampedResponseSchema<S extends z.ZodTypeAny>(schema: S, name: string) {
43
+ return z.intersection(schema, z.object({ engine: EngineStampSchema.optional() })).openapi(name)
38
44
  }
39
45
 
40
46
  /**
package/lib/openapi.ts CHANGED
@@ -10,6 +10,7 @@
10
10
 
11
11
  import type { OpenAPIHono } from "@hono/zod-openapi"
12
12
  import { writeLocalTextFile } from "@mailwoman/core/fs/writers"
13
+ import { readPackageJSON } from "@mailwoman/core/module/resolve-from"
13
14
 
14
15
  type OpenAPISecurityRequirements = Parameters<OpenAPIHono["getOpenAPI31Document"]>[0]["security"]
15
16
 
@@ -35,6 +36,32 @@ export interface OpenAPIDocInfo {
35
36
  security?: OpenAPISecurityRequirements
36
37
  }
37
38
 
39
+ /**
40
+ * The three document fields a served package takes from its own manifest, read at load rather than imported as a
41
+ * module: a JSON import makes `tsc` copy the manifest into `out/`, where it becomes the package scope for the compiled
42
+ * tree and breaks every `#` import in it.
43
+ *
44
+ * Each of the four served packages (`api`, `libpostal`, `nominatim`, `photon`) publishes a document naming itself, so
45
+ * the read and the mapping live here rather than four times over. A manifest missing any of the three raises: the
46
+ * document has no meaningful form without them, and every manifest here carries all three.
47
+ *
48
+ * @param base The CALLER's `import.meta.url`. The package resolves through the graph of the workspace that declares it,
49
+ * which is what `resolve-from` exists for; resolving from here would answer through `@mailwoman/api-kit`'s instead.
50
+ */
51
+ export async function readServedDocumentInfo(
52
+ base: string,
53
+ packageName: string
54
+ ): Promise<Pick<OpenAPIDocInfo, "title" | "version" | "description">> {
55
+ const manifest = await readPackageJSON(base, packageName)
56
+ const { name, version, description } = manifest
57
+
58
+ if (!name || !version || !description) {
59
+ throw new Error(`${packageName}/package.json must declare name, version and description for its OpenAPI document`)
60
+ }
61
+
62
+ return { title: name, version, description }
63
+ }
64
+
38
65
  /**
39
66
  * Split an `OpenAPIDocInfo` into the document's `info` block and its top-level sibling fields.
40
67
  */
@@ -27,8 +27,14 @@ export declare const EngineStampSchema: z.ZodObject<{
27
27
  * field. Applied at the ROUTE, never on an outcome schema, so an outcome schema keeps describing what the engine
28
28
  * produces (the schema drift pin in `mailwoman` depends on that) and the OpenAPI document references the outcome
29
29
  * component through `allOf` instead of cloning it.
30
+ *
31
+ * `name` registers the stamped shape as its own component, and it is required rather than optional because an unnamed
32
+ * intersection is inlined at every use: a generator then has no name to give the type and invents one from the position
33
+ * it appears in — `PhotonResponse::Variant0`, or a flattened per-operation clone of an outcome that already has a name.
34
+ * Naming it keeps one `$ref` per stamped shape, which is what makes a generated client's type names follow the
35
+ * document's.
30
36
  */
31
- export declare function stampedResponseSchema<S extends z.ZodTypeAny>(schema: S): z.ZodIntersection<S, z.ZodObject<{
37
+ export declare function stampedResponseSchema<S extends z.ZodTypeAny>(schema: S, name: string): z.ZodIntersection<S, z.ZodObject<{
32
38
  engine: z.ZodOptional<z.ZodObject<{
33
39
  name: z.ZodLiteral<"mailwoman">;
34
40
  version: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"engine-stamp.d.ts","sourceRoot":"","sources":["../lib/engine-stamp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;kBAQ2B,CAAA;AAEzD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;;;;;;;;mBAEtE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAUnE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC/C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,WAAW,GAAG,SAAS,GAC5B,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,CAE9B"}
1
+ {"version":3,"file":"engine-stamp.d.ts","sourceRoot":"","sources":["../lib/engine-stamp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;kBAQ2B,CAAA;AAEzD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM;;;;;;;;mBAEpF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAUnE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC/C,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,WAAW,GAAG,SAAS,GAC5B,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,CAE9B"}
@@ -27,9 +27,15 @@ export const EngineStampSchema = z
27
27
  * field. Applied at the ROUTE, never on an outcome schema, so an outcome schema keeps describing what the engine
28
28
  * produces (the schema drift pin in `mailwoman` depends on that) and the OpenAPI document references the outcome
29
29
  * component through `allOf` instead of cloning it.
30
+ *
31
+ * `name` registers the stamped shape as its own component, and it is required rather than optional because an unnamed
32
+ * intersection is inlined at every use: a generator then has no name to give the type and invents one from the position
33
+ * it appears in — `PhotonResponse::Variant0`, or a flattened per-operation clone of an outcome that already has a name.
34
+ * Naming it keeps one `$ref` per stamped shape, which is what makes a generated client's type names follow the
35
+ * document's.
30
36
  */
31
- export function stampedResponseSchema(schema) {
32
- return z.intersection(schema, z.object({ engine: EngineStampSchema.optional() }));
37
+ export function stampedResponseSchema(schema, name) {
38
+ return z.intersection(schema, z.object({ engine: EngineStampSchema.optional() })).openapi(name);
33
39
  }
34
40
  /**
35
41
  * `Server` names the engine and its license branch; `Link: rel="license"` is the registered relation (RFC 8288) that
@@ -1 +1 @@
1
- {"version":3,"file":"engine-stamp.js","sourceRoot":"","sources":["../lib/engine-stamp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AAIrC;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAChC,YAAY,CAAC;IACb,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC;KACD,OAAO,CAAC,aAAa,CAAkC,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAyB,MAAS;IACtE,OAAO,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAkB;IAC/C,MAAM,MAAM,GAAG,aAAa,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,GAAG,CAAA;IAC9D,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,WAAW,kBAAkB,CAAA;IAEpD,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACxB,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAEtB,MAAM,IAAI,EAAE,CAAA;IACb,CAAC,CAAA;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC9B,IAAO,EACP,KAA8B;IAE9B,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACjD,CAAC"}
1
+ {"version":3,"file":"engine-stamp.js","sourceRoot":"","sources":["../lib/engine-stamp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AAIrC;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAChC,YAAY,CAAC;IACb,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC;KACD,OAAO,CAAC,aAAa,CAAkC,CAAA;AAEzD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAyB,MAAS,EAAE,IAAY;IACpF,OAAO,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAChG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAkB;IAC/C,MAAM,MAAM,GAAG,aAAa,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,GAAG,CAAA;IAC9D,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,WAAW,kBAAkB,CAAA;IAEpD,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACxB,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAEtB,MAAM,IAAI,EAAE,CAAA;IACb,CAAC,CAAA;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC9B,IAAO,EACP,KAA8B;IAE9B,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACjD,CAAC"}
package/out/error.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../lib/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AAIrC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC7B,MAAM,CAAC;IACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC;KACD,OAAO,CAAC,UAAU,CAAC,CAAA;AAErB;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAiC,CAAU,EAAE,MAAS,EAAE,KAAa,EAAE,MAAe;IAClH,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;AAC5E,CAAC;AAED,MAAM,2BAA2B,GAChC,mIAAmI,CAAA;AAEpI;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,CAAU,EAAE,UAAmC,UAAU;IACjG,OAAO,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,gBAAgB,EAAE,2BAA2B,CAAC,CAAA;AACtF,CAAC"}
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../lib/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AAIrC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC7B,MAAM,CAAC;IACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC;KACD,OAAO,CAAC,UAAU,CAAC,CAAA;AAErB;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAiC,CAAU,EAAE,MAAS,EAAE,KAAa,EAAE,MAAe;IAClH,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAA;AAC5E,CAAC;AAED,MAAM,2BAA2B,GAChC,mIAAmI,CAAA;AAEpI;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,CAAU,EAAE,OAAO,GAA4B,UAAU;IACjG,OAAO,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,gBAAgB,EAAE,2BAA2B,CAAC,CAAA;AACtF,CAAC"}
package/out/openapi.d.ts CHANGED
@@ -45,6 +45,19 @@ export interface OpenAPIDocInfo {
45
45
  }>;
46
46
  security?: OpenAPISecurityRequirements;
47
47
  }
48
+ /**
49
+ * The three document fields a served package takes from its own manifest, read at load rather than imported as a
50
+ * module: a JSON import makes `tsc` copy the manifest into `out/`, where it becomes the package scope for the compiled
51
+ * tree and breaks every `#` import in it.
52
+ *
53
+ * Each of the four served packages (`api`, `libpostal`, `nominatim`, `photon`) publishes a document naming itself, so
54
+ * the read and the mapping live here rather than four times over. A manifest missing any of the three raises: the
55
+ * document has no meaningful form without them, and every manifest here carries all three.
56
+ *
57
+ * @param base The CALLER's `import.meta.url`. The package resolves through the graph of the workspace that declares it,
58
+ * which is what `resolve-from` exists for; resolving from here would answer through `@mailwoman/api-kit`'s instead.
59
+ */
60
+ export declare function readServedDocumentInfo(base: string, packageName: string): Promise<Pick<OpenAPIDocInfo, "title" | "version" | "description">>;
48
61
  /**
49
62
  * Mount the OpenAPI 3.1 document endpoint on `app` (default `/openapi.json`).
50
63
  */
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../lib/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAGpD,KAAK,2BAA2B,GAAG,UAAU,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;AAEjG;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/C,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,YAAY,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACpD,OAAO,CAAC,EAAE,KAAK,CAAC;QACf,GAAG,EAAE,MAAM,CAAA;QACX,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KACrE,CAAC,CAAA;IACF,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpD,QAAQ,CAAC,EAAE,2BAA2B,CAAA;CACtC;AAiBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,SAAkB,GAAG,IAAI,CAItG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAezG;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;;;;;;EAK7D"}
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../lib/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAIpD,KAAK,2BAA2B,GAAG,UAAU,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;AAEjG;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/C,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,YAAY,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACpD,OAAO,CAAC,EAAE,KAAK,CAAC;QACf,GAAG,EAAE,MAAM,CAAA;QACX,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KACrE,CAAC,CAAA;IACF,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpD,QAAQ,CAAC,EAAE,2BAA2B,CAAA;CACtC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC3C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,SAAS,GAAG,aAAa,CAAC,CAAC,CASpE;AAiBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,SAAkB,GAAG,IAAI,CAItG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAezG;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACzC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,cAAc,EACpB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;;;;;;;EAK7D"}
package/out/openapi.js CHANGED
@@ -8,6 +8,27 @@
8
8
  * (progenitor), replacing the old hand-downgrade step.
9
9
  */
10
10
  import { writeLocalTextFile } from "@mailwoman/core/fs/writers";
11
+ import { readPackageJSON } from "@mailwoman/core/module/resolve-from";
12
+ /**
13
+ * The three document fields a served package takes from its own manifest, read at load rather than imported as a
14
+ * module: a JSON import makes `tsc` copy the manifest into `out/`, where it becomes the package scope for the compiled
15
+ * tree and breaks every `#` import in it.
16
+ *
17
+ * Each of the four served packages (`api`, `libpostal`, `nominatim`, `photon`) publishes a document naming itself, so
18
+ * the read and the mapping live here rather than four times over. A manifest missing any of the three raises: the
19
+ * document has no meaningful form without them, and every manifest here carries all three.
20
+ *
21
+ * @param base The CALLER's `import.meta.url`. The package resolves through the graph of the workspace that declares it,
22
+ * which is what `resolve-from` exists for; resolving from here would answer through `@mailwoman/api-kit`'s instead.
23
+ */
24
+ export async function readServedDocumentInfo(base, packageName) {
25
+ const manifest = await readPackageJSON(base, packageName);
26
+ const { name, version, description } = manifest;
27
+ if (!name || !version || !description) {
28
+ throw new Error(`${packageName}/package.json must declare name, version and description for its OpenAPI document`);
29
+ }
30
+ return { title: name, version, description };
31
+ }
11
32
  /**
12
33
  * Split an `OpenAPIDocInfo` into the document's `info` block and its top-level sibling fields.
13
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../lib/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AA0B/D;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAoB;IAC7C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IAE9G,OAAO;QACN,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;QAChE,YAAY;QACZ,OAAO;QACP,IAAI;QACJ,QAAQ;KACR,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAgB,EAAE,IAAoB,EAAE,IAAI,GAAG,eAAe;IAC/F,MAAM,MAAM,GAAwC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAA;IAEnG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAgB,EAAE,IAAoB;IAC1E,MAAM,SAAS,GAAuD;QACrE,OAAO,EAAE,OAAO;QAChB,GAAG,gBAAgB,CAAC,IAAI,CAAC;KACzB,CAAA;IAED,MAAM,SAAS,GAAqD;QACnE,OAAO,EAAE,OAAO;QAChB,GAAG,gBAAgB,CAAC,IAAI,CAAC;KACzB,CAAA;IAED,OAAO;QACN,GAAG,EAAE,GAAG,CAAC,oBAAoB,CAAC,SAAS,CAAC;QACxC,GAAG,EAAE,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC;KACtC,CAAA;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACzC,GAAgB,EAChB,IAAoB,EACpB,OAA0C,EAAE;IAE5C,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACpD,6GAA6G;IAC7G,2BAA2B;IAC3B,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA;IAErE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACzC,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAI,WAAmB,EAAE,MAAS;IAC7D,OAAO;QACN,WAAW;QACX,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,EAAE;KAC3C,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../lib/openapi.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mailwoman/api-kit",
3
- "version": "9.3.0",
3
+ "version": "10.0.0",
4
4
  "description": "API plumbing for Mailwoman's HTTP surfaces — Hono node serve wrapper, OpenAPI emit helpers, shared wire atoms. Plumbing only: domain schemas live with their routes.",
5
5
  "license": "AGPL-3.0-only OR LicenseRef-Commercial",
6
6
  "repository": {
@@ -72,7 +72,7 @@
72
72
  "dependencies": {
73
73
  "@hono/node-server": "^2.1.1",
74
74
  "@hono/zod-openapi": "^1.6.3",
75
- "@mailwoman/core": "9.3.0",
75
+ "@mailwoman/core": "10.0.0",
76
76
  "hono": "^4.13.7",
77
77
  "zod": "^4.5.4"
78
78
  }