payload-plugin-urls 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,47 +11,49 @@ import { payloadPluginUrls } from "payload-plugin-urls"
11
11
  export default buildConfig({
12
12
  plugins: [
13
13
  payloadPluginUrls({
14
- collections: [
15
- {
16
- slug: "pages",
14
+ collections: {
15
+ pages: {
17
16
  breadcrumbs: true,
18
17
  },
19
- {
20
- slug: "posts",
21
- rootPageField: "postsPage",
18
+ posts: {
19
+ rootPage: "postsPage",
20
+ prefixStrategy: "category",
22
21
  category: {
23
22
  collection: "post-categories",
24
23
  field: "categories",
25
- prefixStrategy: "category",
26
24
  },
27
25
  },
28
- {
29
- slug: "recipes",
30
- rootPageField: "recipesPage",
26
+ recipes: {
27
+ rootPage: "recipesPage",
28
+ prefixStrategy: "rootPage",
31
29
  category: {
32
30
  collection: "recipe-categories",
33
31
  field: "categories",
34
- prefixStrategy: "rootPage",
35
32
  },
36
33
  },
37
- ],
38
- locales: {
39
- defaultLocale: "en",
40
- locales: ["en", "it"],
41
34
  },
42
35
  rootPages: {
43
- indexPageField: "homePage",
44
- fieldOverrides: {
36
+ fields: {
45
37
  homePage: {
46
- label: "Homepage",
47
- admin: {
48
- description: "Select the page used as /",
49
- width: "100%",
38
+ isHomepage: true,
39
+ relationTo: "pages",
40
+ overrides: {
41
+ label: "Homepage",
42
+ admin: {
43
+ description: "Select the page used as /",
44
+ width: "100%",
45
+ },
50
46
  },
51
47
  },
52
48
  postsPage: {
53
- label: "Blog index",
54
- required: true,
49
+ relationTo: "pages",
50
+ overrides: {
51
+ label: "Blog index",
52
+ required: true,
53
+ },
54
+ },
55
+ recipesPage: {
56
+ relationTo: "recipes",
55
57
  },
56
58
  },
57
59
  },
@@ -60,11 +62,15 @@ export default buildConfig({
60
62
  })
61
63
  ```
62
64
 
63
- The plugin adds a managed `root-pages` global. Its `indexPage` field defines the homepage by
64
- default, so that page resolves to `/` for the default locale and `/<locale>` for other locales. Use
65
- `rootPages.indexPageField` to rename that field, and `rootPages.fieldOverrides` to customize the
66
- generated root page relationship fields. Collection root fields such as `recipesPage` define URL
67
- prefixes for documents in that collection.
65
+ The plugin adds a managed `root-pages` global. Define every root page relationship in
66
+ `rootPages.fields`. Mark one field with `isHomepage: true` so that document resolves to `/` for the
67
+ default locale and `/<locale>` for other locales. Each field can set `relationTo` and `overrides`,
68
+ which are merged into the generated relationship field. Collection `rootPage` values such as
69
+ `recipesPage` define URL prefixes for documents in that collection.
70
+
71
+ Locales are read from the Payload `localization` config when the plugin is installed. You can still
72
+ pass `locales` to the plugin options to override that inferred value or when using exported helpers
73
+ outside the plugin lifecycle.
68
74
 
69
75
  Categorized collections can choose how their prefix is built:
70
76
 
package/dist/field.d.ts CHANGED
@@ -1,11 +1,4 @@
1
1
  import type { PayloadPluginUrlsOptions } from "./types";
2
- export declare function populatedUrlField(options?: PayloadPluginUrlsOptions): {
3
- admin: {
4
- hidden: boolean;
5
- };
6
- name: string;
7
- type: string;
8
- label: boolean;
9
- localized: boolean;
10
- };
2
+ import type { Field } from "payload";
3
+ export declare function populatedUrlField(options?: PayloadPluginUrlsOptions): Field;
11
4
  //# sourceMappingURL=field.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAEvD,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA8C;;;;;;;;EAcxF"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA8C,GAAG,KAAK,CAchG"}
package/dist/hooks.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import type { Hook, PayloadPluginUrlsOptions } from "./types";
2
- export declare function createPopulateUrlHook(options: PayloadPluginUrlsOptions): Hook;
3
- export declare function createCollectionUrlUpdateHook(options: PayloadPluginUrlsOptions): Hook;
4
- export declare function createRootPagesUrlUpdateHook(options: PayloadPluginUrlsOptions): Hook;
1
+ import type { PayloadPluginUrlsOptions } from "./types";
2
+ import type { CollectionAfterChangeHook, CollectionBeforeChangeHook, GlobalAfterChangeHook } from "payload";
3
+ export declare function createPopulateUrlHook(options: PayloadPluginUrlsOptions): CollectionBeforeChangeHook;
4
+ export declare function createCollectionUrlUpdateHook(options: PayloadPluginUrlsOptions): CollectionAfterChangeHook;
5
+ export declare function createRootPagesUrlUpdateHook(options: PayloadPluginUrlsOptions): GlobalAfterChangeHook;
5
6
  //# sourceMappingURL=hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAE7D,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAqC7E;AAED,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CA0CrF;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAqBpF"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,wBAAwB,EAAwB,MAAM,SAAS,CAAA;AAC7E,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAEhB,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,wBAAwB,GAChC,0BAA0B,CAqC5B;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,wBAAwB,GAChC,yBAAyB,CA0C3B;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,wBAAwB,GAChC,qBAAqB,CAuBvB"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var S=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var X=Object.prototype.hasOwnProperty;var Y=(e,o)=>{for(var t in o)S(e,t,{get:o[t],enumerable:!0})},Z=(e,o,t,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of Q(o))!X.call(e,n)&&n!==t&&S(e,n,{get:()=>o[n],enumerable:!(r=K(o,n))||r.enumerable});return e};var q=e=>Z(S({},"__esModule",{value:!0}),e);var ce={};Y(ce,{default:()=>v,getBreadcrumbsUrl:()=>p,getDocumentLink:()=>U,getDocumentLinkBySlugs:()=>T,getRootPageChangeSources:()=>I,hasUrlPathChanged:()=>w,payloadPluginUrls:()=>v,populatedUrlField:()=>x,resolvePopulatedUrl:()=>f,withLocalePrefix:()=>b,withoutTrailingSlash:()=>d});module.exports=q(ce);var d=e=>e.replace(/\/$/,"").replace(/^\/?/,"/");function p(e){return(e?.at(-1)?.url??"").replace(/(^\/)|(\/$)/g,"")}function H(e,o){return{...o||{},...oe(e)}}function F(e){let{populatedUrl:o,...t}=e;return t}function $(e){if(!(!e||typeof e!="object"||!("id"in e)))return typeof e.id=="string"?e.id:void 0}function m(e){if(typeof e=="string")return e;if(!(!e||typeof e!="object"||!("id"in e)))return typeof e.id=="string"?e.id:void 0}function h(e){return d(`/${e??""}`.replace(/\/+/g,"/"))}function y(e,o){if(!e||typeof e!="object"||!(o in e))return;let t=e;return typeof t[o]=="string"?t[o]:void 0}function O(e){return e._status==="draft"}function B(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function G(e){let o=new Set;return e.filter(t=>{let r=ee(t);return o.has(r)?!1:(o.add(r),!0)})}function ee(e){switch(e.type){case"category":case"collection":case"page":return`${e.type}:${e.collection}:${e.id??""}`;case"rootPages":return`rootPages:${JSON.stringify(e.current)}:${JSON.stringify(e.previous)}`}}function oe(e){return Object.fromEntries(Object.entries(e).filter(([,o])=>o!==void 0))}function x(e={collections:[]}){return{name:e.field?.name??"populatedUrl",type:"text",label:!1,localized:!0,...e.field?.overrides??{},admin:{hidden:!0,...B(e.field?.overrides?.admin)}}}function u(e){return{...e,field:{name:"populatedUrl",...e.field},locales:{defaultLocale:"en",locales:["en"],...e.locales},rootPages:{slug:"root-pages",indexPageField:"indexPage",...e.rootPages}}}function g(e,o){return e.collections.find(t=>t.slug===o)}function k(e,o){return e.collections.filter(t=>t.category?.collection===o).map(t=>t.slug)}function C(e){let o=u(e),t=[o.rootPages?.indexPageField??"indexPage",...o.collections.flatMap(r=>r.rootPageField?[r.rootPageField]:[])];return[...new Set(t)]}function U(e,{baseUrl:o,locale:t,options:r,urlPrefixStrategy:n}){if(typeof e.value=="string")throw new Error("Reference value is a string");if(e.value.populatedUrl)return d(e.value.populatedUrl);let l=u(r),a=g(l,e.relationTo),i=a?.routeCollection??e.relationTo,s=te(a,e.value,n??a?.category?.prefixStrategy);return T(s,{baseUrl:o,collection:i,locale:t,options:l})}function T(e,{baseUrl:o,locale:t,options:r}){let n=u(r),a=[...(o||(t===n.locales?.defaultLocale?"":t)).split("/"),...e].filter(Boolean);return d(`/${a.join("/")}`)}function b(e,o,t){let r=u(t).locales?.defaultLocale;return o===r?d(e):d(`/${o}${e}`)}function te(e,o,t){return e?.category?t==="rootPage"?[o.slug??""]:[re(o),o.slug??""]:e?.breadcrumbs?[p(o.breadcrumbs)||o.slug||""]:[o.slug??""]}function re(e){let o=e.categories;if(!Array.isArray(o)||o.length===0)return"";let r=o[0];if(!r||typeof r!="object"||typeof r=="string")return"";let n=r;return p(n.breadcrumbs)||(n.slug??"").replace(/(^\/)|(\/$)/g,"")}async function f({collection:e,data:o,locale:t,options:r,originalDoc:n,payload:l,rootPages:a}){let i=u(r),s=g(i,e);if(!s)return;let c=H(o,n),D=i.rootPages?.indexPageField??"indexPage";if(s.breadcrumbs&&!s.rootPageField){let P=await N({field:D,locale:t,payload:l,rootPages:a}),J=$(P);if(c.id&&J===c.id)return b("/",t,i);let L=h(p(c.breadcrumbs)),R=h(p(P?.breadcrumbs)),W=R&&L.startsWith(`${R}/`)?h(L.slice(R.length)):L;return b(W||`/${c.slug??""}`,t,i)}let A=await ne({collectionOptions:s,locale:t,options:i,payload:l,rootPages:a});if(s.category){let P=await le({categories:c[s.category.field??"categories"],collection:s.category.collection,locale:t,payload:l});return U({relationTo:e,value:{...F(c),[s.category.field??"categories"]:P,categories:P}},{baseUrl:A,locale:t,options:i})}return U({relationTo:e,value:F(c)},{baseUrl:A,locale:t,options:i})}async function ne({collectionOptions:e,locale:o,options:t,payload:r,rootPages:n}){if(!e.rootPageField)return;let l=await N({field:e.rootPageField,locale:o,payload:r,rootPages:n});if(l)return f({collection:"pages",data:{},locale:o,options:t,originalDoc:l,payload:r,rootPages:n})}async function N({field:e,locale:o,payload:t,rootPages:r}){let n=r[e];if(n)return typeof n!="string"?n:t?.findByID?.({collection:"pages",id:n,depth:0,locale:o,select:{id:!0,slug:!0,populatedUrl:!0,breadcrumbs:!0}})}async function le({categories:e,collection:o,locale:t,payload:r}){return Array.isArray(e)?Promise.all(e.map(n=>typeof n!="string"?Promise.resolve(n):r?.findByID?.({collection:o,id:n,depth:2,locale:t})??Promise.resolve(n))):[]}function V(e){return async({job:o,req:t})=>{let r=u(e),n=o.input?.sources??[];for(let l of r.locales?.locales??[]){let a=await t.payload.findGlobal?.({slug:r.rootPages?.slug??"root-pages",depth:2,locale:l});if(a)for(let i of ae(n,r))switch(i.type){case"category":await j({collection:i.collection,locale:l,options:r,payload:t.payload,rootPages:a});for(let s of k(r,i.collection))await j({collection:s,locale:l,options:r,payload:t.payload,rootPages:a});break;case"collection":case"page":await j({collection:i.collection,locale:l,options:r,payload:t.payload,rootPages:a});break;case"rootPages":break}}}}function w(e,o){let t=y(e,"populatedUrl"),r=y(o,"populatedUrl");return t&&r?t!==r:y(e,"slug")!==y(o,"slug")}function I(e,o,t){let r=u(t),n=[],l=r.rootPages?.indexPageField??"indexPage",a=m(e[l]),i=m(o?.[l]);a!==i&&(a&&n.push({type:"page",collection:"pages",id:a}),i&&n.push({type:"page",collection:"pages",id:i}));for(let s of r.collections){if(!s.rootPageField)continue;let c=m(e[s.rootPageField]),D=m(o?.[s.rootPageField]);c!==D&&n.push({type:"collection",collection:s.slug})}return G(n)}function z(e,o){let t={};for(let r of C(o))t[r]=e?.[r];return t}function ae(e,o){return e.flatMap(t=>t.type!=="rootPages"?[t]:I(t.current,t.previous,o))}async function j({collection:e,locale:o,options:t,payload:r,rootPages:n}){let l=1;for(;;){let a=await r.find?.({collection:e,depth:2,draft:!1,limit:100,locale:o,overrideAccess:!0,page:l,pagination:!0});if(!a)return;for(let i of a.docs){if(!i.id||O(i))continue;let s=await f({collection:e,data:{},locale:o,options:t,originalDoc:i,payload:r,rootPages:n});!s||i.populatedUrl===s||await r.update?.({collection:e,id:i.id,locale:o,overrideAccess:!0,data:{[t.field?.name??"populatedUrl"]:s},context:{disablePopulateUrl:!0,disableUrlUpdates:!0}})}if(!a.nextPage)return;l=a.nextPage}}function M(e){return async({collection:o,context:t,data:r={},originalDoc:n,req:l})=>{let a=l.locale;if(!a||a==="all"||t?.disablePopulateUrl||l.context?.disablePopulateUrl)return r;let i=await l.payload.findGlobal?.({slug:u(e).rootPages?.slug??"root-pages",depth:2,locale:a});if(!i)return r;let s=await f({collection:o?.slug??"",data:r,locale:a,options:e,originalDoc:n,payload:l.payload,rootPages:i});return s&&(r[e.field?.name??"populatedUrl"]=s),r}}function _(e){return async({collection:o,doc:t,previousDoc:r,req:n})=>{if(n.context?.disableUrlUpdates||!t||O(t)||!w(t,r))return t;let l=g(e,o?.slug??"");if(!l)return t;let a=o?.slug??"",s=k(e,a).length>0?{type:"category",collection:a,id:t.id}:{type:l.breadcrumbs&&!l.rootPageField?"page":"collection",collection:a,id:t.id};return await n.payload.jobs?.queue?.({workflow:"update-urls",input:{sources:[s]}}),t}}function E(e){return async({doc:o,previousDoc:t,req:r})=>(r.context?.disableUrlUpdates||await r.payload.jobs?.queue?.({workflow:"update-urls",input:{sources:[{type:"rootPages",current:z(o,e),previous:z(t,e)}]}}),o)}var v=e=>e?o=>{let t=u(e),r=(o.collections??[]).map(n=>ie(n,t));return{...o,collections:r,globals:[...o.globals??[],se(t)],jobs:{...o.jobs??{},workflows:[...o.jobs?.workflows??[],{slug:"update-urls",handler:V(t)}]}}}:o=>o;function ie(e,o){if(!g(o,e.slug))return e;let r=o.field?.name??"populatedUrl",n=e.fields.some(a=>a.name===r)?e.fields:[...e.fields,x(o)],l=e.hooks??{};return{...e,defaultPopulate:{...e.defaultPopulate??{},[r]:!0},fields:n,hooks:{...l,beforeChange:[...l.beforeChange??[],M(o)],afterChange:[...l.afterChange??[],_(o)]}}}function se(e){let o=u(e).rootPages;return{slug:o?.slug??"root-pages",label:o?.label??"Root pages",fields:C(e).map(t=>ue(t,e)),hooks:{afterChange:[E(e)]}}}function ue(e,o){let t=u(o).rootPages,{name:r,...n}=t?.fieldOverrides?.[e]??{};return{name:e,type:"relationship",relationTo:"pages",hasMany:!1,label:t?.fieldLabels?.[e],admin:{width:"50%"},...n}}0&&(module.exports={getBreadcrumbsUrl,getDocumentLink,getDocumentLinkBySlugs,getRootPageChangeSources,hasUrlPathChanged,payloadPluginUrls,populatedUrlField,resolvePopulatedUrl,withLocalePrefix,withoutTrailingSlash});
1
+ "use strict";var j=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var oo=Object.prototype.hasOwnProperty;var eo=(o,e)=>{for(var t in e)j(o,t,{get:e[t],enumerable:!0})},to=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of q(e))!oo.call(o,r)&&r!==t&&j(o,r,{get:()=>e[r],enumerable:!(n=Z(e,r))||n.enumerable});return o};var no=o=>to(j({},"__esModule",{value:!0}),o);var yo={};eo(yo,{default:()=>B,getBreadcrumbsUrl:()=>g,getDocumentLink:()=>U,getDocumentLinkBySlugs:()=>v,getRootPageChangeSources:()=>I,hasUrlPathChanged:()=>F,payloadPluginUrls:()=>B,populatedUrlField:()=>L,resolvePopulatedUrl:()=>y,withLocalePrefix:()=>O,withoutTrailingSlash:()=>d});module.exports=no(yo);var d=o=>o.replace(/\/$/,"").replace(/^\/?/,"/");function g(o){return(o?.at(-1)?.url??"").replace(/(^\/)|(\/$)/g,"")}function G(o,e){return{...e||{},...lo(o)}}function z(o){let{populatedUrl:e,...t}=o;return t}function N(o){if(!(!o||typeof o!="object"||!("id"in o)))return typeof o.id=="string"?o.id:void 0}function k(o){if(typeof o=="string")return o;if(!(!o||typeof o!="object"||!("id"in o)))return typeof o.id=="string"?o.id:void 0}function C(o){return d(`/${o??""}`.replace(/\/+/g,"/"))}function b(o,e){if(!o||typeof o!="object"||!(e in o))return;let t=o;return typeof t[e]=="string"?t[e]:void 0}function D(o){return o._status==="draft"}function E(o){return o&&typeof o=="object"&&!Array.isArray(o)?o:{}}function _(o){let e=new Set;return o.filter(t=>{let n=ro(t);return e.has(n)?!1:(e.add(n),!0)})}function ro(o){switch(o.type){case"category":case"collection":case"page":return`${o.type}:${o.collection}:${o.id??""}`;case"rootPages":return`rootPages:${JSON.stringify(o.current)}:${JSON.stringify(o.previous)}`}}function lo(o){return Object.fromEntries(Object.entries(o).filter(([,e])=>e!==void 0))}function L(o={collections:{}}){return{name:o.field?.name??"populatedUrl",type:"text",label:!1,localized:!0,...o.field?.overrides??{},admin:{hidden:!0,...E(o.field?.overrides?.admin)}}}function c(o,e){let r={...ao(e)??{defaultLocale:"en",locales:["en"]},...o.locales};return{...o,field:{name:"populatedUrl",...o.field},locales:{defaultLocale:r.defaultLocale??r.locales[0]??"en",locales:r.locales.length?r.locales:[r.defaultLocale??"en"]},rootPages:{slug:"root-pages",...o.rootPages,fields:o.rootPages?.fields??{indexPage:{isHomepage:!0,relationTo:"pages"}}}}}function p(o,e){return o.collections[e]}function H(o){return Object.entries(o.collections)}function x(o,e){return H(o).filter(([,t])=>t.category?.collection===e).map(([t])=>t)}function w(o){let e=c(o);return Object.keys(e.rootPages.fields)}function R(o){let e=c(o).rootPages.fields;return(Object.entries(e).find(([,n])=>n.isHomepage)??Object.entries(e).find(([n])=>n==="indexPage"))?.[0]??Object.keys(e)[0]??"indexPage"}function m(o,e){return c(o).rootPages.fields[e]}function ao(o){let e=o?.localization||void 0,t=e?.locales?.map(n=>typeof n=="string"?n:n.code).filter(n=>!!n);if(t?.length)return{defaultLocale:e?.defaultLocale??t[0]??"en",locales:t}}function U(o,{baseUrl:e,locale:t,options:n,urlPrefixStrategy:r}){if(typeof o.value=="string")throw new Error("Reference value is a string");if(o.value.populatedUrl)return d(o.value.populatedUrl);let l=c(n),i=p(l,o.relationTo),s=i?.routeCollection??o.relationTo,a=io(i,o.value,r??i?.prefixStrategy);return v(a,{baseUrl:e,collection:s,locale:t,options:l})}function v(o,{baseUrl:e,locale:t,options:n}){let r=c(n),i=[...(e||(t===r.locales?.defaultLocale?"":t)).split("/"),...o].filter(Boolean);return d(`/${i.join("/")}`)}function O(o,e,t){let n=c(t).locales?.defaultLocale;return e===n?d(o):d(`/${e}${o}`)}function io(o,e,t){return o?.category?t==="rootPage"?[e.slug??""]:[so(e),e.slug??""]:o?.breadcrumbs?[g(e.breadcrumbs)||e.slug||""]:[e.slug??""]}function so(o){let e=o.categories;if(!Array.isArray(e)||e.length===0)return"";let n=e[0];if(!n||typeof n!="object"||typeof n=="string")return"";let r=n;return g(r.breadcrumbs)||(r.slug??"").replace(/(^\/)|(\/$)/g,"")}async function y({collection:o,data:e,locale:t,options:n,originalDoc:r,payload:l,rootPages:i}){let s=c(n),a=p(s,o);if(!a)return;let u=G(e,r),f=R(s);if(a.breadcrumbs&&!a.rootPage){let P=await W({field:f,locale:t,payload:l,rootPages:i}),X=N(P);if(u.id&&X===u.id)return O("/",t,s);let S=C(g(u.breadcrumbs)),T=C(g(P?.breadcrumbs)),Y=T&&S.startsWith(`${T}/`)?C(S.slice(T.length)):S;return O(Y||`/${u.slug??""}`,t,s)}let h=await co({collectionOptions:a,locale:t,options:s,payload:l,rootPages:i});if(a.category){let P=await uo({categories:u[a.category.field??"categories"],collection:a.category.collection,locale:t,payload:l});return U({relationTo:o,value:{...z(u),[a.category.field??"categories"]:P,categories:P}},{baseUrl:h,locale:t,options:s})}return U({relationTo:o,value:z(u)},{baseUrl:h,locale:t,options:s})}async function co({collectionOptions:o,locale:e,options:t,payload:n,rootPages:r}){if(!o.rootPage)return;let l=o.rootPage,s=m(t,l)?.relationTo??"pages",a=await W({collection:s,field:l,locale:e,payload:n,rootPages:r});if(a)return typeof a.populatedUrl=="string"&&a.populatedUrl?V(a.populatedUrl,e,t):s!=="pages"?V(U({relationTo:s,value:a},{locale:e,options:t}),e,t):y({collection:s,data:{},locale:e,options:t,originalDoc:a,payload:n,rootPages:r})}function V(o,e,t){let n=c(t);return e===n.locales.defaultLocale||o===`/${e}`||o.startsWith(`/${e}/`)?o:O(o,e,n)}async function W({collection:o="pages",field:e,locale:t,payload:n,rootPages:r}){let l=r[e];return l?typeof l!="string"?l:await n?.findByID?.({collection:o,id:l,depth:0,locale:t,select:{id:!0,slug:!0,populatedUrl:!0,breadcrumbs:!0}}):void 0}async function uo({categories:o,collection:e,locale:t,payload:n}){return Array.isArray(o)?Promise.all(o.map(r=>typeof r!="string"?Promise.resolve(r):n?.findByID?.({collection:e,id:r,depth:2,locale:t})??Promise.resolve(r))):[]}function M(o){return async({job:e,req:t})=>{let n=c(o),r=e.input?.sources??[];for(let l of n.locales?.locales??[]){let i=await t.payload.findGlobal?.({slug:n.rootPages?.slug??"root-pages",depth:2,locale:l});if(i)for(let s of go(r,n))switch(s.type){case"category":await A({collection:s.collection,locale:l,options:n,payload:t.payload,rootPages:i});for(let a of x(n,s.collection))await A({collection:a,locale:l,options:n,payload:t.payload,rootPages:i});break;case"collection":case"page":await A({collection:s.collection,locale:l,options:n,payload:t.payload,rootPages:i});break;case"rootPages":break}}}}function F(o,e){let t=b(o,"populatedUrl"),n=b(e,"populatedUrl");return t&&n?t!==n:b(o,"slug")!==b(e,"slug")}function I(o,e,t){let n=c(t),r=[],l=R(n),i=m(n,l)?.relationTo??"pages",s=k(o[l]),a=k(e?.[l]);s!==a&&(s&&r.push({type:"page",collection:i,id:s}),a&&r.push({type:"page",collection:i,id:a}));for(let[u,f]of H(n)){if(!f.rootPage)continue;let h=k(o[f.rootPage]),P=k(e?.[f.rootPage]);h!==P&&r.push({type:"collection",collection:u})}return _(r)}function $(o,e){let t={};for(let n of w(e))t[n]=o?.[n];return t}function go(o,e){return o.flatMap(t=>t.type!=="rootPages"?[t]:I(t.current,t.previous,e))}async function A({collection:o,locale:e,options:t,payload:n,rootPages:r}){let l=1;for(;;){let i=await n.find?.({collection:o,depth:2,draft:!1,limit:100,locale:e,overrideAccess:!0,page:l,pagination:!0});if(!i)return;for(let s of i.docs){let a=s;if(!a.id||D(a))continue;let u=await y({collection:o,data:{},locale:e,options:t,originalDoc:a,payload:n,rootPages:r});!u||a.populatedUrl===u||await n.update?.({collection:o,id:a.id,locale:e,overrideAccess:!0,data:{[t.field?.name??"populatedUrl"]:u},context:{disablePopulateUrl:!0,disableUrlUpdates:!0}})}if(!i.nextPage)return;l=i.nextPage}}function J(o){return async({collection:e,context:t,data:n={},originalDoc:r,req:l})=>{let i=l.locale;if(!i||i==="all"||t?.disablePopulateUrl||l.context?.disablePopulateUrl)return n;let s=await l.payload.findGlobal?.({slug:c(o).rootPages?.slug??"root-pages",depth:2,locale:i});if(!s)return n;let a=await y({collection:e?.slug??"",data:n,locale:i,options:o,originalDoc:r,payload:l.payload,rootPages:s});return a&&(n[o.field?.name??"populatedUrl"]=a),n}}function K(o){return async({collection:e,doc:t,previousDoc:n,req:r})=>{let l=t,i=n;if(r.context?.disableUrlUpdates||!l||D(l)||!F(l,i))return l;let s=p(o,e?.slug??"");if(!s)return l;let a=e?.slug??"",f=x(o,a).length>0?{type:"category",collection:a,id:l.id}:{type:s.breadcrumbs&&!s.rootPage?"page":"collection",collection:a,id:l.id};return await r.payload.jobs?.queue?.({workflow:"update-urls",input:{sources:[f]}}),l}}function Q(o){return async({doc:e,previousDoc:t,req:n})=>{let r=e,l=t;return n.context?.disableUrlUpdates||await n.payload.jobs?.queue?.({workflow:"update-urls",input:{sources:[{type:"rootPages",current:$(r,o),previous:$(l,o)}]}}),r}}var B=o=>o?e=>{let t=c(o,e),n=(e.collections??[]).map(r=>po(r,t));return{...e,collections:n,globals:[...e.globals??[],fo(t)],jobs:{...e.jobs??{},workflows:[...e.jobs?.workflows??[],{slug:"update-urls",handler:M(t)}]}}}:e=>e;function po(o,e){if(!p(e,o.slug))return o;let n=e.field?.name??"populatedUrl",r=o.fields.some(i=>"name"in i&&i.name===n)?o.fields:[...o.fields,L(e)],l=o.hooks??{};return{...o,defaultPopulate:{...o.defaultPopulate??{},[n]:!0},fields:r,hooks:{...l,beforeChange:[...l.beforeChange??[],J(e)],afterChange:[...l.afterChange??[],K(e)]}}}function fo(o){let e=c(o).rootPages;return{slug:e?.slug??"root-pages",label:e?.label??"Root pages",fields:w(o).map(t=>Po(t,o)),hooks:{afterChange:[Q(o)]}}}function Po(o,e){let t=m(e,o),n=t?.overrides??{},{name:r,type:l,hasMany:i,relationTo:s,...a}=n;return{name:o,type:"relationship",relationTo:t?.relationTo??"pages",hasMany:!1,admin:{width:"50%"},...a}}0&&(module.exports={getBreadcrumbsUrl,getDocumentLink,getDocumentLinkBySlugs,getRootPageChangeSources,hasUrlPathChanged,payloadPluginUrls,populatedUrlField,resolvePopulatedUrl,withLocalePrefix,withoutTrailingSlash});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/field.ts","../src/options.ts","../src/link.ts","../src/resolver.ts","../src/update-urls.ts","../src/hooks.ts","../src/plugin.ts"],"sourcesContent":["export { populatedUrlField } from \"./field\"\nexport { getDocumentLink, getDocumentLinkBySlugs, withLocalePrefix } from \"./link\"\nexport { payloadPluginUrls } from \"./plugin\"\nexport { resolvePopulatedUrl } from \"./resolver\"\nexport { getRootPageChangeSources, hasUrlPathChanged } from \"./update-urls\"\nexport { getBreadcrumbsUrl, withoutTrailingSlash } from \"./utils\"\n\nexport type {\n Breadcrumb,\n CollectionConfigLike,\n FieldLike,\n GetDocumentLinkArgs,\n GetDocumentLinkContext,\n GlobalConfigLike,\n Hook,\n HookArgs,\n Locale,\n PayloadLike,\n PayloadPlugin,\n PayloadPluginConfig,\n PayloadPluginUrlsOptions,\n ResolvePopulatedUrlArgs,\n RootPagesDoc,\n UrlCollectionOptions,\n UrlDoc,\n UrlPrefixStrategy,\n UrlUpdateSource,\n WorkflowLike,\n} from \"./types\"\n\nexport { payloadPluginUrls as default } from \"./plugin\"\n","import type { Breadcrumb, UrlDoc, UrlUpdateSource } from \"./types\"\n\nconst withoutTrailingSlash = (path: string) => path.replace(/\\/$/, \"\").replace(/^\\/?/, \"/\")\n\nfunction getBreadcrumbsUrl(breadcrumbs: Breadcrumb[] | null | undefined) {\n const lastItem = breadcrumbs?.at(-1)\n const url = lastItem?.url ?? \"\"\n return url.replace(/(^\\/)|(\\/$)/g, \"\")\n}\n\nfunction mergeDoc<T extends object>(data: Partial<T>, originalDoc?: Partial<T>) {\n return {\n ...(originalDoc || {}),\n ...withoutUndefinedValues(data),\n } as T\n}\n\nfunction withoutPopulatedUrl<T extends object>(doc: T) {\n const { populatedUrl: _populatedUrl, ...rest } = doc as T & { populatedUrl?: unknown }\n return rest\n}\n\nfunction getDocumentId(doc: unknown) {\n if (!doc || typeof doc !== \"object\" || !(\"id\" in doc)) {\n return undefined\n }\n\n return typeof doc.id === \"string\" ? doc.id : undefined\n}\n\nfunction getRelationId(value: unknown) {\n if (typeof value === \"string\") {\n return value\n }\n\n if (!value || typeof value !== \"object\" || !(\"id\" in value)) {\n return undefined\n }\n\n return typeof value.id === \"string\" ? value.id : undefined\n}\n\nfunction normalizePath(path: string | undefined) {\n return withoutTrailingSlash(`/${path ?? \"\"}`.replace(/\\/+/g, \"/\"))\n}\n\nfunction getStringValue(value: unknown, key: \"populatedUrl\" | \"slug\") {\n if (!value || typeof value !== \"object\" || !(key in value)) {\n return undefined\n }\n\n const record = value as Record<\"populatedUrl\" | \"slug\", unknown>\n return typeof record[key] === \"string\" ? record[key] : undefined\n}\n\nfunction isDraftDoc(doc: UrlDoc) {\n return doc._status === \"draft\"\n}\n\nfunction getRecord(value: unknown) {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {}\n}\n\nfunction dedupeSources<T extends UrlUpdateSource>(sources: T[]) {\n const seen = new Set<string>()\n\n return sources.filter((source) => {\n const key = sourceKey(source)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n\nfunction sourceKey(source: UrlUpdateSource) {\n switch (source.type) {\n case \"category\":\n case \"collection\":\n case \"page\":\n return `${source.type}:${source.collection}:${source.id ?? \"\"}`\n case \"rootPages\":\n return `rootPages:${JSON.stringify(source.current)}:${JSON.stringify(source.previous)}`\n }\n}\n\nfunction withoutUndefinedValues<T extends object>(value: Partial<T>) {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as Partial<T>\n}\n\nexport {\n getBreadcrumbsUrl,\n getRecord,\n dedupeSources,\n isDraftDoc,\n getStringValue,\n normalizePath,\n getRelationId,\n getDocumentId,\n withoutPopulatedUrl,\n mergeDoc,\n withoutTrailingSlash,\n}\n","import { getRecord } from \"./utils\"\n\nimport type { PayloadPluginUrlsOptions } from \"./types\"\n\nexport function populatedUrlField(options: PayloadPluginUrlsOptions = { collections: [] }) {\n const fieldName = options.field?.name ?? \"populatedUrl\"\n\n return {\n name: fieldName,\n type: \"text\",\n label: false,\n localized: true,\n ...(options.field?.overrides ?? {}),\n admin: {\n hidden: true,\n ...getRecord(options.field?.overrides?.admin),\n },\n }\n}\n","import type { PayloadPluginUrlsOptions } from \"./types\"\n\nexport function normalizeOptions(options: PayloadPluginUrlsOptions): PayloadPluginUrlsOptions {\n return {\n ...options,\n field: {\n name: \"populatedUrl\",\n ...options.field,\n },\n locales: {\n defaultLocale: \"en\",\n locales: [\"en\"],\n ...options.locales,\n },\n rootPages: {\n slug: \"root-pages\",\n indexPageField: \"indexPage\",\n ...options.rootPages,\n },\n }\n}\n\nexport function getCollectionOptions(options: PayloadPluginUrlsOptions, collection: string) {\n return options.collections.find((collectionOptions) => collectionOptions.slug === collection)\n}\n\nexport function getCollectionsForCategory(\n options: PayloadPluginUrlsOptions,\n categoryCollection: string,\n) {\n return options.collections\n .filter((collectionOptions) => collectionOptions.category?.collection === categoryCollection)\n .map((collectionOptions) => collectionOptions.slug)\n}\n\nexport function getRootPageFieldNames(options: PayloadPluginUrlsOptions) {\n const normalizedOptions = normalizeOptions(options)\n const fieldNames = [\n normalizedOptions.rootPages?.indexPageField ?? \"indexPage\",\n ...normalizedOptions.collections.flatMap((collection) =>\n collection.rootPageField ? [collection.rootPageField] : [],\n ),\n ]\n\n return [...new Set(fieldNames)]\n}\n","import { getCollectionOptions, normalizeOptions } from \"./options\"\nimport { getBreadcrumbsUrl, withoutTrailingSlash } from \"./utils\"\n\nimport type {\n GetDocumentLinkArgs,\n GetDocumentLinkContext,\n Locale,\n PayloadPluginUrlsOptions,\n UrlCollectionOptions,\n UrlDoc,\n UrlPrefixStrategy,\n} from \"./types\"\n\nexport function getDocumentLink(\n reference: GetDocumentLinkArgs,\n { baseUrl, locale, options, urlPrefixStrategy }: GetDocumentLinkContext,\n) {\n if (typeof reference.value === \"string\") {\n throw new Error(\"Reference value is a string\")\n }\n\n if (reference.value.populatedUrl) {\n return withoutTrailingSlash(reference.value.populatedUrl)\n }\n\n const normalizedOptions = normalizeOptions(options)\n const collectionOptions = getCollectionOptions(normalizedOptions, reference.relationTo)\n const routeCollection = collectionOptions?.routeCollection ?? reference.relationTo\n const slugs = getSlugsForCollection(\n collectionOptions,\n reference.value,\n urlPrefixStrategy ?? collectionOptions?.category?.prefixStrategy,\n )\n\n return getDocumentLinkBySlugs(slugs, {\n baseUrl,\n collection: routeCollection,\n locale,\n options: normalizedOptions,\n })\n}\n\nexport function getDocumentLinkBySlugs(\n slugs: string[],\n {\n baseUrl,\n locale,\n options,\n }: {\n baseUrl?: string\n collection: string\n locale: Locale\n options: PayloadPluginUrlsOptions\n },\n) {\n const normalizedOptions = normalizeOptions(options)\n const prefix = baseUrl || (locale === normalizedOptions.locales?.defaultLocale ? \"\" : locale)\n const segments = [...prefix.split(\"/\"), ...slugs].filter(Boolean)\n return withoutTrailingSlash(`/${segments.join(\"/\")}`)\n}\n\nexport function withLocalePrefix(path: string, locale: Locale, options: PayloadPluginUrlsOptions) {\n const defaultLocale = normalizeOptions(options).locales?.defaultLocale\n if (locale === defaultLocale) {\n return withoutTrailingSlash(path)\n }\n return withoutTrailingSlash(`/${locale}${path}`)\n}\n\nfunction getSlugsForCollection(\n collectionOptions: UrlCollectionOptions | undefined,\n doc: UrlDoc,\n strategy?: UrlPrefixStrategy,\n) {\n if (collectionOptions?.category) {\n return strategy === \"rootPage\"\n ? [doc.slug ?? \"\"]\n : [firstRelatedCategoryPath(doc), doc.slug ?? \"\"]\n }\n\n if (collectionOptions?.breadcrumbs) {\n return [getBreadcrumbsUrl(doc.breadcrumbs) || doc.slug || \"\"]\n }\n\n return [doc.slug ?? \"\"]\n}\n\nfunction firstRelatedCategoryPath(doc: UrlDoc) {\n const categories = doc.categories\n if (!Array.isArray(categories) || categories.length === 0) {\n return \"\"\n }\n\n const categoryItems = categories as unknown[]\n const first = categoryItems[0]\n if (!first || typeof first !== \"object\" || typeof first === \"string\") {\n return \"\"\n }\n\n const categoryDoc = first as UrlDoc\n return (\n getBreadcrumbsUrl(categoryDoc.breadcrumbs) ||\n (categoryDoc.slug ?? \"\").replace(/(^\\/)|(\\/$)/g, \"\")\n )\n}\n","import { getDocumentLink, withLocalePrefix } from \"./link\"\nimport { getCollectionOptions, normalizeOptions } from \"./options\"\nimport {\n getBreadcrumbsUrl,\n getDocumentId,\n mergeDoc,\n normalizePath,\n withoutPopulatedUrl,\n} from \"./utils\"\n\nimport type {\n Locale,\n PayloadLike,\n PayloadPluginUrlsOptions,\n ResolvePopulatedUrlArgs,\n RootPagesDoc,\n UrlCollectionOptions,\n} from \"./types\"\n\nexport async function resolvePopulatedUrl({\n collection,\n data,\n locale,\n options,\n originalDoc,\n payload,\n rootPages,\n}: ResolvePopulatedUrlArgs): Promise<string | undefined> {\n const normalizedOptions = normalizeOptions(options)\n const collectionOptions = getCollectionOptions(normalizedOptions, collection)\n if (!collectionOptions) {\n return undefined\n }\n\n const doc = mergeDoc(data, originalDoc)\n const indexPageField = normalizedOptions.rootPages?.indexPageField ?? \"indexPage\"\n\n if (collectionOptions.breadcrumbs && !collectionOptions.rootPageField) {\n const homepage = await getRootPageDoc({\n field: indexPageField,\n locale,\n payload,\n rootPages,\n })\n const homepageId = getDocumentId(homepage)\n\n if (doc.id && homepageId === doc.id) {\n return withLocalePrefix(\"/\", locale, normalizedOptions)\n }\n\n const breadcrumbsPath = normalizePath(getBreadcrumbsUrl(doc.breadcrumbs))\n const homepagePath = normalizePath(getBreadcrumbsUrl(homepage?.breadcrumbs))\n const pagePath =\n homepagePath && breadcrumbsPath.startsWith(`${homepagePath}/`)\n ? normalizePath(breadcrumbsPath.slice(homepagePath.length))\n : breadcrumbsPath\n\n return withLocalePrefix(pagePath || `/${doc.slug ?? \"\"}`, locale, normalizedOptions)\n }\n\n const rootPageUrl: string | undefined = await getRootPageUrl({\n collectionOptions,\n locale,\n options: normalizedOptions,\n payload,\n rootPages,\n })\n\n if (collectionOptions.category) {\n const categories = await resolveCategories({\n categories: doc[collectionOptions.category.field ?? \"categories\"],\n collection: collectionOptions.category.collection,\n locale,\n payload,\n })\n\n return getDocumentLink(\n {\n relationTo: collection,\n value: {\n ...withoutPopulatedUrl(doc),\n [collectionOptions.category.field ?? \"categories\"]: categories,\n categories,\n },\n },\n {\n baseUrl: rootPageUrl,\n locale,\n options: normalizedOptions,\n },\n )\n }\n\n return getDocumentLink(\n {\n relationTo: collection,\n value: withoutPopulatedUrl(doc),\n },\n {\n baseUrl: rootPageUrl,\n locale,\n options: normalizedOptions,\n },\n )\n}\n\nasync function getRootPageUrl({\n collectionOptions,\n locale,\n options,\n payload,\n rootPages,\n}: {\n collectionOptions: UrlCollectionOptions\n locale: Locale\n options: PayloadPluginUrlsOptions\n payload?: PayloadLike\n rootPages: RootPagesDoc\n}): Promise<string | undefined> {\n if (!collectionOptions.rootPageField) {\n return undefined\n }\n\n const rootPage = await getRootPageDoc({\n field: collectionOptions.rootPageField,\n locale,\n payload,\n rootPages,\n })\n\n if (!rootPage) {\n return undefined\n }\n\n return resolvePopulatedUrl({\n collection: \"pages\",\n data: {},\n locale,\n options,\n originalDoc: rootPage,\n payload,\n rootPages,\n })\n}\n\nasync function getRootPageDoc({\n field,\n locale,\n payload,\n rootPages,\n}: {\n field: string\n locale: Locale\n payload?: PayloadLike\n rootPages: RootPagesDoc\n}) {\n const page = rootPages[field]\n\n if (!page) {\n return undefined\n }\n\n if (typeof page !== \"string\") {\n return page\n }\n\n return payload?.findByID?.({\n collection: \"pages\",\n id: page,\n depth: 0,\n locale,\n select: {\n id: true,\n slug: true,\n populatedUrl: true,\n breadcrumbs: true,\n },\n })\n}\n\nasync function resolveCategories({\n categories,\n collection,\n locale,\n payload,\n}: {\n categories: unknown\n collection: string\n locale: Locale\n payload?: PayloadLike\n}) {\n if (!Array.isArray(categories)) {\n return []\n }\n\n return Promise.all(\n categories.map((category) => {\n if (typeof category !== \"string\") {\n return Promise.resolve(category)\n }\n\n return (\n payload?.findByID?.({\n collection,\n id: category,\n depth: 2,\n locale,\n }) ?? Promise.resolve(category)\n )\n }),\n )\n}\n","import { getCollectionsForCategory, getRootPageFieldNames, normalizeOptions } from \"./options\"\nimport { resolvePopulatedUrl } from \"./resolver\"\nimport { dedupeSources, getRelationId, getStringValue, isDraftDoc } from \"./utils\"\n\nimport type {\n Locale,\n PayloadLike,\n PayloadPluginUrlsOptions,\n RootPagesDoc,\n UrlDoc,\n UrlUpdateSource,\n} from \"./types\"\n\nexport function createUpdateUrlsHandler(options: PayloadPluginUrlsOptions) {\n return async ({\n job,\n req,\n }: {\n job: {\n input?: {\n sources?: UrlUpdateSource[] | null\n }\n }\n req: {\n payload: PayloadLike\n }\n }) => {\n const normalizedOptions = normalizeOptions(options)\n const sources = job.input?.sources ?? []\n\n for (const locale of normalizedOptions.locales?.locales ?? []) {\n const rootPages = await req.payload.findGlobal?.({\n slug: normalizedOptions.rootPages?.slug ?? \"root-pages\",\n depth: 2,\n locale,\n })\n if (!rootPages) {\n continue\n }\n\n for (const source of expandSources(sources, normalizedOptions)) {\n switch (source.type) {\n case \"category\":\n await updateCollectionDocuments({\n collection: source.collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n for (const collection of getCollectionsForCategory(\n normalizedOptions,\n source.collection,\n )) {\n await updateCollectionDocuments({\n collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n }\n break\n case \"collection\":\n case \"page\":\n await updateCollectionDocuments({\n collection: source.collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n break\n case \"rootPages\":\n break\n }\n }\n }\n }\n}\n\nexport function hasUrlPathChanged(doc: unknown, previousDoc: unknown) {\n const docUrl = getStringValue(doc, \"populatedUrl\")\n const previousUrl = getStringValue(previousDoc, \"populatedUrl\")\n\n if (docUrl && previousUrl) {\n return docUrl !== previousUrl\n }\n\n return getStringValue(doc, \"slug\") !== getStringValue(previousDoc, \"slug\")\n}\n\nexport function getRootPageChangeSources(\n current: RootPagesDoc,\n previous: RootPagesDoc | undefined,\n options: PayloadPluginUrlsOptions,\n): UrlUpdateSource[] {\n const normalizedOptions = normalizeOptions(options)\n const sources: UrlUpdateSource[] = []\n const indexPageField = normalizedOptions.rootPages?.indexPageField ?? \"indexPage\"\n const currentIndexPageId = getRelationId(current[indexPageField])\n const previousIndexPageId = getRelationId(previous?.[indexPageField])\n\n if (currentIndexPageId !== previousIndexPageId) {\n if (currentIndexPageId) {\n sources.push({ type: \"page\", collection: \"pages\", id: currentIndexPageId })\n }\n if (previousIndexPageId) {\n sources.push({ type: \"page\", collection: \"pages\", id: previousIndexPageId })\n }\n }\n\n for (const collection of normalizedOptions.collections) {\n if (!collection.rootPageField) {\n continue\n }\n\n const currentRootPageId = getRelationId(current[collection.rootPageField])\n const previousRootPageId = getRelationId(previous?.[collection.rootPageField])\n if (currentRootPageId !== previousRootPageId) {\n sources.push({ type: \"collection\", collection: collection.slug })\n }\n }\n\n return dedupeSources(sources)\n}\n\nexport function getRootPageSnapshot(\n rootPages: UrlDoc | undefined,\n options: PayloadPluginUrlsOptions,\n) {\n const snapshot: RootPagesDoc = {}\n\n for (const fieldName of getRootPageFieldNames(options)) {\n snapshot[fieldName] = rootPages?.[fieldName] as RootPagesDoc[string]\n }\n\n return snapshot\n}\n\nfunction expandSources(sources: UrlUpdateSource[], options: PayloadPluginUrlsOptions) {\n return sources.flatMap((source) => {\n if (source.type !== \"rootPages\") {\n return [source]\n }\n\n return getRootPageChangeSources(source.current, source.previous, options)\n })\n}\n\nasync function updateCollectionDocuments({\n collection,\n locale,\n options,\n payload,\n rootPages,\n}: {\n collection: string\n locale: Locale\n options: PayloadPluginUrlsOptions\n payload: PayloadLike\n rootPages: RootPagesDoc\n}) {\n let page = 1\n\n for (;;) {\n const result = await payload.find?.({\n collection,\n depth: 2,\n draft: false,\n limit: 100,\n locale,\n overrideAccess: true,\n page,\n pagination: true,\n })\n\n if (!result) {\n return\n }\n\n for (const doc of result.docs) {\n if (!doc.id || isDraftDoc(doc)) {\n continue\n }\n\n const populatedUrlValue = await resolvePopulatedUrl({\n collection,\n data: {},\n locale,\n options,\n originalDoc: doc,\n payload,\n rootPages,\n })\n\n if (!populatedUrlValue || doc.populatedUrl === populatedUrlValue) {\n continue\n }\n\n await payload.update?.({\n collection,\n id: doc.id,\n locale,\n overrideAccess: true,\n data: {\n [options.field?.name ?? \"populatedUrl\"]: populatedUrlValue,\n },\n context: {\n disablePopulateUrl: true,\n disableUrlUpdates: true,\n },\n })\n }\n\n if (!result.nextPage) {\n return\n }\n\n page = result.nextPage\n }\n}\n","import { getCollectionOptions, getCollectionsForCategory, normalizeOptions } from \"./options\"\nimport { resolvePopulatedUrl } from \"./resolver\"\nimport { getRootPageSnapshot, hasUrlPathChanged } from \"./update-urls\"\nimport { isDraftDoc } from \"./utils\"\n\nimport type { Hook, PayloadPluginUrlsOptions } from \"./types\"\n\nexport function createPopulateUrlHook(options: PayloadPluginUrlsOptions): Hook {\n return async ({ collection, context, data = {}, originalDoc, req }) => {\n const locale = req.locale\n if (\n !locale ||\n locale === \"all\" ||\n context?.disablePopulateUrl ||\n req.context?.disablePopulateUrl\n ) {\n return data\n }\n\n const rootPages = await req.payload.findGlobal?.({\n slug: normalizeOptions(options).rootPages?.slug ?? \"root-pages\",\n depth: 2,\n locale,\n })\n if (!rootPages) {\n return data\n }\n\n const populatedUrlValue = await resolvePopulatedUrl({\n collection: collection?.slug ?? \"\",\n data,\n locale,\n options,\n originalDoc,\n payload: req.payload,\n rootPages,\n })\n\n if (populatedUrlValue) {\n data[options.field?.name ?? \"populatedUrl\"] = populatedUrlValue\n }\n\n return data\n }\n}\n\nexport function createCollectionUrlUpdateHook(options: PayloadPluginUrlsOptions): Hook {\n return async ({ collection, doc, previousDoc, req }) => {\n if (\n req.context?.disableUrlUpdates ||\n !doc ||\n isDraftDoc(doc) ||\n !hasUrlPathChanged(doc, previousDoc)\n ) {\n return doc\n }\n\n const collectionOptions = getCollectionOptions(options, collection?.slug ?? \"\")\n if (!collectionOptions) {\n return doc\n }\n\n const collectionSlug = collection?.slug ?? \"\"\n const isCategoryCollection = getCollectionsForCategory(options, collectionSlug).length > 0\n const source = isCategoryCollection\n ? {\n type: \"category\",\n collection: collectionSlug,\n id: doc.id,\n }\n : {\n type:\n collectionOptions.breadcrumbs && !collectionOptions.rootPageField\n ? \"page\"\n : \"collection\",\n collection: collectionSlug,\n id: doc.id,\n }\n\n await req.payload.jobs?.queue?.({\n workflow: \"update-urls\",\n input: {\n sources: [source],\n },\n })\n\n return doc\n }\n}\n\nexport function createRootPagesUrlUpdateHook(options: PayloadPluginUrlsOptions): Hook {\n return async ({ doc, previousDoc, req }) => {\n if (req.context?.disableUrlUpdates) {\n return doc\n }\n\n await req.payload.jobs?.queue?.({\n workflow: \"update-urls\",\n input: {\n sources: [\n {\n type: \"rootPages\",\n current: getRootPageSnapshot(doc, options),\n previous: getRootPageSnapshot(previousDoc, options),\n },\n ],\n },\n })\n\n return doc\n }\n}\n","import { populatedUrlField } from \"./field\"\nimport {\n createCollectionUrlUpdateHook,\n createPopulateUrlHook,\n createRootPagesUrlUpdateHook,\n} from \"./hooks\"\nimport { getCollectionOptions, getRootPageFieldNames, normalizeOptions } from \"./options\"\nimport { createUpdateUrlsHandler } from \"./update-urls\"\n\nimport type {\n CollectionConfigLike,\n GlobalConfigLike,\n PayloadPlugin,\n PayloadPluginUrlsOptions,\n} from \"./types\"\n\nexport const payloadPluginUrls = (options?: PayloadPluginUrlsOptions): PayloadPlugin => {\n if (!options) {\n return (config) => config\n }\n\n return (config) => {\n const normalizedOptions = normalizeOptions(options)\n const collections = (config.collections ?? []).map((collection) =>\n applyUrlCollectionConfig(collection, normalizedOptions),\n )\n\n return {\n ...config,\n collections,\n globals: [...(config.globals ?? []), createRootPagesGlobal(normalizedOptions)],\n jobs: {\n ...(config.jobs ?? {}),\n workflows: [\n ...(config.jobs?.workflows ?? []),\n {\n slug: \"update-urls\",\n handler: createUpdateUrlsHandler(normalizedOptions),\n },\n ],\n },\n }\n }\n}\n\nfunction applyUrlCollectionConfig(\n collection: CollectionConfigLike,\n options: PayloadPluginUrlsOptions,\n) {\n const collectionOptions = getCollectionOptions(options, collection.slug)\n if (!collectionOptions) {\n return collection\n }\n\n const fieldName = options.field?.name ?? \"populatedUrl\"\n const fields = collection.fields.some((field) => field.name === fieldName)\n ? collection.fields\n : [...collection.fields, populatedUrlField(options)]\n const hooks = collection.hooks ?? {}\n\n return {\n ...collection,\n defaultPopulate: {\n ...(collection.defaultPopulate ?? {}),\n [fieldName]: true,\n },\n fields,\n hooks: {\n ...hooks,\n beforeChange: [...(hooks.beforeChange ?? []), createPopulateUrlHook(options)],\n afterChange: [...(hooks.afterChange ?? []), createCollectionUrlUpdateHook(options)],\n },\n }\n}\n\nfunction createRootPagesGlobal(options: PayloadPluginUrlsOptions): GlobalConfigLike {\n const rootPagesOptions = normalizeOptions(options).rootPages\n\n return {\n slug: rootPagesOptions?.slug ?? \"root-pages\",\n label: rootPagesOptions?.label ?? \"Root pages\",\n fields: getRootPageFieldNames(options).map((fieldName) =>\n createRootPageField(fieldName, options),\n ),\n hooks: {\n afterChange: [createRootPagesUrlUpdateHook(options)],\n },\n }\n}\n\nfunction createRootPageField(fieldName: string, options: PayloadPluginUrlsOptions) {\n const rootPagesOptions = normalizeOptions(options).rootPages\n const { name: _name, ...override } = rootPagesOptions?.fieldOverrides?.[fieldName] ?? {}\n\n return {\n name: fieldName,\n type: \"relationship\",\n relationTo: \"pages\",\n hasMany: false,\n label: rootPagesOptions?.fieldLabels?.[fieldName],\n admin: {\n width: \"50%\",\n },\n ...override,\n }\n}\n"],"mappings":"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","names":["index_exports","__export","payloadPluginUrls","getBreadcrumbsUrl","getDocumentLink","getDocumentLinkBySlugs","getRootPageChangeSources","hasUrlPathChanged","populatedUrlField","resolvePopulatedUrl","withLocalePrefix","withoutTrailingSlash","__toCommonJS","withoutTrailingSlash","path","getBreadcrumbsUrl","breadcrumbs","mergeDoc","data","originalDoc","withoutUndefinedValues","withoutPopulatedUrl","doc","_populatedUrl","rest","getDocumentId","getRelationId","value","normalizePath","getStringValue","key","record","isDraftDoc","getRecord","dedupeSources","sources","seen","source","sourceKey","entry","populatedUrlField","options","getRecord","normalizeOptions","options","getCollectionOptions","collection","collectionOptions","getCollectionsForCategory","categoryCollection","getRootPageFieldNames","normalizedOptions","fieldNames","getDocumentLink","reference","baseUrl","locale","options","urlPrefixStrategy","withoutTrailingSlash","normalizedOptions","normalizeOptions","collectionOptions","getCollectionOptions","routeCollection","slugs","getSlugsForCollection","getDocumentLinkBySlugs","segments","withLocalePrefix","path","defaultLocale","doc","strategy","firstRelatedCategoryPath","getBreadcrumbsUrl","categories","first","categoryDoc","resolvePopulatedUrl","collection","data","locale","options","originalDoc","payload","rootPages","normalizedOptions","normalizeOptions","collectionOptions","getCollectionOptions","doc","mergeDoc","indexPageField","homepage","getRootPageDoc","homepageId","getDocumentId","withLocalePrefix","breadcrumbsPath","normalizePath","getBreadcrumbsUrl","homepagePath","pagePath","rootPageUrl","getRootPageUrl","categories","resolveCategories","getDocumentLink","withoutPopulatedUrl","rootPage","field","page","category","createUpdateUrlsHandler","options","job","req","normalizedOptions","normalizeOptions","sources","locale","rootPages","source","expandSources","updateCollectionDocuments","collection","getCollectionsForCategory","hasUrlPathChanged","doc","previousDoc","docUrl","getStringValue","previousUrl","getRootPageChangeSources","current","previous","indexPageField","currentIndexPageId","getRelationId","previousIndexPageId","currentRootPageId","previousRootPageId","dedupeSources","getRootPageSnapshot","snapshot","fieldName","getRootPageFieldNames","payload","page","result","isDraftDoc","populatedUrlValue","resolvePopulatedUrl","createPopulateUrlHook","options","collection","context","data","originalDoc","req","locale","rootPages","normalizeOptions","populatedUrlValue","resolvePopulatedUrl","createCollectionUrlUpdateHook","doc","previousDoc","isDraftDoc","hasUrlPathChanged","collectionOptions","getCollectionOptions","collectionSlug","source","getCollectionsForCategory","createRootPagesUrlUpdateHook","getRootPageSnapshot","payloadPluginUrls","options","config","normalizedOptions","normalizeOptions","collections","collection","applyUrlCollectionConfig","createRootPagesGlobal","createUpdateUrlsHandler","getCollectionOptions","fieldName","fields","field","populatedUrlField","hooks","createPopulateUrlHook","createCollectionUrlUpdateHook","rootPagesOptions","getRootPageFieldNames","createRootPageField","createRootPagesUrlUpdateHook","_name","override"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/field.ts","../src/options.ts","../src/link.ts","../src/resolver.ts","../src/update-urls.ts","../src/hooks.ts","../src/plugin.ts"],"sourcesContent":["export { populatedUrlField } from \"./field\"\nexport { getDocumentLink, getDocumentLinkBySlugs, withLocalePrefix } from \"./link\"\nexport { payloadPluginUrls } from \"./plugin\"\nexport { resolvePopulatedUrl } from \"./resolver\"\nexport { getRootPageChangeSources, hasUrlPathChanged } from \"./update-urls\"\nexport { getBreadcrumbsUrl, withoutTrailingSlash } from \"./utils\"\n\nexport type {\n Breadcrumb,\n CollectionConfigLike,\n FieldLike,\n GetDocumentLinkArgs,\n GetDocumentLinkContext,\n GlobalConfigLike,\n Hook,\n HookArgs,\n Locale,\n PayloadLike,\n PayloadPlugin,\n PayloadPluginConfig,\n PayloadPluginUrlsOptions,\n ResolvePopulatedUrlArgs,\n RootPageFieldOptions,\n RootPagesDoc,\n UrlCollectionOptions,\n UrlDoc,\n UrlPrefixStrategy,\n UrlUpdateSource,\n WorkflowLike,\n} from \"./types\"\n\nexport { payloadPluginUrls as default } from \"./plugin\"\n","import type { Breadcrumb, UrlDoc, UrlUpdateSource } from \"./types\"\n\nconst withoutTrailingSlash = (path: string) => path.replace(/\\/$/, \"\").replace(/^\\/?/, \"/\")\n\nfunction getBreadcrumbsUrl(breadcrumbs: Breadcrumb[] | null | undefined) {\n const lastItem = breadcrumbs?.at(-1)\n const url = lastItem?.url ?? \"\"\n return url.replace(/(^\\/)|(\\/$)/g, \"\")\n}\n\nfunction mergeDoc<T extends object>(data: Partial<T>, originalDoc?: Partial<T>) {\n return {\n ...(originalDoc || {}),\n ...withoutUndefinedValues(data),\n } as T\n}\n\nfunction withoutPopulatedUrl<T extends object>(doc: T) {\n const { populatedUrl: _populatedUrl, ...rest } = doc as T & { populatedUrl?: unknown }\n return rest\n}\n\nfunction getDocumentId(doc: unknown) {\n if (!doc || typeof doc !== \"object\" || !(\"id\" in doc)) {\n return undefined\n }\n\n return typeof doc.id === \"string\" ? doc.id : undefined\n}\n\nfunction getRelationId(value: unknown) {\n if (typeof value === \"string\") {\n return value\n }\n\n if (!value || typeof value !== \"object\" || !(\"id\" in value)) {\n return undefined\n }\n\n return typeof value.id === \"string\" ? value.id : undefined\n}\n\nfunction normalizePath(path: string | undefined) {\n return withoutTrailingSlash(`/${path ?? \"\"}`.replace(/\\/+/g, \"/\"))\n}\n\nfunction getStringValue(value: unknown, key: \"populatedUrl\" | \"slug\") {\n if (!value || typeof value !== \"object\" || !(key in value)) {\n return undefined\n }\n\n const record = value as Record<\"populatedUrl\" | \"slug\", unknown>\n return typeof record[key] === \"string\" ? record[key] : undefined\n}\n\nfunction isDraftDoc(doc: UrlDoc) {\n return doc._status === \"draft\"\n}\n\nfunction getRecord(value: unknown) {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {}\n}\n\nfunction dedupeSources<T extends UrlUpdateSource>(sources: T[]) {\n const seen = new Set<string>()\n\n return sources.filter((source) => {\n const key = sourceKey(source)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n\nfunction sourceKey(source: UrlUpdateSource) {\n switch (source.type) {\n case \"category\":\n case \"collection\":\n case \"page\":\n return `${source.type}:${source.collection}:${source.id ?? \"\"}`\n case \"rootPages\":\n return `rootPages:${JSON.stringify(source.current)}:${JSON.stringify(source.previous)}`\n }\n}\n\nfunction withoutUndefinedValues<T extends object>(value: Partial<T>) {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as Partial<T>\n}\n\nexport {\n getBreadcrumbsUrl,\n getRecord,\n dedupeSources,\n isDraftDoc,\n getStringValue,\n normalizePath,\n getRelationId,\n getDocumentId,\n withoutPopulatedUrl,\n mergeDoc,\n withoutTrailingSlash,\n}\n","import { getRecord } from \"./utils\"\n\nimport type { PayloadPluginUrlsOptions } from \"./types\"\nimport type { Field } from \"payload\"\n\nexport function populatedUrlField(options: PayloadPluginUrlsOptions = { collections: {} }): Field {\n const fieldName = options.field?.name ?? \"populatedUrl\"\n\n return {\n name: fieldName,\n type: \"text\",\n label: false,\n localized: true,\n ...(options.field?.overrides ?? {}),\n admin: {\n hidden: true,\n ...getRecord(options.field?.overrides?.admin),\n },\n } as Field\n}\n","import type {\n PayloadPluginConfig,\n PayloadPluginUrlsOptions,\n RootPageFieldOptions,\n UrlCollectionOptions,\n} from \"./types\"\n\nexport type NormalizedPayloadPluginUrlsOptions = PayloadPluginUrlsOptions & {\n collections: Record<string, UrlCollectionOptions>\n locales: {\n defaultLocale: string\n locales: string[]\n }\n rootPages: {\n slug: string\n label?: unknown\n fields: Record<string, RootPageFieldOptions>\n }\n}\n\nexport function normalizeOptions(\n options: PayloadPluginUrlsOptions,\n config?: PayloadPluginConfig,\n): NormalizedPayloadPluginUrlsOptions {\n const configLocales = getConfigLocales(config)\n const fallbackLocales = configLocales ?? { defaultLocale: \"en\", locales: [\"en\"] }\n const locales = {\n ...fallbackLocales,\n ...options.locales,\n }\n\n return {\n ...options,\n field: {\n name: \"populatedUrl\",\n ...options.field,\n },\n locales: {\n defaultLocale: locales.defaultLocale ?? locales.locales[0] ?? \"en\",\n locales: locales.locales.length ? locales.locales : [locales.defaultLocale ?? \"en\"],\n },\n rootPages: {\n slug: \"root-pages\",\n ...options.rootPages,\n fields: options.rootPages?.fields ?? {\n indexPage: {\n isHomepage: true,\n relationTo: \"pages\",\n },\n },\n },\n }\n}\n\nexport function getCollectionOptions(options: PayloadPluginUrlsOptions, collection: string) {\n return options.collections[collection]\n}\n\nexport function getCollectionEntries(options: PayloadPluginUrlsOptions) {\n return Object.entries(options.collections)\n}\n\nexport function getCollectionsForCategory(\n options: PayloadPluginUrlsOptions,\n categoryCollection: string,\n) {\n return getCollectionEntries(options)\n .filter(\n ([, collectionOptions]) => collectionOptions.category?.collection === categoryCollection,\n )\n .map(([collection]) => collection)\n}\n\nexport function getRootPageFieldNames(options: PayloadPluginUrlsOptions) {\n const normalizedOptions = normalizeOptions(options)\n return Object.keys(normalizedOptions.rootPages.fields)\n}\n\nexport function getHomepageRootPageField(options: PayloadPluginUrlsOptions) {\n const fields = normalizeOptions(options).rootPages.fields\n const homepageEntry =\n Object.entries(fields).find(([, field]) => field.isHomepage) ??\n Object.entries(fields).find(([fieldName]) => fieldName === \"indexPage\")\n\n return homepageEntry?.[0] ?? Object.keys(fields)[0] ?? \"indexPage\"\n}\n\nexport function getRootPageFieldOptions(options: PayloadPluginUrlsOptions, fieldName: string) {\n return normalizeOptions(options).rootPages.fields[fieldName]\n}\n\nfunction getConfigLocales(config: PayloadPluginConfig | undefined) {\n const localization = config?.localization || undefined\n const locales = localization?.locales\n ?.map((locale) => (typeof locale === \"string\" ? locale : locale.code))\n .filter((locale): locale is string => Boolean(locale))\n\n if (!locales?.length) {\n return undefined\n }\n\n return {\n defaultLocale: localization?.defaultLocale ?? locales[0] ?? \"en\",\n locales,\n }\n}\n","import { getCollectionOptions, normalizeOptions } from \"./options\"\nimport { getBreadcrumbsUrl, withoutTrailingSlash } from \"./utils\"\n\nimport type {\n GetDocumentLinkArgs,\n GetDocumentLinkContext,\n Locale,\n PayloadPluginUrlsOptions,\n UrlCollectionOptions,\n UrlDoc,\n UrlPrefixStrategy,\n} from \"./types\"\n\nexport function getDocumentLink(\n reference: GetDocumentLinkArgs,\n { baseUrl, locale, options, urlPrefixStrategy }: GetDocumentLinkContext,\n) {\n if (typeof reference.value === \"string\") {\n throw new Error(\"Reference value is a string\")\n }\n\n if (reference.value.populatedUrl) {\n return withoutTrailingSlash(reference.value.populatedUrl)\n }\n\n const normalizedOptions = normalizeOptions(options)\n const collectionOptions = getCollectionOptions(normalizedOptions, reference.relationTo)\n const routeCollection = collectionOptions?.routeCollection ?? reference.relationTo\n const slugs = getSlugsForCollection(\n collectionOptions,\n reference.value,\n urlPrefixStrategy ?? collectionOptions?.prefixStrategy,\n )\n\n return getDocumentLinkBySlugs(slugs, {\n baseUrl,\n collection: routeCollection,\n locale,\n options: normalizedOptions,\n })\n}\n\nexport function getDocumentLinkBySlugs(\n slugs: string[],\n {\n baseUrl,\n locale,\n options,\n }: {\n baseUrl?: string\n collection: string\n locale: Locale\n options: PayloadPluginUrlsOptions\n },\n) {\n const normalizedOptions = normalizeOptions(options)\n const prefix = baseUrl || (locale === normalizedOptions.locales?.defaultLocale ? \"\" : locale)\n const segments = [...prefix.split(\"/\"), ...slugs].filter(Boolean)\n return withoutTrailingSlash(`/${segments.join(\"/\")}`)\n}\n\nexport function withLocalePrefix(path: string, locale: Locale, options: PayloadPluginUrlsOptions) {\n const defaultLocale = normalizeOptions(options).locales?.defaultLocale\n if (locale === defaultLocale) {\n return withoutTrailingSlash(path)\n }\n return withoutTrailingSlash(`/${locale}${path}`)\n}\n\nfunction getSlugsForCollection(\n collectionOptions: UrlCollectionOptions | undefined,\n doc: UrlDoc,\n strategy?: UrlPrefixStrategy,\n) {\n if (collectionOptions?.category) {\n return strategy === \"rootPage\"\n ? [doc.slug ?? \"\"]\n : [firstRelatedCategoryPath(doc), doc.slug ?? \"\"]\n }\n\n if (collectionOptions?.breadcrumbs) {\n return [getBreadcrumbsUrl(doc.breadcrumbs) || doc.slug || \"\"]\n }\n\n return [doc.slug ?? \"\"]\n}\n\nfunction firstRelatedCategoryPath(doc: UrlDoc) {\n const categories = doc.categories\n if (!Array.isArray(categories) || categories.length === 0) {\n return \"\"\n }\n\n const categoryItems = categories as unknown[]\n const first = categoryItems[0]\n if (!first || typeof first !== \"object\" || typeof first === \"string\") {\n return \"\"\n }\n\n const categoryDoc = first as UrlDoc\n return (\n getBreadcrumbsUrl(categoryDoc.breadcrumbs) ||\n (categoryDoc.slug ?? \"\").replace(/(^\\/)|(\\/$)/g, \"\")\n )\n}\n","import { getDocumentLink, withLocalePrefix } from \"./link\"\nimport {\n getCollectionOptions,\n getHomepageRootPageField,\n getRootPageFieldOptions,\n normalizeOptions,\n} from \"./options\"\nimport {\n getBreadcrumbsUrl,\n getDocumentId,\n mergeDoc,\n normalizePath,\n withoutPopulatedUrl,\n} from \"./utils\"\n\nimport type {\n Locale,\n PayloadLike,\n PayloadPluginUrlsOptions,\n ResolvePopulatedUrlArgs,\n RootPagesDoc,\n UrlCollectionOptions,\n UrlDoc,\n} from \"./types\"\n\nexport async function resolvePopulatedUrl({\n collection,\n data,\n locale,\n options,\n originalDoc,\n payload,\n rootPages,\n}: ResolvePopulatedUrlArgs): Promise<string | undefined> {\n const normalizedOptions = normalizeOptions(options)\n const collectionOptions = getCollectionOptions(normalizedOptions, collection)\n if (!collectionOptions) {\n return undefined\n }\n\n const doc = mergeDoc(data, originalDoc)\n const homepageField = getHomepageRootPageField(normalizedOptions)\n\n if (collectionOptions.breadcrumbs && !collectionOptions.rootPage) {\n const homepage = await getRootPageDoc({\n field: homepageField,\n locale,\n payload,\n rootPages,\n })\n const homepageId = getDocumentId(homepage)\n\n if (doc.id && homepageId === doc.id) {\n return withLocalePrefix(\"/\", locale, normalizedOptions)\n }\n\n const breadcrumbsPath = normalizePath(getBreadcrumbsUrl(doc.breadcrumbs))\n const homepagePath = normalizePath(getBreadcrumbsUrl(homepage?.breadcrumbs))\n const pagePath =\n homepagePath && breadcrumbsPath.startsWith(`${homepagePath}/`)\n ? normalizePath(breadcrumbsPath.slice(homepagePath.length))\n : breadcrumbsPath\n\n return withLocalePrefix(pagePath || `/${doc.slug ?? \"\"}`, locale, normalizedOptions)\n }\n\n const rootPageUrl: string | undefined = await getRootPageUrl({\n collectionOptions,\n locale,\n options: normalizedOptions,\n payload,\n rootPages,\n })\n\n if (collectionOptions.category) {\n const categories = await resolveCategories({\n categories: doc[collectionOptions.category.field ?? \"categories\"],\n collection: collectionOptions.category.collection,\n locale,\n payload,\n })\n\n return getDocumentLink(\n {\n relationTo: collection,\n value: {\n ...withoutPopulatedUrl(doc),\n [collectionOptions.category.field ?? \"categories\"]: categories,\n categories,\n },\n },\n {\n baseUrl: rootPageUrl,\n locale,\n options: normalizedOptions,\n },\n )\n }\n\n return getDocumentLink(\n {\n relationTo: collection,\n value: withoutPopulatedUrl(doc),\n },\n {\n baseUrl: rootPageUrl,\n locale,\n options: normalizedOptions,\n },\n )\n}\n\nasync function getRootPageUrl({\n collectionOptions,\n locale,\n options,\n payload,\n rootPages,\n}: {\n collectionOptions: UrlCollectionOptions\n locale: Locale\n options: PayloadPluginUrlsOptions\n payload?: PayloadLike\n rootPages: RootPagesDoc\n}): Promise<string | undefined> {\n if (!collectionOptions.rootPage) {\n return undefined\n }\n\n const rootPageField = collectionOptions.rootPage\n const rootPageFieldOptions = getRootPageFieldOptions(options, rootPageField)\n const relationTo = rootPageFieldOptions?.relationTo ?? \"pages\"\n const rootPage = await getRootPageDoc({\n collection: relationTo,\n field: rootPageField,\n locale,\n payload,\n rootPages,\n })\n\n if (!rootPage) {\n return undefined\n }\n\n if (typeof rootPage.populatedUrl === \"string\" && rootPage.populatedUrl) {\n return withLocalePrefixIfNeeded(rootPage.populatedUrl, locale, options)\n }\n\n if (relationTo !== \"pages\") {\n return withLocalePrefixIfNeeded(\n getDocumentLink(\n {\n relationTo,\n value: rootPage,\n },\n {\n locale,\n options,\n },\n ),\n locale,\n options,\n )\n }\n\n return resolvePopulatedUrl({\n collection: relationTo,\n data: {},\n locale,\n options,\n originalDoc: rootPage,\n payload,\n rootPages,\n })\n}\n\nfunction withLocalePrefixIfNeeded(path: string, locale: Locale, options: PayloadPluginUrlsOptions) {\n const normalizedOptions = normalizeOptions(options)\n if (\n locale === normalizedOptions.locales.defaultLocale ||\n path === `/${locale}` ||\n path.startsWith(`/${locale}/`)\n ) {\n return path\n }\n\n return withLocalePrefix(path, locale, normalizedOptions)\n}\n\nasync function getRootPageDoc({\n collection = \"pages\",\n field,\n locale,\n payload,\n rootPages,\n}: {\n collection?: string\n field: string\n locale: Locale\n payload?: PayloadLike\n rootPages: RootPagesDoc\n}) {\n const page = rootPages[field]\n\n if (!page) {\n return undefined\n }\n\n if (typeof page !== \"string\") {\n return page\n }\n\n const found = await payload?.findByID?.({\n collection,\n id: page,\n depth: 0,\n locale,\n select: {\n id: true,\n slug: true,\n populatedUrl: true,\n breadcrumbs: true,\n },\n })\n return found as UrlDoc | undefined\n}\n\nasync function resolveCategories({\n categories,\n collection,\n locale,\n payload,\n}: {\n categories: unknown\n collection: string\n locale: Locale\n payload?: PayloadLike\n}) {\n if (!Array.isArray(categories)) {\n return []\n }\n\n return Promise.all(\n categories.map((category) => {\n if (typeof category !== \"string\") {\n return Promise.resolve(category)\n }\n\n return (\n payload?.findByID?.({\n collection,\n id: category,\n depth: 2,\n locale,\n }) ?? Promise.resolve(category)\n )\n }),\n )\n}\n","import {\n getCollectionEntries,\n getCollectionsForCategory,\n getHomepageRootPageField,\n getRootPageFieldNames,\n getRootPageFieldOptions,\n normalizeOptions,\n} from \"./options\"\nimport { resolvePopulatedUrl } from \"./resolver\"\nimport { dedupeSources, getRelationId, getStringValue, isDraftDoc } from \"./utils\"\n\nimport type {\n Locale,\n PayloadLike,\n PayloadPluginUrlsOptions,\n RootPagesDoc,\n UrlDoc,\n UrlUpdateSource,\n} from \"./types\"\n\nexport function createUpdateUrlsHandler(options: PayloadPluginUrlsOptions) {\n return async ({\n job,\n req,\n }: {\n job: {\n input?: {\n sources?: UrlUpdateSource[] | null\n }\n }\n req: {\n payload: PayloadLike\n }\n }) => {\n const normalizedOptions = normalizeOptions(options)\n const sources = job.input?.sources ?? []\n\n for (const locale of normalizedOptions.locales?.locales ?? []) {\n const rootPages = await req.payload.findGlobal?.({\n slug: normalizedOptions.rootPages?.slug ?? \"root-pages\",\n depth: 2,\n locale,\n })\n if (!rootPages) {\n continue\n }\n\n for (const source of expandSources(sources, normalizedOptions)) {\n switch (source.type) {\n case \"category\":\n await updateCollectionDocuments({\n collection: source.collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n for (const collection of getCollectionsForCategory(\n normalizedOptions,\n source.collection,\n )) {\n await updateCollectionDocuments({\n collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n }\n break\n case \"collection\":\n case \"page\":\n await updateCollectionDocuments({\n collection: source.collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n break\n case \"rootPages\":\n break\n }\n }\n }\n }\n}\n\nexport function hasUrlPathChanged(doc: unknown, previousDoc: unknown) {\n const docUrl = getStringValue(doc, \"populatedUrl\")\n const previousUrl = getStringValue(previousDoc, \"populatedUrl\")\n\n if (docUrl && previousUrl) {\n return docUrl !== previousUrl\n }\n\n return getStringValue(doc, \"slug\") !== getStringValue(previousDoc, \"slug\")\n}\n\nexport function getRootPageChangeSources(\n current: RootPagesDoc,\n previous: RootPagesDoc | undefined,\n options: PayloadPluginUrlsOptions,\n): UrlUpdateSource[] {\n const normalizedOptions = normalizeOptions(options)\n const sources: UrlUpdateSource[] = []\n const indexPageField = getHomepageRootPageField(normalizedOptions)\n const indexPageCollection =\n getRootPageFieldOptions(normalizedOptions, indexPageField)?.relationTo ?? \"pages\"\n const currentIndexPageId = getRelationId(current[indexPageField])\n const previousIndexPageId = getRelationId(previous?.[indexPageField])\n\n if (currentIndexPageId !== previousIndexPageId) {\n if (currentIndexPageId) {\n sources.push({ type: \"page\", collection: indexPageCollection, id: currentIndexPageId })\n }\n if (previousIndexPageId) {\n sources.push({ type: \"page\", collection: indexPageCollection, id: previousIndexPageId })\n }\n }\n\n for (const [collection, collectionOptions] of getCollectionEntries(normalizedOptions)) {\n if (!collectionOptions.rootPage) {\n continue\n }\n\n const currentRootPageId = getRelationId(current[collectionOptions.rootPage])\n const previousRootPageId = getRelationId(previous?.[collectionOptions.rootPage])\n if (currentRootPageId !== previousRootPageId) {\n sources.push({ type: \"collection\", collection })\n }\n }\n\n return dedupeSources(sources)\n}\n\nexport function getRootPageSnapshot(\n rootPages: UrlDoc | undefined,\n options: PayloadPluginUrlsOptions,\n) {\n const snapshot: RootPagesDoc = {}\n\n for (const fieldName of getRootPageFieldNames(options)) {\n snapshot[fieldName] = rootPages?.[fieldName] as RootPagesDoc[string]\n }\n\n return snapshot\n}\n\nfunction expandSources(sources: UrlUpdateSource[], options: PayloadPluginUrlsOptions) {\n return sources.flatMap((source) => {\n if (source.type !== \"rootPages\") {\n return [source]\n }\n\n return getRootPageChangeSources(source.current, source.previous, options)\n })\n}\n\nasync function updateCollectionDocuments({\n collection,\n locale,\n options,\n payload,\n rootPages,\n}: {\n collection: string\n locale: Locale\n options: PayloadPluginUrlsOptions\n payload: PayloadLike\n rootPages: RootPagesDoc\n}) {\n let page = 1\n\n for (;;) {\n const result = await payload.find?.({\n collection,\n depth: 2,\n draft: false,\n limit: 100,\n locale,\n overrideAccess: true,\n page,\n pagination: true,\n })\n\n if (!result) {\n return\n }\n\n for (const doc of result.docs) {\n const urlDoc = doc as UrlDoc\n if (!urlDoc.id || isDraftDoc(urlDoc)) {\n continue\n }\n\n const populatedUrlValue = await resolvePopulatedUrl({\n collection,\n data: {},\n locale,\n options,\n originalDoc: urlDoc,\n payload,\n rootPages,\n })\n\n if (!populatedUrlValue || urlDoc.populatedUrl === populatedUrlValue) {\n continue\n }\n\n await payload.update?.({\n collection,\n id: urlDoc.id,\n locale,\n overrideAccess: true,\n data: {\n [options.field?.name ?? \"populatedUrl\"]: populatedUrlValue,\n },\n context: {\n disablePopulateUrl: true,\n disableUrlUpdates: true,\n },\n })\n }\n\n if (!result.nextPage) {\n return\n }\n\n page = result.nextPage\n }\n}\n","import { getCollectionOptions, getCollectionsForCategory, normalizeOptions } from \"./options\"\nimport { resolvePopulatedUrl } from \"./resolver\"\nimport { getRootPageSnapshot, hasUrlPathChanged } from \"./update-urls\"\nimport { isDraftDoc } from \"./utils\"\n\nimport type { PayloadPluginUrlsOptions, RootPagesDoc, UrlDoc } from \"./types\"\nimport type {\n CollectionAfterChangeHook,\n CollectionBeforeChangeHook,\n GlobalAfterChangeHook,\n} from \"payload\"\n\nexport function createPopulateUrlHook(\n options: PayloadPluginUrlsOptions,\n): CollectionBeforeChangeHook {\n return async ({ collection, context, data = {}, originalDoc, req }) => {\n const locale = req.locale\n if (\n !locale ||\n locale === \"all\" ||\n context?.disablePopulateUrl ||\n req.context?.disablePopulateUrl\n ) {\n return data\n }\n\n const rootPages = await req.payload.findGlobal?.({\n slug: normalizeOptions(options).rootPages?.slug ?? \"root-pages\",\n depth: 2,\n locale,\n })\n if (!rootPages) {\n return data\n }\n\n const populatedUrlValue = await resolvePopulatedUrl({\n collection: collection?.slug ?? \"\",\n data: data as UrlDoc,\n locale,\n options,\n originalDoc: originalDoc as UrlDoc | undefined,\n payload: req.payload,\n rootPages: rootPages as RootPagesDoc,\n })\n\n if (populatedUrlValue) {\n data[options.field?.name ?? \"populatedUrl\"] = populatedUrlValue\n }\n\n return data\n }\n}\n\nexport function createCollectionUrlUpdateHook(\n options: PayloadPluginUrlsOptions,\n): CollectionAfterChangeHook {\n return async ({ collection, doc, previousDoc, req }) => {\n const urlDoc = doc as UrlDoc | undefined\n const previousUrlDoc = previousDoc as UrlDoc | undefined\n if (\n req.context?.disableUrlUpdates ||\n !urlDoc ||\n isDraftDoc(urlDoc) ||\n !hasUrlPathChanged(urlDoc, previousUrlDoc)\n ) {\n return urlDoc\n }\n\n const collectionOptions = getCollectionOptions(options, collection?.slug ?? \"\")\n if (!collectionOptions) {\n return urlDoc\n }\n\n const collectionSlug = collection?.slug ?? \"\"\n const isCategoryCollection = getCollectionsForCategory(options, collectionSlug).length > 0\n const source = isCategoryCollection\n ? {\n type: \"category\",\n collection: collectionSlug,\n id: urlDoc.id,\n }\n : {\n type:\n collectionOptions.breadcrumbs && !collectionOptions.rootPage ? \"page\" : \"collection\",\n collection: collectionSlug,\n id: urlDoc.id,\n }\n\n await req.payload.jobs?.queue?.({\n workflow: \"update-urls\",\n input: {\n sources: [source],\n },\n })\n\n return urlDoc\n }\n}\n\nexport function createRootPagesUrlUpdateHook(\n options: PayloadPluginUrlsOptions,\n): GlobalAfterChangeHook {\n return async ({ doc, previousDoc, req }) => {\n const rootPagesDoc = doc as RootPagesDoc\n const previousRootPagesDoc = previousDoc as RootPagesDoc | undefined\n if (req.context?.disableUrlUpdates) {\n return rootPagesDoc\n }\n\n await req.payload.jobs?.queue?.({\n workflow: \"update-urls\",\n input: {\n sources: [\n {\n type: \"rootPages\",\n current: getRootPageSnapshot(rootPagesDoc, options),\n previous: getRootPageSnapshot(previousRootPagesDoc, options),\n },\n ],\n },\n })\n\n return rootPagesDoc\n }\n}\n","import { populatedUrlField } from \"./field\"\nimport {\n createCollectionUrlUpdateHook,\n createPopulateUrlHook,\n createRootPagesUrlUpdateHook,\n} from \"./hooks\"\nimport {\n getCollectionOptions,\n getRootPageFieldNames,\n getRootPageFieldOptions,\n normalizeOptions,\n} from \"./options\"\nimport { createUpdateUrlsHandler } from \"./update-urls\"\n\nimport type {\n CollectionConfigLike,\n FieldLike,\n GlobalConfigLike,\n PayloadPlugin,\n PayloadPluginUrlsOptions,\n WorkflowLike,\n} from \"./types\"\n\nexport const payloadPluginUrls = (options?: PayloadPluginUrlsOptions): PayloadPlugin => {\n if (!options) {\n return (config) => config\n }\n\n return (config) => {\n const normalizedOptions = normalizeOptions(options, config)\n const collections = (config.collections ?? []).map((collection) =>\n applyUrlCollectionConfig(collection, normalizedOptions),\n )\n\n return {\n ...config,\n collections,\n globals: [...(config.globals ?? []), createRootPagesGlobal(normalizedOptions)],\n jobs: {\n ...(config.jobs ?? {}),\n workflows: [\n ...(config.jobs?.workflows ?? []),\n {\n slug: \"update-urls\",\n handler: createUpdateUrlsHandler(normalizedOptions),\n } as WorkflowLike,\n ],\n },\n } as ReturnType<PayloadPlugin>\n }\n}\n\nfunction applyUrlCollectionConfig(\n collection: CollectionConfigLike,\n options: PayloadPluginUrlsOptions,\n) {\n const collectionOptions = getCollectionOptions(options, collection.slug)\n if (!collectionOptions) {\n return collection\n }\n\n const fieldName = options.field?.name ?? \"populatedUrl\"\n const fields = collection.fields.some((field) => \"name\" in field && field.name === fieldName)\n ? collection.fields\n : [...collection.fields, populatedUrlField(options)]\n const hooks = collection.hooks ?? {}\n\n return {\n ...collection,\n defaultPopulate: {\n ...(collection.defaultPopulate ?? {}),\n [fieldName]: true,\n },\n fields,\n hooks: {\n ...hooks,\n beforeChange: [...(hooks.beforeChange ?? []), createPopulateUrlHook(options)],\n afterChange: [...(hooks.afterChange ?? []), createCollectionUrlUpdateHook(options)],\n },\n } as CollectionConfigLike\n}\n\nfunction createRootPagesGlobal(options: PayloadPluginUrlsOptions): GlobalConfigLike {\n const rootPagesOptions = normalizeOptions(options).rootPages\n\n return {\n slug: rootPagesOptions?.slug ?? \"root-pages\",\n label: rootPagesOptions?.label ?? \"Root pages\",\n fields: getRootPageFieldNames(options).map((fieldName) =>\n createRootPageField(fieldName, options),\n ),\n hooks: {\n afterChange: [createRootPagesUrlUpdateHook(options)],\n },\n }\n}\n\nfunction createRootPageField(fieldName: string, options: PayloadPluginUrlsOptions): FieldLike {\n const fieldOptions = getRootPageFieldOptions(options, fieldName)\n const overrides = (fieldOptions?.overrides ?? {}) as Record<string, unknown>\n const {\n name: _name,\n type: _type,\n hasMany: _hasMany,\n relationTo: _relationTo,\n ...override\n } = overrides\n\n return {\n name: fieldName,\n type: \"relationship\",\n relationTo: fieldOptions?.relationTo ?? \"pages\",\n hasMany: false,\n admin: {\n width: \"50%\",\n },\n ...override,\n } as FieldLike\n}\n"],"mappings":"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","names":["index_exports","__export","payloadPluginUrls","getBreadcrumbsUrl","getDocumentLink","getDocumentLinkBySlugs","getRootPageChangeSources","hasUrlPathChanged","populatedUrlField","resolvePopulatedUrl","withLocalePrefix","withoutTrailingSlash","__toCommonJS","withoutTrailingSlash","path","getBreadcrumbsUrl","breadcrumbs","mergeDoc","data","originalDoc","withoutUndefinedValues","withoutPopulatedUrl","doc","_populatedUrl","rest","getDocumentId","getRelationId","value","normalizePath","getStringValue","key","record","isDraftDoc","getRecord","dedupeSources","sources","seen","source","sourceKey","entry","populatedUrlField","options","getRecord","normalizeOptions","options","config","locales","getConfigLocales","getCollectionOptions","collection","getCollectionEntries","getCollectionsForCategory","categoryCollection","collectionOptions","getRootPageFieldNames","normalizedOptions","getHomepageRootPageField","fields","field","fieldName","getRootPageFieldOptions","localization","locale","getDocumentLink","reference","baseUrl","locale","options","urlPrefixStrategy","withoutTrailingSlash","normalizedOptions","normalizeOptions","collectionOptions","getCollectionOptions","routeCollection","slugs","getSlugsForCollection","getDocumentLinkBySlugs","segments","withLocalePrefix","path","defaultLocale","doc","strategy","firstRelatedCategoryPath","getBreadcrumbsUrl","categories","first","categoryDoc","resolvePopulatedUrl","collection","data","locale","options","originalDoc","payload","rootPages","normalizedOptions","normalizeOptions","collectionOptions","getCollectionOptions","doc","mergeDoc","homepageField","getHomepageRootPageField","homepage","getRootPageDoc","homepageId","getDocumentId","withLocalePrefix","breadcrumbsPath","normalizePath","getBreadcrumbsUrl","homepagePath","pagePath","rootPageUrl","getRootPageUrl","categories","resolveCategories","getDocumentLink","withoutPopulatedUrl","rootPageField","relationTo","getRootPageFieldOptions","rootPage","withLocalePrefixIfNeeded","path","field","page","category","createUpdateUrlsHandler","options","job","req","normalizedOptions","normalizeOptions","sources","locale","rootPages","source","expandSources","updateCollectionDocuments","collection","getCollectionsForCategory","hasUrlPathChanged","doc","previousDoc","docUrl","getStringValue","previousUrl","getRootPageChangeSources","current","previous","indexPageField","getHomepageRootPageField","indexPageCollection","getRootPageFieldOptions","currentIndexPageId","getRelationId","previousIndexPageId","collectionOptions","getCollectionEntries","currentRootPageId","previousRootPageId","dedupeSources","getRootPageSnapshot","snapshot","fieldName","getRootPageFieldNames","payload","page","result","urlDoc","isDraftDoc","populatedUrlValue","resolvePopulatedUrl","createPopulateUrlHook","options","collection","context","data","originalDoc","req","locale","rootPages","normalizeOptions","populatedUrlValue","resolvePopulatedUrl","createCollectionUrlUpdateHook","doc","previousDoc","urlDoc","previousUrlDoc","isDraftDoc","hasUrlPathChanged","collectionOptions","getCollectionOptions","collectionSlug","source","getCollectionsForCategory","createRootPagesUrlUpdateHook","rootPagesDoc","previousRootPagesDoc","getRootPageSnapshot","payloadPluginUrls","options","config","normalizedOptions","normalizeOptions","collections","collection","applyUrlCollectionConfig","createRootPagesGlobal","createUpdateUrlsHandler","getCollectionOptions","fieldName","fields","field","populatedUrlField","hooks","createPopulateUrlHook","createCollectionUrlUpdateHook","rootPagesOptions","getRootPageFieldNames","createRootPageField","createRootPagesUrlUpdateHook","fieldOptions","getRootPageFieldOptions","overrides","_name","_type","_hasMany","_relationTo","override"]}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,6 @@ export { payloadPluginUrls } from "./plugin";
4
4
  export { resolvePopulatedUrl } from "./resolver";
5
5
  export { getRootPageChangeSources, hasUrlPathChanged } from "./update-urls";
6
6
  export { getBreadcrumbsUrl, withoutTrailingSlash } from "./utils";
7
- export type { Breadcrumb, CollectionConfigLike, FieldLike, GetDocumentLinkArgs, GetDocumentLinkContext, GlobalConfigLike, Hook, HookArgs, Locale, PayloadLike, PayloadPlugin, PayloadPluginConfig, PayloadPluginUrlsOptions, ResolvePopulatedUrlArgs, RootPagesDoc, UrlCollectionOptions, UrlDoc, UrlPrefixStrategy, UrlUpdateSource, WorkflowLike, } from "./types";
7
+ export type { Breadcrumb, CollectionConfigLike, FieldLike, GetDocumentLinkArgs, GetDocumentLinkContext, GlobalConfigLike, Hook, HookArgs, Locale, PayloadLike, PayloadPlugin, PayloadPluginConfig, PayloadPluginUrlsOptions, ResolvePopulatedUrlArgs, RootPageFieldOptions, RootPagesDoc, UrlCollectionOptions, UrlDoc, UrlPrefixStrategy, UrlUpdateSource, WorkflowLike, } from "./types";
8
8
  export { payloadPluginUrls as default } from "./plugin";
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEjE,YAAY,EACV,UAAU,EACV,oBAAoB,EACpB,SAAS,EACT,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,YAAY,EACZ,oBAAoB,EACpB,MAAM,EACN,iBAAiB,EACjB,eAAe,EACf,YAAY,GACb,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEjE,YAAY,EACV,UAAU,EACV,oBAAoB,EACpB,SAAS,EACT,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,EACZ,oBAAoB,EACpB,MAAM,EACN,iBAAiB,EACjB,eAAe,EACf,YAAY,GACb,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,MAAM,UAAU,CAAA"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var p=e=>e.replace(/\/$/,"").replace(/^\/?/,"/");function g(e){return(e?.at(-1)?.url??"").replace(/(^\/)|(\/$)/g,"")}function I(e,o){return{...o||{},...K(e)}}function L(e){let{populatedUrl:o,...t}=e;return t}function z(e){if(!(!e||typeof e!="object"||!("id"in e)))return typeof e.id=="string"?e.id:void 0}function m(e){if(typeof e=="string")return e;if(!(!e||typeof e!="object"||!("id"in e)))return typeof e.id=="string"?e.id:void 0}function U(e){return p(`/${e??""}`.replace(/\/+/g,"/"))}function y(e,o){if(!e||typeof e!="object"||!(o in e))return;let t=e;return typeof t[o]=="string"?t[o]:void 0}function b(e){return e._status==="draft"}function v(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function A(e){let o=new Set;return e.filter(t=>{let r=W(t);return o.has(r)?!1:(o.add(r),!0)})}function W(e){switch(e.type){case"category":case"collection":case"page":return`${e.type}:${e.collection}:${e.id??""}`;case"rootPages":return`rootPages:${JSON.stringify(e.current)}:${JSON.stringify(e.previous)}`}}function K(e){return Object.fromEntries(Object.entries(e).filter(([,o])=>o!==void 0))}function R(e={collections:[]}){return{name:e.field?.name??"populatedUrl",type:"text",label:!1,localized:!0,...e.field?.overrides??{},admin:{hidden:!0,...v(e.field?.overrides?.admin)}}}function u(e){return{...e,field:{name:"populatedUrl",...e.field},locales:{defaultLocale:"en",locales:["en"],...e.locales},rootPages:{slug:"root-pages",indexPageField:"indexPage",...e.rootPages}}}function d(e,o){return e.collections.find(t=>t.slug===o)}function h(e,o){return e.collections.filter(t=>t.category?.collection===o).map(t=>t.slug)}function O(e){let o=u(e),t=[o.rootPages?.indexPageField??"indexPage",...o.collections.flatMap(r=>r.rootPageField?[r.rootPageField]:[])];return[...new Set(t)]}function x(e,{baseUrl:o,locale:t,options:r,urlPrefixStrategy:n}){if(typeof e.value=="string")throw new Error("Reference value is a string");if(e.value.populatedUrl)return p(e.value.populatedUrl);let l=u(r),a=d(l,e.relationTo),i=a?.routeCollection??e.relationTo,s=Q(a,e.value,n??a?.category?.prefixStrategy);return H(s,{baseUrl:o,collection:i,locale:t,options:l})}function H(e,{baseUrl:o,locale:t,options:r}){let n=u(r),a=[...(o||(t===n.locales?.defaultLocale?"":t)).split("/"),...e].filter(Boolean);return p(`/${a.join("/")}`)}function k(e,o,t){let r=u(t).locales?.defaultLocale;return o===r?p(e):p(`/${o}${e}`)}function Q(e,o,t){return e?.category?t==="rootPage"?[o.slug??""]:[X(o),o.slug??""]:e?.breadcrumbs?[g(o.breadcrumbs)||o.slug||""]:[o.slug??""]}function X(e){let o=e.categories;if(!Array.isArray(o)||o.length===0)return"";let r=o[0];if(!r||typeof r!="object"||typeof r=="string")return"";let n=r;return g(n.breadcrumbs)||(n.slug??"").replace(/(^\/)|(\/$)/g,"")}async function f({collection:e,data:o,locale:t,options:r,originalDoc:n,payload:l,rootPages:a}){let i=u(r),s=d(i,e);if(!s)return;let c=I(o,n),C=i.rootPages?.indexPageField??"indexPage";if(s.breadcrumbs&&!s.rootPageField){let P=await $({field:C,locale:t,payload:l,rootPages:a}),E=z(P);if(c.id&&E===c.id)return k("/",t,i);let w=U(g(c.breadcrumbs)),D=U(g(P?.breadcrumbs)),J=D&&w.startsWith(`${D}/`)?U(w.slice(D.length)):w;return k(J||`/${c.slug??""}`,t,i)}let j=await Y({collectionOptions:s,locale:t,options:i,payload:l,rootPages:a});if(s.category){let P=await Z({categories:c[s.category.field??"categories"],collection:s.category.collection,locale:t,payload:l});return x({relationTo:e,value:{...L(c),[s.category.field??"categories"]:P,categories:P}},{baseUrl:j,locale:t,options:i})}return x({relationTo:e,value:L(c)},{baseUrl:j,locale:t,options:i})}async function Y({collectionOptions:e,locale:o,options:t,payload:r,rootPages:n}){if(!e.rootPageField)return;let l=await $({field:e.rootPageField,locale:o,payload:r,rootPages:n});if(l)return f({collection:"pages",data:{},locale:o,options:t,originalDoc:l,payload:r,rootPages:n})}async function $({field:e,locale:o,payload:t,rootPages:r}){let n=r[e];if(n)return typeof n!="string"?n:t?.findByID?.({collection:"pages",id:n,depth:0,locale:o,select:{id:!0,slug:!0,populatedUrl:!0,breadcrumbs:!0}})}async function Z({categories:e,collection:o,locale:t,payload:r}){return Array.isArray(e)?Promise.all(e.map(n=>typeof n!="string"?Promise.resolve(n):r?.findByID?.({collection:o,id:n,depth:2,locale:t})??Promise.resolve(n))):[]}function B(e){return async({job:o,req:t})=>{let r=u(e),n=o.input?.sources??[];for(let l of r.locales?.locales??[]){let a=await t.payload.findGlobal?.({slug:r.rootPages?.slug??"root-pages",depth:2,locale:l});if(a)for(let i of q(n,r))switch(i.type){case"category":await S({collection:i.collection,locale:l,options:r,payload:t.payload,rootPages:a});for(let s of h(r,i.collection))await S({collection:s,locale:l,options:r,payload:t.payload,rootPages:a});break;case"collection":case"page":await S({collection:i.collection,locale:l,options:r,payload:t.payload,rootPages:a});break;case"rootPages":break}}}}function F(e,o){let t=y(e,"populatedUrl"),r=y(o,"populatedUrl");return t&&r?t!==r:y(e,"slug")!==y(o,"slug")}function G(e,o,t){let r=u(t),n=[],l=r.rootPages?.indexPageField??"indexPage",a=m(e[l]),i=m(o?.[l]);a!==i&&(a&&n.push({type:"page",collection:"pages",id:a}),i&&n.push({type:"page",collection:"pages",id:i}));for(let s of r.collections){if(!s.rootPageField)continue;let c=m(e[s.rootPageField]),C=m(o?.[s.rootPageField]);c!==C&&n.push({type:"collection",collection:s.slug})}return A(n)}function T(e,o){let t={};for(let r of O(o))t[r]=e?.[r];return t}function q(e,o){return e.flatMap(t=>t.type!=="rootPages"?[t]:G(t.current,t.previous,o))}async function S({collection:e,locale:o,options:t,payload:r,rootPages:n}){let l=1;for(;;){let a=await r.find?.({collection:e,depth:2,draft:!1,limit:100,locale:o,overrideAccess:!0,page:l,pagination:!0});if(!a)return;for(let i of a.docs){if(!i.id||b(i))continue;let s=await f({collection:e,data:{},locale:o,options:t,originalDoc:i,payload:r,rootPages:n});!s||i.populatedUrl===s||await r.update?.({collection:e,id:i.id,locale:o,overrideAccess:!0,data:{[t.field?.name??"populatedUrl"]:s},context:{disablePopulateUrl:!0,disableUrlUpdates:!0}})}if(!a.nextPage)return;l=a.nextPage}}function N(e){return async({collection:o,context:t,data:r={},originalDoc:n,req:l})=>{let a=l.locale;if(!a||a==="all"||t?.disablePopulateUrl||l.context?.disablePopulateUrl)return r;let i=await l.payload.findGlobal?.({slug:u(e).rootPages?.slug??"root-pages",depth:2,locale:a});if(!i)return r;let s=await f({collection:o?.slug??"",data:r,locale:a,options:e,originalDoc:n,payload:l.payload,rootPages:i});return s&&(r[e.field?.name??"populatedUrl"]=s),r}}function V(e){return async({collection:o,doc:t,previousDoc:r,req:n})=>{if(n.context?.disableUrlUpdates||!t||b(t)||!F(t,r))return t;let l=d(e,o?.slug??"");if(!l)return t;let a=o?.slug??"",s=h(e,a).length>0?{type:"category",collection:a,id:t.id}:{type:l.breadcrumbs&&!l.rootPageField?"page":"collection",collection:a,id:t.id};return await n.payload.jobs?.queue?.({workflow:"update-urls",input:{sources:[s]}}),t}}function M(e){return async({doc:o,previousDoc:t,req:r})=>(r.context?.disableUrlUpdates||await r.payload.jobs?.queue?.({workflow:"update-urls",input:{sources:[{type:"rootPages",current:T(o,e),previous:T(t,e)}]}}),o)}var _=e=>e?o=>{let t=u(e),r=(o.collections??[]).map(n=>ee(n,t));return{...o,collections:r,globals:[...o.globals??[],oe(t)],jobs:{...o.jobs??{},workflows:[...o.jobs?.workflows??[],{slug:"update-urls",handler:B(t)}]}}}:o=>o;function ee(e,o){if(!d(o,e.slug))return e;let r=o.field?.name??"populatedUrl",n=e.fields.some(a=>a.name===r)?e.fields:[...e.fields,R(o)],l=e.hooks??{};return{...e,defaultPopulate:{...e.defaultPopulate??{},[r]:!0},fields:n,hooks:{...l,beforeChange:[...l.beforeChange??[],N(o)],afterChange:[...l.afterChange??[],V(o)]}}}function oe(e){let o=u(e).rootPages;return{slug:o?.slug??"root-pages",label:o?.label??"Root pages",fields:O(e).map(t=>te(t,e)),hooks:{afterChange:[M(e)]}}}function te(e,o){let t=u(o).rootPages,{name:r,...n}=t?.fieldOverrides?.[e]??{};return{name:e,type:"relationship",relationTo:"pages",hasMany:!1,label:t?.fieldLabels?.[e],admin:{width:"50%"},...n}}export{_ as default,g as getBreadcrumbsUrl,x as getDocumentLink,H as getDocumentLinkBySlugs,G as getRootPageChangeSources,F as hasUrlPathChanged,_ as payloadPluginUrls,R as populatedUrlField,f as resolvePopulatedUrl,k as withLocalePrefix,p as withoutTrailingSlash};
1
+ var f=o=>o.replace(/\/$/,"").replace(/^\/?/,"/");function P(o){return(o?.at(-1)?.url??"").replace(/(^\/)|(\/$)/g,"")}function A(o,e){return{...e||{},...Z(o)}}function S(o){let{populatedUrl:e,...t}=o;return t}function I(o){if(!(!o||typeof o!="object"||!("id"in o)))return typeof o.id=="string"?o.id:void 0}function U(o){if(typeof o=="string")return o;if(!(!o||typeof o!="object"||!("id"in o)))return typeof o.id=="string"?o.id:void 0}function C(o){return f(`/${o??""}`.replace(/\/+/g,"/"))}function O(o,e){if(!o||typeof o!="object"||!(e in o))return;let t=o;return typeof t[e]=="string"?t[e]:void 0}function D(o){return o._status==="draft"}function $(o){return o&&typeof o=="object"&&!Array.isArray(o)?o:{}}function B(o){let e=new Set;return o.filter(t=>{let n=Y(t);return e.has(n)?!1:(e.add(n),!0)})}function Y(o){switch(o.type){case"category":case"collection":case"page":return`${o.type}:${o.collection}:${o.id??""}`;case"rootPages":return`rootPages:${JSON.stringify(o.current)}:${JSON.stringify(o.previous)}`}}function Z(o){return Object.fromEntries(Object.entries(o).filter(([,e])=>e!==void 0))}function T(o={collections:{}}){return{name:o.field?.name??"populatedUrl",type:"text",label:!1,localized:!0,...o.field?.overrides??{},admin:{hidden:!0,...$(o.field?.overrides?.admin)}}}function c(o,e){let l={...q(e)??{defaultLocale:"en",locales:["en"]},...o.locales};return{...o,field:{name:"populatedUrl",...o.field},locales:{defaultLocale:l.defaultLocale??l.locales[0]??"en",locales:l.locales.length?l.locales:[l.defaultLocale??"en"]},rootPages:{slug:"root-pages",...o.rootPages,fields:o.rootPages?.fields??{indexPage:{isHomepage:!0,relationTo:"pages"}}}}}function d(o,e){return o.collections[e]}function j(o){return Object.entries(o.collections)}function L(o,e){return j(o).filter(([,t])=>t.category?.collection===e).map(([t])=>t)}function x(o){let e=c(o);return Object.keys(e.rootPages.fields)}function w(o){let e=c(o).rootPages.fields;return(Object.entries(e).find(([,n])=>n.isHomepage)??Object.entries(e).find(([n])=>n==="indexPage"))?.[0]??Object.keys(e)[0]??"indexPage"}function y(o,e){return c(o).rootPages.fields[e]}function q(o){let e=o?.localization||void 0,t=e?.locales?.map(n=>typeof n=="string"?n:n.code).filter(n=>!!n);if(t?.length)return{defaultLocale:e?.defaultLocale??t[0]??"en",locales:t}}function k(o,{baseUrl:e,locale:t,options:n,urlPrefixStrategy:l}){if(typeof o.value=="string")throw new Error("Reference value is a string");if(o.value.populatedUrl)return f(o.value.populatedUrl);let r=c(n),i=d(r,o.relationTo),s=i?.routeCollection??o.relationTo,a=oo(i,o.value,l??i?.prefixStrategy);return G(a,{baseUrl:e,collection:s,locale:t,options:r})}function G(o,{baseUrl:e,locale:t,options:n}){let l=c(n),i=[...(e||(t===l.locales?.defaultLocale?"":t)).split("/"),...o].filter(Boolean);return f(`/${i.join("/")}`)}function b(o,e,t){let n=c(t).locales?.defaultLocale;return e===n?f(o):f(`/${e}${o}`)}function oo(o,e,t){return o?.category?t==="rootPage"?[e.slug??""]:[eo(e),e.slug??""]:o?.breadcrumbs?[P(e.breadcrumbs)||e.slug||""]:[e.slug??""]}function eo(o){let e=o.categories;if(!Array.isArray(e)||e.length===0)return"";let n=e[0];if(!n||typeof n!="object"||typeof n=="string")return"";let l=n;return P(l.breadcrumbs)||(l.slug??"").replace(/(^\/)|(\/$)/g,"")}async function m({collection:o,data:e,locale:t,options:n,originalDoc:l,payload:r,rootPages:i}){let s=c(n),a=d(s,o);if(!a)return;let u=A(e,l),g=w(s);if(a.breadcrumbs&&!a.rootPage){let p=await E({field:g,locale:t,payload:r,rootPages:i}),Q=I(p);if(u.id&&Q===u.id)return b("/",t,s);let R=C(P(u.breadcrumbs)),F=C(P(p?.breadcrumbs)),X=F&&R.startsWith(`${F}/`)?C(R.slice(F.length)):R;return b(X||`/${u.slug??""}`,t,s)}let h=await to({collectionOptions:a,locale:t,options:s,payload:r,rootPages:i});if(a.category){let p=await no({categories:u[a.category.field??"categories"],collection:a.category.collection,locale:t,payload:r});return k({relationTo:o,value:{...S(u),[a.category.field??"categories"]:p,categories:p}},{baseUrl:h,locale:t,options:s})}return k({relationTo:o,value:S(u)},{baseUrl:h,locale:t,options:s})}async function to({collectionOptions:o,locale:e,options:t,payload:n,rootPages:l}){if(!o.rootPage)return;let r=o.rootPage,s=y(t,r)?.relationTo??"pages",a=await E({collection:s,field:r,locale:e,payload:n,rootPages:l});if(a)return typeof a.populatedUrl=="string"&&a.populatedUrl?N(a.populatedUrl,e,t):s!=="pages"?N(k({relationTo:s,value:a},{locale:e,options:t}),e,t):m({collection:s,data:{},locale:e,options:t,originalDoc:a,payload:n,rootPages:l})}function N(o,e,t){let n=c(t);return e===n.locales.defaultLocale||o===`/${e}`||o.startsWith(`/${e}/`)?o:b(o,e,n)}async function E({collection:o="pages",field:e,locale:t,payload:n,rootPages:l}){let r=l[e];return r?typeof r!="string"?r:await n?.findByID?.({collection:o,id:r,depth:0,locale:t,select:{id:!0,slug:!0,populatedUrl:!0,breadcrumbs:!0}}):void 0}async function no({categories:o,collection:e,locale:t,payload:n}){return Array.isArray(o)?Promise.all(o.map(l=>typeof l!="string"?Promise.resolve(l):n?.findByID?.({collection:e,id:l,depth:2,locale:t})??Promise.resolve(l))):[]}function _(o){return async({job:e,req:t})=>{let n=c(o),l=e.input?.sources??[];for(let r of n.locales?.locales??[]){let i=await t.payload.findGlobal?.({slug:n.rootPages?.slug??"root-pages",depth:2,locale:r});if(i)for(let s of ro(l,n))switch(s.type){case"category":await z({collection:s.collection,locale:r,options:n,payload:t.payload,rootPages:i});for(let a of L(n,s.collection))await z({collection:a,locale:r,options:n,payload:t.payload,rootPages:i});break;case"collection":case"page":await z({collection:s.collection,locale:r,options:n,payload:t.payload,rootPages:i});break;case"rootPages":break}}}}function H(o,e){let t=O(o,"populatedUrl"),n=O(e,"populatedUrl");return t&&n?t!==n:O(o,"slug")!==O(e,"slug")}function V(o,e,t){let n=c(t),l=[],r=w(n),i=y(n,r)?.relationTo??"pages",s=U(o[r]),a=U(e?.[r]);s!==a&&(s&&l.push({type:"page",collection:i,id:s}),a&&l.push({type:"page",collection:i,id:a}));for(let[u,g]of j(n)){if(!g.rootPage)continue;let h=U(o[g.rootPage]),p=U(e?.[g.rootPage]);h!==p&&l.push({type:"collection",collection:u})}return B(l)}function v(o,e){let t={};for(let n of x(e))t[n]=o?.[n];return t}function ro(o,e){return o.flatMap(t=>t.type!=="rootPages"?[t]:V(t.current,t.previous,e))}async function z({collection:o,locale:e,options:t,payload:n,rootPages:l}){let r=1;for(;;){let i=await n.find?.({collection:o,depth:2,draft:!1,limit:100,locale:e,overrideAccess:!0,page:r,pagination:!0});if(!i)return;for(let s of i.docs){let a=s;if(!a.id||D(a))continue;let u=await m({collection:o,data:{},locale:e,options:t,originalDoc:a,payload:n,rootPages:l});!u||a.populatedUrl===u||await n.update?.({collection:o,id:a.id,locale:e,overrideAccess:!0,data:{[t.field?.name??"populatedUrl"]:u},context:{disablePopulateUrl:!0,disableUrlUpdates:!0}})}if(!i.nextPage)return;r=i.nextPage}}function W(o){return async({collection:e,context:t,data:n={},originalDoc:l,req:r})=>{let i=r.locale;if(!i||i==="all"||t?.disablePopulateUrl||r.context?.disablePopulateUrl)return n;let s=await r.payload.findGlobal?.({slug:c(o).rootPages?.slug??"root-pages",depth:2,locale:i});if(!s)return n;let a=await m({collection:e?.slug??"",data:n,locale:i,options:o,originalDoc:l,payload:r.payload,rootPages:s});return a&&(n[o.field?.name??"populatedUrl"]=a),n}}function M(o){return async({collection:e,doc:t,previousDoc:n,req:l})=>{let r=t,i=n;if(l.context?.disableUrlUpdates||!r||D(r)||!H(r,i))return r;let s=d(o,e?.slug??"");if(!s)return r;let a=e?.slug??"",g=L(o,a).length>0?{type:"category",collection:a,id:r.id}:{type:s.breadcrumbs&&!s.rootPage?"page":"collection",collection:a,id:r.id};return await l.payload.jobs?.queue?.({workflow:"update-urls",input:{sources:[g]}}),r}}function J(o){return async({doc:e,previousDoc:t,req:n})=>{let l=e,r=t;return n.context?.disableUrlUpdates||await n.payload.jobs?.queue?.({workflow:"update-urls",input:{sources:[{type:"rootPages",current:v(l,o),previous:v(r,o)}]}}),l}}var K=o=>o?e=>{let t=c(o,e),n=(e.collections??[]).map(l=>lo(l,t));return{...e,collections:n,globals:[...e.globals??[],ao(t)],jobs:{...e.jobs??{},workflows:[...e.jobs?.workflows??[],{slug:"update-urls",handler:_(t)}]}}}:e=>e;function lo(o,e){if(!d(e,o.slug))return o;let n=e.field?.name??"populatedUrl",l=o.fields.some(i=>"name"in i&&i.name===n)?o.fields:[...o.fields,T(e)],r=o.hooks??{};return{...o,defaultPopulate:{...o.defaultPopulate??{},[n]:!0},fields:l,hooks:{...r,beforeChange:[...r.beforeChange??[],W(e)],afterChange:[...r.afterChange??[],M(e)]}}}function ao(o){let e=c(o).rootPages;return{slug:e?.slug??"root-pages",label:e?.label??"Root pages",fields:x(o).map(t=>io(t,o)),hooks:{afterChange:[J(o)]}}}function io(o,e){let t=y(e,o),n=t?.overrides??{},{name:l,type:r,hasMany:i,relationTo:s,...a}=n;return{name:o,type:"relationship",relationTo:t?.relationTo??"pages",hasMany:!1,admin:{width:"50%"},...a}}export{K as default,P as getBreadcrumbsUrl,k as getDocumentLink,G as getDocumentLinkBySlugs,V as getRootPageChangeSources,H as hasUrlPathChanged,K as payloadPluginUrls,T as populatedUrlField,m as resolvePopulatedUrl,b as withLocalePrefix,f as withoutTrailingSlash};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/field.ts","../src/options.ts","../src/link.ts","../src/resolver.ts","../src/update-urls.ts","../src/hooks.ts","../src/plugin.ts"],"sourcesContent":["import type { Breadcrumb, UrlDoc, UrlUpdateSource } from \"./types\"\n\nconst withoutTrailingSlash = (path: string) => path.replace(/\\/$/, \"\").replace(/^\\/?/, \"/\")\n\nfunction getBreadcrumbsUrl(breadcrumbs: Breadcrumb[] | null | undefined) {\n const lastItem = breadcrumbs?.at(-1)\n const url = lastItem?.url ?? \"\"\n return url.replace(/(^\\/)|(\\/$)/g, \"\")\n}\n\nfunction mergeDoc<T extends object>(data: Partial<T>, originalDoc?: Partial<T>) {\n return {\n ...(originalDoc || {}),\n ...withoutUndefinedValues(data),\n } as T\n}\n\nfunction withoutPopulatedUrl<T extends object>(doc: T) {\n const { populatedUrl: _populatedUrl, ...rest } = doc as T & { populatedUrl?: unknown }\n return rest\n}\n\nfunction getDocumentId(doc: unknown) {\n if (!doc || typeof doc !== \"object\" || !(\"id\" in doc)) {\n return undefined\n }\n\n return typeof doc.id === \"string\" ? doc.id : undefined\n}\n\nfunction getRelationId(value: unknown) {\n if (typeof value === \"string\") {\n return value\n }\n\n if (!value || typeof value !== \"object\" || !(\"id\" in value)) {\n return undefined\n }\n\n return typeof value.id === \"string\" ? value.id : undefined\n}\n\nfunction normalizePath(path: string | undefined) {\n return withoutTrailingSlash(`/${path ?? \"\"}`.replace(/\\/+/g, \"/\"))\n}\n\nfunction getStringValue(value: unknown, key: \"populatedUrl\" | \"slug\") {\n if (!value || typeof value !== \"object\" || !(key in value)) {\n return undefined\n }\n\n const record = value as Record<\"populatedUrl\" | \"slug\", unknown>\n return typeof record[key] === \"string\" ? record[key] : undefined\n}\n\nfunction isDraftDoc(doc: UrlDoc) {\n return doc._status === \"draft\"\n}\n\nfunction getRecord(value: unknown) {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {}\n}\n\nfunction dedupeSources<T extends UrlUpdateSource>(sources: T[]) {\n const seen = new Set<string>()\n\n return sources.filter((source) => {\n const key = sourceKey(source)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n\nfunction sourceKey(source: UrlUpdateSource) {\n switch (source.type) {\n case \"category\":\n case \"collection\":\n case \"page\":\n return `${source.type}:${source.collection}:${source.id ?? \"\"}`\n case \"rootPages\":\n return `rootPages:${JSON.stringify(source.current)}:${JSON.stringify(source.previous)}`\n }\n}\n\nfunction withoutUndefinedValues<T extends object>(value: Partial<T>) {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as Partial<T>\n}\n\nexport {\n getBreadcrumbsUrl,\n getRecord,\n dedupeSources,\n isDraftDoc,\n getStringValue,\n normalizePath,\n getRelationId,\n getDocumentId,\n withoutPopulatedUrl,\n mergeDoc,\n withoutTrailingSlash,\n}\n","import { getRecord } from \"./utils\"\n\nimport type { PayloadPluginUrlsOptions } from \"./types\"\n\nexport function populatedUrlField(options: PayloadPluginUrlsOptions = { collections: [] }) {\n const fieldName = options.field?.name ?? \"populatedUrl\"\n\n return {\n name: fieldName,\n type: \"text\",\n label: false,\n localized: true,\n ...(options.field?.overrides ?? {}),\n admin: {\n hidden: true,\n ...getRecord(options.field?.overrides?.admin),\n },\n }\n}\n","import type { PayloadPluginUrlsOptions } from \"./types\"\n\nexport function normalizeOptions(options: PayloadPluginUrlsOptions): PayloadPluginUrlsOptions {\n return {\n ...options,\n field: {\n name: \"populatedUrl\",\n ...options.field,\n },\n locales: {\n defaultLocale: \"en\",\n locales: [\"en\"],\n ...options.locales,\n },\n rootPages: {\n slug: \"root-pages\",\n indexPageField: \"indexPage\",\n ...options.rootPages,\n },\n }\n}\n\nexport function getCollectionOptions(options: PayloadPluginUrlsOptions, collection: string) {\n return options.collections.find((collectionOptions) => collectionOptions.slug === collection)\n}\n\nexport function getCollectionsForCategory(\n options: PayloadPluginUrlsOptions,\n categoryCollection: string,\n) {\n return options.collections\n .filter((collectionOptions) => collectionOptions.category?.collection === categoryCollection)\n .map((collectionOptions) => collectionOptions.slug)\n}\n\nexport function getRootPageFieldNames(options: PayloadPluginUrlsOptions) {\n const normalizedOptions = normalizeOptions(options)\n const fieldNames = [\n normalizedOptions.rootPages?.indexPageField ?? \"indexPage\",\n ...normalizedOptions.collections.flatMap((collection) =>\n collection.rootPageField ? [collection.rootPageField] : [],\n ),\n ]\n\n return [...new Set(fieldNames)]\n}\n","import { getCollectionOptions, normalizeOptions } from \"./options\"\nimport { getBreadcrumbsUrl, withoutTrailingSlash } from \"./utils\"\n\nimport type {\n GetDocumentLinkArgs,\n GetDocumentLinkContext,\n Locale,\n PayloadPluginUrlsOptions,\n UrlCollectionOptions,\n UrlDoc,\n UrlPrefixStrategy,\n} from \"./types\"\n\nexport function getDocumentLink(\n reference: GetDocumentLinkArgs,\n { baseUrl, locale, options, urlPrefixStrategy }: GetDocumentLinkContext,\n) {\n if (typeof reference.value === \"string\") {\n throw new Error(\"Reference value is a string\")\n }\n\n if (reference.value.populatedUrl) {\n return withoutTrailingSlash(reference.value.populatedUrl)\n }\n\n const normalizedOptions = normalizeOptions(options)\n const collectionOptions = getCollectionOptions(normalizedOptions, reference.relationTo)\n const routeCollection = collectionOptions?.routeCollection ?? reference.relationTo\n const slugs = getSlugsForCollection(\n collectionOptions,\n reference.value,\n urlPrefixStrategy ?? collectionOptions?.category?.prefixStrategy,\n )\n\n return getDocumentLinkBySlugs(slugs, {\n baseUrl,\n collection: routeCollection,\n locale,\n options: normalizedOptions,\n })\n}\n\nexport function getDocumentLinkBySlugs(\n slugs: string[],\n {\n baseUrl,\n locale,\n options,\n }: {\n baseUrl?: string\n collection: string\n locale: Locale\n options: PayloadPluginUrlsOptions\n },\n) {\n const normalizedOptions = normalizeOptions(options)\n const prefix = baseUrl || (locale === normalizedOptions.locales?.defaultLocale ? \"\" : locale)\n const segments = [...prefix.split(\"/\"), ...slugs].filter(Boolean)\n return withoutTrailingSlash(`/${segments.join(\"/\")}`)\n}\n\nexport function withLocalePrefix(path: string, locale: Locale, options: PayloadPluginUrlsOptions) {\n const defaultLocale = normalizeOptions(options).locales?.defaultLocale\n if (locale === defaultLocale) {\n return withoutTrailingSlash(path)\n }\n return withoutTrailingSlash(`/${locale}${path}`)\n}\n\nfunction getSlugsForCollection(\n collectionOptions: UrlCollectionOptions | undefined,\n doc: UrlDoc,\n strategy?: UrlPrefixStrategy,\n) {\n if (collectionOptions?.category) {\n return strategy === \"rootPage\"\n ? [doc.slug ?? \"\"]\n : [firstRelatedCategoryPath(doc), doc.slug ?? \"\"]\n }\n\n if (collectionOptions?.breadcrumbs) {\n return [getBreadcrumbsUrl(doc.breadcrumbs) || doc.slug || \"\"]\n }\n\n return [doc.slug ?? \"\"]\n}\n\nfunction firstRelatedCategoryPath(doc: UrlDoc) {\n const categories = doc.categories\n if (!Array.isArray(categories) || categories.length === 0) {\n return \"\"\n }\n\n const categoryItems = categories as unknown[]\n const first = categoryItems[0]\n if (!first || typeof first !== \"object\" || typeof first === \"string\") {\n return \"\"\n }\n\n const categoryDoc = first as UrlDoc\n return (\n getBreadcrumbsUrl(categoryDoc.breadcrumbs) ||\n (categoryDoc.slug ?? \"\").replace(/(^\\/)|(\\/$)/g, \"\")\n )\n}\n","import { getDocumentLink, withLocalePrefix } from \"./link\"\nimport { getCollectionOptions, normalizeOptions } from \"./options\"\nimport {\n getBreadcrumbsUrl,\n getDocumentId,\n mergeDoc,\n normalizePath,\n withoutPopulatedUrl,\n} from \"./utils\"\n\nimport type {\n Locale,\n PayloadLike,\n PayloadPluginUrlsOptions,\n ResolvePopulatedUrlArgs,\n RootPagesDoc,\n UrlCollectionOptions,\n} from \"./types\"\n\nexport async function resolvePopulatedUrl({\n collection,\n data,\n locale,\n options,\n originalDoc,\n payload,\n rootPages,\n}: ResolvePopulatedUrlArgs): Promise<string | undefined> {\n const normalizedOptions = normalizeOptions(options)\n const collectionOptions = getCollectionOptions(normalizedOptions, collection)\n if (!collectionOptions) {\n return undefined\n }\n\n const doc = mergeDoc(data, originalDoc)\n const indexPageField = normalizedOptions.rootPages?.indexPageField ?? \"indexPage\"\n\n if (collectionOptions.breadcrumbs && !collectionOptions.rootPageField) {\n const homepage = await getRootPageDoc({\n field: indexPageField,\n locale,\n payload,\n rootPages,\n })\n const homepageId = getDocumentId(homepage)\n\n if (doc.id && homepageId === doc.id) {\n return withLocalePrefix(\"/\", locale, normalizedOptions)\n }\n\n const breadcrumbsPath = normalizePath(getBreadcrumbsUrl(doc.breadcrumbs))\n const homepagePath = normalizePath(getBreadcrumbsUrl(homepage?.breadcrumbs))\n const pagePath =\n homepagePath && breadcrumbsPath.startsWith(`${homepagePath}/`)\n ? normalizePath(breadcrumbsPath.slice(homepagePath.length))\n : breadcrumbsPath\n\n return withLocalePrefix(pagePath || `/${doc.slug ?? \"\"}`, locale, normalizedOptions)\n }\n\n const rootPageUrl: string | undefined = await getRootPageUrl({\n collectionOptions,\n locale,\n options: normalizedOptions,\n payload,\n rootPages,\n })\n\n if (collectionOptions.category) {\n const categories = await resolveCategories({\n categories: doc[collectionOptions.category.field ?? \"categories\"],\n collection: collectionOptions.category.collection,\n locale,\n payload,\n })\n\n return getDocumentLink(\n {\n relationTo: collection,\n value: {\n ...withoutPopulatedUrl(doc),\n [collectionOptions.category.field ?? \"categories\"]: categories,\n categories,\n },\n },\n {\n baseUrl: rootPageUrl,\n locale,\n options: normalizedOptions,\n },\n )\n }\n\n return getDocumentLink(\n {\n relationTo: collection,\n value: withoutPopulatedUrl(doc),\n },\n {\n baseUrl: rootPageUrl,\n locale,\n options: normalizedOptions,\n },\n )\n}\n\nasync function getRootPageUrl({\n collectionOptions,\n locale,\n options,\n payload,\n rootPages,\n}: {\n collectionOptions: UrlCollectionOptions\n locale: Locale\n options: PayloadPluginUrlsOptions\n payload?: PayloadLike\n rootPages: RootPagesDoc\n}): Promise<string | undefined> {\n if (!collectionOptions.rootPageField) {\n return undefined\n }\n\n const rootPage = await getRootPageDoc({\n field: collectionOptions.rootPageField,\n locale,\n payload,\n rootPages,\n })\n\n if (!rootPage) {\n return undefined\n }\n\n return resolvePopulatedUrl({\n collection: \"pages\",\n data: {},\n locale,\n options,\n originalDoc: rootPage,\n payload,\n rootPages,\n })\n}\n\nasync function getRootPageDoc({\n field,\n locale,\n payload,\n rootPages,\n}: {\n field: string\n locale: Locale\n payload?: PayloadLike\n rootPages: RootPagesDoc\n}) {\n const page = rootPages[field]\n\n if (!page) {\n return undefined\n }\n\n if (typeof page !== \"string\") {\n return page\n }\n\n return payload?.findByID?.({\n collection: \"pages\",\n id: page,\n depth: 0,\n locale,\n select: {\n id: true,\n slug: true,\n populatedUrl: true,\n breadcrumbs: true,\n },\n })\n}\n\nasync function resolveCategories({\n categories,\n collection,\n locale,\n payload,\n}: {\n categories: unknown\n collection: string\n locale: Locale\n payload?: PayloadLike\n}) {\n if (!Array.isArray(categories)) {\n return []\n }\n\n return Promise.all(\n categories.map((category) => {\n if (typeof category !== \"string\") {\n return Promise.resolve(category)\n }\n\n return (\n payload?.findByID?.({\n collection,\n id: category,\n depth: 2,\n locale,\n }) ?? Promise.resolve(category)\n )\n }),\n )\n}\n","import { getCollectionsForCategory, getRootPageFieldNames, normalizeOptions } from \"./options\"\nimport { resolvePopulatedUrl } from \"./resolver\"\nimport { dedupeSources, getRelationId, getStringValue, isDraftDoc } from \"./utils\"\n\nimport type {\n Locale,\n PayloadLike,\n PayloadPluginUrlsOptions,\n RootPagesDoc,\n UrlDoc,\n UrlUpdateSource,\n} from \"./types\"\n\nexport function createUpdateUrlsHandler(options: PayloadPluginUrlsOptions) {\n return async ({\n job,\n req,\n }: {\n job: {\n input?: {\n sources?: UrlUpdateSource[] | null\n }\n }\n req: {\n payload: PayloadLike\n }\n }) => {\n const normalizedOptions = normalizeOptions(options)\n const sources = job.input?.sources ?? []\n\n for (const locale of normalizedOptions.locales?.locales ?? []) {\n const rootPages = await req.payload.findGlobal?.({\n slug: normalizedOptions.rootPages?.slug ?? \"root-pages\",\n depth: 2,\n locale,\n })\n if (!rootPages) {\n continue\n }\n\n for (const source of expandSources(sources, normalizedOptions)) {\n switch (source.type) {\n case \"category\":\n await updateCollectionDocuments({\n collection: source.collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n for (const collection of getCollectionsForCategory(\n normalizedOptions,\n source.collection,\n )) {\n await updateCollectionDocuments({\n collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n }\n break\n case \"collection\":\n case \"page\":\n await updateCollectionDocuments({\n collection: source.collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n break\n case \"rootPages\":\n break\n }\n }\n }\n }\n}\n\nexport function hasUrlPathChanged(doc: unknown, previousDoc: unknown) {\n const docUrl = getStringValue(doc, \"populatedUrl\")\n const previousUrl = getStringValue(previousDoc, \"populatedUrl\")\n\n if (docUrl && previousUrl) {\n return docUrl !== previousUrl\n }\n\n return getStringValue(doc, \"slug\") !== getStringValue(previousDoc, \"slug\")\n}\n\nexport function getRootPageChangeSources(\n current: RootPagesDoc,\n previous: RootPagesDoc | undefined,\n options: PayloadPluginUrlsOptions,\n): UrlUpdateSource[] {\n const normalizedOptions = normalizeOptions(options)\n const sources: UrlUpdateSource[] = []\n const indexPageField = normalizedOptions.rootPages?.indexPageField ?? \"indexPage\"\n const currentIndexPageId = getRelationId(current[indexPageField])\n const previousIndexPageId = getRelationId(previous?.[indexPageField])\n\n if (currentIndexPageId !== previousIndexPageId) {\n if (currentIndexPageId) {\n sources.push({ type: \"page\", collection: \"pages\", id: currentIndexPageId })\n }\n if (previousIndexPageId) {\n sources.push({ type: \"page\", collection: \"pages\", id: previousIndexPageId })\n }\n }\n\n for (const collection of normalizedOptions.collections) {\n if (!collection.rootPageField) {\n continue\n }\n\n const currentRootPageId = getRelationId(current[collection.rootPageField])\n const previousRootPageId = getRelationId(previous?.[collection.rootPageField])\n if (currentRootPageId !== previousRootPageId) {\n sources.push({ type: \"collection\", collection: collection.slug })\n }\n }\n\n return dedupeSources(sources)\n}\n\nexport function getRootPageSnapshot(\n rootPages: UrlDoc | undefined,\n options: PayloadPluginUrlsOptions,\n) {\n const snapshot: RootPagesDoc = {}\n\n for (const fieldName of getRootPageFieldNames(options)) {\n snapshot[fieldName] = rootPages?.[fieldName] as RootPagesDoc[string]\n }\n\n return snapshot\n}\n\nfunction expandSources(sources: UrlUpdateSource[], options: PayloadPluginUrlsOptions) {\n return sources.flatMap((source) => {\n if (source.type !== \"rootPages\") {\n return [source]\n }\n\n return getRootPageChangeSources(source.current, source.previous, options)\n })\n}\n\nasync function updateCollectionDocuments({\n collection,\n locale,\n options,\n payload,\n rootPages,\n}: {\n collection: string\n locale: Locale\n options: PayloadPluginUrlsOptions\n payload: PayloadLike\n rootPages: RootPagesDoc\n}) {\n let page = 1\n\n for (;;) {\n const result = await payload.find?.({\n collection,\n depth: 2,\n draft: false,\n limit: 100,\n locale,\n overrideAccess: true,\n page,\n pagination: true,\n })\n\n if (!result) {\n return\n }\n\n for (const doc of result.docs) {\n if (!doc.id || isDraftDoc(doc)) {\n continue\n }\n\n const populatedUrlValue = await resolvePopulatedUrl({\n collection,\n data: {},\n locale,\n options,\n originalDoc: doc,\n payload,\n rootPages,\n })\n\n if (!populatedUrlValue || doc.populatedUrl === populatedUrlValue) {\n continue\n }\n\n await payload.update?.({\n collection,\n id: doc.id,\n locale,\n overrideAccess: true,\n data: {\n [options.field?.name ?? \"populatedUrl\"]: populatedUrlValue,\n },\n context: {\n disablePopulateUrl: true,\n disableUrlUpdates: true,\n },\n })\n }\n\n if (!result.nextPage) {\n return\n }\n\n page = result.nextPage\n }\n}\n","import { getCollectionOptions, getCollectionsForCategory, normalizeOptions } from \"./options\"\nimport { resolvePopulatedUrl } from \"./resolver\"\nimport { getRootPageSnapshot, hasUrlPathChanged } from \"./update-urls\"\nimport { isDraftDoc } from \"./utils\"\n\nimport type { Hook, PayloadPluginUrlsOptions } from \"./types\"\n\nexport function createPopulateUrlHook(options: PayloadPluginUrlsOptions): Hook {\n return async ({ collection, context, data = {}, originalDoc, req }) => {\n const locale = req.locale\n if (\n !locale ||\n locale === \"all\" ||\n context?.disablePopulateUrl ||\n req.context?.disablePopulateUrl\n ) {\n return data\n }\n\n const rootPages = await req.payload.findGlobal?.({\n slug: normalizeOptions(options).rootPages?.slug ?? \"root-pages\",\n depth: 2,\n locale,\n })\n if (!rootPages) {\n return data\n }\n\n const populatedUrlValue = await resolvePopulatedUrl({\n collection: collection?.slug ?? \"\",\n data,\n locale,\n options,\n originalDoc,\n payload: req.payload,\n rootPages,\n })\n\n if (populatedUrlValue) {\n data[options.field?.name ?? \"populatedUrl\"] = populatedUrlValue\n }\n\n return data\n }\n}\n\nexport function createCollectionUrlUpdateHook(options: PayloadPluginUrlsOptions): Hook {\n return async ({ collection, doc, previousDoc, req }) => {\n if (\n req.context?.disableUrlUpdates ||\n !doc ||\n isDraftDoc(doc) ||\n !hasUrlPathChanged(doc, previousDoc)\n ) {\n return doc\n }\n\n const collectionOptions = getCollectionOptions(options, collection?.slug ?? \"\")\n if (!collectionOptions) {\n return doc\n }\n\n const collectionSlug = collection?.slug ?? \"\"\n const isCategoryCollection = getCollectionsForCategory(options, collectionSlug).length > 0\n const source = isCategoryCollection\n ? {\n type: \"category\",\n collection: collectionSlug,\n id: doc.id,\n }\n : {\n type:\n collectionOptions.breadcrumbs && !collectionOptions.rootPageField\n ? \"page\"\n : \"collection\",\n collection: collectionSlug,\n id: doc.id,\n }\n\n await req.payload.jobs?.queue?.({\n workflow: \"update-urls\",\n input: {\n sources: [source],\n },\n })\n\n return doc\n }\n}\n\nexport function createRootPagesUrlUpdateHook(options: PayloadPluginUrlsOptions): Hook {\n return async ({ doc, previousDoc, req }) => {\n if (req.context?.disableUrlUpdates) {\n return doc\n }\n\n await req.payload.jobs?.queue?.({\n workflow: \"update-urls\",\n input: {\n sources: [\n {\n type: \"rootPages\",\n current: getRootPageSnapshot(doc, options),\n previous: getRootPageSnapshot(previousDoc, options),\n },\n ],\n },\n })\n\n return doc\n }\n}\n","import { populatedUrlField } from \"./field\"\nimport {\n createCollectionUrlUpdateHook,\n createPopulateUrlHook,\n createRootPagesUrlUpdateHook,\n} from \"./hooks\"\nimport { getCollectionOptions, getRootPageFieldNames, normalizeOptions } from \"./options\"\nimport { createUpdateUrlsHandler } from \"./update-urls\"\n\nimport type {\n CollectionConfigLike,\n GlobalConfigLike,\n PayloadPlugin,\n PayloadPluginUrlsOptions,\n} from \"./types\"\n\nexport const payloadPluginUrls = (options?: PayloadPluginUrlsOptions): PayloadPlugin => {\n if (!options) {\n return (config) => config\n }\n\n return (config) => {\n const normalizedOptions = normalizeOptions(options)\n const collections = (config.collections ?? []).map((collection) =>\n applyUrlCollectionConfig(collection, normalizedOptions),\n )\n\n return {\n ...config,\n collections,\n globals: [...(config.globals ?? []), createRootPagesGlobal(normalizedOptions)],\n jobs: {\n ...(config.jobs ?? {}),\n workflows: [\n ...(config.jobs?.workflows ?? []),\n {\n slug: \"update-urls\",\n handler: createUpdateUrlsHandler(normalizedOptions),\n },\n ],\n },\n }\n }\n}\n\nfunction applyUrlCollectionConfig(\n collection: CollectionConfigLike,\n options: PayloadPluginUrlsOptions,\n) {\n const collectionOptions = getCollectionOptions(options, collection.slug)\n if (!collectionOptions) {\n return collection\n }\n\n const fieldName = options.field?.name ?? \"populatedUrl\"\n const fields = collection.fields.some((field) => field.name === fieldName)\n ? collection.fields\n : [...collection.fields, populatedUrlField(options)]\n const hooks = collection.hooks ?? {}\n\n return {\n ...collection,\n defaultPopulate: {\n ...(collection.defaultPopulate ?? {}),\n [fieldName]: true,\n },\n fields,\n hooks: {\n ...hooks,\n beforeChange: [...(hooks.beforeChange ?? []), createPopulateUrlHook(options)],\n afterChange: [...(hooks.afterChange ?? []), createCollectionUrlUpdateHook(options)],\n },\n }\n}\n\nfunction createRootPagesGlobal(options: PayloadPluginUrlsOptions): GlobalConfigLike {\n const rootPagesOptions = normalizeOptions(options).rootPages\n\n return {\n slug: rootPagesOptions?.slug ?? \"root-pages\",\n label: rootPagesOptions?.label ?? \"Root pages\",\n fields: getRootPageFieldNames(options).map((fieldName) =>\n createRootPageField(fieldName, options),\n ),\n hooks: {\n afterChange: [createRootPagesUrlUpdateHook(options)],\n },\n }\n}\n\nfunction createRootPageField(fieldName: string, options: PayloadPluginUrlsOptions) {\n const rootPagesOptions = normalizeOptions(options).rootPages\n const { name: _name, ...override } = rootPagesOptions?.fieldOverrides?.[fieldName] ?? {}\n\n return {\n name: fieldName,\n type: \"relationship\",\n relationTo: \"pages\",\n hasMany: false,\n label: rootPagesOptions?.fieldLabels?.[fieldName],\n admin: {\n width: \"50%\",\n },\n ...override,\n }\n}\n"],"mappings":"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","names":["withoutTrailingSlash","path","getBreadcrumbsUrl","breadcrumbs","mergeDoc","data","originalDoc","withoutUndefinedValues","withoutPopulatedUrl","doc","_populatedUrl","rest","getDocumentId","getRelationId","value","normalizePath","getStringValue","key","record","isDraftDoc","getRecord","dedupeSources","sources","seen","source","sourceKey","entry","populatedUrlField","options","getRecord","normalizeOptions","options","getCollectionOptions","collection","collectionOptions","getCollectionsForCategory","categoryCollection","getRootPageFieldNames","normalizedOptions","fieldNames","getDocumentLink","reference","baseUrl","locale","options","urlPrefixStrategy","withoutTrailingSlash","normalizedOptions","normalizeOptions","collectionOptions","getCollectionOptions","routeCollection","slugs","getSlugsForCollection","getDocumentLinkBySlugs","segments","withLocalePrefix","path","defaultLocale","doc","strategy","firstRelatedCategoryPath","getBreadcrumbsUrl","categories","first","categoryDoc","resolvePopulatedUrl","collection","data","locale","options","originalDoc","payload","rootPages","normalizedOptions","normalizeOptions","collectionOptions","getCollectionOptions","doc","mergeDoc","indexPageField","homepage","getRootPageDoc","homepageId","getDocumentId","withLocalePrefix","breadcrumbsPath","normalizePath","getBreadcrumbsUrl","homepagePath","pagePath","rootPageUrl","getRootPageUrl","categories","resolveCategories","getDocumentLink","withoutPopulatedUrl","rootPage","field","page","category","createUpdateUrlsHandler","options","job","req","normalizedOptions","normalizeOptions","sources","locale","rootPages","source","expandSources","updateCollectionDocuments","collection","getCollectionsForCategory","hasUrlPathChanged","doc","previousDoc","docUrl","getStringValue","previousUrl","getRootPageChangeSources","current","previous","indexPageField","currentIndexPageId","getRelationId","previousIndexPageId","currentRootPageId","previousRootPageId","dedupeSources","getRootPageSnapshot","snapshot","fieldName","getRootPageFieldNames","payload","page","result","isDraftDoc","populatedUrlValue","resolvePopulatedUrl","createPopulateUrlHook","options","collection","context","data","originalDoc","req","locale","rootPages","normalizeOptions","populatedUrlValue","resolvePopulatedUrl","createCollectionUrlUpdateHook","doc","previousDoc","isDraftDoc","hasUrlPathChanged","collectionOptions","getCollectionOptions","collectionSlug","source","getCollectionsForCategory","createRootPagesUrlUpdateHook","getRootPageSnapshot","payloadPluginUrls","options","config","normalizedOptions","normalizeOptions","collections","collection","applyUrlCollectionConfig","createRootPagesGlobal","createUpdateUrlsHandler","getCollectionOptions","fieldName","fields","field","populatedUrlField","hooks","createPopulateUrlHook","createCollectionUrlUpdateHook","rootPagesOptions","getRootPageFieldNames","createRootPageField","createRootPagesUrlUpdateHook","_name","override"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/field.ts","../src/options.ts","../src/link.ts","../src/resolver.ts","../src/update-urls.ts","../src/hooks.ts","../src/plugin.ts"],"sourcesContent":["import type { Breadcrumb, UrlDoc, UrlUpdateSource } from \"./types\"\n\nconst withoutTrailingSlash = (path: string) => path.replace(/\\/$/, \"\").replace(/^\\/?/, \"/\")\n\nfunction getBreadcrumbsUrl(breadcrumbs: Breadcrumb[] | null | undefined) {\n const lastItem = breadcrumbs?.at(-1)\n const url = lastItem?.url ?? \"\"\n return url.replace(/(^\\/)|(\\/$)/g, \"\")\n}\n\nfunction mergeDoc<T extends object>(data: Partial<T>, originalDoc?: Partial<T>) {\n return {\n ...(originalDoc || {}),\n ...withoutUndefinedValues(data),\n } as T\n}\n\nfunction withoutPopulatedUrl<T extends object>(doc: T) {\n const { populatedUrl: _populatedUrl, ...rest } = doc as T & { populatedUrl?: unknown }\n return rest\n}\n\nfunction getDocumentId(doc: unknown) {\n if (!doc || typeof doc !== \"object\" || !(\"id\" in doc)) {\n return undefined\n }\n\n return typeof doc.id === \"string\" ? doc.id : undefined\n}\n\nfunction getRelationId(value: unknown) {\n if (typeof value === \"string\") {\n return value\n }\n\n if (!value || typeof value !== \"object\" || !(\"id\" in value)) {\n return undefined\n }\n\n return typeof value.id === \"string\" ? value.id : undefined\n}\n\nfunction normalizePath(path: string | undefined) {\n return withoutTrailingSlash(`/${path ?? \"\"}`.replace(/\\/+/g, \"/\"))\n}\n\nfunction getStringValue(value: unknown, key: \"populatedUrl\" | \"slug\") {\n if (!value || typeof value !== \"object\" || !(key in value)) {\n return undefined\n }\n\n const record = value as Record<\"populatedUrl\" | \"slug\", unknown>\n return typeof record[key] === \"string\" ? record[key] : undefined\n}\n\nfunction isDraftDoc(doc: UrlDoc) {\n return doc._status === \"draft\"\n}\n\nfunction getRecord(value: unknown) {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {}\n}\n\nfunction dedupeSources<T extends UrlUpdateSource>(sources: T[]) {\n const seen = new Set<string>()\n\n return sources.filter((source) => {\n const key = sourceKey(source)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n\nfunction sourceKey(source: UrlUpdateSource) {\n switch (source.type) {\n case \"category\":\n case \"collection\":\n case \"page\":\n return `${source.type}:${source.collection}:${source.id ?? \"\"}`\n case \"rootPages\":\n return `rootPages:${JSON.stringify(source.current)}:${JSON.stringify(source.previous)}`\n }\n}\n\nfunction withoutUndefinedValues<T extends object>(value: Partial<T>) {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as Partial<T>\n}\n\nexport {\n getBreadcrumbsUrl,\n getRecord,\n dedupeSources,\n isDraftDoc,\n getStringValue,\n normalizePath,\n getRelationId,\n getDocumentId,\n withoutPopulatedUrl,\n mergeDoc,\n withoutTrailingSlash,\n}\n","import { getRecord } from \"./utils\"\n\nimport type { PayloadPluginUrlsOptions } from \"./types\"\nimport type { Field } from \"payload\"\n\nexport function populatedUrlField(options: PayloadPluginUrlsOptions = { collections: {} }): Field {\n const fieldName = options.field?.name ?? \"populatedUrl\"\n\n return {\n name: fieldName,\n type: \"text\",\n label: false,\n localized: true,\n ...(options.field?.overrides ?? {}),\n admin: {\n hidden: true,\n ...getRecord(options.field?.overrides?.admin),\n },\n } as Field\n}\n","import type {\n PayloadPluginConfig,\n PayloadPluginUrlsOptions,\n RootPageFieldOptions,\n UrlCollectionOptions,\n} from \"./types\"\n\nexport type NormalizedPayloadPluginUrlsOptions = PayloadPluginUrlsOptions & {\n collections: Record<string, UrlCollectionOptions>\n locales: {\n defaultLocale: string\n locales: string[]\n }\n rootPages: {\n slug: string\n label?: unknown\n fields: Record<string, RootPageFieldOptions>\n }\n}\n\nexport function normalizeOptions(\n options: PayloadPluginUrlsOptions,\n config?: PayloadPluginConfig,\n): NormalizedPayloadPluginUrlsOptions {\n const configLocales = getConfigLocales(config)\n const fallbackLocales = configLocales ?? { defaultLocale: \"en\", locales: [\"en\"] }\n const locales = {\n ...fallbackLocales,\n ...options.locales,\n }\n\n return {\n ...options,\n field: {\n name: \"populatedUrl\",\n ...options.field,\n },\n locales: {\n defaultLocale: locales.defaultLocale ?? locales.locales[0] ?? \"en\",\n locales: locales.locales.length ? locales.locales : [locales.defaultLocale ?? \"en\"],\n },\n rootPages: {\n slug: \"root-pages\",\n ...options.rootPages,\n fields: options.rootPages?.fields ?? {\n indexPage: {\n isHomepage: true,\n relationTo: \"pages\",\n },\n },\n },\n }\n}\n\nexport function getCollectionOptions(options: PayloadPluginUrlsOptions, collection: string) {\n return options.collections[collection]\n}\n\nexport function getCollectionEntries(options: PayloadPluginUrlsOptions) {\n return Object.entries(options.collections)\n}\n\nexport function getCollectionsForCategory(\n options: PayloadPluginUrlsOptions,\n categoryCollection: string,\n) {\n return getCollectionEntries(options)\n .filter(\n ([, collectionOptions]) => collectionOptions.category?.collection === categoryCollection,\n )\n .map(([collection]) => collection)\n}\n\nexport function getRootPageFieldNames(options: PayloadPluginUrlsOptions) {\n const normalizedOptions = normalizeOptions(options)\n return Object.keys(normalizedOptions.rootPages.fields)\n}\n\nexport function getHomepageRootPageField(options: PayloadPluginUrlsOptions) {\n const fields = normalizeOptions(options).rootPages.fields\n const homepageEntry =\n Object.entries(fields).find(([, field]) => field.isHomepage) ??\n Object.entries(fields).find(([fieldName]) => fieldName === \"indexPage\")\n\n return homepageEntry?.[0] ?? Object.keys(fields)[0] ?? \"indexPage\"\n}\n\nexport function getRootPageFieldOptions(options: PayloadPluginUrlsOptions, fieldName: string) {\n return normalizeOptions(options).rootPages.fields[fieldName]\n}\n\nfunction getConfigLocales(config: PayloadPluginConfig | undefined) {\n const localization = config?.localization || undefined\n const locales = localization?.locales\n ?.map((locale) => (typeof locale === \"string\" ? locale : locale.code))\n .filter((locale): locale is string => Boolean(locale))\n\n if (!locales?.length) {\n return undefined\n }\n\n return {\n defaultLocale: localization?.defaultLocale ?? locales[0] ?? \"en\",\n locales,\n }\n}\n","import { getCollectionOptions, normalizeOptions } from \"./options\"\nimport { getBreadcrumbsUrl, withoutTrailingSlash } from \"./utils\"\n\nimport type {\n GetDocumentLinkArgs,\n GetDocumentLinkContext,\n Locale,\n PayloadPluginUrlsOptions,\n UrlCollectionOptions,\n UrlDoc,\n UrlPrefixStrategy,\n} from \"./types\"\n\nexport function getDocumentLink(\n reference: GetDocumentLinkArgs,\n { baseUrl, locale, options, urlPrefixStrategy }: GetDocumentLinkContext,\n) {\n if (typeof reference.value === \"string\") {\n throw new Error(\"Reference value is a string\")\n }\n\n if (reference.value.populatedUrl) {\n return withoutTrailingSlash(reference.value.populatedUrl)\n }\n\n const normalizedOptions = normalizeOptions(options)\n const collectionOptions = getCollectionOptions(normalizedOptions, reference.relationTo)\n const routeCollection = collectionOptions?.routeCollection ?? reference.relationTo\n const slugs = getSlugsForCollection(\n collectionOptions,\n reference.value,\n urlPrefixStrategy ?? collectionOptions?.prefixStrategy,\n )\n\n return getDocumentLinkBySlugs(slugs, {\n baseUrl,\n collection: routeCollection,\n locale,\n options: normalizedOptions,\n })\n}\n\nexport function getDocumentLinkBySlugs(\n slugs: string[],\n {\n baseUrl,\n locale,\n options,\n }: {\n baseUrl?: string\n collection: string\n locale: Locale\n options: PayloadPluginUrlsOptions\n },\n) {\n const normalizedOptions = normalizeOptions(options)\n const prefix = baseUrl || (locale === normalizedOptions.locales?.defaultLocale ? \"\" : locale)\n const segments = [...prefix.split(\"/\"), ...slugs].filter(Boolean)\n return withoutTrailingSlash(`/${segments.join(\"/\")}`)\n}\n\nexport function withLocalePrefix(path: string, locale: Locale, options: PayloadPluginUrlsOptions) {\n const defaultLocale = normalizeOptions(options).locales?.defaultLocale\n if (locale === defaultLocale) {\n return withoutTrailingSlash(path)\n }\n return withoutTrailingSlash(`/${locale}${path}`)\n}\n\nfunction getSlugsForCollection(\n collectionOptions: UrlCollectionOptions | undefined,\n doc: UrlDoc,\n strategy?: UrlPrefixStrategy,\n) {\n if (collectionOptions?.category) {\n return strategy === \"rootPage\"\n ? [doc.slug ?? \"\"]\n : [firstRelatedCategoryPath(doc), doc.slug ?? \"\"]\n }\n\n if (collectionOptions?.breadcrumbs) {\n return [getBreadcrumbsUrl(doc.breadcrumbs) || doc.slug || \"\"]\n }\n\n return [doc.slug ?? \"\"]\n}\n\nfunction firstRelatedCategoryPath(doc: UrlDoc) {\n const categories = doc.categories\n if (!Array.isArray(categories) || categories.length === 0) {\n return \"\"\n }\n\n const categoryItems = categories as unknown[]\n const first = categoryItems[0]\n if (!first || typeof first !== \"object\" || typeof first === \"string\") {\n return \"\"\n }\n\n const categoryDoc = first as UrlDoc\n return (\n getBreadcrumbsUrl(categoryDoc.breadcrumbs) ||\n (categoryDoc.slug ?? \"\").replace(/(^\\/)|(\\/$)/g, \"\")\n )\n}\n","import { getDocumentLink, withLocalePrefix } from \"./link\"\nimport {\n getCollectionOptions,\n getHomepageRootPageField,\n getRootPageFieldOptions,\n normalizeOptions,\n} from \"./options\"\nimport {\n getBreadcrumbsUrl,\n getDocumentId,\n mergeDoc,\n normalizePath,\n withoutPopulatedUrl,\n} from \"./utils\"\n\nimport type {\n Locale,\n PayloadLike,\n PayloadPluginUrlsOptions,\n ResolvePopulatedUrlArgs,\n RootPagesDoc,\n UrlCollectionOptions,\n UrlDoc,\n} from \"./types\"\n\nexport async function resolvePopulatedUrl({\n collection,\n data,\n locale,\n options,\n originalDoc,\n payload,\n rootPages,\n}: ResolvePopulatedUrlArgs): Promise<string | undefined> {\n const normalizedOptions = normalizeOptions(options)\n const collectionOptions = getCollectionOptions(normalizedOptions, collection)\n if (!collectionOptions) {\n return undefined\n }\n\n const doc = mergeDoc(data, originalDoc)\n const homepageField = getHomepageRootPageField(normalizedOptions)\n\n if (collectionOptions.breadcrumbs && !collectionOptions.rootPage) {\n const homepage = await getRootPageDoc({\n field: homepageField,\n locale,\n payload,\n rootPages,\n })\n const homepageId = getDocumentId(homepage)\n\n if (doc.id && homepageId === doc.id) {\n return withLocalePrefix(\"/\", locale, normalizedOptions)\n }\n\n const breadcrumbsPath = normalizePath(getBreadcrumbsUrl(doc.breadcrumbs))\n const homepagePath = normalizePath(getBreadcrumbsUrl(homepage?.breadcrumbs))\n const pagePath =\n homepagePath && breadcrumbsPath.startsWith(`${homepagePath}/`)\n ? normalizePath(breadcrumbsPath.slice(homepagePath.length))\n : breadcrumbsPath\n\n return withLocalePrefix(pagePath || `/${doc.slug ?? \"\"}`, locale, normalizedOptions)\n }\n\n const rootPageUrl: string | undefined = await getRootPageUrl({\n collectionOptions,\n locale,\n options: normalizedOptions,\n payload,\n rootPages,\n })\n\n if (collectionOptions.category) {\n const categories = await resolveCategories({\n categories: doc[collectionOptions.category.field ?? \"categories\"],\n collection: collectionOptions.category.collection,\n locale,\n payload,\n })\n\n return getDocumentLink(\n {\n relationTo: collection,\n value: {\n ...withoutPopulatedUrl(doc),\n [collectionOptions.category.field ?? \"categories\"]: categories,\n categories,\n },\n },\n {\n baseUrl: rootPageUrl,\n locale,\n options: normalizedOptions,\n },\n )\n }\n\n return getDocumentLink(\n {\n relationTo: collection,\n value: withoutPopulatedUrl(doc),\n },\n {\n baseUrl: rootPageUrl,\n locale,\n options: normalizedOptions,\n },\n )\n}\n\nasync function getRootPageUrl({\n collectionOptions,\n locale,\n options,\n payload,\n rootPages,\n}: {\n collectionOptions: UrlCollectionOptions\n locale: Locale\n options: PayloadPluginUrlsOptions\n payload?: PayloadLike\n rootPages: RootPagesDoc\n}): Promise<string | undefined> {\n if (!collectionOptions.rootPage) {\n return undefined\n }\n\n const rootPageField = collectionOptions.rootPage\n const rootPageFieldOptions = getRootPageFieldOptions(options, rootPageField)\n const relationTo = rootPageFieldOptions?.relationTo ?? \"pages\"\n const rootPage = await getRootPageDoc({\n collection: relationTo,\n field: rootPageField,\n locale,\n payload,\n rootPages,\n })\n\n if (!rootPage) {\n return undefined\n }\n\n if (typeof rootPage.populatedUrl === \"string\" && rootPage.populatedUrl) {\n return withLocalePrefixIfNeeded(rootPage.populatedUrl, locale, options)\n }\n\n if (relationTo !== \"pages\") {\n return withLocalePrefixIfNeeded(\n getDocumentLink(\n {\n relationTo,\n value: rootPage,\n },\n {\n locale,\n options,\n },\n ),\n locale,\n options,\n )\n }\n\n return resolvePopulatedUrl({\n collection: relationTo,\n data: {},\n locale,\n options,\n originalDoc: rootPage,\n payload,\n rootPages,\n })\n}\n\nfunction withLocalePrefixIfNeeded(path: string, locale: Locale, options: PayloadPluginUrlsOptions) {\n const normalizedOptions = normalizeOptions(options)\n if (\n locale === normalizedOptions.locales.defaultLocale ||\n path === `/${locale}` ||\n path.startsWith(`/${locale}/`)\n ) {\n return path\n }\n\n return withLocalePrefix(path, locale, normalizedOptions)\n}\n\nasync function getRootPageDoc({\n collection = \"pages\",\n field,\n locale,\n payload,\n rootPages,\n}: {\n collection?: string\n field: string\n locale: Locale\n payload?: PayloadLike\n rootPages: RootPagesDoc\n}) {\n const page = rootPages[field]\n\n if (!page) {\n return undefined\n }\n\n if (typeof page !== \"string\") {\n return page\n }\n\n const found = await payload?.findByID?.({\n collection,\n id: page,\n depth: 0,\n locale,\n select: {\n id: true,\n slug: true,\n populatedUrl: true,\n breadcrumbs: true,\n },\n })\n return found as UrlDoc | undefined\n}\n\nasync function resolveCategories({\n categories,\n collection,\n locale,\n payload,\n}: {\n categories: unknown\n collection: string\n locale: Locale\n payload?: PayloadLike\n}) {\n if (!Array.isArray(categories)) {\n return []\n }\n\n return Promise.all(\n categories.map((category) => {\n if (typeof category !== \"string\") {\n return Promise.resolve(category)\n }\n\n return (\n payload?.findByID?.({\n collection,\n id: category,\n depth: 2,\n locale,\n }) ?? Promise.resolve(category)\n )\n }),\n )\n}\n","import {\n getCollectionEntries,\n getCollectionsForCategory,\n getHomepageRootPageField,\n getRootPageFieldNames,\n getRootPageFieldOptions,\n normalizeOptions,\n} from \"./options\"\nimport { resolvePopulatedUrl } from \"./resolver\"\nimport { dedupeSources, getRelationId, getStringValue, isDraftDoc } from \"./utils\"\n\nimport type {\n Locale,\n PayloadLike,\n PayloadPluginUrlsOptions,\n RootPagesDoc,\n UrlDoc,\n UrlUpdateSource,\n} from \"./types\"\n\nexport function createUpdateUrlsHandler(options: PayloadPluginUrlsOptions) {\n return async ({\n job,\n req,\n }: {\n job: {\n input?: {\n sources?: UrlUpdateSource[] | null\n }\n }\n req: {\n payload: PayloadLike\n }\n }) => {\n const normalizedOptions = normalizeOptions(options)\n const sources = job.input?.sources ?? []\n\n for (const locale of normalizedOptions.locales?.locales ?? []) {\n const rootPages = await req.payload.findGlobal?.({\n slug: normalizedOptions.rootPages?.slug ?? \"root-pages\",\n depth: 2,\n locale,\n })\n if (!rootPages) {\n continue\n }\n\n for (const source of expandSources(sources, normalizedOptions)) {\n switch (source.type) {\n case \"category\":\n await updateCollectionDocuments({\n collection: source.collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n for (const collection of getCollectionsForCategory(\n normalizedOptions,\n source.collection,\n )) {\n await updateCollectionDocuments({\n collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n }\n break\n case \"collection\":\n case \"page\":\n await updateCollectionDocuments({\n collection: source.collection,\n locale,\n options: normalizedOptions,\n payload: req.payload,\n rootPages,\n })\n break\n case \"rootPages\":\n break\n }\n }\n }\n }\n}\n\nexport function hasUrlPathChanged(doc: unknown, previousDoc: unknown) {\n const docUrl = getStringValue(doc, \"populatedUrl\")\n const previousUrl = getStringValue(previousDoc, \"populatedUrl\")\n\n if (docUrl && previousUrl) {\n return docUrl !== previousUrl\n }\n\n return getStringValue(doc, \"slug\") !== getStringValue(previousDoc, \"slug\")\n}\n\nexport function getRootPageChangeSources(\n current: RootPagesDoc,\n previous: RootPagesDoc | undefined,\n options: PayloadPluginUrlsOptions,\n): UrlUpdateSource[] {\n const normalizedOptions = normalizeOptions(options)\n const sources: UrlUpdateSource[] = []\n const indexPageField = getHomepageRootPageField(normalizedOptions)\n const indexPageCollection =\n getRootPageFieldOptions(normalizedOptions, indexPageField)?.relationTo ?? \"pages\"\n const currentIndexPageId = getRelationId(current[indexPageField])\n const previousIndexPageId = getRelationId(previous?.[indexPageField])\n\n if (currentIndexPageId !== previousIndexPageId) {\n if (currentIndexPageId) {\n sources.push({ type: \"page\", collection: indexPageCollection, id: currentIndexPageId })\n }\n if (previousIndexPageId) {\n sources.push({ type: \"page\", collection: indexPageCollection, id: previousIndexPageId })\n }\n }\n\n for (const [collection, collectionOptions] of getCollectionEntries(normalizedOptions)) {\n if (!collectionOptions.rootPage) {\n continue\n }\n\n const currentRootPageId = getRelationId(current[collectionOptions.rootPage])\n const previousRootPageId = getRelationId(previous?.[collectionOptions.rootPage])\n if (currentRootPageId !== previousRootPageId) {\n sources.push({ type: \"collection\", collection })\n }\n }\n\n return dedupeSources(sources)\n}\n\nexport function getRootPageSnapshot(\n rootPages: UrlDoc | undefined,\n options: PayloadPluginUrlsOptions,\n) {\n const snapshot: RootPagesDoc = {}\n\n for (const fieldName of getRootPageFieldNames(options)) {\n snapshot[fieldName] = rootPages?.[fieldName] as RootPagesDoc[string]\n }\n\n return snapshot\n}\n\nfunction expandSources(sources: UrlUpdateSource[], options: PayloadPluginUrlsOptions) {\n return sources.flatMap((source) => {\n if (source.type !== \"rootPages\") {\n return [source]\n }\n\n return getRootPageChangeSources(source.current, source.previous, options)\n })\n}\n\nasync function updateCollectionDocuments({\n collection,\n locale,\n options,\n payload,\n rootPages,\n}: {\n collection: string\n locale: Locale\n options: PayloadPluginUrlsOptions\n payload: PayloadLike\n rootPages: RootPagesDoc\n}) {\n let page = 1\n\n for (;;) {\n const result = await payload.find?.({\n collection,\n depth: 2,\n draft: false,\n limit: 100,\n locale,\n overrideAccess: true,\n page,\n pagination: true,\n })\n\n if (!result) {\n return\n }\n\n for (const doc of result.docs) {\n const urlDoc = doc as UrlDoc\n if (!urlDoc.id || isDraftDoc(urlDoc)) {\n continue\n }\n\n const populatedUrlValue = await resolvePopulatedUrl({\n collection,\n data: {},\n locale,\n options,\n originalDoc: urlDoc,\n payload,\n rootPages,\n })\n\n if (!populatedUrlValue || urlDoc.populatedUrl === populatedUrlValue) {\n continue\n }\n\n await payload.update?.({\n collection,\n id: urlDoc.id,\n locale,\n overrideAccess: true,\n data: {\n [options.field?.name ?? \"populatedUrl\"]: populatedUrlValue,\n },\n context: {\n disablePopulateUrl: true,\n disableUrlUpdates: true,\n },\n })\n }\n\n if (!result.nextPage) {\n return\n }\n\n page = result.nextPage\n }\n}\n","import { getCollectionOptions, getCollectionsForCategory, normalizeOptions } from \"./options\"\nimport { resolvePopulatedUrl } from \"./resolver\"\nimport { getRootPageSnapshot, hasUrlPathChanged } from \"./update-urls\"\nimport { isDraftDoc } from \"./utils\"\n\nimport type { PayloadPluginUrlsOptions, RootPagesDoc, UrlDoc } from \"./types\"\nimport type {\n CollectionAfterChangeHook,\n CollectionBeforeChangeHook,\n GlobalAfterChangeHook,\n} from \"payload\"\n\nexport function createPopulateUrlHook(\n options: PayloadPluginUrlsOptions,\n): CollectionBeforeChangeHook {\n return async ({ collection, context, data = {}, originalDoc, req }) => {\n const locale = req.locale\n if (\n !locale ||\n locale === \"all\" ||\n context?.disablePopulateUrl ||\n req.context?.disablePopulateUrl\n ) {\n return data\n }\n\n const rootPages = await req.payload.findGlobal?.({\n slug: normalizeOptions(options).rootPages?.slug ?? \"root-pages\",\n depth: 2,\n locale,\n })\n if (!rootPages) {\n return data\n }\n\n const populatedUrlValue = await resolvePopulatedUrl({\n collection: collection?.slug ?? \"\",\n data: data as UrlDoc,\n locale,\n options,\n originalDoc: originalDoc as UrlDoc | undefined,\n payload: req.payload,\n rootPages: rootPages as RootPagesDoc,\n })\n\n if (populatedUrlValue) {\n data[options.field?.name ?? \"populatedUrl\"] = populatedUrlValue\n }\n\n return data\n }\n}\n\nexport function createCollectionUrlUpdateHook(\n options: PayloadPluginUrlsOptions,\n): CollectionAfterChangeHook {\n return async ({ collection, doc, previousDoc, req }) => {\n const urlDoc = doc as UrlDoc | undefined\n const previousUrlDoc = previousDoc as UrlDoc | undefined\n if (\n req.context?.disableUrlUpdates ||\n !urlDoc ||\n isDraftDoc(urlDoc) ||\n !hasUrlPathChanged(urlDoc, previousUrlDoc)\n ) {\n return urlDoc\n }\n\n const collectionOptions = getCollectionOptions(options, collection?.slug ?? \"\")\n if (!collectionOptions) {\n return urlDoc\n }\n\n const collectionSlug = collection?.slug ?? \"\"\n const isCategoryCollection = getCollectionsForCategory(options, collectionSlug).length > 0\n const source = isCategoryCollection\n ? {\n type: \"category\",\n collection: collectionSlug,\n id: urlDoc.id,\n }\n : {\n type:\n collectionOptions.breadcrumbs && !collectionOptions.rootPage ? \"page\" : \"collection\",\n collection: collectionSlug,\n id: urlDoc.id,\n }\n\n await req.payload.jobs?.queue?.({\n workflow: \"update-urls\",\n input: {\n sources: [source],\n },\n })\n\n return urlDoc\n }\n}\n\nexport function createRootPagesUrlUpdateHook(\n options: PayloadPluginUrlsOptions,\n): GlobalAfterChangeHook {\n return async ({ doc, previousDoc, req }) => {\n const rootPagesDoc = doc as RootPagesDoc\n const previousRootPagesDoc = previousDoc as RootPagesDoc | undefined\n if (req.context?.disableUrlUpdates) {\n return rootPagesDoc\n }\n\n await req.payload.jobs?.queue?.({\n workflow: \"update-urls\",\n input: {\n sources: [\n {\n type: \"rootPages\",\n current: getRootPageSnapshot(rootPagesDoc, options),\n previous: getRootPageSnapshot(previousRootPagesDoc, options),\n },\n ],\n },\n })\n\n return rootPagesDoc\n }\n}\n","import { populatedUrlField } from \"./field\"\nimport {\n createCollectionUrlUpdateHook,\n createPopulateUrlHook,\n createRootPagesUrlUpdateHook,\n} from \"./hooks\"\nimport {\n getCollectionOptions,\n getRootPageFieldNames,\n getRootPageFieldOptions,\n normalizeOptions,\n} from \"./options\"\nimport { createUpdateUrlsHandler } from \"./update-urls\"\n\nimport type {\n CollectionConfigLike,\n FieldLike,\n GlobalConfigLike,\n PayloadPlugin,\n PayloadPluginUrlsOptions,\n WorkflowLike,\n} from \"./types\"\n\nexport const payloadPluginUrls = (options?: PayloadPluginUrlsOptions): PayloadPlugin => {\n if (!options) {\n return (config) => config\n }\n\n return (config) => {\n const normalizedOptions = normalizeOptions(options, config)\n const collections = (config.collections ?? []).map((collection) =>\n applyUrlCollectionConfig(collection, normalizedOptions),\n )\n\n return {\n ...config,\n collections,\n globals: [...(config.globals ?? []), createRootPagesGlobal(normalizedOptions)],\n jobs: {\n ...(config.jobs ?? {}),\n workflows: [\n ...(config.jobs?.workflows ?? []),\n {\n slug: \"update-urls\",\n handler: createUpdateUrlsHandler(normalizedOptions),\n } as WorkflowLike,\n ],\n },\n } as ReturnType<PayloadPlugin>\n }\n}\n\nfunction applyUrlCollectionConfig(\n collection: CollectionConfigLike,\n options: PayloadPluginUrlsOptions,\n) {\n const collectionOptions = getCollectionOptions(options, collection.slug)\n if (!collectionOptions) {\n return collection\n }\n\n const fieldName = options.field?.name ?? \"populatedUrl\"\n const fields = collection.fields.some((field) => \"name\" in field && field.name === fieldName)\n ? collection.fields\n : [...collection.fields, populatedUrlField(options)]\n const hooks = collection.hooks ?? {}\n\n return {\n ...collection,\n defaultPopulate: {\n ...(collection.defaultPopulate ?? {}),\n [fieldName]: true,\n },\n fields,\n hooks: {\n ...hooks,\n beforeChange: [...(hooks.beforeChange ?? []), createPopulateUrlHook(options)],\n afterChange: [...(hooks.afterChange ?? []), createCollectionUrlUpdateHook(options)],\n },\n } as CollectionConfigLike\n}\n\nfunction createRootPagesGlobal(options: PayloadPluginUrlsOptions): GlobalConfigLike {\n const rootPagesOptions = normalizeOptions(options).rootPages\n\n return {\n slug: rootPagesOptions?.slug ?? \"root-pages\",\n label: rootPagesOptions?.label ?? \"Root pages\",\n fields: getRootPageFieldNames(options).map((fieldName) =>\n createRootPageField(fieldName, options),\n ),\n hooks: {\n afterChange: [createRootPagesUrlUpdateHook(options)],\n },\n }\n}\n\nfunction createRootPageField(fieldName: string, options: PayloadPluginUrlsOptions): FieldLike {\n const fieldOptions = getRootPageFieldOptions(options, fieldName)\n const overrides = (fieldOptions?.overrides ?? {}) as Record<string, unknown>\n const {\n name: _name,\n type: _type,\n hasMany: _hasMany,\n relationTo: _relationTo,\n ...override\n } = overrides\n\n return {\n name: fieldName,\n type: \"relationship\",\n relationTo: fieldOptions?.relationTo ?? \"pages\",\n hasMany: false,\n admin: {\n width: \"50%\",\n },\n ...override,\n } as FieldLike\n}\n"],"mappings":"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","names":["withoutTrailingSlash","path","getBreadcrumbsUrl","breadcrumbs","mergeDoc","data","originalDoc","withoutUndefinedValues","withoutPopulatedUrl","doc","_populatedUrl","rest","getDocumentId","getRelationId","value","normalizePath","getStringValue","key","record","isDraftDoc","getRecord","dedupeSources","sources","seen","source","sourceKey","entry","populatedUrlField","options","getRecord","normalizeOptions","options","config","locales","getConfigLocales","getCollectionOptions","collection","getCollectionEntries","getCollectionsForCategory","categoryCollection","collectionOptions","getRootPageFieldNames","normalizedOptions","getHomepageRootPageField","fields","field","fieldName","getRootPageFieldOptions","localization","locale","getDocumentLink","reference","baseUrl","locale","options","urlPrefixStrategy","withoutTrailingSlash","normalizedOptions","normalizeOptions","collectionOptions","getCollectionOptions","routeCollection","slugs","getSlugsForCollection","getDocumentLinkBySlugs","segments","withLocalePrefix","path","defaultLocale","doc","strategy","firstRelatedCategoryPath","getBreadcrumbsUrl","categories","first","categoryDoc","resolvePopulatedUrl","collection","data","locale","options","originalDoc","payload","rootPages","normalizedOptions","normalizeOptions","collectionOptions","getCollectionOptions","doc","mergeDoc","homepageField","getHomepageRootPageField","homepage","getRootPageDoc","homepageId","getDocumentId","withLocalePrefix","breadcrumbsPath","normalizePath","getBreadcrumbsUrl","homepagePath","pagePath","rootPageUrl","getRootPageUrl","categories","resolveCategories","getDocumentLink","withoutPopulatedUrl","rootPageField","relationTo","getRootPageFieldOptions","rootPage","withLocalePrefixIfNeeded","path","field","page","category","createUpdateUrlsHandler","options","job","req","normalizedOptions","normalizeOptions","sources","locale","rootPages","source","expandSources","updateCollectionDocuments","collection","getCollectionsForCategory","hasUrlPathChanged","doc","previousDoc","docUrl","getStringValue","previousUrl","getRootPageChangeSources","current","previous","indexPageField","getHomepageRootPageField","indexPageCollection","getRootPageFieldOptions","currentIndexPageId","getRelationId","previousIndexPageId","collectionOptions","getCollectionEntries","currentRootPageId","previousRootPageId","dedupeSources","getRootPageSnapshot","snapshot","fieldName","getRootPageFieldNames","payload","page","result","urlDoc","isDraftDoc","populatedUrlValue","resolvePopulatedUrl","createPopulateUrlHook","options","collection","context","data","originalDoc","req","locale","rootPages","normalizeOptions","populatedUrlValue","resolvePopulatedUrl","createCollectionUrlUpdateHook","doc","previousDoc","urlDoc","previousUrlDoc","isDraftDoc","hasUrlPathChanged","collectionOptions","getCollectionOptions","collectionSlug","source","getCollectionsForCategory","createRootPagesUrlUpdateHook","rootPagesDoc","previousRootPagesDoc","getRootPageSnapshot","payloadPluginUrls","options","config","normalizedOptions","normalizeOptions","collections","collection","applyUrlCollectionConfig","createRootPagesGlobal","createUpdateUrlsHandler","getCollectionOptions","fieldName","fields","field","populatedUrlField","hooks","createPopulateUrlHook","createCollectionUrlUpdateHook","rootPagesOptions","getRootPageFieldNames","createRootPageField","createRootPagesUrlUpdateHook","fieldOptions","getRootPageFieldOptions","overrides","_name","_type","_hasMany","_relationTo","override"]}
package/dist/options.d.ts CHANGED
@@ -1,6 +1,21 @@
1
- import type { PayloadPluginUrlsOptions } from "./types";
2
- export declare function normalizeOptions(options: PayloadPluginUrlsOptions): PayloadPluginUrlsOptions;
3
- export declare function getCollectionOptions(options: PayloadPluginUrlsOptions, collection: string): import("./types").UrlCollectionOptions | undefined;
1
+ import type { PayloadPluginConfig, PayloadPluginUrlsOptions, RootPageFieldOptions, UrlCollectionOptions } from "./types";
2
+ export type NormalizedPayloadPluginUrlsOptions = PayloadPluginUrlsOptions & {
3
+ collections: Record<string, UrlCollectionOptions>;
4
+ locales: {
5
+ defaultLocale: string;
6
+ locales: string[];
7
+ };
8
+ rootPages: {
9
+ slug: string;
10
+ label?: unknown;
11
+ fields: Record<string, RootPageFieldOptions>;
12
+ };
13
+ };
14
+ export declare function normalizeOptions(options: PayloadPluginUrlsOptions, config?: PayloadPluginConfig): NormalizedPayloadPluginUrlsOptions;
15
+ export declare function getCollectionOptions(options: PayloadPluginUrlsOptions, collection: string): UrlCollectionOptions;
16
+ export declare function getCollectionEntries(options: PayloadPluginUrlsOptions): [string, UrlCollectionOptions][];
4
17
  export declare function getCollectionsForCategory(options: PayloadPluginUrlsOptions, categoryCollection: string): string[];
5
18
  export declare function getRootPageFieldNames(options: PayloadPluginUrlsOptions): string[];
19
+ export declare function getHomepageRootPageField(options: PayloadPluginUrlsOptions): string;
20
+ export declare function getRootPageFieldOptions(options: PayloadPluginUrlsOptions, fieldName: string): RootPageFieldOptions;
6
21
  //# sourceMappingURL=options.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAEvD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,wBAAwB,GAAG,wBAAwB,CAkB5F;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,sDAEzF;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,wBAAwB,EACjC,kBAAkB,EAAE,MAAM,YAK3B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,YAUtE"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAEhB,MAAM,MAAM,kCAAkC,GAAG,wBAAwB,GAAG;IAC1E,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IACjD,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAA;QACrB,OAAO,EAAE,MAAM,EAAE,CAAA;KAClB,CAAA;IACD,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;KAC7C,CAAA;CACF,CAAA;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,wBAAwB,EACjC,MAAM,CAAC,EAAE,mBAAmB,GAC3B,kCAAkC,CA6BpC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,wBAEzF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,oCAErE;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,wBAAwB,EACjC,kBAAkB,EAAE,MAAM,YAO3B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,wBAAwB,YAGtE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,wBAAwB,UAOzE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,wBAE3F"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAGV,aAAa,EACb,wBAAwB,EACzB,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,iBAAiB,GAAI,UAAU,wBAAwB,KAAG,aA2BtE,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAIV,aAAa,EACb,wBAAwB,EAEzB,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,iBAAiB,GAAI,UAAU,wBAAwB,KAAG,aA2BtE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAIV,uBAAuB,EAGxB,MAAM,SAAS,CAAA;AAEhB,wBAAsB,mBAAmB,CAAC,EACxC,UAAU,EACV,IAAI,EACJ,MAAM,EACN,OAAO,EACP,WAAW,EACX,OAAO,EACP,SAAS,GACV,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA6EvD"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAIV,uBAAuB,EAIxB,MAAM,SAAS,CAAA;AAEhB,wBAAsB,mBAAmB,CAAC,EACxC,UAAU,EACV,IAAI,EACJ,MAAM,EACN,OAAO,EACP,WAAW,EACX,OAAO,EACP,SAAS,GACV,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA6EvD"}
package/dist/types.d.ts CHANGED
@@ -1,34 +1,39 @@
1
+ import type { CollectionAfterChangeHook, CollectionBeforeChangeHook, CollectionConfig, Field, GlobalAfterChangeHook, GlobalConfig, LabelFunction, Payload, Plugin, StaticLabel, WorkflowConfig } from "payload";
1
2
  export type Locale = string;
2
3
  export type UrlPrefixStrategy = "category" | "rootPage";
3
- export type Breadcrumb = {
4
+ export interface Breadcrumb {
4
5
  url?: string | null;
5
- };
6
- export type UrlDoc = {
7
- id?: string | null;
6
+ }
7
+ export interface UrlDoc {
8
+ id?: string | number | null;
8
9
  slug?: string | null;
9
10
  populatedUrl?: string | null;
10
11
  breadcrumbs?: Breadcrumb[] | null;
11
12
  categories?: unknown;
12
13
  _status?: "draft" | "published" | null;
13
14
  [key: string]: unknown;
14
- };
15
- export type RootPagesDoc = {
15
+ }
16
+ export interface RootPagesDoc {
16
17
  id?: string | null;
17
18
  [field: string]: string | UrlDoc | null | undefined;
18
- };
19
- export type UrlCollectionOptions = {
20
- slug: string;
19
+ }
20
+ export interface UrlCollectionOptions {
21
21
  breadcrumbs?: boolean;
22
- rootPageField?: string;
22
+ prefixStrategy?: UrlPrefixStrategy;
23
+ rootPage?: string;
23
24
  category?: {
24
25
  collection: string;
25
26
  field?: string;
26
- prefixStrategy?: UrlPrefixStrategy;
27
27
  };
28
28
  routeCollection?: string;
29
- };
30
- export type PayloadPluginUrlsOptions = {
31
- collections: UrlCollectionOptions[];
29
+ }
30
+ export interface RootPageFieldOptions {
31
+ isHomepage?: boolean;
32
+ relationTo?: string;
33
+ overrides?: Partial<Field>;
34
+ }
35
+ export interface PayloadPluginUrlsOptions {
36
+ collections: Record<string, UrlCollectionOptions>;
32
37
  field?: {
33
38
  name?: string;
34
39
  overrides?: Record<string, unknown>;
@@ -39,29 +44,12 @@ export type PayloadPluginUrlsOptions = {
39
44
  };
40
45
  rootPages?: {
41
46
  slug?: string;
42
- label?: unknown;
43
- indexPageField?: string;
44
- fieldLabels?: Record<string, unknown>;
45
- fieldOverrides?: Record<string, Partial<FieldLike>>;
46
- };
47
- };
48
- export type PayloadLike = {
49
- find?: (args: Record<string, unknown>) => Promise<{
50
- docs: UrlDoc[];
51
- nextPage?: number | null;
52
- }>;
53
- findByID?: (args: Record<string, unknown>) => Promise<UrlDoc>;
54
- findGlobal?: (args: Record<string, unknown>) => Promise<RootPagesDoc>;
55
- jobs?: {
56
- queue?: (args: Record<string, unknown>) => Promise<unknown>;
57
- run?: (args: Record<string, unknown>) => Promise<unknown>;
47
+ label?: LabelFunction | StaticLabel;
48
+ fields?: Record<string, RootPageFieldOptions>;
58
49
  };
59
- logger?: {
60
- error?: (error: unknown) => void;
61
- };
62
- update?: (args: Record<string, unknown>) => Promise<unknown>;
63
- };
64
- export type HookArgs = {
50
+ }
51
+ export type PayloadLike = Payload;
52
+ export interface HookArgs {
65
53
  collection?: {
66
54
  slug?: string;
67
55
  };
@@ -75,49 +63,15 @@ export type HookArgs = {
75
63
  context?: Record<string, unknown>;
76
64
  payload: PayloadLike;
77
65
  };
78
- };
79
- export type Hook = (args: HookArgs) => unknown;
80
- export type PayloadPluginConfig = {
81
- collections?: CollectionConfigLike[];
82
- globals?: GlobalConfigLike[];
83
- jobs?: {
84
- workflows?: WorkflowLike[];
85
- [key: string]: unknown;
86
- };
87
- [key: string]: unknown;
88
- };
89
- export type CollectionConfigLike = {
90
- slug: string;
91
- fields: FieldLike[];
92
- defaultPopulate?: Record<string, unknown>;
93
- hooks?: {
94
- beforeChange?: Hook[];
95
- afterChange?: Hook[];
96
- [key: string]: unknown;
97
- };
98
- [key: string]: unknown;
99
- };
100
- export type GlobalConfigLike = {
101
- slug: string;
102
- fields: FieldLike[];
103
- hooks?: {
104
- afterChange?: Hook[];
105
- [key: string]: unknown;
106
- };
107
- [key: string]: unknown;
108
- };
109
- export type FieldLike = {
110
- name?: string;
111
- type?: string;
112
- [key: string]: unknown;
113
- };
114
- export type WorkflowLike = {
115
- slug?: string;
116
- handler?: unknown;
117
- [key: string]: unknown;
118
- };
119
- export type PayloadPlugin = (config: PayloadPluginConfig) => PayloadPluginConfig;
120
- export type ResolvePopulatedUrlArgs = {
66
+ }
67
+ export type Hook = CollectionBeforeChangeHook | CollectionAfterChangeHook | GlobalAfterChangeHook;
68
+ export type PayloadPluginConfig = Parameters<Plugin>[0];
69
+ export type CollectionConfigLike = CollectionConfig;
70
+ export type GlobalConfigLike = GlobalConfig;
71
+ export type FieldLike = Field;
72
+ export type WorkflowLike = WorkflowConfig;
73
+ export type PayloadPlugin = Plugin;
74
+ export interface ResolvePopulatedUrlArgs {
121
75
  collection: string;
122
76
  data: Partial<UrlDoc>;
123
77
  locale: Locale;
@@ -125,17 +79,17 @@ export type ResolvePopulatedUrlArgs = {
125
79
  originalDoc?: Partial<UrlDoc>;
126
80
  payload?: PayloadLike;
127
81
  rootPages: RootPagesDoc;
128
- };
129
- export type GetDocumentLinkArgs = {
82
+ }
83
+ export interface GetDocumentLinkArgs {
130
84
  relationTo: string;
131
85
  value: string | UrlDoc;
132
- };
133
- export type GetDocumentLinkContext = {
86
+ }
87
+ export interface GetDocumentLinkContext {
134
88
  baseUrl?: string;
135
89
  locale: Locale;
136
90
  options: PayloadPluginUrlsOptions;
137
91
  urlPrefixStrategy?: UrlPrefixStrategy;
138
- };
92
+ }
139
93
  export type UrlUpdateSource = {
140
94
  collection: string;
141
95
  id?: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-urls.d.ts","sourceRoot":"","sources":["../src/update-urls.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,WAAW,EACX,wBAAwB,EACxB,YAAY,EACZ,MAAM,EACN,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,IACzD,eAGX;IACD,GAAG,EAAE;QACH,KAAK,CAAC,EAAE;YACN,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,IAAI,CAAA;SACnC,CAAA;KACF,CAAA;IACD,GAAG,EAAE;QACH,OAAO,EAAE,WAAW,CAAA;KACrB,CAAA;CACF,mBAqDF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,WASnE;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,OAAO,EAAE,wBAAwB,GAChC,eAAe,EAAE,CA6BnB;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,wBAAwB,gBASlC"}
1
+ {"version":3,"file":"update-urls.d.ts","sourceRoot":"","sources":["../src/update-urls.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,WAAW,EACX,wBAAwB,EACxB,YAAY,EACZ,MAAM,EACN,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,IACzD,eAGX;IACD,GAAG,EAAE;QACH,KAAK,CAAC,EAAE;YACN,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,IAAI,CAAA;SACnC,CAAA;KACF,CAAA;IACD,GAAG,EAAE;QACH,OAAO,EAAE,WAAW,CAAA;KACrB,CAAA;CACF,mBAqDF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,WASnE;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,OAAO,EAAE,wBAAwB,GAChC,eAAe,EAAE,CA+BnB;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,wBAAwB,gBASlC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload-plugin-urls",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "Payload CMS plugin for URL utilities.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -41,7 +41,7 @@
41
41
  "typecheck": "tsc --noEmit"
42
42
  },
43
43
  "peerDependencies": {
44
- "payload": ">=3.0.0"
44
+ "payload": "^3.80.0"
45
45
  },
46
46
  "publishConfig": {
47
47
  "access": "public"