@justanarthur/payload-www 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,7 +23,6 @@ var authenticatedOrPublished = ({ req: { user } }) => {
23
23
  return true;
24
24
  return { _status: { equals: "published" } };
25
25
  };
26
-
27
26
  // src/render/_locale.ts
28
27
  function prefixFor(locale, defaultLocale, mode) {
29
28
  if (mode === "never")
@@ -195,24 +194,9 @@ var createPagesCollection = (blocks, options = {}) => {
195
194
  renderPath = PAGES_RENDER_PATH,
196
195
  slug: collectionSlug = PAGES_SLUG2,
197
196
  localePrefix,
198
- defaultLocale
197
+ defaultLocale,
198
+ nested = false
199
199
  } = options;
200
- const slugField = {
201
- name: "slug",
202
- type: "text",
203
- required: true,
204
- unique: true,
205
- index: true,
206
- admin: { position: "sidebar" },
207
- validate: (value) => {
208
- if (typeof value !== "string")
209
- return "Slug must be a string";
210
- if (value !== "" && !/^[a-z0-9-]+$/.test(value)) {
211
- return "Slug must be lowercase, with hyphens (no spaces or special characters)";
212
- }
213
- return true;
214
- }
215
- };
216
200
  const baseFields = [
217
201
  {
218
202
  name: "title",
@@ -242,7 +226,7 @@ var createPagesCollection = (blocks, options = {}) => {
242
226
  type: "date",
243
227
  admin: { position: "sidebar" }
244
228
  },
245
- slugField
229
+ slugField({ nested })
246
230
  ];
247
231
  const { afterChange: revalidateAfterChange, afterDelete: revalidateAfterDelete } = createRevalidateCollectionHook({
248
232
  collectionSlug,
@@ -277,14 +261,6 @@ var createPostsCollection = (options = {}) => {
277
261
  localePrefix,
278
262
  defaultLocale
279
263
  } = options;
280
- const slugField = {
281
- name: "slug",
282
- type: "text",
283
- required: true,
284
- unique: true,
285
- index: true,
286
- admin: { position: "sidebar" }
287
- };
288
264
  const baseFields = [
289
265
  {
290
266
  name: "title",
@@ -309,7 +285,7 @@ var createPostsCollection = (options = {}) => {
309
285
  type: "date",
310
286
  admin: { position: "sidebar" }
311
287
  },
312
- slugField
288
+ slugField()
313
289
  ];
314
290
  const { afterChange, afterDelete } = createRevalidateCollectionHook({
315
291
  collectionSlug,
@@ -410,17 +386,18 @@ var createStaticPagesCollection = (blocks) => {
410
386
  };
411
387
 
412
388
  // src/core/fields/link.ts
413
- var appearanceOptions = {
389
+ var appearanceOptions2 = {
414
390
  default: { label: "Default", value: "default" },
415
391
  outline: { label: "Outline", value: "outline" }
416
392
  };
417
- var link = (options = {}) => {
393
+ var link2 = (options = {}) => {
418
394
  const {
419
395
  appearances,
420
396
  disableLabel = false,
421
397
  relationTo = [PAGES_SLUG],
422
398
  localized = false,
423
- overrides = {}
399
+ overrides = {},
400
+ extraFields = []
424
401
  } = options;
425
402
  const result = {
426
403
  name: "link",
@@ -488,7 +465,7 @@ var link = (options = {}) => {
488
465
  result.fields = [...result.fields, ...linkTypes];
489
466
  }
490
467
  if (appearances !== false) {
491
- const opts = appearances ? appearances.map((a) => appearanceOptions[a]) : [appearanceOptions.default, appearanceOptions.outline];
468
+ const opts = appearances ? appearances.map((a) => appearanceOptions2[a]) : [appearanceOptions2.default, appearanceOptions2.outline];
492
469
  result.fields.push({
493
470
  name: "appearance",
494
471
  type: "select",
@@ -497,6 +474,9 @@ var link = (options = {}) => {
497
474
  options: opts
498
475
  });
499
476
  }
477
+ if (extraFields.length) {
478
+ result.fields.push(...extraFields);
479
+ }
500
480
  return { ...result, ...overrides };
501
481
  };
502
482
 
@@ -516,17 +496,22 @@ function createRevalidateGlobalHook(slug) {
516
496
 
517
497
  // src/data/collections/globals/Header/config.ts
518
498
  var createHeaderGlobal = (options = {}) => {
519
- const { renderPath = HEADER_RENDER_PATH, linkRelationTo = [PAGES_SLUG] } = options;
499
+ const {
500
+ renderPath = HEADER_RENDER_PATH,
501
+ linkRelationTo = [PAGES_SLUG],
502
+ navColumnLinkFields = [],
503
+ navItemLinkFields = []
504
+ } = options;
520
505
  const navColumnBlock = {
521
506
  slug: "navColumn",
522
507
  fields: [
523
508
  { name: "title", type: "text", required: true, localized: true },
524
- { name: "links", type: "array", fields: [link({ appearances: false, localized: true, relationTo: linkRelationTo })] }
509
+ { name: "links", type: "array", fields: [link2({ appearances: false, localized: true, relationTo: linkRelationTo, extraFields: navColumnLinkFields })] }
525
510
  ]
526
511
  };
527
512
  const navItemBlock = {
528
513
  slug: "navItem",
529
- fields: [link({ appearances: false, localized: true, relationTo: linkRelationTo })]
514
+ fields: [link2({ appearances: false, localized: true, relationTo: linkRelationTo, extraFields: navItemLinkFields })]
530
515
  };
531
516
  return {
532
517
  slug: "header",
@@ -548,17 +533,22 @@ var createHeaderGlobal = (options = {}) => {
548
533
 
549
534
  // src/data/collections/globals/Footer/config.ts
550
535
  var createFooterGlobal = (options = {}) => {
551
- const { renderPath = FOOTER_RENDER_PATH, linkRelationTo = [PAGES_SLUG] } = options;
536
+ const {
537
+ renderPath = FOOTER_RENDER_PATH,
538
+ linkRelationTo = [PAGES_SLUG],
539
+ navColumnLinkFields = [],
540
+ navItemLinkFields = []
541
+ } = options;
552
542
  const navColumnBlock = {
553
543
  slug: "navColumn",
554
544
  fields: [
555
545
  { name: "title", type: "text", required: true, localized: true },
556
- { name: "links", type: "array", fields: [link({ appearances: false, localized: true, relationTo: linkRelationTo })] }
546
+ { name: "links", type: "array", fields: [link2({ appearances: false, localized: true, relationTo: linkRelationTo, extraFields: navColumnLinkFields })] }
557
547
  ]
558
548
  };
559
549
  const navItemBlock = {
560
550
  slug: "navItem",
561
- fields: [link({ appearances: false, localized: true, relationTo: linkRelationTo })]
551
+ fields: [link2({ appearances: false, localized: true, relationTo: linkRelationTo, extraFields: navItemLinkFields })]
562
552
  };
563
553
  return {
564
554
  slug: "footer",
@@ -647,7 +637,7 @@ function getFromImportMap(key, importMap) {
647
637
  var queryDocBySlug = cache(async function queryDocBySlug2({
648
638
  collectionSlug,
649
639
  slug,
650
- slugField = "slug",
640
+ slugField: slugField2 = "slug",
651
641
  locale,
652
642
  draft = false,
653
643
  config
@@ -659,14 +649,14 @@ var queryDocBySlug = cache(async function queryDocBySlug2({
659
649
  limit: 1,
660
650
  pagination: false,
661
651
  overrideAccess: draft,
662
- where: { [slugField]: { equals: slug } },
652
+ where: { [slugField2]: { equals: slug } },
663
653
  locale
664
654
  });
665
655
  return result.docs?.[0] ?? null;
666
656
  });
667
657
  var queryAllDocs = cache(async function queryAllDocs2({
668
658
  collectionSlug,
669
- slugField = "slug",
659
+ slugField: slugField2 = "slug",
670
660
  locale,
671
661
  config
672
662
  }) {
@@ -677,7 +667,7 @@ var queryAllDocs = cache(async function queryAllDocs2({
677
667
  limit: 1000,
678
668
  pagination: false,
679
669
  overrideAccess: false,
680
- select: { [slugField]: true },
670
+ select: { [slugField2]: true },
681
671
  locale
682
672
  });
683
673
  return result.docs ?? [];
@@ -685,7 +675,7 @@ var queryAllDocs = cache(async function queryAllDocs2({
685
675
  var queryAllLocaleSlugs = cache(async function queryAllLocaleSlugs2({
686
676
  collectionSlug,
687
677
  slug,
688
- slugField = "slug",
678
+ slugField: slugField2 = "slug",
689
679
  locale,
690
680
  config
691
681
  }) {
@@ -697,13 +687,25 @@ var queryAllLocaleSlugs = cache(async function queryAllLocaleSlugs2({
697
687
  pagination: false,
698
688
  overrideAccess: false,
699
689
  locale,
700
- where: { [slugField]: { equals: slug } },
701
- select: { [slugField]: true }
690
+ where: { [slugField2]: { equals: slug } },
691
+ select: { [slugField2]: true }
702
692
  });
703
693
  const doc = result.docs?.[0];
704
694
  if (!doc)
705
695
  return;
706
- const fieldValue = doc?.[slugField];
696
+ let fieldValue = doc[slugField2];
697
+ if (doc.id != null) {
698
+ const allLocales2 = await payload.findByID({
699
+ collection: collectionSlug,
700
+ id: doc.id,
701
+ locale: "all",
702
+ draft: false,
703
+ overrideAccess: false,
704
+ select: { [slugField2]: true }
705
+ }).catch(() => null);
706
+ if (allLocales2)
707
+ fieldValue = allLocales2[slugField2];
708
+ }
707
709
  if (fieldValue && typeof fieldValue === "object") {
708
710
  return fieldValue;
709
711
  }
@@ -756,6 +758,7 @@ function createSitemapFile(options) {
756
758
  const collectionDefaults = options.perCollection?.[collectionSlug] ?? {};
757
759
  const urlPrefix = (options.urlPrefixes?.[collectionSlug] ?? "").replace(/\/$/, "");
758
760
  const siteUrl = options.getServerSideURL().replace(/\/$/, "");
761
+ const isNested = options.nested?.[collectionSlug] ?? false;
759
762
  for (const locale of activeLocales) {
760
763
  const docs = await queryAllDocs({
761
764
  collectionSlug,
@@ -771,13 +774,14 @@ function createSitemapFile(options) {
771
774
  if (seen.has(dedupeKey))
772
775
  continue;
773
776
  seen.add(dedupeKey);
774
- const url = `${siteUrl}${prefixFor(locale, defaultLocale, options.localePrefix ?? "always")}${urlPrefix}/${storedSlug}`;
777
+ const slugPath = isNested ? storedSlug.replaceAll("_", "/") : storedSlug;
778
+ const url = `${siteUrl}${prefixFor(locale, defaultLocale, options.localePrefix ?? "always")}${urlPrefix}/${slugPath}`;
775
779
  const languages = await buildHreflangAlternates({
776
780
  siteUrl,
777
781
  locale,
778
782
  urlPrefix,
779
783
  storedSlug,
780
- nested: false,
784
+ nested: isNested,
781
785
  homeSlug: "",
782
786
  defaultLocale,
783
787
  locales: activeLocales,
@@ -808,7 +812,7 @@ function createSitemapFile(options) {
808
812
  }
809
813
  // src/config/createWWWConfig.ts
810
814
  function createWWWConfig(options) {
811
- const { locales, routing, blocks, linkRelationTo, registerPosts = true, defaultPlugins } = options;
815
+ const { locales, routing, blocks, linkRelationTo, registerPosts = true, nested = false, defaultPlugins } = options;
812
816
  const defaultLocale = routing?.defaultLocale ?? locales[0] ?? "";
813
817
  const localePrefixMode = (() => {
814
818
  const raw = routing?.localePrefix;
@@ -821,7 +825,8 @@ function createWWWConfig(options) {
821
825
  }
822
826
  const buildPagesCollection = () => createPagesCollection(blocks, {
823
827
  localePrefix: localePrefixMode,
824
- defaultLocale
828
+ defaultLocale,
829
+ nested
825
830
  });
826
831
  const buildPostsCollection = () => createPostsCollection({
827
832
  localePrefix: localePrefixMode,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@justanarthur/payload-www",
3
3
  "description": "Reusable Payload CMS website template — config builder, collections, globals, blocks, fields, access, hooks, metadata (JSON-LD, hreflang), page renderers, and test helpers.",
4
- "version": "0.1.2",
4
+ "version": "0.3.0",
5
5
  "type": "module",
6
6
  "private": false,
7
7
  "module": "./dist/index.js",