@picked/client 0.0.72-next.1 → 0.0.72-next.3

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 (70) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/{api-B9DDtylO.cjs → api-B4qxWoQN.cjs} +1 -1
  3. package/dist/{api-BmzHzzpu.js → api-DNvaLWw_.js} +1 -1
  4. package/dist/cjs/index.js +2 -2
  5. package/dist/cjs/plugins/dynamic-experiences/index.js +1 -1
  6. package/dist/cjs/server/index.js +1 -1
  7. package/dist/docs/explanation/content-references.md +99 -0
  8. package/dist/docs/explanation/how-picked-works.md +25 -3
  9. package/dist/docs/explanation/the-content-model.md +38 -28
  10. package/dist/docs/how-to/create-a-content-entry.md +48 -0
  11. package/dist/docs/how-to/define-a-page-layout.md +12 -5
  12. package/dist/docs/how-to/point-one-entry-at-another.md +61 -0
  13. package/dist/docs/how-to/read-a-referenced-entry.md +111 -0
  14. package/dist/docs/how-to/reuse-a-section.md +26 -10
  15. package/dist/docs/index.md +1 -1
  16. package/dist/docs/reference/dashboard/content/blocks.mdx +57 -0
  17. package/dist/docs/reference/dashboard/content/content-entries.mdx +61 -10
  18. package/dist/docs/reference/dashboard/content/models.mdx +108 -0
  19. package/dist/docs/reference/dashboard/content/pages.mdx +4 -3
  20. package/dist/docs/reference/dashboard/fields.mdx +1 -1
  21. package/dist/docs/reference/dashboard/steps.mdx +2 -2
  22. package/dist/docs/reference/delivery-api/experience-content.md +68 -13
  23. package/dist/docs/reference/glossary.md +13 -5
  24. package/dist/docs/reference/management-api/error-handling.md +2 -2
  25. package/dist/docs/reference/sdk/content.md +216 -0
  26. package/dist/docs/reference/sdk/plugins/dynamic-experiences.md +51 -3
  27. package/dist/docs/reference/sdk/ssr/serialize.md +6 -3
  28. package/dist/docs/reference/tools/vite-plugin.md +90 -8
  29. package/dist/docs/tutorials/first-api-call.md +1 -1
  30. package/dist/docs/tutorials/first-server-rendered-page.mdx +1 -1
  31. package/dist/esm/index.js +484 -429
  32. package/dist/esm/plugins/dynamic-experiences/index.js +4 -3
  33. package/dist/esm/server/index.js +43 -46
  34. package/dist/plugin-DkSWIASL.cjs +1 -0
  35. package/dist/plugin-DviILBha.js +153 -0
  36. package/dist/provider-Bskcgd6U.js +68 -0
  37. package/dist/provider-Bv5nM3So.cjs +1 -0
  38. package/dist/registry-BMXsAEbZ.cjs +1 -0
  39. package/dist/registry-DjBZ8upD.js +74 -0
  40. package/dist/types/data-source/api.d.ts +60 -0
  41. package/dist/types/data-source/api.d.ts.map +1 -0
  42. package/dist/types/data-source/provider.d.ts +90 -0
  43. package/dist/types/data-source/provider.d.ts.map +1 -0
  44. package/dist/types/data-source/registry.d.ts +26 -0
  45. package/dist/types/data-source/registry.d.ts.map +1 -0
  46. package/dist/types/data-source/virtual-data.d.ts +19 -0
  47. package/dist/types/data-source/virtual-data.d.ts.map +1 -0
  48. package/dist/types/entities/content/reference.d.ts +101 -0
  49. package/dist/types/entities/content/reference.d.ts.map +1 -0
  50. package/dist/types/exports.d.ts +2 -0
  51. package/dist/types/exports.d.ts.map +1 -1
  52. package/dist/types/index.d.ts +1 -0
  53. package/dist/types/index.d.ts.map +1 -1
  54. package/dist/types/picked.d.ts +65 -1
  55. package/dist/types/picked.d.ts.map +1 -1
  56. package/dist/types/plugins/dynamic-experiences/index.d.ts +1 -0
  57. package/dist/types/plugins/dynamic-experiences/index.d.ts.map +1 -1
  58. package/dist/types/plugins/dynamic-experiences/plugin.d.ts +9 -40
  59. package/dist/types/plugins/dynamic-experiences/plugin.d.ts.map +1 -1
  60. package/dist/types/plugins/dynamic-experiences/types.d.ts +25 -23
  61. package/dist/types/plugins/dynamic-experiences/types.d.ts.map +1 -1
  62. package/dist/types/server/index.d.ts +1 -1
  63. package/dist/types/server/index.d.ts.map +1 -1
  64. package/dist/types/server/serialize.d.ts +27 -34
  65. package/dist/types/server/serialize.d.ts.map +1 -1
  66. package/package.json +3 -3
  67. package/dist/docs/reference/dashboard/content/layouts.mdx +0 -62
  68. package/dist/docs/reference/dashboard/content/sections.mdx +0 -28
  69. package/dist/plugin-CZN0_kqv.js +0 -252
  70. package/dist/plugin-SFx511s_.cjs +0 -1
