@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.
Files changed (56) hide show
  1. package/README.md +82 -3
  2. package/dist/cli/index.js +55 -62
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -18
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/cms.d.ts +1 -1
  9. package/dist/lib/cms.d.ts.map +1 -1
  10. package/dist/lib/cms.js +49 -72
  11. package/dist/lib/cms.js.map +1 -1
  12. package/dist/lib/config.d.ts +0 -8
  13. package/dist/lib/config.d.ts.map +1 -1
  14. package/dist/lib/config.js +13 -40
  15. package/dist/lib/config.js.map +1 -1
  16. package/dist/lib/console-colors.d.ts +49 -0
  17. package/dist/lib/console-colors.d.ts.map +1 -0
  18. package/dist/lib/console-colors.js +121 -0
  19. package/dist/lib/console-colors.js.map +1 -0
  20. package/dist/lib/content-transformation.d.ts +90 -0
  21. package/dist/lib/content-transformation.d.ts.map +1 -0
  22. package/dist/lib/content-transformation.js +335 -0
  23. package/dist/lib/content-transformation.js.map +1 -0
  24. package/dist/lib/data-service.d.ts +97 -0
  25. package/dist/lib/data-service.d.ts.map +1 -0
  26. package/dist/lib/data-service.js +389 -0
  27. package/dist/lib/data-service.js.map +1 -0
  28. package/dist/scripts/fetch-leadcms-content.d.ts +19 -0
  29. package/dist/scripts/fetch-leadcms-content.d.ts.map +1 -0
  30. package/dist/scripts/fetch-leadcms-content.js +301 -0
  31. package/dist/scripts/fetch-leadcms-content.js.map +1 -0
  32. package/dist/scripts/generate-env-js.d.ts +2 -0
  33. package/dist/scripts/generate-env-js.d.ts.map +1 -0
  34. package/dist/scripts/generate-env-js.js +22 -0
  35. package/dist/scripts/generate-env-js.js.map +1 -0
  36. package/dist/scripts/leadcms-helpers.d.ts +25 -0
  37. package/dist/scripts/leadcms-helpers.d.ts.map +1 -0
  38. package/dist/scripts/leadcms-helpers.js +78 -0
  39. package/dist/scripts/leadcms-helpers.js.map +1 -0
  40. package/dist/scripts/push-leadcms-content.d.ts +50 -0
  41. package/dist/scripts/push-leadcms-content.d.ts.map +1 -0
  42. package/dist/scripts/push-leadcms-content.js +1022 -0
  43. package/dist/scripts/push-leadcms-content.js.map +1 -0
  44. package/dist/scripts/sse-watcher.d.ts +20 -0
  45. package/dist/scripts/sse-watcher.d.ts.map +1 -0
  46. package/dist/scripts/sse-watcher.js +268 -0
  47. package/dist/scripts/sse-watcher.js.map +1 -0
  48. package/dist/scripts/status-leadcms-content.d.ts +4 -0
  49. package/dist/scripts/status-leadcms-content.d.ts.map +1 -0
  50. package/dist/scripts/status-leadcms-content.js +36 -0
  51. package/dist/scripts/status-leadcms-content.js.map +1 -0
  52. package/package.json +14 -12
  53. package/dist/scripts/fetch-leadcms-content.mjs +0 -367
  54. package/dist/scripts/generate-env-js.mjs +0 -24
  55. package/dist/scripts/leadcms-helpers.mjs +0 -208
  56. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=generate-env-js.d.ts.map
@@ -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"}