@nitrogenbuilder/connector-payload 0.1.37 → 0.1.39

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.
@@ -0,0 +1,3 @@
1
+ import type { UIFieldServerComponent } from 'payload';
2
+ declare const NitrogenPackageVersionsField: UIFieldServerComponent;
3
+ export default NitrogenPackageVersionsField;
@@ -0,0 +1,138 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { createRequire } from 'node:module';
5
+ import { NITROGEN_PACKAGE_NAMES, } from '../constants.js';
6
+ async function readJsonFile(filePath) {
7
+ try {
8
+ const contents = await fs.readFile(filePath, 'utf8');
9
+ return JSON.parse(contents);
10
+ }
11
+ catch {
12
+ return undefined;
13
+ }
14
+ }
15
+ async function fileExists(filePath) {
16
+ try {
17
+ await fs.access(filePath);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ function getDeclaredSpec(packageJson, packageName) {
25
+ return (packageJson.dependencies?.[packageName] ||
26
+ packageJson.devDependencies?.[packageName] ||
27
+ packageJson.optionalDependencies?.[packageName] ||
28
+ packageJson.peerDependencies?.[packageName]);
29
+ }
30
+ async function findNearestPackageJson(packageName, startPath) {
31
+ let directory = path.dirname(startPath);
32
+ while (directory !== path.dirname(directory)) {
33
+ const packageJsonPath = path.join(directory, 'package.json');
34
+ const packageJson = await readJsonFile(packageJsonPath);
35
+ if (packageJson?.name === packageName) {
36
+ return { packageJson, packageJsonPath };
37
+ }
38
+ directory = path.dirname(directory);
39
+ }
40
+ return undefined;
41
+ }
42
+ async function resolveInstalledPackageVersion(appRoot, packageName) {
43
+ try {
44
+ const requireFromApp = createRequire(path.join(appRoot, 'package.json'));
45
+ const entryPath = requireFromApp.resolve(packageName);
46
+ const resolvedPackage = await findNearestPackageJson(packageName, entryPath);
47
+ return {
48
+ installedVersion: resolvedPackage?.packageJson.version,
49
+ resolvedPackageJsonPath: resolvedPackage?.packageJsonPath,
50
+ };
51
+ }
52
+ catch {
53
+ return {};
54
+ }
55
+ }
56
+ async function findPackageJsonPath(candidates) {
57
+ for (const candidate of candidates) {
58
+ if (!candidate)
59
+ continue;
60
+ const packageJsonPath = candidate.endsWith('package.json')
61
+ ? candidate
62
+ : path.join(candidate, 'package.json');
63
+ if (await fileExists(packageJsonPath)) {
64
+ return packageJsonPath;
65
+ }
66
+ }
67
+ return undefined;
68
+ }
69
+ function buildFrontendRootCandidates(cwd) {
70
+ return [
71
+ process.env.NITROGEN_FRONTEND_PACKAGE_JSON,
72
+ process.env.NITROGEN_FRONTEND_ROOT,
73
+ path.resolve(cwd, '../frontend'),
74
+ path.resolve(cwd, '../../apps/frontend'),
75
+ path.resolve(cwd, 'apps/frontend'),
76
+ path.resolve(cwd, '../apps/frontend'),
77
+ ];
78
+ }
79
+ async function getAppVersionSummary(app, label, packageJsonCandidates) {
80
+ const packageJsonPath = await findPackageJsonPath(packageJsonCandidates);
81
+ const packageJson = packageJsonPath
82
+ ? await readJsonFile(packageJsonPath)
83
+ : undefined;
84
+ const rootPath = packageJsonPath ? path.dirname(packageJsonPath) : undefined;
85
+ const packages = rootPath && packageJson
86
+ ? await Promise.all(NITROGEN_PACKAGE_NAMES.map(async (packageName) => {
87
+ const installed = await resolveInstalledPackageVersion(rootPath, packageName);
88
+ return {
89
+ declaredSpec: getDeclaredSpec(packageJson, packageName),
90
+ packageName,
91
+ ...installed,
92
+ };
93
+ }))
94
+ : [];
95
+ return {
96
+ app,
97
+ label,
98
+ packageJsonPath,
99
+ packages: packages.filter((pkg) => pkg.declaredSpec || pkg.installedVersion),
100
+ rootPath,
101
+ };
102
+ }
103
+ function versionCell(version) {
104
+ return version ? (_jsx("code", { style: { color: '#111827', fontSize: 12 }, children: version })) : (_jsx("span", { style: { color: '#9ca3af' }, children: "Not resolved" }));
105
+ }
106
+ function renderAppSummary(summary) {
107
+ return (_jsxs("section", { style: {
108
+ border: '1px solid #e5e7eb',
109
+ borderRadius: 8,
110
+ overflow: 'hidden',
111
+ }, children: [_jsxs("div", { style: { background: '#f9fafb', padding: '12px 14px' }, children: [_jsx("h3", { style: { fontSize: 15, margin: 0 }, children: summary.label }), summary.packageJsonPath ? (_jsx("p", { style: { color: '#6b7280', fontSize: 12, margin: '4px 0 0' }, children: summary.packageJsonPath })) : (_jsx("p", { style: { color: '#991b1b', fontSize: 12, margin: '4px 0 0' }, children: "Could not find package.json." }))] }), summary.packages.length ? (_jsx("div", { style: { overflowX: 'auto' }, children: _jsxs("table", { style: { borderCollapse: 'collapse', fontSize: 13, width: '100%' }, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { style: tableHeaderStyle, children: "Package" }), _jsx("th", { style: tableHeaderStyle, children: "Declared spec" }), _jsx("th", { style: tableHeaderStyle, children: "Installed version" })] }) }), _jsx("tbody", { children: summary.packages.map((pkg) => (_jsxs("tr", { children: [_jsx("td", { style: tableCellStyle, children: _jsx("code", { style: { fontSize: 12 }, children: pkg.packageName }) }), _jsx("td", { style: tableCellStyle, children: pkg.declaredSpec ? (_jsx("code", { style: { color: '#374151', fontSize: 12 }, children: pkg.declaredSpec })) : (_jsx("span", { style: { color: '#9ca3af' }, children: "Not declared" })) }), _jsx("td", { style: tableCellStyle, children: versionCell(pkg.installedVersion) })] }, pkg.packageName))) })] }) })) : (_jsx("p", { style: { color: '#6b7280', fontSize: 13, margin: 0, padding: 14 }, children: "No @nitrogenbuilder packages found for this app." }))] }, summary.app));
112
+ }
113
+ const tableHeaderStyle = {
114
+ borderTop: '1px solid #e5e7eb',
115
+ color: '#4b5563',
116
+ fontSize: 12,
117
+ fontWeight: 700,
118
+ padding: '10px 12px',
119
+ textAlign: 'left',
120
+ };
121
+ const tableCellStyle = {
122
+ borderTop: '1px solid #e5e7eb',
123
+ padding: '10px 12px',
124
+ verticalAlign: 'top',
125
+ };
126
+ const NitrogenPackageVersionsField = async () => {
127
+ const cwd = process.cwd();
128
+ const [backend, frontend] = await Promise.all([
129
+ getAppVersionSummary('backend', 'Backend', [
130
+ process.env.NITROGEN_BACKEND_PACKAGE_JSON,
131
+ process.env.NITROGEN_BACKEND_ROOT,
132
+ cwd,
133
+ ]),
134
+ getAppVersionSummary('frontend', 'Frontend', buildFrontendRootCandidates(cwd)),
135
+ ]);
136
+ return (_jsxs("div", { style: { display: 'grid', gap: 14, marginBottom: 24 }, children: [renderAppSummary(backend), renderAppSummary(frontend)] }));
137
+ };
138
+ export default NitrogenPackageVersionsField;
@@ -0,0 +1,3 @@
1
+ import type { UIFieldServerComponent } from 'payload';
2
+ declare const NitrogenPackageVersionsHeaderField: UIFieldServerComponent;
3
+ export default NitrogenPackageVersionsHeaderField;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const NitrogenPackageVersionsHeaderField = () => {
3
+ return (_jsxs("div", { style: { marginBottom: 16 }, children: [_jsx("h2", { style: { fontSize: 18, margin: '0 0 6px' }, children: "Nitrogen Versions" }), _jsx("p", { style: { color: '#6b7280', fontSize: 13, margin: 0, maxWidth: 920 }, children: "Declared spec is read from package.json. Installed version is resolved from node_modules, so dev link/file dependencies and production installs are shown separately." })] }));
4
+ };
5
+ export default NitrogenPackageVersionsHeaderField;
@@ -0,0 +1,2 @@
1
+ export declare const DEFAULT_EDITOR_CDN_VERSION = "0.5.30";
2
+ export declare const NITROGEN_PACKAGE_NAMES: readonly ["@nitrogenbuilder/client", "@nitrogenbuilder/client-core", "@nitrogenbuilder/client-preact", "@nitrogenbuilder/client-react", "@nitrogenbuilder/connector-payload", "@nitrogenbuilder/editor", "@nitrogenbuilder/types"];
@@ -0,0 +1,10 @@
1
+ export const DEFAULT_EDITOR_CDN_VERSION = '0.5.30';
2
+ export const NITROGEN_PACKAGE_NAMES = [
3
+ '@nitrogenbuilder/client',
4
+ '@nitrogenbuilder/client-core',
5
+ '@nitrogenbuilder/client-preact',
6
+ '@nitrogenbuilder/client-react',
7
+ '@nitrogenbuilder/connector-payload',
8
+ '@nitrogenbuilder/editor',
9
+ '@nitrogenbuilder/types',
10
+ ];
@@ -2,7 +2,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
2
2
  import { getPayload } from "payload";
