@websolutespa/bom-next 4.0.0-next.0 → 4.0.0-next.2

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 (91) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +28 -0
  3. package/dist/client/client.d.ts +2 -2
  4. package/dist/client/extra.d.ts +3 -3
  5. package/dist/client/label.d.ts +3 -3
  6. package/dist/client/layout.d.ts +3 -3
  7. package/dist/client/layout.d.ts.map +1 -1
  8. package/dist/client/page.d.ts +3 -3
  9. package/dist/client/page.d.ts.map +1 -1
  10. package/dist/client/useApi.d.ts +7 -7
  11. package/dist/client/useCollectionApi.d.ts +6 -6
  12. package/dist/client/useCollectionApi.d.ts.map +1 -1
  13. package/dist/client/user.d.ts +3 -3
  14. package/dist/exports/server.d.ts +5 -4
  15. package/dist/exports/server.js +6 -5
  16. package/dist/index.d.ts +4 -4
  17. package/dist/index.js +3 -3
  18. package/dist/lib/const.d.ts +14 -2
  19. package/dist/lib/const.d.ts.map +1 -1
  20. package/dist/lib/const.js +23 -1
  21. package/dist/lib/const.js.map +1 -1
  22. package/dist/lib/http.d.ts +9 -0
  23. package/dist/lib/http.d.ts.map +1 -1
  24. package/dist/lib/http.js +21 -1
  25. package/dist/lib/http.js.map +1 -1
  26. package/dist/lib/meta-data.d.ts.map +1 -1
  27. package/dist/lib/route.d.ts +6 -1
  28. package/dist/lib/route.d.ts.map +1 -1
  29. package/dist/lib/route.js +16 -4
  30. package/dist/lib/route.js.map +1 -1
  31. package/dist/proxy/protected-route.d.ts.map +1 -1
  32. package/dist/proxy/protected-route.js +3 -0
  33. package/dist/proxy/protected-route.js.map +1 -1
  34. package/dist/proxy/proxy.d.ts +5 -4
  35. package/dist/proxy/proxy.d.ts.map +1 -1
  36. package/dist/proxy/proxy.js +9 -4
  37. package/dist/proxy/proxy.js.map +1 -1
  38. package/dist/proxy/route-proxy.d.ts.map +1 -1
  39. package/dist/proxy/route-proxy.js +3 -0
  40. package/dist/proxy/route-proxy.js.map +1 -1
  41. package/dist/server/context.d.ts +31 -15
  42. package/dist/server/context.d.ts.map +1 -1
  43. package/dist/server/context.js +151 -82
  44. package/dist/server/context.js.map +1 -1
  45. package/dist/server/handlers/static-params.handler.d.ts.map +1 -1
  46. package/dist/server/handlers/static-params.handler.js +3 -2
  47. package/dist/server/handlers/static-params.handler.js.map +1 -1
  48. package/dist/server/helpers.d.ts +50 -0
  49. package/dist/server/helpers.d.ts.map +1 -0
  50. package/dist/server/helpers.js +60 -0
  51. package/dist/server/helpers.js.map +1 -0
  52. package/dist/server/layout.js +44 -31
  53. package/dist/server/layout.js.map +1 -1
  54. package/dist/server/lazy.d.ts +1 -0
  55. package/dist/server/lazy.d.ts.map +1 -1
  56. package/dist/server/lazy.js +1 -3
  57. package/dist/server/lazy.js.map +1 -1
  58. package/dist/server/metadata.d.ts +8 -5
  59. package/dist/server/metadata.d.ts.map +1 -1
  60. package/dist/server/metadata.js +16 -6
  61. package/dist/server/metadata.js.map +1 -1
  62. package/dist/server/mixer.d.ts +48 -6
  63. package/dist/server/mixer.d.ts.map +1 -1
  64. package/dist/server/mixer.js +52 -11
  65. package/dist/server/mixer.js.map +1 -1
  66. package/dist/server/page.d.ts +21 -5
  67. package/dist/server/page.d.ts.map +1 -1
  68. package/dist/server/page.js +63 -15
  69. package/dist/server/page.js.map +1 -1
  70. package/dist/types.d.ts +79 -8
  71. package/dist/types.d.ts.map +1 -1
  72. package/package.json +6 -5
  73. package/src/exports/server.ts +1 -0
  74. package/src/lib/const.ts +15 -0
  75. package/src/lib/http.ts +15 -4
  76. package/src/lib/route.test.ts +53 -0
  77. package/src/lib/route.ts +15 -3
  78. package/src/proxy/protected-route.ts +5 -0
  79. package/src/proxy/proxy.ts +11 -4
  80. package/src/proxy/route-proxy.ts +5 -0
  81. package/src/server/context.test.ts +467 -0
  82. package/src/server/context.ts +237 -78
  83. package/src/server/context.type-test.ts +106 -0
  84. package/src/server/handlers/static-params.handler.ts +3 -5
  85. package/src/server/helpers.ts +58 -0
  86. package/src/server/layout.ts +45 -39
  87. package/src/server/lazy.ts +1 -1
  88. package/src/server/metadata.ts +15 -7
  89. package/src/server/mixer.ts +57 -9
  90. package/src/server/page.ts +62 -17
  91. package/src/types.ts +109 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @websolutespa/bom-next
2
2
 
3
+ ## 4.0.0-next.2
4
+
5
+ ### Patch Changes
6
+
7
+ - feat: add route template handling and tests for static parameters
8
+
9
+ ## 4.0.0-next.1
10
+
11
+ ### Minor Changes
12
+
13
+ - Next: options signature for `createPageContext`, `createLayoutContext`, `createNotFoundContext` and `getMetadata`.
14
+ - New form: `createPageContext(market, locale, slug, id, { config, headers, depth, select, populate, joins, draft, layout })` and `createLayoutContext(market, locale, { config, headers, depth, draft })`. The positional `(config, headers)` form still works, logs a one-time deprecation warning in development.
15
+ - **Behaviour change:** pages are now read at `DEFAULT_PAGE_DEPTH` (2) and the layout at `DEFAULT_LAYOUT_DEPTH` (1), including through the legacy signature. Relationships and uploads (page media, media inside blocks, category, template, markets) are populated objects instead of ids; pass `depth: 0` to keep the previous shape.
16
+ - `select` narrows the page type; envelope fields (`id`, `slug`, `title`, `category`, `markets`, `meta`, `template`) are always read so `href`, alternates and breadcrumb keep working.
17
+ - Draft mode works: `draft: 'auto'` (default) reads Next `draftMode()`, draft reads use the draft mixer/route cache key and the authenticated user. `createNotFoundContext` always reads published content.
18
+ - Page and layout are loaded once per request (React `cache`, serialized key) and in parallel, so `getMetadata` and the page share the same reads. `getLayout` runs its reads in parallel.
19
+ - `getPage` returns `undefined` only for not found / not accessible documents and rethrows other errors.
20
+ - `buildBaseOptions` is deprecated in favour of `buildReadOptions({ user, locale, draft, depth, select, populate, joins })`.
21
+ - `context`, `page`, `layout` and `lazy` modules use `import 'server-only'` instead of `'use server'`, so their exports are no longer exposed as Server Actions. `server-only` is now a dependency; outside Next (scripts, Payload CLI, Vitest) `@websolutespa/bom-next/server` needs the `react-server` condition (`node --conditions=react-server`, Vitest `resolve.conditions`) or a `server-only` mock.
22
+ - `TypedPageContext.layout` follows the `layout` option: `undefined` with `layout: false`.
23
+ - New `createContextHelpers({ config, defaults })` factory and `Populated<T>` type helper.
24
+
25
+ ### Patch Changes
26
+
27
+ - feat: enhance page context options and helpers
28
+
3
29
  ## 4.0.0-next.0
4
30
 
5
31
  ### Major Changes
package/README.md CHANGED
@@ -9,3 +9,31 @@ Next module of the [BOM Repository](https://github.com/websolutespa/bom) by [web
9
9
  ---
10
10
 
11
11
  ##### *this library is for internal usage and not production ready*
12
+
13
+ ## Page context
14
+
15
+ ```ts
16
+ import { createPageContext, getMetadata } from '@websolutespa/bom-next/server';
17
+
18
+ export const generateMetadata = getMetadata('post_detail', config);
19
+
20
+ const { page, layout, label, link } = await createPageContext(market, locale, 'post_detail', id, {
21
+ config,
22
+ depth: 2, // default DEFAULT_PAGE_DEPTH
23
+ select: { title: true, abstract: true, media: true, components: true },
24
+ populate: { media: { url: true, alt: true, width: true, height: true, type: true } },
25
+ });
26
+
27
+ const { layout } = await createLayoutContext(market, locale, { config }); // depth: DEFAULT_LAYOUT_DEPTH (1)
28
+ ```
29
+
30
+ | option | default | |
31
+ |---|---|---|
32
+ | `depth` | `2` | `0` ids only, `1` direct relations/uploads (including those inside blocks), `2` relations of relations |
33
+ | `select` | – | Payload select; envelope fields (`id`, `slug`, `title`, `category`, `markets`, `meta`, `template`) are always read |
34
+ | `populate` | – | per-collection select for populated documents |
35
+ | `draft` | `'auto'` | `true` / `false`, or `'auto'` to read Next `draftMode()` |
36
+ | `layout` | `{ depth: 1 }` | layout options, or `false` to skip the layout |
37
+
38
+ Page and layout reads are memoized per request, so `getMetadata` and the page component share them when called with the same options.
39
+ To bind `config` once: `export const { createPageContext, createLayoutContext, getMetadata } = createContextHelpers({ config, defaults: { depth: 2 } });`
@@ -1,7 +1,7 @@
1
- import * as react0 from "react";
1
+ import * as react8 from "react";
2
2
 
3
3
  //#region src/client/client.d.ts
4
- declare function Client(): react0.JSX.Element;
4
+ declare function Client(): react8.JSX.Element;
5
5
  //# sourceMappingURL=client.d.ts.map
6
6
 
7
7
  //#endregion
@@ -1,15 +1,15 @@
1
- import * as react0 from "react";
1
+ import * as react4 from "react";
2
2
 
3
3
  //#region src/client/extra.d.ts
4
4
  type IExtraContext = Record<string, any>;
5
- declare const ExtraContext: react0.Context<IExtraContext | undefined>;
5
+ declare const ExtraContext: react4.Context<IExtraContext | undefined>;
6
6
  declare function ExtraProvider({
7
7
  extra,
8
8
  children
9
9
  }: {
10
10
  extra?: Record<string, any>;
11
11
  children?: React.ReactNode;
12
- }): react0.JSX.Element;
12
+ }): react4.JSX.Element;
13
13
  //# sourceMappingURL=extra.d.ts.map