@@ -1,3 +1,4 @@
1
- import { i as e } from "../../../api-BmzHzzpu.js";
2
- import { n as t, r as n, t as r } from "../../../plugin-CZN0_kqv.js";
3
- export { e as createClientHeaders, r as dynamicExperiencesPlugin, t as fetchExperienceContent, n as fetchProject };
1
+ import { i as e } from "../../../api-DNvaLWw_.js";
2
+ import { t } from "../../../plugin-DviILBha.js";
3
+ import { a as n, i as r, n as i } from "../../../registry-DjBZ8upD.js";
4
+ export { e as createClientHeaders, t as dynamicExperiencesPlugin, r as fetchExperienceContent, n as fetchProject, i as registerPickedBundle };
@@ -1,44 +1,41 @@
1
1
  import { a as e, c as t, i as n, o as r, s as i, t as a, u as o } from "../../experience-instance-DGk11d8a.js";
2
- import { i as s, n as c } from "../../plugin-CZN0_kqv.js";
3
- import { attach as l, createEffect as u, createEvent as d, createStore as f, sample as p } from "effector";
2
+ import { n as s } from "../../plugin-DviILBha.js";
3
+ import { attach as c, createEffect as l, createEvent as u, createStore as d, sample as f } from "effector";
4
4
  //#region src/server/serialize.ts
