From 08bd00f01f2b71bafad5962b3bf78cff03189561 Mon Sep 17 00:00:00 2001 From: rasm-its Date: Sat, 22 Aug 2026 22:26:47 +0200 Subject: [PATCH] graph: use replyTo instead of from to avoid ErrorSendAsDenied --- dist/exports/client.d.ts | 2 + dist/exports/client.js | 1 + dist/exports/client.js.map | 2 +- .../components/MaskedField.js | 25 +- .../components/MaskedField.js.map | 2 +- dist/index.d.ts | 2 + dist/index.js | 1 + dist/index.js.map | 2 +- dist/modules/email/graphAdapter.js | 43 +- dist/modules/email/graphAdapter.js.map | 2 +- package.json | 22 +- pnpm-lock.yaml | 538 ++++-------------- src/exports/client.ts | 3 + .../components/MaskedField.tsx | 27 +- src/index.ts | 10 + src/modules/email/graphAdapter.ts | 43 +- 16 files changed, 245 insertions(+), 480 deletions(-) diff --git a/dist/exports/client.d.ts b/dist/exports/client.d.ts index 7734126..7a4c12e 100644 --- a/dist/exports/client.d.ts +++ b/dist/exports/client.d.ts @@ -12,3 +12,5 @@ export { ConsentProvider, CookieBanner, CookieButton, useConsent, useConsentCont export type { CookieBannerClassNames } from '../modules/consent/client.js'; export { Turnstile } from '../modules/turnstile/client.js'; export type { TurnstileProps } from '../modules/turnstile/client.js'; +export { resolveFormMessage } from '../modules/notifications/resolveFormMessage.js'; +export type { FormNotificationTexts } from '../modules/notifications/types.js'; diff --git a/dist/exports/client.js b/dist/exports/client.js index 57e793b..40e9411 100644 --- a/dist/exports/client.js +++ b/dist/exports/client.js @@ -10,5 +10,6 @@ export { Analytics } from '../modules/analytics/client.js'; * client-only code. */ export { ConsentProvider, CookieBanner, CookieButton, useConsent, useConsentContext } from '../modules/consent/client.js'; export { Turnstile } from '../modules/turnstile/client.js'; +export { resolveFormMessage } from '../modules/notifications/resolveFormMessage.js'; //# sourceMappingURL=client.js.map \ No newline at end of file diff --git a/dist/exports/client.js.map b/dist/exports/client.js.map index 81f5c85..2ccf330 100644 --- a/dist/exports/client.js.map +++ b/dist/exports/client.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["'use client'\nexport { MaskedField } from '../globals/SiteIntegrations/components/MaskedField.js'\nexport { TestEmailButton } from '../globals/SiteIntegrations/components/TestEmailButton.js'\nexport { Analytics } from '../modules/analytics/client.js'\n/**\n * Entry point: ipal-kit/client\n *\n * Client-side ('use client') exports — React hooks, providers, and UI\n * components. Kept separate from the main entry so server bundles don't pull in\n * client-only code.\n */\nexport {\n ConsentProvider,\n CookieBanner,\n CookieButton,\n useConsent,\n useConsentContext,\n} from '../modules/consent/client.js'\nexport type { CookieBannerClassNames } from '../modules/consent/client.js'\nexport { Turnstile } from '../modules/turnstile/client.js'\nexport type { TurnstileProps } from '../modules/turnstile/client.js'\n"],"names":["MaskedField","TestEmailButton","Analytics","ConsentProvider","CookieBanner","CookieButton","useConsent","useConsentContext","Turnstile"],"mappings":"AAAA;AACA,SAASA,WAAW,QAAQ,wDAAuD;AACnF,SAASC,eAAe,QAAQ,4DAA2D;AAC3F,SAASC,SAAS,QAAQ,iCAAgC;AAC1D;;;;;;CAMC,GACD,SACEC,eAAe,EACfC,YAAY,EACZC,YAAY,EACZC,UAAU,EACVC,iBAAiB,QACZ,+BAA8B;AAErC,SAASC,SAAS,QAAQ,iCAAgC"} \ No newline at end of file +{"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["'use client'\nexport { MaskedField } from '../globals/SiteIntegrations/components/MaskedField.js'\nexport { TestEmailButton } from '../globals/SiteIntegrations/components/TestEmailButton.js'\nexport { Analytics } from '../modules/analytics/client.js'\n/**\n * Entry point: ipal-kit/client\n *\n * Client-side ('use client') exports — React hooks, providers, and UI\n * components. Kept separate from the main entry so server bundles don't pull in\n * client-only code.\n */\nexport {\n ConsentProvider,\n CookieBanner,\n CookieButton,\n useConsent,\n useConsentContext,\n} from '../modules/consent/client.js'\nexport type { CookieBannerClassNames } from '../modules/consent/client.js'\nexport { Turnstile } from '../modules/turnstile/client.js'\nexport type { TurnstileProps } from '../modules/turnstile/client.js'\n\nexport { resolveFormMessage } from '../modules/notifications/resolveFormMessage.js'\nexport type { FormNotificationTexts } from '../modules/notifications/types.js'\n"],"names":["MaskedField","TestEmailButton","Analytics","ConsentProvider","CookieBanner","CookieButton","useConsent","useConsentContext","Turnstile","resolveFormMessage"],"mappings":"AAAA;AACA,SAASA,WAAW,QAAQ,wDAAuD;AACnF,SAASC,eAAe,QAAQ,4DAA2D;AAC3F,SAASC,SAAS,QAAQ,iCAAgC;AAC1D;;;;;;CAMC,GACD,SACEC,eAAe,EACfC,YAAY,EACZC,YAAY,EACZC,UAAU,EACVC,iBAAiB,QACZ,+BAA8B;AAErC,SAASC,SAAS,QAAQ,iCAAgC;AAG1D,SAASC,kBAAkB,QAAQ,iDAAgD"} \ No newline at end of file diff --git a/dist/globals/SiteIntegrations/components/MaskedField.js b/dist/globals/SiteIntegrations/components/MaskedField.js index 615da66..2c34385 100644 --- a/dist/globals/SiteIntegrations/components/MaskedField.js +++ b/dist/globals/SiteIntegrations/components/MaskedField.js @@ -1,17 +1,26 @@ 'use client'; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; -import { useField } from '@payloadcms/ui'; import { useState } from 'react'; -export const MaskedField = ({ field, path })=>{ - const { setValue, value } = useField({ - path - }); +export const MaskedField = (props)=>{ + const { field, path, value: propValue, setValue: propSetValue, onChange: propOnChange } = props || {}; + const [internalValue, setInternalValue] = useState(propValue ?? ''); const [revealed, setRevealed] = useState(false); const label = typeof field?.label === 'string' ? field.label : field?.name ?? path; + const handleChange = (e)=>{ + const newVal = e.target.value; + setInternalValue(newVal); + if (typeof propSetValue === 'function') { + propSetValue(newVal); + } + if (typeof propOnChange === 'function') { + propOnChange(e); + } + }; + const currentValue = propValue !== undefined ? propValue : internalValue; return /*#__PURE__*/ _jsxs("div", { className: "field-type text", children: [ - /*#__PURE__*/ _jsx("label", { + label && /*#__PURE__*/ _jsx("label", { className: "field-label", children: label }), @@ -23,12 +32,12 @@ export const MaskedField = ({ field, path })=>{ children: [ /*#__PURE__*/ _jsx("input", { autoComplete: "off", - onChange: (e)=>setValue(e.target.value), + onChange: handleChange, style: { flex: 1 }, type: revealed ? 'text' : 'password', - value: value ?? '' + value: currentValue ?? '' }), /*#__PURE__*/ _jsx("button", { onClick: ()=>setRevealed((r)=>!r), diff --git a/dist/globals/SiteIntegrations/components/MaskedField.js.map b/dist/globals/SiteIntegrations/components/MaskedField.js.map index 9879ae7..f6b1869 100644 --- a/dist/globals/SiteIntegrations/components/MaskedField.js.map +++ b/dist/globals/SiteIntegrations/components/MaskedField.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../../src/globals/SiteIntegrations/components/MaskedField.tsx"],"sourcesContent":["'use client'\nimport type { TextFieldClientComponent } from 'payload'\n\nimport { useField } from '@payloadcms/ui'\nimport { useState } from 'react'\n\nexport const MaskedField: TextFieldClientComponent = ({ field, path }) => {\n const { setValue, value } = useField({ path })\n const [revealed, setRevealed] = useState(false)\n const label = typeof field?.label === 'string' ? field.label : (field?.name ?? path)\n\n return (\n
\n \n
\n setValue(e.target.value)}\n style={{ flex: 1 }}\n type={revealed ? 'text' : 'password'}\n value={value ?? ''}\n />\n \n
\n
\n )\n}\nexport default MaskedField\n"],"names":["useField","useState","MaskedField","field","path","setValue","value","revealed","setRevealed","label","name","div","className","style","display","gap","input","autoComplete","onChange","e","target","flex","type","button","onClick","r"],"mappings":"AAAA;;AAGA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,SAASC,QAAQ,QAAQ,QAAO;AAEhC,OAAO,MAAMC,cAAwC,CAAC,EAAEC,KAAK,EAAEC,IAAI,EAAE;IACnE,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAE,GAAGN,SAAiB;QAAEI;IAAK;IACpD,MAAM,CAACG,UAAUC,YAAY,GAAGP,SAAS;IACzC,MAAMQ,QAAQ,OAAON,OAAOM,UAAU,WAAWN,MAAMM,KAAK,GAAIN,OAAOO,QAAQN;IAE/E,qBACE,MAACO;QAAIC,WAAU;;0BACb,KAACH;gBAAMG,WAAU;0BAAeH;;0BAChC,MAACE;gBAAIE,OAAO;oBAAEC,SAAS;oBAAQC,KAAK;gBAAQ;;kCAC1C,KAACC;wBACCC,cAAa;wBACbC,UAAU,CAACC,IAAMd,SAASc,EAAEC,MAAM,CAACd,KAAK;wBACxCO,OAAO;4BAAEQ,MAAM;wBAAE;wBACjBC,MAAMf,WAAW,SAAS;wBAC1BD,OAAOA,SAAS;;kCAElB,KAACiB;wBAAOC,SAAS,IAAMhB,YAAY,CAACiB,IAAM,CAACA;wBAAIH,MAAK;kCACjDf,WAAW,SAAS;;;;;;AAK/B,EAAC;AACD,eAAeL,YAAW"} \ No newline at end of file +{"version":3,"sources":["../../../../src/globals/SiteIntegrations/components/MaskedField.tsx"],"sourcesContent":["'use client'\nimport type { TextFieldClientComponent } from 'payload'\nimport { useState } from 'react'\n\nexport const MaskedField: TextFieldClientComponent = (props: any) => {\n const { field, path, value: propValue, setValue: propSetValue, onChange: propOnChange } = props || {}\n const [internalValue, setInternalValue] = useState(propValue ?? '')\n const [revealed, setRevealed] = useState(false)\n const label = typeof field?.label === 'string' ? field.label : (field?.name ?? path)\n\n const handleChange = (e: React.ChangeEvent) => {\n const newVal = e.target.value\n setInternalValue(newVal)\n if (typeof propSetValue === 'function') {\n propSetValue(newVal)\n }\n if (typeof propOnChange === 'function') {\n propOnChange(e)\n }\n }\n\n const currentValue = propValue !== undefined ? propValue : internalValue\n\n return (\n
\n {label && }\n
\n \n \n
\n
\n )\n}\n\nexport default MaskedField\n"],"names":["useState","MaskedField","props","field","path","value","propValue","setValue","propSetValue","onChange","propOnChange","internalValue","setInternalValue","revealed","setRevealed","label","name","handleChange","e","newVal","target","currentValue","undefined","div","className","style","display","gap","input","autoComplete","flex","type","button","onClick","r"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,QAAQ,QAAO;AAEhC,OAAO,MAAMC,cAAwC,CAACC;IACpD,MAAM,EAAEC,KAAK,EAAEC,IAAI,EAAEC,OAAOC,SAAS,EAAEC,UAAUC,YAAY,EAAEC,UAAUC,YAAY,EAAE,GAAGR,SAAS,CAAC;IACpG,MAAM,CAACS,eAAeC,iBAAiB,GAAGZ,SAASM,aAAa;IAChE,MAAM,CAACO,UAAUC,YAAY,GAAGd,SAAS;IACzC,MAAMe,QAAQ,OAAOZ,OAAOY,UAAU,WAAWZ,MAAMY,KAAK,GAAIZ,OAAOa,QAAQZ;IAE/E,MAAMa,eAAe,CAACC;QACpB,MAAMC,SAASD,EAAEE,MAAM,CAACf,KAAK;QAC7BO,iBAAiBO;QACjB,IAAI,OAAOX,iBAAiB,YAAY;YACtCA,aAAaW;QACf;QACA,IAAI,OAAOT,iBAAiB,YAAY;YACtCA,aAAaQ;QACf;IACF;IAEA,MAAMG,eAAef,cAAcgB,YAAYhB,YAAYK;IAE3D,qBACE,MAACY;QAAIC,WAAU;;YACZT,uBAAS,KAACA;gBAAMS,WAAU;0BAAeT;;0BAC1C,MAACQ;gBAAIE,OAAO;oBAAEC,SAAS;oBAAQC,KAAK;gBAAQ;;kCAC1C,KAACC;wBACCC,cAAa;wBACbpB,UAAUQ;wBACVQ,OAAO;4BAAEK,MAAM;wBAAE;wBACjBC,MAAMlB,WAAW,SAAS;wBAC1BR,OAAOgB,gBAAgB;;kCAEzB,KAACW;wBAAOC,SAAS,IAAMnB,YAAY,CAACoB,IAAM,CAACA;wBAAIH,MAAK;kCACjDlB,WAAW,SAAS;;;;;;AAK/B,EAAC;AAED,eAAeZ,YAAW"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index a2ce705..e240888 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -31,5 +31,7 @@ export { buildHreflangAlternates, buildMetadata, composeTitle } from './modules/ export type { AutoFillMapping, RobotsRules, SitemapEntry } from './modules/seo/index.js'; export { buildAutoFillMetaHook, buildRobots, buildSitemapEntries, createMetadataGenerator, createPageMetadata, injectAutoFillMeta, } from './modules/seo/index.js'; export { buildSlugField, toSlug } from './modules/slug/index.js'; +export { NOTIFICATION_FALLBACK, getNotificationTexts, resolveFormMessage, } from './modules/notifications/index.js'; +export type { FormNotificationTexts, NotificationsData, NotificationTexts, } from './modules/notifications/index.js'; export { ipalKit } from './plugin.js'; export type { IpalOptions } from './types.js'; diff --git a/dist/index.js b/dist/index.js index 5c62ff9..40bc082 100644 --- a/dist/index.js +++ b/dist/index.js @@ -18,6 +18,7 @@ export { buildSecurityHeaders } from './modules/security/index.js'; export { buildHreflangAlternates, buildMetadata, composeTitle } from './modules/seo/index.js'; export { buildAutoFillMetaHook, buildRobots, buildSitemapEntries, createMetadataGenerator, createPageMetadata, injectAutoFillMeta } from './modules/seo/index.js'; export { buildSlugField, toSlug } from './modules/slug/index.js'; +export { NOTIFICATION_FALLBACK, getNotificationTexts, resolveFormMessage } from './modules/notifications/index.js'; export { ipalKit } from './plugin.js'; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 3de6f31..b62920e 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type { AccessOption, Role } from './modules/access/index.js'\nexport {\n adminOnly,\n adminOnlyField,\n adminOrEditor,\n adminOrEditorField,\n adminOrSelf,\n authenticated,\n hasMinimumRole,\n isAdmin,\n isEditor,\n requireRole,\n requireRoleField,\n ROLE_HIERARCHY,\n} from './modules/access/index.js'\nexport type { AnalyticsConfig } from './modules/analytics/index.js'\nexport { getAnalyticsConfig } from './modules/analytics/index.js'\nexport {\n ACCEPT_ALL_CONSENT,\n CONSENT_CATEGORIES,\n CONSENT_COOKIE,\n CONSENT_MAX_AGE,\n CONSENT_VERSION,\n DEFAULT_CONSENT,\n getConsentTexts,\n parseConsent,\n REJECT_ALL_CONSENT,\n serializeConsent,\n setDefaultConsent,\n updateConsent,\n} from './modules/consent/index.js'\nexport type { ConsentCategory, ConsentState, ConsentTexts } from './modules/consent/index.js'\nexport type {\n ContentCollectionOption,\n ContentOption,\n ResolvedRoute,\n} from './modules/content/index.js'\nexport {\n archiveFieldName,\n buildArchivePath,\n buildEntryPath,\n getArchiveEntries,\n parsePageParam,\n resolveRoute,\n} from './modules/content/index.js'\nexport type { ArchiveEntries } from './modules/content/index.js'\nexport { graphAdapter } from './modules/email/graphAdapter.js'\nexport type { GraphAdapterArgs } from './modules/email/graphAdapter.js'\nexport { mailAdapter } from './modules/email/mailAdapter.js'\nexport type { MailAdapterArgs } from './modules/email/mailAdapter.js'\n// Imported straight from the file, NOT from ./modules/email/index.js — that\n// barrel re-exports sendEmail, which imports 'server-only' and would crash when\n// Payload loads the config (or runs generate:importmap) as a plain Node script.\nexport { panelSmtpAdapter } from './modules/email/panelSmtpAdapter.js'\nexport type { PanelSmtpAdapterArgs } from './modules/email/panelSmtpAdapter.js'\nexport { buildFormsPlugin } from './modules/forms/formsPluginConfig.js'\nexport type {\n FormsCollectionOverrides,\n FormsFieldsOverride,\n FormsOption,\n} from './modules/forms/types.js'\nexport { createContentHelpers } from './modules/frontend/index.js'\nexport type { I18nConfig, LocaleDefinition, LocalizedSlugs } from './modules/i18n/index.js'\nexport {\n buildLocalizedPath,\n getDefaultLocale,\n getLocaleCodes,\n getLocaleDefinition,\n getLocalizedSlugs,\n isValidLocale,\n LOCALE_COOKIE_NAME,\n matchAcceptLanguage,\n negotiateLocale,\n switchLocalePath,\n} from './modules/i18n/index.js'\nexport type { LocaleMiddlewareResult } from './modules/i18n/index.js'\nexport { createLocaleMiddleware, DEFAULT_MIDDLEWARE_MATCHER } from './modules/i18n/index.js'\nexport type { PagesOption, SystemPageRole } from './modules/pages/index.js'\nexport { ALL_SYSTEM_PAGE_ROLES, getSystemPagePath } from './modules/pages/index.js'\nexport type { GlobalQueryOptions } from './modules/payload/index.js'\nexport {\n getGlobal,\n getSiteIntegrations,\n getSiteSettings,\n SITE_INTEGRATIONS_SLUG,\n SITE_SETTINGS_SLUG,\n} from './modules/payload/index.js'\nexport { buildSecurityHeaders } from './modules/security/index.js'\nexport type { BuildSecurityHeadersArgs, SecurityHeader } from './modules/security/index.js'\nexport type { PageMetadata, SeoMeta, SeoOption } from './modules/seo/index.js'\nexport { buildHreflangAlternates, buildMetadata, composeTitle } from './modules/seo/index.js'\nexport type { AutoFillMapping, RobotsRules, SitemapEntry } from './modules/seo/index.js'\nexport {\n buildAutoFillMetaHook,\n buildRobots,\n buildSitemapEntries,\n createMetadataGenerator,\n createPageMetadata,\n injectAutoFillMeta,\n} from './modules/seo/index.js'\nexport { buildSlugField, toSlug } from './modules/slug/index.js'\n\nexport { ipalKit } from './plugin.js'\nexport type { IpalOptions } from './types.js'\n\n\n"],"names":["adminOnly","adminOnlyField","adminOrEditor","adminOrEditorField","adminOrSelf","authenticated","hasMinimumRole","isAdmin","isEditor","requireRole","requireRoleField","ROLE_HIERARCHY","getAnalyticsConfig","ACCEPT_ALL_CONSENT","CONSENT_CATEGORIES","CONSENT_COOKIE","CONSENT_MAX_AGE","CONSENT_VERSION","DEFAULT_CONSENT","getConsentTexts","parseConsent","REJECT_ALL_CONSENT","serializeConsent","setDefaultConsent","updateConsent","archiveFieldName","buildArchivePath","buildEntryPath","getArchiveEntries","parsePageParam","resolveRoute","graphAdapter","mailAdapter","panelSmtpAdapter","buildFormsPlugin","createContentHelpers","buildLocalizedPath","getDefaultLocale","getLocaleCodes","getLocaleDefinition","getLocalizedSlugs","isValidLocale","LOCALE_COOKIE_NAME","matchAcceptLanguage","negotiateLocale","switchLocalePath","createLocaleMiddleware","DEFAULT_MIDDLEWARE_MATCHER","ALL_SYSTEM_PAGE_ROLES","getSystemPagePath","getGlobal","getSiteIntegrations","getSiteSettings","SITE_INTEGRATIONS_SLUG","SITE_SETTINGS_SLUG","buildSecurityHeaders","buildHreflangAlternates","buildMetadata","composeTitle","buildAutoFillMetaHook","buildRobots","buildSitemapEntries","createMetadataGenerator","createPageMetadata","injectAutoFillMeta","buildSlugField","toSlug","ipalKit"],"mappings":"AACA,SACEA,SAAS,EACTC,cAAc,EACdC,aAAa,EACbC,kBAAkB,EAClBC,WAAW,EACXC,aAAa,EACbC,cAAc,EACdC,OAAO,EACPC,QAAQ,EACRC,WAAW,EACXC,gBAAgB,EAChBC,cAAc,QACT,4BAA2B;AAElC,SAASC,kBAAkB,QAAQ,+BAA8B;AACjE,SACEC,kBAAkB,EAClBC,kBAAkB,EAClBC,cAAc,EACdC,eAAe,EACfC,eAAe,EACfC,eAAe,EACfC,eAAe,EACfC,YAAY,EACZC,kBAAkB,EAClBC,gBAAgB,EAChBC,iBAAiB,EACjBC,aAAa,QACR,6BAA4B;AAOnC,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,cAAc,EACdC,iBAAiB,EACjBC,cAAc,EACdC,YAAY,QACP,6BAA4B;AAEnC,SAASC,YAAY,QAAQ,kCAAiC;AAE9D,SAASC,WAAW,QAAQ,iCAAgC;AAE5D,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,SAASC,gBAAgB,QAAQ,sCAAqC;AAEtE,SAASC,gBAAgB,QAAQ,uCAAsC;AAMvE,SAASC,oBAAoB,QAAQ,8BAA6B;AAElE,SACEC,kBAAkB,EAClBC,gBAAgB,EAChBC,cAAc,EACdC,mBAAmB,EACnBC,iBAAiB,EACjBC,aAAa,EACbC,kBAAkB,EAClBC,mBAAmB,EACnBC,eAAe,EACfC,gBAAgB,QACX,0BAAyB;AAEhC,SAASC,sBAAsB,EAAEC,0BAA0B,QAAQ,0BAAyB;AAE5F,SAASC,qBAAqB,EAAEC,iBAAiB,QAAQ,2BAA0B;AAEnF,SACEC,SAAS,EACTC,mBAAmB,EACnBC,eAAe,EACfC,sBAAsB,EACtBC,kBAAkB,QACb,6BAA4B;AACnC,SAASC,oBAAoB,QAAQ,8BAA6B;AAGlE,SAASC,uBAAuB,EAAEC,aAAa,EAAEC,YAAY,QAAQ,yBAAwB;AAE7F,SACEC,qBAAqB,EACrBC,WAAW,EACXC,mBAAmB,EACnBC,uBAAuB,EACvBC,kBAAkB,EAClBC,kBAAkB,QACb,yBAAwB;AAC/B,SAASC,cAAc,EAAEC,MAAM,QAAQ,0BAAyB;AAEhE,SAASC,OAAO,QAAQ,cAAa"} \ No newline at end of file +{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type { AccessOption, Role } from './modules/access/index.js'\nexport {\n adminOnly,\n adminOnlyField,\n adminOrEditor,\n adminOrEditorField,\n adminOrSelf,\n authenticated,\n hasMinimumRole,\n isAdmin,\n isEditor,\n requireRole,\n requireRoleField,\n ROLE_HIERARCHY,\n} from './modules/access/index.js'\nexport type { AnalyticsConfig } from './modules/analytics/index.js'\nexport { getAnalyticsConfig } from './modules/analytics/index.js'\nexport {\n ACCEPT_ALL_CONSENT,\n CONSENT_CATEGORIES,\n CONSENT_COOKIE,\n CONSENT_MAX_AGE,\n CONSENT_VERSION,\n DEFAULT_CONSENT,\n getConsentTexts,\n parseConsent,\n REJECT_ALL_CONSENT,\n serializeConsent,\n setDefaultConsent,\n updateConsent,\n} from './modules/consent/index.js'\nexport type { ConsentCategory, ConsentState, ConsentTexts } from './modules/consent/index.js'\nexport type {\n ContentCollectionOption,\n ContentOption,\n ResolvedRoute,\n} from './modules/content/index.js'\nexport {\n archiveFieldName,\n buildArchivePath,\n buildEntryPath,\n getArchiveEntries,\n parsePageParam,\n resolveRoute,\n} from './modules/content/index.js'\nexport type { ArchiveEntries } from './modules/content/index.js'\nexport { graphAdapter } from './modules/email/graphAdapter.js'\nexport type { GraphAdapterArgs } from './modules/email/graphAdapter.js'\nexport { mailAdapter } from './modules/email/mailAdapter.js'\nexport type { MailAdapterArgs } from './modules/email/mailAdapter.js'\n// Imported straight from the file, NOT from ./modules/email/index.js — that\n// barrel re-exports sendEmail, which imports 'server-only' and would crash when\n// Payload loads the config (or runs generate:importmap) as a plain Node script.\nexport { panelSmtpAdapter } from './modules/email/panelSmtpAdapter.js'\nexport type { PanelSmtpAdapterArgs } from './modules/email/panelSmtpAdapter.js'\nexport { buildFormsPlugin } from './modules/forms/formsPluginConfig.js'\nexport type {\n FormsCollectionOverrides,\n FormsFieldsOverride,\n FormsOption,\n} from './modules/forms/types.js'\nexport { createContentHelpers } from './modules/frontend/index.js'\nexport type { I18nConfig, LocaleDefinition, LocalizedSlugs } from './modules/i18n/index.js'\nexport {\n buildLocalizedPath,\n getDefaultLocale,\n getLocaleCodes,\n getLocaleDefinition,\n getLocalizedSlugs,\n isValidLocale,\n LOCALE_COOKIE_NAME,\n matchAcceptLanguage,\n negotiateLocale,\n switchLocalePath,\n} from './modules/i18n/index.js'\nexport type { LocaleMiddlewareResult } from './modules/i18n/index.js'\nexport { createLocaleMiddleware, DEFAULT_MIDDLEWARE_MATCHER } from './modules/i18n/index.js'\nexport type { PagesOption, SystemPageRole } from './modules/pages/index.js'\nexport { ALL_SYSTEM_PAGE_ROLES, getSystemPagePath } from './modules/pages/index.js'\nexport type { GlobalQueryOptions } from './modules/payload/index.js'\nexport {\n getGlobal,\n getSiteIntegrations,\n getSiteSettings,\n SITE_INTEGRATIONS_SLUG,\n SITE_SETTINGS_SLUG,\n} from './modules/payload/index.js'\nexport { buildSecurityHeaders } from './modules/security/index.js'\nexport type { BuildSecurityHeadersArgs, SecurityHeader } from './modules/security/index.js'\nexport type { PageMetadata, SeoMeta, SeoOption } from './modules/seo/index.js'\nexport { buildHreflangAlternates, buildMetadata, composeTitle } from './modules/seo/index.js'\nexport type { AutoFillMapping, RobotsRules, SitemapEntry } from './modules/seo/index.js'\nexport {\n buildAutoFillMetaHook,\n buildRobots,\n buildSitemapEntries,\n createMetadataGenerator,\n createPageMetadata,\n injectAutoFillMeta,\n} from './modules/seo/index.js'\nexport { buildSlugField, toSlug } from './modules/slug/index.js'\nexport {\n NOTIFICATION_FALLBACK,\n getNotificationTexts,\n resolveFormMessage,\n} from './modules/notifications/index.js'\nexport type {\n FormNotificationTexts,\n NotificationsData,\n NotificationTexts,\n} from './modules/notifications/index.js'\n\nexport { ipalKit } from './plugin.js'\nexport type { IpalOptions } from './types.js'\n\n\n"],"names":["adminOnly","adminOnlyField","adminOrEditor","adminOrEditorField","adminOrSelf","authenticated","hasMinimumRole","isAdmin","isEditor","requireRole","requireRoleField","ROLE_HIERARCHY","getAnalyticsConfig","ACCEPT_ALL_CONSENT","CONSENT_CATEGORIES","CONSENT_COOKIE","CONSENT_MAX_AGE","CONSENT_VERSION","DEFAULT_CONSENT","getConsentTexts","parseConsent","REJECT_ALL_CONSENT","serializeConsent","setDefaultConsent","updateConsent","archiveFieldName","buildArchivePath","buildEntryPath","getArchiveEntries","parsePageParam","resolveRoute","graphAdapter","mailAdapter","panelSmtpAdapter","buildFormsPlugin","createContentHelpers","buildLocalizedPath","getDefaultLocale","getLocaleCodes","getLocaleDefinition","getLocalizedSlugs","isValidLocale","LOCALE_COOKIE_NAME","matchAcceptLanguage","negotiateLocale","switchLocalePath","createLocaleMiddleware","DEFAULT_MIDDLEWARE_MATCHER","ALL_SYSTEM_PAGE_ROLES","getSystemPagePath","getGlobal","getSiteIntegrations","getSiteSettings","SITE_INTEGRATIONS_SLUG","SITE_SETTINGS_SLUG","buildSecurityHeaders","buildHreflangAlternates","buildMetadata","composeTitle","buildAutoFillMetaHook","buildRobots","buildSitemapEntries","createMetadataGenerator","createPageMetadata","injectAutoFillMeta","buildSlugField","toSlug","NOTIFICATION_FALLBACK","getNotificationTexts","resolveFormMessage","ipalKit"],"mappings":"AACA,SACEA,SAAS,EACTC,cAAc,EACdC,aAAa,EACbC,kBAAkB,EAClBC,WAAW,EACXC,aAAa,EACbC,cAAc,EACdC,OAAO,EACPC,QAAQ,EACRC,WAAW,EACXC,gBAAgB,EAChBC,cAAc,QACT,4BAA2B;AAElC,SAASC,kBAAkB,QAAQ,+BAA8B;AACjE,SACEC,kBAAkB,EAClBC,kBAAkB,EAClBC,cAAc,EACdC,eAAe,EACfC,eAAe,EACfC,eAAe,EACfC,eAAe,EACfC,YAAY,EACZC,kBAAkB,EAClBC,gBAAgB,EAChBC,iBAAiB,EACjBC,aAAa,QACR,6BAA4B;AAOnC,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,cAAc,EACdC,iBAAiB,EACjBC,cAAc,EACdC,YAAY,QACP,6BAA4B;AAEnC,SAASC,YAAY,QAAQ,kCAAiC;AAE9D,SAASC,WAAW,QAAQ,iCAAgC;AAE5D,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,SAASC,gBAAgB,QAAQ,sCAAqC;AAEtE,SAASC,gBAAgB,QAAQ,uCAAsC;AAMvE,SAASC,oBAAoB,QAAQ,8BAA6B;AAElE,SACEC,kBAAkB,EAClBC,gBAAgB,EAChBC,cAAc,EACdC,mBAAmB,EACnBC,iBAAiB,EACjBC,aAAa,EACbC,kBAAkB,EAClBC,mBAAmB,EACnBC,eAAe,EACfC,gBAAgB,QACX,0BAAyB;AAEhC,SAASC,sBAAsB,EAAEC,0BAA0B,QAAQ,0BAAyB;AAE5F,SAASC,qBAAqB,EAAEC,iBAAiB,QAAQ,2BAA0B;AAEnF,SACEC,SAAS,EACTC,mBAAmB,EACnBC,eAAe,EACfC,sBAAsB,EACtBC,kBAAkB,QACb,6BAA4B;AACnC,SAASC,oBAAoB,QAAQ,8BAA6B;AAGlE,SAASC,uBAAuB,EAAEC,aAAa,EAAEC,YAAY,QAAQ,yBAAwB;AAE7F,SACEC,qBAAqB,EACrBC,WAAW,EACXC,mBAAmB,EACnBC,uBAAuB,EACvBC,kBAAkB,EAClBC,kBAAkB,QACb,yBAAwB;AAC/B,SAASC,cAAc,EAAEC,MAAM,QAAQ,0BAAyB;AAChE,SACEC,qBAAqB,EACrBC,oBAAoB,EACpBC,kBAAkB,QACb,mCAAkC;AAOzC,SAASC,OAAO,QAAQ,cAAa"} \ No newline at end of file diff --git a/dist/modules/email/graphAdapter.js b/dist/modules/email/graphAdapter.js index dc9b3ea..6932988 100644 --- a/dist/modules/email/graphAdapter.js +++ b/dist/modules/email/graphAdapter.js @@ -89,10 +89,18 @@ import { getSiteIntegrations } from '../payload/index.js'; sent: false }; } - // From-display comes from the panel; falls back to the caller's from. + // The panel's from-address is used as Reply-To, NOT as the message From. + // + // Why: app-only Graph sends from GRAPH_SENDER's mailbox. If we also set a + // `from` that differs from that mailbox, Exchange demands "Send As" + // permission on it and rejects with ErrorSendAsDenied otherwise. So we + // never override `from` — Graph stamps the mail as GRAPH_SENDER (the + // mailbox we legitimately own) — and route replies to the panel address + // via Reply-To. Recipients see the mail from forms@… but replying reaches + // the real destination. No Send-As needed. const panel = await getSiteIntegrations(payload); - const fromAddress = panel.smtpFromAddress || undefined; - const fromName = panel.smtpFromName || undefined; + const replyToAddress = panel.smtpFromAddress || undefined; + const replyToName = panel.smtpFromName || undefined; const to = toRecipients(message.to); if (to.length === 0) { payload.logger.error('[ipal] Email not sent: no valid recipient.'); @@ -104,6 +112,17 @@ import { getSiteIntegrations } from '../payload/index.js'; // Graph accepts either HTML or Text; Payload gives us html and/or text. const isHtml = typeof message.html === 'string' && message.html.length > 0; const content = isHtml ? String(message.html) : String(message.text ?? ''); + // Reply-To: prefer whatever the caller set; otherwise the panel address. + const replyTo = message.replyTo ? toRecipients(message.replyTo) : replyToAddress ? [ + { + emailAddress: { + address: replyToAddress, + ...replyToName ? { + name: replyToName + } : {} + } + } + ] : []; const graphMessage = { body: { content, @@ -117,21 +136,9 @@ import { getSiteIntegrations } from '../payload/index.js'; ...message.bcc ? { bccRecipients: toRecipients(message.bcc) } : {}, - // from is only honoured if the app has Send-As for that address; when - // it's the shared mailbox itself, omit it and Graph uses the sender. - ...fromAddress ? { - from: { - emailAddress: { - address: fromAddress, - ...fromName ? { - name: fromName - } : {} - } - } - } : {}, - // replyTo lets the recipient reply to the real submitter if the caller set it. - ...message.replyTo ? { - replyTo: toRecipients(message.replyTo) + // NO `from` — Graph uses GRAPH_SENDER's own mailbox, so no Send-As. + ...replyTo.length > 0 ? { + replyTo } : {} }; try { diff --git a/dist/modules/email/graphAdapter.js.map b/dist/modules/email/graphAdapter.js.map index c584f44..17f5ba4 100644 --- a/dist/modules/email/graphAdapter.js.map +++ b/dist/modules/email/graphAdapter.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/modules/email/graphAdapter.ts"],"sourcesContent":["import type { PayloadEmailAdapter, SendEmailOptions } from 'payload'\n\nimport { getSiteIntegrations } from '../payload/index.js'\n\n/**\n * From/To settings the adapter reads from SiteIntegrations (panel). The Graph\n * CREDENTIALS themselves are NOT here — they're agency secrets in env vars\n * (this is *our* Exchange, shared across projects), read below from process.env.\n * The panel only controls the display-from and where submissions land.\n */\ntype GraphIntegrations = {\n /**\n * Display From — reused from the existing SMTP fields, because the sender\n * label is the same concept regardless of transport (SMTP or Graph). No new\n * panel field needed; whatever the editor set as the from-address applies.\n */\n smtpFromAddress?: null | string\n smtpFromName?: null | string\n}\n\nexport type GraphAdapterArgs = {\n fallbackFromAddress?: string\n fallbackFromName?: string\n}\n\ntype GraphEnv = {\n clientId: string\n clientSecret: string\n sender: string\n tenantId: string\n}\n\n/** Reads + validates the agency Graph credentials from env. */\nfunction readGraphEnv(): GraphEnv | null {\n const tenantId = process.env.GRAPH_TENANT_ID\n const clientId = process.env.GRAPH_CLIENT_ID\n const clientSecret = process.env.GRAPH_CLIENT_SECRET\n const sender = process.env.GRAPH_SENDER\n if (!tenantId || !clientId || !clientSecret || !sender) {return null}\n return { clientId, clientSecret, sender, tenantId }\n}\n\n/**\n * Fetches an app-only access token via the OAuth2 client-credentials flow.\n * Scope MUST be '.../.default' — passing 'Mail.Send' directly is rejected\n * (AADSTS1002012). Tokens last ~1h; we fetch per send for simplicity and to\n * avoid holding state in a possibly multi-instance deployment. If you send at\n * high volume, cache by expiry.\n */\nasync function getAccessToken(env: GraphEnv): Promise {\n const url = `https://login.microsoftonline.com/${env.tenantId}/oauth2/v2.0/token`\n const body = new URLSearchParams({\n client_id: env.clientId,\n client_secret: env.clientSecret,\n grant_type: 'client_credentials',\n scope: 'https://graph.microsoft.com/.default',\n })\n\n const res = await fetch(url, {\n body,\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n method: 'POST',\n })\n if (!res.ok) {\n const detail = await res.text()\n throw new Error(`Graph token request failed (${res.status}): ${detail}`)\n }\n const data = (await res.json()) as { access_token?: string }\n if (!data.access_token) {throw new Error('Graph token response had no access_token')}\n return data.access_token\n}\n\n/** Normalizes Payload's to/cc (string | string[] | Address[]) into Graph recipients. */\nfunction toRecipients(value: SendEmailOptions['to']): { emailAddress: { address: string } }[] {\n if (!value) {return []}\n const list = Array.isArray(value) ? value : [value]\n return list\n .map((v) => (typeof v === 'string' ? v : (v as { address?: string }).address))\n .filter((a): a is string => typeof a === 'string' && a.length > 0)\n .map((address) => ({ emailAddress: { address } }))\n}\n\n/**\n * Payload email adapter that sends through Microsoft Graph (our Exchange),\n * using app-only client-credentials auth. Drop-in alternative to\n * panelSmtpAdapter — same PayloadEmailAdapter contract, so payload.sendEmail\n * and the form-builder's submission emails work unchanged.\n *\n * Split of configuration (deliberate):\n * - Graph credentials (tenant/client/secret/sender) = AGENCY secrets, from env.\n * The client never sees or sets them — it's our Exchange, one mailbox\n * (GRAPH_SENDER, e.g. forms@intecion.pl) for every project.\n * - From-display + recipient = per-project, from the panel (SiteIntegrations),\n * so an editor controls how the mail is labelled and where it lands.\n *\n * Wiring: email: process.env.GRAPH_CLIENT_ID ? graphAdapter() : panelSmtpAdapter()\n *\n * Azure setup (one-time, our side): App registration → Mail.Send APPLICATION\n * permission → admin consent → in Exchange, grant the app \"Send As\" on the\n * shared mailbox GRAPH_SENDER.\n */\nexport const graphAdapter =\n (args: GraphAdapterArgs = {}): PayloadEmailAdapter =>\n ({ payload }) => ({\n name: 'ipal-graph',\n defaultFromAddress: args.fallbackFromAddress ?? 'noreply@localhost',\n defaultFromName: args.fallbackFromName ?? 'Website',\n\n sendEmail: async (message: SendEmailOptions) => {\n const env = readGraphEnv()\n if (!env) {\n payload.logger.error(\n '[ipal] Email not sent: Graph is not configured. Set GRAPH_TENANT_ID, GRAPH_CLIENT_ID, GRAPH_CLIENT_SECRET, GRAPH_SENDER.',\n )\n return { error: 'Graph is not configured (missing env vars).', sent: false }\n }\n\n // From-display comes from the panel; falls back to the caller's from.\n const panel = await getSiteIntegrations(payload)\n const fromAddress = panel.smtpFromAddress || undefined\n const fromName = panel.smtpFromName || undefined\n\n const to = toRecipients(message.to)\n if (to.length === 0) {\n payload.logger.error('[ipal] Email not sent: no valid recipient.')\n return { error: 'No valid recipient.', sent: false }\n }\n\n // Graph accepts either HTML or Text; Payload gives us html and/or text.\n const isHtml = typeof message.html === 'string' && message.html.length > 0\n const content = isHtml ? String(message.html) : String(message.text ?? '')\n\n const graphMessage: Record = {\n body: { content, contentType: isHtml ? 'HTML' : 'Text' },\n subject: message.subject ?? '',\n toRecipients: to,\n ...(message.cc ? { ccRecipients: toRecipients(message.cc) } : {}),\n ...(message.bcc ? { bccRecipients: toRecipients(message.bcc) } : {}),\n // from is only honoured if the app has Send-As for that address; when\n // it's the shared mailbox itself, omit it and Graph uses the sender.\n ...(fromAddress\n ? {\n from: {\n emailAddress: { address: fromAddress, ...(fromName ? { name: fromName } : {}) },\n },\n }\n : {}),\n // replyTo lets the recipient reply to the real submitter if the caller set it.\n ...(message.replyTo\n ? { replyTo: toRecipients(message.replyTo as SendEmailOptions['to']) }\n : {}),\n }\n\n try {\n const token = await getAccessToken(env)\n // App-only: MUST target /users/{sender}, never /me.\n const res = await fetch(\n `https://graph.microsoft.com/v1.0/users/${encodeURIComponent(env.sender)}/sendMail`,\n {\n body: JSON.stringify({ message: graphMessage, saveToSentItems: false }),\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n // sendMail returns 202 Accepted with an empty body on success.\n if (res.status === 202) {\n return { sent: true }\n }\n const detail = await res.text()\n payload.logger.error(`[ipal] Graph sendMail failed (${res.status}): ${detail}`)\n return { error: `Graph sendMail failed (${res.status}).`, sent: false }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n payload.logger.error(`[ipal] Graph send error: ${msg}`)\n return { error: 'Graph send error.', sent: false }\n }\n },\n })\n"],"names":["getSiteIntegrations","readGraphEnv","tenantId","process","env","GRAPH_TENANT_ID","clientId","GRAPH_CLIENT_ID","clientSecret","GRAPH_CLIENT_SECRET","sender","GRAPH_SENDER","getAccessToken","url","body","URLSearchParams","client_id","client_secret","grant_type","scope","res","fetch","headers","method","ok","detail","text","Error","status","data","json","access_token","toRecipients","value","list","Array","isArray","map","v","address","filter","a","length","emailAddress","graphAdapter","args","payload","name","defaultFromAddress","fallbackFromAddress","defaultFromName","fallbackFromName","sendEmail","message","logger","error","sent","panel","fromAddress","smtpFromAddress","undefined","fromName","smtpFromName","to","isHtml","html","content","String","graphMessage","contentType","subject","cc","ccRecipients","bcc","bccRecipients","from","replyTo","token","encodeURIComponent","JSON","stringify","saveToSentItems","Authorization","err","msg"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["../../../src/modules/email/graphAdapter.ts"],"sourcesContent":["import type { PayloadEmailAdapter, SendEmailOptions } from 'payload'\n\nimport { getSiteIntegrations } from '../payload/index.js'\n\n/**\n * From/To settings the adapter reads from SiteIntegrations (panel). The Graph\n * CREDENTIALS themselves are NOT here — they're agency secrets in env vars\n * (this is *our* Exchange, shared across projects), read below from process.env.\n * The panel only controls the display-from and where submissions land.\n */\ntype GraphIntegrations = {\n /**\n * Display From — reused from the existing SMTP fields, because the sender\n * label is the same concept regardless of transport (SMTP or Graph). No new\n * panel field needed; whatever the editor set as the from-address applies.\n */\n smtpFromAddress?: null | string\n smtpFromName?: null | string\n}\n\nexport type GraphAdapterArgs = {\n fallbackFromAddress?: string\n fallbackFromName?: string\n}\n\ntype GraphEnv = {\n clientId: string\n clientSecret: string\n sender: string\n tenantId: string\n}\n\n/** Reads + validates the agency Graph credentials from env. */\nfunction readGraphEnv(): GraphEnv | null {\n const tenantId = process.env.GRAPH_TENANT_ID\n const clientId = process.env.GRAPH_CLIENT_ID\n const clientSecret = process.env.GRAPH_CLIENT_SECRET\n const sender = process.env.GRAPH_SENDER\n if (!tenantId || !clientId || !clientSecret || !sender) {return null}\n return { clientId, clientSecret, sender, tenantId }\n}\n\n/**\n * Fetches an app-only access token via the OAuth2 client-credentials flow.\n * Scope MUST be '.../.default' — passing 'Mail.Send' directly is rejected\n * (AADSTS1002012). Tokens last ~1h; we fetch per send for simplicity and to\n * avoid holding state in a possibly multi-instance deployment. If you send at\n * high volume, cache by expiry.\n */\nasync function getAccessToken(env: GraphEnv): Promise {\n const url = `https://login.microsoftonline.com/${env.tenantId}/oauth2/v2.0/token`\n const body = new URLSearchParams({\n client_id: env.clientId,\n client_secret: env.clientSecret,\n grant_type: 'client_credentials',\n scope: 'https://graph.microsoft.com/.default',\n })\n\n const res = await fetch(url, {\n body,\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n method: 'POST',\n })\n if (!res.ok) {\n const detail = await res.text()\n throw new Error(`Graph token request failed (${res.status}): ${detail}`)\n }\n const data = (await res.json()) as { access_token?: string }\n if (!data.access_token) {throw new Error('Graph token response had no access_token')}\n return data.access_token\n}\n\n/** Normalizes Payload's to/cc (string | string[] | Address[]) into Graph recipients. */\nfunction toRecipients(value: SendEmailOptions['to']): { emailAddress: { address: string } }[] {\n if (!value) {return []}\n const list = Array.isArray(value) ? value : [value]\n return list\n .map((v) => (typeof v === 'string' ? v : (v as { address?: string }).address))\n .filter((a): a is string => typeof a === 'string' && a.length > 0)\n .map((address) => ({ emailAddress: { address } }))\n}\n\n/**\n * Payload email adapter that sends through Microsoft Graph (our Exchange),\n * using app-only client-credentials auth. Drop-in alternative to\n * panelSmtpAdapter — same PayloadEmailAdapter contract, so payload.sendEmail\n * and the form-builder's submission emails work unchanged.\n *\n * Split of configuration (deliberate):\n * - Graph credentials (tenant/client/secret/sender) = AGENCY secrets, from env.\n * The client never sees or sets them — it's our Exchange, one mailbox\n * (GRAPH_SENDER, e.g. forms@intecion.pl) for every project.\n * - From-display + recipient = per-project, from the panel (SiteIntegrations),\n * so an editor controls how the mail is labelled and where it lands.\n *\n * Wiring: email: process.env.GRAPH_CLIENT_ID ? graphAdapter() : panelSmtpAdapter()\n *\n * Azure setup (one-time, our side): App registration → Mail.Send APPLICATION\n * permission → admin consent → in Exchange, grant the app \"Send As\" on the\n * shared mailbox GRAPH_SENDER.\n */\nexport const graphAdapter =\n (args: GraphAdapterArgs = {}): PayloadEmailAdapter =>\n ({ payload }) => ({\n name: 'ipal-graph',\n defaultFromAddress: args.fallbackFromAddress ?? 'noreply@localhost',\n defaultFromName: args.fallbackFromName ?? 'Website',\n\n sendEmail: async (message: SendEmailOptions) => {\n const env = readGraphEnv()\n if (!env) {\n payload.logger.error(\n '[ipal] Email not sent: Graph is not configured. Set GRAPH_TENANT_ID, GRAPH_CLIENT_ID, GRAPH_CLIENT_SECRET, GRAPH_SENDER.',\n )\n return { error: 'Graph is not configured (missing env vars).', sent: false }\n }\n\n // The panel's from-address is used as Reply-To, NOT as the message From.\n //\n // Why: app-only Graph sends from GRAPH_SENDER's mailbox. If we also set a\n // `from` that differs from that mailbox, Exchange demands \"Send As\"\n // permission on it and rejects with ErrorSendAsDenied otherwise. So we\n // never override `from` — Graph stamps the mail as GRAPH_SENDER (the\n // mailbox we legitimately own) — and route replies to the panel address\n // via Reply-To. Recipients see the mail from forms@… but replying reaches\n // the real destination. No Send-As needed.\n const panel = await getSiteIntegrations(payload)\n const replyToAddress = panel.smtpFromAddress || undefined\n const replyToName = panel.smtpFromName || undefined\n\n const to = toRecipients(message.to)\n if (to.length === 0) {\n payload.logger.error('[ipal] Email not sent: no valid recipient.')\n return { error: 'No valid recipient.', sent: false }\n }\n\n // Graph accepts either HTML or Text; Payload gives us html and/or text.\n const isHtml = typeof message.html === 'string' && message.html.length > 0\n const content = isHtml ? String(message.html) : String(message.text ?? '')\n\n // Reply-To: prefer whatever the caller set; otherwise the panel address.\n const replyTo = message.replyTo\n ? toRecipients(message.replyTo as SendEmailOptions['to'])\n : replyToAddress\n ? [\n {\n emailAddress: {\n address: replyToAddress,\n ...(replyToName ? { name: replyToName } : {}),\n },\n },\n ]\n : []\n\n const graphMessage: Record = {\n body: { content, contentType: isHtml ? 'HTML' : 'Text' },\n subject: message.subject ?? '',\n toRecipients: to,\n ...(message.cc ? { ccRecipients: toRecipients(message.cc) } : {}),\n ...(message.bcc ? { bccRecipients: toRecipients(message.bcc) } : {}),\n // NO `from` — Graph uses GRAPH_SENDER's own mailbox, so no Send-As.\n ...(replyTo.length > 0 ? { replyTo } : {}),\n }\n\n try {\n const token = await getAccessToken(env)\n // App-only: MUST target /users/{sender}, never /me.\n const res = await fetch(\n `https://graph.microsoft.com/v1.0/users/${encodeURIComponent(env.sender)}/sendMail`,\n {\n body: JSON.stringify({ message: graphMessage, saveToSentItems: false }),\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n // sendMail returns 202 Accepted with an empty body on success.\n if (res.status === 202) {\n return { sent: true }\n }\n const detail = await res.text()\n payload.logger.error(`[ipal] Graph sendMail failed (${res.status}): ${detail}`)\n return { error: `Graph sendMail failed (${res.status}).`, sent: false }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n payload.logger.error(`[ipal] Graph send error: ${msg}`)\n return { error: 'Graph send error.', sent: false }\n }\n },\n })\n"],"names":["getSiteIntegrations","readGraphEnv","tenantId","process","env","GRAPH_TENANT_ID","clientId","GRAPH_CLIENT_ID","clientSecret","GRAPH_CLIENT_SECRET","sender","GRAPH_SENDER","getAccessToken","url","body","URLSearchParams","client_id","client_secret","grant_type","scope","res","fetch","headers","method","ok","detail","text","Error","status","data","json","access_token","toRecipients","value","list","Array","isArray","map","v","address","filter","a","length","emailAddress","graphAdapter","args","payload","name","defaultFromAddress","fallbackFromAddress","defaultFromName","fallbackFromName","sendEmail","message","logger","error","sent","panel","replyToAddress","smtpFromAddress","undefined","replyToName","smtpFromName","to","isHtml","html","content","String","replyTo","graphMessage","contentType","subject","cc","ccRecipients","bcc","bccRecipients","token","encodeURIComponent","JSON","stringify","saveToSentItems","Authorization","err","msg"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 16e3339..60a7fdc 100644 --- a/package.json +++ b/package.json @@ -65,22 +65,22 @@ "slugify": "^1.6.6" }, "peerDependencies": { - "@payloadcms/plugin-form-builder": "^3.84.1", - "@payloadcms/plugin-seo": "^3.84.1", + "@payloadcms/plugin-form-builder": "^3.88.0", + "@payloadcms/plugin-seo": "^3.88.0", "next": ">=15", - "payload": "^3.84.1", + "payload": "^3.88.0", "react": "^19.0.0" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", - "@payloadcms/db-postgres": "3.84.1", - "@payloadcms/db-sqlite": "3.84.1", + "@payloadcms/db-postgres": "3.88.0", + "@payloadcms/db-sqlite": "3.88.0", "@payloadcms/eslint-config": "3.28.0", - "@payloadcms/next": "3.84.1", - "@payloadcms/plugin-form-builder": "3.84.1", - "@payloadcms/plugin-seo": "3.84.1", - "@payloadcms/richtext-lexical": "3.84.1", - "@payloadcms/ui": "3.84.1", + "@payloadcms/next": "3.88.0", + "@payloadcms/plugin-form-builder": "3.88.0", + "@payloadcms/plugin-seo": "3.88.0", + "@payloadcms/richtext-lexical": "3.88.0", + "@payloadcms/ui": "3.88.0", "@playwright/test": "1.58.2", "@swc-node/register": "1.10.9", "@swc/cli": "0.6.0", @@ -96,7 +96,7 @@ "mongodb-memory-server": "10.1.4", "next": "16.2.6", "open": "^10.1.0", - "payload": "3.84.1", + "payload": "3.88.0", "prettier": "^3.4.2", "qs-esm": "8.0.1", "react": "19.2.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6140011..3c2dd3e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: dependencies: - '@intecion/ipal-kit': - specifier: git+https://github.com/rasm-its/ipal-kit.git - version: git+https://github.com/rasm-its/ipal-kit.git#84db3be40cb8d46ca4b85e459e138f868bc5010f(@payloadcms/plugin-form-builder@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3))(@payloadcms/plugin-seo@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3))(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react@19.2.6) lucide-react: specifier: ^0.400.0 version: 0.400.0(react@19.2.6) @@ -28,29 +25,29 @@ importers: specifier: ^3.2.0 version: 3.3.5 '@payloadcms/db-postgres': - specifier: 3.84.1 - version: 3.84.1(@libsql/client@0.14.0)(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3)) + specifier: 3.88.0 + version: 3.88.0(@libsql/client@0.14.0)(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3)) '@payloadcms/db-sqlite': - specifier: 3.84.1 - version: 3.84.1(@types/pg@8.20.0)(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0) + specifier: 3.88.0 + version: 3.88.0(@types/pg@8.20.0)(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0) '@payloadcms/eslint-config': specifier: 3.28.0 version: 3.28.0(@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@9.39.4)(typescript@5.7.3))(eslint@9.39.4)(typescript@5.7.3))(ts-api-utils@2.5.0(typescript@5.7.3)) '@payloadcms/next': - specifier: 3.84.1 - version: 3.84.1(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) + specifier: 3.88.0 + version: 3.88.0(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) '@payloadcms/plugin-form-builder': - specifier: 3.84.1 - version: 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) + specifier: 3.88.0 + version: 3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) '@payloadcms/plugin-seo': - specifier: 3.84.1 - version: 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) + specifier: 3.88.0 + version: 3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) '@payloadcms/richtext-lexical': - specifier: 3.84.1 - version: 3.84.1(@faceless-ui/modal@3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@payloadcms/next@3.84.1(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3))(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)(yjs@13.6.31) + specifier: 3.88.0 + version: 3.88.0(@faceless-ui/modal@3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@payloadcms/next@3.88.0(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3))(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)(yjs@13.6.31) '@payloadcms/ui': - specifier: 3.84.1 - version: 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) + specifier: 3.88.0 + version: 3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) '@playwright/test': specifier: 1.58.2 version: 1.58.2 @@ -97,8 +94,8 @@ importers: specifier: ^10.1.0 version: 10.2.0 payload: - specifier: 3.84.1 - version: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + specifier: 3.88.0 + version: 3.88.0(graphql@16.14.2)(typescript@5.7.3) prettier: specifier: ^3.4.2 version: 3.9.4 @@ -125,10 +122,10 @@ importers: version: 5.7.3 vite-tsconfig-paths: specifier: 6.0.5 - version: 6.0.5(typescript@5.7.3)(vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.21.0)) + version: 6.0.5(typescript@5.7.3)(vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.22.4)) vitest: specifier: 4.0.18 - version: 4.0.18(@types/node@22.19.9)(happy-dom@20.10.6)(sass@1.77.4)(tsx@4.21.0) + version: 4.0.18(@types/node@22.19.9)(happy-dom@20.10.6)(sass@1.77.4)(tsx@4.22.4) packages: @@ -305,11 +302,11 @@ packages: '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - deprecated: 'Merged into tsx: https://tsx.is' + deprecated: 'Merged into tsx: https://tsx.hirok.io' '@esbuild-kit/esm-loader@2.6.5': resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - deprecated: 'Merged into tsx: https://tsx.is' + deprecated: 'Merged into tsx: https://tsx.hirok.io' '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} @@ -317,12 +314,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.28.1': resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} @@ -341,12 +332,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.28.1': resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} engines: {node: '>=18'} @@ -365,12 +350,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.28.1': resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} engines: {node: '>=18'} @@ -389,12 +368,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.28.1': resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} engines: {node: '>=18'} @@ -413,12 +386,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.28.1': resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} engines: {node: '>=18'} @@ -437,12 +404,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.28.1': resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} engines: {node: '>=18'} @@ -461,12 +422,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.28.1': resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} engines: {node: '>=18'} @@ -485,12 +440,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.28.1': resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} engines: {node: '>=18'} @@ -509,12 +458,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.28.1': resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} engines: {node: '>=18'} @@ -533,12 +476,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.28.1': resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} engines: {node: '>=18'} @@ -557,12 +494,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.28.1': resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} engines: {node: '>=18'} @@ -581,12 +512,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.28.1': resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} engines: {node: '>=18'} @@ -605,12 +530,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.28.1': resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} engines: {node: '>=18'} @@ -629,12 +548,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.28.1': resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} engines: {node: '>=18'} @@ -653,12 +566,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.28.1': resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} engines: {node: '>=18'} @@ -677,12 +584,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.28.1': resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} engines: {node: '>=18'} @@ -701,12 +602,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.28.1': resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} engines: {node: '>=18'} @@ -719,12 +614,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.28.1': resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} engines: {node: '>=18'} @@ -743,12 +632,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.28.1': resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} engines: {node: '>=18'} @@ -761,12 +644,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.28.1': resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} engines: {node: '>=18'} @@ -785,12 +662,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.28.1': resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} engines: {node: '>=18'} @@ -803,12 +674,6 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.28.1': resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} engines: {node: '>=18'} @@ -827,12 +692,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.28.1': resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} engines: {node: '>=18'} @@ -851,12 +710,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.28.1': resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} engines: {node: '>=18'} @@ -875,12 +728,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.28.1': resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} engines: {node: '>=18'} @@ -899,12 +746,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.28.1': resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} engines: {node: '>=18'} @@ -1348,17 +1189,6 @@ packages: cpu: [x64] os: [win32] - '@intecion/ipal-kit@git+https://github.com/rasm-its/ipal-kit.git#84db3be40cb8d46ca4b85e459e138f868bc5010f': - resolution: {commit: 84db3be40cb8d46ca4b85e459e138f868bc5010f, repo: https://github.com/rasm-its/ipal-kit.git, type: git} - version: 1.0.0 - engines: {node: ^18.20.2 || >=20.9.0, pnpm: ^9 || ^10 || ^11} - peerDependencies: - '@payloadcms/plugin-form-builder': ^3.84.1 - '@payloadcms/plugin-seo': ^3.84.1 - next: '>=15' - payload: ^3.84.1 - react: ^19.0.0 - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1780,20 +1610,20 @@ packages: cpu: [x64] os: [win32] - '@payloadcms/db-postgres@3.84.1': - resolution: {integrity: sha512-/r1+7k58529ziTwqzySXsZb4x3FcfQIQH8R6gXLM3bTU9JA8wfLBraIgSyVKl6B3p+/EQYcaQ1DUlfrzVRxo1A==} + '@payloadcms/db-postgres@3.88.0': + resolution: {integrity: sha512-uP2b3yH8MulguWSH7j8vJaFX3ols4fVKPtsvZ49XQvDsafBAAUZjc1aCldo1ozoVfhC46tx4pv0ovtHQc8zdcA==} peerDependencies: - payload: 3.84.1 + payload: 3.88.0 - '@payloadcms/db-sqlite@3.84.1': - resolution: {integrity: sha512-OJWXMaq4XvBeXwummIo6RcpPM4eCpksTw+l1XX9xYhGumyh/Jw1INkNQ3a6SoLncxJvPAq6pqiYVPBposcYI+Q==} + '@payloadcms/db-sqlite@3.88.0': + resolution: {integrity: sha512-ZszS6LfejrfSmYNjb7EkUjt6A9zUPDNLSYN3Y5uxWqTRL5yDehnR2ZW/cbpvECtieX2cZ8z3bst8WVnWCtFPNw==} peerDependencies: - payload: 3.84.1 + payload: 3.88.0 - '@payloadcms/drizzle@3.84.1': - resolution: {integrity: sha512-n/1fgH3fh6omGNecjhOJ32wrxio5ph2VhfQDwMvSEViTUPD9JXp0yJiOUEqzYK/cxoRQWfwBIbvgzpC/a6FsEw==} + '@payloadcms/drizzle@3.88.0': + resolution: {integrity: sha512-qtPVSLjAFnQl1GwaQPhmnYTwCCWgTnRm4ps5yJxmN3RPdLF6S77gvqZMnC4HTeH7YADQJW3nFgQCVYExxWE6hA==} peerDependencies: - payload: 3.84.1 + payload: 3.88.0 '@payloadcms/eslint-config@3.28.0': resolution: {integrity: sha512-BiGtowdT4uLdGaM1yxP3oZRZrRMi27FiIU2eJuRqiGqdCVfKYRtlNAHq5knf2ExmdV/U3yZivH4linR2DNT2eA==} @@ -1801,55 +1631,55 @@ packages: '@payloadcms/eslint-plugin@3.28.0': resolution: {integrity: sha512-oZhy8zd6WrxKwNygMfYE750yIRQEfdaoWEBR47UmKA6AMLb9p0kXygdkmnZLgNCFO4REZRUC2uHBWIh/dGqYrw==} - '@payloadcms/graphql@3.84.1': - resolution: {integrity: sha512-pVJdgihEEexpK+kANSozAMf3PQfd6p51/G3cK+rkPzSjghf7X+cQQ8NFOmAMDTpijM5YaowQYTuEje3KaLVXuQ==} + '@payloadcms/graphql@3.88.0': + resolution: {integrity: sha512-ync+bPFl0UacwBs1wVQkPlaSWWQJc4LjGG9OuRHEW7wYW3aeVQ+H2zfdFL6/cVJGP3zOq+XIlvYYw8G86Ki+Vw==} hasBin: true peerDependencies: graphql: ^16.8.1 - payload: 3.84.1 + payload: 3.88.0 - '@payloadcms/next@3.84.1': - resolution: {integrity: sha512-T7f7Ja4l4Z6QM/oSM8MWJY63xyNQmWxUswDgssXl1/D0hQIVQASXMeZvXiXLQwg/g4f9s5anKTUNIx32dtHxWg==} + '@payloadcms/next@3.88.0': + resolution: {integrity: sha512-3f2YOGSmtTp85YnlJm9FusRgshKJbiLI8uXs8iQNMwU7RZJnLCURG8iv/6sjKHO0owIfw3vIL5qgxdtIBuQwpA==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: graphql: ^16.8.1 - next: '>=15.2.9 <15.3.0 || >=15.3.9 <15.4.0 || >=15.4.11 <15.5.0 || >=16.2.2 <17.0.0' - payload: 3.84.1 + next: '>=15.2.9 <15.3.0 || >=15.3.9 <15.4.0 || >=15.4.11 <15.5.0 || >=16.2.6 <17.0.0' + payload: 3.88.0 - '@payloadcms/plugin-form-builder@3.84.1': - resolution: {integrity: sha512-pEr4QFceswL+3dpZWtzlLHyED8nxk7iukm/eNUxNn9vaUfb2xcqzQf6xRmoJra9R1yDx6mdC/DU+Whg5Op/yfQ==} + '@payloadcms/plugin-form-builder@3.88.0': + resolution: {integrity: sha512-C915jEHADVN9xW7fSq/bYIZig1zjfQo+t4wrgiqjOCmB81oMgyqLRB3RlL2e6y4PzBUtgss2VS40vn/tVD/61Q==} peerDependencies: - payload: 3.84.1 + payload: 3.88.0 react: ^19.0.1 || ^19.1.2 || ^19.2.1 react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1 - '@payloadcms/plugin-seo@3.84.1': - resolution: {integrity: sha512-9FYs5ML/eWR/A/rQfHt2NhPzkJWbUx5SN/+lEQ90r3c3Z8CQUVpt4vETXSI9Gxi764lTutIGemuZAJK9WRy3Lw==} + '@payloadcms/plugin-seo@3.88.0': + resolution: {integrity: sha512-3eFWoqpXZQZ3ghdFksPo7nQ08XUG0PXWc/qf1ibtXiKPlMN43Asa8Z9wGNKYtkDhIM+OYi6EmlFzRLWkCRcwrg==} peerDependencies: - payload: 3.84.1 + payload: 3.88.0 react: ^19.0.1 || ^19.1.2 || ^19.2.1 react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1 - '@payloadcms/richtext-lexical@3.84.1': - resolution: {integrity: sha512-KaNSz0RJFLnLc/hBRGg8Lgwk5FjCZSskA6KuufNWG5QdgUsgQe4Dx4Vr7G+VSR9zSZj+R4TVVSC0aVv4z7vL3g==} + '@payloadcms/richtext-lexical@3.88.0': + resolution: {integrity: sha512-lY8oIUiggykWKB3ljMfSidxBtA8ahMq0Qqp28OuvaCNIDp0HTMIPxcHvFOQZngMqtQHhpautD6vcQR0Q9CEHHQ==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: '@faceless-ui/modal': 3.0.0 '@faceless-ui/scroll-info': 2.0.0 - '@payloadcms/next': 3.84.1 - payload: 3.84.1 + '@payloadcms/next': 3.88.0 + payload: 3.88.0 react: ^19.0.1 || ^19.1.2 || ^19.2.1 react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1 - '@payloadcms/translations@3.84.1': - resolution: {integrity: sha512-1g4IsXvRfeQCn8YmPweaj8MMAFK9oSxYWKJG15j+Ah9Nra+f35/ZdOt/k80+vfoJmdKsOK/AnuzVdSTWy2GQpg==} + '@payloadcms/translations@3.88.0': + resolution: {integrity: sha512-AZVQjjW5pKxO+K9ODeh6yw6/EfXK1hxGPw55KzzDC5srO3hjNskgyWtkauKvbz+S0+xFspANbRc4OD/Rg/74WA==} - '@payloadcms/ui@3.84.1': - resolution: {integrity: sha512-L9trD3/LcK1fiGg4AFexy9AQm4upMzRbicZFTNU/ac+x5o6Pwyr7FzrvbtfCr0l2t6QhawLBZmBCZJA8oBF2uA==} + '@payloadcms/ui@3.88.0': + resolution: {integrity: sha512-iwQhHPDn4Oj2bPg1UV467BoxfUNo1rUmD8jMZaw2Vtt/nmxAPl3W3CWN/CsOX/yITuPuGHJxznOg4PZNMF3gEg==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: - next: '>=15.2.9 <15.3.0 || >=15.3.9 <15.4.0 || >=15.4.11 <15.5.0 || >=16.2.2 <17.0.0' - payload: 3.84.1 + next: '>=15.2.9 <15.3.0 || >=15.3.9 <15.4.0 || >=15.4.11 <15.5.0 || >=16.2.6 <17.0.0' + payload: 3.88.0 react: ^19.0.1 || ^19.1.2 || ^19.2.1 react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1 @@ -3246,11 +3076,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.28.1: resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} @@ -3877,9 +3702,9 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - image-size@2.0.2: - resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} - engines: {node: '>=16.x'} + image-dimensions@2.5.1: + resolution: {integrity: sha512-It7CkTNp7IYA8jhvGgz8K18OAbHF3/Juk8RNEyTyMFfolJOIU1Y2wGDnzDQPbGCjyxVF/++pwIZE0BKJUEOb1g==} + engines: {node: '>=18'} hasBin: true immutable@4.3.9: @@ -4630,8 +4455,8 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - payload@3.84.1: - resolution: {integrity: sha512-+aPqqeYsffrzaYmsX/Qt+mHNgcTUyc5TIjjPOaMIrG6nDx6siZ2h9Gv3b3RKAVPt7PWkHI+ooEW3cQbwiDd99Q==} + payload@3.88.0: + resolution: {integrity: sha512-O7zuS80bvEGLte+7xZjwN05+ox5BCsGcQT2M6+CTote07JQOOvHJoiuoyQFw6cUElcFTWGMC5dy03w7J7sTYGg==} engines: {node: ^18.20.2 || >=20.9.0} hasBin: true peerDependencies: @@ -5336,8 +5161,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.22.4: + resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} engines: {node: '>=18.0.0'} hasBin: true @@ -5394,8 +5219,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@7.24.4: - resolution: {integrity: sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} engines: {node: '>=20.18.1'} unist-util-is@6.0.1: @@ -5450,8 +5275,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + uuid@13.0.2: + resolution: {integrity: sha512-vzi9uRZ926x4XV73S/4qQaTwPXM2JBj6/6lI/byHH1jOpCzb0zDbfytgA9LcN/hzb2l7WQSQnxITOVx5un/wGw==} hasBin: true vfile-message@4.0.3: @@ -5914,9 +5739,6 @@ snapshots: '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/aix-ppc64@0.27.7': - optional: true - '@esbuild/aix-ppc64@0.28.1': optional: true @@ -5926,9 +5748,6 @@ snapshots: '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm64@0.27.7': - optional: true - '@esbuild/android-arm64@0.28.1': optional: true @@ -5938,9 +5757,6 @@ snapshots: '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-arm@0.27.7': - optional: true - '@esbuild/android-arm@0.28.1': optional: true @@ -5950,9 +5766,6 @@ snapshots: '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/android-x64@0.27.7': - optional: true - '@esbuild/android-x64@0.28.1': optional: true @@ -5962,9 +5775,6 @@ snapshots: '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.27.7': - optional: true - '@esbuild/darwin-arm64@0.28.1': optional: true @@ -5974,9 +5784,6 @@ snapshots: '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/darwin-x64@0.27.7': - optional: true - '@esbuild/darwin-x64@0.28.1': optional: true @@ -5986,9 +5793,6 @@ snapshots: '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.27.7': - optional: true - '@esbuild/freebsd-arm64@0.28.1': optional: true @@ -5998,9 +5802,6 @@ snapshots: '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.27.7': - optional: true - '@esbuild/freebsd-x64@0.28.1': optional: true @@ -6010,9 +5811,6 @@ snapshots: '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm64@0.27.7': - optional: true - '@esbuild/linux-arm64@0.28.1': optional: true @@ -6022,9 +5820,6 @@ snapshots: '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-arm@0.27.7': - optional: true - '@esbuild/linux-arm@0.28.1': optional: true @@ -6034,9 +5829,6 @@ snapshots: '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-ia32@0.27.7': - optional: true - '@esbuild/linux-ia32@0.28.1': optional: true @@ -6046,9 +5838,6 @@ snapshots: '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-loong64@0.27.7': - optional: true - '@esbuild/linux-loong64@0.28.1': optional: true @@ -6058,9 +5847,6 @@ snapshots: '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-mips64el@0.27.7': - optional: true - '@esbuild/linux-mips64el@0.28.1': optional: true @@ -6070,9 +5856,6 @@ snapshots: '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.27.7': - optional: true - '@esbuild/linux-ppc64@0.28.1': optional: true @@ -6082,9 +5865,6 @@ snapshots: '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.27.7': - optional: true - '@esbuild/linux-riscv64@0.28.1': optional: true @@ -6094,9 +5874,6 @@ snapshots: '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-s390x@0.27.7': - optional: true - '@esbuild/linux-s390x@0.28.1': optional: true @@ -6106,18 +5883,12 @@ snapshots: '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/linux-x64@0.27.7': - optional: true - '@esbuild/linux-x64@0.28.1': optional: true '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.27.7': - optional: true - '@esbuild/netbsd-arm64@0.28.1': optional: true @@ -6127,18 +5898,12 @@ snapshots: '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.27.7': - optional: true - '@esbuild/netbsd-x64@0.28.1': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.27.7': - optional: true - '@esbuild/openbsd-arm64@0.28.1': optional: true @@ -6148,18 +5913,12 @@ snapshots: '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.27.7': - optional: true - '@esbuild/openbsd-x64@0.28.1': optional: true '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.27.7': - optional: true - '@esbuild/openharmony-arm64@0.28.1': optional: true @@ -6169,9 +5928,6 @@ snapshots: '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/sunos-x64@0.27.7': - optional: true - '@esbuild/sunos-x64@0.28.1': optional: true @@ -6181,9 +5937,6 @@ snapshots: '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-arm64@0.27.7': - optional: true - '@esbuild/win32-arm64@0.28.1': optional: true @@ -6193,9 +5946,6 @@ snapshots: '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-ia32@0.27.7': - optional: true - '@esbuild/win32-ia32@0.28.1': optional: true @@ -6205,9 +5955,6 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.27.7': - optional: true - '@esbuild/win32-x64@0.28.1': optional: true @@ -6617,18 +6364,6 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@intecion/ipal-kit@git+https://github.com/rasm-its/ipal-kit.git#84db3be40cb8d46ca4b85e459e138f868bc5010f(@payloadcms/plugin-form-builder@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3))(@payloadcms/plugin-seo@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3))(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react@19.2.6)': - dependencies: - '@payloadcms/plugin-form-builder': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) - '@payloadcms/plugin-seo': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) - lucide-react: 0.400.0(react@19.2.6) - next: 16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4) - nodemailer: 8.0.11 - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) - react: 19.2.6 - server-only: 0.0.1 - slugify: 1.6.9 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -7057,18 +6792,18 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@1.12.0': optional: true - '@payloadcms/db-postgres@3.84.1(@libsql/client@0.14.0)(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))': + '@payloadcms/db-postgres@3.88.0(@libsql/client@0.14.0)(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))': dependencies: - '@payloadcms/drizzle': 3.84.1(@libsql/client@0.14.0)(@types/pg@8.20.0)(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0) + '@payloadcms/drizzle': 3.88.0(@libsql/client@0.14.0)(@types/pg@8.20.0)(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0) '@types/pg': 8.20.0 console-table-printer: 2.12.1 drizzle-kit: 0.31.7 drizzle-orm: 0.45.2(@libsql/client@0.14.0)(@types/pg@8.20.0)(pg@8.20.0) - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + payload: 3.88.0(graphql@16.14.2)(typescript@5.7.3) pg: 8.20.0 prompts: 2.4.2 to-snake-case: 1.0.0 - uuid: 11.1.0 + uuid: 13.0.2 transitivePeerDependencies: - '@aws-sdk/client-rds-data' - '@cloudflare/workers-types' @@ -7100,17 +6835,17 @@ snapshots: - sqlite3 - supports-color - '@payloadcms/db-sqlite@3.84.1(@types/pg@8.20.0)(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0)': + '@payloadcms/db-sqlite@3.88.0(@types/pg@8.20.0)(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0)': dependencies: '@libsql/client': 0.14.0 - '@payloadcms/drizzle': 3.84.1(@libsql/client@0.14.0)(@types/pg@8.20.0)(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0) + '@payloadcms/drizzle': 3.88.0(@libsql/client@0.14.0)(@types/pg@8.20.0)(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0) console-table-printer: 2.12.1 drizzle-kit: 0.31.7 drizzle-orm: 0.45.2(@libsql/client@0.14.0)(@types/pg@8.20.0)(pg@8.20.0) - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + payload: 3.88.0(graphql@16.14.2)(typescript@5.7.3) prompts: 2.4.2 to-snake-case: 1.0.0 - uuid: 11.1.0 + uuid: 13.0.2 transitivePeerDependencies: - '@aws-sdk/client-rds-data' - '@cloudflare/workers-types' @@ -7144,15 +6879,15 @@ snapshots: - supports-color - utf-8-validate - '@payloadcms/drizzle@3.84.1(@libsql/client@0.14.0)(@types/pg@8.20.0)(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0)': + '@payloadcms/drizzle@3.88.0(@libsql/client@0.14.0)(@types/pg@8.20.0)(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(pg@8.20.0)': dependencies: console-table-printer: 2.12.1 dequal: 2.0.3 drizzle-orm: 0.45.2(@libsql/client@0.14.0)(@types/pg@8.20.0)(pg@8.20.0) - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + payload: 3.88.0(graphql@16.14.2)(typescript@5.7.3) prompts: 2.4.2 to-snake-case: 1.0.0 - uuid: 11.1.0 + uuid: 13.0.2 transitivePeerDependencies: - '@aws-sdk/client-rds-data' - '@cloudflare/workers-types' @@ -7245,25 +6980,25 @@ snapshots: - ts-api-utils - vue-eslint-parser - '@payloadcms/graphql@3.84.1(graphql@16.14.2)(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(typescript@5.7.3)': + '@payloadcms/graphql@3.88.0(graphql@16.14.2)(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(typescript@5.7.3)': dependencies: graphql: 16.14.2 graphql-scalars: 1.22.2(graphql@16.14.2) - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + payload: 3.88.0(graphql@16.14.2)(typescript@5.7.3) pluralize: 8.0.0 ts-essentials: 10.0.3(typescript@5.7.3) - tsx: 4.21.0 + tsx: 4.22.4 transitivePeerDependencies: - typescript - '@payloadcms/next@3.84.1(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)': + '@payloadcms/next@3.88.0(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)': dependencies: '@dnd-kit/core': 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) '@dnd-kit/sortable': 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) - '@payloadcms/graphql': 3.84.1(graphql@16.14.2)(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(typescript@5.7.3) - '@payloadcms/translations': 3.84.1 - '@payloadcms/ui': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) + '@payloadcms/graphql': 3.88.0(graphql@16.14.2)(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(typescript@5.7.3) + '@payloadcms/translations': 3.88.0 + '@payloadcms/ui': 3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) busboy: 1.6.0 dequal: 2.0.3 file-type: 21.3.4 @@ -7273,10 +7008,10 @@ snapshots: http-status: 2.1.0 next: 16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4) path-to-regexp: 6.3.0 - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + payload: 3.88.0(graphql@16.14.2)(typescript@5.7.3) qs-esm: 8.0.1 sass: 1.77.4 - uuid: 11.1.0 + uuid: 13.0.2 transitivePeerDependencies: - '@types/react' - monaco-editor @@ -7285,11 +7020,12 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-form-builder@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)': + '@payloadcms/plugin-form-builder@3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)': dependencies: - '@payloadcms/ui': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) + '@payloadcms/translations': 3.88.0 + '@payloadcms/ui': 3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) escape-html: 1.0.3 - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + payload: 3.88.0(graphql@16.14.2)(typescript@5.7.3) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) transitivePeerDependencies: @@ -7299,11 +7035,11 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-seo@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)': + '@payloadcms/plugin-seo@3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)': dependencies: - '@payloadcms/translations': 3.84.1 - '@payloadcms/ui': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + '@payloadcms/translations': 3.88.0 + '@payloadcms/ui': 3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) + payload: 3.88.0(graphql@16.14.2)(typescript@5.7.3) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) transitivePeerDependencies: @@ -7313,7 +7049,7 @@ snapshots: - supports-color - typescript - '@payloadcms/richtext-lexical@3.84.1(@faceless-ui/modal@3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@payloadcms/next@3.84.1(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3))(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)(yjs@13.6.31)': + '@payloadcms/richtext-lexical@3.88.0(@faceless-ui/modal@3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@payloadcms/next@3.88.0(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3))(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)(yjs@13.6.31)': dependencies: '@faceless-ui/modal': 3.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@faceless-ui/scroll-info': 2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -7328,9 +7064,9 @@ snapshots: '@lexical/selection': 0.41.0 '@lexical/table': 0.41.0 '@lexical/utils': 0.41.0 - '@payloadcms/next': 3.84.1(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) - '@payloadcms/translations': 3.84.1 - '@payloadcms/ui': 3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) + '@payloadcms/next': 3.88.0(@types/react@19.2.14)(graphql@16.14.2)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) + '@payloadcms/translations': 3.88.0 + '@payloadcms/ui': 3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3) acorn: 8.16.0 bson-objectid: 2.0.4 csstype: 3.1.3 @@ -7341,13 +7077,13 @@ snapshots: mdast-util-from-markdown: 2.0.2 mdast-util-mdx-jsx: 3.1.3 micromark-extension-mdx-jsx: 3.0.1 - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + payload: 3.88.0(graphql@16.14.2)(typescript@5.7.3) qs-esm: 8.0.1 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) react-error-boundary: 4.1.2(react@19.2.6) ts-essentials: 10.0.3(typescript@5.7.3) - uuid: 11.1.0 + uuid: 13.0.2 transitivePeerDependencies: - '@types/react' - bufferutil @@ -7358,11 +7094,11 @@ snapshots: - utf-8-validate - yjs - '@payloadcms/translations@3.84.1': + '@payloadcms/translations@3.88.0': dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.84.1(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.84.1(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)': + '@payloadcms/ui@3.88.0(@types/react@19.2.14)(monaco-editor@0.55.1)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4))(payload@3.88.0(graphql@16.14.2)(typescript@5.7.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.7.3)': dependencies: '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -7372,14 +7108,14 @@ snapshots: '@faceless-ui/scroll-info': 2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@faceless-ui/window-info': 3.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@monaco-editor/react': 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@payloadcms/translations': 3.84.1 + '@payloadcms/translations': 3.88.0 bson-objectid: 2.0.4 date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 next: 16.2.6(@babel/core@7.29.7)(@playwright/test@1.58.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(sass@1.77.4) object-to-formdata: 4.5.1 - payload: 3.84.1(graphql@16.14.2)(typescript@5.7.3) + payload: 3.88.0(graphql@16.14.2)(typescript@5.7.3) qs-esm: 8.0.1 react: 19.2.6 react-datepicker: 7.6.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -7390,7 +7126,7 @@ snapshots: sonner: 1.7.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6) ts-essentials: 10.0.3(typescript@5.7.3) use-context-selector: 2.0.0(react@19.2.6)(scheduler@0.25.0) - uuid: 11.1.0 + uuid: 13.0.2 transitivePeerDependencies: - '@types/react' - monaco-editor @@ -7986,13 +7722,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.0.18(vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.21.0))': + '@vitest/mocker@4.0.18(vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.22.4))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.21.0) + vite: 7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.22.4) '@vitest/pretty-format@4.0.18': dependencies: @@ -8839,35 +8575,6 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 - esbuild@0.27.7: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 - esbuild@0.28.1: optionalDependencies: '@esbuild/aix-ppc64': 0.28.1 @@ -9742,7 +9449,7 @@ snapshots: ignore@7.0.5: {} - image-size@2.0.2: {} + image-dimensions@2.5.1: {} immutable@4.3.9: {} @@ -10627,10 +10334,10 @@ snapshots: pathe@2.0.3: {} - payload@3.84.1(graphql@16.14.2)(typescript@5.7.3): + payload@3.88.0(graphql@16.14.2)(typescript@5.7.3): dependencies: '@next/env': 15.5.20 - '@payloadcms/translations': 3.84.1 + '@payloadcms/translations': 3.88.0 '@types/busboy': 1.5.4 ajv: 8.18.0 bson-objectid: 2.0.4 @@ -10644,7 +10351,7 @@ snapshots: get-tsconfig: 4.8.1 graphql: 16.14.2 http-status: 2.1.0 - image-size: 2.0.2 + image-dimensions: 2.5.1 ipaddr.js: 2.2.0 jose: 5.10.0 json-schema-to-typescript: 15.0.3 @@ -10657,9 +10364,9 @@ snapshots: range-parser: 1.2.1 sanitize-filename: 1.6.3 ts-essentials: 10.0.3(typescript@5.7.3) - tsx: 4.21.0 - undici: 7.24.4 - uuid: 11.1.0 + tsx: 4.22.4 + undici: 7.29.0 + uuid: 13.0.2 ws: 8.21.0 transitivePeerDependencies: - bufferutil @@ -11490,10 +11197,9 @@ snapshots: tslib@2.8.1: {} - tsx@4.21.0: + tsx@4.22.4: dependencies: - esbuild: 0.27.7 - get-tsconfig: 4.8.1 + esbuild: 0.28.1 optionalDependencies: fsevents: 2.3.3 @@ -11573,7 +11279,7 @@ snapshots: undici-types@6.21.0: {} - undici@7.24.4: {} + undici@7.29.0: {} unist-util-is@6.0.1: dependencies: @@ -11652,24 +11358,24 @@ snapshots: util-deprecate@1.0.2: {} - uuid@11.1.0: {} + uuid@13.0.2: {} vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 - vite-tsconfig-paths@6.0.5(typescript@5.7.3)(vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.21.0)): + vite-tsconfig-paths@6.0.5(typescript@5.7.3)(vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.22.4)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.7.3) - vite: 7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.21.0) + vite: 7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.22.4) transitivePeerDependencies: - supports-color - typescript - vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.21.0): + vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.22.4): dependencies: esbuild: 0.28.1 fdir: 6.5.0(picomatch@4.0.5) @@ -11681,12 +11387,12 @@ snapshots: '@types/node': 22.19.9 fsevents: 2.3.3 sass: 1.77.4 - tsx: 4.21.0 + tsx: 4.22.4 - vitest@4.0.18(@types/node@22.19.9)(happy-dom@20.10.6)(sass@1.77.4)(tsx@4.21.0): + vitest@4.0.18(@types/node@22.19.9)(happy-dom@20.10.6)(sass@1.77.4)(tsx@4.22.4): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.21.0)) + '@vitest/mocker': 4.0.18(vite@7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.22.4)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -11703,7 +11409,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.21.0) + vite: 7.3.6(@types/node@22.19.9)(sass@1.77.4)(tsx@4.22.4) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.19.9 diff --git a/src/exports/client.ts b/src/exports/client.ts index d413ae6..4b1ab86 100644 --- a/src/exports/client.ts +++ b/src/exports/client.ts @@ -19,3 +19,6 @@ export { export type { CookieBannerClassNames } from '../modules/consent/client.js' export { Turnstile } from '../modules/turnstile/client.js' export type { TurnstileProps } from '../modules/turnstile/client.js' + +export { resolveFormMessage } from '../modules/notifications/resolveFormMessage.js' +export type { FormNotificationTexts } from '../modules/notifications/types.js' diff --git a/src/globals/SiteIntegrations/components/MaskedField.tsx b/src/globals/SiteIntegrations/components/MaskedField.tsx index 1dd939c..41e9d5b 100644 --- a/src/globals/SiteIntegrations/components/MaskedField.tsx +++ b/src/globals/SiteIntegrations/components/MaskedField.tsx @@ -1,24 +1,36 @@ 'use client' import type { TextFieldClientComponent } from 'payload' - -import { useField } from '@payloadcms/ui' import { useState } from 'react' -export const MaskedField: TextFieldClientComponent = ({ field, path }) => { - const { setValue, value } = useField({ path }) +export const MaskedField: TextFieldClientComponent = (props: any) => { + const { field, path, value: propValue, setValue: propSetValue, onChange: propOnChange } = props || {} + const [internalValue, setInternalValue] = useState(propValue ?? '') const [revealed, setRevealed] = useState(false) const label = typeof field?.label === 'string' ? field.label : (field?.name ?? path) + const handleChange = (e: React.ChangeEvent) => { + const newVal = e.target.value + setInternalValue(newVal) + if (typeof propSetValue === 'function') { + propSetValue(newVal) + } + if (typeof propOnChange === 'function') { + propOnChange(e) + } + } + + const currentValue = propValue !== undefined ? propValue : internalValue + return (
- + {label && }
setValue(e.target.value)} + onChange={handleChange} style={{ flex: 1 }} type={revealed ? 'text' : 'password'} - value={value ?? ''} + value={currentValue ?? ''} />
) } + export default MaskedField diff --git a/src/index.ts b/src/index.ts index 49bf710..0e1dea5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -99,6 +99,16 @@ export { injectAutoFillMeta, } from './modules/seo/index.js' export { buildSlugField, toSlug } from './modules/slug/index.js' +export { + NOTIFICATION_FALLBACK, + getNotificationTexts, + resolveFormMessage, +} from './modules/notifications/index.js' +export type { + FormNotificationTexts, + NotificationsData, + NotificationTexts, +} from './modules/notifications/index.js' export { ipalKit } from './plugin.js' export type { IpalOptions } from './types.js' diff --git a/src/modules/email/graphAdapter.ts b/src/modules/email/graphAdapter.ts index aef1b79..3b71902 100644 --- a/src/modules/email/graphAdapter.ts +++ b/src/modules/email/graphAdapter.ts @@ -115,10 +115,18 @@ export const graphAdapter = return { error: 'Graph is not configured (missing env vars).', sent: false } } - // From-display comes from the panel; falls back to the caller's from. + // The panel's from-address is used as Reply-To, NOT as the message From. + // + // Why: app-only Graph sends from GRAPH_SENDER's mailbox. If we also set a + // `from` that differs from that mailbox, Exchange demands "Send As" + // permission on it and rejects with ErrorSendAsDenied otherwise. So we + // never override `from` — Graph stamps the mail as GRAPH_SENDER (the + // mailbox we legitimately own) — and route replies to the panel address + // via Reply-To. Recipients see the mail from forms@… but replying reaches + // the real destination. No Send-As needed. const panel = await getSiteIntegrations(payload) - const fromAddress = panel.smtpFromAddress || undefined - const fromName = panel.smtpFromName || undefined + const replyToAddress = panel.smtpFromAddress || undefined + const replyToName = panel.smtpFromName || undefined const to = toRecipients(message.to) if (to.length === 0) { @@ -130,25 +138,28 @@ export const graphAdapter = const isHtml = typeof message.html === 'string' && message.html.length > 0 const content = isHtml ? String(message.html) : String(message.text ?? '') + // Reply-To: prefer whatever the caller set; otherwise the panel address. + const replyTo = message.replyTo + ? toRecipients(message.replyTo as SendEmailOptions['to']) + : replyToAddress + ? [ + { + emailAddress: { + address: replyToAddress, + ...(replyToName ? { name: replyToName } : {}), + }, + }, + ] + : [] + const graphMessage: Record = { body: { content, contentType: isHtml ? 'HTML' : 'Text' }, subject: message.subject ?? '', toRecipients: to, ...(message.cc ? { ccRecipients: toRecipients(message.cc) } : {}), ...(message.bcc ? { bccRecipients: toRecipients(message.bcc) } : {}), - // from is only honoured if the app has Send-As for that address; when - // it's the shared mailbox itself, omit it and Graph uses the sender. - ...(fromAddress - ? { - from: { - emailAddress: { address: fromAddress, ...(fromName ? { name: fromName } : {}) }, - }, - } - : {}), - // replyTo lets the recipient reply to the real submitter if the caller set it. - ...(message.replyTo - ? { replyTo: toRecipients(message.replyTo as SendEmailOptions['to']) } - : {}), + // NO `from` — Graph uses GRAPH_SENDER's own mailbox, so no Send-As. + ...(replyTo.length > 0 ? { replyTo } : {}), } try {