@webiny/website-builder-sdk 6.4.12-beta.5 → 6.5.0-beta.1

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 (81) hide show
  1. package/BindingsResolver.d.ts +4 -1
  2. package/BindingsResolver.js.map +1 -1
  3. package/ComponentResolver.d.ts +3 -2
  4. package/ComponentResolver.js +6 -3
  5. package/ComponentResolver.js.map +1 -1
  6. package/ContentSdk.d.ts +2 -0
  7. package/ContentSdk.js +5 -0
  8. package/ContentSdk.js.map +1 -1
  9. package/ResizeObserver.js +1 -1
  10. package/ResizeObserver.js.map +1 -1
  11. package/asset/deliveryUrl.d.ts +41 -0
  12. package/asset/deliveryUrl.js +34 -0
  13. package/asset/deliveryUrl.js.map +1 -0
  14. package/asset/deliveryUrl.test.js +127 -0
  15. package/asset/deliveryUrl.test.js.map +1 -0
  16. package/asset/geometry.d.ts +7 -0
  17. package/asset/geometry.js +10 -0
  18. package/asset/geometry.js.map +1 -0
  19. package/asset/imageSrcSet.d.ts +63 -0
  20. package/asset/imageSrcSet.js +98 -0
  21. package/asset/imageSrcSet.js.map +1 -0
  22. package/asset/imageSrcSet.test.d.ts +1 -0
  23. package/asset/imageSrcSet.test.js +103 -0
  24. package/asset/imageSrcSet.test.js.map +1 -0
  25. package/asset/index.d.ts +5 -0
  26. package/asset/index.js +5 -0
  27. package/asset/normalize.d.ts +24 -0
  28. package/asset/normalize.js +106 -0
  29. package/asset/normalize.js.map +1 -0
  30. package/asset/normalize.test.d.ts +1 -0
  31. package/asset/normalize.test.js +263 -0
  32. package/asset/normalize.test.js.map +1 -0
  33. package/asset/types.d.ts +2 -0
  34. package/asset/types.js +0 -0
  35. package/contentEntry/ContentEntryBindingsResolver.d.ts +30 -0
  36. package/contentEntry/ContentEntryBindingsResolver.js +45 -0
  37. package/contentEntry/ContentEntryBindingsResolver.js.map +1 -0
  38. package/contentEntry/ContentEntryCache.d.ts +46 -0
  39. package/contentEntry/ContentEntryCache.js +50 -0
  40. package/contentEntry/ContentEntryCache.js.map +1 -0
  41. package/contentEntry/resolveContentEntry.d.ts +74 -0
  42. package/contentEntry/resolveContentEntry.js +53 -0
  43. package/contentEntry/resolveContentEntry.js.map +1 -0
  44. package/contentEntry/resolveContentEntry.test.d.ts +1 -0
  45. package/contentEntry/resolveContentEntry.test.js +213 -0
  46. package/contentEntry/resolveContentEntry.test.js.map +1 -0
  47. package/createComponent.d.ts +5 -0
  48. package/createComponent.js +32 -0
  49. package/createComponent.js.map +1 -0
  50. package/createInput.d.ts +10 -2
  51. package/createInput.js +8 -1
  52. package/createInput.js.map +1 -1
  53. package/dataProviders/ApiClient.d.ts +3 -1
  54. package/dataProviders/ApiClient.js +4 -2
  55. package/dataProviders/ApiClient.js.map +1 -1
  56. package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
  57. package/dataProviders/GET_PAGE_BY_ID.js +0 -2
  58. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  59. package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
  60. package/dataProviders/GET_PAGE_BY_PATH.js +0 -2
  61. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  62. package/image/geometry.d.ts +54 -0
  63. package/image/geometry.js +112 -0
  64. package/image/geometry.js.map +1 -0
  65. package/image/geometry.test.d.ts +1 -0
  66. package/image/geometry.test.js +190 -0
  67. package/image/geometry.test.js.map +1 -0
  68. package/image/index.d.ts +3 -0
  69. package/image/index.js +3 -0
  70. package/image/presets.d.ts +6 -0
  71. package/image/presets.js +20 -0
  72. package/image/presets.js.map +1 -0
  73. package/image/types.d.ts +10 -0
  74. package/image/types.js +0 -0
  75. package/index.d.ts +6 -0
  76. package/index.js +6 -0
  77. package/package.json +7 -6
  78. package/types.d.ts +69 -1
  79. package/dataProviders/queries.test.js +0 -45
  80. package/dataProviders/queries.test.js.map +0 -1
  81. /package/{dataProviders/queries.test.d.ts → asset/deliveryUrl.test.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image/geometry.test.js","sources":["../../src/image/geometry.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { getCropRect, getImageRenderData, getVisibleRect, resolveAssetImage } from \"./geometry.js\";\nimport type { AssetImage } from \"@webiny/sdk\";\n\nconst image = (overrides?: Partial<AssetImage>): AssetImage => ({\n width: 1000,\n height: 1000,\n ...overrides\n});\n\ndescribe(\"resolveAssetImage\", () => {\n it(\"prefers the override per property, falling back to the asset default\", () => {\n const assetDefault: AssetImage = {\n crop: { top: 0.1, left: 0.1, bottom: 0.1, right: 0.1 },\n focalPoint: { x: 0.2, y: 0.2 },\n alt: \"default alt\",\n caption: \"default caption\"\n };\n const override: AssetImage = {\n focalPoint: { x: 0.8, y: 0.8 },\n alt: \"override alt\"\n };\n\n const result = resolveAssetImage(override, assetDefault);\n\n expect(result.crop).toEqual(assetDefault.crop);\n expect(result.caption).toBe(\"default caption\");\n expect(result.focalPoint).toEqual(override.focalPoint);\n expect(result.alt).toBe(\"override alt\");\n });\n\n it(\"handles null/undefined inputs\", () => {\n expect(resolveAssetImage(null, null)).toEqual({\n crop: undefined,\n focalPoint: undefined,\n alt: undefined,\n caption: undefined\n });\n });\n});\n\ndescribe(\"getCropRect\", () => {\n it(\"returns the full image when no crop is set\", () => {\n expect(getCropRect()).toEqual({ x: 0, y: 0, width: 1, height: 1 });\n });\n\n it(\"converts edge insets into a rectangle\", () => {\n const rect = getCropRect({ top: 0.1, left: 0.2, bottom: 0.3, right: 0.05 });\n expect(rect.x).toBeCloseTo(0.2, 10);\n expect(rect.y).toBeCloseTo(0.1, 10);\n expect(rect.width).toBeCloseTo(0.75, 10);\n expect(rect.height).toBeCloseTo(0.6, 10);\n });\n\n it(\"does not produce negative dimensions when insets overlap\", () => {\n const rect = getCropRect({ top: 0.7, left: 0.7, bottom: 0.7, right: 0.7 });\n expect(rect.width).toBe(0);\n expect(rect.height).toBe(0);\n });\n\n it(\"clamps out-of-range values\", () => {\n const rect = getCropRect({ top: -1, left: 2, bottom: 0, right: 0 });\n expect(rect.x).toBe(1);\n expect(rect.y).toBe(0);\n });\n});\n\ndescribe(\"getVisibleRect\", () => {\n it(\"returns the crop rect when no aspect ratio is requested\", () => {\n const rect = getVisibleRect(\n image({ crop: { top: 0.1, left: 0.1, bottom: 0.1, right: 0.1 } })\n );\n expect(rect).toEqual({ x: 0.1, y: 0.1, width: 0.8, height: 0.8 });\n });\n\n it(\"fits a 16:9 rect inside a square image, centered by default\", () => {\n const rect = getVisibleRect(image(), 16 / 9);\n expect(rect.width).toBeCloseTo(1, 5);\n expect(rect.height).toBeCloseTo(0.5625, 5);\n expect(rect.y).toBeCloseTo((1 - 0.5625) / 2, 5);\n expect(rect.x).toBeCloseTo(0, 5);\n });\n\n it(\"shifts the visible rect toward the focal point and clamps to bounds\", () => {\n const rect = getVisibleRect(image({ focalPoint: { x: 0.5, y: 0.05 } }), 16 / 9);\n expect(rect.y).toBeCloseTo(0, 5);\n });\n\n it(\"keeps the visible rect within the crop rectangle\", () => {\n const rect = getVisibleRect(\n image({\n crop: { top: 0.25, left: 0, bottom: 0.25, right: 0 },\n focalPoint: { x: 0.5, y: 0.9 }\n }),\n 1\n );\n expect(rect.y).toBeGreaterThanOrEqual(0.25 - 1e-9);\n expect(rect.y + rect.height).toBeLessThanOrEqual(0.75 + 1e-9);\n });\n\n it(\"accepts an explicit width/height aspect ratio\", () => {\n const byObject = getVisibleRect(image(), { width: 16, height: 9 });\n const byNumber = getVisibleRect(image(), 16 / 9);\n expect(byObject).toEqual(byNumber);\n });\n});\n\ndescribe(\"getImageRenderData\", () => {\n it(\"derives objectPosition from the focal point\", () => {\n const data = getImageRenderData(image({ focalPoint: { x: 0.25, y: 0.75 } }), 1);\n expect(data.objectPosition).toBe(\"25% 75%\");\n });\n\n it(\"produces an overflow-hidden container with the requested aspect ratio\", () => {\n const data = getImageRenderData(image(), 16 / 9);\n expect(data.container.overflow).toBe(\"hidden\");\n expect(data.container.aspectRatio).toBe(`${Math.round((16 / 9) * 1000) / 1000}`);\n });\n\n it(\"scales and offsets the image so the visible rect fills the container\", () => {\n const data = getImageRenderData(image(), 16 / 9);\n expect(data.image.width).toBe(\"100%\");\n expect(data.image.height).toBe(`${Math.round((100 / 0.5625) * 1000) / 1000}%`);\n expect(parseFloat(data.image.left)).toBe(0);\n expect(parseFloat(data.image.top)).toBeLessThan(0);\n });\n\n it(\"stays finite for a degenerate (collapsed) crop\", () => {\n const data = getImageRenderData(\n image({ crop: { top: 0.7, left: 0.7, bottom: 0.7, right: 0.7 } }),\n 1\n );\n expect(Number.isFinite(parseFloat(data.image.width))).toBe(true);\n expect(Number.isFinite(parseFloat(data.image.height))).toBe(true);\n });\n\n it(\"passes through intrinsic dimensions\", () => {\n const data = getImageRenderData(image({ width: 1920, height: 1080 }), 16 / 9);\n expect(data.intrinsicWidth).toBe(1920);\n expect(data.intrinsicHeight).toBe(1080);\n });\n});\n"],"names":["image","overrides","describe","it","assetDefault","override","result","resolveAssetImage","expect","undefined","getCropRect","rect","getVisibleRect","byObject","byNumber","data","getImageRenderData","Math","parseFloat","Number"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export * from "./presets.js";
3
+ export * from "./geometry.js";
package/image/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export * from "./presets.js";
3
+ export * from "./geometry.js";
@@ -0,0 +1,6 @@
1
+ import type { AspectRatioPreset } from "./types.js";
2
+ /**
3
+ * Default aspect ratios shown in the image editor's preview strip.
4
+ * A later phase will let a field lock to one of these (or a custom ratio).
5
+ */
6
+ export declare const ASPECT_RATIO_PRESETS: AspectRatioPreset[];
@@ -0,0 +1,20 @@
1
+ const ASPECT_RATIO_PRESETS = [
2
+ {
3
+ id: "square",
4
+ label: "Square",
5
+ ratio: 1
6
+ },
7
+ {
8
+ id: "4:3",
9
+ label: "4:3",
10
+ ratio: 4 / 3
11
+ },
12
+ {
13
+ id: "16:9",
14
+ label: "16:9",
15
+ ratio: 16 / 9
16
+ }
17
+ ];
18
+ export { ASPECT_RATIO_PRESETS };
19
+
20
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image/presets.js","sources":["../../src/image/presets.ts"],"sourcesContent":["import type { AspectRatioPreset } from \"./types.js\";\n\n/**\n * Default aspect ratios shown in the image editor's preview strip.\n * A later phase will let a field lock to one of these (or a custom ratio).\n */\nexport const ASPECT_RATIO_PRESETS: AspectRatioPreset[] = [\n { id: \"square\", label: \"Square\", ratio: 1 },\n { id: \"4:3\", label: \"4:3\", ratio: 4 / 3 },\n { id: \"16:9\", label: \"16:9\", ratio: 16 / 9 }\n];\n"],"names":["ASPECT_RATIO_PRESETS"],"mappings":"AAMO,MAAMA,uBAA4C;IACrD;QAAE,IAAI;QAAU,OAAO;QAAU,OAAO;IAAE;IAC1C;QAAE,IAAI;QAAO,OAAO;QAAO,OAAO,IAAI;IAAE;IACxC;QAAE,IAAI;QAAQ,OAAO;QAAQ,OAAO,KAAK;IAAE;CAC9C"}
@@ -0,0 +1,10 @@
1
+ export type { AssetCrop, AssetFocalPoint } from "@webiny/sdk";
2
+ export type AspectRatioInput = number | {
3
+ width: number;
4
+ height: number;
5
+ };
6
+ export interface AspectRatioPreset {
7
+ id: string;
8
+ label: string;
9
+ ratio: number;
10
+ }
package/image/types.js ADDED
File without changes
package/index.d.ts CHANGED
@@ -8,6 +8,12 @@ export * from "./DocumentStore.js";
8
8
  export * from "./Logger.js";
