@codewheel/jsonapi-frontend-client 1.0.5 → 1.0.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.
package/README.md CHANGED
@@ -24,6 +24,22 @@ if (resolved.resolved && resolved.kind === "entity") {
24
24
  }
25
25
  ```
26
26
 
27
+ ## Layout Builder (optional)
28
+
29
+ If you install the `jsonapi_frontend_layout` add-on module, you can resolve a path and (when applicable) receive a normalized Layout Builder tree:
30
+
31
+ ```ts
32
+ import { resolvePathWithLayout, fetchJsonApi } from "@codewheel/jsonapi-frontend-client"
33
+
34
+ const resolved = await resolvePathWithLayout("/about-us")
35
+ if (resolved.resolved && resolved.kind === "entity") {
36
+ const doc = await fetchJsonApi(resolved.jsonapi_url)
37
+ if (resolved.layout) {
38
+ console.log(resolved.layout.sections)
39
+ }
40
+ }
41
+ ```
42
+
27
43
  ## Astro / Vite (`import.meta.env`)
28
44
 
29
45
  ```ts
@@ -81,6 +97,17 @@ const paths = routes.map((r) => r.path)
81
97
 
82
98
  Keep `ROUTES_FEED_SECRET` server-side only (build environment variables). Do not expose it to browsers.
83
99
 
100
+ ## Menus (optional)
101
+
102
+ If you install the `jsonapi_frontend_menu` add-on module, you can fetch a ready-to-render tree:
103
+
104
+ ```ts
105
+ import { fetchMenu } from "@codewheel/jsonapi-frontend-client"
106
+
107
+ const menu = await fetchMenu("main", { path: "/about-us" })
108
+ console.log(menu.data)
109
+ ```
110
+
84
111
  ## Query building (optional)
85
112
 
86
113
  This client doesn’t require a query builder, but `drupal-jsonapi-params` works well:
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
- export { resolvePath } from "./resolve.js";
1
+ export { resolvePath, resolvePathWithLayout } from "./resolve.js";
2
2
  export { fetchJsonApi, fetchView } from "./fetch.js";
3
3
  export { fetchRoutesPage, iterateRoutes, collectRoutes } from "./routes.js";
4
+ export { fetchMenu } from "./menu.js";
4
5
  export { getDrupalBaseUrl, resolveFileUrl, getFileUrl, getImageStyleUrl } from "./url.js";
5
6
  export { findIncluded, findIncludedByRelationship, findIncludedByRelationshipMultiple, extractImageFromFile, extractMedia, extractMediaField, extractPrimaryImage, extractEmbeddedMediaUuids, parseDrupalMediaTag, } from "./media.js";
6
- export type { ResolveResponse, RoutesFeedItem, RoutesFeedResponse, JsonApiDocument, JsonApiResource, JsonApiRelationship, JsonApiLinks, NodeAttributes, } from "./types.js";
7
+ export type { ResolveResponse, LayoutResolveResponse, LayoutTree, LayoutSection, LayoutComponent, MenuItem, MenuResponse, RoutesFeedItem, RoutesFeedResponse, JsonApiDocument, JsonApiResource, JsonApiRelationship, JsonApiLinks, NodeAttributes, } from "./types.js";
7
8
  export type { DrupalImageData, DrupalMediaData } from "./media.js";
8
9
  export type { FetchInit, FetchLike } from "./transport.js";
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3E,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEzF,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,kCAAkC,EAClC,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAA;AAEnB,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAElE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEzF,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,kCAAkC,EAClC,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,YAAY,CAAA;AAEnB,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAA;AAEnB,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAElE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
- export { resolvePath } from "./resolve.js";
1
+ export { resolvePath, resolvePathWithLayout } from "./resolve.js";
2
2
  export { fetchJsonApi, fetchView } from "./fetch.js";
3
3
  export { fetchRoutesPage, iterateRoutes, collectRoutes } from "./routes.js";
