@nitrogenbuilder/connector-payload 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +101 -0
  2. package/dist/collection-registry.d.ts +7 -0
  3. package/dist/collection-registry.js +12 -0
  4. package/dist/collections/NitrogenTemplates.d.ts +2 -0
  5. package/dist/collections/NitrogenTemplates.js +78 -0
  6. package/dist/components/NitrogenEditButton.d.ts +4 -0
  7. package/dist/components/NitrogenEditButton.js +43 -0
  8. package/dist/editor/NitrogenEditorLayout.d.ts +15 -0
  9. package/dist/editor/NitrogenEditorLayout.js +15 -0
  10. package/dist/editor/NitrogenEditorPage.d.ts +20 -0
  11. package/dist/editor/NitrogenEditorPage.js +87 -0
  12. package/dist/editor/index.d.ts +2 -0
  13. package/dist/editor/index.js +2 -0
  14. package/dist/endpoints/all.d.ts +2 -0
  15. package/dist/endpoints/all.js +48 -0
  16. package/dist/endpoints/collection-endpoints.d.ts +8 -0
  17. package/dist/endpoints/collection-endpoints.js +168 -0
  18. package/dist/endpoints/helpers.d.ts +64 -0
  19. package/dist/endpoints/helpers.js +104 -0
  20. package/dist/endpoints/media.d.ts +2 -0
  21. package/dist/endpoints/media.js +93 -0
  22. package/dist/endpoints/menu.d.ts +2 -0
  23. package/dist/endpoints/menu.js +19 -0
  24. package/dist/endpoints/nitrogen-settings.d.ts +2 -0
  25. package/dist/endpoints/nitrogen-settings.js +22 -0
  26. package/dist/endpoints/templates.d.ts +2 -0
  27. package/dist/endpoints/templates.js +114 -0
  28. package/dist/frontend/NitrogenPageClient.d.ts +16 -0
  29. package/dist/frontend/NitrogenPageClient.js +55 -0
  30. package/dist/frontend/NitrogenWrapper.d.ts +45 -0
  31. package/dist/frontend/NitrogenWrapper.js +38 -0
  32. package/dist/frontend/index.d.ts +7 -0
  33. package/dist/frontend/index.js +8 -0
  34. package/dist/globals/NitrogenSettings.d.ts +2 -0
  35. package/dist/globals/NitrogenSettings.js +41 -0
  36. package/dist/index.d.ts +21 -0
  37. package/dist/index.js +140 -0
  38. package/dist/types.d.ts +125 -0
  39. package/dist/types.js +7 -0
  40. package/package.json +49 -0
