@payloadcms/next 3.81.0 → 3.82.0-canary.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.
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/utilities/meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAEpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAYzC,eAAO,MAAM,gBAAgB,SACrB;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,KACvC,OAAO,CAAC,QAAQ,CAqFlB,CAAA"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/utilities/meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAEpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAkDzC,eAAO,MAAM,gBAAgB,SACrB;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,KACvC,OAAO,CAAC,QAAQ,CAwFlB,CAAA"}
@@ -1,5 +1,40 @@
1
1
  import { payloadFaviconDark, payloadFaviconLight, staticOGImage } from '@payloadcms/ui/assets';
2
2
  import * as qs from 'qs-esm';
3
+ const appendTitleSuffix = (title, suffix) => {
4
+ if (!suffix || !title) {
5
+ return title ?? undefined;
6
+ }
7
+ if (typeof title === 'string') {
8
+ return `${title} ${suffix}`;
9
+ }
10
+ if ('default' in title) {
11
+ return {
12
+ default: `${title.default} ${suffix}`,
13
+ template: `${title.template} ${suffix}`
14
+ };
15
+ }
16
+ if ('template' in title) {
17
+ return {
18
+ absolute: `${title.absolute} ${suffix}`,
19
+ template: title.template !== null ? `${title.template} ${suffix}` : null
20
+ };
21
+ }
22
+ return {
23
+ absolute: `${title.absolute} ${suffix}`
24
+ };
25
+ };
26
+ const getTitleString = title => {
27
+ if (!title) {
28
+ return undefined;
29
+ }
30
+ if (typeof title === 'string') {
31
+ return title;
32
+ }
33
+ if ('absolute' in title) {
34
+ return title.absolute;
35
+ }
36
+ return title.default;
37
+ };
3
38
  const defaultOpenGraph = {
4
39
  description: 'Payload is a headless CMS and application framework built with TypeScript, Node.js, and React.',
5
40
  siteName: 'Payload App',
@@ -30,8 +65,9 @@ export const generateMetadata = async args => {
30
65
  sizes: '32x32',
31
66
  url: typeof payloadFaviconLight === 'object' ? payloadFaviconLight?.src : payloadFaviconLight
32
67
  }];
