vet-sdk-core-ts 0.4.31 → 0.4.33

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.
package/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # VetChain Core SDK
2
2
 
3
+ `vet-sdk-core-ts/place-service-directory` is the VetChain-only bundle boundary
4
+ for claims-first Schema.org `Place` and `Service` resources. It builds GW VET
5
+ batch/search envelopes and joins authorized directory search responses for the
6
+ PetChain marketplace; it does not extend `gdc-*`.
7
+
3
8
  Development and releases follow the mandatory
4
9
  [`local-first TDD and release contract`](docs/LOCAL_FIRST_RELEASE_CONTRACT.md).
5
10
 
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export * from "./animal-onboarding.js";
6
6
  export * from "./reusable-bff.js";
7
7
  export * from "./research-study.js";
8
8
  export * from "./payment.js";
9
+ export * from "./place-service-directory.js";
9
10
  export * from "./health-card-issuance.js";
10
11
  export * from "./secure-clinic-channel.js";
11
12
  export * from "./scheduling.js";
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ export * from "./animal-onboarding.js";
6
6
  export * from "./reusable-bff.js";
7
7
  export * from "./research-study.js";
8
8
  export * from "./payment.js";
9
+ export * from "./place-service-directory.js";
9
10
  export * from "./health-card-issuance.js";
10
11
  export * from "./secure-clinic-channel.js";
11
12
  export * from "./scheduling.js";
