@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.
- package/dist/components/NitrogenPackageVersionsField.d.ts +3 -0
- package/dist/components/NitrogenPackageVersionsField.js +138 -0
- package/dist/components/NitrogenPackageVersionsHeaderField.d.ts +3 -0
- package/dist/components/NitrogenPackageVersionsHeaderField.js +5 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +10 -0
- package/dist/editor/NitrogenEditorPage.js +6 -2
- package/dist/globals/NitrogenSettings.js +37 -0
- package/dist/types.d.ts +1 -0
- package/package.json +4 -4
|
@@ -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,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
|
-
|
|
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
|
|
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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nitrogenbuilder/connector-payload",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
42
|
-
"@nitrogenbuilder/client-core": ">=0.
|
|
43
|
-
"@nitrogenbuilder/types": ">=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",
|