@webiny/website-builder-sdk 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.a85ef555b2

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 (117) hide show
  1. package/ComponentInputTraverser.js +4 -0
  2. package/ComponentInputTraverser.js.map +1 -1
  3. package/ComponentResolver.d.ts +3 -1
  4. package/ComponentResolver.js +4 -2
  5. package/ComponentResolver.js.map +1 -1
  6. package/ContentSdk.d.ts +64 -1
  7. package/ContentSdk.js +80 -8
  8. package/ContentSdk.js.map +1 -1
  9. package/DocumentStoreManager.d.ts +9 -2
  10. package/DocumentStoreManager.js +24 -5
  11. package/DocumentStoreManager.js.map +1 -1
  12. package/EditingSdk.d.ts +7 -1
  13. package/EditingSdk.js +5 -3
  14. package/EditingSdk.js.map +1 -1
  15. package/ElementFactory.js +3 -1
  16. package/ElementFactory.js.map +1 -1
  17. package/ElementFactory.test.js +102 -0
  18. package/ElementFactory.test.js.map +1 -1
  19. package/LiveSdk.d.ts +3 -1
  20. package/LiveSdk.js +3 -2
  21. package/LiveSdk.js.map +1 -1
  22. package/PreviewDocument.d.ts +2 -1
  23. package/PreviewDocument.js +2 -2
  24. package/PreviewDocument.js.map +1 -1
  25. package/PreviewSdk.d.ts +3 -1
  26. package/PreviewSdk.js +3 -2
  27. package/PreviewSdk.js.map +1 -1
  28. package/ResizeObserver.js +1 -1
  29. package/ResizeObserver.js.map +1 -1
  30. package/asset/deliveryUrl.test.js +1 -1
  31. package/asset/deliveryUrl.test.js.map +1 -1
  32. package/asset/imageSrcSet.test.js +1 -1
  33. package/asset/imageSrcSet.test.js.map +1 -1
  34. package/asset/normalize.d.ts +1 -1
  35. package/asset/normalize.js +18 -14
  36. package/asset/normalize.js.map +1 -1
  37. package/asset/normalize.test.js +15 -8
  38. package/asset/normalize.test.js.map +1 -1
  39. package/componentLoader/ComponentLoader.d.ts +16 -0
  40. package/componentLoader/ComponentLoader.js +0 -0
  41. package/componentLoader/RegistryOnlyComponentLoader.d.ts +9 -0
  42. package/componentLoader/RegistryOnlyComponentLoader.js +8 -0
  43. package/componentLoader/RegistryOnlyComponentLoader.js.map +1 -0
  44. package/componentLoader/createComponentLoader.d.ts +7 -0
  45. package/componentLoader/createComponentLoader.js +10 -0
  46. package/componentLoader/createComponentLoader.js.map +1 -0
  47. package/componentLoader/defaultComponentLoader.d.ts +7 -0
  48. package/componentLoader/defaultComponentLoader.js +8 -0
  49. package/componentLoader/defaultComponentLoader.js.map +1 -0
  50. package/componentLoader/index.d.ts +3 -0
  51. package/componentLoader/index.js +3 -0
  52. package/contentClientState.test.d.ts +1 -0
  53. package/contentClientState.test.js +384 -0
  54. package/contentClientState.test.js.map +1 -0
  55. package/contentEntry/ContentEntryBindingsResolver.d.ts +8 -5
  56. package/contentEntry/ContentEntryBindingsResolver.js +30 -23
  57. package/contentEntry/ContentEntryBindingsResolver.js.map +1 -1
  58. package/contentEntry/ContentEntryCache.d.ts +7 -4
  59. package/contentEntry/ContentEntryCache.js +10 -9
  60. package/contentEntry/ContentEntryCache.js.map +1 -1
  61. package/createContentClient.d.ts +17 -0
  62. package/createContentClient.js +16 -0
  63. package/createContentClient.js.map +1 -0
  64. package/createContentClient.test.d.ts +1 -0
  65. package/createContentClient.test.js +165 -0
  66. package/createContentClient.test.js.map +1 -0
  67. package/dataProviders/ApiClient.js.map +1 -1
  68. package/dataProviders/DefaultDataProvider.d.ts +4 -0
  69. package/dataProviders/DefaultDataProvider.js +35 -0
  70. package/dataProviders/DefaultDataProvider.js.map +1 -1
  71. package/dataProviders/GET_EXPERIMENT_PAUSED.d.ts +1 -0
  72. package/dataProviders/GET_EXPERIMENT_PAUSED.js +17 -0
  73. package/dataProviders/GET_EXPERIMENT_PAUSED.js.map +1 -0
  74. package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
  75. package/dataProviders/GET_PAGE_BY_ID.js +2 -0
  76. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  77. package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
  78. package/dataProviders/GET_PAGE_BY_PATH.js +2 -0
  79. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  80. package/dataProviders/GET_PAGE_EXPERIMENT.d.ts +1 -0
  81. package/dataProviders/GET_PAGE_EXPERIMENT.js +32 -0
  82. package/dataProviders/GET_PAGE_EXPERIMENT.js.map +1 -0
  83. package/dataProviders/GET_VARIANT_CONTENT.d.ts +1 -0
  84. package/dataProviders/GET_VARIANT_CONTENT.js +24 -0
  85. package/dataProviders/GET_VARIANT_CONTENT.js.map +1 -0
  86. package/dataProviders/NullDataProvider.d.ts +4 -0
  87. package/dataProviders/NullDataProvider.js +9 -0
  88. package/dataProviders/NullDataProvider.js.map +1 -1
  89. package/dataProviders/queries.test.d.ts +1 -0
  90. package/dataProviders/queries.test.js +45 -0
  91. package/dataProviders/queries.test.js.map +1 -0
  92. package/experiments/PostHogAnalyticsProvider.d.ts +31 -0
  93. package/experiments/PostHogAnalyticsProvider.js +28 -0
  94. package/experiments/PostHogAnalyticsProvider.js.map +1 -0
  95. package/experiments/analyticsProvider.d.ts +4 -0
  96. package/experiments/analyticsProvider.js +11 -0
  97. package/experiments/analyticsProvider.js.map +1 -0
  98. package/experiments/bucketing.d.ts +27 -0
  99. package/experiments/bucketing.js +91 -0
  100. package/experiments/bucketing.js.map +1 -0
  101. package/experiments/bucketing.test.d.ts +1 -0
  102. package/experiments/bucketing.test.js +183 -0
  103. package/experiments/bucketing.test.js.map +1 -0
  104. package/experiments/index.d.ts +5 -0
  105. package/experiments/index.js +5 -0
  106. package/experiments/render.d.ts +82 -0
  107. package/experiments/render.js +149 -0
  108. package/experiments/render.js.map +1 -0
  109. package/experiments/types.d.ts +108 -0
  110. package/experiments/types.js +4 -0
  111. package/experiments/types.js.map +1 -0
  112. package/headersProvider.d.ts +1 -2
  113. package/headersProvider.js.map +1 -1
  114. package/index.d.ts +5 -0
  115. package/index.js +5 -0
  116. package/package.json +6 -6
  117. package/types.d.ts +5 -0
@@ -1,12 +1,13 @@
1
1
  import { makeAutoObservable, runInAction } from "mobx";
2
2
  import { resolveContentEntryValue } from "./resolveContentEntry.js";