@@ -0,0 +1,66 @@
1
+ import { type ClinicMarketplaceResult, type DirectoryFlatClaimsResource, type DirectoryResourceType } from 'vet-data-utils-ts/place-service-directory';
2
+ export type DirectoryBatchMethod = 'POST' | 'PUT';
3
+ /** Builds the claims-first Schema.org Place/Service/Product batch accepted by GW VET. */
4
+ export declare function buildDirectoryBatch(resources: readonly unknown[], method?: DirectoryBatchMethod): Readonly<{
5
+ data: readonly Readonly<{
6
+ type: "Place-schema.org" | "Service-schema.org" | "Product-schema.org";
7
+ resource: Readonly<{
8
+ resourceType: DirectoryResourceType;
9
+ id: string;
10
+ meta: Readonly<{
11
+ claims: Readonly<Record<string, readonly string[]>>;
12
+ }>;
13
+ }>;
14
+ request: Readonly<{
15
+ method: DirectoryBatchMethod;
16
+ url: `Place/${string}` | `Service/${string}` | `Product/${string}`;
17
+ }>;
18
+ }>[];
19
+ }>;
20
+ /** Builds one claims-first directory `_search` envelope. Empty claims list the authorized directory. */
21
+ export declare function buildDirectorySearch(resourceType: DirectoryResourceType, claims?: Readonly<Record<string, unknown>>): Readonly<{
22
+ data: readonly Readonly<{
23
+ resource: Readonly<{
24
+ resourceType: DirectoryResourceType;
25
+ id: string;
26
+ meta: Readonly<{
27
+ claims: Readonly<Record<string, readonly string[]>>;
28
+ }>;
29
+ }>;
30
+ }>[];
31
+ }>;
32
+ /** Reads canonical GW directory matches from `body.data[].resource`. */
33
+ export declare function readDirectorySearch(body: unknown, expectedResourceType: DirectoryResourceType): readonly DirectoryFlatClaimsResource[];
34
+ /** Reads two GW searches and returns the joined, filtered public clinic marketplace. */
35
+ export declare function readClinicMarketplaceSearch(input: Readonly<{
36
+ placesBody: unknown;
37
+ servicesBody: unknown;
38
+ postalCode?: string;
39
+ serviceTypes?: readonly string[];
40
+ near?: Readonly<{
41
+ latitude: number;
42
+ longitude: number;
43
+ radiusKm: number;
44
+ }>;
45
+ }>): readonly ClinicMarketplaceResult[];
46
+ export type OrganizationCatalogRequest = Readonly<{
47
+ operation: 'batch' | 'search';
48
+ resourceType?: DirectoryResourceType;
49
+ envelope: ReturnType<typeof buildDirectoryBatch> | ReturnType<typeof buildDirectorySearch>;
50
+ }>;
51
+ export type OrganizationCatalogTransport = Readonly<{
52
+ execute(request: OrganizationCatalogRequest): Promise<unknown>;
53
+ }>;
54
+ /**
55
+ * Reusable organization catalog manager for care Services and insurance or
56
+ * technology Products. The injected transport owns authentication and the GW
57
+ * route; this manager owns only claims-first envelopes and canonical readback.
58
+ */
59
+ export declare class OrganizationCatalogManager {
60
+ #private;
61
+ constructor(transport: OrganizationCatalogTransport);
62
+ /** Publishes one or more organization offerings through a GW batch. */
63
+ publish(resources: readonly unknown[], method?: DirectoryBatchMethod): Promise<unknown>;
64
+ /** Searches the authorized catalog using governed flat Schema.org claims. */
65
+ search(resourceType: DirectoryResourceType, claims?: Readonly<Record<string, unknown>>): Promise<readonly DirectoryFlatClaimsResource[]>;
66
+ }
@@ -0,0 +1,89 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _OrganizationCatalogManager_transport;
13
+ import { normalizeDirectoryFlatClaimsResource, searchClinicMarketplace, } from 'vet-data-utils-ts/place-service-directory';
14
+ /** Builds the claims-first Schema.org Place/Service/Product batch accepted by GW VET. */
15
+ export function buildDirectoryBatch(resources, method = 'POST') {
16
+ return Object.freeze({ data: Object.freeze(resources.map(candidate => {
17
+ const resource = normalizeDirectoryFlatClaimsResource(candidate);
18
+ return Object.freeze({
19
+ type: `${resource.resourceType}-schema.org`,
20
+ resource,
21
+ request: Object.freeze({ method, url: `${resource.resourceType}/${resource.id}` }),
22
+ });
23
+ })) });
24
+ }
25
+ /** Builds one claims-first directory `_search` envelope. Empty claims list the authorized directory. */
26
+ export function buildDirectorySearch(resourceType, claims = {}) {
27
+ const resource = normalizeDirectoryFlatClaimsResource({ resourceType, id: 'search', meta: { claims } });
28
+ return Object.freeze({ data: Object.freeze([Object.freeze({ resource })]) });
29
+ }
30
+ /** Reads canonical GW directory matches from `body.data[].resource`. */
31
+ export function readDirectorySearch(body, expectedResourceType) {
32
+ if (!body || typeof body !== 'object' || !Array.isArray(body.data))
33
+ throw new TypeError('directory_search_invalid');
34
+ return Object.freeze(body.data.map(entry => {
35
+ if (!entry || typeof entry !== 'object' || !('resource' in entry))
36
+ throw new TypeError('directory_search_resource_invalid');
37
+ try {
38
+ const resource = normalizeDirectoryFlatClaimsResource(entry.resource);
39
+ if (resource.resourceType !== expectedResourceType)
40
+ throw new Error('wrong type');
41
+ return resource;
42
+ }
43
+ catch {
44
+ throw new TypeError('directory_search_resource_invalid');
45
+ }
46
+ }));
47
+ }
48
+ /** Reads two GW searches and returns the joined, filtered public clinic marketplace. */
49
+ export function readClinicMarketplaceSearch(input) {
50
+ return searchClinicMarketplace({
51
+ places: readDirectorySearch(input.placesBody, 'Place'),
52
+ services: readDirectorySearch(input.servicesBody, 'Service'),
53
+ ...(input.postalCode ? { postalCode: input.postalCode } : {}),
54
+ ...(input.serviceTypes ? { serviceTypes: input.serviceTypes } : {}),
55
+ ...(input.near ? { near: input.near } : {}),
56
+ });
57
+ }
58
+ /**
59
+ * Reusable organization catalog manager for care Services and insurance or
60
+ * technology Products. The injected transport owns authentication and the GW
61
+ * route; this manager owns only claims-first envelopes and canonical readback.
62
+ */
63
+ export class OrganizationCatalogManager {
64
+ constructor(transport) {
65
+ _OrganizationCatalogManager_transport.set(this, void 0);
66
+ if (!transport || typeof transport.execute !== 'function')
67
+ throw new TypeError('organization_catalog_transport_invalid');
68
+ __classPrivateFieldSet(this, _OrganizationCatalogManager_transport, transport, "f");
69
+ }
70
+ /** Publishes one or more organization offerings through a GW batch. */
71
+ async publish(resources, method = 'POST') {
72
+ const envelope = buildDirectoryBatch(resources, method);
73
+ if (!envelope.data.length)
74
+ throw new TypeError('organization_catalog_resources_required');
75
+ return __classPrivateFieldGet(this, _OrganizationCatalogManager_transport, "f").execute(Object.freeze({ operation: 'batch', envelope }));
76
+ }
77
+ /** Searches the authorized catalog using governed flat Schema.org claims. */
78
+ async search(resourceType, claims = {}) {
79
+ const envelope = buildDirectorySearch(resourceType, claims);
80
+ const response = await __classPrivateFieldGet(this, _OrganizationCatalogManager_transport, "f").execute(Object.freeze({ operation: 'search', resourceType, envelope }));
81
+ return readDirectorySearch(responseBody(response), resourceType);
82
+ }
83
+ }
84
+ _OrganizationCatalogManager_transport = new WeakMap();
85
+ function responseBody(value) {
86
+ if (value && typeof value === 'object' && 'body' in value)
87
+ return value.body;
88
+ return value;
89
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vet-sdk-core-ts",
3
- "version": "0.4.31",
3
+ "version": "0.4.33",
4
4
  "description": "Browser-safe VetChain core contracts and governed animal species identifiers",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Connecting Solution & Applications Ltd",
@@ -44,6 +44,10 @@
44
44
  "types": "./dist/payment.d.ts",
45
45
  "default": "./dist/payment.js"
46
46
  },
47
+ "./place-service-directory": {
48
+ "types": "./dist/place-service-directory.d.ts",
49
+ "default": "./dist/place-service-directory.js"
50
+ },
47
51
  "./health-card-issuance": {
48
52
  "types": "./dist/health-card-issuance.d.ts",
49
53
  "default": "./dist/health-card-issuance.js"
@@ -81,6 +85,6 @@
81
85
  "@noble/hashes": "^2.2.0",
82
86
  "@noble/post-quantum": "0.5.4",
83
87
  "gdc-common-utils-ts": "2.9.10",
84
- "vet-data-utils-ts": "0.5.20"
88
+ "vet-data-utils-ts": "0.5.22"
85
89
  }
86
90
  }