@leadcms/sdk 2.1.5 ā 2.2.2
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 +246 -126
- package/dist/cli/index.js +97 -68
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/auth.d.ts +55 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +204 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/cms-config-types.d.ts +57 -0
- package/dist/lib/cms-config-types.d.ts.map +1 -0
- package/dist/lib/cms-config-types.js +64 -0
- package/dist/lib/cms-config-types.js.map +1 -0
- package/dist/lib/cms.d.ts +52 -0
- package/dist/lib/cms.d.ts.map +1 -1
- package/dist/lib/cms.js +113 -0
- package/dist/lib/cms.js.map +1 -1
- package/dist/lib/comment-types.d.ts +73 -0
- package/dist/lib/comment-types.d.ts.map +1 -0
- package/dist/lib/comment-types.js +6 -0
- package/dist/lib/comment-types.js.map +1 -0
- package/dist/lib/comment-utils.d.ts +173 -0
- package/dist/lib/comment-utils.d.ts.map +1 -0
- package/dist/lib/comment-utils.js +338 -0
- package/dist/lib/comment-utils.js.map +1 -0
- package/dist/lib/config.d.ts +4 -2
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +10 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/data-service.d.ts.map +1 -1
- package/dist/lib/data-service.js +22 -6
- package/dist/lib/data-service.js.map +1 -1
- package/dist/scripts/fetch-leadcms-comments.d.ts +26 -0
- package/dist/scripts/fetch-leadcms-comments.d.ts.map +1 -0
- package/dist/scripts/fetch-leadcms-comments.js +352 -0
- package/dist/scripts/fetch-leadcms-comments.js.map +1 -0
- package/dist/scripts/fetch-leadcms-content.d.ts.map +1 -1
- package/dist/scripts/fetch-leadcms-content.js +86 -39
- package/dist/scripts/fetch-leadcms-content.js.map +1 -1
- package/dist/scripts/init-leadcms.d.ts +7 -0
- package/dist/scripts/init-leadcms.d.ts.map +1 -0
- package/dist/scripts/init-leadcms.js +397 -0
- package/dist/scripts/init-leadcms.js.map +1 -0
- package/dist/scripts/leadcms-helpers.d.ts +2 -2
- package/dist/scripts/leadcms-helpers.d.ts.map +1 -1
- package/dist/scripts/leadcms-helpers.js +12 -7
- package/dist/scripts/leadcms-helpers.js.map +1 -1
- package/dist/scripts/login-leadcms.d.ts +10 -0
- package/dist/scripts/login-leadcms.d.ts.map +1 -0
- package/dist/scripts/login-leadcms.js +90 -0
- package/dist/scripts/login-leadcms.js.map +1 -0
- package/dist/scripts/pull-all.d.ts +12 -0
- package/dist/scripts/pull-all.d.ts.map +1 -0
- package/dist/scripts/pull-all.js +81 -0
- package/dist/scripts/pull-all.js.map +1 -0
- package/dist/scripts/pull-comments.d.ts +11 -0
- package/dist/scripts/pull-comments.d.ts.map +1 -0
- package/dist/scripts/pull-comments.js +45 -0
- package/dist/scripts/pull-comments.js.map +1 -0
- package/dist/scripts/pull-content.d.ts +11 -0
- package/dist/scripts/pull-content.d.ts.map +1 -0
- package/dist/scripts/pull-content.js +45 -0
- package/dist/scripts/pull-content.js.map +1 -0
- package/dist/scripts/pull-media.d.ts +12 -0
- package/dist/scripts/pull-media.d.ts.map +1 -0
- package/dist/scripts/pull-media.js +46 -0
- package/dist/scripts/pull-media.js.map +1 -0
- package/dist/scripts/push-leadcms-content.d.ts.map +1 -1
- package/dist/scripts/push-leadcms-content.js +12 -0
- package/dist/scripts/push-leadcms-content.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { spawn } from 'child_process';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
|
+
import { readFileSync } from 'fs';
|
|
5
6
|
const __filename = fileURLToPath(import.meta.url);
|
|
6
7
|
const __dirname = path.dirname(__filename);
|
|
7
8
|
const command = process.argv[2];
|
|
@@ -17,10 +18,59 @@ function runScript(scriptName, args = []) {
|
|
|
17
18
|
process.exit(code || 0);
|
|
18
19
|
});
|
|
19
20
|
}
|
|
21
|
+
function runScriptSequence(scripts, args = []) {
|
|
22
|
+
let currentIndex = 0;
|
|
23
|
+
function runNext() {
|
|
24
|
+
if (currentIndex >= scripts.length) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const scriptName = scripts[currentIndex];
|
|
28
|
+
const scriptPath = path.join(scriptDir, scriptName);
|
|
29
|
+
const child = spawn('node', [scriptPath, ...args], {
|
|
30
|
+
stdio: 'inherit',
|
|
31
|
+
env: process.env
|
|
32
|
+
});
|
|
33
|
+
child.on('exit', (code) => {
|
|
34
|
+
if (code !== 0) {
|
|
35
|
+
process.exit(code || 0);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
currentIndex++;
|
|
39
|
+
runNext();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
runNext();
|
|
44
|
+
}
|
|
45
|
+
function getVersion() {
|
|
46
|
+
try {
|
|
47
|
+
const packageJsonPath = path.join(__dirname, '../../package.json');
|
|
48
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
49
|
+
return packageJson.version;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return 'unknown';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
20
55
|
switch (command) {
|
|
56
|
+
case 'version':
|
|
57
|
+
case '-v':
|
|
58
|
+
case '--version':
|
|
59
|
+
console.log(`LeadCMS SDK v${getVersion()}`);
|
|
60
|
+
process.exit(0);
|
|
61
|
+
break;
|
|
21
62
|
case 'pull':
|
|
22
63
|
case 'fetch': // Alias for backward compatibility
|
|
23
|
-
runScript('
|
|
64
|
+
runScript('pull-all.js');
|
|
65
|
+
break;
|
|
66
|
+
case 'pull-content':
|
|
67
|
+
runScript('pull-content.js');
|
|
68
|
+
break;
|
|
69
|
+
case 'pull-media':
|
|
70
|
+
runScript('pull-media.js');
|
|
71
|
+
break;
|
|
72
|
+
case 'pull-comments':
|
|
73
|
+
runScript('pull-comments.js');
|
|
24
74
|
break;
|
|
25
75
|
case 'push':
|
|
26
76
|
runScript('push-leadcms-content.js', commandArgs);
|
|
@@ -36,7 +86,10 @@ switch (command) {
|
|
|
36
86
|
break;
|
|
37
87
|
case 'init':
|
|
38
88
|
case 'config':
|
|
39
|
-
|
|
89
|
+
runScript('init-leadcms.js');
|
|
90
|
+
break;
|
|
91
|
+
case 'login':
|
|
92
|
+
runScript('login-leadcms.js');
|
|
40
93
|
break;
|
|
41
94
|
case 'docker':
|
|
42
95
|
case 'templates':
|
|
@@ -44,93 +97,69 @@ switch (command) {
|
|
|
44
97
|
break;
|
|
45
98
|
default:
|
|
46
99
|
console.log(`
|
|
47
|
-
LeadCMS SDK CLI
|
|
100
|
+
LeadCMS SDK CLI v${getVersion()}
|
|
48
101
|
|
|
49
102
|
Usage:
|
|
103
|
+
leadcms version - Show SDK version
|
|
50
104
|
leadcms init - Initialize LeadCMS configuration
|
|
105
|
+
leadcms login - Authenticate and save API token to .env file
|
|
51
106
|
leadcms docker - Generate Docker deployment templates
|
|
52
|
-
|
|
107
|
+
|
|
108
|
+
Pull commands:
|
|
109
|
+
leadcms pull - Pull all content, media, and comments from LeadCMS
|
|
110
|
+
leadcms pull-content - Pull only content from LeadCMS
|
|
111
|
+
leadcms pull-media - Pull only media files from LeadCMS
|
|
112
|
+
leadcms pull-comments - Pull only comments from LeadCMS
|
|
113
|
+
leadcms fetch - Alias for 'pull' (backward compatibility)
|
|
114
|
+
|
|
115
|
+
Push commands:
|
|
53
116
|
leadcms push [options] - Push local content to LeadCMS
|
|
54
117
|
--force - Override remote changes (skip conflict check)
|
|
55
118
|
--dry-run - Show API calls without executing them (preview mode)
|
|
56
119
|
--id <content-id> - Target specific content by ID
|
|
57
120
|
--slug <slug> - Target specific content by slug
|
|
121
|
+
|
|
122
|
+
Status & monitoring:
|
|
58
123
|
leadcms status [options] - Show sync status between local and remote content
|
|
59
124
|
--preview - Show detailed change previews for all files
|
|
60
125
|
--id <content-id> - Show detailed status for specific content by ID
|
|
61
126
|
--slug <slug> - Show detailed status for specific content by slug
|
|
62
|
-
leadcms
|
|
63
|
-
|
|
127
|
+
leadcms watch - Watch for real-time updates via Server-Sent Events
|
|
128
|
+
|
|
129
|
+
Utilities:
|
|
64
130
|
leadcms generate-env - Generate environment variables file
|
|
65
131
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
132
|
+
Getting Started:
|
|
133
|
+
1. Initialize configuration:
|
|
134
|
+
leadcms init - Interactive setup wizard
|
|
135
|
+
|
|
136
|
+
2. Authenticate (optional, required for push operations):
|
|
137
|
+
leadcms login - Get and save API token
|
|
70
138
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
"contentDir": ".leadcms/content",
|
|
75
|
-
"mediaDir": "public/media"
|
|
76
|
-
}
|
|
139
|
+
3. Start syncing:
|
|
140
|
+
leadcms pull - Download content from LeadCMS
|
|
141
|
+
leadcms push - Upload local changes
|
|
77
142
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
143
|
+
Configuration Files:
|
|
144
|
+
.env (recommended, created by 'leadcms login'):
|
|
145
|
+
LEADCMS_URL=https://your-instance.leadcms.ai
|
|
146
|
+
LEADCMS_API_KEY=your-token-here
|
|
147
|
+
LEADCMS_DEFAULT_LANGUAGE=en
|
|
82
148
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
149
|
+
leadcms.config.json (created by 'leadcms init'):
|
|
150
|
+
{
|
|
151
|
+
"url": "https://your-instance.leadcms.ai",
|
|
152
|
+
"defaultLanguage": "en",
|
|
153
|
+
"contentDir": "content",
|
|
154
|
+
"mediaDir": "public/media",
|
|
155
|
+
"commentsDir": "comments"
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
Note: Environment variables take precedence over config file.
|
|
159
|
+
Next.js users can use NEXT_PUBLIC_LEADCMS_URL for client-side access.
|
|
86
160
|
`);
|
|
87
161
|
break;
|
|
88
162
|
}
|
|
89
|
-
function generateConfig() {
|
|
90
|
-
Promise.all([import('fs'), import('path')]).then(([fs, pathModule]) => {
|
|
91
|
-
const configPath = pathModule.join(process.cwd(), 'leadcms.config.json');
|
|
92
|
-
if (fs.existsSync(configPath)) {
|
|
93
|
-
const readline = require('readline');
|
|
94
|
-
const rl = readline.createInterface({
|
|
95
|
-
input: process.stdin,
|
|
96
|
-
output: process.stdout
|
|
97
|
-
});
|
|
98
|
-
rl.question('leadcms.config.json already exists. Overwrite? (y/N): ', (answer) => {
|
|
99
|
-
if (answer.toLowerCase() !== 'y' && answer.toLowerCase() !== 'yes') {
|
|
100
|
-
console.log('ā
Configuration initialization cancelled.');
|
|
101
|
-
rl.close();
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
createConfig();
|
|
105
|
-
rl.close();
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
createConfig();
|
|
110
|
-
}
|
|
111
|
-
function createConfig() {
|
|
112
|
-
const sampleConfigPath = pathModule.join(__dirname, '../../leadcms.config.json.sample');
|
|
113
|
-
const sampleConfig = fs.readFileSync(sampleConfigPath, 'utf-8');
|
|
114
|
-
fs.writeFileSync(configPath, sampleConfig, 'utf-8');
|
|
115
|
-
console.log(`ā
Created ${configPath}`);
|
|
116
|
-
console.log('š Set LEADCMS_URL and LEADCMS_API_KEY as environment variables.');
|
|
117
|
-
console.log('š§ Customize contentDir, mediaDir, or other settings in the config file.');
|
|
118
|
-
console.log('ā¹ļø Content types are automatically detected from your LeadCMS API.');
|
|
119
|
-
}
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
function createConfigFile(configPath) {
|
|
123
|
-
import('fs').then(fs => {
|
|
124
|
-
// Use the sample config file as the source of truth
|
|
125
|
-
const sampleConfigPath = path.join(__dirname, '../../leadcms.config.json.sample');
|
|
126
|
-
const sampleConfig = fs.readFileSync(sampleConfigPath, 'utf-8');
|
|
127
|
-
fs.writeFileSync(configPath, sampleConfig, 'utf-8');
|
|
128
|
-
console.log(`ā
Created ${configPath}`);
|
|
129
|
-
console.log('š Set LEADCMS_URL and LEADCMS_API_KEY as environment variables.');
|
|
130
|
-
console.log('š§ Customize contentDir, mediaDir, or other settings in the config file.');
|
|
131
|
-
console.log('ā¹ļø Content types are automatically detected from your LeadCMS API.');
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
163
|
function generateDockerTemplates() {
|
|
135
164
|
Promise.all([import('fs'), import('path')]).then(([fs, pathModule]) => {
|
|
136
165
|
const templateDir = pathModule.join(__dirname, '../templates');
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export * from './lib/cms.js';
|
|
2
2
|
export * from './lib/config.js';
|
|
3
3
|
export * from './lib/locale-utils.js';
|
|
4
|
+
export * from './lib/comment-types.js';
|
|
5
|
+
export * from './lib/cms-config-types.js';
|
|
6
|
+
export type { CommentTreeNode, CommentTreeOptions, CommentStatistics, CommentSortOrder } from './lib/comment-utils.js';
|
|
4
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAG1C,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
export * from './lib/cms.js';
|
|
3
3
|
export * from './lib/config.js';
|
|
4
4
|
export * from './lib/locale-utils.js';
|
|
5
|
+
export * from './lib/comment-types.js';
|
|
6
|
+
export * from './lib/cms-config-types.js';
|
|
5
7
|
// LeadCMS SDK - Framework-agnostic content management
|
|
6
8
|
//
|
|
7
9
|
// Core functions for accessing LeadCMS content:
|
|
@@ -10,6 +12,18 @@ export * from './lib/locale-utils.js';
|
|
|
10
12
|
// - getAllContentRoutes() - Get all routes for static generation
|
|
11
13
|
// - getAvailableLanguages() - Get supported languages
|
|
12
14
|
//
|
|
15
|
+
// Comments API:
|
|
16
|
+
// - getComments() - Get comments for any commentable entity
|
|
17
|
+
// - getCommentsForContent() - Get comments for a specific content item
|
|
18
|
+
// - getCommentsStrict() - Get comments with strict error handling
|
|
19
|
+
// - getCommentsForContentStrict() - Get comments for content with strict error handling
|
|
20
|
+
// - getCommentsTree() - Get comments as a hierarchical tree structure with sorting and filtering
|
|
21
|
+
// - getCommentsTreeForContent() - Get comments tree for content (convenience wrapper)
|
|
22
|
+
//
|
|
23
|
+
// Note: Tree building utilities (buildCommentTree, flattenCommentTree, filterComments, etc.)
|
|
24
|
+
// are internal implementation details and not part of the public API. Use getCommentsTree()
|
|
25
|
+
// and getCommentsTreeForContent() for all tree operations.
|
|
26
|
+
//
|
|
13
27
|
// Locale utilities:
|
|
14
28
|
// - isValidLocaleCode() - Validate locale directory names
|
|
15
29
|
//
|
|
@@ -19,8 +33,14 @@ export * from './lib/locale-utils.js';
|
|
|
19
33
|
// 3. Programmatic configuration using configure()
|
|
20
34
|
//
|
|
21
35
|
// CLI utilities:
|
|
22
|
-
// - npx leadcms init - Initialize configuration
|
|
23
|
-
// - npx leadcms
|
|
36
|
+
// - npx leadcms init - Initialize configuration (includes authentication setup)
|
|
37
|
+
// - npx leadcms login - Authenticate with LeadCMS (device auth or manual token)
|
|
38
|
+
// - npx leadcms pull - Pull content and comments from LeadCMS
|
|
39
|
+
// - npx leadcms pull-comments - Pull only comments from LeadCMS
|
|
40
|
+
// - npx leadcms fetch - Alias for pull (backward compatibility)
|
|
24
41
|
// - npx leadcms watch - Watch for real-time updates
|
|
25
42
|
// - npx leadcms generate-env - Generate environment file
|
|
43
|
+
//
|
|
44
|
+
// Note: Authentication functions are internal and only available via CLI commands.
|
|
45
|
+
// Use 'npx leadcms login' for authentication instead of programmatic auth functions.
|
|
26
46
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAK1C,sDAAsD;AACtD,EAAE;AACF,gDAAgD;AAChD,yDAAyD;AACzD,0DAA0D;AAC1D,iEAAiE;AACjE,sDAAsD;AACtD,EAAE;AACF,gBAAgB;AAChB,4DAA4D;AAC5D,uEAAuE;AACvE,kEAAkE;AAClE,wFAAwF;AACxF,iGAAiG;AACjG,sFAAsF;AACtF,EAAE;AACF,6FAA6F;AAC7F,4FAA4F;AAC5F,2DAA2D;AAC3D,EAAE;AACF,oBAAoB;AACpB,0DAA0D;AAC1D,EAAE;AACF,yBAAyB;AACzB,4CAA4C;AAC5C,sCAAsC;AACtC,kDAAkD;AAClD,EAAE;AACF,iBAAiB;AACjB,qFAAqF;AACrF,oFAAoF;AACpF,mEAAmE;AACnE,gEAAgE;AAChE,oEAAoE;AACpE,wDAAwD;AACxD,yDAAyD;AACzD,EAAE;AACF,mFAAmF;AACnF,qFAAqF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LeadCMS Authentication Library
|
|
3
|
+
* Shared authentication functions for device auth and manual token flows
|
|
4
|
+
*/
|
|
5
|
+
interface UserDetailsDto {
|
|
6
|
+
email: string;
|
|
7
|
+
userName: string;
|
|
8
|
+
displayName: string;
|
|
9
|
+
data?: Record<string, any> | null;
|
|
10
|
+
id?: string;
|
|
11
|
+
createdAt?: string;
|
|
12
|
+
lastTimeLoggedIn?: string | null;
|
|
13
|
+
avatarUrl?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface AuthResult {
|
|
16
|
+
token: string;
|
|
17
|
+
user: UserDetailsDto;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get LeadCMS version from /api/version endpoint
|
|
21
|
+
*/
|
|
22
|
+
export declare function getLeadCMSVersion(url: string): Promise<string | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Compare version strings (supports semver with pre-release tags)
|
|
25
|
+
* Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal
|
|
26
|
+
*/
|
|
27
|
+
export declare function compareVersions(v1: string, v2: string): number;
|
|
28
|
+
/**
|
|
29
|
+
* Check if device authentication is supported (version >= 1.2.88-pre)
|
|
30
|
+
*/
|
|
31
|
+
export declare function supportsDeviceAuth(version: string | null): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Verify API token by calling /api/users/me
|
|
34
|
+
*/
|
|
35
|
+
export declare function verifyToken(url: string, token: string): Promise<UserDetailsDto>;
|
|
36
|
+
/**
|
|
37
|
+
* Save API token to .env file
|
|
38
|
+
*/
|
|
39
|
+
export declare function saveTokenToEnv(token: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Device authentication flow
|
|
42
|
+
*/
|
|
43
|
+
export declare function deviceAuthFlow(url: string): Promise<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Manual token input flow (legacy)
|
|
46
|
+
* Requires a question function for readline compatibility
|
|
47
|
+
*/
|
|
48
|
+
export declare function manualTokenFlow(url: string, question: (prompt: string) => Promise<string>): Promise<string>;
|
|
49
|
+
/**
|
|
50
|
+
* Complete authentication flow with version detection
|
|
51
|
+
* Automatically chooses between device auth and manual flow
|
|
52
|
+
*/
|
|
53
|
+
export declare function authenticate(url: string, question: (prompt: string) => Promise<string>): Promise<AuthResult>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAClC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+BD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU3E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAiB9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAGlE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAQrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CA0BlD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiEjE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAC5C,OAAO,CAAC,UAAU,CAAC,CA6BrB"}
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LeadCMS Authentication Library
|
|
3
|
+
* Shared authentication functions for device auth and manual token flows
|
|
4
|
+
*/
|
|
5
|
+
import axios from 'axios';
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
/**
|
|
9
|
+
* Get LeadCMS version from /api/version endpoint
|
|
10
|
+
*/
|
|
11
|
+
export async function getLeadCMSVersion(url) {
|
|
12
|
+
try {
|
|
13
|
+
const response = await axios.get(`${url}/api/version`, {
|
|
14
|
+
timeout: 5000,
|
|
15
|
+
});
|
|
16
|
+
return response.data.version;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
// If version endpoint is not available, return null
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compare version strings (supports semver with pre-release tags)
|
|
25
|
+
* Returns: 1 if v1 > v2, -1 if v1 < v2, 0 if equal
|
|
26
|
+
*/
|
|
27
|
+
export function compareVersions(v1, v2) {
|
|
28
|
+
// Extract version numbers (ignore pre-release tags and git hashes)
|
|
29
|
+
const extractVersion = (v) => {
|
|
30
|
+
const match = v.match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
31
|
+
if (!match)
|
|
32
|
+
return [0, 0, 0];
|
|
33
|
+
return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])];
|
|
34
|
+
};
|
|
35
|
+
const parts1 = extractVersion(v1);
|
|
36
|
+
const parts2 = extractVersion(v2);
|
|
37
|
+
for (let i = 0; i < 3; i++) {
|
|
38
|
+
if (parts1[i] > parts2[i])
|
|
39
|
+
return 1;
|
|
40
|
+
if (parts1[i] < parts2[i])
|
|
41
|
+
return -1;
|
|
42
|
+
}
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if device authentication is supported (version >= 1.2.88-pre)
|
|
47
|
+
*/
|
|
48
|
+
export function supportsDeviceAuth(version) {
|
|
49
|
+
if (!version)
|
|
50
|
+
return false;
|
|
51
|
+
return compareVersions(version, '1.2.88-pre') >= 0;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Verify API token by calling /api/users/me
|
|
55
|
+
*/
|
|
56
|
+
export async function verifyToken(url, token) {
|
|
57
|
+
const response = await axios.get(`${url}/api/users/me`, {
|
|
58
|
+
headers: {
|
|
59
|
+
Authorization: `Bearer ${token}`,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
return response.data;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Save API token to .env file
|
|
66
|
+
*/
|
|
67
|
+
export function saveTokenToEnv(token) {
|
|
68
|
+
const envPath = path.join(process.cwd(), '.env');
|
|
69
|
+
let envContent = '';
|
|
70
|
+
// Read existing .env file if it exists
|
|
71
|
+
if (fs.existsSync(envPath)) {
|
|
72
|
+
envContent = fs.readFileSync(envPath, 'utf-8');
|
|
73
|
+
}
|
|
74
|
+
// Check if LEADCMS_API_KEY already exists
|
|
75
|
+
const lines = envContent.split('\n');
|
|
76
|
+
const apiKeyIndex = lines.findIndex((line) => line.startsWith('LEADCMS_API_KEY='));
|
|
77
|
+
if (apiKeyIndex !== -1) {
|
|
78
|
+
// Update existing key
|
|
79
|
+
lines[apiKeyIndex] = `LEADCMS_API_KEY=${token}`;
|
|
80
|
+
envContent = lines.join('\n');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Add new key
|
|
84
|
+
if (envContent && !envContent.endsWith('\n')) {
|
|
85
|
+
envContent += '\n';
|
|
86
|
+
}
|
|
87
|
+
envContent += `LEADCMS_API_KEY=${token}\n`;
|
|
88
|
+
}
|
|
89
|
+
fs.writeFileSync(envPath, envContent, 'utf-8');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Device authentication flow
|
|
93
|
+
*/
|
|
94
|
+
export async function deviceAuthFlow(url) {
|
|
95
|
+
console.log('\nš Starting device authentication...\n');
|
|
96
|
+
// Step 1: Initiate device authentication
|
|
97
|
+
let initData;
|
|
98
|
+
try {
|
|
99
|
+
const response = await axios.post(`${url}/api/identity/device/initiate`, {}, { headers: { 'Content-Type': 'application/json' } });
|
|
100
|
+
initData = response.data;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
throw new Error(`Failed to initiate device authentication: ${error.message}`);
|
|
104
|
+
}
|
|
105
|
+
// Step 2: Display instructions to user
|
|
106
|
+
console.log('š To complete authentication, open this link in your browser:\n');
|
|
107
|
+
console.log(` ${initData.verificationUriComplete}\n`);
|
|
108
|
+
console.log(`ā±ļø Code expires in ${Math.floor(initData.expiresIn / 60)} minutes`);
|
|
109
|
+
console.log('ā³ Waiting for authorization...\n');
|
|
110
|
+
// Step 3: Poll for completion
|
|
111
|
+
const pollRequest = { deviceCode: initData.deviceCode };
|
|
112
|
+
const startTime = Date.now();
|
|
113
|
+
const expirationTime = startTime + initData.expiresIn * 1000;
|
|
114
|
+
while (Date.now() < expirationTime) {
|
|
115
|
+
await new Promise((resolve) => setTimeout(resolve, initData.interval * 1000));
|
|
116
|
+
try {
|
|
117
|
+
const pollResponse = await axios.post(`${url}/api/identity/device/poll`, pollRequest, { headers: { 'Content-Type': 'application/json' } });
|
|
118
|
+
if (pollResponse.status === 200) {
|
|
119
|
+
// Authentication successful
|
|
120
|
+
return pollResponse.data.token;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (axios.isAxiosError(error)) {
|
|
125
|
+
if (error.response?.status === 202) {
|
|
126
|
+
// Still pending, continue polling
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
else if (error.response?.status === 400) {
|
|
130
|
+
// Device code expired, denied, or invalid
|
|
131
|
+
const errorData = error.response.data;
|
|
132
|
+
throw new Error(errorData.error_description || errorData.message || 'Device authentication failed');
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// Other error
|
|
136
|
+
throw new Error(`Authentication failed: ${error.response?.statusText || error.message}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
throw new Error('Authentication timeout: Code expired');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Manual token input flow (legacy)
|
|
148
|
+
* Requires a question function for readline compatibility
|
|
149
|
+
*/
|
|
150
|
+
export async function manualTokenFlow(url, question) {
|
|
151
|
+
console.log('\nš LeadCMS Authentication\n');
|
|
152
|
+
console.log('ā ļø Note: This instance does not support automatic device authentication.');
|
|
153
|
+
console.log(' (Device authentication requires LeadCMS version 1.2.88 or higher)');
|
|
154
|
+
console.log(' Please follow these steps to obtain your API token:\n');
|
|
155
|
+
console.log('š Steps to get your API token:\n');
|
|
156
|
+
console.log(` 1. Open your browser and navigate to: ${url}`);
|
|
157
|
+
console.log(' 2. Open Developer Tools (press F12 or right-click ā Inspect)');
|
|
158
|
+
console.log(' 3. Go to the "Network" tab in Developer Tools');
|
|
159
|
+
console.log(' 4. Log in to your LeadCMS account');
|
|
160
|
+
console.log(' 5. After successful login, look for an API call in the Network tab');
|
|
161
|
+
console.log(' ā Look for "/api/users/me" request');
|
|
162
|
+
console.log(' 6. Click on that request');
|
|
163
|
+
console.log(' 7. Find the "Request Headers" section');
|
|
164
|
+
console.log(' 8. Locate the "Authorization" header');
|
|
165
|
+
console.log(' 9. Copy the token value (without the "Bearer " prefix)\n');
|
|
166
|
+
// Prompt for token
|
|
167
|
+
const token = await question('š Paste your API token here: ');
|
|
168
|
+
if (!token) {
|
|
169
|
+
throw new Error('No token provided');
|
|
170
|
+
}
|
|
171
|
+
return token;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Complete authentication flow with version detection
|
|
175
|
+
* Automatically chooses between device auth and manual flow
|
|
176
|
+
*/
|
|
177
|
+
export async function authenticate(url, question) {
|
|
178
|
+
// Check LeadCMS version to determine authentication method
|
|
179
|
+
console.log('š Checking LeadCMS version...');
|
|
180
|
+
const version = await getLeadCMSVersion(url);
|
|
181
|
+
let token;
|
|
182
|
+
if (version) {
|
|
183
|
+
console.log(` Version: ${version}`);
|
|
184
|
+
if (supportsDeviceAuth(version)) {
|
|
185
|
+
// Use device authentication flow
|
|
186
|
+
token = await deviceAuthFlow(url);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Use manual token flow
|
|
190
|
+
console.log(' Device authentication not supported in this version.\n');
|
|
191
|
+
token = await manualTokenFlow(url, question);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// Version check failed, use manual flow
|
|
196
|
+
console.log(' Could not determine version, using manual authentication.\n');
|
|
197
|
+
token = await manualTokenFlow(url, question);
|
|
198
|
+
}
|
|
199
|
+
// Verify token
|
|
200
|
+
console.log('\nā³ Verifying token...');
|
|
201
|
+
const user = await verifyToken(url, token);
|
|
202
|
+
return { token, user };
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the /api/config endpoint response
|
|
3
|
+
* This endpoint provides information about the LeadCMS instance configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface CMSConfigResponse {
|
|
6
|
+
/** Authentication configuration */
|
|
7
|
+
auth: {
|
|
8
|
+
methods: string[];
|
|
9
|
+
msal?: {
|
|
10
|
+
clientId: string;
|
|
11
|
+
authority: string;
|
|
12
|
+
redirectUri: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
/** Available entity types (Content, Comment, Media, Contact, etc.) */
|
|
16
|
+
entities: string[];
|
|
17
|
+
/** Supported languages */
|
|
18
|
+
languages: Array<{
|
|
19
|
+
code: string;
|
|
20
|
+
name: string;
|
|
21
|
+
}>;
|
|
22
|
+
/** CMS settings */
|
|
23
|
+
settings: Record<string, string>;
|
|
24
|
+
/** Default language code */
|
|
25
|
+
defaultLanguage: string;
|
|
26
|
+
/** Enabled modules */
|
|
27
|
+
modules: string[];
|
|
28
|
+
/** CMS capabilities */
|
|
29
|
+
capabilities: string[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Set the cached CMS config
|
|
33
|
+
*/
|
|
34
|
+
export declare function setCMSConfig(config: CMSConfigResponse): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get the cached CMS config if available and not expired
|
|
37
|
+
*/
|
|
38
|
+
export declare function getCachedCMSConfig(): CMSConfigResponse | null;
|
|
39
|
+
/**
|
|
40
|
+
* Check if an entity type is supported by the CMS
|
|
41
|
+
* @param entityType - Entity type to check (case-insensitive)
|
|
42
|
+
* @returns true if entity is supported, false if not or if config is not available
|
|
43
|
+
*/
|
|
44
|
+
export declare function isEntitySupported(entityType: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Check if comments are supported
|
|
47
|
+
*/
|
|
48
|
+
export declare function isCommentsSupported(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Check if content is supported
|
|
51
|
+
*/
|
|
52
|
+
export declare function isContentSupported(): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Check if media is supported
|
|
55
|
+
*/
|
|
56
|
+
export declare function isMediaSupported(): boolean;
|
|
57
|
+
//# sourceMappingURL=cms-config-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cms-config-types.d.ts","sourceRoot":"","sources":["../../src/lib/cms-config-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE;YACL,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,EAAE,MAAM,CAAC;YAClB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;IACF,sEAAsE;IACtE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,4BAA4B;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uBAAuB;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAaD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAK5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,GAAG,IAAI,CAa7D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAU7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C"}
|