4
+ export { fetchMenu } from "./menu.js";
4
5
  export { getDrupalBaseUrl, resolveFileUrl, getFileUrl, getImageStyleUrl } from "./url.js";
5
6
  export { findIncluded, findIncludedByRelationship, findIncludedByRelationshipMultiple, extractImageFromFile, extractMedia, extractMediaField, extractPrimaryImage, extractEmbeddedMediaUuids, parseDrupalMediaTag, } from "./media.js";
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGjE,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,OAAO,GAAG,SAAS,CAAA;IACvE,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,EACvC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,eAAe,GAAG,SAAS,CAE7B;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,EACvC,YAAY,EAAE,mBAAmB,GAAG,SAAS,GAC5C,eAAe,GAAG,SAAS,CAK7B;AAED,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,EACvC,YAAY,EAAE,mBAAmB,GAAG,SAAS,GAC5C,eAAe,EAAE,CAUnB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAkB9F;AAcD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,GAAG,SAAS,EAClC,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,GACtC,eAAe,GAAG,IAAI,CAgGxB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,GACtC,eAAe,EAAE,CAanB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAY5H;AAgBD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUhE"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGjE,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,cAAc,GAAG,OAAO,GAAG,SAAS,CAAA;IACvE,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,eAAe,CAAA;CAC1B;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,EACvC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,eAAe,GAAG,SAAS,CAE7B;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,EACvC,YAAY,EAAE,mBAAmB,GAAG,SAAS,GAC5C,eAAe,GAAG,SAAS,CAK7B;AAED,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,EACvC,YAAY,EAAE,mBAAmB,GAAG,SAAS,GAC5C,eAAe,EAAE,CAUnB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAkB9F;AAcD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,GAAG,SAAS,EAClC,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,GACtC,eAAe,GAAG,IAAI,CAgGxB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,GACtC,eAAe,EAAE,CAanB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAY5H;AAgBD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB/D;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BhE"}
package/dist/media.js CHANGED
@@ -153,15 +153,45 @@ function getVideoEmbedUrl(url) {
153
153
  return undefined;
154
154
  }