14
14
 
15
15
  //#endregion
@@ -1,13 +1,13 @@
1
- import * as react4 from "react";
1
+ import * as react9 from "react";
2
2
 
3
3
  //#region src/client/label.d.ts
4
4
  type ILabelContext = (key: string, params?: Record<string, any>) => string;
5
- declare const LabelContext: react4.Context<ILabelContext | undefined>;
5
+ declare const LabelContext: react9.Context<ILabelContext | undefined>;
6
6
  declare function LabelProvider({
7
7
  children
8
8
  }: {
9
9
  children?: React.ReactNode;
10
- }): react4.JSX.Element;
10
+ }): react9.JSX.Element;
11
11
  //# sourceMappingURL=label.d.ts.map
12
12
 
13
13
  //#endregion
@@ -1,16 +1,16 @@
1
1
  import { ILayout } from "@websolutespa/bom-core";
2
- import * as react2 from "react";
2
+ import * as react13 from "react";
3
3
 
4
4
  //#region src/client/layout.d.ts
5
5
  type ILayoutContext = ILayout;
6
- declare const LayoutContext: react2.Context<ILayoutContext | undefined>;
6
+ declare const LayoutContext: react13.Context<ILayoutContext | undefined>;
7
7
  declare function LayoutProvider({
8
8
  layout,
9
9
  children
10
10
  }: {
11
11
  layout: ILayout;
12
12
  children?: React.ReactNode;
13
- }): react2.JSX.Element;
13
+ }): react13.JSX.Element;
14
14
  //# sourceMappingURL=layout.d.ts.map
15
15
 
16
16
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","names":[],"sources":["../../src/client/layout.tsx"],"sourcesContent":[],"mappings":";;;;KAKY,cAAA,GAAiB;cAEhB,eAAa,MAAA,CAAA,QAAA;iBAEV,cAAA;;;;EAJJ,MAAA,EAQF,OARE;EAEC,QAAA,CAAA,EAOA,KAAA,CAAM,SAP8D;CAAA,CAAA,EAQhF,MAAA,CAAA,GAAA,CAAA,OARgF"}
1
+ {"version":3,"file":"layout.d.ts","names":[],"sources":["../../src/client/layout.tsx"],"sourcesContent":[],"mappings":";;;;KAKY,cAAA,GAAiB;cAEhB,eAAa,OAAA,CAAA,QAAA;iBAEV,cAAA;;;;EAJJ,MAAA,EAQF,OARE;EAEC,QAAA,CAAA,EAOA,KAAA,CAAM,SAP8D;CAAA,CAAA,EAQhF,OAAA,CAAA,GAAA,CAAA,OARgF"}
@@ -1,10 +1,10 @@
1
1
  import * as _websolutespa_bom_core0 from "@websolutespa/bom-core";
2
2
  import { ILocalized, IPage } from "@websolutespa/bom-core";
3
- import * as react8 from "react";
3
+ import * as react11 from "react";
4
4
 
5
5
  //#region src/client/page.d.ts
6
6
  type IPageContext = ILocalized<IPage>;
7
- declare const PageContext: react8.Context<{
7
+ declare const PageContext: react11.Context<{
8
8
  [x: string]: unknown;
9
9
  id: _websolutespa_bom_core0.IEquatable;
10
10
  schema: string;
@@ -397,7 +397,7 @@ declare function PageProvider({
397
397
  }: {
398
398
  page: ILocalized<IPage>;
399
399
  children?: React.ReactNode;
400
- }): react8.JSX.Element;
400
+ }): react11.JSX.Element;
401
401
  //# sourceMappingURL=page.d.ts.map
402
402
  //#endregion
403
403
  export { IPageContext, PageContext, PageProvider };
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","names":[],"sources":["../../src/client/page.tsx"],"sourcesContent":[],"mappings":";;;;;KAKY,YAAA,GAAe,WAAW;cAEzB,oBAAW;;MAAqD,uBAAA,CAAA;EAFjE,MAAA,EAAA,MAAA;EAAY,QAAA,EAAA;IAAc,UAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;IAAX,CAAA,CAAA,EAAA,MAAA,CAAA,EAAA,OAAA;IAAU,QAAA,EAAA,GAAA,GAAA,MAAA;IAExB,MAAA,EAAA,CAAA,GAAgE,EAAA,MAAA,EAAA,GAAA,MAAA;IAAA,UAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,MAAA;IAAA,MAAA,EAAA,CAAA,GAAA,OAAA,EAAA,MAAA,EAAA,EAAA,GAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAArD,GAAA,MAAA;IAAA,GAAA,EAAA,GAAA,GAAA,MAAA;IAER,QAAA,EAAA,CAAY,SAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,MAAA,EAAA,GAAA,MAAA;IAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,MAAA,EAAA,GAAA,MAAA;IAC1B,OAAA,EAAA,GAAA,GAAA,MAAA;IACA,SAAA,EAAA,GAAA,GAAA,MAAA;IAEiB,QAAA,EAAA,GAAA,GAAA,MAAA;IAAX,SAAA,EAAA,GAAA,GAAA,MAAA;IACK,QAAM,EAAA,CAAA,MAAA,QAAA,EAAA,uBAAA,gBAAA,CAAA;IAClB,UAAA,EAAA;MAAA,CAAA,WAAA,EAAA,MAAA,SAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBANe,YAAA;;;;QAIR,WAAW;aACN,KAAA,CAAM;IAClB,MAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"page.d.ts","names":[],"sources":["../../src/client/page.tsx"],"sourcesContent":[],"mappings":";;;;;KAKY,YAAA,GAAe,WAAW;cAEzB,qBAAW;;MAAqD,uBAAA,CAAA;EAFjE,MAAA,EAAA,MAAA;EAAY,QAAA,EAAA;IAAc,UAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;IAAX,CAAA,CAAA,EAAA,MAAA,CAAA,EAAA,OAAA;IAAU,QAAA,EAAA,GAAA,GAAA,MAAA;IAExB,MAAA,EAAA,CAAA,GAAgE,EAAA,MAAA,EAAA,GAAA,MAAA;IAAA,UAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,GAAA,MAAA;IAAA,MAAA,EAAA,CAAA,GAAA,OAAA,EAAA,MAAA,EAAA,EAAA,GAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAArD,GAAA,MAAA;IAAA,GAAA,EAAA,GAAA,GAAA,MAAA;IAER,QAAA,EAAA,CAAY,SAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,MAAA,EAAA,GAAA,MAAA;IAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,MAAA,EAAA,GAAA,MAAA;IAC1B,OAAA,EAAA,GAAA,GAAA,MAAA;IACA,SAAA,EAAA,GAAA,GAAA,MAAA;IAEiB,QAAA,EAAA,GAAA,GAAA,MAAA;IAAX,SAAA,EAAA,GAAA,GAAA,MAAA;IACK,QAAM,EAAA,CAAA,MAAA,QAAA,EAAA,uBAAA,gBAAA,CAAA;IAClB,UAAA,EAAA;MAAA,CAAA,WAAA,EAAA,MAAA,SAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBANe,YAAA;;;;QAIR,WAAW;aACN,KAAA,CAAM;IAClB,OAAA,CAAA,GAAA,CAAA"}
@@ -1,13 +1,13 @@
1
1
  import { ApiRequestOptions } from "../lib/http.js";
2
- import * as react10 from "react";
2
+ import * as react17 from "react";
3
3
 
4
4
  //#region src/client/useApi.d.ts
5
- declare function useApiFetch<T = unknown>(pathname: string, options?: ApiRequestOptions): [T | undefined, boolean, any, react10.Dispatch<any>];
6
- declare function useApiGet<T = unknown>(pathname: string, options?: ApiRequestOptions): [T | undefined, boolean, any, react10.Dispatch<any>];
7
- declare function useApiPost<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react10.Dispatch<any>];
8
- declare function useApiPut<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react10.Dispatch<any>];
9
- declare function useApiPatch<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react10.Dispatch<any>];
10
- declare function useApiDelete<T = unknown>(pathname: string, options?: ApiRequestOptions): [T | undefined, boolean, any, react10.Dispatch<any>];
5
+ declare function useApiFetch<T = unknown>(pathname: string, options?: ApiRequestOptions): [T | undefined, boolean, any, react17.Dispatch<any>];
6
+ declare function useApiGet<T = unknown>(pathname: string, options?: ApiRequestOptions): [T | undefined, boolean, any, react17.Dispatch<any>];
7
+ declare function useApiPost<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react17.Dispatch<any>];
8
+ declare function useApiPut<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react17.Dispatch<any>];
9
+ declare function useApiPatch<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react17.Dispatch<any>];
10
+ declare function useApiDelete<T = unknown>(pathname: string, options?: ApiRequestOptions): [T | undefined, boolean, any, react17.Dispatch<any>];
11
11
  type Api = {
12
12
  get: <T = unknown>(pathname: string, options?: ApiRequestOptions) => Promise<T>;
13
13
  post: <T = unknown>(pathname: string, payload?: unknown, options?: ApiRequestOptions) => Promise<T>;
@@ -1,6 +1,6 @@
1
1
  import { ApiRequestOptions } from "../lib/http.js";
2
2
  import { QueryParams } from "@websolutespa/bom-core";
3
- import * as react16 from "react";
3
+ import * as react0 from "react";
4
4
 
5
5
  //#region src/client/useCollectionApi.d.ts
6
6
  type CollectionApi = {
@@ -11,11 +11,11 @@ type CollectionApi = {
11
11
  delete: <T = unknown>(pathname: string, options?: ApiRequestOptions) => Promise<T>;
12
12
  };
13
13
  declare function useCollectionApi(): CollectionApi;
14
- declare function useCollectionApiGet<T = unknown>(pathname: string, params?: QueryParams, options?: ApiRequestOptions): [T | undefined, boolean, any, react16.Dispatch<any>];
15
- declare function useCollectionApiPost<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react16.Dispatch<any>];
16
- declare function useCollectionApiPut<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react16.Dispatch<any>];
17
- declare function useCollectionApiPatch<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react16.Dispatch<any>];
18
- declare function useCollectionApiDelete<T = unknown>(pathname: string, options?: ApiRequestOptions): [T | undefined, boolean, any, react16.Dispatch<any>];
14
+ declare function useCollectionApiGet<T = unknown>(pathname: string, params?: QueryParams, options?: ApiRequestOptions): [T | undefined, boolean, any, react0.Dispatch<any>];
15
+ declare function useCollectionApiPost<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react0.Dispatch<any>];
16
+ declare function useCollectionApiPut<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react0.Dispatch<any>];
17
+ declare function useCollectionApiPatch<T = unknown>(pathname: string, payload: unknown, options?: ApiRequestOptions): [T | undefined, boolean, any, react0.Dispatch<any>];
18
+ declare function useCollectionApiDelete<T = unknown>(pathname: string, options?: ApiRequestOptions): [T | undefined, boolean, any, react0.Dispatch<any>];
19
19
  //#endregion
