@leadcms/sdk 3.3.11 → 3.3.12
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/cli/bin/pull-settings.d.ts +6 -0
- package/dist/cli/bin/pull-settings.d.ts.map +1 -0
- package/dist/cli/bin/pull-settings.js +31 -0
- package/dist/cli/bin/pull-settings.js.map +1 -0
- package/dist/cli/bin/push-all.js +8 -1
- package/dist/cli/bin/push-all.js.map +1 -1
- package/dist/cli/bin/push-email-templates.js +13 -1
- package/dist/cli/bin/push-email-templates.js.map +1 -1
- package/dist/cli/bin/push-settings.d.ts +6 -0
- package/dist/cli/bin/push-settings.d.ts.map +1 -0
- package/dist/cli/bin/push-settings.js +34 -0
- package/dist/cli/bin/push-settings.js.map +1 -0
- package/dist/cli/bin/status-all.js +54 -2
- package/dist/cli/bin/status-all.js.map +1 -1
- package/dist/cli/bin/status-settings.d.ts +6 -0
- package/dist/cli/bin/status-settings.d.ts.map +1 -0
- package/dist/cli/bin/status-settings.js +27 -0
- package/dist/cli/bin/status-settings.js.map +1 -0
- package/dist/cli/index.js +20 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/cms-config-types.d.ts +4 -0
- package/dist/lib/cms-config-types.d.ts.map +1 -1
- package/dist/lib/cms-config-types.js +6 -0
- package/dist/lib/cms-config-types.js.map +1 -1
- package/dist/lib/cms.d.ts.map +1 -1
- package/dist/lib/cms.js +1 -0
- package/dist/lib/cms.js.map +1 -1
- package/dist/lib/config.d.ts +2 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +6 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/data-service.js +1 -1
- package/dist/lib/data-service.js.map +1 -1
- package/dist/lib/settings-types.d.ts +120 -0
- package/dist/lib/settings-types.d.ts.map +1 -0
- package/dist/lib/settings-types.js +84 -0
- package/dist/lib/settings-types.js.map +1 -0
- package/dist/scripts/init-leadcms.d.ts.map +1 -1
- package/dist/scripts/init-leadcms.js +15 -1
- package/dist/scripts/init-leadcms.js.map +1 -1
- package/dist/scripts/leadcms-helpers.d.ts +1 -0
- package/dist/scripts/leadcms-helpers.d.ts.map +1 -1
- package/dist/scripts/leadcms-helpers.js +1 -0
- package/dist/scripts/leadcms-helpers.js.map +1 -1
- package/dist/scripts/pull-all.d.ts +5 -1
- package/dist/scripts/pull-all.d.ts.map +1 -1
- package/dist/scripts/pull-all.js +32 -5
- package/dist/scripts/pull-all.js.map +1 -1
- package/dist/scripts/pull-settings.d.ts +19 -0
- package/dist/scripts/pull-settings.d.ts.map +1 -0
- package/dist/scripts/pull-settings.js +69 -0
- package/dist/scripts/pull-settings.js.map +1 -0
- package/dist/scripts/push-email-templates.d.ts +4 -1
- package/dist/scripts/push-email-templates.d.ts.map +1 -1
- package/dist/scripts/push-email-templates.js +57 -12
- package/dist/scripts/push-email-templates.js.map +1 -1
- package/dist/scripts/push-leadcms-content.d.ts.map +1 -1
- package/dist/scripts/push-leadcms-content.js +29 -10
- package/dist/scripts/push-leadcms-content.js.map +1 -1
- package/dist/scripts/push-media.d.ts.map +1 -1
- package/dist/scripts/push-media.js +13 -8
- package/dist/scripts/push-media.js.map +1 -1
- package/dist/scripts/push-settings.d.ts +56 -0
- package/dist/scripts/push-settings.d.ts.map +1 -0
- package/dist/scripts/push-settings.js +272 -0
- package/dist/scripts/push-settings.js.map +1 -0
- package/dist/scripts/settings-manager.d.ts +52 -0
- package/dist/scripts/settings-manager.d.ts.map +1 -0
- package/dist/scripts/settings-manager.js +469 -0
- package/dist/scripts/settings-manager.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LeadCMS Settings Management
|
|
3
|
+
*
|
|
4
|
+
* Handles fetching, saving, reading, comparing, and pushing CMS settings.
|
|
5
|
+
* Settings are stored locally as:
|
|
6
|
+
* - ai-siteprofile/*.md (one file per AI.SiteProfile.* key)
|
|
7
|
+
* - content.json (all Content.* keys grouped)
|
|
8
|
+
* - media.json (all Media.* keys grouped)
|
|
9
|
+
*
|
|
10
|
+
* Language-specific settings go into locale subdirectories.
|
|
11
|
+
*/
|
|
12
|
+
import fs from "fs/promises";
|
|
13
|
+
import path from "path";
|
|
14
|
+
import axios from "axios";
|
|
15
|
+
import { logger } from "../lib/logger.js";
|
|
16
|
+
import { TRACKED_SETTING_KEYS, CONTENT_SETTING_PREFIX, MEDIA_SETTING_PREFIX, aiSiteProfileKeyToFileName, fileNameToAiSiteProfileKey, isAiSiteProfileKey, isContentSettingKey, isMediaSettingKey, } from "../lib/settings-types.js";
|
|
17
|
+
// ── Constants ────────────────────────────────────────────────────────────────
|
|
18
|
+
const AI_SITEPROFILE_FOLDER = "ai-siteprofile";
|
|
19
|
+
// ── Export remote settings ───────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Fetch all settings from the CMS via /api/settings/export
|
|
22
|
+
*/
|
|
23
|
+
export async function fetchRemoteSettings(leadCMSUrl, leadCMSApiKey) {
|
|
24
|
+
if (!leadCMSUrl)
|
|
25
|
+
throw new Error("LeadCMS URL is not configured.");
|
|
26
|
+
if (!leadCMSApiKey)
|
|
27
|
+
throw new Error("LeadCMS API key is required to fetch settings.");
|
|
28
|
+
const url = new URL("/api/settings/export", leadCMSUrl);
|
|
29
|
+
logger.verbose(`[LeadCMS] Fetching settings from ${url.toString()}`);
|
|
30
|
+
const res = await axios.get(url.toString(), {
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Bearer ${leadCMSApiKey}`,
|
|
33
|
+
Accept: "text/json",
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
const allSettings = res.data || [];
|
|
37
|
+
logger.verbose(`[LeadCMS] Received ${allSettings.length} settings from CMS`);
|
|
38
|
+
return allSettings;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Filter remote settings to only tracked keys.
|
|
42
|
+
* Also filters out settings with null/empty values.
|
|
43
|
+
*/
|
|
44
|
+
export function filterTrackedSettings(settings) {
|
|
45
|
+
return settings.filter((s) => {
|
|
46
|
+
if (!TRACKED_SETTING_KEYS.includes(s.key))
|
|
47
|
+
return false;
|
|
48
|
+
if (s.value === null || s.value === undefined || s.value === "")
|
|
49
|
+
return false;
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// ── Save settings locally ────────────────────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* Save fetched settings to the local settings directory.
|
|
56
|
+
*
|
|
57
|
+
* @param settings - Tracked settings from the CMS
|
|
58
|
+
* @param settingsDir - Resolved path to the settings directory
|
|
59
|
+
* @param defaultLanguage - The project's default language
|
|
60
|
+
* @param targetName - Optional: only save settings matching this key name
|
|
61
|
+
*/
|
|
62
|
+
export async function saveSettingsLocally(settings, settingsDir, defaultLanguage, targetName) {
|
|
63
|
+
const reconcile = !targetName;
|
|
64
|
+
// Group settings by language
|
|
65
|
+
const byLanguage = new Map();
|
|
66
|
+
for (const setting of settings) {
|
|
67
|
+
if (targetName && setting.key !== targetName)
|
|
68
|
+
continue;
|
|
69
|
+
const lang = setting.language || null;
|
|
70
|
+
const langKey = lang || "__default__";
|
|
71
|
+
if (!byLanguage.has(langKey))
|
|
72
|
+
byLanguage.set(langKey, []);
|
|
73
|
+
byLanguage.get(langKey).push(setting);
|
|
74
|
+
}
|
|
75
|
+
for (const [langKey, langSettings] of byLanguage) {
|
|
76
|
+
const isDefault = langKey === "__default__";
|
|
77
|
+
const baseDir = isDefault ? settingsDir : path.join(settingsDir, langKey);
|
|
78
|
+
await saveSettingsForLanguage(langSettings, baseDir, reconcile);
|
|
79
|
+
}
|
|
80
|
+
if (reconcile) {
|
|
81
|
+
await reconcileMissingLanguages(settingsDir, byLanguage);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Save settings for a single language to a directory.
|
|
86
|
+
*/
|
|
87
|
+
async function saveSettingsForLanguage(settings, baseDir, reconcile) {
|
|
88
|
+
// Group by category
|
|
89
|
+
const aiSettings = settings.filter((s) => isAiSiteProfileKey(s.key));
|
|
90
|
+
const contentSettings = settings.filter((s) => isContentSettingKey(s.key));
|
|
91
|
+
const mediaSettings = settings.filter((s) => isMediaSettingKey(s.key));
|
|
92
|
+
// Save AI SiteProfile as individual .md files
|
|
93
|
+
if (aiSettings.length > 0 || reconcile) {
|
|
94
|
+
const aiDir = path.join(baseDir, AI_SITEPROFILE_FOLDER);
|
|
95
|
+
if (aiSettings.length > 0) {
|
|
96
|
+
await fs.mkdir(aiDir, { recursive: true });
|
|
97
|
+
for (const setting of aiSettings) {
|
|
98
|
+
const fileName = aiSiteProfileKeyToFileName(setting.key) + ".md";
|
|
99
|
+
const filePath = path.join(aiDir, fileName);
|
|
100
|
+
await fs.writeFile(filePath, setting.value || "", "utf8");
|
|
101
|
+
logger.verbose(`[LeadCMS] Saved ${setting.key} → ${filePath}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (reconcile) {
|
|
105
|
+
const keepFiles = new Set(aiSettings.map((s) => aiSiteProfileKeyToFileName(s.key) + ".md"));
|
|
106
|
+
const expectedTrackedFiles = TRACKED_SETTING_KEYS
|
|
107
|
+
.filter((key) => isAiSiteProfileKey(key))
|
|
108
|
+
.map((key) => aiSiteProfileKeyToFileName(key) + ".md");
|
|
109
|
+
for (const fileName of expectedTrackedFiles) {
|
|
110
|
+
if (keepFiles.has(fileName))
|
|
111
|
+
continue;
|
|
112
|
+
const filePath = path.join(aiDir, fileName);
|
|
113
|
+
try {
|
|
114
|
+
await fs.rm(filePath, { force: true });
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// ignore missing files
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const remaining = await fs.readdir(aiDir);
|
|
122
|
+
if (remaining.length === 0) {
|
|
123
|
+
await fs.rm(aiDir, { recursive: true, force: true });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// ignore when directory does not exist
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Save Content settings as content.json
|
|
132
|
+
if (contentSettings.length > 0 || reconcile) {
|
|
133
|
+
await fs.mkdir(baseDir, { recursive: true });
|
|
134
|
+
const contentObj = {};
|
|
135
|
+
for (const s of contentSettings) {
|
|
136
|
+
// Strip the prefix for cleaner JSON keys
|
|
137
|
+
const shortKey = s.key.slice(CONTENT_SETTING_PREFIX.length);
|
|
138
|
+
contentObj[shortKey] = s.value || "";
|
|
139
|
+
}
|
|
140
|
+
const filePath = path.join(baseDir, "content.json");
|
|
141
|
+
if (Object.keys(contentObj).length > 0) {
|
|
142
|
+
await fs.writeFile(filePath, JSON.stringify(contentObj, null, 2) + "\n", "utf8");
|
|
143
|
+
logger.verbose(`[LeadCMS] Saved content settings → ${filePath}`);
|
|
144
|
+
}
|
|
145
|
+
else if (reconcile) {
|
|
146
|
+
try {
|
|
147
|
+
await fs.rm(filePath, { force: true });
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// ignore missing files
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Save Media settings as media.json
|
|
155
|
+
if (mediaSettings.length > 0 || reconcile) {
|
|
156
|
+
await fs.mkdir(baseDir, { recursive: true });
|
|
157
|
+
const mediaObj = {};
|
|
158
|
+
for (const s of mediaSettings) {
|
|
159
|
+
const shortKey = s.key.slice(MEDIA_SETTING_PREFIX.length);
|
|
160
|
+
mediaObj[shortKey] = s.value || "";
|
|
161
|
+
}
|
|
162
|
+
const filePath = path.join(baseDir, "media.json");
|
|
163
|
+
if (Object.keys(mediaObj).length > 0) {
|
|
164
|
+
await fs.writeFile(filePath, JSON.stringify(mediaObj, null, 2) + "\n", "utf8");
|
|
165
|
+
logger.verbose(`[LeadCMS] Saved media settings → ${filePath}`);
|
|
166
|
+
}
|
|
167
|
+
else if (reconcile) {
|
|
168
|
+
try {
|
|
169
|
+
await fs.rm(filePath, { force: true });
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// ignore missing files
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (reconcile) {
|
|
177
|
+
try {
|
|
178
|
+
const remaining = await fs.readdir(baseDir);
|
|
179
|
+
if (remaining.length === 0) {
|
|
180
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// ignore when directory does not exist
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
async function reconcileMissingLanguages(settingsDir, byLanguage) {
|
|
189
|
+
const hasDefault = byLanguage.has("__default__");
|
|
190
|
+
if (!hasDefault) {
|
|
191
|
+
await saveSettingsForLanguage([], settingsDir, true);
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const entries = await fs.readdir(settingsDir, { withFileTypes: true });
|
|
195
|
+
for (const entry of entries) {
|
|
196
|
+
if (!entry.isDirectory())
|
|
197
|
+
continue;
|
|
198
|
+
if (entry.name === AI_SITEPROFILE_FOLDER)
|
|
199
|
+
continue;
|
|
200
|
+
if (!/^[a-z]{2}(-[a-zA-Z]{2,})?$/.test(entry.name))
|
|
201
|
+
continue;
|
|
202
|
+
if (byLanguage.has(entry.name))
|
|
203
|
+
continue;
|
|
204
|
+
const langDir = path.join(settingsDir, entry.name);
|
|
205
|
+
await saveSettingsForLanguage([], langDir, true);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// ── Read local settings ──────────────────────────────────────────────────────
|
|
213
|
+
/**
|
|
214
|
+
* Read all locally stored settings from the settings directory.
|
|
215
|
+
*
|
|
216
|
+
* @param settingsDir - Resolved path to the settings directory
|
|
217
|
+
* @param defaultLanguage - The project's default language
|
|
218
|
+
* @returns Array of local setting values with their keys and languages
|
|
219
|
+
*/
|
|
220
|
+
export async function readLocalSettings(settingsDir, defaultLanguage) {
|
|
221
|
+
const results = [];
|
|
222
|
+
try {
|
|
223
|
+
await fs.access(settingsDir);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
// Settings directory doesn't exist yet
|
|
227
|
+
return results;
|
|
228
|
+
}
|
|
229
|
+
// Read default language settings
|
|
230
|
+
const defaultSettings = await readLocalSettingsForDir(settingsDir, null);
|
|
231
|
+
results.push(...defaultSettings);
|
|
232
|
+
// Scan for locale subdirectories
|
|
233
|
+
const entries = await fs.readdir(settingsDir, { withFileTypes: true });
|
|
234
|
+
for (const entry of entries) {
|
|
235
|
+
if (!entry.isDirectory())
|
|
236
|
+
continue;
|
|
237
|
+
// Skip the ai-siteprofile folder (it's not a language folder)
|
|
238
|
+
if (entry.name === AI_SITEPROFILE_FOLDER)
|
|
239
|
+
continue;
|
|
240
|
+
// Check if it looks like a locale directory
|
|
241
|
+
if (/^[a-z]{2}(-[a-zA-Z]{2,})?$/.test(entry.name)) {
|
|
242
|
+
const langDir = path.join(settingsDir, entry.name);
|
|
243
|
+
const langSettings = await readLocalSettingsForDir(langDir, entry.name);
|
|
244
|
+
results.push(...langSettings);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return results;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Read settings from a single directory (for one language).
|
|
251
|
+
*/
|
|
252
|
+
async function readLocalSettingsForDir(dir, language) {
|
|
253
|
+
const results = [];
|
|
254
|
+
// Read AI SiteProfile .md files
|
|
255
|
+
const aiDir = path.join(dir, AI_SITEPROFILE_FOLDER);
|
|
256
|
+
try {
|
|
257
|
+
const aiFiles = await fs.readdir(aiDir);
|
|
258
|
+
for (const file of aiFiles) {
|
|
259
|
+
if (!file.endsWith(".md"))
|
|
260
|
+
continue;
|
|
261
|
+
const baseName = file.slice(0, -3); // strip .md
|
|
262
|
+
const key = fileNameToAiSiteProfileKey(baseName);
|
|
263
|
+
if (!key) {
|
|
264
|
+
logger.verbose(`[LeadCMS] Unknown ai-siteprofile file: ${file}, skipping`);
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const content = await fs.readFile(path.join(aiDir, file), "utf8");
|
|
268
|
+
results.push({ key, value: content, language });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// ai-siteprofile directory doesn't exist
|
|
273
|
+
}
|
|
274
|
+
// Read content.json
|
|
275
|
+
try {
|
|
276
|
+
const contentPath = path.join(dir, "content.json");
|
|
277
|
+
const contentRaw = await fs.readFile(contentPath, "utf8");
|
|
278
|
+
const contentObj = JSON.parse(contentRaw);
|
|
279
|
+
for (const [shortKey, value] of Object.entries(contentObj)) {
|
|
280
|
+
const fullKey = CONTENT_SETTING_PREFIX + shortKey;
|
|
281
|
+
if (TRACKED_SETTING_KEYS.includes(fullKey)) {
|
|
282
|
+
results.push({ key: fullKey, value, language });
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
// content.json doesn't exist
|
|
288
|
+
}
|
|
289
|
+
// Read media.json
|
|
290
|
+
try {
|
|
291
|
+
const mediaPath = path.join(dir, "media.json");
|
|
292
|
+
const mediaRaw = await fs.readFile(mediaPath, "utf8");
|
|
293
|
+
const mediaObj = JSON.parse(mediaRaw);
|
|
294
|
+
for (const [shortKey, value] of Object.entries(mediaObj)) {
|
|
295
|
+
const fullKey = MEDIA_SETTING_PREFIX + shortKey;
|
|
296
|
+
if (TRACKED_SETTING_KEYS.includes(fullKey)) {
|
|
297
|
+
results.push({ key: fullKey, value, language });
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
// media.json doesn't exist
|
|
303
|
+
}
|
|
304
|
+
return results;
|
|
305
|
+
}
|
|
306
|
+
// ── Compare local vs remote ─────────────────────────────────────────────────
|
|
307
|
+
/**
|
|
308
|
+
* Build a comparison between local and remote settings.
|
|
309
|
+
* Only includes tracked settings.
|
|
310
|
+
*/
|
|
311
|
+
export function buildSettingsStatus(localSettings, remoteSettings) {
|
|
312
|
+
const comparisons = [];
|
|
313
|
+
const seen = new Set();
|
|
314
|
+
// Build lookup for remote settings: "key|language" → SettingDetailsDto
|
|
315
|
+
const remoteMap = new Map();
|
|
316
|
+
for (const rs of remoteSettings) {
|
|
317
|
+
if (!TRACKED_SETTING_KEYS.includes(rs.key))
|
|
318
|
+
continue;
|
|
319
|
+
const mapKey = `${rs.key}|${rs.language || ""}`;
|
|
320
|
+
remoteMap.set(mapKey, rs);
|
|
321
|
+
}
|
|
322
|
+
// Build lookup for local settings: "key|language" → LocalSettingValue
|
|
323
|
+
const localMap = new Map();
|
|
324
|
+
for (const ls of localSettings) {
|
|
325
|
+
const mapKey = `${ls.key}|${ls.language || ""}`;
|
|
326
|
+
localMap.set(mapKey, ls);
|
|
327
|
+
}
|
|
328
|
+
// Compare all local settings against remote
|
|
329
|
+
for (const [mapKey, local] of localMap) {
|
|
330
|
+
seen.add(mapKey);
|
|
331
|
+
const remote = remoteMap.get(mapKey);
|
|
332
|
+
if (!remote) {
|
|
333
|
+
comparisons.push({
|
|
334
|
+
key: local.key,
|
|
335
|
+
language: local.language || null,
|
|
336
|
+
localValue: local.value,
|
|
337
|
+
remoteValue: null,
|
|
338
|
+
status: "local-only",
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
else if (local.value === (remote.value || "")) {
|
|
342
|
+
comparisons.push({
|
|
343
|
+
key: local.key,
|
|
344
|
+
language: local.language || null,
|
|
345
|
+
localValue: local.value,
|
|
346
|
+
remoteValue: remote.value || null,
|
|
347
|
+
status: "in-sync",
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
comparisons.push({
|
|
352
|
+
key: local.key,
|
|
353
|
+
language: local.language || null,
|
|
354
|
+
localValue: local.value,
|
|
355
|
+
remoteValue: remote.value || null,
|
|
356
|
+
status: "modified",
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// Check for remote-only settings
|
|
361
|
+
for (const [mapKey, remote] of remoteMap) {
|
|
362
|
+
if (seen.has(mapKey))
|
|
363
|
+
continue;
|
|
364
|
+
if (remote.value === null || remote.value === undefined || remote.value === "")
|
|
365
|
+
continue;
|
|
366
|
+
comparisons.push({
|
|
367
|
+
key: remote.key,
|
|
368
|
+
language: remote.language || null,
|
|
369
|
+
localValue: null,
|
|
370
|
+
remoteValue: remote.value || null,
|
|
371
|
+
status: "remote-only",
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
// Sort by key then language
|
|
375
|
+
comparisons.sort((a, b) => {
|
|
376
|
+
const keyCompare = a.key.localeCompare(b.key);
|
|
377
|
+
if (keyCompare !== 0)
|
|
378
|
+
return keyCompare;
|
|
379
|
+
return (a.language || "").localeCompare(b.language || "");
|
|
380
|
+
});
|
|
381
|
+
return {
|
|
382
|
+
comparisons,
|
|
383
|
+
totalTracked: TRACKED_SETTING_KEYS.length,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
// ── Push settings ────────────────────────────────────────────────────────────
|
|
387
|
+
/**
|
|
388
|
+
* Determine what push operations are needed.
|
|
389
|
+
*/
|
|
390
|
+
export function buildSettingsPushOperations(localSettings, remoteSettings) {
|
|
391
|
+
const operations = [];
|
|
392
|
+
// Build remote lookup
|
|
393
|
+
const remoteMap = new Map();
|
|
394
|
+
for (const rs of remoteSettings) {
|
|
395
|
+
if (!TRACKED_SETTING_KEYS.includes(rs.key))
|
|
396
|
+
continue;
|
|
397
|
+
const mapKey = `${rs.key}|${rs.language || ""}`;
|
|
398
|
+
remoteMap.set(mapKey, rs);
|
|
399
|
+
}
|
|
400
|
+
for (const local of localSettings) {
|
|
401
|
+
if (!TRACKED_SETTING_KEYS.includes(local.key))
|
|
402
|
+
continue;
|
|
403
|
+
const mapKey = `${local.key}|${local.language || ""}`;
|
|
404
|
+
const remote = remoteMap.get(mapKey);
|
|
405
|
+
if (!remote) {
|
|
406
|
+
operations.push({
|
|
407
|
+
type: "create",
|
|
408
|
+
key: local.key,
|
|
409
|
+
language: local.language || null,
|
|
410
|
+
localValue: local.value,
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
else if (local.value !== (remote.value || "")) {
|
|
414
|
+
operations.push({
|
|
415
|
+
type: "update",
|
|
416
|
+
key: local.key,
|
|
417
|
+
language: local.language || null,
|
|
418
|
+
localValue: local.value,
|
|
419
|
+
remoteValue: remote.value,
|
|
420
|
+
remoteId: remote.id,
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
operations.push({
|
|
425
|
+
type: "unchanged",
|
|
426
|
+
key: local.key,
|
|
427
|
+
language: local.language || null,
|
|
428
|
+
localValue: local.value,
|
|
429
|
+
remoteValue: remote.value,
|
|
430
|
+
remoteId: remote.id,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return operations;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Push local settings to the CMS via /api/settings/import
|
|
438
|
+
*/
|
|
439
|
+
export async function pushSettingsToRemote(operations, leadCMSUrl, leadCMSApiKey, dryRun = false) {
|
|
440
|
+
const toImport = operations.filter((op) => op.type === "create" || op.type === "update");
|
|
441
|
+
if (toImport.length === 0) {
|
|
442
|
+
logger.info("[LeadCMS] No settings changes to push.");
|
|
443
|
+
return null;
|
|
444
|
+
}
|
|
445
|
+
if (dryRun) {
|
|
446
|
+
logger.info("[LeadCMS] Dry run - would import the following settings:");
|
|
447
|
+
for (const op of toImport) {
|
|
448
|
+
const lang = op.language ? ` [${op.language}]` : "";
|
|
449
|
+
logger.info(` ${op.type}: ${op.key}${lang} = "${op.localValue}"`);
|
|
450
|
+
}
|
|
451
|
+
return null;
|
|
452
|
+
}
|
|
453
|
+
const importPayload = toImport.map((op) => ({
|
|
454
|
+
key: op.key,
|
|
455
|
+
value: op.localValue,
|
|
456
|
+
language: op.language,
|
|
457
|
+
source: "leadcms-sdk",
|
|
458
|
+
}));
|
|
459
|
+
const url = new URL("/api/settings/import", leadCMSUrl);
|
|
460
|
+
logger.verbose(`[LeadCMS] Pushing ${importPayload.length} settings to ${url.toString()}`);
|
|
461
|
+
const res = await axios.post(url.toString(), importPayload, {
|
|
462
|
+
headers: {
|
|
463
|
+
Authorization: `Bearer ${leadCMSApiKey}`,
|
|
464
|
+
"Content-Type": "application/json",
|
|
465
|
+
},
|
|
466
|
+
});
|
|
467
|
+
return res.data;
|
|
468
|
+
}
|
|
469
|
+
//# sourceMappingURL=settings-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/scripts/settings-manager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED