payload-live-preview 2.2.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -17
- package/dist/adapters/astro/PreviewBoundary.astro +17 -4
- package/dist/adapters/astro/RichText.astro +13 -2
- package/dist/adapters/astro/index.d.ts +7 -7
- package/dist/adapters/astro/index.js +1 -1
- package/dist/adapters/astro/index.js.map +1 -1
- package/dist/adapters/astro/middleware-entry.d.ts +3 -3
- package/dist/adapters/astro/middleware-entry.js +1 -1
- package/dist/adapters/astro/middleware-entry.js.map +1 -1
- package/dist/adapters/nextjs/index.d.ts +2 -2
- package/dist/adapters/nextjs/index.js +1 -1
- package/dist/adapters/nextjs/index.js.map +1 -1
- package/dist/adapters/nuxt/index.d.ts +4 -4
- package/dist/adapters/nuxt/index.js +1 -1
- package/dist/adapters/nuxt/index.js.map +1 -1
- package/dist/adapters/nuxt/module.d.ts +1 -1
- package/dist/adapters/react/index.d.ts +2 -2
- package/dist/adapters/react/index.js +1 -1
- package/dist/adapters/react/index.js.map +1 -1
- package/dist/adapters/sveltekit/index.d.ts +5 -5
- package/dist/adapters/sveltekit/index.js +1 -1
- package/dist/adapters/sveltekit/index.js.map +1 -1
- package/dist/adapters/vue/index.d.ts +2 -2
- package/dist/adapters/vue/index.js +1 -1
- package/dist/adapters/vue/index.js.map +1 -1
- package/dist/client.cjs +1 -1
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +15 -3
- package/dist/client.d.ts +15 -3
- package/dist/client.js +1 -1
- package/dist/client.js.map +1 -1
- package/dist/codegen-astro.js +1 -1
- package/dist/codegen-astro.js.map +1 -1
- package/dist/codegen-cli.js +1 -1
- package/dist/codegen-cli.js.map +1 -1
- package/dist/codegen.cjs +1 -1
- package/dist/codegen.cjs.map +1 -1
- package/dist/codegen.js +1 -1
- package/dist/codegen.js.map +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +139 -4
- package/dist/core.d.ts +139 -4
- package/dist/core.js +1 -1
- package/dist/core.js.map +1 -1
- package/dist/doctor-cli.d.ts +1 -1
- package/dist/doctor-cli.js +1 -1
- package/dist/doctor-cli.js.map +1 -1
- package/dist/doctor.d.ts +2 -2
- package/dist/doctor.js +1 -1
- package/dist/doctor.js.map +1 -1
- package/dist/{document-session-Bkd181PV.d.ts → document-session-BuYuO3ae.d.ts} +27 -2
- package/dist/{fragment-endpoint-CLRpNQ3n.d.ts → fragment-endpoint-CQE_7MKi.d.ts} +1 -1
- package/dist/fragment.cjs +1 -1
- package/dist/fragment.cjs.map +1 -1
- package/dist/fragment.d.cts +6 -2
- package/dist/fragment.d.ts +6 -2
- package/dist/fragment.js +1 -1
- package/dist/fragment.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +73 -12
- package/dist/index.d.ts +73 -12
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lean.cjs +1 -1
- package/dist/lean.cjs.map +1 -1
- package/dist/lean.js +1 -1
- package/dist/lean.js.map +1 -1
- package/dist/lexical.cjs +1 -1
- package/dist/lexical.cjs.map +1 -1
- package/dist/lexical.d.cts +16 -4
- package/dist/lexical.d.ts +16 -4
- package/dist/lexical.js +1 -1
- package/dist/lexical.js.map +1 -1
- package/dist/{locals-zz2gi9dj.d.ts → locals-CyzDKfKU.d.ts} +7 -1
- package/dist/{middleware-CI-UTf6R.d.ts → middleware-Dnt6u4nF.d.ts} +2 -2
- package/dist/{options-CnYybG51.d.ts → options-DTzhFVJ4.d.ts} +13 -1
- package/dist/plugin.cjs +1 -1
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +15 -9
- package/dist/plugin.d.ts +15 -9
- package/dist/plugin.js +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/plugins.cjs +1 -1
- package/dist/plugins.cjs.map +1 -1
- package/dist/plugins.d.cts +8 -2
- package/dist/plugins.d.ts +8 -2
- package/dist/plugins.js +1 -1
- package/dist/plugins.js.map +1 -1
- package/dist/{probe-D-IHg9dF.d.ts → probe-afwdYebU.d.ts} +6 -2
- package/dist/server.cjs +1 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +19 -1
- package/dist/server.d.ts +19 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/structural.d.cts +2 -0
- package/dist/structural.d.ts +2 -0
- package/package.json +2 -1
|
@@ -33,6 +33,8 @@ declare const DIAGNOSTIC_CODES: Readonly<{
|
|
|
33
33
|
readonly UnattributableUpdate: "LP0202";
|
|
34
34
|
/** An update carried a value for a field the page binds nowhere; editing it changes nothing on this page. */
|
|
35
35
|
readonly UnboundField: "LP0203";
|
|
36
|
+
/** In development: a bound path covers its group under the `descendant` default, which 3.0 changes. */
|
|
37
|
+
readonly CoverageDefaultChanges: "LP0204";
|
|
36
38
|
/** The visibility gate held offscreen writes back until they scroll into view. */
|
|
37
39
|
readonly VisibilityGateDeferred: "LP0301";
|
|
38
40
|
/** A value was refused because the attribute or the value itself is unsafe. */
|
|
@@ -57,7 +59,7 @@ declare const DIAGNOSTIC_CODES: Readonly<{
|
|
|
57
59
|
readonly UnrenderedBlockKept: "LP0410";
|
|
58
60
|
/** A patch cannot reach what the server would have drawn; `onUnfaithfulPatch` decided what happens next. */
|
|
59
61
|
readonly UnfaithfulPatch: "LP0411";
|
|
60
|
-
/** The first write to a date, number or
|
|
62
|
+
/** The first write to a date, number, checkbox, select or radio binding replaced a different reading of the same value. */
|
|
61
63
|
readonly ServerFormatReplaced: "LP0412";
|
|
62
64
|
/** A Lexical block has no renderer, and the write could not keep the markup the server rendered for it; it is gone. */
|
|
63
65
|
readonly UnrenderedBlockLost: "LP0413";
|
|
@@ -77,7 +79,7 @@ declare const DIAGNOSTIC_CODES: Readonly<{
|
|
|
77
79
|
readonly StartupFailed: "LP0605";
|
|
78
80
|
/** Sending the ready handshake failed. */
|
|
79
81
|
readonly ReadyFailed: "LP0606";
|
|
80
|
-
/** The page declared hydration, but no React commit, Vue mount
|
|
82
|
+
/** The page declared hydration, but no React commit, Vue mount, SvelteKit mount or `markHydrated()` call came within the cap; the runtime started without waiting. */
|
|
81
83
|
readonly HydrationWaitTimedOut: "LP0607";
|
|
82
84
|
/** The audit found no runtime in a response that carried preview intent. */
|
|
83
85
|
readonly AuditRuntimeMissing: "LP0701";
|
|
@@ -119,6 +121,8 @@ declare const DIAGNOSTIC_CODES: Readonly<{
|
|
|
119
121
|
readonly V2ReadinessGap: "LP0709";
|
|
120
122
|
/** The preview runtime is served to anonymous visitors, not only inside the admin frame. */
|
|
121
123
|
readonly RuntimeOnPublicPage: "LP0710";
|
|
124
|
+
/** An element carries attributes that only mean something beside `data-payload-field`, and has none. */
|
|
125
|
+
readonly AuditModifierWithoutField: "LP0711";
|
|
122
126
|
}>;
|
|
123
127
|
/** A diagnostic code, as it appears in log output and on the `error` event. */
|
|
124
128
|
type DiagnosticCode = (typeof DIAGNOSTIC_CODES)[keyof typeof DIAGNOSTIC_CODES];
|
package/dist/server.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e="payload-live-preview.authorized-preview-context",t=Symbol.for(e);function isAuthorizedPreviewContext(e){return"object"==typeof e&&null!==e&&!0===e[t]&&Object.isFrozen(e)}function r(r){const n={...r,scope:Object.freeze({...r.scope,...void 0===r.scope.payload?{}:{payload:Object.freeze({...r.scope.payload,document:Object.freeze({...r.scope.payload.document})})}}),payloadHeaders:Object.freeze({...r.payloadHeaders}),[t]:!0,[e]:!0};return Object.defineProperty(n,"payloadHeaders",{enumerable:!1}),Object.freeze(n)}var n=class extends Error{name="PreviewConfigurationError"};function o(e){return{authorized:!1,outcome:e,context:null}}var i="users",a=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,s=/^[A-Za-z0-9._~-]+$/,c=/* @__PURE__ */new WeakMap;function u(e,t,r=4096){if(null===e||0===e.length)return null;const n=`${t}=`,o=[];for(const t of e.split(";")){const e=t.trim();e.startsWith(n)&&o.push(e.slice(n.length))}if(1!==o.length)return null;const i=o[0]??"";return 0===i.length||i.length>r||!s.test(i)?null:i}function l(e,t){let r;try{r=new URL(e)}catch{throw new n(`payload-live-preview: ${t} "${e}" is not an absolute URL`)}if("https:"!==r.protocol&&"http:"!==r.protocol)throw new n(`payload-live-preview: ${t} must be http(s), got "${r.protocol}"`);return r.origin}function d(e,t){if(!function(){try{const e=globalThis.process?.env;return void 0!==e&&"production"!==e.NODE_ENV}catch{return!1}}())return;const r=globalThis,n=r.__payloadLivePreviewDeprecationsWarned??=/* @__PURE__ */new Set;if(!n.has(e)){n.add(e);try{console.warn(`[payload-live-preview] ${t}`)}catch{}}}var p,f="live-preview",h=36e5,v="v1";function y(){return p??=new TextEncoder,p}function g(e){const t="string"==typeof e?y().encode(e):e;if(t.byteLength<32)throw new n(`payload-live-preview: the preview token secret must be at least ${String(32)} bytes`);return t}function w(e){if(void 0!==e)return e;const t=globalThis.crypto;return"object"==typeof t?.subtle?t:void 0}async function b(e,t){return e.subtle.importKey("raw",t,{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"])}function m(e){let t="";for(const r of e)t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function x(e){if(!/^[A-Za-z0-9_-]*$/.test(e))return;const t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4);try{const e=atob(t),r=new Uint8Array(e.length);for(let t=0;t<e.length;t+=1)r[t]=e.charCodeAt(t);return r}catch{return}}function A(e){return"string"==typeof e&&e.length>0&&"."!==e&&".."!==e&&!/[\s\p{Cc}\p{Cs}/\\?#%]/u.test(e)}function $(e){return"number"==typeof e?Number.isSafeInteger(e):A(e)}function k(e,t="/api"){if("string"!=typeof e||"string"!=typeof t)return null;try{const r=new URL(e);if(!["http:","https:"].includes(r.protocol)||r.username||r.password||r.search||r.hash)return null;const n=e.replace(/^[a-z]+:\/\/[^/]+/iu,"").replace(/\/+$/,""),o=t.replace(/^\//,"").replace(/\/$/,"");return""!==n&&!n.slice(1).split("/").every(A)||!o.split("/").every(A)?null:`${r.origin}${r.pathname.replace(/\/+$/,"")}/${o}`}catch{return null}}function j(e){return void 0!==e.expiresAt&&Number.isFinite(e.expiresAt)&&e.expiresAt>Date.now()}function z(e,t){return e.kind===t.kind&&e.slug===t.slug&&("global"===e.kind||$(t.id)&&String(e.id)===String(t.id))}var R=["preview","draft","livePreview"];function bind(e,t){return P(e,t)}function bindByPath(e,t){const r=function(e){const t=[],r=new Proxy({},{get(e,n){if("symbol"!=typeof n)return/^\d+$/.test(n)||t.push(n),r}});try{e(r)}catch{}return t}(e);if(0===r.length)throw new Error("bindByPath: the picker did not read any field — return data.<field> instead of a constant");return P(r.join("."),t)}function P(e,t){if(0===e.length)throw new Error("bind: field name must be a non-empty string");const r={"data-payload-field":e};return void 0!==t?.attribute&&(r["data-payload-attribute"]=t.attribute),void 0!==t?.type&&(r["data-payload-type"]=t.type),!0===t?.richtext&&(r["data-payload-richtext"]=""),!0===t?.html&&(r["data-payload-html"]=""),void 0!==t?.locale&&(r["data-payload-locale"]=t.locale),void 0!==t?.alt&&(r["data-payload-alt"]=t.alt),void 0!==t?.href&&(r["data-payload-href"]=t.href),void 0!==t?.arrayTemplate&&(r["data-payload-array-template"]=t.arrayTemplate),r}var U=/^[a-z][a-z0-9-]{0,63}$/u,O=Object.freeze({});function createPreviewBindings(e){const t=isAuthorizedPreviewContext(e.authorization),r=void 0!==e.owner&&e.owner.length>0?e.owner:void 0;return Object.freeze({authorized:t,bind:(e,r)=>t?bind(e,r):O,bindByPath:(e,r)=>t?bindByPath(e,r):O,owner:()=>t&&void 0!==r?{"data-payload-owner":r}:O,boundary:(e,r={})=>{const n=function(e,t){if(!U.test(e))throw new RangeError(`createPreviewBindings().boundary(): "${e}" is not a registry id — lowercase, starting with a letter, then letters, digits or hyphens (max 64). The runtime would post it and the endpoint would refuse it.`);const r=t.key;if(void 0!==r&&(0===r.length||r.length>128))throw new RangeError(`createPreviewBindings().boundary(): the key for "${e}" must be 1 to ${String(128)} characters.`);const n=t.dependsOn??[];return{"data-payload-fragment":e,...void 0!==r?{"data-payload-fragment-key":r}:{},...n.length>0?{"data-payload-depends":n.join(",")}:{}}}(e,r);return t?n:O},covers:(...e)=>{const r=function(e){for(const t of e)if(0===t.length||/[\s,]/u.test(t))throw new RangeError(`createPreviewBindings().covers(): "${t}" is not a field path — a name or a dotted path without spaces or commas.`);return{"data-payload-covers":e.join(" ")}}(e);return t&&e.length>0?r:O}})}var E=class extends Error{reason;status;url;constructor(e,t,r,n){super(`payload-live-preview: preview read failed (${e}${void 0===r?"":` ${String(r)}`}) for ${t}`,{cause:n}),this.name="PreviewFetchError",this.reason=e,this.status=r,this.url=t}};function S(e,t,r){const n=isAuthorizedPreviewContext(t.authorization)?t.authorization:null,o=n?.scope.payload;return void 0===o||null===n||j(n)&&(void 0===n.scope.locale||n.scope.locale===t.locale)&&k(e.serverURL,e.apiRoute)===k(o.serverURL,o.apiRoute)&&e.depth<=o.maxDepth&&z(o.document,r)}function L(e){return T(e,{ok:!1,reason:"scope",status:void 0,draft:e.draft,cause:void 0})}function C(e){return isAuthorizedPreviewContext(e.authorization)}function D(e,t,r){const n=new URLSearchParams;return n.set("depth",String(e)),r&&n.set("draft","true"),void 0!==t.locale&&n.set("locale",t.locale),n}async function M({config:e,timeoutMs:t},r,n,o,i){const a=e.fetch??("function"==typeof fetch?fetch:void 0),s={config:e,url:r,draft:o,errorMode:n.errorMode??"result",startedAt:Date.now()};if(!i)return L(s);if(void 0===a)return T(s,{ok:!1,reason:"no-fetch",status:void 0,draft:o,cause:void 0});const c=AbortSignal.timeout(t),u=void 0===n.signal?c:AbortSignal.any([c,n.signal]),l=isAuthorizedPreviewContext(n.authorization)?n.authorization:null;let d,p;try{const e=new Headers({accept:"application/json",...n.headers});for(const[t,r]of Object.entries(l?.payloadHeaders??{}))e.set(t,r);d=await a(r,{headers:Object.fromEntries(e),signal:u,cache:"no-store",redirect:"error"})}catch(e){return T(s,{ok:!1,reason:B(e,n.signal),status:void 0,draft:o,cause:e})}if(void 0!==l?.scope.payload&&!j(l))return L(s);if(!d.ok)return T(s,{ok:!1,reason:"http",status:d.status,draft:o,cause:void 0});try{p=await d.json()}catch(e){return T(s,{ok:!1,reason:"invalid-json",status:d.status,draft:o,cause:e})}return void 0!==l?.scope.payload&&!j(l)||void 0!==l?.scope.payload&&!function(e,t){if("object"!=typeof t||null===t||Array.isArray(t))return!1;const r=t;return"global"===e.kind?!Object.hasOwn(r,"globalType")||r.globalType===e.slug:Object.hasOwn(r,"id")&&z(e,{kind:"collection",slug:e.slug,id:r.id})}(l.scope.payload.document,p)?L(s):T(s,{ok:!0,data:p,draft:o,status:d.status})}function T(e,t){const{config:r,url:n,draft:o}=e,i=Date.now()-e.startedAt;if(t.ok)return r.onDiagnostic?.({kind:"response",url:n,status:t.status,draft:o,durationMs:i}),t;if(r.onDiagnostic?.({kind:"failure",url:n,reason:t.reason,status:t.status,draft:o,durationMs:i}),"throw"===e.errorMode)throw new E(t.reason,n,t.status,t.cause);return t}function B(e,t){if(!0===t?.aborted)return"aborted";const r="object"==typeof e&&null!==e?e.name:void 0;return"TimeoutError"===r?"timeout":"AbortError"===r?"aborted":"network"}function H(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function N(e){return e.map((e,t)=>0===t?e:`[${e}]`).join("")}function I(e,t,r){for(const[n,o]of Object.entries(t)){const t=[...r,n];H(o)?I(e,o,t):Array.isArray(o)&&o.some(H)?o.forEach((r,n)=>{I(e,r,[...t,String(n)])}):Array.isArray(o)?e.set(N(t),o.map(String).join(",")):e.set(N(t),"object"==typeof o?"null":String(o))}}exports.AUTHORIZED_PREVIEW_BRAND_KEY=e,exports.PreviewFetchError=E,exports.authorizePreviewRequest=async function(e,t){switch(t.type){case"payload-session":return async function(e,t){const s=function(e){const t=e??"payload-token";if(!a.test(t))throw new n(`payload-live-preview: cookie name "${t}" is not a valid cookie-name token`);return t}(t.cookieName),d=l(t.serverURL,"serverURL"),p=void 0===t.origin?void 0:l(t.origin,"origin"),f=u(e.headers.get("cookie"),s,t.maxCookieLength??4096);if(null===f)return o("missing-credential");const h=t.now??Date.now,v=Math.max(250,t.timeoutMs??3e3);if(!Number.isSafeInteger(v))return o("unavailable");const y=t.fetch??globalThis.fetch,g=`${d}/api/${encodeURIComponent(t.usersSlug??i)}/me?depth=0`,w=c.get(y)??/* @__PURE__ */new Map,b=`${s}=${f}`;let m={cookie:b};void 0!==p?m.origin=p:w.has(g)&&(m.origin=d);const x=new AbortController,A=()=>{x.abort(e.signal?.reason)},$=()=>x.signal.aborted;let k,j;e.signal?.addEventListener("abort",A,{once:!0}),!0===e.signal?.aborted&&A();try{if($())return o("unavailable");k=setTimeout(()=>{x.abort(new DOMException("The operation timed out","TimeoutError"))},v);for(let e=0;e<2;e++){const t=await y(g,{headers:{...m,accept:"application/json"},signal:x.signal});if($())return o("unavailable");if(!t.ok)return o(401===t.status?"invalid":"unavailable");if(j=await t.json(),$())return o("unavailable");const r="object"==typeof j&&null!==j?j.user:void 0;if(0!==e){if("object"!=typeof r||null===r||Array.isArray(r))break;void 0===m.origin?w.delete(g):(c.set(y,w),w.set(g,h()));break}if(void 0!==p||null!==r)break;if(void 0!==m.origin){if(h()-(w.get(g)??0)<6e4)break;w.set(g,h()),m={cookie:b}}else m={cookie:b,origin:d}}}catch{return o("unavailable")}finally{void 0!==k&&clearTimeout(k),e.signal?.removeEventListener("abort",A)}const z=function(e,t){if("object"!=typeof e||null===e||Array.isArray(e))return null;const r=e.user;if("object"!=typeof r||null===r||Array.isArray(r))return null;const n=e.collection??r.collection;if(void 0!==n&&n!==t)return null;const o=r.id;return"string"==typeof o&&o.length>0?o:"number"==typeof o&&Number.isFinite(o)?String(o):null}(j,t.usersSlug??i);if(null===z)return o("invalid");const R=function(e){const t=e.exp;return"number"!=typeof t||!Number.isFinite(t)||t<=0?void 0:t<1e11?1e3*t:t}(j);return void 0!==R&&R<=h()?o("expired"):{authorized:!0,outcome:"authorized",context:r({strategy:"payload-session",subject:z,authorizedAt:h(),expiresAt:R,scope:{},payloadHeaders:m})}}(e,t);case"signed-token":return async function(e,t){const n=g(t.secret),i=w(t.crypto);if(void 0===i)return o("unavailable");const a=function(e,t){if("header"===t?.kind)return e.headers.get(t.name??"x-preview-token");let r;try{r=new URL(e.url)}catch{return null}const n=r.searchParams.getAll(t?.param??"previewToken");return 1===n.length?n[0]??null:null}(e,t.transport);if(null===a||0===a.length)return o("missing-credential");if(a.length>4096)return o("invalid");const s=a.split(".");if(3!==s.length||s[0]!==v)return o("invalid");const c=s[1]??"",u=x(c),l=x(s[2]??"");if(void 0===u||32!==l?.byteLength)return o("invalid");let p;try{const e=await b(i,n);p=await i.subtle.verify("HMAC",e,l,y().encode(`${v}.${c}`))}catch{return o("unavailable")}if(!p)return o("invalid");const m=function(e){let t;try{t=JSON.parse((new TextDecoder).decode(e))}catch{return}if("object"!=typeof t||null===t)return;const r=t,n=e=>void 0===r[e]||"string"==typeof r[e];return 1===r.v&&"string"==typeof r.aud&&"string"==typeof r.pur&&"number"==typeof r.iat&&"number"==typeof r.exp&&"string"==typeof r.jti&&n("pth")&&n("loc")&&n("sub")?r:void 0}(u);if(void 0===m)return o("invalid");const A=(t.now??Date.now)();if(m.exp<=A||m.iat>m.exp)return o("expired");if(m.exp-m.iat>h)return o("invalid");if(m.aud!==t.audience)return o("wrong-audience");if(m.pur!==(t.purpose??f))return o("wrong-purpose");if(void 0!==m.pth){let t;try{t=new URL(e.url).pathname}catch{return o("invalid")}if(m.pth!==t)return o("wrong-path")}if(void 0!==m.loc){const r=t.locale?.(e);if(r!==m.loc)return o("wrong-locale")}if(void 0!==t.replay){let e;try{e=await async function(e,t,r){return"consume"in e?!0===await e.consume(t,r):(d("replay-is-used","A `signed-token` replay store with `isUsed` and `markUsed` is removed in 3.0: implement `consume(id, expiresAt)`, which checks and records in one step (ADR 0026)."),!await e.isUsed(t)&&(await e.markUsed(t,r),!0))}(t.replay,m.jti,m.exp)}catch{return o("unavailable")}if(!e)return o("replayed")}return{authorized:!0,outcome:"authorized",context:r({strategy:"signed-token",subject:m.sub,authorizedAt:A,expiresAt:m.exp,scope:{audience:m.aud,...void 0!==m.pth?{path:m.pth}:{},...void 0!==m.loc?{locale:m.loc}:{}},payloadHeaders:{}})}}(e,t);case"verifier":return async function(e,t){let n;try{n=await t.verify(e)}catch{return o("unavailable")}if(null===n)return o("invalid");if(!(void 0===n.scope?.payload||function(e){if("object"!=typeof e||null===e)return!1;const t=e,r=t.document;return!(null===k(t.serverURL,t.apiRoute)||"number"!=typeof t.maxDepth||!Number.isSafeInteger(t.maxDepth)||t.maxDepth<0||"object"!=typeof r||null===r||!A(r.slug))&&("global"===r.kind||"collection"===r.kind&&$(r.id))}(n.scope.payload)&&Number.isFinite(n.expiresAt)))return o("invalid");const i=(t.now??Date.now)();return void 0!==n.expiresAt&&n.expiresAt<=i?o("expired"):{authorized:!0,outcome:"authorized",context:r({strategy:"verifier",subject:n.subject,authorizedAt:i,expiresAt:n.expiresAt,scope:n.scope??{},payloadHeaders:n.payloadHeaders??{}})}}(e,t)}},exports.bind=bind,exports.bindByPath=bindByPath,exports.createPreviewBindings=createPreviewBindings,exports.definePreview=function(e){const t=function(e){let t;try{t=new URL(e)}catch{throw new Error(`payload-live-preview: serverURL "${e}" is not an absolute URL`)}if("https:"!==t.protocol&&"http:"!==t.protocol)throw new Error(`payload-live-preview: serverURL must be http(s), got "${t.protocol}"`);return`${t.origin}${t.pathname.replace(/\/+$/,"")}`}(e.serverURL),r=e.apiRoute??"/api",n=r.startsWith("/")?r:`/${r}`;if(!Number.isInteger(e.depth)||e.depth<0)throw new Error(`payload-live-preview: depth must be a non-negative integer, got ${String(e.depth)}`);const o=Math.max(250,e.timeoutMs??5e3),i=Object.freeze({serverURL:t,apiRoute:n,depth:e.depth,timeoutMs:o}),a=Object.freeze({serverURL:t,apiRoute:n,mergeDepth:e.depth}),s=`${t}${n}`,c={config:Object.freeze({...e,...i}),timeoutMs:o};return Object.freeze({config:i,runtimeOptions:a,async fetchDocument(e){const t=C(e),r=void 0!==e.id,n=(!r||$(e.id)&&void 0===e.where)&&S(c.config,e,{kind:"collection",slug:e.collection,id:e.id});if(!n)return M(c,s,e,t,!1);const o=D(i.depth,e,t);r||(o.set("limit","1"),void 0!==e.where&&I(o,e.where,["where"]));const a=$(e.id)?`/${encodeURIComponent(String(e.id))}`:"",u=`${s}/${encodeURIComponent(e.collection)}${a}?${o.toString()}`;if(r)return M(c,u,e,t,n);const l=await M(c,u,e,t,n);if(!l.ok)return l;const d=l.data?.docs?.[0];return{ok:!0,data:d??null,draft:t,status:l.status}},async fetchGlobal(e){const t=C(e),r=D(i.depth,e,t),n=`${s}/globals/${encodeURIComponent(e.global)}?${r.toString()}`;return M(c,n,e,t,S(c.config,e,{kind:"global",slug:e.global}))}})},exports.extractCookie=u,exports.hasPreviewIntent=function(e,t={}){const r=new Set(t.signals??["query","fetch-dest","referer"]),n=t.queryParams??R;if(r.has("query")){let t;try{t=new URL(e.url)}catch{t=void 0}if(void 0!==t)for(const e of n){const r=t.searchParams.getAll(e).at(-1);if("true"===r||"1"===r)return!0}}if(r.has("fetch-dest")&&"iframe"===e.headers.get("sec-fetch-dest"))return!0;const o=t.adminOrigins;void 0!==o&&d("admin-origins","`hasPreviewIntent({ adminOrigins })` is removed in 3.0: name the option `allowedOrigins`; `pll migrate` renames it (ADR 0026).");const i=t.allowedOrigins??o??[],a=r.has("referer")?i:[];if(a.length>0){const t=e.headers.get("referer");if(null!==t)try{const e=new URL(t).origin;for(const t of a)try{if(new URL(t).origin===e)return!0}catch{}}catch{}}return!1},exports.isAuthorizedPreviewContext=isAuthorizedPreviewContext,exports.issuePreviewToken=async function(e,t){const r=w(t.crypto);if(void 0===r)throw new Error("payload-live-preview: no Web Crypto implementation available to sign tokens");const n=g(t.secret),o=(t.now??Date.now)(),i=Math.min(h,Math.max(1,e.ttlMs??6e5)),a=new Uint8Array(16);r.getRandomValues(a);const s={v:1,aud:e.audience,...void 0!==e.path?{pth:e.path}:{},...void 0!==e.locale?{loc:e.locale}:{},...void 0!==e.subject?{sub:e.subject}:{},pur:e.purpose??f,iat:o,exp:o+i,jti:m(a)},c=m(y().encode(JSON.stringify(s))),u=`${v}.${c}`,l=await b(r,n);return`${u}.${m(new Uint8Array(await r.subtle.sign("HMAC",l,y().encode(u))))}`},exports.previewBindingsFromLocals=function(e,t={}){return createPreviewBindings({authorization:("object"==typeof e&&null!==e?e.livePreviewAuthorization:void 0)??null,...void 0!==t.owner?{owner:t.owner}:{}})};
|
|
1
|
+
"use strict";var e="payload-live-preview.authorized-preview-context",t=Symbol.for(e);function isAuthorizedPreviewContext(e){return"object"==typeof e&&null!==e&&!0===e[t]&&Object.isFrozen(e)}function r(r){const n={...r,scope:Object.freeze({...r.scope,...void 0===r.scope.payload?{}:{payload:Object.freeze({...r.scope.payload,document:Object.freeze({...r.scope.payload.document})})}}),payloadHeaders:Object.freeze({...r.payloadHeaders}),[t]:!0,[e]:!0};return Object.defineProperty(n,"payloadHeaders",{enumerable:!1}),Object.freeze(n)}var n=class extends Error{name="PreviewConfigurationError"};function o(e){return{authorized:!1,outcome:e,context:null}}var i="users",a=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,s=/^[A-Za-z0-9._~-]+$/,c=/* @__PURE__ */new WeakMap;function l(e,t,r=4096){if(null===e||0===e.length)return null;const n=`${t}=`,o=[];for(const t of e.split(";")){const e=t.trim();e.startsWith(n)&&o.push(e.slice(n.length))}if(1!==o.length)return null;const i=o[0]??"";return 0===i.length||i.length>r||!s.test(i)?null:i}function u(e,t){let r;try{r=new URL(e)}catch{throw new n(`payload-live-preview: ${t} "${e}" is not an absolute URL`)}if("https:"!==r.protocol&&"http:"!==r.protocol)throw new n(`payload-live-preview: ${t} must be http(s), got "${r.protocol}"`);return r.origin}function d(e,t){if(!function(){try{const e=globalThis.process?.env;return void 0!==e&&"production"!==e.NODE_ENV}catch{return!1}}())return;const r=globalThis,n=r.__payloadLivePreviewDeprecationsWarned??=/* @__PURE__ */new Set;if(!n.has(e)){n.add(e);try{console.warn(`[payload-live-preview] ${t}`)}catch{}}}var p,f="live-preview",h=36e5,v="v1";function y(){return p??=new TextEncoder,p}function g(e){const t="string"==typeof e?y().encode(e):e;if(t.byteLength<32)throw new n(`payload-live-preview: the preview token secret must be at least ${String(32)} bytes`);return t}function w(e){if(void 0!==e)return e;const t=globalThis.crypto;return"object"==typeof t?.subtle?t:void 0}async function b(e,t){return e.subtle.importKey("raw",t,{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"])}function m(e){let t="";for(const r of e)t+=String.fromCharCode(r);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function x(e){if(!/^[A-Za-z0-9_-]*$/.test(e))return;const t=e.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-e.length%4)%4);try{const e=atob(t),r=new Uint8Array(e.length);for(let t=0;t<e.length;t+=1)r[t]=e.charCodeAt(t);return r}catch{return}}function A(e){return"string"==typeof e&&e.length>0&&"."!==e&&".."!==e&&!/[\s\p{Cc}\p{Cs}/\\?#%]/u.test(e)}function $(e){return"number"==typeof e?Number.isSafeInteger(e):A(e)}function k(e,t="/api"){if("string"!=typeof e||"string"!=typeof t)return null;try{const r=new URL(e);if(!["http:","https:"].includes(r.protocol)||r.username||r.password||r.search||r.hash)return null;const n=e.replace(/^[a-z]+:\/\/[^/]+/iu,"").replace(/\/+$/,""),o=t.replace(/^\//,"").replace(/\/$/,"");return""!==n&&!n.slice(1).split("/").every(A)||!o.split("/").every(A)?null:`${r.origin}${r.pathname.replace(/\/+$/,"")}/${o}`}catch{return null}}function j(e){return void 0!==e.expiresAt&&Number.isFinite(e.expiresAt)&&e.expiresAt>Date.now()}function z(e,t){return e.kind===t.kind&&e.slug===t.slug&&("global"===e.kind||$(t.id)&&String(e.id)===String(t.id))}var R=["preview","draft","livePreview"];function bind(e,t){return P(e,t)}function bindByPath(e,t){const r=function(e){const t=[],r=new Proxy({},{get(e,n){if("symbol"!=typeof n)return/^\d+$/.test(n)||t.push(n),r}});try{e(r)}catch{}return t}(e);if(0===r.length)throw new Error("bindByPath: the picker did not read any field — return data.<field> instead of a constant");return P(r.join("."),t)}function P(e,t){if(0===e.length)throw new Error("bind: field name must be a non-empty string");const r={"data-payload-field":e};return void 0!==t?.attribute&&(r["data-payload-attribute"]=t.attribute),void 0!==t?.type&&(r["data-payload-type"]=t.type),!0===t?.richtext&&(r["data-payload-richtext"]=""),!0===t?.html&&(r["data-payload-html"]=""),void 0!==t?.locale&&(r["data-payload-locale"]=t.locale),void 0!==t?.alt&&(r["data-payload-alt"]=t.alt),void 0!==t?.href&&(r["data-payload-href"]=t.href),void 0!==t?.arrayTemplate&&(r["data-payload-array-template"]=t.arrayTemplate),void 0!==t?.format&&(r["data-payload-format"]=t.format),!0===t?.text&&(r["data-payload-text"]=""),void 0!==t?.strategy&&(r["data-payload-strategy"]=t.strategy),void 0!==t?.dependsOn&&t.dependsOn.length>0&&(r["data-payload-depends"]=t.dependsOn.join(",")),!0===t?.anchor&&(r["data-payload-boundary"]=""),r}var O=/^[a-z][a-z0-9-]{0,63}$/u,U=Object.freeze({});function createPreviewBindings(e){const t=isAuthorizedPreviewContext(e.authorization),r=void 0!==e.owner&&e.owner.length>0?e.owner:void 0;return Object.freeze({authorized:t,bind:(e,r)=>t?bind(e,r):U,bindByPath:(e,r)=>t?bindByPath(e,r):U,owner:()=>t&&void 0!==r?{"data-payload-owner":r}:U,boundary:(e,r={})=>{const n=function(e,t){if(!O.test(e))throw new RangeError(`createPreviewBindings().boundary(): "${e}" is not a registry id — lowercase, starting with a letter, then letters, digits or hyphens (max 64). The runtime would post it and the endpoint would refuse it.`);const r=t.key;if(void 0!==r&&(0===r.length||r.length>128))throw new RangeError(`createPreviewBindings().boundary(): the key for "${e}" must be 1 to ${String(128)} characters.`);const n=t.dependsOn??[];return{"data-payload-fragment":e,...void 0!==r?{"data-payload-fragment-key":r}:{},...n.length>0?{"data-payload-depends":n.join(",")}:{}}}(e,r);return t?n:U},covers:(...e)=>{const r=function(e){for(const t of e)if(0===t.length||/[\s,]/u.test(t))throw new RangeError(`createPreviewBindings().covers(): "${t}" is not a field path — a name or a dotted path without spaces or commas.`);return{"data-payload-covers":e.join(" ")}}(e);return t&&e.length>0?r:U}})}var E=class extends Error{reason;status;url;constructor(e,t,r,n){super(`payload-live-preview: preview read failed (${e}${void 0===r?"":` ${String(r)}`}) for ${t}`,{cause:n}),this.name="PreviewFetchError",this.reason=e,this.status=r,this.url=t}};function S(e,t,r){const n=isAuthorizedPreviewContext(t.authorization)?t.authorization:null,o=n?.scope.payload;return void 0===o||null===n||j(n)&&(void 0===n.scope.locale||n.scope.locale===t.locale)&&k(e.serverURL,e.apiRoute)===k(o.serverURL,o.apiRoute)&&e.depth<=o.maxDepth&&z(o.document,r)}function L(e){return T(e,{ok:!1,reason:"scope",status:void 0,draft:e.draft,cause:void 0})}function C(e){return isAuthorizedPreviewContext(e.authorization)}function D(e,t,r){const n=new URLSearchParams;return n.set("depth",String(e)),r&&n.set("draft","true"),void 0!==t.locale&&n.set("locale",t.locale),n}async function M({config:e,timeoutMs:t},r,n,o,i){const a=e.fetch??("function"==typeof fetch?fetch:void 0),s={config:e,url:r,draft:o,errorMode:n.errorMode??"result",startedAt:Date.now()};if(!i)return L(s);if(void 0===a)return T(s,{ok:!1,reason:"no-fetch",status:void 0,draft:o,cause:void 0});const c=AbortSignal.timeout(t),l=void 0===n.signal?c:AbortSignal.any([c,n.signal]),u=isAuthorizedPreviewContext(n.authorization)?n.authorization:null;let d,p;try{const e=new Headers({accept:"application/json",...n.headers});for(const[t,r]of Object.entries(u?.payloadHeaders??{}))e.set(t,r);d=await a(r,{headers:Object.fromEntries(e),signal:l,cache:"no-store",redirect:"error"})}catch(e){return T(s,{ok:!1,reason:B(e,n.signal),status:void 0,draft:o,cause:e})}if(void 0!==u?.scope.payload&&!j(u))return L(s);if(!d.ok)return T(s,{ok:!1,reason:"http",status:d.status,draft:o,cause:void 0});try{p=await d.json()}catch(e){return T(s,{ok:!1,reason:"invalid-json",status:d.status,draft:o,cause:e})}return void 0!==u?.scope.payload&&!j(u)||void 0!==u?.scope.payload&&!function(e,t){if("object"!=typeof t||null===t||Array.isArray(t))return!1;const r=t;return"global"===e.kind?!Object.hasOwn(r,"globalType")||r.globalType===e.slug:Object.hasOwn(r,"id")&&z(e,{kind:"collection",slug:e.slug,id:r.id})}(u.scope.payload.document,p)?L(s):T(s,{ok:!0,data:p,draft:o,status:d.status})}function T(e,t){const{config:r,url:n,draft:o}=e,i=Date.now()-e.startedAt;if(t.ok)return r.onDiagnostic?.({kind:"response",url:n,status:t.status,draft:o,durationMs:i}),t;if(r.onDiagnostic?.({kind:"failure",url:n,reason:t.reason,status:t.status,draft:o,durationMs:i}),"throw"===e.errorMode)throw new E(t.reason,n,t.status,t.cause);return t}function B(e,t){if(!0===t?.aborted)return"aborted";const r="object"==typeof e&&null!==e?e.name:void 0;return"TimeoutError"===r?"timeout":"AbortError"===r?"aborted":"network"}function H(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function N(e){return e.map((e,t)=>0===t?e:`[${e}]`).join("")}function I(e,t,r){for(const[n,o]of Object.entries(t)){const t=[...r,n];H(o)?I(e,o,t):Array.isArray(o)&&o.some(H)?o.forEach((r,n)=>{I(e,r,[...t,String(n)])}):Array.isArray(o)?e.set(N(t),o.map(String).join(",")):e.set(N(t),"object"==typeof o?"null":String(o))}}exports.AUTHORIZED_PREVIEW_BRAND_KEY=e,exports.PreviewFetchError=E,exports.authorizePreviewRequest=async function(e,t){switch(t.type){case"payload-session":return async function(e,t){const s=function(e){const t=e??"payload-token";if(!a.test(t))throw new n(`payload-live-preview: cookie name "${t}" is not a valid cookie-name token`);return t}(t.cookieName),d=u(t.serverURL,"serverURL"),p=void 0===t.origin?void 0:u(t.origin,"origin"),f=l(e.headers.get("cookie"),s,t.maxCookieLength??4096);if(null===f)return o("missing-credential");const h=t.now??Date.now,v=Math.max(250,t.timeoutMs??3e3);if(!Number.isSafeInteger(v))return o("unavailable");const y=t.fetch??globalThis.fetch,g=`${d}/api/${encodeURIComponent(t.usersSlug??i)}/me?depth=0`,w=c.get(y)??/* @__PURE__ */new Map,b=`${s}=${f}`;let m={cookie:b};void 0!==p?m.origin=p:w.has(g)&&(m.origin=d);const x=new AbortController,A=()=>{x.abort(e.signal?.reason)},$=()=>x.signal.aborted;let k,j;e.signal?.addEventListener("abort",A,{once:!0}),!0===e.signal?.aborted&&A();try{if($())return o("unavailable");k=setTimeout(()=>{x.abort(new DOMException("The operation timed out","TimeoutError"))},v);for(let e=0;e<2;e++){const t=await y(g,{headers:{...m,accept:"application/json"},signal:x.signal});if($())return o("unavailable");if(!t.ok)return o(401===t.status?"invalid":"unavailable");if(j=await t.json(),$())return o("unavailable");const r="object"==typeof j&&null!==j?j.user:void 0;if(0!==e){if("object"!=typeof r||null===r||Array.isArray(r))break;void 0===m.origin?w.delete(g):(c.set(y,w),w.set(g,h()));break}if(void 0!==p||null!==r)break;if(void 0!==m.origin){if(h()-(w.get(g)??0)<6e4)break;w.set(g,h()),m={cookie:b}}else m={cookie:b,origin:d}}}catch{return o("unavailable")}finally{void 0!==k&&clearTimeout(k),e.signal?.removeEventListener("abort",A)}const z=function(e,t){if("object"!=typeof e||null===e||Array.isArray(e))return null;const r=e.user;if("object"!=typeof r||null===r||Array.isArray(r))return null;const n=e.collection??r.collection;if(void 0!==n&&n!==t)return null;const o=r.id;return"string"==typeof o&&o.length>0?o:"number"==typeof o&&Number.isFinite(o)?String(o):null}(j,t.usersSlug??i);if(null===z)return o("invalid");const R=function(e){const t=e.exp;return"number"!=typeof t||!Number.isFinite(t)||t<=0?void 0:t<1e11?1e3*t:t}(j);return void 0!==R&&R<=h()?o("expired"):{authorized:!0,outcome:"authorized",context:r({strategy:"payload-session",subject:z,authorizedAt:h(),expiresAt:R,scope:{},payloadHeaders:m})}}(e,t);case"signed-token":return async function(e,t){const n=g(t.secret),i=w(t.crypto);if(void 0===i)return o("unavailable");const a=function(e,t){if("header"===t?.kind)return e.headers.get(t.name??"x-preview-token");let r;try{r=new URL(e.url)}catch{return null}const n=r.searchParams.getAll(t?.param??"previewToken");return 1===n.length?n[0]??null:null}(e,t.transport);if(null===a||0===a.length)return o("missing-credential");if(a.length>4096)return o("invalid");const s=a.split(".");if(3!==s.length||s[0]!==v)return o("invalid");const c=s[1]??"",l=x(c),u=x(s[2]??"");if(void 0===l||32!==u?.byteLength)return o("invalid");let p;try{const e=await b(i,n);p=await i.subtle.verify("HMAC",e,u,y().encode(`${v}.${c}`))}catch{return o("unavailable")}if(!p)return o("invalid");const m=function(e){let t;try{t=JSON.parse((new TextDecoder).decode(e))}catch{return}if("object"!=typeof t||null===t)return;const r=t,n=e=>void 0===r[e]||"string"==typeof r[e];return 1===r.v&&"string"==typeof r.aud&&"string"==typeof r.pur&&"number"==typeof r.iat&&"number"==typeof r.exp&&"string"==typeof r.jti&&n("pth")&&n("loc")&&n("sub")?r:void 0}(l);if(void 0===m)return o("invalid");const A=(t.now??Date.now)();if(m.exp<=A||m.iat>m.exp)return o("expired");if(m.exp-m.iat>h)return o("invalid");if(m.aud!==t.audience)return o("wrong-audience");if(m.pur!==(t.purpose??f))return o("wrong-purpose");if(void 0!==m.pth){let t;try{t=new URL(e.url).pathname}catch{return o("invalid")}if(m.pth!==t)return o("wrong-path")}if(void 0!==m.loc){const r=t.locale?.(e);if(r!==m.loc)return o("wrong-locale")}if(void 0!==t.replay){let e;try{e=await async function(e,t,r){return"consume"in e?!0===await e.consume(t,r):(d("replay-is-used","A `signed-token` replay store with `isUsed` and `markUsed` is removed in 3.0: implement `consume(id, expiresAt)`, which checks and records in one step (ADR 0026)."),!await e.isUsed(t)&&(await e.markUsed(t,r),!0))}(t.replay,m.jti,m.exp)}catch{return o("unavailable")}if(!e)return o("replayed")}return{authorized:!0,outcome:"authorized",context:r({strategy:"signed-token",subject:m.sub,authorizedAt:A,expiresAt:m.exp,scope:{audience:m.aud,...void 0!==m.pth?{path:m.pth}:{},...void 0!==m.loc?{locale:m.loc}:{}},payloadHeaders:{}})}}(e,t);case"verifier":return async function(e,t){let n;try{n=await t.verify(e)}catch{return o("unavailable")}if(null===n)return o("invalid");if(!(void 0===n.scope?.payload||function(e){if("object"!=typeof e||null===e)return!1;const t=e,r=t.document;return!(null===k(t.serverURL,t.apiRoute)||"number"!=typeof t.maxDepth||!Number.isSafeInteger(t.maxDepth)||t.maxDepth<0||"object"!=typeof r||null===r||!A(r.slug))&&("global"===r.kind||"collection"===r.kind&&$(r.id))}(n.scope.payload)&&Number.isFinite(n.expiresAt)))return o("invalid");const i=(t.now??Date.now)();return void 0!==n.expiresAt&&n.expiresAt<=i?o("expired"):{authorized:!0,outcome:"authorized",context:r({strategy:"verifier",subject:n.subject,authorizedAt:i,expiresAt:n.expiresAt,scope:n.scope??{},payloadHeaders:n.payloadHeaders??{}})}}(e,t)}},exports.bind=bind,exports.bindByPath=bindByPath,exports.createPreviewBindings=createPreviewBindings,exports.definePreview=function(e){const t=function(e){let t;try{t=new URL(e)}catch{throw new Error(`payload-live-preview: serverURL "${e}" is not an absolute URL`)}if("https:"!==t.protocol&&"http:"!==t.protocol)throw new Error(`payload-live-preview: serverURL must be http(s), got "${t.protocol}"`);return`${t.origin}${t.pathname.replace(/\/+$/,"")}`}(e.serverURL),r=e.apiRoute??"/api",n=r.startsWith("/")?r:`/${r}`;if(!Number.isInteger(e.depth)||e.depth<0)throw new Error(`payload-live-preview: depth must be a non-negative integer, got ${String(e.depth)}`);const o=Math.max(250,e.timeoutMs??5e3),i=Object.freeze({serverURL:t,apiRoute:n,depth:e.depth,timeoutMs:o}),a=Object.freeze({serverURL:t,apiRoute:n,mergeDepth:e.depth}),s=`${t}${n}`,c={config:Object.freeze({...e,...i}),timeoutMs:o};return Object.freeze({config:i,runtimeOptions:a,async fetchDocument(e){const t=C(e),r=void 0!==e.id,n=(!r||$(e.id)&&void 0===e.where)&&S(c.config,e,{kind:"collection",slug:e.collection,id:e.id});if(!n)return M(c,s,e,t,!1);const o=D(i.depth,e,t);r||(o.set("limit","1"),void 0!==e.where&&I(o,e.where,["where"]));const a=$(e.id)?`/${encodeURIComponent(String(e.id))}`:"",l=`${s}/${encodeURIComponent(e.collection)}${a}?${o.toString()}`;if(r)return M(c,l,e,t,n);const u=await M(c,l,e,t,n);if(!u.ok)return u;const d=u.data?.docs?.[0];return{ok:!0,data:d??null,draft:t,status:u.status}},async fetchGlobal(e){const t=C(e),r=D(i.depth,e,t),n=`${s}/globals/${encodeURIComponent(e.global)}?${r.toString()}`;return M(c,n,e,t,S(c.config,e,{kind:"global",slug:e.global}))}})},exports.extractCookie=l,exports.hasPreviewIntent=function(e,t={}){const r=new Set(t.signals??["query","fetch-dest","referer"]),n=t.queryParams??R;if(r.has("query")){let t;try{t=new URL(e.url)}catch{t=void 0}if(void 0!==t)for(const e of n){const r=t.searchParams.getAll(e).at(-1);if("true"===r||"1"===r)return!0}}if(r.has("fetch-dest")&&"iframe"===e.headers.get("sec-fetch-dest"))return!0;const o=t.adminOrigins;void 0!==o&&d("admin-origins","`hasPreviewIntent({ adminOrigins })` is removed in 3.0: name the option `allowedOrigins`; `pll migrate` renames it (ADR 0026).");const i=t.allowedOrigins??o??[],a=r.has("referer")?i:[];if(a.length>0){const t=e.headers.get("referer");if(null!==t)try{const e=new URL(t).origin;for(const t of a)try{if(new URL(t).origin===e)return!0}catch{}}catch{}}return!1},exports.isAuthorizedPreviewContext=isAuthorizedPreviewContext,exports.issuePreviewToken=async function(e,t){const r=w(t.crypto);if(void 0===r)throw new Error("payload-live-preview: no Web Crypto implementation available to sign tokens");const n=g(t.secret),o=(t.now??Date.now)(),i=Math.min(h,Math.max(1,e.ttlMs??6e5)),a=new Uint8Array(16);r.getRandomValues(a);const s={v:1,aud:e.audience,...void 0!==e.path?{pth:e.path}:{},...void 0!==e.locale?{loc:e.locale}:{},...void 0!==e.subject?{sub:e.subject}:{},pur:e.purpose??f,iat:o,exp:o+i,jti:m(a)},c=m(y().encode(JSON.stringify(s))),l=`${v}.${c}`,u=await b(r,n);return`${l}.${m(new Uint8Array(await r.subtle.sign("HMAC",u,y().encode(l))))}`},exports.previewBindingsFromLocals=function(e,t={}){return createPreviewBindings({authorization:("object"==typeof e&&null!==e?e.livePreviewAuthorization:void 0)??null,...void 0!==t.owner?{owner:t.owner}:{}})};
|
|
2
2
|
//# sourceMappingURL=server.cjs.map
|