@haddowg/json-api-client 1.2.0 → 1.3.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.
package/dist/ajv.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as Validator, n as SchemaMap } from "./validate-DgCUbzgT.cjs";
1
+ import { a as Validator, n as SchemaMap } from "./validate-CJPivkqT.cjs";
2
2
  import { ValidateFunction } from "ajv";
3
3
 
4
4
  //#region src/ajv.d.ts
package/dist/ajv.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as Validator, n as SchemaMap } from "./validate-DgCUbzgT.mjs";
1
+ import { a as Validator, n as SchemaMap } from "./validate-CJPivkqT.mjs";
2
2
  import { ValidateFunction } from "ajv";
3
3
 
4
4
  //#region src/ajv.d.ts
package/dist/index.cjs CHANGED
@@ -1020,6 +1020,18 @@ const fetchTransport = async (req) => {
1020
1020
  /** Substitute `{key}` placeholders in a path template (`/albums/{id}/{rel}` -> `/albums/1/tracks`). */
1021
1021
  const fill = (template, vars) => template.replace(/\{(\w+)\}/g, (_, key) => vars[key] ?? `{${key}}`);
1022
1022
  /**
1023
+ * Fill a type's path template, putting a relation's URI segment (its `uriField`, else its name)
1024
+ * in place of `{rel}`. `vars.rel` stays the relation's name everywhere else.
1025
+ */
1026
+ function fillPath(ctx, type, template, vars) {
1027
+ const rel = vars["rel"];
1028
+ const uriField = rel === void 0 ? void 0 : ctx.descriptor[type]?.relations[rel]?.uriField;
1029
+ return fill(template, uriField === void 0 ? vars : {
1030
+ ...vars,
1031
+ rel: uriField
1032
+ });
1033
+ }
1034
+ /**
1023
1035
  * Run an operation: resolve the path template from the type's descriptor, fill its
1024
1036
  * placeholders, execute, and materialise the resulting document. A no-body / 204 response
1025
1037
  * materialises to `undefined`; an operation the type does not declare (no path template) throws
@@ -1032,7 +1044,7 @@ async function run(ctx, type, operation, vars, query, linkage = false, relationF
1032
1044
  if (template === void 0) throw new Error(`No "${operation}" path declared for type "${type}"`);
1033
1045
  const req = {
1034
1046
  method: "GET",
1035
- path: fill(template, vars)
1047
+ path: fillPath(ctx, type, template, vars)
1036
1048
  };
1037
1049
  if (query !== void 0) {
1038
1050
  const { signal, ...params } = query;
@@ -1082,7 +1094,7 @@ async function runWrite(ctx, spec) {
1082
1094
  if (template === void 0) throw new Error(`No "${spec.operation}" path declared for type "${spec.type}"`);
1083
1095
  const req = {
1084
1096
  method: spec.method,
1085
- path: fill(template, spec.vars),
1097
+ path: fillPath(ctx, spec.type, template, spec.vars),
1086
1098
  body: spec.body
1087
1099
  };
1088
1100
  if (spec.query !== void 0) req.query = spec.query;
@@ -1181,8 +1193,9 @@ function relationshipAccessor(ctx, type, id, rel) {
1181
1193
  return mutations === void 0 ? true : mutations[verb] === true;
1182
1194
  };
1183
1195
  const accessor = {};
1184
- if (relation?.relationship !== false) accessor["get"] = (query) => run(ctx, type, "fetchRelationship", vars, query, true, rel);
1185
- if (relation?.related !== false) accessor["related"] = (query) => run(ctx, type, "fetchRelated", vars, query, false, rel);
1196
+ const readable = relation?.writeOnly !== true;
1197
+ if (readable && relation?.relationship !== false) accessor["get"] = (query) => run(ctx, type, "fetchRelationship", vars, query, true, rel);
1198
+ if (readable && relation?.related !== false) accessor["related"] = (query) => run(ctx, type, "fetchRelated", vars, query, false, rel);
1186
1199
  if (cardinality === "many") {
1187
1200
  if (advertises("add")) accessor["add"] = (refs) => mutate("POST", refs);
1188
1201
  if (advertises("remove")) accessor["remove"] = (refs) => mutate("DELETE", refs);
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as ResourceAccessors, $t as ActionInput, A as DefaultActionTypes, At as Edge, B as IdentifierMember, Bt as CANONICAL_PAGE_KEYS, C as fetchTransport, Ct as JSON_API_MEDIA_TYPE, D as Collection, Dt as mediaType, E as Client, Et as ResourceIdentifier, F as FieldSelectionMap, Ft as ResourceEnvelope, G as MemberName, Gt as PageMeta, H as IncludedRelations, Ht as Page, I as FieldsMap, It as ResourceLinks, J as RelationName, Jt as PageParamsOf, K as PivotInput, Kt as PageOf, L as FilterKey, Lt as materialise, M as DefaultWriteAttributes, Mt as MaterialiseContext, N as EdgeMembers, Nt as NavigateOptions, O as CountToken, Ot as ArrayEnvelope, P as ErrorCodeOf, Pt as RelationView, Q as RelationshipAccessor, Qt as ActionDescriptor, R as FilterQuery, Rt as relatedPaginator, S as TransportResponse, St as ATOMIC_MEDIA_TYPE, T as AtomicResultOf, Tt as MediaTypeParams, U as LinkageRef, Ut as PageKeys, V as IncludePath, Vt as ExactPageParams, W as ListPageParams, Wt as PageLinks, X as RelationPaginator, Xt as TypedPage, Y as RelationPageParams, Yt as ResolvedPaginator, Z as RelationReadQuery, Zt as resolvePaginator, _ as HANDLE_RESERVED, _t as AtomicResults, a as Validator, an as ClientIdPolicy, at as TypeAccessor, b as JsonApiTransport, bt as runAtomic, c as resolveValidator, cn as PaginatorDescriptor, ct as UpdateInput, d as JsonApiContext, dn as PaginatorStrategy, dt as AtomicCreateInput, en as ActionOutput, et as ResourceHandle, f as JsonApiRequest, fn as RelationDescriptor, ft as AtomicDeleteHandle, g as ClientOptions, gt as AtomicResult, h as serializeQuery, hn as StrategyDescriptor, ht as AtomicRef, i as ValidationOption, in as Cardinality, it as SortToken, j as DefaultAttributes, jt as EdgeEnvelope, k as CreateInput, kt as DocumentEnvelope, l as validateDocument, ln as PaginatorKind, lt as WriteOptions, m as execute, mn as ResourceDescriptor, mt as AtomicRecorder, n as SchemaMap, nn as ApiDescriptor, nt as SingleReadQuery, o as WireResource, on as CountableDescriptor, ot as TypeName, p as ReadQuery, pn as RelationMutations, pt as AtomicHandle, q as ReadResult, qt as PageParams, r as ValidationConfig, rn as AtomicDescriptor, rt as SortQuery, s as assertJsonApiDocument, sn as MenuDescriptor, st as TypedReadQuery, t as ResolvedValidator, tn as ActionScope, tt as ResourceObjectView, u as Document, un as PaginatorRole, ut as AtomicCreateHandle, v as HeadersInit, vt as AtomicUpdateHandle, w as ActionsAccessor, wt as LocalIdentifier, x as TransportRequest, xt as ATOMIC_EXT, y as createClient, yt as AtomicUpdateInput, z as HydratedMember, zt as relatedPaginatorKind } from "./validate-DgCUbzgT.cjs";
1
+ import { $ as RelationshipAccessor, $t as ActionDescriptor, A as DefaultActionTypes, At as DocumentEnvelope, B as IdentifierMember, Bt as relatedPaginatorKind, C as fetchTransport, Ct as ATOMIC_MEDIA_TYPE, D as Collection, Dt as ResourceIdentifier, E as Client, Et as MediaTypeParams, F as FieldSelectionMap, Ft as RelationView, G as MemberName, Gt as PageLinks, H as IncludedRelations, Ht as ExactPageParams, I as FieldsMap, It as ResourceEnvelope, J as ReadableRelationName, Jt as PageParams, K as PivotInput, Kt as PageMeta, L as FilterKey, Lt as ResourceLinks, M as DefaultWriteAttributes, Mt as EdgeEnvelope, N as EdgeMembers, Nt as MaterialiseContext, O as CountToken, Ot as mediaType, P as ErrorCodeOf, Pt as NavigateOptions, Q as RelationReadQuery, Qt as resolvePaginator, R as FilterQuery, Rt as materialise, S as TransportResponse, St as ATOMIC_EXT, T as AtomicResultOf, Tt as LocalIdentifier, U as LinkageRef, Ut as Page, V as IncludePath, Vt as CANONICAL_PAGE_KEYS, W as ListPageParams, Wt as PageKeys, X as RelationPageParams, Xt as ResolvedPaginator, Y as RelationName, Yt as PageParamsOf, Z as RelationPaginator, Zt as TypedPage, _ as HANDLE_RESERVED, _n as StrategyDescriptor, _t as AtomicResult, a as Validator, an as Cardinality, at as SortToken, b as JsonApiTransport, bt as AtomicUpdateInput, c as resolveValidator, cn as MenuDescriptor, ct as TypedReadQuery, d as JsonApiContext, dn as PaginatorRole, dt as AtomicCreateHandle, en as ActionInput, et as ResourceAccessors, f as JsonApiRequest, fn as PaginatorStrategy, ft as AtomicCreateInput, g as ClientOptions, gn as ResourceDescriptor, gt as AtomicRef, h as serializeQuery, hn as RelationMutations, ht as AtomicRecorder, i as ValidationOption, in as AtomicDescriptor, it as SortQuery, j as DefaultAttributes, jt as Edge, k as CreateInput, kt as ArrayEnvelope, l as validateDocument, ln as PaginatorDescriptor, lt as UpdateInput, m as execute, mn as RelationDescriptor, mt as AtomicHandle, n as SchemaMap, nn as ActionScope, nt as ResourceObjectView, o as WireResource, on as ClientIdPolicy, ot as TypeAccessor, p as ReadQuery, pn as PivotDescriptor, pt as AtomicDeleteHandle, q as ReadResult, qt as PageOf, r as ValidationConfig, rn as ApiDescriptor, rt as SingleReadQuery, s as assertJsonApiDocument, sn as CountableDescriptor, st as TypeName, t as ResolvedValidator, tn as ActionOutput, tt as ResourceHandle, u as Document, un as PaginatorKind, ut as WriteOptions, v as HeadersInit, vt as AtomicResults, w as ActionsAccessor, wt as JSON_API_MEDIA_TYPE, x as TransportRequest, xt as runAtomic, y as createClient, yt as AtomicUpdateHandle, z as HydratedMember, zt as relatedPaginator } from "./validate-CJPivkqT.cjs";
2
2
 
3
3
  //#region src/errors.d.ts
4
4
  /**
@@ -216,5 +216,5 @@ declare function withRemappedRelationshipPaths(error: JsonApiError, rel: string,
216
216
  */
217
217
  declare function withRemappedAtomicPaths(error: JsonApiError, descriptor: ApiDescriptor, typeForOp: (opIndex: number) => string | undefined): JsonApiError;
218
218
  //#endregion
219
- export { ATOMIC_EXT, ATOMIC_MEDIA_TYPE, ActionDescriptor, ActionInput, ActionOutput, ActionScope, ActionsAccessor, ApiDescriptor, ArrayEnvelope, AtomicCreateHandle, AtomicCreateInput, AtomicDeleteHandle, AtomicDescriptor, AtomicHandle, AtomicRecorder, AtomicRef, AtomicResult, AtomicResultOf, AtomicResults, AtomicUpdateHandle, AtomicUpdateInput, CANONICAL_PAGE_KEYS, Cardinality, Client, ClientIdPolicy, ClientOptions, Collection, CountToken, CountableDescriptor, CreateInput, DefaultActionTypes, DefaultAttributes, DefaultWriteAttributes, Document, DocumentEnvelope, Edge, EdgeEnvelope, EdgeMembers, ErrorCodeGuard, ErrorCodeOf, ExactPageParams, FieldSelectionMap, FieldsMap, FilterKey, FilterQuery, HANDLE_RESERVED, HeadersInit, HydratedMember, IdentifierMember, IncludePath, IncludedRelations, JSON_API_MEDIA_TYPE, JsonApiContext, JsonApiError, JsonApiErrorObject, JsonApiRequest, JsonApiTransport, LinkageRef, ListPageParams, LocalIdentifier, MaterialiseContext, MediaTypeParams, MemberName, MenuDescriptor, NavigateOptions, Page, PageKeys, PageLinks, PageMeta, PageOf, PageParams, PageParamsOf, PaginatorDescriptor, PaginatorKind, PaginatorRole, PaginatorStrategy, PivotInput, ReadQuery, ReadResult, RelationDescriptor, RelationMutations, RelationName, RelationPageParams, RelationPaginator, RelationReadQuery, RelationView, RelationshipAccessor, RelationshipDocument, ResolvedPaginator, ResolvedValidator, ResourceAccessors, ResourceDescriptor, ResourceEnvelope, ResourceHandle, ResourceIdentifier, ResourceLinks, ResourceObjectView, SchemaMap, SingleReadQuery, SortQuery, SortToken, StrategyDescriptor, StructuralGuardError, ToDocumentOptions, TransportRequest, TransportResponse, TypeAccessor, TypeName, TypedPage, TypedReadQuery, UpdateInput, ValidationConfig, ValidationOption, Validator, WireResource, WriteDocument, WriteOptions, assertJsonApiDocument, createClient, execute, fetchTransport, hasErrorCode, materialise, mediaType, relatedPaginator, relatedPaginatorKind, remapPointer, remapRelationshipPointer, resolvePaginator, resolveValidator, runAtomic, serializeQuery, toDocument, toRelationshipDocument, validateDocument, withRemappedAtomicPaths, withRemappedPaths, withRemappedRelationshipPaths };
219
+ export { ATOMIC_EXT, ATOMIC_MEDIA_TYPE, ActionDescriptor, ActionInput, ActionOutput, ActionScope, ActionsAccessor, ApiDescriptor, ArrayEnvelope, AtomicCreateHandle, AtomicCreateInput, AtomicDeleteHandle, AtomicDescriptor, AtomicHandle, AtomicRecorder, AtomicRef, AtomicResult, AtomicResultOf, AtomicResults, AtomicUpdateHandle, AtomicUpdateInput, CANONICAL_PAGE_KEYS, Cardinality, Client, ClientIdPolicy, ClientOptions, Collection, CountToken, CountableDescriptor, CreateInput, DefaultActionTypes, DefaultAttributes, DefaultWriteAttributes, Document, DocumentEnvelope, Edge, EdgeEnvelope, EdgeMembers, ErrorCodeGuard, ErrorCodeOf, ExactPageParams, FieldSelectionMap, FieldsMap, FilterKey, FilterQuery, HANDLE_RESERVED, HeadersInit, HydratedMember, IdentifierMember, IncludePath, IncludedRelations, JSON_API_MEDIA_TYPE, JsonApiContext, JsonApiError, JsonApiErrorObject, JsonApiRequest, JsonApiTransport, LinkageRef, ListPageParams, LocalIdentifier, MaterialiseContext, MediaTypeParams, MemberName, MenuDescriptor, NavigateOptions, Page, PageKeys, PageLinks, PageMeta, PageOf, PageParams, PageParamsOf, PaginatorDescriptor, PaginatorKind, PaginatorRole, PaginatorStrategy, PivotDescriptor, PivotInput, ReadQuery, ReadResult, ReadableRelationName, RelationDescriptor, RelationMutations, RelationName, RelationPageParams, RelationPaginator, RelationReadQuery, RelationView, RelationshipAccessor, RelationshipDocument, ResolvedPaginator, ResolvedValidator, ResourceAccessors, ResourceDescriptor, ResourceEnvelope, ResourceHandle, ResourceIdentifier, ResourceLinks, ResourceObjectView, SchemaMap, SingleReadQuery, SortQuery, SortToken, StrategyDescriptor, StructuralGuardError, ToDocumentOptions, TransportRequest, TransportResponse, TypeAccessor, TypeName, TypedPage, TypedReadQuery, UpdateInput, ValidationConfig, ValidationOption, Validator, WireResource, WriteDocument, WriteOptions, assertJsonApiDocument, createClient, execute, fetchTransport, hasErrorCode, materialise, mediaType, relatedPaginator, relatedPaginatorKind, remapPointer, remapRelationshipPointer, resolvePaginator, resolveValidator, runAtomic, serializeQuery, toDocument, toRelationshipDocument, validateDocument, withRemappedAtomicPaths, withRemappedPaths, withRemappedRelationshipPaths };
220
220
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as ResourceAccessors, $t as ActionInput, A as DefaultActionTypes, At as Edge, B as IdentifierMember, Bt as CANONICAL_PAGE_KEYS, C as fetchTransport, Ct as JSON_API_MEDIA_TYPE, D as Collection, Dt as mediaType, E as Client, Et as ResourceIdentifier, F as FieldSelectionMap, Ft as ResourceEnvelope, G as MemberName, Gt as PageMeta, H as IncludedRelations, Ht as Page, I as FieldsMap, It as ResourceLinks, J as RelationName, Jt as PageParamsOf, K as PivotInput, Kt as PageOf, L as FilterKey, Lt as materialise, M as DefaultWriteAttributes, Mt as MaterialiseContext, N as EdgeMembers, Nt as NavigateOptions, O as CountToken, Ot as ArrayEnvelope, P as ErrorCodeOf, Pt as RelationView, Q as RelationshipAccessor, Qt as ActionDescriptor, R as FilterQuery, Rt as relatedPaginator, S as TransportResponse, St as ATOMIC_MEDIA_TYPE, T as AtomicResultOf, Tt as MediaTypeParams, U as LinkageRef, Ut as PageKeys, V as IncludePath, Vt as ExactPageParams, W as ListPageParams, Wt as PageLinks, X as RelationPaginator, Xt as TypedPage, Y as RelationPageParams, Yt as ResolvedPaginator, Z as RelationReadQuery, Zt as resolvePaginator, _ as HANDLE_RESERVED, _t as AtomicResults, a as Validator, an as ClientIdPolicy, at as TypeAccessor, b as JsonApiTransport, bt as runAtomic, c as resolveValidator, cn as PaginatorDescriptor, ct as UpdateInput, d as JsonApiContext, dn as PaginatorStrategy, dt as AtomicCreateInput, en as ActionOutput, et as ResourceHandle, f as JsonApiRequest, fn as RelationDescriptor, ft as AtomicDeleteHandle, g as ClientOptions, gt as AtomicResult, h as serializeQuery, hn as StrategyDescriptor, ht as AtomicRef, i as ValidationOption, in as Cardinality, it as SortToken, j as DefaultAttributes, jt as EdgeEnvelope, k as CreateInput, kt as DocumentEnvelope, l as validateDocument, ln as PaginatorKind, lt as WriteOptions, m as execute, mn as ResourceDescriptor, mt as AtomicRecorder, n as SchemaMap, nn as ApiDescriptor, nt as SingleReadQuery, o as WireResource, on as CountableDescriptor, ot as TypeName, p as ReadQuery, pn as RelationMutations, pt as AtomicHandle, q as ReadResult, qt as PageParams, r as ValidationConfig, rn as AtomicDescriptor, rt as SortQuery, s as assertJsonApiDocument, sn as MenuDescriptor, st as TypedReadQuery, t as ResolvedValidator, tn as ActionScope, tt as ResourceObjectView, u as Document, un as PaginatorRole, ut as AtomicCreateHandle, v as HeadersInit, vt as AtomicUpdateHandle, w as ActionsAccessor, wt as LocalIdentifier, x as TransportRequest, xt as ATOMIC_EXT, y as createClient, yt as AtomicUpdateInput, z as HydratedMember, zt as relatedPaginatorKind } from "./validate-DgCUbzgT.mjs";
1
+ import { $ as RelationshipAccessor, $t as ActionDescriptor, A as DefaultActionTypes, At as DocumentEnvelope, B as IdentifierMember, Bt as relatedPaginatorKind, C as fetchTransport, Ct as ATOMIC_MEDIA_TYPE, D as Collection, Dt as ResourceIdentifier, E as Client, Et as MediaTypeParams, F as FieldSelectionMap, Ft as RelationView, G as MemberName, Gt as PageLinks, H as IncludedRelations, Ht as ExactPageParams, I as FieldsMap, It as ResourceEnvelope, J as ReadableRelationName, Jt as PageParams, K as PivotInput, Kt as PageMeta, L as FilterKey, Lt as ResourceLinks, M as DefaultWriteAttributes, Mt as EdgeEnvelope, N as EdgeMembers, Nt as MaterialiseContext, O as CountToken, Ot as mediaType, P as ErrorCodeOf, Pt as NavigateOptions, Q as RelationReadQuery, Qt as resolvePaginator, R as FilterQuery, Rt as materialise, S as TransportResponse, St as ATOMIC_EXT, T as AtomicResultOf, Tt as LocalIdentifier, U as LinkageRef, Ut as Page, V as IncludePath, Vt as CANONICAL_PAGE_KEYS, W as ListPageParams, Wt as PageKeys, X as RelationPageParams, Xt as ResolvedPaginator, Y as RelationName, Yt as PageParamsOf, Z as RelationPaginator, Zt as TypedPage, _ as HANDLE_RESERVED, _n as StrategyDescriptor, _t as AtomicResult, a as Validator, an as Cardinality, at as SortToken, b as JsonApiTransport, bt as AtomicUpdateInput, c as resolveValidator, cn as MenuDescriptor, ct as TypedReadQuery, d as JsonApiContext, dn as PaginatorRole, dt as AtomicCreateHandle, en as ActionInput, et as ResourceAccessors, f as JsonApiRequest, fn as PaginatorStrategy, ft as AtomicCreateInput, g as ClientOptions, gn as ResourceDescriptor, gt as AtomicRef, h as serializeQuery, hn as RelationMutations, ht as AtomicRecorder, i as ValidationOption, in as AtomicDescriptor, it as SortQuery, j as DefaultAttributes, jt as Edge, k as CreateInput, kt as ArrayEnvelope, l as validateDocument, ln as PaginatorDescriptor, lt as UpdateInput, m as execute, mn as RelationDescriptor, mt as AtomicHandle, n as SchemaMap, nn as ActionScope, nt as ResourceObjectView, o as WireResource, on as ClientIdPolicy, ot as TypeAccessor, p as ReadQuery, pn as PivotDescriptor, pt as AtomicDeleteHandle, q as ReadResult, qt as PageOf, r as ValidationConfig, rn as ApiDescriptor, rt as SingleReadQuery, s as assertJsonApiDocument, sn as CountableDescriptor, st as TypeName, t as ResolvedValidator, tn as ActionOutput, tt as ResourceHandle, u as Document, un as PaginatorKind, ut as WriteOptions, v as HeadersInit, vt as AtomicResults, w as ActionsAccessor, wt as JSON_API_MEDIA_TYPE, x as TransportRequest, xt as runAtomic, y as createClient, yt as AtomicUpdateHandle, z as HydratedMember, zt as relatedPaginator } from "./validate-CJPivkqT.mjs";
2
2
 