3
3
  import { headers } from "next/headers";
4
4
  import { redirect } from "next/navigation";
5
- const EDITOR_CDN_VERSION = "0.5.30";
5
+ import { DEFAULT_EDITOR_CDN_VERSION } from "../constants.js";
6
6
  function getNitrogenApiUrl(isDevelopment) {
7
7
  if (isDevelopment) {
8
8
  return "/api/nitrogen/v1";
@@ -111,7 +111,11 @@ export function createNitrogenEditorPage(config) {
111
111
  const editorAssetsBase = isEditorDev
112
112
  ? editorOrigin
113
113
  : "/nitrogen-editor/assets";
114
- const cdnBase = `https://cdn.jsdelivr.net/npm/@nitrogenbuilder/editor@${EDITOR_CDN_VERSION}`;
114
+ const editorCdnVersion = typeof settings.editorCdnVersion === "string" &&
115
+ settings.editorCdnVersion.trim()
116
+ ? settings.editorCdnVersion.trim()
117
+ : DEFAULT_EDITOR_CDN_VERSION;
118
+ const cdnBase = `https://cdn.jsdelivr.net/npm/@nitrogenbuilder/editor@${editorCdnVersion}`;
115
119
  return (_jsxs(_Fragment, { children: [!isEditorDev && (_jsxs(_Fragment, { children: [_jsx("link", { rel: "preconnect", href: "https://cdn.jsdelivr.net" }), _jsx("link", { rel: "preconnect", href: "https://fonts.gstatic.com", crossOrigin: "" })] })), isEditorDev ? (_jsxs(_Fragment, { children: [_jsx("link", { rel: "stylesheet", crossOrigin: "", href: `${editorAssetsBase}/fa620pro/css/all.css` }), _jsx("link", { rel: "stylesheet", crossOrigin: "", href: `${editorAssetsBase}/fa620pro/css/sharp-solid.css` }), _jsx("link", { rel: "stylesheet", crossOrigin: "", href: `${editorOrigin}/src/index.scss` })] })) : (_jsxs(_Fragment, { children: [_jsx("link", { rel: "stylesheet", crossOrigin: "", href: `${editorAssetsBase}/fa620pro/css/all.css` }), _jsx("link", { rel: "stylesheet", crossOrigin: "", href: `${editorAssetsBase}/fa620pro/css/sharp-solid.css` }), _jsx("link", { rel: "stylesheet", crossOrigin: "", href: `${cdnBase}/index.css` })] })), _jsx("script", { dangerouslySetInnerHTML: {
116
120
  __html: [
117
121
  `window.nitrogenConfig = ${JSON.stringify(builderConfig)};`,
@@ -1,3 +1,12 @@
1
+ import { DEFAULT_EDITOR_CDN_VERSION } from '../constants.js';
2
+ function validateEditorCdnVersion(value) {
3
+ if (typeof value !== 'string' || value.trim() === '') {
4
+ return true;
5
+ }
6
+ return /^[0-9A-Za-z][0-9A-Za-z._+-]*$/.test(value.trim())
7
+ ? true
8
+ : 'Use an npm version or dist tag, such as 0.5.30, latest, or beta.';
9
+ }
1
10
  export const NitrogenSettings = {
2
11
  slug: 'nitrogen-settings',
3
12
  admin: {
@@ -43,5 +52,33 @@ export const NitrogenSettings = {
43
52
  },
44
53
  },
45
54
  },
55
+ {
56
+ name: 'packageVersionsHeader',
57
+ type: 'ui',
58
+ admin: {
59
+ components: {
60
+ Field: '@nitrogenbuilder/connector-payload/components/NitrogenPackageVersionsHeaderField',
61
+ },
62
+ },
63
+ },
64
+ {
65
+ name: 'editorCdnVersion',
66
+ label: 'Editor CDN Version',
67
+ type: 'text',
68
+ defaultValue: DEFAULT_EDITOR_CDN_VERSION,
69
+ validate: validateEditorCdnVersion,
70
+ admin: {
71
+ description: 'Version or npm dist tag used for @nitrogenbuilder/editor on jsDelivr when not using editor development mode.',
72
+ },
73
+ },
74
+ {
75
+ name: 'packageVersions',
76
+ type: 'ui',
77
+ admin: {
78
+ components: {
79
+ Field: '@nitrogenbuilder/connector-payload/components/NitrogenPackageVersionsField',
80
+ },
81
+ },
82
+ },
46
83
  ],
47
84
  };
package/dist/types.d.ts CHANGED
@@ -36,6 +36,7 @@ export interface NitrogenSettingsGlobal {
36
36
  instanceUrl?: string;
37
37
  frontendUrl?: string;
38
38
  developmentUrl?: string;
39
+ editorCdnVersion?: string;
39
40
  nitrogenConfig?: NitrogenConfig;
40
41
  }
41
42
  export interface NitrogenConfig {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitrogenbuilder/connector-payload",
3
- "version": "0.1.37",
3
+ "version": "0.1.39",
4
4
  "description": "Nitrogen page builder connector plugin for Payload CMS 3.x",
5
5
  "author": "Leonardo Dentzien <leo@torchmedia.ca>",
6
6
  "type": "module",
@@ -38,9 +38,9 @@
38
38
  "next": "^15.0.0 || ^16.0.0",
39
39
  "react": "^19.0.0",
40
40
  "@payloadcms/ui": "^3.0.0",
41
- "@nitrogenbuilder/client-react": ">=0.3.0",
42
- "@nitrogenbuilder/client-core": ">=0.3.0",
43
- "@nitrogenbuilder/types": ">=0.3.0"
41
+ "@nitrogenbuilder/client-react": ">=1.0.0",
42
+ "@nitrogenbuilder/client-core": ">=1.0.0",
43
+ "@nitrogenbuilder/types": ">=1.0.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@payloadcms/ui": "3.83.0",