155
155
  export function parseDrupalMediaTag(html) {
156
- const match = html.match(/data-entity-uuid=[\"']([^\"']+)[\"']/);
157
- return match ? match[1] : null;
156
+ const attr = "data-entity-uuid=";
157
+ const start = html.indexOf(attr);
158
+ if (start === -1) {
159
+ return null;
160
+ }
161
+ let index = start + attr.length;
162
+ while (index < html.length && /\s/.test(html[index])) {
163
+ index += 1;
164
+ }
165
+ const quote = html[index];
166
+ if (quote !== "\"" && quote !== "'") {
167
+ return null;
168
+ }
169
+ const end = html.indexOf(quote, index + 1);
170
+ if (end === -1) {
171
+ return null;
172
+ }
173
+ const uuid = html.slice(index + 1, end);
174
+ return uuid || null;
158
175
  }
159
176
  export function extractEmbeddedMediaUuids(html) {
160
- const regex = /<drupal-media[^>]*data-entity-uuid=[\"']([^\"']+)[\"'][^>]*>/g;
161
177
  const uuids = [];
162
- let match;
163
- while ((match = regex.exec(html)) !== null) {
164
- uuids.push(match[1]);
178
+ const tagStart = "<drupal-media";
179
+ let index = 0;
180
+ while (index < html.length) {
181
+ const start = html.indexOf(tagStart, index);
182
+ if (start === -1) {
183
+ break;
184
+ }
185
+ const end = html.indexOf(">", start);
186
+ if (end === -1) {
187
+ break;
188
+ }
189
+ const tag = html.slice(start, end + 1);
190
+ const uuid = parseDrupalMediaTag(tag);
191
+ if (uuid) {
192
+ uuids.push(uuid);
193
+ }
194
+ index = end + 1;
165
195
  }
166
196
  return uuids;
167
197
  }
package/dist/menu.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { MenuResponse } from "./types.js";
2
+ import { FetchInit, FetchLike } from "./transport.js";
3
+ export declare function fetchMenu(menu: string, options?: {
4
+ baseUrl?: string;
5
+ envKey?: string;
6
+ path?: string;
7
+ langcode?: string;
8
+ resolve?: boolean;
9
+ revalidate?: number;
10
+ fetch?: FetchLike;
11
+ headers?: HeadersInit;
12
+ init?: FetchInit;
13
+ }): Promise<MenuResponse>;
14
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAuD,MAAM,gBAAgB,CAAA;AAE1G,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,GACA,OAAO,CAAC,YAAY,CAAC,CAmDvB"}
package/dist/menu.js ADDED
@@ -0,0 +1,44 @@
1
+ import { getDrupalBaseUrlFromOptions, getFetch, mergeHeaders } from "./transport.js";
2
+ export async function fetchMenu(menu, options) {
3
+ const base = getDrupalBaseUrlFromOptions({ baseUrl: options?.baseUrl, envKey: options?.envKey });
4
+ const fetcher = getFetch(options?.fetch);
5
+ const url = new URL(`/jsonapi/menu/${encodeURIComponent(menu)}`, base);
6
+ url.searchParams.set("_format", "json");
7
+ if (options?.path) {
8
+ url.searchParams.set("path", options.path);
9
+ }
10
+ if (options?.langcode) {
11
+ url.searchParams.set("langcode", options.langcode);
12
+ }
13
+ if (options?.resolve === false) {
14
+ url.searchParams.set("resolve", "0");
15
+ }
16
+ const headers = mergeHeaders(options?.init?.headers, options?.headers);
17
+ if (!headers.has("Accept")) {
18
+ headers.set("Accept", "application/vnd.api+json");
19
+ }
20
+ const hasExplicitCache = options?.init?.cache !== undefined;
21
+ const disableCaching = (headers.has("authorization") || headers.has("cookie")) && !hasExplicitCache;
22
+ const init = {
23
+ ...options?.init,
24
+ headers,
25
+ };
26
+ if (disableCaching) {
27
+ init.cache = "no-store";
28
+ delete init.next;
29
+ }
30
+ const fetchInit = disableCaching
31
+ ? init
32
+ : {
33
+ ...init,
34
+ next: {
35
+ ...(options?.init?.next ?? {}),
36
+ revalidate: options?.revalidate,
37
+ },
38
+ };
39
+ const res = await fetcher(url.toString(), fetchInit);
40
+ if (!res.ok) {
41
+ throw new Error(`Menu fetch failed: ${res.status} ${res.statusText}`);
42
+ }
43
+ return (await res.json());
44
+ }
package/dist/resolve.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ResolveResponse } from "./types.js";
1
+ import { LayoutResolveResponse, ResolveResponse } from "./types.js";
2
2
  import { FetchInit, FetchLike } from "./transport.js";
3
3
  /**
4
4
  * Resolve a frontend path to a Drupal resource.
@@ -12,4 +12,18 @@ export declare function resolvePath(path: string, options?: {
12
12
  headers?: HeadersInit;
13
13
  init?: FetchInit;
14
14
  }): Promise<ResolveResponse>;
15
+ /**
16
+ * Resolve a frontend path and include a Layout Builder tree when available.
17
+ *
18
+ * Falls back to `/jsonapi/resolve` if the add-on module is not installed.
19
+ */
20
+ export declare function resolvePathWithLayout(path: string, options?: {
21
+ baseUrl?: string;
22
+ envKey?: string;
23
+ langcode?: string;
24
+ revalidate?: number;
25
+ fetch?: FetchLike;
26
+ headers?: HeadersInit;
27
+ init?: FetchInit;
28
+ }): Promise<LayoutResolveResponse>;
15
29
  //# sourceMappingURL=resolve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAuD,MAAM,gBAAgB,CAAA;AAE1G;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,GACA,OAAO,CAAC,eAAe,CAAC,CA8C1B"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAuD,MAAM,gBAAgB,CAAA;AAE1G;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,GACA,OAAO,CAAC,eAAe,CAAC,CA8C1B;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,GACA,OAAO,CAAC,qBAAqB,CAAC,CAkDhC"}
package/dist/resolve.js CHANGED
@@ -40,3 +40,49 @@ export async function resolvePath(path, options) {
40
40
  }
41
41
  return (await res.json());
42
42
  }
43
+ /**
44
+ * Resolve a frontend path and include a Layout Builder tree when available.
45
+ *
46
+ * Falls back to `/jsonapi/resolve` if the add-on module is not installed.
47
+ */
48
+ export async function resolvePathWithLayout(path, options) {
49
+ const base = getDrupalBaseUrlFromOptions({ baseUrl: options?.baseUrl, envKey: options?.envKey });
50
+ const fetcher = getFetch(options?.fetch);
51
+ const url = new URL("/jsonapi/layout/resolve", base);
52
+ url.searchParams.set("path", path);
53
+ url.searchParams.set("_format", "json");
54
+ if (options?.langcode) {
55
+ url.searchParams.set("langcode", options.langcode);
56
+ }
57
+ const headers = mergeHeaders(options?.init?.headers, options?.headers);
58
+ if (!headers.has("Accept")) {
59
+ headers.set("Accept", "application/vnd.api+json");
60
+ }
61
+ const hasExplicitCache = options?.init?.cache !== undefined;
62
+ const disableCaching = (headers.has("authorization") || headers.has("cookie")) && !hasExplicitCache;
63
+ const init = {
64
+ ...options?.init,
65
+ headers,
66
+ };
67
+ if (disableCaching) {
68
+ init.cache = "no-store";
69
+ delete init.next;
70
+ }
71
+ const fetchInit = disableCaching
72
+ ? init
73
+ : {
74
+ ...init,
75
+ next: {
76
+ ...(options?.init?.next ?? {}),
77
+ revalidate: options?.revalidate,
78
+ },
79
+ };
80
+ const res = await fetcher(url.toString(), fetchInit);
81
+ if (res.status === 404) {
82
+ return await resolvePath(path, options);
83
+ }
84
+ if (!res.ok) {
85
+ throw new Error(`Layout resolver failed: ${res.status} ${res.statusText}`);
86
+ }
87
+ return (await res.json());
88
+ }
package/dist/types.d.ts CHANGED
@@ -15,6 +15,19 @@ export type ResolveResponse = {
15
15
  data_url: null;
16
16
  headless: boolean;
17
17
  drupal_url: string | null;
18
+ } | {
19
+ resolved: true;
20
+ kind: "route";
21
+ canonical: string;
22
+ entity: null;
23
+ redirect: {
24
+ to: string;
25
+ status?: number;
26
+ } | null;
27
+ jsonapi_url: null;
28
+ data_url: null;
29
+ headless: false;
30
+ drupal_url: string;
18
31
  } | {
19
32
  resolved: true;
20
33
  kind: "view";
@@ -28,6 +41,19 @@ export type ResolveResponse = {
28
41
  data_url: string;
29
42
  headless: boolean;
30
43
  drupal_url: string | null;
44
+ } | {
45
+ resolved: true;
46
+ kind: "redirect";
47
+ canonical: string;
48
+ entity: null;
49
+ redirect: {
50
+ to: string;
51
+ status?: number;
52
+ };
53
+ jsonapi_url: null;
54
+ data_url: null;
55
+ headless: false;
56
+ drupal_url: null;
31
57
  } | {
32
58
  resolved: false;
33
59
  kind: null;
@@ -42,6 +68,85 @@ export type ResolveResponse = {
42
68
  headless: false;
43
69
  drupal_url: null;
44
70
  };
71
+ export interface LayoutTree {
72
+ source: string;
73
+ view_mode: string;
74
+ sections: LayoutSection[];
75
+ }
76
+ export interface LayoutSection {
77
+ layout_id: string;
78
+ layout_settings: Record<string, unknown>;
79
+ components: LayoutComponent[];
80
+ }
81
+ export type LayoutComponent = {
82
+ type: "field";
83
+ uuid: string;
84
+ region: string;
85
+ weight: number;
86
+ plugin_id: string;
87
+ field: {
88
+ entity_type_id: string;
89
+ bundle: string;
90
+ field_name: string;
91
+ } | null;
92
+ settings?: Record<string, unknown>;
93
+ } | {
94
+ type: "inline_block";
95
+ uuid: string;
96
+ region: string;
97
+ weight: number;
98
+ plugin_id: string;
99
+ inline_block: {
100
+ view_mode: string | null;
101
+ block_revision_id: number | null;
102
+ block: {
103
+ type: string;
104
+ id: string;
105
+ jsonapi_url: string;
106
+ } | null;
107
+ } | null;
108
+ settings?: Record<string, unknown>;
109
+ } | {
110
+ type: "block";
111
+ uuid: string;
112
+ region: string;
113
+ weight: number;
114
+ plugin_id: string;
115
+ settings?: Record<string, unknown>;
116
+ };
117
+ export type LayoutResolveResponse = (Extract<ResolveResponse, {
118
+ kind: "entity";
119
+ resolved: true;
120
+ }> & {
121
+ layout?: LayoutTree;
122
+ }) | Exclude<ResolveResponse, {
123
+ kind: "entity";
124
+ resolved: true;
125
+ }>;
126
+ export interface MenuItem {
127
+ id: string;
128
+ title: string;
129
+ description?: string;
130
+ url: string;
131
+ external: boolean;
132
+ expanded: boolean;
133
+ parent: string | null;
134
+ weight: number;
135
+ active: boolean;
136
+ in_active_trail: boolean;
137
+ resolve: ResolveResponse | null;
138
+ children: MenuItem[];
139
+ }
140
+ export interface MenuResponse {
141
+ data: MenuItem[];
142
+ meta?: {
143
+ menu?: string;
144
+ active_trail?: string[];
145
+ langcode?: string | null;
146
+ path?: string | null;
147
+ resolve?: boolean;
148
+ };
149
+ }
45
150
  export type RoutesFeedItem = {
46
151
  path: string;
47
152
  kind: "entity";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/url.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAExF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC9B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,MAAM,GAAG,IAAI,CAoBf;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE;IACJ,UAAU,CAAC,EAAE;QACX,GAAG,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QACtC,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAA;CACF,GAAG,IAAI,GAAG,SAAS,EACpB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,MAAM,GAAG,IAAI,CAOf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAiB5H"}
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAExF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC9B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,MAAM,GAAG,IAAI,CAoBf;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE;IACJ,UAAU,CAAC,EAAE;QACX,GAAG,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QACtC,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAA;CACF,GAAG,IAAI,GAAG,SAAS,EACpB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9C,MAAM,GAAG,IAAI,CAOf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAmB5H"}
package/dist/url.js CHANGED
@@ -45,9 +45,11 @@ export function getImageStyleUrl(originalUrl, style, options) {
45
45
  if (resolved.includes("/styles/")) {
46
46
  return resolved.replace(/\/styles\/[^/]+\//, `/styles/${style}/`);
47
47
  }
48
- const filesMatch = resolved.match(/(.+\/files\/)(.+)$/);
49
- if (filesMatch) {
50
- const [, basePath, filePath] = filesMatch;
48
+ const marker = "/files/";
49
+ const markerIndex = resolved.indexOf(marker);
50
+ if (markerIndex !== -1) {
51
+ const basePath = resolved.slice(0, markerIndex + marker.length);
52
+ const filePath = resolved.slice(markerIndex + marker.length);
51
53
  return `${basePath}styles/${style}/public/${filePath}`;
52
54
  }
53
55
  return resolved;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codewheel/jsonapi-frontend-client",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "TypeScript client helpers for Drupal drupal/jsonapi_frontend",
5
5
  "homepage": "https://github.com/code-wheel/jsonapi-frontend-client#readme",
6
6
  "repository": {