3
3
  //#region src/errors.d.ts
4
4
  /**
@@ -216,5 +216,5 @@ declare function withRemappedRelationshipPaths(error: JsonApiError, rel: string,
216
216
  */
217
217
  declare function withRemappedAtomicPaths(error: JsonApiError, descriptor: ApiDescriptor, typeForOp: (opIndex: number) => string | undefined): JsonApiError;
218
218
  //#endregion
219
- export { ATOMIC_EXT, ATOMIC_MEDIA_TYPE, ActionDescriptor, ActionInput, ActionOutput, ActionScope, ActionsAccessor, ApiDescriptor, ArrayEnvelope, AtomicCreateHandle, AtomicCreateInput, AtomicDeleteHandle, AtomicDescriptor, AtomicHandle, AtomicRecorder, AtomicRef, AtomicResult, AtomicResultOf, AtomicResults, AtomicUpdateHandle, AtomicUpdateInput, CANONICAL_PAGE_KEYS, Cardinality, Client, ClientIdPolicy, ClientOptions, Collection, CountToken, CountableDescriptor, CreateInput, DefaultActionTypes, DefaultAttributes, DefaultWriteAttributes, Document, DocumentEnvelope, Edge, EdgeEnvelope, EdgeMembers, ErrorCodeGuard, ErrorCodeOf, ExactPageParams, FieldSelectionMap, FieldsMap, FilterKey, FilterQuery, HANDLE_RESERVED, HeadersInit, HydratedMember, IdentifierMember, IncludePath, IncludedRelations, JSON_API_MEDIA_TYPE, JsonApiContext, JsonApiError, JsonApiErrorObject, JsonApiRequest, JsonApiTransport, LinkageRef, ListPageParams, LocalIdentifier, MaterialiseContext, MediaTypeParams, MemberName, MenuDescriptor, NavigateOptions, Page, PageKeys, PageLinks, PageMeta, PageOf, PageParams, PageParamsOf, PaginatorDescriptor, PaginatorKind, PaginatorRole, PaginatorStrategy, PivotInput, ReadQuery, ReadResult, RelationDescriptor, RelationMutations, RelationName, RelationPageParams, RelationPaginator, RelationReadQuery, RelationView, RelationshipAccessor, RelationshipDocument, ResolvedPaginator, ResolvedValidator, ResourceAccessors, ResourceDescriptor, ResourceEnvelope, ResourceHandle, ResourceIdentifier, ResourceLinks, ResourceObjectView, SchemaMap, SingleReadQuery, SortQuery, SortToken, StrategyDescriptor, StructuralGuardError, ToDocumentOptions, TransportRequest, TransportResponse, TypeAccessor, TypeName, TypedPage, TypedReadQuery, UpdateInput, ValidationConfig, ValidationOption, Validator, WireResource, WriteDocument, WriteOptions, assertJsonApiDocument, createClient, execute, fetchTransport, hasErrorCode, materialise, mediaType, relatedPaginator, relatedPaginatorKind, remapPointer, remapRelationshipPointer, resolvePaginator, resolveValidator, runAtomic, serializeQuery, toDocument, toRelationshipDocument, validateDocument, withRemappedAtomicPaths, withRemappedPaths, withRemappedRelationshipPaths };
219
+ export { ATOMIC_EXT, ATOMIC_MEDIA_TYPE, ActionDescriptor, ActionInput, ActionOutput, ActionScope, ActionsAccessor, ApiDescriptor, ArrayEnvelope, AtomicCreateHandle, AtomicCreateInput, AtomicDeleteHandle, AtomicDescriptor, AtomicHandle, AtomicRecorder, AtomicRef, AtomicResult, AtomicResultOf, AtomicResults, AtomicUpdateHandle, AtomicUpdateInput, CANONICAL_PAGE_KEYS, Cardinality, Client, ClientIdPolicy, ClientOptions, Collection, CountToken, CountableDescriptor, CreateInput, DefaultActionTypes, DefaultAttributes, DefaultWriteAttributes, Document, DocumentEnvelope, Edge, EdgeEnvelope, EdgeMembers, ErrorCodeGuard, ErrorCodeOf, ExactPageParams, FieldSelectionMap, FieldsMap, FilterKey, FilterQuery, HANDLE_RESERVED, HeadersInit, HydratedMember, IdentifierMember, IncludePath, IncludedRelations, JSON_API_MEDIA_TYPE, JsonApiContext, JsonApiError, JsonApiErrorObject, JsonApiRequest, JsonApiTransport, LinkageRef, ListPageParams, LocalIdentifier, MaterialiseContext, MediaTypeParams, MemberName, MenuDescriptor, NavigateOptions, Page, PageKeys, PageLinks, PageMeta, PageOf, PageParams, PageParamsOf, PaginatorDescriptor, PaginatorKind, PaginatorRole, PaginatorStrategy, PivotDescriptor, PivotInput, ReadQuery, ReadResult, ReadableRelationName, RelationDescriptor, RelationMutations, RelationName, RelationPageParams, RelationPaginator, RelationReadQuery, RelationView, RelationshipAccessor, RelationshipDocument, ResolvedPaginator, ResolvedValidator, ResourceAccessors, ResourceDescriptor, ResourceEnvelope, ResourceHandle, ResourceIdentifier, ResourceLinks, ResourceObjectView, SchemaMap, SingleReadQuery, SortQuery, SortToken, StrategyDescriptor, StructuralGuardError, ToDocumentOptions, TransportRequest, TransportResponse, TypeAccessor, TypeName, TypedPage, TypedReadQuery, UpdateInput, ValidationConfig, ValidationOption, Validator, WireResource, WriteDocument, WriteOptions, assertJsonApiDocument, createClient, execute, fetchTransport, hasErrorCode, materialise, mediaType, relatedPaginator, relatedPaginatorKind, remapPointer, remapRelationshipPointer, resolvePaginator, resolveValidator, runAtomic, serializeQuery, toDocument, toRelationshipDocument, validateDocument, withRemappedAtomicPaths, withRemappedPaths, withRemappedRelationshipPaths };
220
220
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1019,6 +1019,18 @@ const fetchTransport = async (req) => {
1019
1019
  /** Substitute `{key}` placeholders in a path template (`/albums/{id}/{rel}` -> `/albums/1/tracks`). */
1020
1020
  const fill = (template, vars) => template.replace(/\{(\w+)\}/g, (_, key) => vars[key] ?? `{${key}}`);
1021
1021
  /**
1022
+ * Fill a type's path template, putting a relation's URI segment (its `uriField`, else its name)
1023
+ * in place of `{rel}`. `vars.rel` stays the relation's name everywhere else.
1024
+ */
1025
+ function fillPath(ctx, type, template, vars) {
1026
+ const rel = vars["rel"];
1027
+ const uriField = rel === void 0 ? void 0 : ctx.descriptor[type]?.relations[rel]?.uriField;
1028
+ return fill(template, uriField === void 0 ? vars : {
1029
+ ...vars,
1030
+ rel: uriField
1031
+ });
1032
+ }
1033
+ /**
1022
1034
  * Run an operation: resolve the path template from the type's descriptor, fill its
1023
1035
  * placeholders, execute, and materialise the resulting document. A no-body / 204 response
1024
1036
  * materialises to `undefined`; an operation the type does not declare (no path template) throws
@@ -1031,7 +1043,7 @@ async function run(ctx, type, operation, vars, query, linkage = false, relationF
1031
1043
  if (template === void 0) throw new Error(`No "${operation}" path declared for type "${type}"`);
1032
1044
  const req = {
1033
1045
  method: "GET",
1034
- path: fill(template, vars)
1046
+ path: fillPath(ctx, type, template, vars)
1035
1047
  };
1036
1048
  if (query !== void 0) {
1037
1049
  const { signal, ...params } = query;
@@ -1081,7 +1093,7 @@ async function runWrite(ctx, spec) {
1081
1093
  if (template === void 0) throw new Error(`No "${spec.operation}" path declared for type "${spec.type}"`);
1082
1094
  const req = {
1083
1095
  method: spec.method,
1084
- path: fill(template, spec.vars),
1096
+ path: fillPath(ctx, spec.type, template, spec.vars),
1085
1097
  body: spec.body
1086
1098
  };
1087
1099
  if (spec.query !== void 0) req.query = spec.query;
@@ -1180,8 +1192,9 @@ function relationshipAccessor(ctx, type, id, rel) {
1180
1192
  return mutations === void 0 ? true : mutations[verb] === true;
1181
1193
  };
1182
1194
  const accessor = {};
1183
- if (relation?.relationship !== false) accessor["get"] = (query) => run(ctx, type, "fetchRelationship", vars, query, true, rel);
1184
- if (relation?.related !== false) accessor["related"] = (query) => run(ctx, type, "fetchRelated", vars, query, false, rel);
1195
+ const readable = relation?.writeOnly !== true;
1196
+ if (readable && relation?.relationship !== false) accessor["get"] = (query) => run(ctx, type, "fetchRelationship", vars, query, true, rel);
1197
+ if (readable && relation?.related !== false) accessor["related"] = (query) => run(ctx, type, "fetchRelated", vars, query, false, rel);
1185
1198
  if (cardinality === "many") {
1186
1199
  if (advertises("add")) accessor["add"] = (refs) => mutate("POST", refs);
1187
1200
  if (advertises("remove")) accessor["remove"] = (refs) => mutate("DELETE", refs);