20
20
  export { useCollectionApi, useCollectionApiDelete, useCollectionApiGet, useCollectionApiPatch, useCollectionApiPost, useCollectionApiPut };
21
21
  //# sourceMappingURL=useCollectionApi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useCollectionApi.d.ts","names":[],"sources":["../../src/client/useCollectionApi.ts"],"sourcesContent":[],"mappings":";;;;;KAMK,aAAA;gDAC2C,uBAAuB,sBAAsB,QAAQ;qEAChC,sBAAsB,QAAQ;EAF9F,GAAA,EAAA,CAAA,IAAA,OAAa,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAGkD,iBAHlD,EAAA,GAGwE,OAHxE,CAGgF,CAHhF,CAAA;EAAA,KAAA,EAAA,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAIoD,iBAJpD,EAAA,GAI0E,OAJ1E,CAIkF,CAJlF,CAAA;EAAA,MAC8B,EAAA,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAII,iBAJJ,EAAA,GAI0B,OAJ1B,CAIkC,CAJlC,CAAA;CAAW;AAA0C,iBAOrF,gBAAA,CAAA,CAPqF,EAOjE,aAPiE;AAAR,iBAuC7E,mBAvC6E,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAuCjB,WAvCiB,EAAA,OAAA,CAAA,EAuCK,iBAvCL,CAAA,EAAA,CAuC2B,CAvC3B,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EAuC2B,OAAA,CAAA,QAvC3B,CAAA,GAAA,CAAA,CAAA;AACxB,iBA2CrD,oBA3CqD,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EA2C0B,iBA3C1B,CAAA,EAAA,CA2CgD,CA3ChD,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EA2CgD,OAAA,CAAA,QA3ChD,CAAA,GAAA,CAAA,CAAA;AAA8B,iBA+CnF,mBA/CmF,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EA+CL,iBA/CK,CAAA,EAAA,CA+CiB,CA/CjB,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EA+CiB,OAAA,CAAA,QA/CjB,CAAA,GAAA,CAAA,CAAA;AAAR,iBAmD3E,qBAnD2E,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAmDK,iBAnDL,CAAA,EAAA,CAmD2B,CAnD3B,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EAmD2B,OAAA,CAAA,QAnD3B,CAAA,GAAA,CAAA,CAAA;AACvB,iBAsDpD,sBAtDoD,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAsDW,iBAtDX,CAAA,EAAA,CAsDiC,CAtDjC,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EAsDiC,OAAA,CAAA,QAtDjC,CAAA,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"useCollectionApi.d.ts","names":[],"sources":["../../src/client/useCollectionApi.ts"],"sourcesContent":[],"mappings":";;;;;KAMK,aAAA;gDAC2C,uBAAuB,sBAAsB,QAAQ;qEAChC,sBAAsB,QAAQ;EAF9F,GAAA,EAAA,CAAA,IAAA,OAAa,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAGkD,iBAHlD,EAAA,GAGwE,OAHxE,CAGgF,CAHhF,CAAA;EAAA,KAAA,EAAA,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAIoD,iBAJpD,EAAA,GAI0E,OAJ1E,CAIkF,CAJlF,CAAA;EAAA,MAC8B,EAAA,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAII,iBAJJ,EAAA,GAI0B,OAJ1B,CAIkC,CAJlC,CAAA;CAAW;AAA0C,iBAOrF,gBAAA,CAAA,CAPqF,EAOjE,aAPiE;AAAR,iBAuC7E,mBAvC6E,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAuCjB,WAvCiB,EAAA,OAAA,CAAA,EAuCK,iBAvCL,CAAA,EAAA,CAuC2B,CAvC3B,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EAuC2B,MAAA,CAAA,QAvC3B,CAAA,GAAA,CAAA,CAAA;AACxB,iBA2CrD,oBA3CqD,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EA2C0B,iBA3C1B,CAAA,EAAA,CA2CgD,CA3ChD,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EA2CgD,MAAA,CAAA,QA3ChD,CAAA,GAAA,CAAA,CAAA;AAA8B,iBA+CnF,mBA/CmF,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EA+CL,iBA/CK,CAAA,EAAA,CA+CiB,CA/CjB,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EA+CiB,MAAA,CAAA,QA/CjB,CAAA,GAAA,CAAA,CAAA;AAAR,iBAmD3E,qBAnD2E,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAmDK,iBAnDL,CAAA,EAAA,CAmD2B,CAnD3B,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EAmD2B,MAAA,CAAA,QAnD3B,CAAA,GAAA,CAAA,CAAA;AACvB,iBAsDpD,sBAtDoD,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAsDW,iBAtDX,CAAA,EAAA,CAsDiC,CAtDjC,GAAA,SAAA,EAAA,OAAA,EAAA,GAAA,EAsDiC,MAAA,CAAA,QAtDjC,CAAA,GAAA,CAAA,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { IEndUser, IUser } from "../types.js";
2
- import * as react21 from "react";
2
+ import * as react15 from "react";
3
3
  import { ReactNode } from "react";
4
4
 
5
5
  //#region src/client/user.d.ts
@@ -7,12 +7,12 @@ type UserContextType = {
7
7
  user?: IEndUser | IUser | null;
8
8
  setUser: (user?: IEndUser | IUser | null) => void;
9
9
  };
10
- declare const UserContext: react21.Context<UserContextType>;
10
+ declare const UserContext: react15.Context<UserContextType>;
11
11
  declare function UserProvider({
12
12
  children
13
13
  }: {
14
14
  children: ReactNode;
15
- }): react21.JSX.Element;
15
+ }): react15.JSX.Element;
16
16
  //# sourceMappingURL=user.d.ts.map
17
17
 
18
18
  //#endregion
@@ -1,4 +1,4 @@
1
- import { createLayoutContext, createNotFoundContext, createPageContext, getPageContext, setPageContext } from "../server/context.js";
1
+ import { createLayoutContext, createNotFoundContext, createPageContext, getPageContext, setPageContext, stableStringify } from "../server/context.js";
2
2
  import { getAuthMeHandler } from "../server/handlers/auth.handler.js";
3
3
  import { getCaptionsVTT } from "../server/handlers/captions.handler.js";
4
4
  import { collectionDeleteHandler, collectionGetHandler, collectionPatchHandler, collectionPostHandler } from "../server/handlers/collection.handler.js";
@@ -9,11 +9,12 @@ import { getRouteHandler } from "../server/handlers/route.handler.js";
9
9
  import { ISiteMap, getSiteMapIndex, getSiteMapXML, getSiteMapXSL } from "../server/handlers/sitemap.handler.js";
10
10
  import { getStaticParams, getStaticParamsFromPayload, getStaticParams_ } from "../server/handlers/static-params.handler.js";
11
11
  import { getVarsHandler } from "../server/handlers/vars.handler.js";
12
+ import { createContextHelpers } from "../server/helpers.js";
12
13
  import { decorateLazyComponents, withLazyProps } from "../server/lazy.js";
13
14
  import { getLocalApi } from "../server/local-api.js";
14
15
  import { getMetadata } from "../server/metadata.js";
15
- import { buildBaseOptions, filterRoutes, getAuthHeaders, getCacheKey, getContext, getMixerContext, getOptions, getPayload, getPayloadInstance, getRoutes, getSearchParams, setContext } from "../server/mixer.js";
16
- import { getPage } from "../server/page.js";
16
+ import { buildBaseOptions, buildReadOptions, filterRoutes, getAuthHeaders, getCacheKey, getContext, getMixerContext, getOptions, getPayload, getPayloadInstance, getRoutes, getSearchParams, resolveDraft, setContext } from "../server/mixer.js";
17
+ import { PAGE_ENVELOPE_FIELDS, getPage, withEnvelopeSelect } from "../server/page.js";
17
18
  import { getHrefBeforeRedirect, getNextUrl } from "../server/utils.js";
18
19
  import { getUtmz } from "../server/utmz.js";