33
- const metaTitle = [incomingMetadata.title, titleSuffix].filter(Boolean).join(' ');
34
- const ogTitle = `${typeof incomingMetadata.openGraph?.title === 'string' ? incomingMetadata.openGraph.title : incomingMetadata.title} ${titleSuffix}`;
68
+ const metaTitle = appendTitleSuffix(incomingMetadata.title, titleSuffix);
69
+ const titleStringForOg = typeof incomingMetadata.openGraph?.title === 'string' ? incomingMetadata.openGraph.title : getTitleString(incomingMetadata.title);
70
+ const ogTitle = [titleStringForOg, titleSuffix].filter(Boolean).join(' ');
35
71
  const mergedOpenGraph = {
36
72
  ...(defaultOpenGraph || {}),
37
73
  ...(defaultOGImageType === 'dynamic' ? {
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","names":["payloadFaviconDark","payloadFaviconLight","staticOGImage","qs","defaultOpenGraph","description","siteName","title","generateMetadata","args","defaultOGImageType","serverURL","titleSuffix","rest","incomingMetadata","icons","type","rel","sizes","url","src","media","metaTitle","filter","Boolean","join","ogTitle","openGraph","mergedOpenGraph","images","alt","height","stringify","addQueryPrefix","width","Promise","resolve","metadataBase","URL","process","env","PAYLOAD_PUBLIC_SERVER_URL","PORT"],"sources":["../../src/utilities/meta.ts"],"sourcesContent":["import type { Metadata } from 'next'\nimport type { Icon } from 'next/dist/lib/metadata/types/metadata-types.js'\nimport type { MetaConfig } from 'payload'\n\nimport { payloadFaviconDark, payloadFaviconLight, staticOGImage } from '@payloadcms/ui/assets'\nimport * as qs from 'qs-esm'\n\nconst defaultOpenGraph: Metadata['openGraph'] = {\n description:\n 'Payload is a headless CMS and application framework built with TypeScript, Node.js, and React.',\n siteName: 'Payload App',\n title: 'Payload App',\n}\n\nexport const generateMetadata = async (\n args: { serverURL: string } & MetaConfig,\n): Promise<Metadata> => {\n const { defaultOGImageType, serverURL, titleSuffix, ...rest } = args\n\n /**\n * @todo find a way to remove the type assertion here.\n * It is a result of needing to `DeepCopy` the `MetaConfig` type from Payload.\n * This is required for the `DeepRequired` from `Config` to `SanitizedConfig`.\n */\n const incomingMetadata = rest as Metadata\n\n const icons: Metadata['icons'] =\n incomingMetadata.icons ||\n ([\n {\n type: 'image/png',\n rel: 'icon',\n sizes: '32x32',\n url: typeof payloadFaviconDark === 'object' ? payloadFaviconDark?.src : payloadFaviconDark,\n },\n {\n type: 'image/png',\n media: '(prefers-color-scheme: dark)',\n rel: 'icon',\n sizes: '32x32',\n url:\n typeof payloadFaviconLight === 'object' ? payloadFaviconLight?.src : payloadFaviconLight,\n },\n ] satisfies Array<Icon>)\n\n const metaTitle: Metadata['title'] = [incomingMetadata.title, titleSuffix]\n .filter(Boolean)\n .join(' ')\n\n const ogTitle = `${typeof incomingMetadata.openGraph?.title === 'string' ? incomingMetadata.openGraph.title : incomingMetadata.title} ${titleSuffix}`\n\n const mergedOpenGraph: Metadata['openGraph'] = {\n ...(defaultOpenGraph || {}),\n ...(defaultOGImageType === 'dynamic'\n ? {\n images: [\n {\n alt: ogTitle,\n height: 630,\n url: `/api/og${qs.stringify(\n {\n description:\n incomingMetadata.openGraph?.description || defaultOpenGraph.description,\n title: ogTitle,\n },\n {\n addQueryPrefix: true,\n },\n )}`,\n width: 1200,\n },\n ],\n }\n : {}),\n ...(defaultOGImageType === 'static'\n ? {\n images: [\n {\n alt: ogTitle,\n height: 480,\n url: typeof staticOGImage === 'object' ? staticOGImage?.src : staticOGImage,\n width: 640,\n },\n ],\n }\n : {}),\n title: ogTitle,\n ...(incomingMetadata.openGraph || {}),\n }\n\n return Promise.resolve({\n ...incomingMetadata,\n icons,\n metadataBase: new URL(\n serverURL ||\n process.env.PAYLOAD_PUBLIC_SERVER_URL ||\n `http://localhost:${process.env.PORT || 3000}`,\n ),\n openGraph: mergedOpenGraph,\n title: metaTitle,\n })\n}\n"],"mappings":"AAIA,SAASA,kBAAkB,EAAEC,mBAAmB,EAAEC,aAAa,QAAQ;AACvE,YAAYC,EAAA,MAAQ;AAEpB,MAAMC,gBAAA,GAA0C;EAC9CC,WAAA,EACE;EACFC,QAAA,EAAU;EACVC,KAAA,EAAO;AACT;AAEA,OAAO,MAAMC,gBAAA,GAAmB,MAC9BC,IAAA;EAEA,MAAM;IAAEC,kBAAkB;IAAEC,SAAS;IAAEC,WAAW;IAAE,GAAGC;EAAA,CAAM,GAAGJ,IAAA;EAEhE;;;;;EAKA,MAAMK,gBAAA,GAAmBD,IAAA;EAEzB,MAAME,KAAA,GACJD,gBAAA,CAAiBC,KAAK,IACrB,CACC;IACEC,IAAA,EAAM;IACNC,GAAA,EAAK;IACLC,KAAA,EAAO;IACPC,GAAA,EAAK,OAAOnB,kBAAA,KAAuB,WAAWA,kBAAA,EAAoBoB,GAAA,GAAMpB;EAC1E,GACA;IACEgB,IAAA,EAAM;IACNK,KAAA,EAAO;IACPJ,GAAA,EAAK;IACLC,KAAA,EAAO;IACPC,GAAA,EACE,OAAOlB,mBAAA,KAAwB,WAAWA,mBAAA,EAAqBmB,GAAA,GAAMnB;EACzE,EACD;EAEH,MAAMqB,SAAA,GAA+B,CAACR,gBAAA,CAAiBP,KAAK,EAAEK,WAAA,CAAY,CACvEW,MAAM,CAACC,OAAA,EACPC,IAAI,CAAC;EAER,MAAMC,OAAA,GAAU,GAAG,OAAOZ,gBAAA,CAAiBa,SAAS,EAAEpB,KAAA,KAAU,WAAWO,gBAAA,CAAiBa,SAAS,CAACpB,KAAK,GAAGO,gBAAA,CAAiBP,KAAK,IAAIK,WAAA,EAAa;EAErJ,MAAMgB,eAAA,GAAyC;IAC7C,IAAIxB,gBAAA,IAAoB,CAAC,CAAC;IAC1B,IAAIM,kBAAA,KAAuB,YACvB;MACEmB,MAAA,EAAQ,CACN;QACEC,GAAA,EAAKJ,OAAA;QACLK,MAAA,EAAQ;QACRZ,GAAA,EAAK,UAAUhB,EAAA,CAAG6B,SAAS,CACzB;UACE3B,WAAA,EACES,gBAAA,CAAiBa,SAAS,EAAEtB,WAAA,IAAeD,gBAAA,CAAiBC,WAAW;UACzEE,KAAA,EAAOmB;QACT,GACA;UACEO,cAAA,EAAgB;QAClB,IACC;QACHC,KAAA,EAAO;MACT;IAEJ,IACA,CAAC,CAAC;IACN,IAAIxB,kBAAA,KAAuB,WACvB;MACEmB,MAAA,EAAQ,CACN;QACEC,GAAA,EAAKJ,OAAA;QACLK,MAAA,EAAQ;QACRZ,GAAA,EAAK,OAAOjB,aAAA,KAAkB,WAAWA,aAAA,EAAekB,GAAA,GAAMlB,aAAA;QAC9DgC,KAAA,EAAO;MACT;IAEJ,IACA,CAAC,CAAC;IACN3B,KAAA,EAAOmB,OAAA;IACP,IAAIZ,gBAAA,CAAiBa,SAAS,IAAI,CAAC,CAAC;EACtC;EAEA,OAAOQ,OAAA,CAAQC,OAAO,CAAC;IACrB,GAAGtB,gBAAgB;IACnBC,KAAA;IACAsB,YAAA,EAAc,IAAIC,GAAA,CAChB3B,SAAA,IACE4B,OAAA,CAAQC,GAAG,CAACC,yBAAyB,IACrC,oBAAoBF,OAAA,CAAQC,GAAG,CAACE,IAAI,IAAI,MAAM;IAElDf,SAAA,EAAWC,eAAA;IACXrB,KAAA,EAAOe;EACT;AACF","ignoreList":[]}
1
+ {"version":3,"file":"meta.js","names":["payloadFaviconDark","payloadFaviconLight","staticOGImage","qs","appendTitleSuffix","title","suffix","undefined","default","template","absolute","getTitleString","defaultOpenGraph","description","siteName","generateMetadata","args","defaultOGImageType","serverURL","titleSuffix","rest","incomingMetadata","icons","type","rel","sizes","url","src","media","metaTitle","titleStringForOg","openGraph","ogTitle","filter","Boolean","join","mergedOpenGraph","images","alt","height","stringify","addQueryPrefix","width","Promise","resolve","metadataBase","URL","process","env","PAYLOAD_PUBLIC_SERVER_URL","PORT"],"sources":["../../src/utilities/meta.ts"],"sourcesContent":["import type { Metadata } from 'next'\nimport type { Icon } from 'next/dist/lib/metadata/types/metadata-types.js'\nimport type { MetaConfig } from 'payload'\n\nimport { payloadFaviconDark, payloadFaviconLight, staticOGImage } from '@payloadcms/ui/assets'\nimport * as qs from 'qs-esm'\n\nconst appendTitleSuffix = (\n title: Metadata['title'],\n suffix: string | undefined,\n): Metadata['title'] => {\n if (!suffix || !title) {\n return title ?? undefined\n }\n if (typeof title === 'string') {\n return `${title} ${suffix}`\n }\n\n if ('default' in title) {\n return { default: `${title.default} ${suffix}`, template: `${title.template} ${suffix}` }\n }\n\n if ('template' in title) {\n return {\n absolute: `${title.absolute} ${suffix}`,\n template: title.template !== null ? `${title.template} ${suffix}` : null,\n }\n }\n\n return { absolute: `${title.absolute} ${suffix}` }\n}\n\nconst getTitleString = (title: Metadata['title']): string | undefined => {\n if (!title) {\n return undefined\n }\n if (typeof title === 'string') {\n return title\n }\n if ('absolute' in title) {\n return title.absolute\n }\n return title.default\n}\n\nconst defaultOpenGraph: Metadata['openGraph'] = {\n description:\n 'Payload is a headless CMS and application framework built with TypeScript, Node.js, and React.',\n siteName: 'Payload App',\n title: 'Payload App',\n}\n\nexport const generateMetadata = async (\n args: { serverURL: string } & MetaConfig,\n): Promise<Metadata> => {\n const { defaultOGImageType, serverURL, titleSuffix, ...rest } = args\n\n /**\n * @todo find a way to remove the type assertion here.\n * It is a result of needing to `DeepCopy` the `MetaConfig` type from Payload.\n * This is required for the `DeepRequired` from `Config` to `SanitizedConfig`.\n */\n const incomingMetadata = rest as Metadata\n\n const icons: Metadata['icons'] =\n incomingMetadata.icons ||\n ([\n {\n type: 'image/png',\n rel: 'icon',\n sizes: '32x32',\n url: typeof payloadFaviconDark === 'object' ? payloadFaviconDark?.src : payloadFaviconDark,\n },\n {\n type: 'image/png',\n media: '(prefers-color-scheme: dark)',\n rel: 'icon',\n sizes: '32x32',\n url:\n typeof payloadFaviconLight === 'object' ? payloadFaviconLight?.src : payloadFaviconLight,\n },\n ] satisfies Array<Icon>)\n\n const metaTitle: Metadata['title'] = appendTitleSuffix(incomingMetadata.title, titleSuffix)\n\n const titleStringForOg: string | undefined =\n typeof incomingMetadata.openGraph?.title === 'string'\n ? incomingMetadata.openGraph.title\n : getTitleString(incomingMetadata.title)\n\n const ogTitle = [titleStringForOg, titleSuffix].filter(Boolean).join(' ')\n\n const mergedOpenGraph: Metadata['openGraph'] = {\n ...(defaultOpenGraph || {}),\n ...(defaultOGImageType === 'dynamic'\n ? {\n images: [\n {\n alt: ogTitle,\n height: 630,\n url: `/api/og${qs.stringify(\n {\n description:\n incomingMetadata.openGraph?.description || defaultOpenGraph.description,\n title: ogTitle,\n },\n {\n addQueryPrefix: true,\n },\n )}`,\n width: 1200,\n },\n ],\n }\n : {}),\n ...(defaultOGImageType === 'static'\n ? {\n images: [\n {\n alt: ogTitle,\n height: 480,\n url: typeof staticOGImage === 'object' ? staticOGImage?.src : staticOGImage,\n width: 640,\n },\n ],\n }\n : {}),\n title: ogTitle,\n ...(incomingMetadata.openGraph || {}),\n }\n\n return Promise.resolve({\n ...incomingMetadata,\n icons,\n metadataBase: new URL(\n serverURL ||\n process.env.PAYLOAD_PUBLIC_SERVER_URL ||\n `http://localhost:${process.env.PORT || 3000}`,\n ),\n openGraph: mergedOpenGraph,\n title: metaTitle,\n })\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,83 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { generateMetadata } from './meta.js';
3
+ describe('generateMetadata', () => {
4
+ it('should handle a string title with titleSuffix', async () => {
5
+ const result = await generateMetadata({
6
+ serverURL: 'http://localhost:3000',
7
+ title: 'Dashboard',
8
+ titleSuffix: '- My CMS'
9
+ });
10
+ expect(result.title).toBe('Dashboard - My CMS');
11
+ });
12
+ it('should apply titleSuffix to default and template fields of a TemplateString title object', async () => {
13
+ const result = await generateMetadata({
14
+ serverURL: 'http://localhost:3000',
15
+ title: {
16
+ default: 'Dashboard',
17
+ template: '%s | Dashboard'
18
+ },
19
+ titleSuffix: '- My CMS'
20
+ });
21
+ expect(typeof result.title).toBe('object');
22
+ expect(result.title.default).toBe('Dashboard - My CMS');
23
+ expect(result.title.template).toBe('%s | Dashboard - My CMS');
24
+ });
25
+ it('should use the TemplateString default for ogTitle when title is a TemplateString object', async () => {
26
+ const result = await generateMetadata({
27
+ serverURL: 'http://localhost:3000',
28
+ title: {
29
+ default: 'My CMS',
30
+ template: '%s | My CMS'
31
+ },
32
+ titleSuffix: '- Payload'
33
+ });
34
+ // OG title must be a plain string — extract from TemplateString.default and append titleSuffix
35
+ expect(result.openGraph?.title).toBe('My CMS - Payload');
36
+ });
37
+ it('should use the TemplateString absolute for ogTitle when title has absolute property', async () => {
38
+ const result = await generateMetadata({
39
+ serverURL: 'http://localhost:3000',
40
+ title: {
41
+ absolute: 'My CMS Absolute'
42
+ },
43
+ titleSuffix: '- Payload'
44
+ });
45
+ expect(result.openGraph?.title).toBe('My CMS Absolute - Payload');
46
+ });
47
+ it('should apply titleSuffix to the absolute field of a TemplateString title object', async () => {
48
+ const result = await generateMetadata({
49
+ serverURL: 'http://localhost:3000',
50
+ title: {
51
+ absolute: 'My CMS Absolute'
52
+ },
53
+ titleSuffix: '- Payload'
54
+ });
55
+ expect(typeof result.title).toBe('object');
56
+ expect(result.title.absolute).toBe('My CMS Absolute - Payload');
57
+ });
58
+ it('should use openGraph.title string over incomingMetadata.title for ogTitle', async () => {
59
+ const result = await generateMetadata({
60
+ serverURL: 'http://localhost:3000',
61
+ title: 'My CMS',
62
+ titleSuffix: '- Payload',
63
+ openGraph: {
64
+ title: 'Custom OG Title'
65
+ }
66
+ });
67
+ expect(result.openGraph?.title).toBe('Custom OG Title');
68
+ });
69
+ it('should return undefined for metaTitle when no title and no titleSuffix are set', async () => {
70
+ const result = await generateMetadata({
71
+ serverURL: 'http://localhost:3000'
72
+ });
73
+ expect(result.title).toBeUndefined();
74
+ });
75
+ it('should return just the title when no titleSuffix is set', async () => {
76
+ const result = await generateMetadata({
77
+ serverURL: 'http://localhost:3000',
78
+ title: 'My CMS'
79
+ });
80
+ expect(result.title).toBe('My CMS');
81
+ });
82
+ });
83
+ //# sourceMappingURL=meta.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.spec.js","names":["describe","expect","it","generateMetadata","result","serverURL","title","titleSuffix","toBe","default","template","openGraph","absolute","toBeUndefined"],"sources":["../../src/utilities/meta.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { generateMetadata } from './meta.js'\n\ndescribe('generateMetadata', () => {\n it('should handle a string title with titleSuffix', async () => {\n const result = await generateMetadata({\n serverURL: 'http://localhost:3000',\n title: 'Dashboard',\n titleSuffix: '- My CMS',\n })\n\n expect(result.title).toBe('Dashboard - My CMS')\n })\n\n it('should apply titleSuffix to default and template fields of a TemplateString title object', async () => {\n const result = await generateMetadata({\n serverURL: 'http://localhost:3000',\n title: { default: 'Dashboard', template: '%s | Dashboard' },\n titleSuffix: '- My CMS',\n })\n\n expect(typeof result.title).toBe('object')\n expect((result.title as { default: string; template: string }).default).toBe(\n 'Dashboard - My CMS',\n )\n expect((result.title as { default: string; template: string }).template).toBe(\n '%s | Dashboard - My CMS',\n )\n })\n\n it('should use the TemplateString default for ogTitle when title is a TemplateString object', async () => {\n const result = await generateMetadata({\n serverURL: 'http://localhost:3000',\n title: { default: 'My CMS', template: '%s | My CMS' },\n titleSuffix: '- Payload',\n })\n\n // OG title must be a plain string — extract from TemplateString.default and append titleSuffix\n expect(result.openGraph?.title).toBe('My CMS - Payload')\n })\n\n it('should use the TemplateString absolute for ogTitle when title has absolute property', async () => {\n const result = await generateMetadata({\n serverURL: 'http://localhost:3000',\n title: { absolute: 'My CMS Absolute' },\n titleSuffix: '- Payload',\n })\n\n expect(result.openGraph?.title).toBe('My CMS Absolute - Payload')\n })\n\n it('should apply titleSuffix to the absolute field of a TemplateString title object', async () => {\n const result = await generateMetadata({\n serverURL: 'http://localhost:3000',\n title: { absolute: 'My CMS Absolute' },\n titleSuffix: '- Payload',\n })\n\n expect(typeof result.title).toBe('object')\n expect((result.title as { absolute: string }).absolute).toBe('My CMS Absolute - Payload')\n })\n\n it('should use openGraph.title string over incomingMetadata.title for ogTitle', async () => {\n const result = await generateMetadata({\n serverURL: 'http://localhost:3000',\n title: 'My CMS',\n titleSuffix: '- Payload',\n openGraph: { title: 'Custom OG Title' },\n })\n\n expect(result.openGraph?.title).toBe('Custom OG Title')\n })\n\n it('should return undefined for metaTitle when no title and no titleSuffix are set', async () => {\n const result = await generateMetadata({\n serverURL: 'http://localhost:3000',\n })\n\n expect(result.title).toBeUndefined()\n })\n\n it('should return just the title when no titleSuffix is set', async () => {\n const result = await generateMetadata({\n serverURL: 'http://localhost:3000',\n title: 'My CMS',\n })\n\n expect(result.title).toBe('My CMS')\n })\n})\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ;AAErC,SAASC,gBAAgB,QAAQ;AAEjCH,QAAA,CAAS,oBAAoB;EAC3BE,EAAA,CAAG,iDAAiD;IAClD,MAAME,MAAA,GAAS,MAAMD,gBAAA,CAAiB;MACpCE,SAAA,EAAW;MACXC,KAAA,EAAO;MACPC,WAAA,EAAa;IACf;IAEAN,MAAA,CAAOG,MAAA,CAAOE,KAAK,EAAEE,IAAI,CAAC;EAC5B;EAEAN,EAAA,CAAG,4FAA4F;IAC7F,MAAME,MAAA,GAAS,MAAMD,gBAAA,CAAiB;MACpCE,SAAA,EAAW;MACXC,KAAA,EAAO;QAAEG,OAAA,EAAS;QAAaC,QAAA,EAAU;MAAiB;MAC1DH,WAAA,EAAa;IACf;IAEAN,MAAA,CAAO,OAAOG,MAAA,CAAOE,KAAK,EAAEE,IAAI,CAAC;IACjCP,MAAA,CAAOG,MAAC,CAAOE,KAAK,CAA2CG,OAAO,EAAED,IAAI,CAC1E;IAEFP,MAAA,CAAOG,MAAC,CAAOE,KAAK,CAA2CI,QAAQ,EAAEF,IAAI,CAC3E;EAEJ;EAEAN,EAAA,CAAG,2FAA2F;IAC5F,MAAME,MAAA,GAAS,MAAMD,gBAAA,CAAiB;MACpCE,SAAA,EAAW;MACXC,KAAA,EAAO;QAAEG,OAAA,EAAS;QAAUC,QAAA,EAAU;MAAc;MACpDH,WAAA,EAAa;IACf;IAEA;IACAN,MAAA,CAAOG,MAAA,CAAOO,SAAS,EAAEL,KAAA,EAAOE,IAAI,CAAC;EACvC;EAEAN,EAAA,CAAG,uFAAuF;IACxF,MAAME,MAAA,GAAS,MAAMD,gBAAA,CAAiB;MACpCE,SAAA,EAAW;MACXC,KAAA,EAAO;QAAEM,QAAA,EAAU;MAAkB;MACrCL,WAAA,EAAa;IACf;IAEAN,MAAA,CAAOG,MAAA,CAAOO,SAAS,EAAEL,KAAA,EAAOE,IAAI,CAAC;EACvC;EAEAN,EAAA,CAAG,mFAAmF;IACpF,MAAME,MAAA,GAAS,MAAMD,gBAAA,CAAiB;MACpCE,SAAA,EAAW;MACXC,KAAA,EAAO;QAAEM,QAAA,EAAU;MAAkB;MACrCL,WAAA,EAAa;IACf;IAEAN,MAAA,CAAO,OAAOG,MAAA,CAAOE,KAAK,EAAEE,IAAI,CAAC;IACjCP,MAAA,CAAOG,MAAC,CAAOE,KAAK,CAA0BM,QAAQ,EAAEJ,IAAI,CAAC;EAC/D;EAEAN,EAAA,CAAG,6EAA6E;IAC9E,MAAME,MAAA,GAAS,MAAMD,gBAAA,CAAiB;MACpCE,SAAA,EAAW;MACXC,KAAA,EAAO;MACPC,WAAA,EAAa;MACbI,SAAA,EAAW;QAAEL,KAAA,EAAO;MAAkB;IACxC;IAEAL,MAAA,CAAOG,MAAA,CAAOO,SAAS,EAAEL,KAAA,EAAOE,IAAI,CAAC;EACvC;EAEAN,EAAA,CAAG,kFAAkF;IACnF,MAAME,MAAA,GAAS,MAAMD,gBAAA,CAAiB;MACpCE,SAAA,EAAW;IACb;IAEAJ,MAAA,CAAOG,MAAA,CAAOE,KAAK,EAAEO,aAAa;EACpC;EAEAX,EAAA,CAAG,2DAA2D;IAC5D,MAAME,MAAA,GAAS,MAAMD,gBAAA,CAAiB;MACpCE,SAAA,EAAW;MACXC,KAAA,EAAO;IACT;IAEAL,MAAA,CAAOG,MAAA,CAAOE,KAAK,EAAEE,IAAI,CAAC;EAC5B;AACF","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/next",
3
- "version": "3.81.0",
3
+ "version": "3.82.0-canary.0",
4
4
  "homepage": "https://payloadcms.com",
5
5
  "repository": {
6
6
  "type": "git",
@@ -99,9 +99,9 @@
99
99
  "qs-esm": "8.0.1",
100
100
  "sass": "1.77.4",
101
101
  "uuid": "10.0.0",
102
- "@payloadcms/graphql": "3.81.0",
103
- "@payloadcms/ui": "3.81.0",
104
- "@payloadcms/translations": "3.81.0"
102
+ "@payloadcms/graphql": "3.82.0-canary.0",
103
+ "@payloadcms/translations": "3.82.0-canary.0",
104
+ "@payloadcms/ui": "3.82.0-canary.0"
105
105
  },
106
106
  "devDependencies": {
107
107
  "@babel/cli": "7.27.2",
@@ -119,12 +119,12 @@
119
119
  "esbuild-sass-plugin": "3.3.1",
120
120
  "swc-plugin-transform-remove-imports": "8.3.0",
121
121
  "@payloadcms/eslint-config": "3.28.0",
122
- "payload": "3.81.0"
122
+ "payload": "3.82.0-canary.0"
123
123
  },
124
124
  "peerDependencies": {
125
125
  "graphql": "^16.8.1",
126
126
  "next": ">=15.2.9 <15.3.0 || >=15.3.9 <15.4.0 || >=15.4.11 <15.5.0 || >=16.2.0-canary.10 <17.0.0",
127
- "payload": "3.81.0"
127
+ "payload": "3.82.0-canary.0"
128
128
  },
129
129
  "engines": {
130
130
  "node": "^18.20.2 || >=20.9.0"