3
- const pending = new Set();
4
- class ContentEntryCacheImpl {
3
+ class ContentEntryCache {
5
4
  constructor(){
6
5
  this.cache = new Map();
6
+ this.pending = new Set();
7
7
  makeAutoObservable(this, {
8
8
  setLoader: false,
9
- getLoader: false
9
+ getLoader: false,
10
+ pending: false
10
11
  });
11
12
  }
12
13
  get(key) {
@@ -27,15 +28,15 @@ class ContentEntryCacheImpl {
27
28
  return this.loader;
28
29
  }
29
30
  resolve(key, value, list) {
30
- if (this.cache.has(key) || pending.has(key) || !this.loader) return;
31
- pending.add(key);
31
+ if (this.cache.has(key) || this.pending.has(key) || !this.loader) return;
32
+ this.pending.add(key);
32
33
  resolveContentEntryValue(value, list, this.loader).then((resolved)=>{
33
34
  runInAction(()=>{
34
35
  this.cache.set(key, resolved);
35
36
  });
36
- pending.delete(key);
37
+ this.pending.delete(key);
37
38
  }).catch(()=>{
38
- pending.delete(key);
39
+ this.pending.delete(key);
39
40
  });
40
41
  }
41
42
  clear() {
@@ -44,7 +45,7 @@ class ContentEntryCacheImpl {
44
45
  });
45
46
  }
46
47
  }
47
- const contentEntryCache = new ContentEntryCacheImpl();
48
- export { contentEntryCache };
48
+ const contentEntryCache = new ContentEntryCache();
49
+ export { ContentEntryCache, contentEntryCache };
49
50
 
50
51
  //# sourceMappingURL=ContentEntryCache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contentEntry/ContentEntryCache.js","sources":["../../src/contentEntry/ContentEntryCache.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport {\n resolveContentEntryValue,\n type ContentEntryLoader,\n type ResolvedContentEntry\n} from \"./resolveContentEntry.js\";\n\ntype RawValue = unknown | unknown[] | null | undefined;\n\n// Non-observable dedupe set (kept out of the observable class so touching it\n// during render never counts as a mobx mutation-in-render).\nconst pending = new Set<string>();\n\n/**\n * SDK-level mobx cache for resolved content-entry inputs. Mirrors the CMS\n * `RefCache` pattern: a singleton observable store that both the server\n * pre-pass (`resolveAutoLoad`) and the editor preview path can seed / read.\n *\n * - **Server / SSR**: `resolveAutoLoad` calls `set(key, resolved)` for every\n * entry it pre-resolves. `BindingsResolver.resolveSingleInstance` reads via\n * `get(key)` synchronously during render — no React context needed.\n *\n * - **Editor preview**: `resolve(key, input, value, loader)` triggers an async\n * fetch whose result is written inside a mobx action, so `observer`\n * components re-render once it lands. Keyed by a signature of the raw value,\n * so when the editor changes the selection/query the key changes and the\n * entry is re-resolved.\n */\nclass ContentEntryCacheImpl {\n private cache = new Map<string, ResolvedContentEntry>();\n private loader: ContentEntryLoader | undefined;\n\n constructor() {\n makeAutoObservable(this, {\n // The loader is a plain service reference, not an observable value.\n setLoader: false,\n getLoader: false\n });\n }\n\n get(key: string): ResolvedContentEntry | undefined {\n return this.cache.get(key);\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n set(key: string, value: ResolvedContentEntry): void {\n runInAction(() => {\n this.cache.set(key, value);\n });\n }\n\n /**\n * Register the CMS data loader that `resolve()` will use for async fetches.\n * Called once during initialisation (e.g. by `resolveAutoLoad`). The loader\n * is **not** mobx-observable — it's a plain service reference.\n */\n setLoader(loader: ContentEntryLoader): void {\n this.loader = loader;\n }\n\n /**\n * Return the registered loader, if any.\n */\n getLoader(): ContentEntryLoader | undefined {\n return this.loader;\n }\n\n /**\n * Lazily resolve `value` under `key`. Idempotent and safe to call during\n * render: the observable write happens later, inside an action.\n *\n * Uses the loader registered via `setLoader()`. If no loader is registered,\n * the call is a no-op (the raw value will be used instead).\n */\n resolve(key: string, value: RawValue, list: boolean): void {\n if (this.cache.has(key) || pending.has(key) || !this.loader) {\n return;\n }\n pending.add(key);\n resolveContentEntryValue(value as any, list, this.loader)\n .then(resolved => {\n runInAction(() => {\n this.cache.set(key, resolved);\n });\n pending.delete(key);\n })\n .catch(() => {\n pending.delete(key);\n });\n }\n\n clear(): void {\n runInAction(() => {\n this.cache.clear();\n });\n }\n}\n\nexport const contentEntryCache = new ContentEntryCacheImpl();\n"],"names":["pending","Set","ContentEntryCacheImpl","Map","makeAutoObservable","key","value","runInAction","loader","list","resolveContentEntryValue","resolved","contentEntryCache"],"mappings":";;AAWA,MAAMA,UAAU,IAAIC;AAiBpB,MAAMC;IAIF,aAAc;aAHN,KAAK,GAAG,IAAIC;QAIhBC,mBAAmB,IAAI,EAAE;YAErB,WAAW;YACX,WAAW;QACf;IACJ;IAEA,IAAIC,GAAW,EAAoC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAACA;IAC1B;IAEA,IAAIA,GAAW,EAAW;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAACA;IAC1B;IAEA,IAAIA,GAAW,EAAEC,KAA2B,EAAQ;QAChDC,YAAY;YACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAACF,KAAKC;QACxB;IACJ;IAOA,UAAUE,MAA0B,EAAQ;QACxC,IAAI,CAAC,MAAM,GAAGA;IAClB;IAKA,YAA4C;QACxC,OAAO,IAAI,CAAC,MAAM;IACtB;IASA,QAAQH,GAAW,EAAEC,KAAe,EAAEG,IAAa,EAAQ;QACvD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAACJ,QAAQL,QAAQ,GAAG,CAACK,QAAQ,CAAC,IAAI,CAAC,MAAM,EACvD;QAEJL,QAAQ,GAAG,CAACK;QACZK,yBAAyBJ,OAAcG,MAAM,IAAI,CAAC,MAAM,EACnD,IAAI,CAACE,CAAAA;YACFJ,YAAY;gBACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAACF,KAAKM;YACxB;YACAX,QAAQ,MAAM,CAACK;QACnB,GACC,KAAK,CAAC;YACHL,QAAQ,MAAM,CAACK;QACnB;IACR;IAEA,QAAc;QACVE,YAAY;YACR,IAAI,CAAC,KAAK,CAAC,KAAK;QACpB;IACJ;AACJ;AAEO,MAAMK,oBAAoB,IAAIV"}
1
+ {"version":3,"file":"contentEntry/ContentEntryCache.js","sources":["../../src/contentEntry/ContentEntryCache.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport {\n resolveContentEntryValue,\n type ContentEntryLoader,\n type ResolvedContentEntry\n} from \"./resolveContentEntry.js\";\n\ntype RawValue = unknown | unknown[] | null | undefined;\n\n/**\n * SDK-level mobx cache for resolved content-entry inputs. Mirrors the CMS\n * `RefCache` pattern: an observable store that both the server pre-pass\n * (`resolveAutoLoad`) and the editor preview path can seed / read. The\n * `contentEntryCache` singleton is used by `contentSdk`; each content client\n * created with `createContentClient` holds its own instance.\n *\n * - **Server / SSR**: `resolveAutoLoad` calls `set(key, resolved)` for every\n * entry it pre-resolves. `BindingsResolver.resolveSingleInstance` reads via\n * `get(key)` synchronously during render — no React context needed.\n *\n * - **Editor preview**: `resolve(key, input, value, loader)` triggers an async\n * fetch whose result is written inside a mobx action, so `observer`\n * components re-render once it lands. Keyed by a signature of the raw value,\n * so when the editor changes the selection/query the key changes and the\n * entry is re-resolved.\n */\nexport class ContentEntryCache {\n private cache = new Map<string, ResolvedContentEntry>();\n private loader: ContentEntryLoader | undefined;\n // Non-observable dedupe set, so touching it during render never counts as a mobx\n // mutation-in-render.\n private pending = new Set<string>();\n\n constructor() {\n makeAutoObservable<ContentEntryCache, \"pending\">(this, {\n // The loader is a plain service reference, not an observable value.\n setLoader: false,\n getLoader: false,\n pending: false\n });\n }\n\n get(key: string): ResolvedContentEntry | undefined {\n return this.cache.get(key);\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n set(key: string, value: ResolvedContentEntry): void {\n runInAction(() => {\n this.cache.set(key, value);\n });\n }\n\n /**\n * Register the CMS data loader that `resolve()` will use for async fetches.\n * Called once during initialisation (e.g. by `resolveAutoLoad`). The loader\n * is **not** mobx-observable — it's a plain service reference.\n */\n setLoader(loader: ContentEntryLoader): void {\n this.loader = loader;\n }\n\n /**\n * Return the registered loader, if any.\n */\n getLoader(): ContentEntryLoader | undefined {\n return this.loader;\n }\n\n /**\n * Lazily resolve `value` under `key`. Idempotent and safe to call during\n * render: the observable write happens later, inside an action.\n *\n * Uses the loader registered via `setLoader()`. If no loader is registered,\n * the call is a no-op (the raw value will be used instead).\n */\n resolve(key: string, value: RawValue, list: boolean): void {\n if (this.cache.has(key) || this.pending.has(key) || !this.loader) {\n return;\n }\n this.pending.add(key);\n resolveContentEntryValue(value as any, list, this.loader)\n .then(resolved => {\n runInAction(() => {\n this.cache.set(key, resolved);\n });\n this.pending.delete(key);\n })\n .catch(() => {\n this.pending.delete(key);\n });\n }\n\n clear(): void {\n runInAction(() => {\n this.cache.clear();\n });\n }\n}\n\nexport const contentEntryCache = new ContentEntryCache();\n"],"names":["ContentEntryCache","Map","Set","makeAutoObservable","key","value","runInAction","loader","list","resolveContentEntryValue","resolved","contentEntryCache"],"mappings":";;AA0BO,MAAMA;IAOT,aAAc;aANN,KAAK,GAAG,IAAIC;aAIZ,OAAO,GAAG,IAAIC;QAGlBC,mBAAiD,IAAI,EAAE;YAEnD,WAAW;YACX,WAAW;YACX,SAAS;QACb;IACJ;IAEA,IAAIC,GAAW,EAAoC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAACA;IAC1B;IAEA,IAAIA,GAAW,EAAW;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAACA;IAC1B;IAEA,IAAIA,GAAW,EAAEC,KAA2B,EAAQ;QAChDC,YAAY;YACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAACF,KAAKC;QACxB;IACJ;IAOA,UAAUE,MAA0B,EAAQ;QACxC,IAAI,CAAC,MAAM,GAAGA;IAClB;IAKA,YAA4C;QACxC,OAAO,IAAI,CAAC,MAAM;IACtB;IASA,QAAQH,GAAW,EAAEC,KAAe,EAAEG,IAAa,EAAQ;QACvD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAACJ,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAACA,QAAQ,CAAC,IAAI,CAAC,MAAM,EAC5D;QAEJ,IAAI,CAAC,OAAO,CAAC,GAAG,CAACA;QACjBK,yBAAyBJ,OAAcG,MAAM,IAAI,CAAC,MAAM,EACnD,IAAI,CAACE,CAAAA;YACFJ,YAAY;gBACR,IAAI,CAAC,KAAK,CAAC,GAAG,CAACF,KAAKM;YACxB;YACA,IAAI,CAAC,OAAO,CAAC,MAAM,CAACN;QACxB,GACC,KAAK,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAACA;QACxB;IACR;IAEA,QAAc;QACVE,YAAY;YACR,IAAI,CAAC,KAAK,CAAC,KAAK;QACpB;IACJ;AACJ;AAEO,MAAMK,oBAAoB,IAAIX"}
@@ -0,0 +1,17 @@
1
+ import { ContentSdk } from "./ContentSdk.js";
2
+ import type { ContentSDKConfig } from "./ContentSdk.js";
3
+ /**
4
+ * A configured content client. It exposes the same methods as `contentSdk`,
5
+ * except `init()`: a client's configuration is fixed when it is created.
6
+ */
7
+ export type ContentClient = Omit<ContentSdk, "init">;
8
+ /**
9
+ * Create a content client with its own configuration and its own API client, separate
10
+ * from the `contentSdk` singleton and from other clients. Use it when one process serves
11
+ * requests for different tenants or API hosts.
12
+ *
13
+ * Data fetching is per client, and so are the component registry, the content entry cache
14
+ * and the document store. The editing environment is module-level and shared by all
15
+ * clients and `contentSdk`.
16
+ */
17
+ export declare function createContentClient(config: ContentSDKConfig): ContentClient;
@@ -0,0 +1,16 @@
1
+ import { ContentSdk } from "./ContentSdk.js";
2
+ import { ComponentRegistry } from "./ComponentRegistry.js";
3
+ import { ContentEntryCache } from "./contentEntry/ContentEntryCache.js";
4
+ import { DocumentStoreManager } from "./DocumentStoreManager.js";
5
+ function createContentClient(config) {
6
+ const client = new ContentSdk({
7
+ componentRegistry: new ComponentRegistry(),
8
+ contentEntryCache: new ContentEntryCache(),
9
+ documentStoreManager: new DocumentStoreManager()
10
+ });
11
+ client.init(config);
12
+ return client;
13
+ }
14
+ export { createContentClient };
15
+
16
+ //# sourceMappingURL=createContentClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createContentClient.js","sources":["../src/createContentClient.ts"],"sourcesContent":["import { ContentSdk } from \"./ContentSdk.js\";\nimport type { ContentSDKConfig } from \"./ContentSdk.js\";\nimport { ComponentRegistry } from \"./ComponentRegistry.js\";\nimport { ContentEntryCache } from \"./contentEntry/ContentEntryCache.js\";\nimport { DocumentStoreManager } from \"./DocumentStoreManager.js\";\n\n/**\n * A configured content client. It exposes the same methods as `contentSdk`,\n * except `init()`: a client's configuration is fixed when it is created.\n */\nexport type ContentClient = Omit<ContentSdk, \"init\">;\n\n/**\n * Create a content client with its own configuration and its own API client, separate\n * from the `contentSdk` singleton and from other clients. Use it when one process serves\n * requests for different tenants or API hosts.\n *\n * Data fetching is per client, and so are the component registry, the content entry cache\n * and the document store. The editing environment is module-level and shared by all\n * clients and `contentSdk`.\n */\nexport function createContentClient(config: ContentSDKConfig): ContentClient {\n const client = new ContentSdk({\n componentRegistry: new ComponentRegistry(),\n contentEntryCache: new ContentEntryCache(),\n documentStoreManager: new DocumentStoreManager()\n });\n client.init(config);\n return client;\n}\n"],"names":["createContentClient","config","client","ContentSdk","ComponentRegistry","ContentEntryCache","DocumentStoreManager"],"mappings":";;;;AAqBO,SAASA,oBAAoBC,MAAwB;IACxD,MAAMC,SAAS,IAAIC,WAAW;QAC1B,mBAAmB,IAAIC;QACvB,mBAAmB,IAAIC;QACvB,sBAAsB,IAAIC;IAC9B;IACAJ,OAAO,IAAI,CAACD;IACZ,OAAOC;AACX"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,165 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { createContentClient } from "./createContentClient.js";
3
+ import { contentSdk } from "./ContentSdk.js";
4
+ const pageResponse = (path)=>({
5
+ data: {
6
+ websiteBuilder: {
7
+ getPageByPath: {
8
+ data: {
9
+ id: `page:${path}`,
10
+ properties: {
11
+ id: `page:${path}`,
12
+ path
13
+ }
14
+ },
15
+ error: null
16
+ }
17
+ }
18
+ }
19
+ });
20
+ describe("createContentClient", ()=>{
21
+ let requests;
22
+ let delays;
23
+ beforeEach(()=>{
24
+ requests = [];
25
+ delays = {};
26
+ const fetchMock = vi.fn(async (url, init)=>{
27
+ const headers = init.headers;
28
+ const body = JSON.parse(init.body);
29
+ const path = body.variables.path;
30
+ requests.push({
31
+ url,
32
+ tenant: headers["X-Tenant"],
33
+ authorization: headers["Authorization"],
34
+ path
35
+ });
36
+ const delay = delays[path] ?? 0;
37
+ await new Promise((resolve)=>setTimeout(resolve, delay));
38
+ return {
39
+ json: async ()=>pageResponse(path)
40
+ };
41
+ });
42
+ vi.stubGlobal("fetch", fetchMock);
43
+ });
44
+ afterEach(()=>{
45
+ vi.unstubAllGlobals();
46
+ });
47
+ it("sends each client's own tenant, host and key", async ()=>{
48
+ const clientA = createContentClient({
49
+ apiHost: "https://a.example.com",
50
+ apiKey: "key-a",
51
+ apiTenant: "tenant-a"
52
+ });
53
+ const clientB = createContentClient({
54
+ apiHost: "https://b.example.com",
55
+ apiKey: "key-b",
56
+ apiTenant: "tenant-b"
57
+ });
58
+ await clientA.getPage("/a");
59
+ await clientB.getPage("/b");
60
+ expect(requests).toEqual([
61
+ {
62
+ url: "https://a.example.com/graphql",
63
+ tenant: "tenant-a",
64
+ authorization: "Bearer key-a",
65
+ path: "/a"
66
+ },
67
+ {
68
+ url: "https://b.example.com/graphql",
69
+ tenant: "tenant-b",
70
+ authorization: "Bearer key-b",
71
+ path: "/b"
72
+ }
73
+ ]);
74
+ });
75
+ it("keeps clients isolated when their calls interleave", async ()=>{
76
+ const clientA = createContentClient({
77
+ apiHost: "https://a.example.com",
78
+ apiKey: "key-a",
79
+ apiTenant: "tenant-a"
80
+ });
81
+ const clientB = createContentClient({
82
+ apiHost: "https://b.example.com",
83
+ apiKey: "key-b",
84
+ apiTenant: "tenant-b"
85
+ });
86
+ delays["/a"] = 20;
87
+ delays["/b"] = 0;
88
+ const [pageA, pageB] = await Promise.all([
89
+ clientA.getPage("/a"),
90
+ clientB.getPage("/b")
91
+ ]);
92
+ expect(pageA?.properties.path).toBe("/a");
93
+ expect(pageB?.properties.path).toBe("/b");
94
+ const requestA = requests.find((request)=>"/a" === request.path);
95
+ const requestB = requests.find((request)=>"/b" === request.path);
96
+ expect(requestA).toMatchObject({
97
+ url: "https://a.example.com/graphql",
98
+ tenant: "tenant-a",
99
+ authorization: "Bearer key-a"
100
+ });
101
+ expect(requestB).toMatchObject({
102
+ url: "https://b.example.com/graphql",
103
+ tenant: "tenant-b",
104
+ authorization: "Bearer key-b"
105
+ });
106
+ });
107
+ it("does not change what the contentSdk singleton sends, and init() does not change a client", async ()=>{
108
+ contentSdk.init({
109
+ apiHost: "https://singleton.example.com",
110
+ apiKey: "key-singleton",
111
+ apiTenant: "root"
112
+ });
113
+ const client = createContentClient({
114
+ apiHost: "https://client.example.com",
115
+ apiKey: "key-client",
116
+ apiTenant: "tenant-client"
117
+ });
118
+ await contentSdk.getPage("/singleton");
119
+ contentSdk.init({
120
+ apiHost: "https://singleton-2.example.com",
121
+ apiKey: "key-singleton-2",
122
+ apiTenant: "root-2"
123
+ });
124
+ await client.getPage("/client");
125
+ await contentSdk.getPage("/singleton-2");
126
+ expect(requests).toEqual([
127
+ {
128
+ url: "https://singleton.example.com/graphql",
129
+ tenant: "root",
130
+ authorization: "Bearer key-singleton",
131
+ path: "/singleton"
132
+ },
133
+ {
134
+ url: "https://client.example.com/graphql",
135
+ tenant: "tenant-client",
136
+ authorization: "Bearer key-client",
137
+ path: "/client"
138
+ },
139
+ {
140
+ url: "https://singleton-2.example.com/graphql",
141
+ tenant: "root-2",
142
+ authorization: "Bearer key-singleton-2",
143
+ path: "/singleton-2"
144
+ }
145
+ ]);
146
+ });
147
+ it("keeps the preview flag per client", ()=>{
148
+ const live = createContentClient({
149
+ apiHost: "https://a.example.com",
150
+ apiKey: "key-a",
151
+ apiTenant: "tenant-a"
152
+ });
153
+ const preview = createContentClient({
154
+ apiHost: "https://a.example.com",
155
+ apiKey: "key-a",
156
+ apiTenant: "tenant-a",
157
+ preview: true,
158
+ previewParams: "wb.type=page&wb.path=/a&wb.id=page-1"
159
+ });
160
+ expect(live.isPreviewing()).toBe(false);
161
+ expect(preview.isPreviewing()).toBe(true);
162
+ });
163
+ });
164
+
165
+ //# sourceMappingURL=createContentClient.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createContentClient.test.js","sources":["../src/createContentClient.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach, vi } from \"vitest\";\nimport { createContentClient } from \"./createContentClient.js\";\nimport { contentSdk } from \"./ContentSdk.js\";\n\ninterface RecordedRequest {\n url: string;\n tenant: string;\n authorization: string;\n path: string;\n}\n\nconst pageResponse = (path: string) => {\n return {\n data: {\n websiteBuilder: {\n getPageByPath: {\n data: { id: `page:${path}`, properties: { id: `page:${path}`, path } },\n error: null\n }\n }\n }\n };\n};\n\ndescribe(\"createContentClient\", () => {\n let requests: RecordedRequest[];\n let delays: Record<string, number>;\n\n beforeEach(() => {\n requests = [];\n delays = {};\n\n const fetchMock = vi.fn(async (url: string, init: RequestInit) => {\n const headers = init.headers as Record<string, string>;\n const body = JSON.parse(init.body as string);\n const path: string = body.variables.path;\n requests.push({\n url,\n tenant: headers[\"X-Tenant\"],\n authorization: headers[\"Authorization\"],\n path\n });\n\n const delay = delays[path] ?? 0;\n await new Promise(resolve => setTimeout(resolve, delay));\n\n return { json: async () => pageResponse(path) };\n });\n\n vi.stubGlobal(\"fetch\", fetchMock);\n });\n\n afterEach(() => {\n vi.unstubAllGlobals();\n });\n\n it(\"sends each client's own tenant, host and key\", async () => {\n const clientA = createContentClient({\n apiHost: \"https://a.example.com\",\n apiKey: \"key-a\",\n apiTenant: \"tenant-a\"\n });\n const clientB = createContentClient({\n apiHost: \"https://b.example.com\",\n apiKey: \"key-b\",\n apiTenant: \"tenant-b\"\n });\n\n await clientA.getPage(\"/a\");\n await clientB.getPage(\"/b\");\n\n expect(requests).toEqual([\n {\n url: \"https://a.example.com/graphql\",\n tenant: \"tenant-a\",\n authorization: \"Bearer key-a\",\n path: \"/a\"\n },\n {\n url: \"https://b.example.com/graphql\",\n tenant: \"tenant-b\",\n authorization: \"Bearer key-b\",\n path: \"/b\"\n }\n ]);\n });\n\n it(\"keeps clients isolated when their calls interleave\", async () => {\n const clientA = createContentClient({\n apiHost: \"https://a.example.com\",\n apiKey: \"key-a\",\n apiTenant: \"tenant-a\"\n });\n const clientB = createContentClient({\n apiHost: \"https://b.example.com\",\n apiKey: \"key-b\",\n apiTenant: \"tenant-b\"\n });\n\n // The first request to start is the last to finish.\n delays[\"/a\"] = 20;\n delays[\"/b\"] = 0;\n\n const [pageA, pageB] = await Promise.all([clientA.getPage(\"/a\"), clientB.getPage(\"/b\")]);\n\n expect(pageA?.properties.path).toBe(\"/a\");\n expect(pageB?.properties.path).toBe(\"/b\");\n\n const requestA = requests.find(request => request.path === \"/a\");\n const requestB = requests.find(request => request.path === \"/b\");\n\n expect(requestA).toMatchObject({\n url: \"https://a.example.com/graphql\",\n tenant: \"tenant-a\",\n authorization: \"Bearer key-a\"\n });\n expect(requestB).toMatchObject({\n url: \"https://b.example.com/graphql\",\n tenant: \"tenant-b\",\n authorization: \"Bearer key-b\"\n });\n });\n\n it(\"does not change what the contentSdk singleton sends, and init() does not change a client\", async () => {\n contentSdk.init({\n apiHost: \"https://singleton.example.com\",\n apiKey: \"key-singleton\",\n apiTenant: \"root\"\n });\n\n const client = createContentClient({\n apiHost: \"https://client.example.com\",\n apiKey: \"key-client\",\n apiTenant: \"tenant-client\"\n });\n\n await contentSdk.getPage(\"/singleton\");\n\n contentSdk.init({\n apiHost: \"https://singleton-2.example.com\",\n apiKey: \"key-singleton-2\",\n apiTenant: \"root-2\"\n });\n\n await client.getPage(\"/client\");\n await contentSdk.getPage(\"/singleton-2\");\n\n expect(requests).toEqual([\n {\n url: \"https://singleton.example.com/graphql\",\n tenant: \"root\",\n authorization: \"Bearer key-singleton\",\n path: \"/singleton\"\n },\n {\n url: \"https://client.example.com/graphql\",\n tenant: \"tenant-client\",\n authorization: \"Bearer key-client\",\n path: \"/client\"\n },\n {\n url: \"https://singleton-2.example.com/graphql\",\n tenant: \"root-2\",\n authorization: \"Bearer key-singleton-2\",\n path: \"/singleton-2\"\n }\n ]);\n });\n\n it(\"keeps the preview flag per client\", () => {\n const live = createContentClient({\n apiHost: \"https://a.example.com\",\n apiKey: \"key-a\",\n apiTenant: \"tenant-a\"\n });\n const preview = createContentClient({\n apiHost: \"https://a.example.com\",\n apiKey: \"key-a\",\n apiTenant: \"tenant-a\",\n preview: true,\n previewParams: \"wb.type=page&wb.path=/a&wb.id=page-1\"\n });\n\n expect(live.isPreviewing()).toBe(false);\n expect(preview.isPreviewing()).toBe(true);\n });\n});\n"],"names":["pageResponse","path","describe","requests","delays","beforeEach","fetchMock","vi","url","init","headers","body","JSON","delay","Promise","resolve","setTimeout","afterEach","it","clientA","createContentClient","clientB","expect","pageA","pageB","requestA","request","requestB","contentSdk","client","live","preview"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dataProviders/ApiClient.js","sources":["../../src/dataProviders/ApiClient.ts"],"sourcesContent":["interface QueryParams {\n query: string;\n variables: Record<string, any>;\n}\n\nexport interface ApiClientConfig {\n apiHost: string;\n apiKey: string;\n apiTenant: string;\n preview?: boolean;\n}\n\ntype WithPath<T> = T & {\n path?: string;\n next?: Record<string, any>;\n};\n\nexport class ApiClient {\n private readonly config: ApiClientConfig;\n\n constructor(config: ApiClientConfig) {\n this.config = config;\n }\n\n async fetch({ headers, path, ...params }: WithPath<RequestInit>): Promise<any> {\n return fetch(`${this.config.apiHost}${path}`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Tenant\": this.config.apiTenant,\n Authorization: \"Bearer \" + this.config.apiKey,\n ...headers\n },\n ...params\n }).then(res => res.json());\n }\n\n async query({ query, variables }: QueryParams, options?: { noStore?: boolean }) {\n const fetchOptions: Pick<WithPath<RequestInit>, \"cache\" | \"next\"> = options?.noStore\n ? { cache: \"no-store\" }\n : { next: { revalidate: this.config.preview ? 0 : 60 } };\n\n const request: WithPath<RequestInit> = {\n ...fetchOptions,\n path: \"/graphql\",\n method: \"POST\",\n body: JSON.stringify({\n query,\n variables\n })\n };\n\n const json = await this.fetch(request);\n\n if (json.message) {\n throw new Error(json.message);\n }\n\n if (json.errors) {\n console.error(json.errors);\n throw new Error(\"Failed to fetch API\");\n }\n\n return json.data;\n }\n}\n"],"names":["ApiClient","config","headers","path","params","fetch","res","query","variables","options","fetchOptions","request","JSON","json","Error","console"],"mappings":"AAiBO,MAAMA;IAGT,YAAYC,MAAuB,CAAE;QACjC,IAAI,CAAC,MAAM,GAAGA;IAClB;IAEA,MAAM,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAGC,QAA+B,EAAgB;QAC3E,OAAOC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAGF,MAAM,EAAE;YAC1C,QAAQ;YACR,SAAS;gBACL,gBAAgB;gBAChB,YAAY,IAAI,CAAC,MAAM,CAAC,SAAS;gBACjC,eAAe,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC7C,GAAGD,OAAO;YACd;YACA,GAAGE,MAAM;QACb,GAAG,IAAI,CAACE,CAAAA,MAAOA,IAAI,IAAI;IAC3B;IAEA,MAAM,MAAM,EAAEC,KAAK,EAAEC,SAAS,EAAe,EAAEC,OAA+B,EAAE;QAC5E,MAAMC,eAA8DD,SAAS,UACvE;YAAE,OAAO;QAAW,IACpB;YAAE,MAAM;gBAAE,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI;YAAG;QAAE;QAE3D,MAAME,UAAiC;YACnC,GAAGD,YAAY;YACf,MAAM;YACN,QAAQ;YACR,MAAME,KAAK,SAAS,CAAC;gBACjBL;gBACAC;YACJ;QACJ;QAEA,MAAMK,OAAO,MAAM,IAAI,CAAC,KAAK,CAACF;QAE9B,IAAIE,KAAK,OAAO,EACZ,MAAM,IAAIC,MAAMD,KAAK,OAAO;QAGhC,IAAIA,KAAK,MAAM,EAAE;YACbE,QAAQ,KAAK,CAACF,KAAK,MAAM;YACzB,MAAM,IAAIC,MAAM;QACpB;QAEA,OAAOD,KAAK,IAAI;IACpB;AACJ"}
1
+ {"version":3,"file":"dataProviders/ApiClient.js","sources":["../../src/dataProviders/ApiClient.ts"],"sourcesContent":["interface QueryParams {\n query: string;\n variables: Record<string, any>;\n}\n\nexport interface ApiClientConfig {\n apiHost: string;\n apiKey: string;\n apiTenant: string;\n preview?: boolean;\n}\n\ntype WithPath<T> = T & {\n path?: string;\n next?: Record<string, any>;\n};\n\nexport class ApiClient {\n private readonly config: ApiClientConfig;\n\n constructor(config: ApiClientConfig) {\n this.config = config;\n }\n\n async fetch({ headers, path, ...params }: WithPath<RequestInit>): Promise<any> {\n return fetch(`${this.config.apiHost}${path}`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Tenant\": this.config.apiTenant,\n Authorization: \"Bearer \" + this.config.apiKey,\n ...headers\n },\n ...params\n }).then(res => res.json());\n }\n\n async query({ query, variables }: QueryParams, options?: { noStore?: boolean }) {\n // Runtime reads (e.g. the experiment kill-switch) must bypass the cache so they take\n // effect immediately; everything else caches and revalidates on an interval.\n const fetchOptions: Pick<WithPath<RequestInit>, \"cache\" | \"next\"> = options?.noStore\n ? { cache: \"no-store\" }\n : { next: { revalidate: this.config.preview ? 0 : 60 } };\n\n const request: WithPath<RequestInit> = {\n ...fetchOptions,\n path: \"/graphql\",\n method: \"POST\",\n body: JSON.stringify({\n query,\n variables\n })\n };\n\n const json = await this.fetch(request);\n\n if (json.message) {\n throw new Error(json.message);\n }\n\n if (json.errors) {\n console.error(json.errors);\n throw new Error(\"Failed to fetch API\");\n }\n\n return json.data;\n }\n}\n"],"names":["ApiClient","config","headers","path","params","fetch","res","query","variables","options","fetchOptions","request","JSON","json","Error","console"],"mappings":"AAiBO,MAAMA;IAGT,YAAYC,MAAuB,CAAE;QACjC,IAAI,CAAC,MAAM,GAAGA;IAClB;IAEA,MAAM,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAGC,QAA+B,EAAgB;QAC3E,OAAOC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAGF,MAAM,EAAE;YAC1C,QAAQ;YACR,SAAS;gBACL,gBAAgB;gBAChB,YAAY,IAAI,CAAC,MAAM,CAAC,SAAS;gBACjC,eAAe,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC7C,GAAGD,OAAO;YACd;YACA,GAAGE,MAAM;QACb,GAAG,IAAI,CAACE,CAAAA,MAAOA,IAAI,IAAI;IAC3B;IAEA,MAAM,MAAM,EAAEC,KAAK,EAAEC,SAAS,EAAe,EAAEC,OAA+B,EAAE;QAG5E,MAAMC,eAA8DD,SAAS,UACvE;YAAE,OAAO;QAAW,IACpB;YAAE,MAAM;gBAAE,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI;YAAG;QAAE;QAE3D,MAAME,UAAiC;YACnC,GAAGD,YAAY;YACf,MAAM;YACN,QAAQ;YACR,MAAME,KAAK,SAAS,CAAC;gBACjBL;gBACAC;YACJ;QACJ;QAEA,MAAMK,OAAO,MAAM,IAAI,CAAC,KAAK,CAACF;QAE9B,IAAIE,KAAK,OAAO,EACZ,MAAM,IAAIC,MAAMD,KAAK,OAAO;QAGhC,IAAIA,KAAK,MAAM,EAAE;YACbE,QAAQ,KAAK,CAACF,KAAK,MAAM;YACzB,MAAM,IAAIC,MAAM;QACpB;QAEA,OAAOD,KAAK,IAAI;IACpB;AACJ"}
@@ -1,4 +1,5 @@
1
1
  import type { IDataProvider, ListPagesOptions, ListPagesResult, PublicPage } from "../types.js";
2
+ import type { ActiveExperiment, VariantContent } from "../experiments/types.js";
2
3
  import type { ApiClient } from "../dataProviders/ApiClient.js";
3
4
  interface DefaultDataProviderConfig {
4
5
  apiClient: ApiClient;
@@ -9,6 +10,9 @@ export declare class DefaultDataProvider implements IDataProvider {
9
10
  getPageByPath(path: string): Promise<PublicPage | null>;
10
11
  getPageById(id: string): Promise<PublicPage | null>;
11
12
  listPages(options?: ListPagesOptions): Promise<ListPagesResult>;
13
+ getPageExperiment(path: string): Promise<ActiveExperiment | null>;
14
+ getVariantContent(variantId: string): Promise<VariantContent | null>;
15
+ getExperimentPaused(experimentId: string): Promise<boolean>;
12
16
  private checkForErrors;
13
17
  }
14
18
  export {};
@@ -1,6 +1,9 @@
1
1
  import { GET_PAGE_BY_PATH } from "./GET_PAGE_BY_PATH.js";
2
2
  import { GET_PAGE_BY_ID } from "./GET_PAGE_BY_ID.js";
3
3
  import { LIST_PUBLISHED_PAGES } from "./LIST_PUBLISHED_PAGES.js";
4
+ import { GET_PAGE_EXPERIMENT } from "./GET_PAGE_EXPERIMENT.js";
5
+ import { GET_VARIANT_CONTENT } from "./GET_VARIANT_CONTENT.js";
6
+ import { GET_EXPERIMENT_PAUSED } from "./GET_EXPERIMENT_PAUSED.js";
4
7
  const ignoreActions = [
5
8
  ".well-known",
6
9
  "_next"
@@ -51,6 +54,38 @@ class DefaultDataProvider {
51
54
  }
52
55
  };
53
56
  }
57
+ async getPageExperiment(path) {
58
+ const result = await this.config.apiClient.query({
59
+ query: GET_PAGE_EXPERIMENT,
60
+ variables: {
61
+ path
62
+ }
63
+ });
64
+ this.checkForErrors(`getPageExperiment:${path}`, result.websiteBuilder.getPageExperiment);
65
+ return result.websiteBuilder.getPageExperiment.data ?? null;
66
+ }
67
+ async getVariantContent(variantId) {
68
+ const result = await this.config.apiClient.query({
69
+ query: GET_VARIANT_CONTENT,
70
+ variables: {
71
+ id: variantId
72
+ }
73
+ });
74
+ this.checkForErrors(`getVariantContent:${variantId}`, result.websiteBuilder.getVariantContent);
75
+ return result.websiteBuilder.getVariantContent.data ?? null;
76
+ }
77
+ async getExperimentPaused(experimentId) {
78
+ const result = await this.config.apiClient.query({
79
+ query: GET_EXPERIMENT_PAUSED,
80
+ variables: {
81
+ experimentId
82
+ }
83
+ }, {
84
+ noStore: true
85
+ });
86
+ this.checkForErrors(`getExperimentPaused:${experimentId}`, result.websiteBuilder.getExperimentPaused);
87
+ return true === result.websiteBuilder.getExperimentPaused.data;
88
+ }
54
89
  checkForErrors(action, data) {
55
90
  if (data.error) {
56
91
  if (ignoreActions.some((item)=>action.includes(item))) return;
@@ -1 +1 @@
1
- {"version":3,"file":"dataProviders/DefaultDataProvider.js","sources":["../../src/dataProviders/DefaultDataProvider.ts"],"sourcesContent":["import type { IDataProvider, ListPagesOptions, ListPagesResult, PublicPage } from \"~/types.js\";\nimport type { ApiClient } from \"~/dataProviders/ApiClient.js\";\nimport { GET_PAGE_BY_PATH } from \"./GET_PAGE_BY_PATH.js\";\nimport { GET_PAGE_BY_ID } from \"./GET_PAGE_BY_ID.js\";\nimport { LIST_PUBLISHED_PAGES } from \"./LIST_PUBLISHED_PAGES.js\";\n\ninterface DefaultDataProviderConfig {\n apiClient: ApiClient;\n}\n\nconst ignoreActions = [\".well-known\", \"_next\"];\n\nexport class DefaultDataProvider implements IDataProvider {\n private config: DefaultDataProviderConfig;\n\n constructor(config: DefaultDataProviderConfig) {\n this.config = config;\n }\n\n public async getPageByPath(path: string): Promise<PublicPage | null> {\n const result = await this.config.apiClient.query({\n query: GET_PAGE_BY_PATH,\n variables: {\n path\n }\n });\n\n this.checkForErrors(`getPageByPath:${path}`, result.websiteBuilder.getPageByPath);\n\n return result.websiteBuilder.getPageByPath.data;\n }\n\n public async getPageById(id: string): Promise<PublicPage | null> {\n const result = await this.config.apiClient.query({\n query: GET_PAGE_BY_ID,\n variables: {\n id\n }\n });\n\n this.checkForErrors(\"getPageById\", result.websiteBuilder.getPageById);\n\n return result.websiteBuilder.getPageById.data;\n }\n\n public async listPages(options?: ListPagesOptions): Promise<ListPagesResult> {\n const { where, ...rest } = options ?? {};\n\n const result = await this.config.apiClient.query({\n query: LIST_PUBLISHED_PAGES,\n variables: {\n where: {\n ...where,\n published: true\n },\n ...rest\n }\n });\n\n this.checkForErrors(\"listPages\", result.websiteBuilder.listPages);\n\n return {\n data: result.websiteBuilder.listPages.data ?? [],\n meta: result.websiteBuilder.listPages.meta ?? {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null\n }\n };\n }\n\n private checkForErrors(action: string, data: any) {\n if (data.error) {\n // TODO: investigate how these ignored actions make their way to the SDK.\n if (ignoreActions.some(item => action.includes(item))) {\n return;\n }\n console.error(`Could not execute \"${action}\". Reason: ${data.error.message}`);\n }\n }\n}\n"],"names":["ignoreActions","DefaultDataProvider","config","path","result","GET_PAGE_BY_PATH","id","GET_PAGE_BY_ID","options","where","rest","LIST_PUBLISHED_PAGES","action","data","item","console"],"mappings":";;;AAUA,MAAMA,gBAAgB;IAAC;IAAe;CAAQ;AAEvC,MAAMC;IAGT,YAAYC,MAAiC,CAAE;QAC3C,IAAI,CAAC,MAAM,GAAGA;IAClB;IAEA,MAAa,cAAcC,IAAY,EAA8B;QACjE,MAAMC,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC7C,OAAOC;YACP,WAAW;gBACPF;YACJ;QACJ;QAEA,IAAI,CAAC,cAAc,CAAC,CAAC,cAAc,EAAEA,MAAM,EAAEC,OAAO,cAAc,CAAC,aAAa;QAEhF,OAAOA,OAAO,cAAc,CAAC,aAAa,CAAC,IAAI;IACnD;IAEA,MAAa,YAAYE,EAAU,EAA8B;QAC7D,MAAMF,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC7C,OAAOG;YACP,WAAW;gBACPD;YACJ;QACJ;QAEA,IAAI,CAAC,cAAc,CAAC,eAAeF,OAAO,cAAc,CAAC,WAAW;QAEpE,OAAOA,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI;IACjD;IAEA,MAAa,UAAUI,OAA0B,EAA4B;QACzE,MAAM,EAAEC,KAAK,EAAE,GAAGC,MAAM,GAAGF,WAAW,CAAC;QAEvC,MAAMJ,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC7C,OAAOO;YACP,WAAW;gBACP,OAAO;oBACH,GAAGF,KAAK;oBACR,WAAW;gBACf;gBACA,GAAGC,IAAI;YACX;QACJ;QAEA,IAAI,CAAC,cAAc,CAAC,aAAaN,OAAO,cAAc,CAAC,SAAS;QAEhE,OAAO;YACH,MAAMA,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE;YAChD,MAAMA,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,IAAI;gBAC1C,cAAc;gBACd,YAAY;gBACZ,QAAQ;YACZ;QACJ;IACJ;IAEQ,eAAeQ,MAAc,EAAEC,IAAS,EAAE;QAC9C,IAAIA,KAAK,KAAK,EAAE;YAEZ,IAAIb,cAAc,IAAI,CAACc,CAAAA,OAAQF,OAAO,QAAQ,CAACE,QAC3C;YAEJC,QAAQ,KAAK,CAAC,CAAC,mBAAmB,EAAEH,OAAO,WAAW,EAAEC,KAAK,KAAK,CAAC,OAAO,EAAE;QAChF;IACJ;AACJ"}
1
+ {"version":3,"file":"dataProviders/DefaultDataProvider.js","sources":["../../src/dataProviders/DefaultDataProvider.ts"],"sourcesContent":["import type { IDataProvider, ListPagesOptions, ListPagesResult, PublicPage } from \"~/types.js\";\nimport type { ActiveExperiment, VariantContent } from \"~/experiments/types.js\";\nimport type { ApiClient } from \"~/dataProviders/ApiClient.js\";\nimport { GET_PAGE_BY_PATH } from \"./GET_PAGE_BY_PATH.js\";\nimport { GET_PAGE_BY_ID } from \"./GET_PAGE_BY_ID.js\";\nimport { LIST_PUBLISHED_PAGES } from \"./LIST_PUBLISHED_PAGES.js\";\nimport { GET_PAGE_EXPERIMENT } from \"./GET_PAGE_EXPERIMENT.js\";\nimport { GET_VARIANT_CONTENT } from \"./GET_VARIANT_CONTENT.js\";\nimport { GET_EXPERIMENT_PAUSED } from \"./GET_EXPERIMENT_PAUSED.js\";\n\ninterface DefaultDataProviderConfig {\n apiClient: ApiClient;\n}\n\nconst ignoreActions = [\".well-known\", \"_next\"];\n\nexport class DefaultDataProvider implements IDataProvider {\n private config: DefaultDataProviderConfig;\n\n constructor(config: DefaultDataProviderConfig) {\n this.config = config;\n }\n\n public async getPageByPath(path: string): Promise<PublicPage | null> {\n const result = await this.config.apiClient.query({\n query: GET_PAGE_BY_PATH,\n variables: {\n path\n }\n });\n\n this.checkForErrors(`getPageByPath:${path}`, result.websiteBuilder.getPageByPath);\n\n return result.websiteBuilder.getPageByPath.data;\n }\n\n public async getPageById(id: string): Promise<PublicPage | null> {\n const result = await this.config.apiClient.query({\n query: GET_PAGE_BY_ID,\n variables: {\n id\n }\n });\n\n this.checkForErrors(\"getPageById\", result.websiteBuilder.getPageById);\n\n return result.websiteBuilder.getPageById.data;\n }\n\n public async listPages(options?: ListPagesOptions): Promise<ListPagesResult> {\n const { where, ...rest } = options ?? {};\n\n const result = await this.config.apiClient.query({\n query: LIST_PUBLISHED_PAGES,\n variables: {\n where: {\n ...where,\n published: true\n },\n ...rest\n }\n });\n\n this.checkForErrors(\"listPages\", result.websiteBuilder.listPages);\n\n return {\n data: result.websiteBuilder.listPages.data ?? [],\n meta: result.websiteBuilder.listPages.meta ?? {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null\n }\n };\n }\n\n public async getPageExperiment(path: string): Promise<ActiveExperiment | null> {\n const result = await this.config.apiClient.query({\n query: GET_PAGE_EXPERIMENT,\n variables: {\n path\n }\n });\n\n this.checkForErrors(`getPageExperiment:${path}`, result.websiteBuilder.getPageExperiment);\n\n return result.websiteBuilder.getPageExperiment.data ?? null;\n }\n\n public async getVariantContent(variantId: string): Promise<VariantContent | null> {\n const result = await this.config.apiClient.query({\n query: GET_VARIANT_CONTENT,\n variables: {\n id: variantId\n }\n });\n\n this.checkForErrors(\n `getVariantContent:${variantId}`,\n result.websiteBuilder.getVariantContent\n );\n\n return result.websiteBuilder.getVariantContent.data ?? null;\n }\n\n public async getExperimentPaused(experimentId: string): Promise<boolean> {\n // Uncached: the kill-switch must take effect immediately, even while page/variant content\n // stays cached.\n const result = await this.config.apiClient.query(\n {\n query: GET_EXPERIMENT_PAUSED,\n variables: { experimentId }\n },\n { noStore: true }\n );\n\n this.checkForErrors(\n `getExperimentPaused:${experimentId}`,\n result.websiteBuilder.getExperimentPaused\n );\n\n return result.websiteBuilder.getExperimentPaused.data === true;\n }\n\n private checkForErrors(action: string, data: any) {\n if (data.error) {\n // TODO: investigate how these ignored actions make their way to the SDK.\n if (ignoreActions.some(item => action.includes(item))) {\n return;\n }\n console.error(`Could not execute \"${action}\". Reason: ${data.error.message}`);\n }\n }\n}\n"],"names":["ignoreActions","DefaultDataProvider","config","path","result","GET_PAGE_BY_PATH","id","GET_PAGE_BY_ID","options","where","rest","LIST_PUBLISHED_PAGES","GET_PAGE_EXPERIMENT","variantId","GET_VARIANT_CONTENT","experimentId","GET_EXPERIMENT_PAUSED","action","data","item","console"],"mappings":";;;;;;AAcA,MAAMA,gBAAgB;IAAC;IAAe;CAAQ;AAEvC,MAAMC;IAGT,YAAYC,MAAiC,CAAE;QAC3C,IAAI,CAAC,MAAM,GAAGA;IAClB;IAEA,MAAa,cAAcC,IAAY,EAA8B;QACjE,MAAMC,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC7C,OAAOC;YACP,WAAW;gBACPF;YACJ;QACJ;QAEA,IAAI,CAAC,cAAc,CAAC,CAAC,cAAc,EAAEA,MAAM,EAAEC,OAAO,cAAc,CAAC,aAAa;QAEhF,OAAOA,OAAO,cAAc,CAAC,aAAa,CAAC,IAAI;IACnD;IAEA,MAAa,YAAYE,EAAU,EAA8B;QAC7D,MAAMF,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC7C,OAAOG;YACP,WAAW;gBACPD;YACJ;QACJ;QAEA,IAAI,CAAC,cAAc,CAAC,eAAeF,OAAO,cAAc,CAAC,WAAW;QAEpE,OAAOA,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI;IACjD;IAEA,MAAa,UAAUI,OAA0B,EAA4B;QACzE,MAAM,EAAEC,KAAK,EAAE,GAAGC,MAAM,GAAGF,WAAW,CAAC;QAEvC,MAAMJ,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC7C,OAAOO;YACP,WAAW;gBACP,OAAO;oBACH,GAAGF,KAAK;oBACR,WAAW;gBACf;gBACA,GAAGC,IAAI;YACX;QACJ;QAEA,IAAI,CAAC,cAAc,CAAC,aAAaN,OAAO,cAAc,CAAC,SAAS;QAEhE,OAAO;YACH,MAAMA,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE;YAChD,MAAMA,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,IAAI;gBAC1C,cAAc;gBACd,YAAY;gBACZ,QAAQ;YACZ;QACJ;IACJ;IAEA,MAAa,kBAAkBD,IAAY,EAAoC;QAC3E,MAAMC,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC7C,OAAOQ;YACP,WAAW;gBACPT;YACJ;QACJ;QAEA,IAAI,CAAC,cAAc,CAAC,CAAC,kBAAkB,EAAEA,MAAM,EAAEC,OAAO,cAAc,CAAC,iBAAiB;QAExF,OAAOA,OAAO,cAAc,CAAC,iBAAiB,CAAC,IAAI,IAAI;IAC3D;IAEA,MAAa,kBAAkBS,SAAiB,EAAkC;QAC9E,MAAMT,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC7C,OAAOU;YACP,WAAW;gBACP,IAAID;YACR;QACJ;QAEA,IAAI,CAAC,cAAc,CACf,CAAC,kBAAkB,EAAEA,WAAW,EAChCT,OAAO,cAAc,CAAC,iBAAiB;QAG3C,OAAOA,OAAO,cAAc,CAAC,iBAAiB,CAAC,IAAI,IAAI;IAC3D;IAEA,MAAa,oBAAoBW,YAAoB,EAAoB;QAGrE,MAAMX,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAC5C;YACI,OAAOY;YACP,WAAW;gBAAED;YAAa;QAC9B,GACA;YAAE,SAAS;QAAK;QAGpB,IAAI,CAAC,cAAc,CACf,CAAC,oBAAoB,EAAEA,cAAc,EACrCX,OAAO,cAAc,CAAC,mBAAmB;QAG7C,OAAOA,AAAmD,SAAnDA,OAAO,cAAc,CAAC,mBAAmB,CAAC,IAAI;IACzD;IAEQ,eAAea,MAAc,EAAEC,IAAS,EAAE;QAC9C,IAAIA,KAAK,KAAK,EAAE;YAEZ,IAAIlB,cAAc,IAAI,CAACmB,CAAAA,OAAQF,OAAO,QAAQ,CAACE,QAC3C;YAEJC,QAAQ,KAAK,CAAC,CAAC,mBAAmB,EAAEH,OAAO,WAAW,EAAEC,KAAK,KAAK,CAAC,OAAO,EAAE;QAChF;IACJ;AACJ"}
@@ -0,0 +1 @@
1
+ export declare const GET_EXPERIMENT_PAUSED = "\n query GetExperimentPaused($experimentId: String!) {\n websiteBuilder {\n getExperimentPaused(experimentId: $experimentId) {\n data\n error {\n code\n message\n data\n }\n }\n }\n }\n";
@@ -0,0 +1,17 @@
1
+ const GET_EXPERIMENT_PAUSED = `
2
+ query GetExperimentPaused($experimentId: String!) {
3
+ websiteBuilder {
4
+ getExperimentPaused(experimentId: $experimentId) {
5
+ data
6
+ error {
7
+ code
8
+ message
9
+ data
10
+ }
11
+ }
12
+ }
13
+ }
14
+ `;
15
+ export { GET_EXPERIMENT_PAUSED };
16
+
17
+ //# sourceMappingURL=GET_EXPERIMENT_PAUSED.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataProviders/GET_EXPERIMENT_PAUSED.js","sources":["../../src/dataProviders/GET_EXPERIMENT_PAUSED.ts"],"sourcesContent":["export const GET_EXPERIMENT_PAUSED = /* GraphQL*/ `\n query GetExperimentPaused($experimentId: String!) {\n websiteBuilder {\n getExperimentPaused(experimentId: $experimentId) {\n data\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n"],"names":["GET_EXPERIMENT_PAUSED"],"mappings":"AAAO,MAAMA,wBAAqC,CAAC;;;;;;;;;;;;;AAanD,CAAC"}
@@ -1 +1 @@
1
- export declare const GET_PAGE_BY_ID = "\n query GetPageById($id: ID!) {\n websiteBuilder {\n getPageById(id: $id) {\n data {\n id\n properties\n elements\n bindings\n extensions\n languagePaths\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n";
1
+ export declare const GET_PAGE_BY_ID = "\n query GetPageById($id: ID!) {\n websiteBuilder {\n getPageById(id: $id) {\n data {\n id\n version\n properties\n metadata\n elements\n bindings\n extensions\n languagePaths\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n";
@@ -4,7 +4,9 @@ const GET_PAGE_BY_ID = `
4
4
  getPageById(id: $id) {
5
5
  data {
6
6
  id
7
+ version
7
8
  properties
9
+ metadata
8
10
  elements
9
11
  bindings
10
12
  extensions
@@ -1 +1 @@
1
- {"version":3,"file":"dataProviders/GET_PAGE_BY_ID.js","sources":["../../src/dataProviders/GET_PAGE_BY_ID.ts"],"sourcesContent":["export const GET_PAGE_BY_ID = /* GraphQL*/ `\n query GetPageById($id: ID!) {\n websiteBuilder {\n getPageById(id: $id) {\n data {\n id\n properties\n elements\n bindings\n extensions\n languagePaths\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n"],"names":["GET_PAGE_BY_ID"],"mappings":"AAAO,MAAMA,iBAA8B,CAAC;;;;;;;;;;;;;;;;;;;;AAoB5C,CAAC"}
1
+ {"version":3,"file":"dataProviders/GET_PAGE_BY_ID.js","sources":["../../src/dataProviders/GET_PAGE_BY_ID.ts"],"sourcesContent":["export const GET_PAGE_BY_ID = /* GraphQL*/ `\n query GetPageById($id: ID!) {\n websiteBuilder {\n getPageById(id: $id) {\n data {\n id\n version\n properties\n metadata\n elements\n bindings\n extensions\n languagePaths\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n"],"names":["GET_PAGE_BY_ID"],"mappings":"AAAO,MAAMA,iBAA8B,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsB5C,CAAC"}
@@ -1 +1 @@
1
- export declare const GET_PAGE_BY_PATH = "\n query GetPageByPath($path: String!) {\n websiteBuilder {\n getPageByPath(path: $path) {\n data {\n id\n properties\n elements\n bindings\n extensions\n languagePaths\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n";
1
+ export declare const GET_PAGE_BY_PATH = "\n query GetPageByPath($path: String!) {\n websiteBuilder {\n getPageByPath(path: $path) {\n data {\n id\n version\n properties\n metadata\n elements\n bindings\n extensions\n languagePaths\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n";
@@ -4,7 +4,9 @@ const GET_PAGE_BY_PATH = `
4
4
  getPageByPath(path: $path) {
5
5
  data {
6
6
  id
7
+ version
7
8
  properties
9
+ metadata
8
10
  elements
9
11
  bindings
10
12
  extensions
@@ -1 +1 @@
1
- {"version":3,"file":"dataProviders/GET_PAGE_BY_PATH.js","sources":["../../src/dataProviders/GET_PAGE_BY_PATH.ts"],"sourcesContent":["export const GET_PAGE_BY_PATH = /* GraphQL*/ `\n query GetPageByPath($path: String!) {\n websiteBuilder {\n getPageByPath(path: $path) {\n data {\n id\n properties\n elements\n bindings\n extensions\n languagePaths\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n"],"names":["GET_PAGE_BY_PATH"],"mappings":"AAAO,MAAMA,mBAAgC,CAAC;;;;;;;;;;;;;;;;;;;;AAoB9C,CAAC"}
1
+ {"version":3,"file":"dataProviders/GET_PAGE_BY_PATH.js","sources":["../../src/dataProviders/GET_PAGE_BY_PATH.ts"],"sourcesContent":["export const GET_PAGE_BY_PATH = /* GraphQL*/ `\n query GetPageByPath($path: String!) {\n websiteBuilder {\n getPageByPath(path: $path) {\n data {\n id\n version\n properties\n metadata\n elements\n bindings\n extensions\n languagePaths\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n"],"names":["GET_PAGE_BY_PATH"],"mappings":"AAAO,MAAMA,mBAAgC,CAAC;;;;;;;;;;;;;;;;;;;;;;AAsB9C,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const GET_PAGE_EXPERIMENT = "\n query GetPageExperiment($path: String!) {\n websiteBuilder {\n getPageExperiment(path: $path) {\n data {\n experimentId\n revisionId\n pageEntryId\n path\n status\n controlVariantId\n tenantId\n trafficSplit\n targeting\n analytics\n variants {\n variantId\n name\n }\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n";
@@ -0,0 +1,32 @@
1
+ const GET_PAGE_EXPERIMENT = `
2
+ query GetPageExperiment($path: String!) {
3
+ websiteBuilder {
4
+ getPageExperiment(path: $path) {
5
+ data {
6
+ experimentId
7
+ revisionId
8
+ pageEntryId
9
+ path
10
+ status
11
+ controlVariantId
12
+ tenantId
13
+ trafficSplit
14
+ targeting
15
+ analytics
16
+ variants {
17
+ variantId
18
+ name
19
+ }
20
+ }
21
+ error {
22
+ code
23
+ message
24
+ data
25
+ }
26
+ }
27
+ }
28
+ }
29
+ `;
30
+ export { GET_PAGE_EXPERIMENT };
31
+
32
+ //# sourceMappingURL=GET_PAGE_EXPERIMENT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataProviders/GET_PAGE_EXPERIMENT.js","sources":["../../src/dataProviders/GET_PAGE_EXPERIMENT.ts"],"sourcesContent":["export const GET_PAGE_EXPERIMENT = /* GraphQL*/ `\n query GetPageExperiment($path: String!) {\n websiteBuilder {\n getPageExperiment(path: $path) {\n data {\n experimentId\n revisionId\n pageEntryId\n path\n status\n controlVariantId\n tenantId\n trafficSplit\n targeting\n analytics\n variants {\n variantId\n name\n }\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n"],"names":["GET_PAGE_EXPERIMENT"],"mappings":"AAAO,MAAMA,sBAAmC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BjD,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const GET_VARIANT_CONTENT = "\n query GetVariantContent($id: ID!) {\n websiteBuilder {\n getVariantContent(id: $id) {\n data {\n id\n properties\n elements\n bindings\n extensions\n metadata\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n";
@@ -0,0 +1,24 @@
1
+ const GET_VARIANT_CONTENT = `
2
+ query GetVariantContent($id: ID!) {
3
+ websiteBuilder {
4
+ getVariantContent(id: $id) {
5
+ data {
6
+ id
7
+ properties
8
+ elements
9
+ bindings
10
+ extensions
11
+ metadata
12
+ }
13
+ error {
14
+ code
15
+ message
16
+ data
17
+ }
18
+ }
19
+ }
20
+ }
21
+ `;
22
+ export { GET_VARIANT_CONTENT };
23
+
24
+ //# sourceMappingURL=GET_VARIANT_CONTENT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataProviders/GET_VARIANT_CONTENT.js","sources":["../../src/dataProviders/GET_VARIANT_CONTENT.ts"],"sourcesContent":["export const GET_VARIANT_CONTENT = /* GraphQL*/ `\n query GetVariantContent($id: ID!) {\n websiteBuilder {\n getVariantContent(id: $id) {\n data {\n id\n properties\n elements\n bindings\n extensions\n metadata\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n"],"names":["GET_VARIANT_CONTENT"],"mappings":"AAAO,MAAMA,sBAAmC,CAAC;;;;;;;;;;;;;;;;;;;;AAoBjD,CAAC"}
@@ -1,8 +1,12 @@
1
1
  import type { IDataProvider, PublicRedirect } from "../types.js";
2
2
  import type { PublicPage } from "../types.js";
3
+ import type { ActiveExperiment, VariantContent } from "../experiments/types.js";
3
4
  export declare class NullDataProvider implements IDataProvider {
4
5
  getPageById(): Promise<PublicPage | null>;
5
6
  getPageByPath(): Promise<PublicPage | null>;
7
+ getPageExperiment(): Promise<ActiveExperiment | null>;
8
+ getVariantContent(): Promise<VariantContent | null>;
9
+ getExperimentPaused(): Promise<boolean>;
6
10
  listPages(): Promise<{
7
11
  data: never[];
8
12
  meta: {
@@ -5,6 +5,15 @@ class NullDataProvider {
5
5
  getPageByPath() {
6
6
  return Promise.resolve(null);
7
7
  }
8
+ getPageExperiment() {
9
+ return Promise.resolve(null);
10
+ }
11
+ getVariantContent() {
12
+ return Promise.resolve(null);
13
+ }
14
+ getExperimentPaused() {
15
+ return Promise.resolve(false);
16
+ }
8
17
  async listPages() {
9
18
  return {
10
19
  data: [],
@@ -1 +1 @@
1
- {"version":3,"file":"dataProviders/NullDataProvider.js","sources":["../../src/dataProviders/NullDataProvider.ts"],"sourcesContent":["import type { IDataProvider, PublicRedirect } from \"~/types.js\";\nimport type { PublicPage } from \"~/types.js\";\n\nexport class NullDataProvider implements IDataProvider {\n getPageById(): Promise<PublicPage | null> {\n return Promise.resolve(null);\n }\n\n getPageByPath(): Promise<PublicPage | null> {\n return Promise.resolve(null);\n }\n\n public async listPages() {\n return { data: [], meta: { hasMoreItems: false, totalCount: 0, cursor: null } };\n }\n\n listRedirects(): Promise<PublicRedirect[]> {\n return Promise.resolve([]);\n }\n}\n"],"names":["NullDataProvider","Promise"],"mappings":"AAGO,MAAMA;IACT,cAA0C;QACtC,OAAOC,QAAQ,OAAO,CAAC;IAC3B;IAEA,gBAA4C;QACxC,OAAOA,QAAQ,OAAO,CAAC;IAC3B;IAEA,MAAa,YAAY;QACrB,OAAO;YAAE,MAAM,EAAE;YAAE,MAAM;gBAAE,cAAc;gBAAO,YAAY;gBAAG,QAAQ;YAAK;QAAE;IAClF;IAEA,gBAA2C;QACvC,OAAOA,QAAQ,OAAO,CAAC,EAAE;IAC7B;AACJ"}
1
+ {"version":3,"file":"dataProviders/NullDataProvider.js","sources":["../../src/dataProviders/NullDataProvider.ts"],"sourcesContent":["import type { IDataProvider, PublicRedirect } from \"~/types.js\";\nimport type { PublicPage } from \"~/types.js\";\nimport type { ActiveExperiment, VariantContent } from \"~/experiments/types.js\";\n\nexport class NullDataProvider implements IDataProvider {\n getPageById(): Promise<PublicPage | null> {\n return Promise.resolve(null);\n }\n\n getPageByPath(): Promise<PublicPage | null> {\n return Promise.resolve(null);\n }\n\n getPageExperiment(): Promise<ActiveExperiment | null> {\n return Promise.resolve(null);\n }\n\n getVariantContent(): Promise<VariantContent | null> {\n return Promise.resolve(null);\n }\n\n getExperimentPaused(): Promise<boolean> {\n return Promise.resolve(false);\n }\n\n public async listPages() {\n return { data: [], meta: { hasMoreItems: false, totalCount: 0, cursor: null } };\n }\n\n listRedirects(): Promise<PublicRedirect[]> {\n return Promise.resolve([]);\n }\n}\n"],"names":["NullDataProvider","Promise"],"mappings":"AAIO,MAAMA;IACT,cAA0C;QACtC,OAAOC,QAAQ,OAAO,CAAC;IAC3B;IAEA,gBAA4C;QACxC,OAAOA,QAAQ,OAAO,CAAC;IAC3B;IAEA,oBAAsD;QAClD,OAAOA,QAAQ,OAAO,CAAC;IAC3B;IAEA,oBAAoD;QAChD,OAAOA,QAAQ,OAAO,CAAC;IAC3B;IAEA,sBAAwC;QACpC,OAAOA,QAAQ,OAAO,CAAC;IAC3B;IAEA,MAAa,YAAY;QACrB,OAAO;YAAE,MAAM,EAAE;YAAE,MAAM;gBAAE,cAAc;gBAAO,YAAY;gBAAG,QAAQ;YAAK;QAAE;IAClF;IAEA,gBAA2C;QACvC,OAAOA,QAAQ,OAAO,CAAC,EAAE;IAC7B;AACJ"}
@@ -0,0 +1 @@
1
+ export {};