19
- export { ISiteMap, buildBaseOptions, collectionDeleteHandler, collectionGetHandler, collectionPatchHandler, collectionPostHandler, createLayoutContext, createNotFoundContext, createPageContext, decorateLazyComponents, filterRoutes, getAuthHeaders, getAuthMeHandler, getCacheKey, getCaptionsVTT, getContext, getHrefBeforeRedirect, getLocalApi, getMetadata, getMixerContext, getNextUrl, getOptions, getPage, getPageContext, getPayload, getPayloadInstance, getRegistry, getRegistryItem, getRouteHandler, getRoutes, getSearchParams, getSiteMapIndex, getSiteMapXML, getSiteMapXSL, getStaticParams, getStaticParamsFromPayload, getStaticParams_, getUtmz, getVarsHandler, indexGetHandler, previewHandler, setContext, setPageContext, withLazyProps };
20
+ export { ISiteMap, PAGE_ENVELOPE_FIELDS, buildBaseOptions, buildReadOptions, collectionDeleteHandler, collectionGetHandler, collectionPatchHandler, collectionPostHandler, createContextHelpers, createLayoutContext, createNotFoundContext, createPageContext, decorateLazyComponents, filterRoutes, getAuthHeaders, getAuthMeHandler, getCacheKey, getCaptionsVTT, getContext, getHrefBeforeRedirect, getLocalApi, getMetadata, getMixerContext, getNextUrl, getOptions, getPage, getPageContext, getPayload, getPayloadInstance, getRegistry, getRegistryItem, getRouteHandler, getRoutes, getSearchParams, getSiteMapIndex, getSiteMapXML, getSiteMapXSL, getStaticParams, getStaticParamsFromPayload, getStaticParams_, getUtmz, getVarsHandler, indexGetHandler, previewHandler, resolveDraft, setContext, setPageContext, stableStringify, withEnvelopeSelect, withLazyProps };
@@ -1,7 +1,7 @@
1
1
  import { getHrefBeforeRedirect, getNextUrl } from "../server/utils.js";
2
- import { buildBaseOptions, filterRoutes, getAuthHeaders, getCacheKey, getContext, getMixerContext, getOptions, getPayload, getPayloadInstance, getRoutes, getSearchParams, setContext } from "../server/mixer.js";
3
- import { getPage } from "../server/page.js";
4
- import { createLayoutContext, createNotFoundContext, createPageContext, getPageContext, setPageContext } from "../server/context.js";
2
+ import { buildBaseOptions, buildReadOptions, filterRoutes, getAuthHeaders, getCacheKey, getContext, getMixerContext, getOptions, getPayload, getPayloadInstance, getRoutes, getSearchParams, resolveDraft, setContext } from "../server/mixer.js";
3
+ import { PAGE_ENVELOPE_FIELDS, getPage, withEnvelopeSelect } from "../server/page.js";
4
+ import { createLayoutContext, createNotFoundContext, createPageContext, getPageContext, setPageContext, stableStringify } from "../server/context.js";
5
5
  import { getAuthMeHandler } from "../server/handlers/auth.handler.js";
6
6
  import { getCaptionsVTT } from "../server/handlers/captions.handler.js";
7
7
  import { getLocalApi } from "../server/local-api.js";
@@ -13,8 +13,9 @@ import { getRouteHandler } from "../server/handlers/route.handler.js";
13
13
  import { getSiteMapIndex, getSiteMapXML, getSiteMapXSL } from "../server/handlers/sitemap.handler.js";
14
14
  import { getStaticParams, getStaticParamsFromPayload, getStaticParams_ } from "../server/handlers/static-params.handler.js";
15
15
  import { getVarsHandler } from "../server/handlers/vars.handler.js";
16
- import { decorateLazyComponents, withLazyProps } from "../server/lazy.js";
17
16
  import { getMetadata } from "../server/metadata.js";
17
+ import { createContextHelpers } from "../server/helpers.js";
18
+ import { decorateLazyComponents, withLazyProps } from "../server/lazy.js";
18
19
  import { getUtmz } from "../server/utmz.js";
19
20
 
20
- export { buildBaseOptions, collectionDeleteHandler, collectionGetHandler, collectionPatchHandler, collectionPostHandler, createLayoutContext, createNotFoundContext, createPageContext, decorateLazyComponents, filterRoutes, getAuthHeaders, getAuthMeHandler, getCacheKey, getCaptionsVTT, getContext, getHrefBeforeRedirect, getLocalApi, getMetadata, getMixerContext, getNextUrl, getOptions, getPage, getPageContext, getPayload, getPayloadInstance, getRegistry, getRegistryItem, getRouteHandler, getRoutes, getSearchParams, getSiteMapIndex, getSiteMapXML, getSiteMapXSL, getStaticParams, getStaticParamsFromPayload, getStaticParams_, getUtmz, getVarsHandler, indexGetHandler, previewHandler, setContext, setPageContext, withLazyProps };
21
+ export { PAGE_ENVELOPE_FIELDS, buildBaseOptions, buildReadOptions, collectionDeleteHandler, collectionGetHandler, collectionPatchHandler, collectionPostHandler, createContextHelpers, createLayoutContext, createNotFoundContext, createPageContext, decorateLazyComponents, filterRoutes, getAuthHeaders, getAuthMeHandler, getCacheKey, getCaptionsVTT, getContext, getHrefBeforeRedirect, getLocalApi, getMetadata, getMixerContext, getNextUrl, getOptions, getPage, getPageContext, getPayload, getPayloadInstance, getRegistry, getRegistryItem, getRouteHandler, getRoutes, getSearchParams, getSiteMapIndex, getSiteMapXML, getSiteMapXSL, getStaticParams, getStaticParamsFromPayload, getStaticParams_, getUtmz, getVarsHandler, indexGetHandler, previewHandler, resolveDraft, setContext, setPageContext, stableStringify, withEnvelopeSelect, withLazyProps };
package/dist/index.d.ts CHANGED
@@ -4,15 +4,15 @@ import { StructuredDataType } from "./lib/structured-data.js";
4
4
  import { TwitterCardApp, TwitterCardBase, TwitterCardPlayer, TwitterCardSummary, TwitterCardSummaryLargeImage, TwitterCardType } from "./lib/twitter-card.js";
5
5
  import { IAlternate, IBrand, IMeta, IMetaData } from "./lib/meta-data.js";
6
6
  import { buildBreadcrumb } from "./lib/breadcrumb.js";
7
- import { guest } from "./lib/const.js";
7
+ import { DEFAULT_LAYOUT_DEPTH, DEFAULT_PAGE_DEPTH, guest } from "./lib/const.js";
8
8
  import { LabelService, getLabelFromLabels, interpolateText } from "./lib/label.js";
9
9
  import { LayoutDefaults } from "./lib/layout.defaults.js";
10
10
  import { getLink } from "./lib/link.js";
11
11
  import { IPaginationInfo, IPaginationItem, IPaginationOptions, getMoreItems, getPagedItems, getPaginationInfo, isPaginationInfo } from "./lib/pagination.js";
12
- import { getRouteLinkCategory, newRouteLink, resolveRoute, routeToLink, routeToRouteLink } from "./lib/route.js";
12
+ import { getRouteLinkCategory, getRouteTemplate, newRouteLink, resolveRoute, routeToLink, routeToRouteLink } from "./lib/route.js";
13
13
  import { BuildStrategy, NextPhase, StoreStrategy, buildStrategy, nextPhase, storeCacheDuration, storeStrategy } from "./lib/store.js";
14
14
  import { getPublicUrl, resolveHref, sanitizeHref, sanitizeRedirectFrom, sanitizeRedirectTo, sanitizeRedirectUrl, trimTerminalSlash } from "./lib/utils.js";
15
15
  import { IMockCollection, IMockDocument, IMockGlobal, IMockLocale, IMockLocalized, IMockMedia, IMockMenu, IMockMenuItem, IMockPage, IMockStore } from "./mock.js";
16
16
  import { ErrorContext, RequestInfo } from "./instrumentation/types.js";