@@ -0,0 +1,64 @@
1
+ import type { Payload, PayloadRequest } from 'payload';
2
+ import type { JsonObject, NitrogenPageDoc, NitrogenTemplateDoc, NitrogenSettingsGlobal, MediaDoc } from '../types';
3
+ export declare function formatDate(date: string | Date): string;
4
+ export declare function buildDynamicData(doc: NitrogenPageDoc | NitrogenTemplateDoc, globalSettings?: NitrogenSettingsGlobal): JsonObject;
5
+ export declare function buildPageResponse(doc: NitrogenPageDoc | NitrogenTemplateDoc, settings: NitrogenSettingsGlobal, dynamicData: JsonObject): {
6
+ id: string | number;
7
+ token: string;
8
+ title: string;
9
+ author: string | number;
10
+ slug: string;
11
+ permalink: string;
12
+ relative_permalink: string;
13
+ content: string;
14
+ dynamic_data: JsonObject;
15
+ settings: JsonObject;
16
+ nitrogen_settings: {
17
+ variables?: Array<{
18
+ name: string;
19
+ value?: string;
20
+ }>;
21
+ urlMaps: never[];
22
+ wysiwygColors: {};
23
+ };
24
+ };
25
+ export declare function buildListItemResponse(doc: NitrogenPageDoc | NitrogenTemplateDoc, settings: NitrogenSettingsGlobal): {
26
+ id: string | number;
27
+ title: string;
28
+ slug: string;
29
+ permalink: string;
30
+ relative_permalink: string;
31
+ content: string;
32
+ settings: JsonObject;
33
+ nitrogen_settings: {
34
+ variables?: Array<{
35
+ name: string;
36
+ value?: string;
37
+ }>;
38
+ urlMaps: never[];
39
+ wysiwygColors: {};
40
+ };
41
+ };
42
+ export declare function buildMediaItemResponse(doc: MediaDoc): {
43
+ id: string | number;
44
+ filename: string;
45
+ mimeType: string;
46
+ alt: string;
47
+ url: string;
48
+ filesize: number;
49
+ width: number;
50
+ height: number;
51
+ createdAt: string;
52
+ sizes: {
53
+ [key: string]: import("../types").MediaSize | undefined;
54
+ thumbnail?: import("../types").MediaSize;
55
+ medium?: import("../types").MediaSize;
56
+ large?: import("../types").MediaSize;
57
+ };
58
+ name: string;
59
+ mime: string;
60
+ ext: string;
61
+ size: number;
62
+ };
63
+ export declare function getNitrogenSettings(payload: Payload): Promise<NitrogenSettingsGlobal>;
64
+ export declare function requireAuth(req: PayloadRequest): Response | null;
@@ -0,0 +1,104 @@
1
+ export function formatDate(date) {
2
+ const d = new Date(date);
3
+ const pad = (n) => String(n).padStart(2, '0');
4
+ return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;
5
+ }
6
+ export function buildDynamicData(doc, globalSettings) {
7
+ const dynamicData = {
8
+ Post: {
9
+ post_title: doc.title || '',
10
+ post_content: '',
11
+ post_excerpt: '',
12
+ post_date: formatDate(doc.createdAt),
13
+ post_date_gmt: formatDate(doc.createdAt),
14
+ post_modified: formatDate(doc.updatedAt),
15
+ post_modified_gmt: formatDate(doc.updatedAt),
16
+ author_id: doc.author && typeof doc.author === 'object' ? String(doc.author.id) : String(doc.author || ''),
17
+ author: doc.author && typeof doc.author === 'object'
18
+ ? doc.author.name || doc.author.email || ''
19
+ : '',
20
+ },
21
+ };
22
+ if (globalSettings?.nitrogenConfig?.variables) {
23
+ const vars = {};
24
+ for (const item of globalSettings.nitrogenConfig.variables) {
25
+ if (item.name) {
26
+ vars[item.name] = item.value ?? '';
27
+ }
28
+ }
29
+ dynamicData['Global Variables'] = vars;
30
+ }
31
+ return dynamicData;
32
+ }
33
+ export function buildPageResponse(doc, settings, dynamicData) {
34
+ const pageSettings = 'pageSettings' in doc ? doc.pageSettings : undefined;
35
+ const templateSettings = 'templateSettings' in doc ? doc.templateSettings : undefined;
36
+ return {
37
+ id: doc.id,
38
+ token: settings.licenseKey || '',
39
+ title: doc.title,
40
+ author: doc.author && typeof doc.author === 'object' ? doc.author.id : (doc.author || ''),
41
+ slug: doc.slug,
42
+ permalink: `${settings.frontendUrl || ''}/${doc.slug}`,
43
+ relative_permalink: `/${doc.slug}`,
44
+ content: doc.nitrogenData ? JSON.stringify(doc.nitrogenData) : '[]',
45
+ dynamic_data: dynamicData,
46
+ settings: pageSettings || templateSettings || {
47
+ 'Page Settings': {},
48
+ },
49
+ nitrogen_settings: {
50
+ urlMaps: [],
51
+ wysiwygColors: {},
52
+ ...(settings.nitrogenConfig || {}),
53
+ },
54
+ };
55
+ }
56
+ export function buildListItemResponse(doc, settings) {
57
+ const pageSettings = 'pageSettings' in doc ? doc.pageSettings : undefined;
58
+ const templateSettings = 'templateSettings' in doc ? doc.templateSettings : undefined;
59
+ return {
60
+ id: doc.id,
61
+ title: doc.title,
62
+ slug: doc.slug,
63
+ permalink: `${settings.frontendUrl || ''}/${doc.slug}`,
64
+ relative_permalink: `/${doc.slug}`,
65
+ content: doc.nitrogenData ? JSON.stringify(doc.nitrogenData) : '[]',
66
+ settings: pageSettings || templateSettings || {},
67
+ nitrogen_settings: {
68
+ urlMaps: [],
69
+ wysiwygColors: {},
70
+ ...(settings.nitrogenConfig || {}),
71
+ },
72
+ };
73
+ }
74
+ export function buildMediaItemResponse(doc) {
75
+ const filename = doc.filename || '';
76
+ const ext = filename.includes('.') ? `.${filename.split('.').pop()}` : '';
77
+ return {
78
+ // Payload-native fields (used by provider renderFiles/renderSelectedFile)
79
+ id: doc.id,
80
+ filename,
81
+ mimeType: doc.mimeType || '',
82
+ alt: doc.alt || '',
83
+ url: doc.url || '',
84
+ filesize: doc.filesize || 0,
85
+ width: doc.width || 0,
86
+ height: doc.height || 0,
87
+ createdAt: doc.createdAt,
88
+ sizes: doc.sizes || {},
89
+ // CtrlFile-compatible aliases
90
+ name: filename,
91
+ mime: doc.mimeType || '',
92
+ ext,
93
+ size: doc.filesize ? Math.round((doc.filesize / 1024) * 10) / 10 : 0,
94
+ };
95
+ }
96
+ export async function getNitrogenSettings(payload) {
97
+ return payload.findGlobal({ slug: 'nitrogen-settings' });
98
+ }
99
+ export function requireAuth(req) {
100
+ if (!req.user) {
101
+ return Response.json({ error: 'Unauthorized' }, { status: 401 });
102
+ }
103
+ return null;
104
+ }
@@ -0,0 +1,2 @@
1
+ import type { Endpoint } from 'payload';
2
+ export declare const mediaEndpoints: Endpoint[];
@@ -0,0 +1,93 @@
1
+ import { buildMediaItemResponse, requireAuth } from './helpers';
2
+ export const mediaEndpoints = [
3
+ // GET /api/nitrogen/v1/media — List media items
4
+ {
5
+ path: '/nitrogen/v1/media',
6
+ method: 'get',
7
+ handler: async (req) => {
8
+ const { payload } = req;
9
+ const url = new URL(req.url || '', 'http://localhost');
10
+ // Parse Payload-style query params: where[mimeType][in][0]=image/jpg
11
+ const mimeTypes = [];
12
+ for (const [key, value] of url.searchParams.entries()) {
13
+ if (/^where\[mimeType\]\[in\]\[\d+\]$/.test(key)) {
14
+ mimeTypes.push(value);
15
+ }
16
+ }
17
+ // Parse search: where[filename][contains]=search
18
+ const search = url.searchParams.get('where[filename][contains]') || '';
19
+ // Parse page number
20
+ const page = parseInt(url.searchParams.get('page') || '1', 10);
21
+ const where = {};
22
+ if (mimeTypes.length > 0) {
23
+ where.mimeType = { in: mimeTypes };
24
+ }
25
+ if (search) {
26
+ where.filename = { contains: search };
27
+ }
28
+ const result = await payload.find({
29
+ collection: 'media',
30
+ where,
31
+ page,
32
+ limit: 20,
33
+ sort: '-createdAt',
34
+ });
35
+ const docs = result.docs.map((doc) => buildMediaItemResponse(doc));
36
+ return Response.json({
37
+ docs,
38
+ totalPages: result.totalPages,
39
+ });
40
+ },
41
+ },
42
+ // PATCH /api/nitrogen/v1/media/:id — Update media alt text
43
+ {
44
+ path: '/nitrogen/v1/media/:id',
45
+ method: 'patch',
46
+ handler: async (req) => {
47
+ const authError = requireAuth(req);
48
+ if (authError)
49
+ return authError;
50
+ const { payload, routeParams } = req;
51
+ const id = routeParams?.id;
52
+ const body = (await req.json?.());
53
+ await payload.update({
54
+ collection: 'media',
55
+ id,
56
+ data: { alt: body?.alt || '' },
57
+ });
58
+ return Response.json({ success: true });
59
+ },
60
+ },
61
+ // POST /api/nitrogen/v1/media — Upload a media file
62
+ {
63
+ path: '/nitrogen/v1/media',
64
+ method: 'post',
65
+ handler: async (req) => {
66
+ const authError = requireAuth(req);
67
+ if (authError)
68
+ return authError;
69
+ const { payload } = req;
70
+ const formData = await req.formData?.();
71
+ if (!formData) {
72
+ return Response.json({ error: 'No form data provided' }, { status: 400 });
73
+ }
74
+ // Accept 'file' (singular — sent by Payload provider one at a time)
75
+ const file = formData.get('file');
76
+ if (!file) {
77
+ return Response.json({ error: 'No file provided' }, { status: 400 });
78
+ }
79
+ const buffer = Buffer.from(await file.arrayBuffer());
80
+ const doc = await payload.create({
81
+ collection: 'media',
82
+ data: { alt: '' },
83
+ file: {
84
+ data: buffer,
85
+ name: file.name,
86
+ mimetype: file.type,
87
+ size: file.size,
88
+ },
89
+ });
90
+ return Response.json({ doc: buildMediaItemResponse(doc) });
91
+ },
92
+ },
93
+ ];
@@ -0,0 +1,2 @@
1
+ import type { Endpoint } from 'payload';
2
+ export declare const menuEndpoints: Endpoint[];
@@ -0,0 +1,19 @@
1
+ export const menuEndpoints = [
2
+ // POST /api/nitrogen/v1/menu — Get menu items (stub)
3
+ // WordPress nav menus are WP-specific. Returns empty array.
4
+ // Implement with a NavigationMenus collection if menus are needed.
5
+ {
6
+ path: '/nitrogen/v1/menu',
7
+ method: 'post',
8
+ handler: async () => {
9
+ return Response.json({ items: [] });
10
+ },
11
+ },
12
+ {
13
+ path: '/nitrogen/v1/menu',
14
+ method: 'get',
15
+ handler: async () => {
16
+ return Response.json({ items: [] });
17
+ },
18
+ },
19
+ ];
@@ -0,0 +1,2 @@
1
+ import type { Endpoint } from 'payload';
2
+ export declare const nitrogenSettingsEndpoints: Endpoint[];
@@ -0,0 +1,22 @@
1
+ import { requireAuth } from './helpers';
2
+ export const nitrogenSettingsEndpoints = [
3
+ // PUT /api/nitrogen/v1/nitrogen-settings — Save Nitrogen settings
4
+ {
5
+ path: '/nitrogen/v1/nitrogen-settings',
6
+ method: 'put',
7
+ handler: async (req) => {
8
+ const authError = requireAuth(req);
9
+ if (authError)
10
+ return authError;
11
+ const { payload } = req;
12
+ const body = await req.json?.();
13
+ const updated = await payload.updateGlobal({
14
+ slug: 'nitrogen-settings',
15
+ data: {
16
+ nitrogenConfig: body,
17
+ },
18
+ });
19
+ return Response.json(updated.nitrogenConfig || {});
20
+ },
21
+ },
22
+ ];
@@ -0,0 +1,2 @@
1
+ import type { Endpoint } from 'payload';
2
+ export declare const templatesEndpoints: Endpoint[];
@@ -0,0 +1,114 @@
1
+ import { getNitrogenSettings, buildDynamicData, buildPageResponse, buildListItemResponse, requireAuth, } from './helpers';
2
+ export const templatesEndpoints = [
3
+ // GET /api/nitrogen/v1/templates — List templates
4
+ {
5
+ path: '/nitrogen/v1/nitrogen-templates',
6
+ method: 'get',
7
+ handler: async (req) => {
8
+ const { payload } = req;
9
+ const settings = await getNitrogenSettings(payload);
10
+ const url = new URL(req.url || '', 'http://localhost');
11
+ const templateType = url.searchParams.get('templateType');
12
+ const where = {
13
+ status: { equals: 'published' },
14
+ };
15
+ if (templateType) {
16
+ where.associatedCollection = { equals: templateType };
17
+ }
18
+ const result = await payload.find({
19
+ collection: 'nitrogen-templates',
20
+ where,
21
+ limit: 0,
22
+ depth: 1,
23
+ });
24
+ const items = result.docs.map((doc) => ({
25
+ ...buildListItemResponse(doc, settings),
26
+ postType: doc.associatedCollection || '',
27
+ }));
28
+ return Response.json(items);
29
+ },
30
+ },
31
+ // GET /api/nitrogen/v1/templates/:id — Get a single template
32
+ {
33
+ path: '/nitrogen/v1/nitrogen-templates/:id',
34
+ method: 'get',
35
+ handler: async (req) => {
36
+ const { payload, routeParams } = req;
37
+ const id = routeParams?.id;
38
+ try {
39
+ const doc = await payload.findByID({
40
+ collection: 'nitrogen-templates',
41
+ id,
42
+ depth: 1,
43
+ });
44
+ const settings = await getNitrogenSettings(payload);
45
+ // Build dynamic data from the first document of the associated collection
46
+ // so the template preview has real data to bind to
47
+ let dynamicData = buildDynamicData(doc, settings);
48
+ const associatedCollection = doc.associatedCollection;
49
+ if (associatedCollection &&
50
+ associatedCollection !== 'header' &&
51
+ associatedCollection !== 'footer') {
52
+ try {
53
+ const associated = await payload.find({
54
+ collection: associatedCollection,
55
+ limit: 1,
56
+ depth: 1,
57
+ });
58
+ if (associated.docs.length) {
59
+ dynamicData = buildDynamicData(associated.docs[0], settings);
60
+ }
61
+ }
62
+ catch {
63
+ // Collection may not exist — use template's own data
64
+ }
65
+ }
66
+ const response = buildPageResponse(doc, settings, dynamicData);
67
+ return Response.json({
68
+ ...response,
69
+ postType: associatedCollection || '',
70
+ });
71
+ }
72
+ catch {
73
+ return Response.json({ error: 'Not found' }, { status: 404 });
74
+ }
75
+ },
76
+ },
77
+ // PATCH /api/nitrogen/v1/templates/:id — Update a template
78
+ {
79
+ path: '/nitrogen/v1/nitrogen-templates/:id',
80
+ method: 'patch',
81
+ handler: async (req) => {
82
+ const authError = requireAuth(req);
83
+ if (authError)
84
+ return authError;
85
+ const { payload, routeParams } = req;
86
+ const id = routeParams?.id;
87
+ const body = (await req.json?.());
88
+ const data = body?.data || body;
89
+ if (!data?.title) {
90
+ return Response.json({ error: 'Title is required' }, { status: 400 });
91
+ }
92
+ const updateData = { title: data.title };
93
+ if (data.author) {
94
+ updateData.author = data.author;
95
+ }
96
+ if ('data' in data && data.data !== undefined) {
97
+ updateData.nitrogenData =
98
+ typeof data.data === 'string' ? JSON.parse(data.data) : data.data;
99
+ }
100
+ if (data.templateType !== undefined) {
101
+ updateData.associatedCollection = data.templateType;
102
+ }
103
+ if (data.settings !== undefined) {
104
+ updateData.templateSettings = data.settings;
105
+ }
106
+ await payload.update({
107
+ collection: 'nitrogen-templates',
108
+ id,
109
+ data: updateData,
110
+ });
111
+ return Response.json({ success: true });
112
+ },
113
+ },
114
+ ];
@@ -0,0 +1,16 @@
1
+ import type { BuilderModule } from "@nitrogenbuilder/types";
2
+ export interface NitrogenPageClientProps {
3
+ pageId: string;
4
+ pageData: BuilderModule[];
5
+ dynamicData: Record<string, unknown>;
6
+ isBuilder?: boolean;
7
+ collection?: string;
8
+ }
9
+ /**
10
+ * Client component that renders Nitrogen pages using React.
11
+ *
12
+ * Uses `useNitrogenData` hook for live preview updates in builder mode,
13
+ * and `NitrogenRenderer` for React-based rendering of the component tree.
14
+ */
15
+ export declare function NitrogenPageClient({ pageId, pageData, dynamicData: initialDynamicData, isBuilder, collection, }: NitrogenPageClientProps): import("react/jsx-runtime").JSX.Element;
16
+ export default NitrogenPageClient;
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useEffect } from "react";
4
+ import { NitrogenRenderer, useNitrogenData, } from "@nitrogenbuilder/client-react";
5
+ import { Nitrogen } from "@nitrogenbuilder/client-core";
6
+ /**
7
+ * Client component that renders Nitrogen pages using React.
8
+ *
9
+ * Uses `useNitrogenData` hook for live preview updates in builder mode,
10
+ * and `NitrogenRenderer` for React-based rendering of the component tree.
11
+ */
12
+ export function NitrogenPageClient({ pageId, pageData, dynamicData: initialDynamicData, isBuilder = false, collection, }) {
13
+ // Use the hook for live preview updates
14
+ const page = useNitrogenData({
15
+ type: "page",
16
+ id: pageId,
17
+ data: pageData,
18
+ dynamicData: initialDynamicData,
19
+ });
20
+ // Set up builder mode scripts when in preview
21
+ useEffect(() => {
22
+ if (!isBuilder)
23
+ return;
24
+ // Load Nitrogen client bridge (handles editor ↔ iframe communication)
25
+ const clientBridgeScript = document.createElement("script");
26
+ clientBridgeScript.src =
27
+ "https://cdn.jsdelivr.net/npm/@nitrogenbuilder/client@0.3/nitrogen-client.js";
28
+ document.body.appendChild(clientBridgeScript);
29
+ // Once the bridge receives the 'init' message from the editor,
30
+ // dispatch the component definitions so they appear in the sidebar.
31
+ function onBridgeReady() {
32
+ const allModules = Nitrogen.modules;
33
+ if (!allModules.size)
34
+ return;
35
+ const modules = {};
36
+ allModules.forEach((mod, name) => {
37
+ modules[name] = mod;
38
+ });
39
+ window.dispatchEvent(new CustomEvent("nitrogen-modules", {
40
+ detail: { modules },
41
+ }));
42
+ }
43
+ // nitrogen-client.js dispatches 'nitrogen-initialized' after the editor
44
+ // sends its init postMessage.
45
+ window.addEventListener("nitrogen-initialized", onBridgeReady);
46
+ return () => {
47
+ window.removeEventListener("nitrogen-initialized", onBridgeReady);
48
+ if (clientBridgeScript.parentNode) {
49
+ clientBridgeScript.parentNode.removeChild(clientBridgeScript);
50
+ }
51
+ };
52
+ }, [isBuilder]);
53
+ return (_jsx("div", { "data-nitrogen-location": "page", "data-page-id": pageId, "data-collection": collection, children: _jsx(NitrogenRenderer, { page: page?.data ?? [], dynamicData: page?.dynamicData ?? initialDynamicData, requestedData: {} }) }));
54
+ }
55
+ export default NitrogenPageClient;
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import type { BuilderModule } from '@nitrogenbuilder/types';
3
+ export interface NitrogenWrapperProps {
4
+ /**
5
+ * The page document from Payload. Must have `id` and optionally `nitrogenData`.
6
+ */
7
+ page: {
8
+ id: string | number;
9
+ nitrogenData?: BuilderModule[] | null;
10
+ [key: string]: unknown;
11
+ };
12
+ /**
13
+ * Next.js searchParams (awaited). Used to detect builder mode.
14
+ */
15
+ searchParams: Record<string, string | string[] | undefined>;
16
+ /**
17
+ * The Payload collection this page belongs to.
18
+ */
19
+ collection: string;
20
+ /**
21
+ * Regular page content to render when not in Nitrogen mode.
22
+ */
23
+ children: React.ReactNode;
24
+ }
25
+ /**
26
+ * Server component that wraps your page content and automatically handles
27
+ * Nitrogen builder mode and Nitrogen-rendered pages.
28
+ *
29
+ * Usage:
30
+ * ```tsx
31
+ * import { NitrogenWrapper } from 'nitrogen-connector-payload/frontend'
32
+ *
33
+ * export default async function Page({ params, searchParams }) {
34
+ * const page = await queryPage(...)
35
+ *
36
+ * return (
37
+ * <NitrogenWrapper page={page} searchParams={await searchParams} collection="pages">
38
+ * <YourRegularPageContent page={page} />
39
+ * </NitrogenWrapper>
40
+ * )
41
+ * }
42
+ * ```
43
+ */
44
+ export declare function NitrogenWrapper({ page, searchParams, collection, children, }: NitrogenWrapperProps): Promise<import("react/jsx-runtime").JSX.Element>;
45
+ export default NitrogenWrapper;
@@ -0,0 +1,38 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ import { getPayload } from 'payload';
3
+ import { NitrogenPageClient } from './NitrogenPageClient';
4
+ import { buildDynamicData, getNitrogenSettings } from '../endpoints/helpers';
5
+ /**
6
+ * Server component that wraps your page content and automatically handles
7
+ * Nitrogen builder mode and Nitrogen-rendered pages.
8
+ *
9
+ * Usage:
10
+ * ```tsx
11
+ * import { NitrogenWrapper } from 'nitrogen-connector-payload/frontend'
12
+ *
13
+ * export default async function Page({ params, searchParams }) {
14
+ * const page = await queryPage(...)
15
+ *
16
+ * return (
17
+ * <NitrogenWrapper page={page} searchParams={await searchParams} collection="pages">
18
+ * <YourRegularPageContent page={page} />
19
+ * </NitrogenWrapper>
20
+ * )
21
+ * }
22
+ * ```
23
+ */
24
+ export async function NitrogenWrapper({ page, searchParams, collection, children, }) {
25
+ const isBuilder = searchParams['nitrogen-builder'] !== undefined;
26
+ const hasNitrogenData = Array.isArray(page.nitrogenData) && page.nitrogenData.length > 0;
27
+ // If not in builder mode and no Nitrogen data, render regular content
28
+ if (!isBuilder && !hasNitrogenData) {
29
+ return _jsx(_Fragment, { children: children });
30
+ }
31
+ // Fetch Nitrogen settings and build dynamic data
32
+ const payloadConfig = (await import('@payload-config')).default;
33
+ const payload = await getPayload({ config: payloadConfig });
34
+ const settings = await getNitrogenSettings(payload);
35
+ const dynamicData = buildDynamicData(page, settings);
36
+ return (_jsx(NitrogenPageClient, { pageId: String(page.id), pageData: page.nitrogenData || [], dynamicData: dynamicData, isBuilder: isBuilder, collection: collection }));
37
+ }
38
+ export default NitrogenWrapper;
@@ -0,0 +1,7 @@
1
+ export { NitrogenWrapper } from "./NitrogenWrapper";
2
+ export type { NitrogenWrapperProps } from "./NitrogenWrapper";
3
+ export { NitrogenPageClient } from "./NitrogenPageClient";
4
+ export type { NitrogenPageClientProps } from "./NitrogenPageClient";
5
+ export { buildDynamicData, getNitrogenSettings } from "../endpoints/helpers";
6
+ export { nitrogen } from "@nitrogenbuilder/client-core";
7
+ export type { ComponentSettings, ComponentSettingsToProps, } from "@nitrogenbuilder/types";
@@ -0,0 +1,8 @@
1
+ // Main export - use NitrogenWrapper for simplest integration
2
+ export { NitrogenWrapper } from "./NitrogenWrapper";
3
+ // Lower-level exports for custom implementations
4
+ export { NitrogenPageClient } from "./NitrogenPageClient";
5
+ // Helper exports for data fetching (server-safe)
6
+ export { buildDynamicData, getNitrogenSettings } from "../endpoints/helpers";
7
+ // Re-export nitrogen singleton for registering custom components
8
+ export { nitrogen } from "@nitrogenbuilder/client-core";
@@ -0,0 +1,2 @@
1
+ import type { GlobalConfig } from 'payload';
2
+ export declare const NitrogenSettings: GlobalConfig;
@@ -0,0 +1,41 @@
1
+ export const NitrogenSettings = {
2
+ slug: 'nitrogen-settings',
3
+ access: {
4
+ read: ({ req }) => !!req.user,
5
+ update: ({ req }) => !!req.user,
6
+ },
7
+ fields: [
8
+ {
9
+ name: 'licenseKey',
10
+ type: 'text',
11
+ admin: { description: 'Nitrogen license key' },
12
+ },
13
+ {
14
+ name: 'connectorToken',
15
+ type: 'text',
16
+ admin: { description: 'Connector token for server communication' },
17
+ },
18
+ {
19
+ name: 'instanceUrl',
20
+ type: 'text',
21
+ admin: { description: 'Nitrogen instance URL' },
22
+ },
23
+ {
24
+ name: 'frontendUrl',
25
+ type: 'text',
26
+ admin: { description: 'Production frontend URL' },
27
+ },
28
+ {
29
+ name: 'developmentUrl',
30
+ type: 'text',
31
+ admin: { description: 'Local development URL' },
32
+ },
33
+ {
34
+ name: 'nitrogenConfig',
35
+ type: 'json',
36
+ admin: {
37
+ description: 'Full Nitrogen configuration JSON (colors, variables, CSS injection, URL maps, etc.)',
38
+ },
39
+ },
40
+ ],
41
+ };