9
9
  export * from "./FunctionConverter.js";
10
10
  export * from "./createInput.js";
11
+ export * from "./contentEntry/resolveContentEntry.js";
12
+ export * from "./contentEntry/ContentEntryCache.js";
13
+ export * from "./contentEntry/ContentEntryBindingsResolver.js";
14
+ export * from "./createComponent.js";
15
+ export * from "./image/index.js";
16
+ export * from "./asset/index.js";
11
17
  export * from "./MouseTracker.js";
12
18
  export * from "./ViewportManager.js";
13
19
  export * from "./messenger/Messenger.js";
package/index.js CHANGED
@@ -8,6 +8,12 @@ export * from "./DocumentStore.js";
8
8
  export * from "./Logger.js";
9
9
  export * from "./FunctionConverter.js";
10
10
  export * from "./createInput.js";
11
+ export * from "./contentEntry/resolveContentEntry.js";
12
+ export * from "./contentEntry/ContentEntryCache.js";
13
+ export * from "./contentEntry/ContentEntryBindingsResolver.js";
14
+ export * from "./createComponent.js";
15
+ export * from "./image/index.js";
16
+ export * from "./asset/index.js";
11
17
  export * from "./MouseTracker.js";
12
18
  export * from "./ViewportManager.js";
13
19
  export * from "./messenger/Messenger.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/website-builder-sdk",
3
- "version": "6.4.12-beta.5",
3
+ "version": "6.5.0-beta.1",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,6 +12,7 @@
12
12
  "author": "Pavel Denisjuk",
13
13
  "license": "MIT",
14
14
  "dependencies": {
15
+ "@webiny/sdk": "6.5.0-beta.1",
15
16
  "csstype": "3.2.3",
16
17
  "deep-equal": "2.2.3",
17
18
  "deepmerge": "4.3.1",
@@ -20,8 +21,8 @@
20
21
  "is-hotkey": "0.2.0",
21
22
  "lodash": "4.18.1",
22
23
  "matcher": "6.0.0",
23
- "mobx": "7.0.3",
24
- "nanoid": "6.0.1",
24
+ "mobx": "6.16.1",
25
+ "nanoid": "6.0.0",
25
26
  "nanoid-dictionary": "5.0.0",
26
27
  "pino": "10.3.1",
27
28
  "pino-pretty": "13.1.3"
@@ -29,9 +30,9 @@
29
30
  "devDependencies": {
30
31
  "@types/deep-equal": "1.0.4",
31
32
  "@types/is-hotkey": "0.1.10",
32
- "@webiny/build-tools": "6.4.12-beta.5",
33
- "typescript": "6.0.3",
34
- "vitest": "5.0.1"
33
+ "@webiny/build-tools": "6.5.0-beta.1",
34
+ "typescript": "7.0.2",
35
+ "vitest": "4.1.10"
35
36
  },
36
37
  "publishConfig": {
37
38
  "access": "public"
package/types.d.ts CHANGED
@@ -231,6 +231,7 @@ export type DocumentElement = {
231
231
  export type SerializableCSSStyleDeclaration = {
232
232
  [K in keyof CssProperties]?: CssProperties[K];
233
233
  };
234
+ export type DocumentCache = Record<string, unknown>;
234
235
  export type Document = {
235
236
  id: string;
236
237
  state: DocumentState;
@@ -240,6 +241,7 @@ export type Document = {
240
241
  metadata: DocumentMetadata;
241
242
  bindings: DocumentBindings;
242
243
  elements: ElementMap;
244
+ __cache?: DocumentCache;
243
245
  };
244
246
  export type PublicPage = Pick<Page, "id" | "version" | "properties" | "bindings" | "elements" | "extensions" | "metadata" | "state"> & {
245
247
  languagePaths: Record<string, string>;
@@ -448,6 +450,72 @@ export type RadioInput = BaseInput<string> & {
448
450
  value: string;
449
451
  }[];
450
452
  };
453
+ export interface ContentEntryReference {
454
+ id: string;
455
+ modelId: string;
456
+ }
457
+ /**
458
+ * Query-mode configuration, declared by the component author. The editor then
459
+ * builds a query within these bounds (see `ContentEntryQueryValue`).
460
+ */
461
+ /**
462
+ * A field the editor may sort by: a bare read-API sort key, or a key paired with
463
+ * a display label shown in the editor.
464
+ */
465
+ export type ContentEntrySortField = string | {
466
+ field: string;
467
+ label?: string;
468
+ };
469
+ export interface ContentEntryQueryConfig {
470
+ /**
471
+ * Fields the editor may sort by (one at a time). Each `field` is a CMS read-API
472
+ * sort key — value fields as `values_<fieldId>` (e.g. `values_title`), meta
473
+ * fields bare (e.g. `createdOn`). Provide a `label` for a friendlier UI; a bare
474
+ * string uses the key as its label.
475
+ */
476
+ sort?: {
477
+ fields: ContentEntrySortField[];
478
+ };
479
+ /** Editor-configurable result limit, with an optional default and hard cap. */
480
+ limit?: {
481
+ default?: number;
482
+ max?: number;
483
+ };
484
+ /** Show a free-text search box (matches fullTextSearch-enabled fields). */
485
+ search?: boolean;
486
+ /** Enable "load more" pagination in the rendered component. */
487
+ pagination?: boolean;
488
+ }
489
+ /**
490
+ * The value stored for a query-mode input: the editor's chosen query.
491
+ * `modelId` identifies the CMS model so the frontend SDK can resolve the
492
+ * query without component manifests.
493
+ */
494
+ export interface ContentEntryQueryValue {
495
+ modelId: string;
496
+ sort?: {
497
+ field: string;
498
+ order: "asc" | "desc";
499
+ };
500
+ limit?: number;
501
+ search?: string;
502
+ }
503
+ export type ContentEntryInput = BaseInput<ContentEntryReference | ContentEntryReference[] | ContentEntryQueryValue> & {
504
+ type: "contentEntry";
505
+ /**
506
+ * The content model(s) the editor may pick entries from. Author-fixed.
507
+ */
508
+ models: string[];
509
+ /**
510
+ * "manual" (default): the editor hand-picks entries (stored as references).
511
+ * "query": the editor configures a dynamic query on the fixed model.
512
+ */
513
+ mode?: "manual" | "query";
514
+ /**
515
+ * Query-mode configuration. Only used when `mode` is "query".
516
+ */
517
+ query?: ContentEntryQueryConfig;
518
+ };
451
519
  export type ObjectInput = BaseInput<Record<string, any>> & {
452
520
  type: "object";
453
521
  fields: ComponentInput[];
@@ -456,7 +524,7 @@ export type CustomInput = BaseInput<any> & {
456
524
  type: string;
457
525
  fields: ComponentInput[];
458
526
  };
459
- export type ComponentInput = TextInput | LongTextInput | NumberInput | BooleanInput | ColorInput | FileInput | DateTimeInput | LexicalInput | SelectInput | RadioInput | TagsInput | ObjectInput | SlotInput | CustomInput;
527
+ export type ComponentInput = TextInput | LongTextInput | NumberInput | BooleanInput | ColorInput | FileInput | DateTimeInput | LexicalInput | SelectInput | RadioInput | TagsInput | ObjectInput | SlotInput | ContentEntryInput | CustomInput;
460
528
  export type ManifestInputsArray<TInputs, TAllowChildren extends boolean> = TAllowChildren extends true ? {
461
529
  [K in Exclude<keyof TInputs, "children">]: InputFactory<K & string>;
462
530
  }[Exclude<keyof TInputs, "children">][] : {
@@ -1,45 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { GET_PAGE_BY_PATH } from "./GET_PAGE_BY_PATH.js";
3
- import { GET_PAGE_BY_ID } from "./GET_PAGE_BY_ID.js";
4
- const getDataSelection = (query)=>{
5
- const match = query.match(/data\s*\{([^}]*)\}/);
6
- if (!match) throw new Error("Query has no `data` selection set.");
7
- return match[1].split("\n").map((line)=>line.trim()).filter(Boolean);
8
- };
9
- describe("single-page queries", ()=>{
10
- it.each([
11
- [
12
- "GET_PAGE_BY_PATH",
13
- GET_PAGE_BY_PATH
14
- ],
15
- [
16
- "GET_PAGE_BY_ID",
17
- GET_PAGE_BY_ID
18
- ]
19
- ])("%s selects metadata", (_name, query)=>{
20
- expect(getDataSelection(query)).toContain("metadata");
21
- });
22
- it.each([
23
- [
24
- "GET_PAGE_BY_PATH",
25
- GET_PAGE_BY_PATH
26
- ],
27
- [
28
- "GET_PAGE_BY_ID",
29
- GET_PAGE_BY_ID
30
- ]
31
- ])("%s selects exactly the expected fields", (_name, query)=>{
32
- expect(getDataSelection(query)).toEqual([
33
- "id",
34
- "version",
35
- "properties",
36
- "metadata",
37
- "elements",
38
- "bindings",
39
- "extensions",
40
- "languagePaths"
41
- ]);
42
- });
43
- });
44
-
45
- //# sourceMappingURL=queries.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataProviders/queries.test.js","sources":["../../src/dataProviders/queries.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { GET_PAGE_BY_PATH } from \"./GET_PAGE_BY_PATH.js\";\nimport { GET_PAGE_BY_ID } from \"./GET_PAGE_BY_ID.js\";\n\n/**\n * Extracts the fields selected inside the `data { ... }` block of a single-page query.\n * The block is flat (all scalars), so matching up to the first closing brace is enough.\n */\nconst getDataSelection = (query: string): string[] => {\n const match = query.match(/data\\s*\\{([^}]*)\\}/);\n if (!match) {\n throw new Error(\"Query has no `data` selection set.\");\n }\n\n return match[1]\n .split(\"\\n\")\n .map(line => line.trim())\n .filter(Boolean);\n};\n\ndescribe(\"single-page queries\", () => {\n // These assertions exist because a missing `metadata` field previously forced consumers\n // to maintain a Yarn patch against the built SDK. Keep both queries selecting it.\n it.each([\n [\"GET_PAGE_BY_PATH\", GET_PAGE_BY_PATH],\n [\"GET_PAGE_BY_ID\", GET_PAGE_BY_ID]\n ])(\"%s selects metadata\", (_name, query) => {\n expect(getDataSelection(query)).toContain(\"metadata\");\n });\n\n // `PublicPage` also declares `state`, which is not sourced from the API and so is\n // deliberately absent from both queries.\n it.each([\n [\"GET_PAGE_BY_PATH\", GET_PAGE_BY_PATH],\n [\"GET_PAGE_BY_ID\", GET_PAGE_BY_ID]\n ])(\"%s selects exactly the expected fields\", (_name, query) => {\n expect(getDataSelection(query)).toEqual([\n \"id\",\n \"version\",\n \"properties\",\n \"metadata\",\n \"elements\",\n \"bindings\",\n \"extensions\",\n \"languagePaths\"\n ]);\n });\n});\n"],"names":["getDataSelection","query","match","Error","line","Boolean","describe","it","GET_PAGE_BY_PATH","GET_PAGE_BY_ID","_name","expect"],"mappings":";;;AAQA,MAAMA,mBAAmB,CAACC;IACtB,MAAMC,QAAQD,MAAM,KAAK,CAAC;IAC1B,IAAI,CAACC,OACD,MAAM,IAAIC,MAAM;IAGpB,OAAOD,KAAK,CAAC,EAAE,CACV,KAAK,CAAC,MACN,GAAG,CAACE,CAAAA,OAAQA,KAAK,IAAI,IACrB,MAAM,CAACC;AAChB;AAEAC,SAAS,uBAAuB;IAG5BC,GAAG,IAAI,CAAC;QACJ;YAAC;YAAoBC;SAAiB;QACtC;YAAC;YAAkBC;SAAe;KACrC,EAAE,uBAAuB,CAACC,OAAOT;QAC9BU,OAAOX,iBAAiBC,QAAQ,SAAS,CAAC;IAC9C;IAIAM,GAAG,IAAI,CAAC;QACJ;YAAC;YAAoBC;SAAiB;QACtC;YAAC;YAAkBC;SAAe;KACrC,EAAE,0CAA0C,CAACC,OAAOT;QACjDU,OAAOX,iBAAiBC,QAAQ,OAAO,CAAC;YACpC;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACH;IACL;AACJ"}