17
- import { BaseOptions, ComponentContext, ComponentProps, IContext, IEndUser, ILazyComponent, ILazyComponentFunc, ILazyComponentProps, ILazyFuncProps, ILazyModules, ILazyProps, ILazyStaticProps, ILazyStaticPropsFunc, ILazyableProps, ILazyedProps, INullableLazyableProps, IPageContext, IUser, LayoutContext, LocalProvider, MarketLocaleParams, MixerContext, NotFoundContext, NotFoundParams, PageContext, PageDocument, PageLayoutContext, PageParams, PartialPageProps, ReadonlyHeaders, SearchParams, TypedPage, TypedPageContext } from "./types.js";
18
- export { ApiRequestOptions, BaseOptions, BuildStrategy, ComponentContext, ComponentProps, ErrorContext, IAlternate, IBrand, IContext, IEndUser, ILazyComponent, ILazyComponentFunc, ILazyComponentProps, ILazyFuncProps, ILazyModules, ILazyProps, ILazyStaticProps, ILazyStaticPropsFunc, ILazyableProps, ILazyedProps, IMeta, IMetaData, IMockCollection, IMockDocument, IMockGlobal, IMockLocale, IMockLocalized, IMockMedia, IMockMenu, IMockMenuItem, IMockPage, IMockStore, INullableLazyableProps, IPageContext, IPaginationInfo, IPaginationItem, IPaginationOptions, IUser, LabelService, LayoutContext, LayoutDefaults, LocalProvider, MarketLocaleParams, MixerContext, NextPhase, NotFoundContext, NotFoundParams, OpenGraphArticle, OpenGraphAudio, OpenGraphBase, OpenGraphBook, OpenGraphBusiness, OpenGraphImage, OpenGraphMusic, OpenGraphPlace, OpenGraphProduct, OpenGraphProductGroup, OpenGraphProfile, OpenGraphRestaurant, OpenGraphType, OpenGraphVideo, OpenGraphWebsite, PageContext, PageDocument, PageLayoutContext, PageParams, PartialPageProps, ReadonlyHeaders, RequestInfo, SearchParams, StoreStrategy, StructuredDataType, TwitterCardApp, TwitterCardBase, TwitterCardPlayer, TwitterCardSummary, TwitterCardSummaryLargeImage, TwitterCardType, TypedPage, TypedPageContext, buildBreadcrumb, buildStrategy, getLabelFromLabels, getLink, getLocalApiRequestOptions, getLocalApiUrl, getMoreItems, getPagedItems, getPaginationInfo, getPublicUrl, getRemoteApiRequestOptions, getRouteLinkCategory, guest, interpolateText, isPaginationInfo, localApiDelete, localApiFetch, localApiGet, localApiPatch, localApiPost, localApiPut, newRouteLink, nextPhase, resolveHref, resolveRoute, routeToLink, routeToRouteLink, sanitizeHref, sanitizeRedirectFrom, sanitizeRedirectTo, sanitizeRedirectUrl, storeCacheDuration, storeStrategy, trimTerminalSlash };
17
+ import { BaseOptions, ComponentContext, ComponentProps, DraftOption, IContext, IEndUser, ILazyComponent, ILazyComponentFunc, ILazyComponentProps, ILazyFuncProps, ILazyModules, ILazyProps, ILazyStaticProps, ILazyStaticPropsFunc, ILazyableProps, ILazyedProps, INullableLazyableProps, IPageContext, IUser, LayoutContext, LayoutContextOptions, LayoutFor, LayoutOption, LayoutOptions, LocalProvider, MarketLocaleParams, MixerContext, NotFoundContext, NotFoundParams, PageContext, PageContextOptions, PageDocument, PageEnvelope, PageEnvelopeField, PageLayoutContext, PageParams, PageSelect, PartialPageProps, Populated, ReadOptions, ReadonlyHeaders, SearchParams, TypedPage, TypedPageContext, WithEnvelopeSelect } from "./types.js";
18
+ export { ApiRequestOptions, BaseOptions, BuildStrategy, ComponentContext, ComponentProps, DEFAULT_LAYOUT_DEPTH, DEFAULT_PAGE_DEPTH, DraftOption, ErrorContext, IAlternate, IBrand, IContext, IEndUser, ILazyComponent, ILazyComponentFunc, ILazyComponentProps, ILazyFuncProps, ILazyModules, ILazyProps, ILazyStaticProps, ILazyStaticPropsFunc, ILazyableProps, ILazyedProps, IMeta, IMetaData, IMockCollection, IMockDocument, IMockGlobal, IMockLocale, IMockLocalized, IMockMedia, IMockMenu, IMockMenuItem, IMockPage, IMockStore, INullableLazyableProps, IPageContext, IPaginationInfo, IPaginationItem, IPaginationOptions, IUser, LabelService, LayoutContext, LayoutContextOptions, LayoutDefaults, LayoutFor, LayoutOption, LayoutOptions, LocalProvider, MarketLocaleParams, MixerContext, NextPhase, NotFoundContext, NotFoundParams, OpenGraphArticle, OpenGraphAudio, OpenGraphBase, OpenGraphBook, OpenGraphBusiness, OpenGraphImage, OpenGraphMusic, OpenGraphPlace, OpenGraphProduct, OpenGraphProductGroup, OpenGraphProfile, OpenGraphRestaurant, OpenGraphType, OpenGraphVideo, OpenGraphWebsite, PageContext, PageContextOptions, PageDocument, PageEnvelope, PageEnvelopeField, PageLayoutContext, PageParams, PageSelect, PartialPageProps, Populated, ReadOptions, ReadonlyHeaders, RequestInfo, SearchParams, StoreStrategy, StructuredDataType, TwitterCardApp, TwitterCardBase, TwitterCardPlayer, TwitterCardSummary, TwitterCardSummaryLargeImage, TwitterCardType, TypedPage, TypedPageContext, WithEnvelopeSelect, buildBreadcrumb, buildStrategy, getLabelFromLabels, getLink, getLocalApiRequestOptions, getLocalApiUrl, getMoreItems, getPagedItems, getPaginationInfo, getPublicUrl, getRemoteApiRequestOptions, getRouteLinkCategory, getRouteTemplate, guest, interpolateText, isPaginationInfo, localApiDelete, localApiFetch, localApiGet, localApiPatch, localApiPost, localApiPut, newRouteLink, nextPhase, resolveHref, resolveRoute, routeToLink, routeToRouteLink, sanitizeHref, sanitizeRedirectFrom, sanitizeRedirectTo, sanitizeRedirectUrl, storeCacheDuration, storeStrategy, trimTerminalSlash };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { getRouteLinkCategory, newRouteLink, resolveRoute, routeToLink, routeToRouteLink } from "./lib/route.js";
1
+ import { getRouteLinkCategory, getRouteTemplate, newRouteLink, resolveRoute, routeToLink, routeToRouteLink } from "./lib/route.js";
2
2
  import { buildBreadcrumb } from "./lib/breadcrumb.js";
3
- import { guest } from "./lib/const.js";
3
+ import { DEFAULT_LAYOUT_DEPTH, DEFAULT_PAGE_DEPTH, guest } from "./lib/const.js";
4
4
  import { getLocalApiRequestOptions, getLocalApiUrl, getRemoteApiRequestOptions, localApiDelete, localApiFetch, localApiGet, localApiPatch, localApiPost, localApiPut } from "./lib/http.js";
5
5
  import { LabelService, getLabelFromLabels, interpolateText } from "./lib/label.js";
6
6
  import { LayoutDefaults } from "./lib/layout.defaults.js";
@@ -9,4 +9,4 @@ import { getMoreItems, getPagedItems, getPaginationInfo, isPaginationInfo } from
9
9
  import { BuildStrategy, NextPhase, StoreStrategy, buildStrategy, nextPhase, storeCacheDuration, storeStrategy } from "./lib/store.js";
10
10
  import { getPublicUrl, resolveHref, sanitizeHref, sanitizeRedirectFrom, sanitizeRedirectTo, sanitizeRedirectUrl, trimTerminalSlash } from "./lib/utils.js";
11
11
 
12
- export { BuildStrategy, LabelService, LayoutDefaults, NextPhase, StoreStrategy, buildBreadcrumb, buildStrategy, getLabelFromLabels, getLink, getLocalApiRequestOptions, getLocalApiUrl, getMoreItems, getPagedItems, getPaginationInfo, getPublicUrl, getRemoteApiRequestOptions, getRouteLinkCategory, guest, interpolateText, isPaginationInfo, localApiDelete, localApiFetch, localApiGet, localApiPatch, localApiPost, localApiPut, newRouteLink, nextPhase, resolveHref, resolveRoute, routeToLink, routeToRouteLink, sanitizeHref, sanitizeRedirectFrom, sanitizeRedirectTo, sanitizeRedirectUrl, storeCacheDuration, storeStrategy, trimTerminalSlash };
12
+ export { BuildStrategy, DEFAULT_LAYOUT_DEPTH, DEFAULT_PAGE_DEPTH, LabelService, LayoutDefaults, NextPhase, StoreStrategy, buildBreadcrumb, buildStrategy, getLabelFromLabels, getLink, getLocalApiRequestOptions, getLocalApiUrl, getMoreItems, getPagedItems, getPaginationInfo, getPublicUrl, getRemoteApiRequestOptions, getRouteLinkCategory, getRouteTemplate, guest, interpolateText, isPaginationInfo, localApiDelete, localApiFetch, localApiGet, localApiPatch, localApiPost, localApiPut, newRouteLink, nextPhase, resolveHref, resolveRoute, routeToLink, routeToRouteLink, sanitizeHref, sanitizeRedirectFrom, sanitizeRedirectTo, sanitizeRedirectUrl, storeCacheDuration, storeStrategy, trimTerminalSlash };
@@ -2,8 +2,20 @@ import { Config, User } from "@websolutespa/payload-plugin-bowl";
2
2
 
3
3
  //#region src/lib/const.d.ts
4
4
  declare const guest: (User & Config["user"]);
5
+ /**
6
+ * Default population depth for page documents read by `createPageContext`.
7
+ *
8
+ * - `0`: relationships and uploads are returned as ids.
9
+ * - `1`: direct relationships and uploads are populated, including those inside blocks.
10
+ * - `2`: relationships of relationships are populated too (e.g. the cover of a related card).
11
+ */
12
+ declare const DEFAULT_PAGE_DEPTH = 2;
13
+ /**
14
+ * Default population depth for the layout reads (app global, menus, labels, markets).
15
+ * `1` populates the app logo and menu media.
16
+ */
17
+ declare const DEFAULT_LAYOUT_DEPTH = 1;
5
18
  //# sourceMappingURL=const.d.ts.map
6
-
7
19
  //#endregion
8
- export { guest };
20
+ export { DEFAULT_LAYOUT_DEPTH, DEFAULT_PAGE_DEPTH, guest };
9
21
  //# sourceMappingURL=const.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.d.ts","names":[],"sources":["../../src/lib/const.ts"],"sourcesContent":[],"mappings":";;;cAEa,QAAsD,OAAO"}
1
+ {"version":3,"file":"const.d.ts","names":[],"sources":["../../src/lib/const.ts"],"sourcesContent":[],"mappings":";;;cAEa,QAAsD,OAAO;;AAA1E;;;;AAAgF;AAShF;AAMa,cANA,kBAAA,GAMoB,CAAA;;;;;cAApB,oBAAA"}
package/dist/lib/const.js CHANGED
@@ -3,7 +3,29 @@ const guest = {
3
3
  collection: "users",
4
4
  roles: ["guest"]
5
5
  };
6
+ /**
7
+
8
+ * Default population depth for page documents read by `createPageContext`.
9
+
10
+ *
11
+
12
+ * - `0`: relationships and uploads are returned as ids.
13
+
14
+ * - `1`: direct relationships and uploads are populated, including those inside blocks.
15
+
16
+ * - `2`: relationships of relationships are populated too (e.g. the cover of a related card).
17
+
18
+ */
19
+ const DEFAULT_PAGE_DEPTH = 2;
20
+ /**
21
+
22
+ * Default population depth for the layout reads (app global, menus, labels, markets).
23
+
24
+ * `1` populates the app logo and menu media.
25
+
26
+ */
27
+ const DEFAULT_LAYOUT_DEPTH = 1;
6
28
 
7
29
  //#endregion
