@leadcms/sdk 1.3.0-pre → 2.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.
- package/README.md +82 -3
- package/dist/cli/index.js +55 -62
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -18
- package/dist/index.js.map +1 -1
- package/dist/lib/cms.d.ts +1 -1
- package/dist/lib/cms.d.ts.map +1 -1
- package/dist/lib/cms.js +49 -72
- package/dist/lib/cms.js.map +1 -1
- package/dist/lib/config.d.ts +0 -8
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +13 -40
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/console-colors.d.ts +49 -0
- package/dist/lib/console-colors.d.ts.map +1 -0
- package/dist/lib/console-colors.js +121 -0
- package/dist/lib/console-colors.js.map +1 -0
- package/dist/lib/content-transformation.d.ts +90 -0
- package/dist/lib/content-transformation.d.ts.map +1 -0
- package/dist/lib/content-transformation.js +335 -0
- package/dist/lib/content-transformation.js.map +1 -0
- package/dist/lib/data-service.d.ts +97 -0
- package/dist/lib/data-service.d.ts.map +1 -0
- package/dist/lib/data-service.js +389 -0
- package/dist/lib/data-service.js.map +1 -0
- package/dist/scripts/fetch-leadcms-content.d.ts +19 -0
- package/dist/scripts/fetch-leadcms-content.d.ts.map +1 -0
- package/dist/scripts/fetch-leadcms-content.js +301 -0
- package/dist/scripts/fetch-leadcms-content.js.map +1 -0
- package/dist/scripts/generate-env-js.d.ts +2 -0
- package/dist/scripts/generate-env-js.d.ts.map +1 -0
- package/dist/scripts/generate-env-js.js +22 -0
- package/dist/scripts/generate-env-js.js.map +1 -0
- package/dist/scripts/leadcms-helpers.d.ts +25 -0
- package/dist/scripts/leadcms-helpers.d.ts.map +1 -0
- package/dist/scripts/leadcms-helpers.js +78 -0
- package/dist/scripts/leadcms-helpers.js.map +1 -0
- package/dist/scripts/push-leadcms-content.d.ts +50 -0
- package/dist/scripts/push-leadcms-content.d.ts.map +1 -0
- package/dist/scripts/push-leadcms-content.js +1022 -0
- package/dist/scripts/push-leadcms-content.js.map +1 -0
- package/dist/scripts/sse-watcher.d.ts +20 -0
- package/dist/scripts/sse-watcher.d.ts.map +1 -0
- package/dist/scripts/sse-watcher.js +268 -0
- package/dist/scripts/sse-watcher.js.map +1 -0
- package/dist/scripts/status-leadcms-content.d.ts +4 -0
- package/dist/scripts/status-leadcms-content.d.ts.map +1 -0
- package/dist/scripts/status-leadcms-content.js +36 -0
- package/dist/scripts/status-leadcms-content.js.map +1 -0
- package/package.json +14 -12
- package/dist/scripts/fetch-leadcms-content.mjs +0 -367
- package/dist/scripts/generate-env-js.mjs +0 -24
- package/dist/scripts/leadcms-helpers.mjs +0 -208
- package/dist/scripts/sse-watcher.mjs +0 -300
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import fs from "fs/promises";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import axios from "axios";
|
|
5
|
+
import { extractMediaUrlsFromContent, downloadMediaFileDirect, leadCMSUrl, leadCMSApiKey, defaultLanguage, CONTENT_DIR, MEDIA_DIR, fetchContentTypes, } from "./leadcms-helpers.js";
|
|
6
|
+
import { saveContentFile } from "../lib/content-transformation.js";
|
|
7
|
+
// Add axios request/response interceptors for debugging
|
|
8
|
+
axios.interceptors.request.use((config) => {
|
|
9
|
+
console.log(`[AXIOS REQUEST] ${config.method?.toUpperCase()} ${config.url}`);
|
|
10
|
+
// Mask the Authorization header for security
|
|
11
|
+
const maskedHeaders = { ...config.headers };
|
|
12
|
+
if (maskedHeaders.Authorization && typeof maskedHeaders.Authorization === "string") {
|
|
13
|
+
const authParts = maskedHeaders.Authorization.split(" ");
|
|
14
|
+
if (authParts.length === 2 && authParts[0] === "Bearer") {
|
|
15
|
+
maskedHeaders.Authorization = `Bearer ${authParts[1].substring(0, 8)}...`;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return config;
|
|
19
|
+
}, (error) => {
|
|
20
|
+
console.error(`[AXIOS REQUEST ERROR]`, error);
|
|
21
|
+
return Promise.reject(error);
|
|
22
|
+
});
|
|
23
|
+
axios.interceptors.response.use((response) => {
|
|
24
|
+
return response;
|
|
25
|
+
}, (error) => {
|
|
26
|
+
console.error(`[AXIOS RESPONSE ERROR] ${error.response?.status || "NO_STATUS"} ${error.response?.statusText || "NO_STATUS_TEXT"} for ${error.config?.url || "NO_URL"}`);
|
|
27
|
+
if (error.response) {
|
|
28
|
+
console.error(`[AXIOS RESPONSE ERROR] Response data:`, error.response.data);
|
|
29
|
+
console.error(`[AXIOS RESPONSE ERROR] Response headers:`, JSON.stringify(error.response.headers, null, 2));
|
|
30
|
+
}
|
|
31
|
+
console.error(`[AXIOS RESPONSE ERROR] Full error:`, error.message);
|
|
32
|
+
return Promise.reject(error);
|
|
33
|
+
});
|
|
34
|
+
const SYNC_TOKEN_PATH = path.resolve(".leadcms/sync-token.txt");
|
|
35
|
+
const MEDIA_SYNC_TOKEN_PATH = path.resolve(".leadcms/media-sync-token.txt");
|
|
36
|
+
async function readSyncToken() {
|
|
37
|
+
try {
|
|
38
|
+
return (await fs.readFile(SYNC_TOKEN_PATH, "utf8")).trim();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async function writeSyncToken(token) {
|
|
45
|
+
await fs.mkdir(path.dirname(SYNC_TOKEN_PATH), { recursive: true });
|
|
46
|
+
await fs.writeFile(SYNC_TOKEN_PATH, token, "utf8");
|
|
47
|
+
}
|
|
48
|
+
async function readMediaSyncToken() {
|
|
49
|
+
try {
|
|
50
|
+
return (await fs.readFile(MEDIA_SYNC_TOKEN_PATH, "utf8")).trim();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function writeMediaSyncToken(token) {
|
|
57
|
+
await fs.mkdir(path.dirname(MEDIA_SYNC_TOKEN_PATH), { recursive: true });
|
|
58
|
+
await fs.writeFile(MEDIA_SYNC_TOKEN_PATH, token, "utf8");
|
|
59
|
+
}
|
|
60
|
+
async function fetchContentSync(syncToken) {
|
|
61
|
+
console.log(`[FETCH_CONTENT_SYNC] Starting with syncToken: ${syncToken || "NONE"}`);
|
|
62
|
+
let allItems = [];
|
|
63
|
+
let allDeleted = [];
|
|
64
|
+
let token = syncToken || "";
|
|
65
|
+
let nextSyncToken = undefined;
|
|
66
|
+
let page = 0;
|
|
67
|
+
while (true) {
|
|
68
|
+
const url = new URL("/api/content/sync", leadCMSUrl);
|
|
69
|
+
url.searchParams.set("filter[limit]", "100");
|
|
70
|
+
url.searchParams.set("syncToken", token);
|
|
71
|
+
console.log(`[FETCH_CONTENT_SYNC] Page ${page}, URL: ${url.toString()}`);
|
|
72
|
+
try {
|
|
73
|
+
const res = await axios.get(url.toString(), {
|
|
74
|
+
headers: { Authorization: `Bearer ${leadCMSApiKey}` },
|
|
75
|
+
});
|
|
76
|
+
if (res.status === 204) {
|
|
77
|
+
console.log(`[FETCH_CONTENT_SYNC] Got 204 No Content - ending sync`);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
const data = res.data;
|
|
81
|
+
console.log(`[FETCH_CONTENT_SYNC] Page ${page} - Got ${data.items?.length || 0} items, ${data.deleted?.length || 0} deleted`);
|
|
82
|
+
if (data.items && Array.isArray(data.items))
|
|
83
|
+
allItems.push(...data.items);
|
|
84
|
+
if (data.deleted && Array.isArray(data.deleted)) {
|
|
85
|
+
allDeleted.push(...data.deleted);
|
|
86
|
+
}
|
|
87
|
+
const newSyncToken = res.headers["x-next-sync-token"] || token;
|
|
88
|
+
console.log(`[FETCH_CONTENT_SYNC] Next sync token: ${newSyncToken}`);
|
|
89
|
+
if (!newSyncToken || newSyncToken === token) {
|
|
90
|
+
nextSyncToken = newSyncToken || token;
|
|
91
|
+
console.log(`[FETCH_CONTENT_SYNC] No new sync token - ending sync`);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
nextSyncToken = newSyncToken;
|
|
95
|
+
token = newSyncToken;
|
|
96
|
+
page++;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error(`[FETCH_CONTENT_SYNC] Failed on page ${page}:`, error.message);
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
console.log(`[FETCH_CONTENT_SYNC] Completed - Total items: ${allItems.length}, deleted: ${allDeleted.length}`);
|
|
104
|
+
return {
|
|
105
|
+
items: allItems,
|
|
106
|
+
deleted: allDeleted,
|
|
107
|
+
nextSyncToken: nextSyncToken || token,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
async function fetchMediaSync(syncToken) {
|
|
111
|
+
console.log(`[FETCH_MEDIA_SYNC] Starting with syncToken: ${syncToken || "NONE"}`);
|
|
112
|
+
let allItems = [];
|
|
113
|
+
let token = syncToken || "";
|
|
114
|
+
let nextSyncToken = undefined;
|
|
115
|
+
let page = 0;
|
|
116
|
+
while (true) {
|
|
117
|
+
const url = new URL("/api/media/sync", leadCMSUrl);
|
|
118
|
+
url.searchParams.set("filter[limit]", "100");
|
|
119
|
+
url.searchParams.set("syncToken", token);
|
|
120
|
+
console.log(`[FETCH_MEDIA_SYNC] Page ${page}, URL: ${url.toString()}`);
|
|
121
|
+
try {
|
|
122
|
+
const res = await axios.get(url.toString(), {
|
|
123
|
+
headers: { Authorization: `Bearer ${leadCMSApiKey}` },
|
|
124
|
+
});
|
|
125
|
+
if (res.status === 204) {
|
|
126
|
+
console.log(`[FETCH_MEDIA_SYNC] Got 204 No Content - ending sync`);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
const data = res.data;
|
|
130
|
+
console.log(`[FETCH_MEDIA_SYNC] Page ${page} - Got ${data.items?.length || 0} items`);
|
|
131
|
+
if (data.items && Array.isArray(data.items))
|
|
132
|
+
allItems.push(...data.items);
|
|
133
|
+
const newSyncToken = res.headers["x-next-sync-token"] || token;
|
|
134
|
+
console.log(`[FETCH_MEDIA_SYNC] Next sync token: ${newSyncToken}`);
|
|
135
|
+
if (!newSyncToken || newSyncToken === token) {
|
|
136
|
+
nextSyncToken = newSyncToken || token;
|
|
137
|
+
console.log(`[FETCH_MEDIA_SYNC] No new sync token - ending sync`);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
nextSyncToken = newSyncToken;
|
|
141
|
+
token = newSyncToken;
|
|
142
|
+
page++;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error(`[FETCH_MEDIA_SYNC] Failed on page ${page}:`, error.message);
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
console.log(`[FETCH_MEDIA_SYNC] Completed - Total items: ${allItems.length}`);
|
|
150
|
+
return {
|
|
151
|
+
items: allItems,
|
|
152
|
+
nextSyncToken: nextSyncToken || token,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async function main() {
|
|
156
|
+
// Log environment configuration for debugging
|
|
157
|
+
console.log(`[ENV] LeadCMS URL: ${leadCMSUrl}`);
|
|
158
|
+
console.log(`[ENV] LeadCMS API Key: ${leadCMSApiKey ? `${leadCMSApiKey.substring(0, 8)}...` : "NOT_SET"}`);
|
|
159
|
+
console.log(`[ENV] Default Language: ${defaultLanguage}`);
|
|
160
|
+
console.log(`[ENV] Content Dir: ${CONTENT_DIR}`);
|
|
161
|
+
console.log(`[ENV] Media Dir: ${MEDIA_DIR}`);
|
|
162
|
+
await fs.mkdir(CONTENT_DIR, { recursive: true });
|
|
163
|
+
await fs.mkdir(MEDIA_DIR, { recursive: true });
|
|
164
|
+
const typeMap = await fetchContentTypes();
|
|
165
|
+
const lastSyncToken = await readSyncToken();
|
|
166
|
+
const lastMediaSyncToken = await readMediaSyncToken();
|
|
167
|
+
let items = [], deleted = [], nextSyncToken = "";
|
|
168
|
+
let mediaItems = [], nextMediaSyncToken = "";
|
|
169
|
+
// Sync content
|
|
170
|
+
try {
|
|
171
|
+
if (lastSyncToken) {
|
|
172
|
+
console.log(`Syncing content from LeadCMS using sync token: ${lastSyncToken}`);
|
|
173
|
+
({ items, deleted, nextSyncToken } = await fetchContentSync(lastSyncToken));
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
console.log("No content sync token found. Doing full fetch from LeadCMS...");
|
|
177
|
+
({ items, deleted, nextSyncToken } = await fetchContentSync(undefined));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
console.error(`[MAIN] Failed to fetch content:`, error.message);
|
|
182
|
+
if (error.response?.status === 401) {
|
|
183
|
+
console.error(`[MAIN] Authentication failed - check your LEADCMS_API_KEY`);
|
|
184
|
+
}
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
// Sync media
|
|
188
|
+
try {
|
|
189
|
+
if (lastMediaSyncToken) {
|
|
190
|
+
console.log(`Syncing media from LeadCMS using sync token: ${lastMediaSyncToken}`);
|
|
191
|
+
({ items: mediaItems, nextSyncToken: nextMediaSyncToken } = await fetchMediaSync(lastMediaSyncToken));
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
console.log("No media sync token found. Doing full fetch from LeadCMS...");
|
|
195
|
+
({ items: mediaItems, nextSyncToken: nextMediaSyncToken } = await fetchMediaSync(undefined));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.error(`[MAIN] Failed to fetch media:`, error.message);
|
|
200
|
+
if (error.response?.status === 401) {
|
|
201
|
+
console.error(`[MAIN] Authentication failed - check your LEADCMS_API_KEY`);
|
|
202
|
+
}
|
|
203
|
+
// Don't throw here, continue with content sync even if media sync fails
|
|
204
|
+
console.warn(`[MAIN] Continuing without media sync...`);
|
|
205
|
+
}
|
|
206
|
+
console.log(`\x1b[32mFetched ${items.length} content items, ${deleted.length} deleted.\x1b[0m`);
|
|
207
|
+
console.log(`\x1b[32mFetched ${mediaItems.length} media items.\x1b[0m`);
|
|
208
|
+
// Save content files and collect all media URLs from content
|
|
209
|
+
const allMediaUrls = new Set();
|
|
210
|
+
for (const content of items) {
|
|
211
|
+
if (content && typeof content === "object") {
|
|
212
|
+
await saveContentFile({
|
|
213
|
+
content,
|
|
214
|
+
typeMap,
|
|
215
|
+
contentDir: CONTENT_DIR,
|
|
216
|
+
});
|
|
217
|
+
for (const url of extractMediaUrlsFromContent(content)) {
|
|
218
|
+
allMediaUrls.add(url);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Remove deleted content files from all language directories
|
|
223
|
+
for (const id of deleted) {
|
|
224
|
+
const idStr = String(id);
|
|
225
|
+
// Function to recursively search for files in a directory
|
|
226
|
+
async function findAndDeleteContentFile(dir) {
|
|
227
|
+
try {
|
|
228
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
229
|
+
for (const entry of entries) {
|
|
230
|
+
const fullPath = path.join(dir, entry.name);
|
|
231
|
+
if (entry.isDirectory()) {
|
|
232
|
+
// Recursively search subdirectories
|
|
233
|
+
await findAndDeleteContentFile(fullPath);
|
|
234
|
+
}
|
|
235
|
+
else if (entry.isFile()) {
|
|
236
|
+
try {
|
|
237
|
+
const content = await fs.readFile(fullPath, "utf8");
|
|
238
|
+
// Exact-match YAML frontmatter: lines like `id: 10` or `id: '10'`
|
|
239
|
+
const yamlRegex = new RegExp(`(^|\\n)id:\\s*['\"]?${idStr}['\"]?(\\n|$)`);
|
|
240
|
+
// Exact-match JSON: "id": 10 or "id": "10"
|
|
241
|
+
const jsonRegex = new RegExp(`\\"id\\"\\s*:\\s*['\"]?${idStr}['\"]?\\s*(,|\\}|\\n|$)`);
|
|
242
|
+
if (yamlRegex.test(content) || jsonRegex.test(content)) {
|
|
243
|
+
await fs.unlink(fullPath);
|
|
244
|
+
console.log(`Deleted: ${fullPath}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch { }
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
// Directory might not exist, that's okay
|
|
253
|
+
if (err.code !== 'ENOENT') {
|
|
254
|
+
console.warn(`Warning: Could not read directory ${dir}:`, err.message);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
await findAndDeleteContentFile(CONTENT_DIR);
|
|
259
|
+
}
|
|
260
|
+
// Handle media sync results
|
|
261
|
+
if (mediaItems.length > 0) {
|
|
262
|
+
console.log(`\nProcessing media changes...`);
|
|
263
|
+
// Download new/updated media files
|
|
264
|
+
let downloaded = 0;
|
|
265
|
+
for (const mediaItem of mediaItems) {
|
|
266
|
+
if (mediaItem.location) {
|
|
267
|
+
const relPath = mediaItem.location.replace(/^\/api\/media\//, "");
|
|
268
|
+
const destPath = path.join(MEDIA_DIR, relPath);
|
|
269
|
+
const didDownload = await downloadMediaFileDirect(mediaItem.location, destPath, leadCMSUrl || "", leadCMSApiKey || "");
|
|
270
|
+
if (didDownload) {
|
|
271
|
+
console.log(`Downloaded: ${mediaItem.location} -> ${destPath}`);
|
|
272
|
+
downloaded++;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
console.log(`\nDone. ${downloaded} media files downloaded.\n`);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
console.log(`\nNo media changes detected.\n`);
|
|
280
|
+
}
|
|
281
|
+
// Save new sync tokens
|
|
282
|
+
if (nextSyncToken) {
|
|
283
|
+
await writeSyncToken(nextSyncToken);
|
|
284
|
+
console.log(`Content sync token updated: ${nextSyncToken}`);
|
|
285
|
+
}
|
|
286
|
+
if (nextMediaSyncToken) {
|
|
287
|
+
await writeMediaSyncToken(nextMediaSyncToken);
|
|
288
|
+
console.log(`Media sync token updated: ${nextMediaSyncToken}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Export the main function so it can be imported by other modules
|
|
292
|
+
export { main as fetchLeadCMSContent };
|
|
293
|
+
// If this script is run directly (not imported), execute the main function
|
|
294
|
+
// Note: This check works in Node.js ESM environment
|
|
295
|
+
if (process.argv[1] && import.meta.url === `file://${process.argv[1]}`) {
|
|
296
|
+
main().catch((error) => {
|
|
297
|
+
console.error('Error running LeadCMS fetch:', error.message);
|
|
298
|
+
process.exit(1);
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=fetch-leadcms-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-leadcms-content.js","sourceRoot":"","sources":["../../src/scripts/fetch-leadcms-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-env-js.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-env-js.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// This script generates a __env.js file with all NEXT_PUBLIC_ env variables
|
|
2
|
+
// Usage: node ./scripts/generate-env-js.ts
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import dotenv from "dotenv";
|
|
6
|
+
// Load env from .env, .env.local, etc. (dotenv will not overwrite existing process.env)
|
|
7
|
+
dotenv.config({ path: path.resolve(process.cwd(), ".env") });
|
|
8
|
+
try {
|
|
9
|
+
dotenv.config({ path: path.resolve(process.cwd(), ".env.local") });
|
|
10
|
+
}
|
|
11
|
+
catch { }
|
|
12
|
+
const envVars = Object.keys(process.env)
|
|
13
|
+
.filter((key) => key.startsWith("NEXT_PUBLIC_"))
|
|
14
|
+
.reduce((acc, key) => {
|
|
15
|
+
acc[key] = process.env[key];
|
|
16
|
+
return acc;
|
|
17
|
+
}, {});
|
|
18
|
+
const jsContent = `window.__env = ${JSON.stringify(envVars, null, 2)};\n`;
|
|
19
|
+
const outPath = path.resolve(process.cwd(), "public", "__env.js");
|
|
20
|
+
fs.writeFileSync(outPath, jsContent);
|
|
21
|
+
console.log("Generated public/__env.js with NEXT_PUBLIC_ env variables.");
|
|
22
|
+
//# sourceMappingURL=generate-env-js.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-env-js.js","sourceRoot":"","sources":["../../src/scripts/generate-env-js.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2CAA2C;AAC3C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,wFAAwF;AACxF,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAC7D,IAAI,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;AACrE,CAAC;AAAC,MAAM,CAAC,CAAA,CAAC;AAEV,MAAM,OAAO,GAAuC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;KACzE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;KAC/C,MAAM,CAAC,CAAC,GAAuC,EAAE,GAAG,EAAE,EAAE;IACvD,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC,EAAE,EAAE,CAAC,CAAC;AAET,MAAM,SAAS,GAAG,kBAAkB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;AAE1E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAClE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACrC,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type LeadCMSConfig } from "../lib/config.js";
|
|
2
|
+
interface ContentType {
|
|
3
|
+
uid: string;
|
|
4
|
+
format: string;
|
|
5
|
+
}
|
|
6
|
+
interface ContentItem {
|
|
7
|
+
id?: number;
|
|
8
|
+
slug: string;
|
|
9
|
+
type: string;
|
|
10
|
+
language?: string;
|
|
11
|
+
createdAt?: string;
|
|
12
|
+
updatedAt?: string;
|
|
13
|
+
body?: string;
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
}
|
|
16
|
+
export declare const leadCMSUrl: string;
|
|
17
|
+
export declare const leadCMSApiKey: string;
|
|
18
|
+
export declare const defaultLanguage: string;
|
|
19
|
+
export declare const CONTENT_DIR: string;
|
|
20
|
+
export declare const MEDIA_DIR: string;
|
|
21
|
+
export declare function fetchContentTypes(): Promise<Record<string, string>>;
|
|
22
|
+
export declare function extractMediaUrlsFromContent(content: ContentItem): string[];
|
|
23
|
+
export declare function downloadMediaFileDirect(mediaUrl: string, destPath: string, leadCMSUrl: string, leadCMSApiKey: string): Promise<boolean>;
|
|
24
|
+
export type { LeadCMSConfig, ContentType, ContentItem };
|
|
25
|
+
//# sourceMappingURL=leadcms-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leadcms-helpers.d.ts","sourceRoot":"","sources":["../../src/scripts/leadcms-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjE,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,WAAW;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAMD,eAAO,MAAM,UAAU,QAAa,CAAC;AACrC,eAAO,MAAM,aAAa,QAAgB,CAAC;AAC3C,eAAO,MAAM,eAAe,QAAyB,CAAC;AACtD,eAAO,MAAM,WAAW,QAAkC,CAAC;AAC3D,eAAO,MAAM,SAAS,QAAgC,CAAC;AAIvD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAsBzE;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,EAAE,CAgB1E;AAGD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CA6BlB;AAYD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import fs from "fs/promises";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import axios from "axios";
|
|
4
|
+
import { getConfig } from "../lib/config.js";
|
|
5
|
+
// Use the main configuration system instead of duplicating logic
|
|
6
|
+
const config = getConfig();
|
|
7
|
+
// Use configuration with environment variable fallbacks
|
|
8
|
+
export const leadCMSUrl = config.url;
|
|
9
|
+
export const leadCMSApiKey = config.apiKey;
|
|
10
|
+
export const defaultLanguage = config.defaultLanguage;
|
|
11
|
+
export const CONTENT_DIR = path.resolve(config.contentDir);
|
|
12
|
+
export const MEDIA_DIR = path.resolve(config.mediaDir);
|
|
13
|
+
// Fetch content types dynamically from LeadCMS API to build typeMap
|
|
14
|
+
// Content types are automatically detected and don't need to be configured
|
|
15
|
+
export async function fetchContentTypes() {
|
|
16
|
+
console.log(`[LeadCMS] Fetching content types from API...`);
|
|
17
|
+
const url = new URL("/api/content-types", leadCMSUrl);
|
|
18
|
+
url.searchParams.set("filter[limit]", "100");
|
|
19
|
+
try {
|
|
20
|
+
const res = await axios.get(url.toString(), {
|
|
21
|
+
headers: { Authorization: `Bearer ${leadCMSApiKey}` },
|
|
22
|
+
});
|
|
23
|
+
const types = res.data;
|
|
24
|
+
const typeMap = {};
|
|
25
|
+
for (const t of types) {
|
|
26
|
+
typeMap[t.uid] = t.format;
|
|
27
|
+
}
|
|
28
|
+
console.log(`[LeadCMS] Detected ${Object.keys(typeMap).length} content types:`, Object.keys(typeMap).join(', '));
|
|
29
|
+
return typeMap;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error(`[LeadCMS] Failed to fetch content types:`, error.message);
|
|
33
|
+
return {};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function extractMediaUrlsFromContent(content) {
|
|
37
|
+
console.log(`[LeadCMS] Extracting media URLs from content: ${content}`);
|
|
38
|
+
const urls = new Set();
|
|
39
|
+
const body = content.body || "";
|
|
40
|
+
const regex = /["'\(](\/api\/media\/[^"'\)\s]+)/g;
|
|
41
|
+
let match;
|
|
42
|
+
while ((match = regex.exec(body))) {
|
|
43
|
+
urls.add(match[1]);
|
|
44
|
+
}
|
|
45
|
+
if (content.coverImageUrl && content.coverImageUrl.startsWith("/api/media/")) {
|
|
46
|
+
urls.add(content.coverImageUrl);
|
|
47
|
+
}
|
|
48
|
+
return Array.from(urls);
|
|
49
|
+
}
|
|
50
|
+
// Direct media download without meta.json dependency
|
|
51
|
+
export async function downloadMediaFileDirect(mediaUrl, destPath, leadCMSUrl, leadCMSApiKey) {
|
|
52
|
+
await fs.mkdir(path.dirname(destPath), { recursive: true });
|
|
53
|
+
const fullUrl = mediaUrl.startsWith("http") ? mediaUrl : leadCMSUrl.replace(/\/$/, "") + mediaUrl;
|
|
54
|
+
const headers = { Authorization: `Bearer ${leadCMSApiKey}` };
|
|
55
|
+
try {
|
|
56
|
+
const res = await axios.get(fullUrl, {
|
|
57
|
+
responseType: "arraybuffer",
|
|
58
|
+
headers,
|
|
59
|
+
validateStatus: (status) => (status >= 200 && status < 300) || status === 404,
|
|
60
|
+
});
|
|
61
|
+
if (res.status === 404) {
|
|
62
|
+
// Remove file if not found on server
|
|
63
|
+
try {
|
|
64
|
+
await fs.unlink(destPath);
|
|
65
|
+
console.log(`Deleted missing file: ${destPath}`);
|
|
66
|
+
}
|
|
67
|
+
catch { }
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
await fs.writeFile(destPath, res.data);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
console.error(`Failed to download ${mediaUrl}:`, err.message);
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=leadcms-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leadcms-helpers.js","sourceRoot":"","sources":["../../src/scripts/leadcms-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
import { ContentItem as BaseContentItem } from "./leadcms-helpers.js";
|
|
3
|
+
import { ContentItem } from "../lib/data-service.js";
|
|
4
|
+
interface LocalContentItem extends BaseContentItem {
|
|
5
|
+
filePath: string;
|
|
6
|
+
locale: string;
|
|
7
|
+
metadata: Record<string, any>;
|
|
8
|
+
isLocal: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface RemoteContentItem extends ContentItem {
|
|
11
|
+
isLocal: false;
|
|
12
|
+
}
|
|
13
|
+
interface MatchOperation {
|
|
14
|
+
local: LocalContentItem;
|
|
15
|
+
remote?: RemoteContentItem;
|
|
16
|
+
reason?: string;
|
|
17
|
+
oldSlug?: string;
|
|
18
|
+
oldType?: string;
|
|
19
|
+
newType?: string;
|
|
20
|
+
}
|
|
21
|
+
interface ContentOperations {
|
|
22
|
+
create: MatchOperation[];
|
|
23
|
+
update: MatchOperation[];
|
|
24
|
+
rename: MatchOperation[];
|
|
25
|
+
typeChange: MatchOperation[];
|
|
26
|
+
conflict: MatchOperation[];
|
|
27
|
+
}
|
|
28
|
+
interface PushOptions {
|
|
29
|
+
statusOnly?: boolean;
|
|
30
|
+
force?: boolean;
|
|
31
|
+
targetId?: string;
|
|
32
|
+
targetSlug?: string;
|
|
33
|
+
showDetailedPreview?: boolean;
|
|
34
|
+
dryRun?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Compare local and remote content by transforming remote to local format
|
|
38
|
+
* Returns true if there are meaningful differences in content
|
|
39
|
+
* This new approach compares normalized file content directly instead of parsed objects
|
|
40
|
+
*/
|
|
41
|
+
declare function hasActualContentChanges(local: LocalContentItem, remote: RemoteContentItem, typeMap?: Record<string, string>): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Main function for push command
|
|
44
|
+
*/
|
|
45
|
+
declare function pushMain(options?: PushOptions): Promise<void>;
|
|
46
|
+
export { pushMain as pushLeadCMSContent };
|
|
47
|
+
export { hasActualContentChanges };
|
|
48
|
+
export { transformRemoteForComparison } from "../lib/content-transformation.js";
|
|
49
|
+
export type { LocalContentItem, RemoteContentItem, ContentOperations, PushOptions };
|
|
50
|
+
//# sourceMappingURL=push-leadcms-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push-leadcms-content.d.ts","sourceRoot":"","sources":["../../src/scripts/push-leadcms-content.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAMvB,OAAO,EAGL,WAAW,IAAI,eAAe,EAC/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAsB,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAWzE,UAAU,gBAAiB,SAAQ,eAAe;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,iBAAkB,SAAQ,WAAW;IAC7C,OAAO,EAAE,KAAK,CAAC;CAChB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,UAAU,WAAW;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAqKD;;;;GAIG;AACH,iBAAe,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB7I;AAkjBD;;GAEG;AACH,iBAAe,QAAQ,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6HhE;AAgND,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,CAAC;AAG1C,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AA8BhF,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC"}
|