5
- var m = 1e4;
6
- function h(e) {
5
+ var p = 1e4;
6
+ function m(e) {
7
7
  if (e?.location !== void 0) return { location: e.location };
8
8
  }
9
- function g(e, t) {
9
+ function h(e, t) {
10
10
  return e.nodes.filter(o).some((e) => t.get(e.stepId) === !0);
11
11
  }
12
- async function _(e, t) {
13
- let { projectConfig: n } = t, i = e.session.store.getState().id;
14
- e.conditionResults.reset(), s(e, n, {
12
+ async function g(e, n = {}) {
13
+ let i = n.previewToken === void 0 ? void 0 : { previewToken: n.previewToken }, a = await e.getProjectConfig(i), o = e.session.store.getState().id;
14
+ e.conditionResults.reset(), s(e, a, {
15
15
  isPreview: !1,
16
- sessionId: i
16
+ sessionId: o
17
17
  });
18
- let a = h(t.attributes), o = t.timeoutMs ?? m, l = new Map(n.steps.map((e) => [e.id, e.layoutContentId !== void 0 && e.layoutContentId !== null])), u = [];
19
- for (let t of n.experiences) await r(e, { condition: t.condition }, { context: a }) && u.push(t);
20
- let d = /* @__PURE__ */ new Map();
21
- for (let n of u) {
22
- if (!g(n, l)) continue;
23
- let r = t.getContent ? await t.getContent({
24
- id: n.id,
25
- key: n.key
26
- }, { previewToken: t.previewToken }) : await c(e.apiUrl, e.projectId, n.id, {
27
- previewToken: t.previewToken,
28
- signal: AbortSignal.timeout(o)
29
- });
30
- if (r) for (let e of r.content) d.set(e.id, e);
31
- }
18
+ let c = m(n.attributes), l = n.timeoutMs ?? p, u = new Map(a.steps.map((e) => [e.id, e.layoutContentId !== void 0 && e.layoutContentId !== null])), d = Object.fromEntries(a.conditions.map((e) => [e.key, e])), f = a.experiences.filter((e) => !t(e.condition, d)), g = (await Promise.all(f.map(async (t) => ({
19
+ experience: t,
20
+ active: await r(e, { condition: t.condition }, { context: c })
21
+ })))).filter((e) => e.active).map((e) => e.experience), _ = await Promise.all(g.filter((e) => h(e, u)).map((t) => e.getExperienceContent({
22
+ id: t.id,
23
+ key: t.key
24
+ }, {
25
+ ...i,
26
+ signal: AbortSignal.timeout(l)
27
+ }))), v = /* @__PURE__ */ new Map();
28
+ for (let e of _) if (e) for (let t of [...e.references ?? [], ...e.content]) v.set(t.id, t);
32
29
  return {
33
- versionId: n.versionId,
34
- projectConfig: n,
35
- content: Array.from(d.values()),
30
+ versionId: a.versionId,
31
+ projectConfig: a,
32
+ content: Array.from(v.values()),
36
33
  conditionResults: e.conditionResults.store.getState()
37
34
  };
38
35
  }
39
36
  //#endregion
40
37
  //#region src/server/index.ts
41
- function v() {
38
+ function _() {
42
39
  let e, t;
43
40
  return {
44
41
  promise: new Promise((n, r) => {
@@ -48,16 +45,16 @@ function v() {
48
45
  reject: (e) => t(e)
49
46
  };
50
47
  }
51
- function y(e, t) {
52
- let { promise: n, resolve: r } = v(), i = d(), o = d(), s = d(), c = d(), m = d(), h = e.experiences.listStore.map((t) => t.map((t) => a({
48
+ function v(e, t) {
49
+ let { promise: n, resolve: r } = _(), i = u(), o = u(), s = u(), p = u(), m = u(), h = e.experiences.listStore.map((t) => t.map((t) => a({
53
50
  client: e,
54
51
  experience: t
55
- }))), g = f({
52
+ }))), g = d({
56
53
  currentExperienceIndex: 0,
57
54
  renderedExperiences: [],
58
55
  isComplete: !1
59
- }), _ = u(async (t) => {
60
- let n = l({
56
+ }), v = l(async (t) => {
57
+ let n = c({
61
58
  source: t.experience.componentStore,
62
59
  effect: async (n, r) => {
63
60
  let i = t.availableRenderers[r];
@@ -72,7 +69,7 @@ function y(e, t) {
72
69
  if (t) return t;
73
70
  }
74
71
  return null;
75
- }), y = u(async ({ experience: e, availableRenderers: t, startRendererIndex: n = 0 }) => e ? _({
72
+ }), y = l(async ({ experience: e, availableRenderers: t, startRendererIndex: n = 0 }) => e ? v({
76
73
  experience: e,
77
74
  availableRenderers: t,
78
75
  startRendererIndex: n
@@ -84,13 +81,13 @@ function y(e, t) {
84
81
  })).on(m, (e) => ({
85
82
  ...e,
86
83
  currentExperienceIndex: e.currentExperienceIndex + 1
87
- })).on(c, (e) => ({
84
+ })).on(p, (e) => ({
88
85
  ...e,
89
86
  isComplete: !0
90
- })).reset(i), p({
87
+ })).reset(i), f({
91
88
  clock: i,
92
89
  target: o
93
- }), p({
90
+ }), f({
94
91
  clock: o,
95
92
  source: {
96
93
  experiences: h,
@@ -103,22 +100,22 @@ function y(e, t) {
103
100
  startRendererIndex: 0
104
101
  }),
105
102
  target: y
106
- }), p({
103
+ }), f({
107
104
  clock: y.doneData,
108
105
  filter: (e) => e !== null,
109
106
  fn: (e) => e.rendered.body,
110
107
  target: s
111
- }), p({
108
+ }), f({
112
109
  clock: s,
113
110
  target: o
114
- }), p({
111
+ }), f({
115
112
  clock: y.doneData,
116
113
  filter: (e) => e === null,
117
114
  target: m
118
- }), p({
115
+ }), f({
119
116
  clock: m,
120
117
  target: o
121
- }), p({
118
+ }), f({
122
119
  clock: [
123
120
  o,
124
121
  m,
@@ -129,18 +126,18 @@ function y(e, t) {
129
126
  state: g
130
127
  },
131
128
  filter: ({ experiences: e, state: t }) => t.currentExperienceIndex >= e.length,
132
- target: c
129
+ target: p
133
130
  });
134
- let b = l({
131
+ let b = c({
135
132
  source: g,
136
133
  effect: (e) => {
137
134
  e.isComplete && r(e.renderedExperiences);
138
135
  }
139
136
  });
140
- return p({
141
- clock: c,
137
+ return f({
138
+ clock: p,
142
139
  target: b
143
140
  }), i(), n;
144
141
  }
145
142
  //#endregion
146
- export { a as createExperienceInstance, n as evaluateConditionMemo, e as hashRule, r as isExperienceActive, s as registerProjectConfig, y as render, i as ruleReferencesAction, t as ruleReferencesActionDeep, _ as serialize };
143
+ export { a as createExperienceInstance, n as evaluateConditionMemo, e as hashRule, r as isExperienceActive, s as registerProjectConfig, v as render, i as ruleReferencesAction, t as ruleReferencesActionDeep, g as serialize };
@@ -0,0 +1 @@
1
+ require("./logger-CSTvAyyB.cjs");let e=require("effector");function t(e){let t=2166136261;for(let n of e)t^=n.codePointAt(0)??0,t=Math.imul(t,16777619);return t>>>0}function n(e){let t=e;return t^=t>>>16,t=Math.imul(t,2246822507),t^=t>>>13,t=Math.imul(t,3266489909),t^=t>>>16,t>>>0}function r(e,r){return n(t(`${e}:${r}`))%100}function i(e,t){return t<=0?!1:t>=100||e<t}function a(e,t){if(Array.isArray(t.conditions))for(let n of t.conditions)e.registerCondition(n)}function o(e,t){e.registerExperience({id:t.id,key:t.key,name:t.name,targets:t.targets,nodes:t.nodes,edges:t.edges,condition:t.condition,initializeOpen:t.initializeOpen,componentName:t.componentName})}function s(e,t){if(Array.isArray(t.fields))for(let n of t.fields)e.registerField(n)}function c(e,t){if(!Array.isArray(t.steps))return;let n=new Map(t.fields.map(e=>[e.id,e.key]));for(let r of t.steps){let t=[];for(let e of r.fieldIds??[]){let i=n.get(e);if(i===void 0){`${r.key}${e}`;continue}t.push(i)}let i=r.layoutContentId?e.contents.getById(r.layoutContentId):null;e.registerStep({id:r.id,key:r.key,name:r.name,fieldKeys:t,layoutName:r.layoutName,...r.layoutContentId!==void 0&&{layoutContentId:r.layoutContentId,layoutContentStore:i}})}}function l(e,t){if(Array.isArray(t.experiences))for(let n of t.experiences)o(e,n)}function u(e,t,n){p(e,t,n.isPreview,n.sessionId),a(e,t),s(e,t),c(e,t),l(e,t)}function d(e){let t=e.searchParams[`preview-token`];if(t&&t.length>0)return t[0]}function f(e){let t=new Set,n=e.searchParams.feature;if(!n)return t;for(let e of n){let n=e.indexOf(`:`);n>0&&t.add(e.substring(0,n))}return t}function p(e,t,n,r){let i=f(e);for(let a of t.features)i.has(a.id)||m(e,a,n,r)}function m(e,t,n,a){let o=r(a,t.id);e.registerFeature(t.id,{key:`v${t.version}`,name:t.name,enabled:t.enabled,weight:t.weight,storage:n?`session`:`local`,decide:()=>i(o,t.weight)})}function h(e,t){for(let n of[...t.references??[],...t.content])e.registerContent({id:n.id,contentModelKey:n.contentModelKey,data:n.data})}function g(e,t){let n=new Map;return(r,i)=>{let a=n.get(r.id);if(a)return a;let o=(async()=>{try{let n=await t(r,i);return n&&h(e,n),n}finally{n.delete(r.id)}})();return n.set(r.id,o),o}}function _(e,t){let n=new Set(t&&Array.isArray(t.experiences)?t.experiences.map(e=>e.id):[]);return(t,r)=>n.has(t.id)?e(t,r):Promise.resolve(null)}function v(){return{name:`dynamic-experiences`,setup:t=>({onStart:(0,e.attach)({source:t.session.store.map(e=>e.id),effect:async e=>{let n=d(t),r=n!==void 0,i=n===void 0?void 0:{previewToken:n},a=await t.getProjectConfig(n===void 0?void 0:{previewToken:n}).catch(e=>null);if(t.contentLoader=g(t,_(e=>t.getExperienceContent(e,i),a)),!a)return;let o=t.seededVersionId;if(o!==null&&o!==a.versionId){t.versionSkew={seeded:o,resolved:a.versionId},`${a.versionId}${o}`;return}t.previewEmbedderOrigins=a.previewEmbedderOrigins??null,u(t,a,{isPreview:r,sessionId:e})}})})}}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return v}});
@@ -0,0 +1,153 @@
1
+ import "./logger-DMN6TxJJ.js";
2
+ import { attach as e } from "effector";
3
+ //#region src/plugins/dynamic-experiences/hash.ts
4
+ function t(e) {
5
+ let t = 2166136261;
6
+ for (let n of e) t ^= n.codePointAt(0) ?? 0, t = Math.imul(t, 16777619);
7
+ return t >>> 0;
8
+ }
9
+ function n(e) {
10
+ let t = e;
11
+ return t ^= t >>> 16, t = Math.imul(t, 2246822507), t ^= t >>> 13, t = Math.imul(t, 3266489909), t ^= t >>> 16, t >>> 0;
12
+ }
13
+ function r(e, r) {
14
+ return n(t(`${e}:${r}`)) % 100;
15
+ }
16
+ function i(e, t) {
17
+ return t <= 0 ? !1 : t >= 100 || e < t;
18
+ }
19
+ //#endregion
20
+ //#region src/plugins/dynamic-experiences/plugin.ts
21
+ function a(e, t) {
22
+ if (Array.isArray(t.conditions)) for (let n of t.conditions) e.registerCondition(n);
23
+ }
24
+ function o(e, t) {
25
+ e.registerExperience({
26
+ id: t.id,
27
+ key: t.key,
28
+ name: t.name,
29
+ targets: t.targets,
30
+ nodes: t.nodes,
31
+ edges: t.edges,
32
+ condition: t.condition,
33
+ initializeOpen: t.initializeOpen,
34
+ componentName: t.componentName
35
+ });
36
+ }
37
+ function s(e, t) {
38
+ if (Array.isArray(t.fields)) for (let n of t.fields) e.registerField(n);
39
+ }
40
+ function c(e, t) {
41
+ if (!Array.isArray(t.steps)) return;
42
+ let n = new Map(t.fields.map((e) => [e.id, e.key]));
43
+ for (let r of t.steps) {
44
+ let t = [];
45
+ for (let e of r.fieldIds ?? []) {
46
+ let i = n.get(e);
47
+ if (i === void 0) {
48
+ `${r.key}${e}`;
49
+ continue;
50
+ }
51
+ t.push(i);
52
+ }
53
+ let i = r.layoutContentId ? e.contents.getById(r.layoutContentId) : null;
54
+ e.registerStep({
55
+ id: r.id,
56
+ key: r.key,
57
+ name: r.name,
58
+ fieldKeys: t,
59
+ layoutName: r.layoutName,
60
+ ...r.layoutContentId !== void 0 && {
61
+ layoutContentId: r.layoutContentId,
62
+ layoutContentStore: i
63
+ }
64
+ });
65
+ }
66
+ }
67
+ function l(e, t) {
68
+ if (Array.isArray(t.experiences)) for (let n of t.experiences) o(e, n);
69
+ }
70
+ function u(e, t, n) {
71
+ p(e, t, n.isPreview, n.sessionId), a(e, t), s(e, t), c(e, t), l(e, t);
72
+ }
73
+ function d(e) {
74
+ let t = e.searchParams["preview-token"];
75
+ if (t && t.length > 0) return t[0];
76
+ }
77
+ function f(e) {
78
+ let t = /* @__PURE__ */ new Set(), n = e.searchParams.feature;
79
+ if (!n) return t;
80
+ for (let e of n) {
81
+ let n = e.indexOf(":");
82
+ n > 0 && t.add(e.substring(0, n));
83
+ }
84
+ return t;
85
+ }
86
+ function p(e, t, n, r) {
87
+ let i = f(e);
88
+ for (let a of t.features) i.has(a.id) || m(e, a, n, r);
89
+ }
90
+ function m(e, t, n, a) {
91
+ let o = r(a, t.id);
92
+ e.registerFeature(t.id, {
93
+ key: `v${t.version}`,
94
+ name: t.name,
95
+ enabled: t.enabled,
96
+ weight: t.weight,
97
+ storage: n ? "session" : "local",
98
+ decide: () => i(o, t.weight)
99
+ });
100
+ }
101
+ function h(e, t) {
102
+ for (let n of [...t.references ?? [], ...t.content]) e.registerContent({
103
+ id: n.id,
104
+ contentModelKey: n.contentModelKey,
105
+ data: n.data
106
+ });
107
+ }
108
+ function g(e, t) {
109
+ let n = /* @__PURE__ */ new Map();
110
+ return (r, i) => {
111
+ let a = n.get(r.id);
112
+ if (a) return a;
113
+ let o = (async () => {
114
+ try {
115
+ let n = await t(r, i);
116
+ return n && h(e, n), n;
117
+ } finally {
118
+ n.delete(r.id);
119
+ }
120
+ })();
121
+ return n.set(r.id, o), o;
122
+ };
123
+ }
124
+ function _(e, t) {
125
+ let n = new Set(t && Array.isArray(t.experiences) ? t.experiences.map((e) => e.id) : []);
126
+ return (t, r) => n.has(t.id) ? e(t, r) : Promise.resolve(null);
127
+ }
128
+ function v() {
129
+ return {
130
+ name: "dynamic-experiences",
131
+ setup: (t) => ({ onStart: e({
132
+ source: t.session.store.map((e) => e.id),
133
+ effect: async (e) => {
134
+ let n = d(t), r = n !== void 0, i = n === void 0 ? void 0 : { previewToken: n }, a = await t.getProjectConfig(n === void 0 ? void 0 : { previewToken: n }).catch((e) => null);
135
+ if (t.contentLoader = g(t, _((e) => t.getExperienceContent(e, i), a)), !a) return;
136
+ let o = t.seededVersionId;
137
+ if (o !== null && o !== a.versionId) {
138
+ t.versionSkew = {
139
+ seeded: o,
140
+ resolved: a.versionId
141
+ }, `${a.versionId}${o}`;
142
+ return;
143
+ }
144
+ t.previewEmbedderOrigins = a.previewEmbedderOrigins ?? null, u(t, a, {
145
+ isPreview: r,
146
+ sessionId: e
147
+ });
148
+ }
149
+ }) })
150
+ };
151
+ }
152
+ //#endregion
153
+ export { u as n, v as t };
@@ -0,0 +1,68 @@
1
+ import "./logger-DMN6TxJJ.js";
2
+ import { a as e, i as t, r as n, t as r } from "./registry-DjBZ8upD.js";
3
+ //#region src/data-source/provider.ts
4
+ var i = "bundle", a = "api";
5
+ async function o() {
6
+ try {
7
+ let e = await import("virtual:picked/data");
8
+ return n(e) ? e : null;
9
+ } catch {
10
+ return null;
11
+ }
12
+ }
13
+ function s(e) {
14
+ if (e === void 0 || n(e)) return e;
15
+ }
16
+ function c(n) {
17
+ let { apiUrl: c, projectId: l, previewToken: u, signal: d } = n, f = !!u, p = f ? a : n.mode, m = s(f ? void 0 : n.bundle), h = f ? void 0 : n.projectConfig, g = n.getContent, _ = {
18
+ mode: p ?? a,
19
+ manifest: null
20
+ }, v, y, b = /* @__PURE__ */ new Map();
21
+ function x() {
22
+ if (p === a) return Promise.resolve(null);
23
+ if (m) return Promise.resolve(m);
24
+ let e = r();
25
+ return e ? Promise.resolve(e) : (v ??= o(), v);
26
+ }
27
+ function S(e) {
28
+ _.mode = e ? i : a, _.manifest = e ? e.manifestMetadata : null;
29
+ }
30
+ async function C() {
31
+ if (h) return S(await x()), h;
32
+ let t = await x();
33
+ return S(t), t ? t.projectConfig : p === i ? null : e(c, l, {
34
+ ...u !== void 0 && { previewToken: u },
35
+ ...d !== void 0 && { signal: d }
36
+ });
37
+ }
38
+ async function w(e, n) {
39
+ let r = u === void 0 ? void 0 : { previewToken: u };
40
+ if (g) return g(e, r);
41
+ let a = await x();
42
+ if (S(a), a) try {
43
+ return await a.experienceContent(e, r);
44
+ } catch {
45
+ return `${e.id}`, null;
46
+ }
47
+ if (p === i) return null;
48
+ let o = n ?? d;
49
+ return t(c, l, e.id, {
50
+ ...u !== void 0 && { previewToken: u },
51
+ ...o !== void 0 && { signal: o }
52
+ });
53
+ }
54
+ return {
55
+ meta: _,
56
+ getProjectConfig: () => (y ??= C(), y),
57
+ getContent: (e, t) => {
58
+ let n = b.get(e.id);
59
+ if (n) return n;
60
+ let r = w(e, t?.signal).finally(() => {
61
+ b.delete(e.id);
62
+ });
63
+ return b.set(e.id, r), r;
64
+ }
65
+ };
66
+ }
67
+ //#endregion
68
+ export { c as createPickedDataProvider };
@@ -0,0 +1 @@
1
+ require("./logger-CSTvAyyB.cjs");const e=require("./registry-BMXsAEbZ.cjs");var t=`bundle`,n=`api`;async function r(){try{let t=await import(`virtual:picked/data`);return e.r(t)?t:null}catch{return null}}function i(t){if(t===void 0||e.r(t))return t}function a(a){let{apiUrl:o,projectId:s,previewToken:c,signal:l}=a,u=!!c,d=u?n:a.mode,f=i(u?void 0:a.bundle),p=u?void 0:a.projectConfig,m=a.getContent,h={mode:d??n,manifest:null},g,_,v=new Map;function y(){if(d===n)return Promise.resolve(null);if(f)return Promise.resolve(f);let t=e.t();return t?Promise.resolve(t):(g??=r(),g)}function b(e){h.mode=e?t:n,h.manifest=e?e.manifestMetadata:null}async function x(){if(p)return b(await y()),p;let n=await y();return b(n),n?n.projectConfig:d===t?null:e.a(o,s,{...c!==void 0&&{previewToken:c},...l!==void 0&&{signal:l}})}async function S(n,r){let i=c===void 0?void 0:{previewToken:c};if(m)return m(n,i);let a=await y();if(b(a),a)try{return await a.experienceContent(n,i)}catch{return`${n.id}`,null}if(d===t)return null;let u=r??l;return e.i(o,s,n.id,{...c!==void 0&&{previewToken:c},...u!==void 0&&{signal:u}})}return{meta:h,getProjectConfig:()=>(_??=x(),_),getContent:(e,t)=>{let n=v.get(e.id);if(n)return n;let r=S(e,t?.signal).finally(()=>{v.delete(e.id)});return v.set(e.id,r),r}}}exports.createPickedDataProvider=a;
@@ -0,0 +1 @@
1
+ require("./logger-CSTvAyyB.cjs");const e=require("./api-B4qxWoQN.cjs");function t(e){return typeof e==`object`&&!!e}function n(e){return t(e)&&`features`in e&&Array.isArray(e.features)}function r(e){return!t(e)||!(`experienceId`in e)||!(`content`in e)?!1:Array.isArray(e.content)}function i(e){try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`}catch{return!1}}function a(e){if(!t(e)||!(`cause`in e))return!1;let{cause:n}=e;return!t(n)||!(`code`in n)?!1:n.code===`ECONNREFUSED`}async function o(t,r,o){let s=o?.previewToken?`projects/${r}?preview_token=${encodeURIComponent(o.previewToken)}`:`projects/${r}`,c;try{c=await e.t(t,s,o?.headers,o?.signal)}catch(e){return i(t)&&a(e),null}if(!c.ok)return`${c.status.toString()}`,null;let l;try{l=await c.json()}catch{return null}return n(l)?l:null}async function s(t,n,o,s){let c=s?.previewToken?`projects/${n}/experiences/${o}/content?preview_token=${encodeURIComponent(s.previewToken)}`:`projects/${n}/experiences/${o}/content`,l;try{l=await e.t(t,c,s?.headers,s?.signal)}catch(e){return i(t)&&a(e)||`${o}`,null}if(!l.ok)return`${o}${l.status.toString()}`,null;let u;try{u=await l.json()}catch{return`${o}`,null}return r(u)?u:(`${o}`,null)}function c(e){if(typeof e!=`object`||!e||!(`projectConfig`in e)||!(`experienceContent`in e)||!(`manifestMetadata`in e))return!1;let{experienceContent:t}=e;return typeof t==`function`}var l=null;function u(e){c(e)&&(l=e)}function d(){return l}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return d}});
@@ -0,0 +1,74 @@
1
+ import "./logger-DMN6TxJJ.js";
2
+ import { t as e } from "./api-DNvaLWw_.js";
3
+ function t(e) {
4
+ return typeof e == "object" && !!e;
5
+ }
6
+ function n(e) {
7
+ return t(e) && "features" in e && Array.isArray(e.features);
8
+ }
9
+ function r(e) {
10
+ return !t(e) || !("experienceId" in e) || !("content" in e) ? !1 : Array.isArray(e.content);
11
+ }
12
+ function i(e) {
13
+ try {
14
+ let t = new URL(e).hostname;
15
+ return t === "localhost" || t === "127.0.0.1" || t === "::1";
16
+ } catch {
17
+ return !1;
18
+ }
19
+ }
20
+ function a(e) {
21
+ if (!t(e) || !("cause" in e)) return !1;
22
+ let { cause: n } = e;
23
+ return !t(n) || !("code" in n) ? !1 : n.code === "ECONNREFUSED";
24
+ }
25
+ async function o(t, r, o) {
26
+ let s = o?.previewToken ? `projects/${r}?preview_token=${encodeURIComponent(o.previewToken)}` : `projects/${r}`, c;
27
+ try {
28
+ c = await e(t, s, o?.headers, o?.signal);
29
+ } catch (e) {
30
+ return i(t) && a(e), null;
31
+ }
32
+ if (!c.ok) return `${c.status.toString()}`, null;
33
+ let l;
34
+ try {
35
+ l = await c.json();
36
+ } catch {
37
+ return null;
38
+ }
39
+ return n(l) ? l : null;
40
+ }
41
+ async function s(t, n, o, s) {
42
+ let c = s?.previewToken ? `projects/${n}/experiences/${o}/content?preview_token=${encodeURIComponent(s.previewToken)}` : `projects/${n}/experiences/${o}/content`, l;
43
+ try {
44
+ l = await e(t, c, s?.headers, s?.signal);
45
+ } catch (e) {
46
+ return i(t) && a(e) || `${o}`, null;
47
+ }
48
+ if (!l.ok) return `${o}${l.status.toString()}`, null;
49
+ let u;
50
+ try {
51
+ u = await l.json();
52
+ } catch {
53
+ return `${o}`, null;
54
+ }
55
+ return r(u) ? u : (`${o}`, null);
56
+ }
57
+ //#endregion
58
+ //#region src/data-source/virtual-data.ts
59
+ function c(e) {
60
+ if (typeof e != "object" || !e || !("projectConfig" in e) || !("experienceContent" in e) || !("manifestMetadata" in e)) return !1;
61
+ let { experienceContent: t } = e;
62
+ return typeof t == "function";
63
+ }
64
+ //#endregion
65
+ //#region src/data-source/registry.ts
66
+ var l = null;
67
+ function u(e) {
68
+ c(e) && (l = e);
69
+ }
70
+ function d() {
71
+ return l;
72
+ }
73
+ //#endregion
74
+ export { o as a, s as i, u as n, c as r, d as t };
@@ -0,0 +1,60 @@
1
+ import type { ExperienceContentResponse, FetchProjectOptions, ProjectConfig } from '../plugins/dynamic-experiences/types';
2
+ /**
3
+ * Minimal shape check: verifies that `data` is an object with a `features` array.
4
+ *
5
+ * This is the minimum invariant required to prevent runtime crashes when iterating
6
+ * `config.features`. Individual feature and experience shapes are trusted from the API.
7
+ *
8
+ * @param {unknown} data - Unknown API response to validate.
9
+ * @returns {boolean} Whether `data` has the minimum required shape.
10
+ * @example
11
+ * ```typescript
12
+ * if (isProjectConfig(json)) { json.features }
13
+ * ```
14
+ */
15
+ export declare function isProjectConfig(data: unknown): data is ProjectConfig;
16
+ /**
17
+ * Minimal shape check for a successful experience-content response.
18
+ *
19
+ * @param {unknown} data - Unknown API response to validate.
20
+ * @returns {boolean} Whether `data` has the minimum required shape.
21
+ * @example
22
+ * ```typescript
23
+ * if (isExperienceContentResponse(json)) { useResponse(json) }
24
+ * ```
25
+ */
26
+ export declare function isExperienceContentResponse(data: unknown): data is ExperienceContentResponse;
27
+ /**
28
+ * Fetches the project configuration from the Picked REST API.
29
+ *
30
+ * Returns `null` on network failure, non-OK responses, or invalid JSON shape.
31
+ * Connection-refused errors from local URLs are suppressed silently.
32
+ *
33
+ * @param {string} apiUrl - Base URL for the Picked API.
34
+ * @param {string} projectId - Project ID to fetch config for.
35
+ * @param {FetchProjectOptions} [options] - Optional headers, preview token, and abort signal.
36
+ * @returns {Promise<ProjectConfig | null>} Validated project config, or `null` on any failure.
37
+ * @example
38
+ * ```typescript
39
+ * const config = await fetchProject('https://api.picked.app', 'proj_123')
40
+ * ```
41
+ */
42
+ export declare function fetchProject(apiUrl: string, projectId: string, options?: FetchProjectOptions): Promise<ProjectConfig | null>;
43
+ /**
44
+ * Fetches per-experience content from the Picked API.
45
+ *
46
+ * Returns `null` on network failure, non-OK responses, or invalid JSON shape — preserving
47
+ * the failure-tolerant policy: experiences still render, layouts handle null defensively.
48
+ *
49
+ * @param {string} apiUrl - Base URL for the Picked API.
50
+ * @param {string} projectId - Project ID to fetch content for.
51
+ * @param {string} experienceId - Experience ID whose content to fetch.
52
+ * @param {FetchProjectOptions} [options] - Optional headers, preview token, and abort signal.
53
+ * @returns {Promise<ExperienceContentResponse | null>} Validated content response, or `null` on any failure.
54
+ * @example
55
+ * ```typescript
56
+ * const content = await fetchExperienceContent('https://api.picked.app', 'proj_1', 'exp_1')
57
+ * ```
58
+ */
59
+ export declare function fetchExperienceContent(apiUrl: string, projectId: string, experienceId: string, options?: FetchProjectOptions): Promise<ExperienceContentResponse | null>;
60
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/data-source/api.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACnB,aAAa,EACd,MAAM,sCAAsC,CAAA;AAiC7C;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAEpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,yBAAyB,CAM5F;AA8CD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmC/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAqC3C"}
@@ -0,0 +1,90 @@
1
+ import type { ContentLoader, ExperienceContentResponse, PickedManifestMetadata, ProjectConfig, VirtualPickedData } from '../plugins/dynamic-experiences/types';
2
+ import { isVirtualPickedData } from './virtual-data';
3
+ /** Where a data provider reads project config and CMS content from. */
4
+ export type PickedDataMode = 'bundle' | 'api';
5
+ /** Options for {@link createPickedDataProvider}. */
6
+ export interface PickedDataProviderOptions {
7
+ /** Base URL for the Picked API. Used by `'api'` mode and by every preview session. */
8
+ apiUrl: string;
9
+ /** Project ID to resolve data for. */
10
+ projectId: string;
11
+ /**
12
+ * Which source to read from. Omit to resolve `'bundle'` when a bundle is available and
13
+ * `'api'` otherwise.
14
+ */
15
+ mode?: PickedDataMode;
16
+ /**
17
+ * Preview token from the current session. A present token forces `'api'` for both config
18
+ * and content and overrides `bundle` and `projectConfig`, because preview renders
19
+ * unpublished data that no bundled snapshot can contain.
20
+ */
21
+ previewToken?: string;
22
+ /**
23
+ * The `virtual:picked/data` module, supplied directly to skip both the registry and the
24
+ * dynamic import. A value that fails the shape guard is ignored with a warning, the same as
25
+ * an unresolvable import.
26
+ */
27
+ bundle?: VirtualPickedData;
28
+ /** Explicit project config. Supersedes both sources, except under a preview token. */
29
+ projectConfig?: ProjectConfig;
30
+ /** Explicit content loader. Supersedes both sources, except under a preview token. */
31
+ getContent?: ContentLoader;
32
+ /** Abort signal applied to API fetches, such as an `AbortSignal.timeout` deadline. */
33
+ signal?: AbortSignal;
34
+ }
35
+ /** Read-only description of what a provider resolved to. */
36
+ export interface PickedDataProviderMeta {
37
+ /** The mode in force, after preview-token resolution. */
38
+ mode: PickedDataMode;
39
+ /** The bundle's manifest metadata, or `null` when not reading from a bundle. */
40
+ manifest: PickedManifestMetadata | null;
41
+ }
42
+ /** Resolves this session's project config and per-experience CMS content. */
43
+ export interface PickedDataProvider {
44
+ /** What this provider resolved to. `manifest` populates once a bundle has been read. */
45
+ readonly meta: PickedDataProviderMeta;
46
+ /** Resolves the project config, or `null` when unavailable. Deduplicated across callers. */
47
+ getProjectConfig: () => Promise<ProjectConfig | null>;
48
+ /** Resolves an experience's content, or `null` when unavailable. Deduplicated per experience id. */
49
+ getContent: (experience: {
50
+ id: string;
51
+ key: string;
52
+ }, options?: {
53
+ signal?: AbortSignal;
54
+ }) => Promise<ExperienceContentResponse | null>;
55
+ }
56
+ /**
57
+ * Attempts to resolve `virtual:picked/data` provided by `@picked/vite-plugin-picked`.
58
+ *
59
+ * The dynamic import uses a literal string specifier (intentionally — using a variable plus
60
+ * `@vite-ignore` defeats Vite's import-analysis, so the plugin's `resolveId` is never called
61
+ * at build time and the bundle ends up with a runtime fetch to a `virtual:` URL that the
62
+ * browser cannot resolve). The SDK's own build marks `virtual:picked/data` as external so
63
+ * this literal import is preserved into the published dist, then downstream Vite builds with
64
+ * `@picked/vite-plugin-picked` resolve it through the plugin pipeline.
65
+ *
66
+ * Returns `null` when the virtual module is unresolvable (the consumer is not using the Vite
67
+ * plugin, or its build did not generate the module). Errors are swallowed: the caller falls
68
+ * back to the API path.
69
+ *
70
+ * @returns {Promise<VirtualPickedData | null>} The virtual module exports, or `null`.
71
+ * @example
72
+ * ```typescript
73
+ * const bundle = await resolveVirtualDataModule()
74
+ * ```
75
+ */
76
+ export declare function resolveVirtualDataModule(): Promise<VirtualPickedData | null>;
77
+ export { isVirtualPickedData };
78
+ /**
79
+ * Creates the data provider for a session.
80
+ *
81
+ * @param {PickedDataProviderOptions} options - Provider configuration.
82
+ * @returns {PickedDataProvider} A provider resolving config and content from one source.
83
+ * @example
84
+ * ```typescript
85
+ * const provider = createPickedDataProvider({ mode: 'api', apiUrl, projectId })
86
+ * const config = await provider.getProjectConfig()
87
+ * ```
88
+ */
89
+ export declare function createPickedDataProvider(options: PickedDataProviderOptions): PickedDataProvider;
90
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/data-source/provider.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,aAAa,EACb,yBAAyB,EACzB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EAClB,MAAM,sCAAsC,CAAA;AAG7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,KAAK,CAAA;AAQ7C,oDAAoD;AACpD,MAAM,WAAW,yBAAyB;IACxC,sFAAsF;IACtF,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,sFAAsF;IACtF,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,sFAAsF;IACtF,UAAU,CAAC,EAAE,aAAa,CAAA;IAC1B,sFAAsF;IACtF,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,IAAI,EAAE,cAAc,CAAA;IACpB,gFAAgF;IAChF,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAAA;CACxC;AAED,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC,wFAAwF;IACxF,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAA;IACrC,4FAA4F;IAC5F,gBAAgB,EAAE,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IACrD,oGAAoG;IACpG,UAAU,EAAE,CACV,UAAU,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EACvC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KAC/B,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAA;CAC/C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAYlF;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAyB9B;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CAuK/F"}