8
- export { guest };
30
+ export { DEFAULT_LAYOUT_DEPTH, DEFAULT_PAGE_DEPTH, guest };
9
31
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","names":[],"sources":["../../src/lib/const.ts"],"sourcesContent":["import type { Config, User } from '@websolutespa/payload-plugin-bowl';\r\n\r\nexport const guest = { collection: 'users', roles: ['guest'] } as (User & Config['user']);\r\n"],"mappings":";AAEA,MAAa,QAAQ;CAAE,YAAY;CAAS,OAAO,CAAC,OAAQ;AAAE"}
1
+ {"version":3,"file":"const.js","names":[],"sources":["../../src/lib/const.ts"],"sourcesContent":["import type { Config, User } from '@websolutespa/payload-plugin-bowl';\r\n\r\nexport const guest = { collection: 'users', roles: ['guest'] } as (User & Config['user']);\r\n\r\n/**\r\n * Default population depth for page documents read by `createPageContext`.\r\n *\r\n * - `0`: relationships and uploads are returned as ids.\r\n * - `1`: direct relationships and uploads are populated, including those inside blocks.\r\n * - `2`: relationships of relationships are populated too (e.g. the cover of a related card).\r\n */\r\nexport const DEFAULT_PAGE_DEPTH = 2;\r\n\r\n/**\r\n * Default population depth for the layout reads (app global, menus, labels, markets).\r\n * `1` populates the app logo and menu media.\r\n */\r\nexport const DEFAULT_LAYOUT_DEPTH = 1;\r\n"],"mappings":";AAEA,MAAa,QAAQ;CAAE,YAAY;CAAS,OAAO,CAAC,OAAQ;AAAE;;;;;;;;;;;;;;AAS9D,MAAa,qBAAqB;;;;;;;;AAMlC,MAAa,uBAAuB"}
@@ -2,6 +2,15 @@ import { FetchRequestOptions } from "@websolutespa/bom-core";
2
2
 
3
3
  //#region src/lib/http.d.ts
4
4
  type ApiRequestOptions = FetchRequestOptions;
5
+ /**
6
+ * Default options for requests to this app's own API.
7
+ *
8
+ * Server-side calls (proxy, handlers) target the request's deployment URL,
9
+ * which Vercel Deployment Protection answers with 401. When "Protection Bypass
10
+ * for Automation" is enabled, Vercel exposes VERCEL_AUTOMATION_BYPASS_SECRET;
11
+ * sending it as `x-vercel-protection-bypass` lets these calls through. The
12
+ * secret is never sent from the browser.
13
+ */
5
14
  declare function getLocalApiRequestOptions(): ApiRequestOptions;
6
15
  declare function getRemoteApiRequestOptions(token?: string): ApiRequestOptions;
7
16
  declare function getLocalApiUrl(pathname: string, origin?: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","names":[],"sources":["../../src/lib/http.ts"],"sourcesContent":[],"mappings":";;;KAKY,iBAAA,GAAoB;iBAEhB,yBAAA,CAAA,GAA6B;AAFjC,iBASI,0BAAA,CATgB,KAAmB,CAAA,EAAA,MAAA,CAAA,EASS,iBATT;AAEnC,iBA4BA,cAAA,CA5ByB,QAAI,EAAA,MAAA,EAAA,MAAiB,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAO9C,iBA2BM,aA3BoB,CAAA,IAAA,OAAkB,CAAA,CAAA,QAAA,EAAiB,MAAA,EAAA,OAAA,CAAA,EA2BD,iBA3BC,EAAA,cA2B1C,CA3B0C,EAAA;EAqB7D,MAAA,EAAA,MAAA;EAMM,MAAA,EAAA,MAAA;CAAa,EAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAwI,OAAxI,CAAgJ,CAAhJ,CAAA;AAAyC,iBActD,WAdsD,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAcP,iBAdO,EAAA,cAAsG,CAAtG,EAAA;EAAsB,MAAiF,EAAA,MAAA;EAAC,MAAT,EAAA,MAAA;AAAO,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAcd,OAdc,CAcN,CAdM,CAAA;AAc5J,iBAIA,YAJW,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAIwD,iBAJxD,EAAA,cAA0D,CAA1D,EAAA;EAAA,MAAA,EAAA,MAAA;EAAA,MAAoC,EAAA,MAAA;CAAsB,CAAA,EAI4E,OAJK,CAIG,CAJH,CAAA;AAAR,iBAQ9I,WAR8I,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAQ5E,iBAR4E,EAAA,cAIlI,CAJkI,EAAA;EAAO,MAAA,EAAA,MAAA;EAIrJ,MAAA,EAAA,MAAA;CAAY,CAAA,EAIoI,OAJpI,CAI4I,CAJ5I,CAAA;AAAuD,iBAQnE,aARmE,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAQC,iBARD,EAAA,cAAqF,CAArF,EAAA;EAAsB,MAAgE,EAAA,MAAA;EAAC,MAAT,EAAA,MAAA;AAAO,CAAA,CAAA,EAQN,OARM,CAQE,CARF,CAAA;AAIxJ,iBAQA,cARW,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAQuC,iBARvC,EAAA,cAA6E,CAA7E,EAAA;EAAA,MAAA,EAAA,MAAA;EAAA,MAAuD,EAAA,MAAA;CAAsB,CAAA,EAQwC,OARwB,CAQhB,CARgB,CAAA"}
1
+ {"version":3,"file":"http.d.ts","names":[],"sources":["../../src/lib/http.ts"],"sourcesContent":[],"mappings":";;;KAKY,iBAAA,GAAoB;;AAAhC;AAWA;AASA;AAqBA;AAMA;;;;AAA2K,iBApC3J,yBAAA,CAAA,CAoC2J,EApC9H,iBAoC8H;AAAO,iBA3BlK,0BAAA,CA2BkK,KAAA,CAAA,EAAA,MAAA,CAAA,EA3BtH,iBA2BsH;AAc5J,iBApBN,cAAA,CAoBiB,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAAA,iBAdX,aAcW,CAAA,IAAA,OAAA,CAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAd2C,iBAc3C,EAAA,cAA4I,CAA5I,EAAA;EAAA,MAAoC,EAAA,MAAA;EAAsB,MAAiF,EAAA,MAAA;CAAC,EAAA,MAAT,CAAA,EAAA,MAAA,CAAA,EAdO,OAcP,CAde,CAcf,CAAA;AAAO,iBAArJ,WAAqJ,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAtG,iBAAsG,EAAA,cAIzI,CAJyI,EAAA;EAIrJ,MAAA,EAAA,MAAA;EAAY,MAAA,EAAA,MAAA;CAAA,EAAA,MAAuD,CAAA,EAAA,MAAA,CAAA,EAJ2E,OAI3E,CAJmF,CAInF,CAAA;AAAsF,iBAAzJ,YAAyJ,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAtF,iBAAsF,EAAA,cAI/K,CAJ+K,EAAA;EAAC,MAAT,EAAA,MAAA;EAAO,MAAA,EAAA,MAAA;AAI9K,CAAA,CAAA,EAJuK,OAIjJ,CAJyJ,CAIzJ,CAAA;AAAW,iBAAX,WAAW,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAuD,iBAAvD,EAAA,cAA8I,CAA9I,EAAA;EAAA,MAAuD,EAAA,MAAA;EAAsB,MAAgE,EAAA,MAAA;CAAC,CAAA,EAAT,OAAA,CAAQ,CAAR,CAAA;AAAO,iBAIvJ,aAJuJ,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAInF,iBAJmF,EAAA,cAI1I,CAJ0I,EAAA;EAIvJ,MAAA,EAAA,MAAA;EAAa,MAAA,EAAA,MAAA;CAAA,CAAA,EAAqI,OAA9E,CAAsF,CAAtF,CAAA;AAAsF,iBAI1J,cAJ0J,CAAA,IAAA,OAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAIxG,iBAJwG,EAAA,cAIhL,CAJgL,EAAA;EAAC,MAAT,EAAA,MAAA;EAAO,MAAA,EAAA,MAAA;AAI/K,CAAA,CAAA,EAAsJ,OAAhI,CAAwI,CAAxI,CAAA"}
package/dist/lib/http.js CHANGED
@@ -3,8 +3,28 @@ import { httpFetch, isBrowser, merge } from "@websolutespa/bom-core";
3
3
  //#region src/lib/http.ts
4
4
  const API_URL = process.env.NEXT_PUBLIC_URL || "http://localhost:3000";
5
5
  const API_BASE = process.env.NEXT_PUBLIC_API || "/api";
6
+ /**
7
+
8
+ * Default options for requests to this app's own API.
9
+
10
+ *
11
+
12
+ * Server-side calls (proxy, handlers) target the request's deployment URL,
13
+
14
+ * which Vercel Deployment Protection answers with 401. When "Protection Bypass
15
+
16
+ * for Automation" is enabled, Vercel exposes VERCEL_AUTOMATION_BYPASS_SECRET;
17
+
18
+ * sending it as `x-vercel-protection-bypass` lets these calls through. The
19
+
20
+ * secret is never sent from the browser.
21
+
22
+ */
6
23
  function getLocalApiRequestOptions() {
7
- return { headers: {} };
24
+ const headers = {};
25
+ const bypassSecret = !isBrowser ? process.env.VERCEL_AUTOMATION_BYPASS_SECRET : void 0;
26
+ if (bypassSecret) headers["x-vercel-protection-bypass"] = bypassSecret;
27
+ return { headers };
8
28
  }
9
29
  function getRemoteApiRequestOptions(token) {
10
30
  if (token) return { headers: { Authorization: `JWT ${token}` } };
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","names":["token?: string","pathname: string","origin?: string","options: ApiRequestOptions","serviceOptions?: { locale: string, market: string }","url: string","payload?: unknown"],"sources":["../../src/lib/http.ts"],"sourcesContent":["import { FetchRequestOptions, httpFetch, isBrowser, merge } from '@websolutespa/bom-core';\r\n\r\nconst API_URL = process.env.NEXT_PUBLIC_URL || 'http://localhost:3000';\r\nconst API_BASE = process.env.NEXT_PUBLIC_API || '/api';\r\n\r\nexport type ApiRequestOptions = FetchRequestOptions;\r\n\r\nexport function getLocalApiRequestOptions(): ApiRequestOptions {\r\n return {\r\n headers: {\r\n },\r\n };\r\n}\r\n\r\nexport function getRemoteApiRequestOptions(token?: string): ApiRequestOptions {\r\n if (token) {\r\n // authenticated end user JWT token bearer (end_users)\r\n return {\r\n // mode: 'cors',\r\n headers: {\r\n Authorization: `JWT ${token}`,\r\n // Authorization: `Bearer ${token}`,\r\n },\r\n };\r\n } else {\r\n // guest user api key (users)\r\n return {\r\n // mode: 'cors',\r\n headers: {\r\n Authorization: `users API-Key ${process.env.STORE_API_KEY}`,\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport function getLocalApiUrl(pathname: string, origin?: string): string {\r\n const url = `${isBrowser ? window.location.origin : (origin || API_URL)}${API_BASE}${pathname}`;\r\n // console.log('getLocalApiUrl', url);\r\n return url;\r\n}\r\n\r\nexport async function localApiFetch<T = unknown>(pathname: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }, origin?: string): Promise<T> {\r\n // console.log('localApiFetch', pathname, options, serviceOptions);\r\n const url = new URL(getLocalApiUrl(pathname, origin));\r\n if (serviceOptions) {\r\n url.searchParams.append('locale', serviceOptions.locale);\r\n url.searchParams.append('market', serviceOptions.market);\r\n }\r\n const apiOptions = merge({ ...getLocalApiRequestOptions() }, options);\r\n console.log('📡 localApiFetch', apiOptions.method, url.href);\r\n const apiResponse = await httpFetch(url.href, apiOptions);\r\n // console.log('localApiFetch', pathname, apiResponse);\r\n return apiResponse;\r\n}\r\n\r\nexport async function localApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }, origin?: string): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'GET' }, serviceOptions, origin);\r\n}\r\n\r\nexport async function localApiPost<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'POST', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPut<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'PUT', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPatch<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'PATCH', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'DELETE' }, serviceOptions);\r\n}\r\n"],"mappings":";;;AAEA,MAAM,UAAU,QAAQ,IAAI,mBAAmB;AAC/C,MAAM,WAAW,QAAQ,IAAI,mBAAmB;AAIhD,SAAgB,4BAA+C;AAC7D,QAAO,EACL,SAAS,CACR,EACF;AACF;AAED,SAAgB,2BAA2BA,OAAmC;AAC5E,KAAI,MAEF,QAAO,EAEL,SAAS,EACP,eAAe,CAAC,IAAI,EAAE,OAAO,CAE9B,EACF;KAGD,QAAO,EAEL,SAAS,EACP,eAAe,CAAC,cAAc,EAAE,QAAQ,IAAI,eAAe,CAC5D,EACF;AAEJ;AAED,SAAgB,eAAeC,UAAkBC,QAAyB;CACxE,MAAM,MAAM,GAAG,YAAY,OAAO,SAAS,SAAU,UAAU,UAAW,WAAW,UAAU;AAE/F,QAAO;AACR;AAED,eAAsB,cAA2BD,UAAkBE,UAA6B,CAAE,GAAEC,gBAAqDF,QAA6B;CAEpL,MAAM,MAAM,IAAI,IAAI,eAAe,UAAU,OAAO;AACpD,KAAI,gBAAgB;EAClB,IAAI,aAAa,OAAO,UAAU,eAAe,OAAO;EACxD,IAAI,aAAa,OAAO,UAAU,eAAe,OAAO;CACzD;CACD,MAAM,aAAa,MAAM,EAAE,GAAG,2BAA2B,CAAE,GAAE,QAAQ;CACrE,QAAQ,IAAI,oBAAoB,WAAW,QAAQ,IAAI,KAAK;CAC5D,MAAM,cAAc,MAAM,UAAU,IAAI,MAAM,WAAW;AAEzD,QAAO;AACR;AAED,eAAsB,YAAyBG,KAAaF,UAA6B,CAAE,GAAEC,gBAAqDF,QAA6B;AAC7K,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;CAAO,GAAE,gBAAgB,OAAO;AAC1F;AAED,eAAsB,aAA0BG,KAAaC,SAAmBH,UAA6B,CAAE,GAAEC,gBAAiE;AAChL,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;EAAQ,MAAM,UAAU,KAAK,UAAU,QAAQ,GAAG;CAAW,GAAE,eAAe;AACxI;AAED,eAAsB,YAAyBC,KAAaC,SAAmBH,UAA6B,CAAE,GAAEC,gBAAiE;AAC/K,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;EAAO,MAAM,UAAU,KAAK,UAAU,QAAQ,GAAG;CAAW,GAAE,eAAe;AACvI;AAED,eAAsB,cAA2BC,KAAaC,SAAmBH,UAA6B,CAAE,GAAEC,gBAAiE;AACjL,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;EAAS,MAAM,UAAU,KAAK,UAAU,QAAQ,GAAG;CAAW,GAAE,eAAe;AACzI;AAED,eAAsB,eAA4BC,KAAaF,UAA6B,CAAE,GAAEC,gBAAiE;AAC/J,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;CAAU,GAAE,eAAe;AACrF"}
1
+ {"version":3,"file":"http.js","names":["headers: Record<string, string>","token?: string","pathname: string","origin?: string","options: ApiRequestOptions","serviceOptions?: { locale: string, market: string }","url: string","payload?: unknown"],"sources":["../../src/lib/http.ts"],"sourcesContent":["import { FetchRequestOptions, httpFetch, isBrowser, merge } from '@websolutespa/bom-core';\r\n\r\nconst API_URL = process.env.NEXT_PUBLIC_URL || 'http://localhost:3000';\r\nconst API_BASE = process.env.NEXT_PUBLIC_API || '/api';\r\n\r\nexport type ApiRequestOptions = FetchRequestOptions;\r\n\r\n/**\r\n * Default options for requests to this app's own API.\r\n *\r\n * Server-side calls (proxy, handlers) target the request's deployment URL,\r\n * which Vercel Deployment Protection answers with 401. When \"Protection Bypass\r\n * for Automation\" is enabled, Vercel exposes VERCEL_AUTOMATION_BYPASS_SECRET;\r\n * sending it as `x-vercel-protection-bypass` lets these calls through. The\r\n * secret is never sent from the browser.\r\n */\r\nexport function getLocalApiRequestOptions(): ApiRequestOptions {\r\n const headers: Record<string, string> = {};\r\n const bypassSecret = !isBrowser ? process.env.VERCEL_AUTOMATION_BYPASS_SECRET : undefined;\r\n if (bypassSecret) {\r\n headers['x-vercel-protection-bypass'] = bypassSecret;\r\n }\r\n return { headers };\r\n}\r\n\r\nexport function getRemoteApiRequestOptions(token?: string): ApiRequestOptions {\r\n if (token) {\r\n // authenticated end user JWT token bearer (end_users)\r\n return {\r\n // mode: 'cors',\r\n headers: {\r\n Authorization: `JWT ${token}`,\r\n // Authorization: `Bearer ${token}`,\r\n },\r\n };\r\n } else {\r\n // guest user api key (users)\r\n return {\r\n // mode: 'cors',\r\n headers: {\r\n Authorization: `users API-Key ${process.env.STORE_API_KEY}`,\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport function getLocalApiUrl(pathname: string, origin?: string): string {\r\n const url = `${isBrowser ? window.location.origin : (origin || API_URL)}${API_BASE}${pathname}`;\r\n // console.log('getLocalApiUrl', url);\r\n return url;\r\n}\r\n\r\nexport async function localApiFetch<T = unknown>(pathname: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }, origin?: string): Promise<T> {\r\n // console.log('localApiFetch', pathname, options, serviceOptions);\r\n const url = new URL(getLocalApiUrl(pathname, origin));\r\n if (serviceOptions) {\r\n url.searchParams.append('locale', serviceOptions.locale);\r\n url.searchParams.append('market', serviceOptions.market);\r\n }\r\n const apiOptions = merge({ ...getLocalApiRequestOptions() }, options);\r\n console.log('📡 localApiFetch', apiOptions.method, url.href);\r\n const apiResponse = await httpFetch(url.href, apiOptions);\r\n // console.log('localApiFetch', pathname, apiResponse);\r\n return apiResponse;\r\n}\r\n\r\nexport async function localApiGet<T = unknown>(url: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }, origin?: string): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'GET' }, serviceOptions, origin);\r\n}\r\n\r\nexport async function localApiPost<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'POST', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPut<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'PUT', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiPatch<T = unknown>(url: string, payload?: unknown, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'PATCH', body: payload ? JSON.stringify(payload) : undefined }, serviceOptions);\r\n}\r\n\r\nexport async function localApiDelete<T = unknown>(url: string, options: ApiRequestOptions = {}, serviceOptions?: { locale: string, market: string }): Promise<T> {\r\n return await localApiFetch<T>(url, { ...options, method: 'DELETE' }, serviceOptions);\r\n}\r\n"],"mappings":";;;AAEA,MAAM,UAAU,QAAQ,IAAI,mBAAmB;AAC/C,MAAM,WAAW,QAAQ,IAAI,mBAAmB;;;;;;;;;;;;;;;;;;AAahD,SAAgB,4BAA+C;CAC7D,MAAMA,UAAkC,CAAE;CAC1C,MAAM,eAAe,CAAC,YAAY,QAAQ,IAAI,kCAAkC;AAChF,KAAI,cACF,QAAQ,gCAAgC;AAE1C,QAAO,EAAE,QAAS;AACnB;AAED,SAAgB,2BAA2BC,OAAmC;AAC5E,KAAI,MAEF,QAAO,EAEL,SAAS,EACP,eAAe,CAAC,IAAI,EAAE,OAAO,CAE9B,EACF;KAGD,QAAO,EAEL,SAAS,EACP,eAAe,CAAC,cAAc,EAAE,QAAQ,IAAI,eAAe,CAC5D,EACF;AAEJ;AAED,SAAgB,eAAeC,UAAkBC,QAAyB;CACxE,MAAM,MAAM,GAAG,YAAY,OAAO,SAAS,SAAU,UAAU,UAAW,WAAW,UAAU;AAE/F,QAAO;AACR;AAED,eAAsB,cAA2BD,UAAkBE,UAA6B,CAAE,GAAEC,gBAAqDF,QAA6B;CAEpL,MAAM,MAAM,IAAI,IAAI,eAAe,UAAU,OAAO;AACpD,KAAI,gBAAgB;EAClB,IAAI,aAAa,OAAO,UAAU,eAAe,OAAO;EACxD,IAAI,aAAa,OAAO,UAAU,eAAe,OAAO;CACzD;CACD,MAAM,aAAa,MAAM,EAAE,GAAG,2BAA2B,CAAE,GAAE,QAAQ;CACrE,QAAQ,IAAI,oBAAoB,WAAW,QAAQ,IAAI,KAAK;CAC5D,MAAM,cAAc,MAAM,UAAU,IAAI,MAAM,WAAW;AAEzD,QAAO;AACR;AAED,eAAsB,YAAyBG,KAAaF,UAA6B,CAAE,GAAEC,gBAAqDF,QAA6B;AAC7K,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;CAAO,GAAE,gBAAgB,OAAO;AAC1F;AAED,eAAsB,aAA0BG,KAAaC,SAAmBH,UAA6B,CAAE,GAAEC,gBAAiE;AAChL,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;EAAQ,MAAM,UAAU,KAAK,UAAU,QAAQ,GAAG;CAAW,GAAE,eAAe;AACxI;AAED,eAAsB,YAAyBC,KAAaC,SAAmBH,UAA6B,CAAE,GAAEC,gBAAiE;AAC/K,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;EAAO,MAAM,UAAU,KAAK,UAAU,QAAQ,GAAG;CAAW,GAAE,eAAe;AACvI;AAED,eAAsB,cAA2BC,KAAaC,SAAmBH,UAA6B,CAAE,GAAEC,gBAAiE;AACjL,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;EAAS,MAAM,UAAU,KAAK,UAAU,QAAQ,GAAG;CAAW,GAAE,eAAe;AACzI;AAED,eAAsB,eAA4BC,KAAaF,UAA6B,CAAE,GAAEC,gBAAiE;AAC/J,QAAO,MAAM,cAAiB,KAAK;EAAE,GAAG;EAAS,QAAQ;CAAU,GAAE,eAAe;AACrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"meta-data.d.ts","names":[],"sources":["../../src/lib/meta-data.ts"],"sourcesContent":[],"mappings":";;;;;;;KAMY,MAAA;;EAAA,YAAM,EAAA,MAgBP;EAGC,OAAA,EAAA,MAAU;EAMV,IAAA,EAAA,MAAK;EAAA,GAAA,EAAA,MAAA;EAAA,KAOH,CAAA,EAAA,MAAA;EAAU,SACX,CAAA,EAAA,MAAA;EAAU,OAAA,CAAA,EAAA,MAAA;EASX,IAAA,CAAA,EAAA,MAAS;EAAA,OAAA,CAAA,EAAA,MAAA;EAAA,YACX,CAAA,EAAA,MAAA;EAAO,WACE,CAAA,EAAA,MAAA;EAAK,WAAhB,CAAA,EAAA,MAAA;EAAU,MACT,CAAA,EA7BE,MA6BF,CAAA,MAAA,EAAA,MAAA,CAAA;CAAM;AAEP,KA5BI,UAAA,GA4BJ;EAAK,EAAA,EACA,MAAA;EAAa,IACV,EAAA,MAAA;EAAY,QACX,EAAA,MAAA;CAAa;AAEd,KA3BJ,KAAA,GA2BI;EAAe,KAAA,EAAA,MAAA;;;;;;cApBjB;aACD;;;;KASD,SAAA;UACF;QACF,WAAW;SACV;gBACO;QACR;aACK;gBACG;iBACC;kBACC;gBACF"}
1
+ {"version":3,"file":"meta-data.d.ts","names":[],"sources":["../../src/lib/meta-data.ts"],"sourcesContent":[],"mappings":";;;;;;;KAMY,MAAA;;EAAA,YAAM,EAAA,MAAA;EAmBN,OAAA,EAAA,MAAU;EAMV,IAAA,EAAA,MAAK;EAAA,GAAA,EAAA,MAAA;EAAA,KAOH,CAAA,EAAA,MAAA;EAAU,SACX,CAAA,EAAA,MAAA;EAAU,OAAA,CAAA,EAAA,MAAA;EASX,IAAA,CAAA,EAAA,MAAS;EAAA,OAAA,CAAA,EAAA,MAAA;EAAA,YACX,CAAA,EAAA,MAAA;EAAO,WACE,CAAA,EAAA,MAAA;EAAK,WAAhB,CAAA,EAAA,MAAA;EAAU,MACT,CAAA,EA7BE,MA6BF,CAAA,MAAA,EAAA,MAAA,CAAA;CAAM;AAEP,KA5BI,UAAA,GA4BJ;EAAK,EAAA,EACA,MAAA;EAAa,IACV,EAAA,MAAA;EAAY,QACX,EAAA,MAAA;CAAa;AAEd,KA3BJ,KAAA,GA2BI;EAAe,KAAA,EAAA,MAAA;;;;;;cApBjB;aACD;;;;KASD,SAAA;UACF;QACF,WAAW;SACV;gBACO;QACR;aACK;gBACG;iBACC;kBACC;gBACF"}
@@ -3,6 +3,11 @@ import { ICategory, IRoute, IRouteLink } from "@websolutespa/bom-core";
3
3
  //#region src/lib/route.d.ts
4
4
  declare function getRouteLinkCategory(locale: string, routes: IRoute[], categories: ICategory[], rootCategory: ICategory, category: ICategory): IRouteLink | IRouteLink[] | undefined;
5
5
  declare function newRouteLink(category: ICategory, route: IRoute | undefined, locale: string): IRouteLink;
6
+ /**
7
+ * Returns the template id of a route, normalizing a string id or a populated `{ id }`.
8
+ * Returns `undefined` when empty or equal to the route schema.
9
+ */
10
+ declare function getRouteTemplate(route: Pick<IRoute, 'schema' | 'template'>): string | undefined;
6
11
  declare function resolveRoute(route: IRoute): string;
7
12
  declare function routeToRouteLink(route: IRoute): IRouteLink;
8
13
  /**
@@ -13,5 +18,5 @@ declare function routeToLink(route: IRoute, title?: string): IRouteLink;
13
18
  //# sourceMappingURL=route.d.ts.map
14
19
 
15
20
  //#endregion
16
- export { getRouteLinkCategory, newRouteLink, resolveRoute, routeToLink, routeToRouteLink };
21
+ export { getRouteLinkCategory, getRouteTemplate, newRouteLink, resolveRoute, routeToLink, routeToRouteLink };
17
22
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","names":[],"sources":["../../src/lib/route.ts"],"sourcesContent":[],"mappings":";;;iBAEgB,oBAAA,yBAEN,sBACI,2BACE,qBACJ,YACT,aAAa;iBA0BA,YAAA,WAAuB,kBAAkB,qCAAqC;AAhC9E,iBAkDA,YAAA,CAlDoB,KAAA,EAkDA,MAlDA,CAAA,EAAA,MAAA;AAAA,iBAsDpB,gBAAA,CAtDoB,KAAA,EAsDI,MAtDJ,CAAA,EAsDa,UAtDb;;;;;AAMjC,iBAiEa,WAAA,CAjEb,KAAA,EAiEgC,MAjEhC,EAAA,KAAA,CAAA,EAAA,MAAA,CAAA,EAiEyD,UAjEzD"}
1
+ {"version":3,"file":"route.d.ts","names":[],"sources":["../../src/lib/route.ts"],"sourcesContent":[],"mappings":";;;iBAEgB,oBAAA,yBAEN,sBACI,2BACE,qBACJ,YACT,aAAa;iBA0BA,YAAA,WAAuB,kBAAkB,qCAAqC;AAhC9F;;;;AAIgB,iBAkDA,gBAAA,CAlDA,KAAA,EAkDwB,IAlDxB,CAkD6B,MAlD7B,EAAA,QAAA,GAAA,UAAA,CAAA,CAAA,EAAA,MAAA,GAAA,SAAA;AACJ,iBAyDI,YAAA,CAzDJ,KAAA,EAyDwB,MAzDxB,CAAA,EAAA,MAAA;AACT,iBA4Da,gBAAA,CA5Db,KAAA,EA4DqC,MA5DrC,CAAA,EA4D8C,UA5D9C;;AAAuB;AA0B1B;;AAAuC,iBAmDvB,WAAA,CAnDuB,KAAA,EAmDJ,MAnDI,EAAA,KAAA,CAAA,EAAA,MAAA,CAAA,EAmDqB,UAnDrB"}
package/dist/lib/route.js CHANGED
@@ -1,4 +1,4 @@
1
- import { asCategoryId, findRouteOfCategory, localize } from "@websolutespa/bom-core";
1
+ import { asCategoryId, asEquatableString, findRouteOfCategory, localize } from "@websolutespa/bom-core";
2
2
 
3
3
  //#region src/lib/route.ts
4
4
  function getRouteLinkCategory(locale, routes, categories, rootCategory, category) {
@@ -20,7 +20,7 @@ function newRouteLink(category, route, locale) {
20
20
  const href = route && route.id ? route.id.toString() : "/";
21
21
  const id = route?.page || category.id;
22
22
  const media = category.media || route?.media;
23
- const schema = route?.template || route?.schema || category?.schema || "unknown";
23
+ const schema = route && getRouteTemplate(route) || route?.schema || category?.schema || "unknown";
24
24
  const title = localize(category.title || route?.title || "untitled", locale);
25
25
  const routeLink = {
26
26
  category: category.id,
@@ -33,8 +33,20 @@ function newRouteLink(category, route, locale) {
33
33
  };
34
34
  return routeLink;
35
35
  }
36
+ /**
37
+
38
+ * Returns the template id of a route, normalizing a string id or a populated `{ id }`.
39
+
40
+ * Returns `undefined` when empty or equal to the route schema.
41
+
42
+ */
43
+ function getRouteTemplate(route) {
44
+ const id = route.template ? asEquatableString(route.template) : void 0;
45
+ if (!id) return void 0;
46
+ return id === route.schema ? void 0 : id;
47
+ }
36
48
  function resolveRoute(route) {
37
- return `/${route.market}/${route.locale}/${route.schema}/${route.page}`;
49
+ return `/${route.market}/${route.locale}/${getRouteTemplate(route) ?? route.schema}/${route.page}`;
38
50
  }
39
51
  function routeToRouteLink(route) {
40
52
  const routeLink = {
@@ -67,5 +79,5 @@ function routeToLink(route, title) {
67
79
  }
68
80
 
69
81
  //#endregion
70
- export { getRouteLinkCategory, newRouteLink, resolveRoute, routeToLink, routeToRouteLink };
82
+ export { getRouteLinkCategory, getRouteTemplate, newRouteLink, resolveRoute, routeToLink, routeToRouteLink };
71
83
  //# sourceMappingURL=route.js.map