decoupled-cli 2.12.1 → 2.13.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/dist/commands/schema.d.ts +3 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +283 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +248 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/examples/FORMAT-REFERENCE.md +1 -0
- package/examples/content-import-sample.json +14 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SAC+B,CAAC"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.schemaCommand = void 0;
|
|
7
|
+
const commander_1 = require("commander");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const dotenv_1 = require("dotenv");
|
|
12
|
+
exports.schemaCommand = new commander_1.Command('schema')
|
|
13
|
+
.description('Sync GraphQL schema from a Drupal space');
|
|
14
|
+
exports.schemaCommand
|
|
15
|
+
.command('sync')
|
|
16
|
+
.description('Introspect the Drupal GraphQL schema and generate local files (schema.graphql, types.ts)')
|
|
17
|
+
.option('--dir <path>', 'output directory', 'schema')
|
|
18
|
+
.option('--env <path>', 'path to .env.local file', '.env.local')
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
try {
|
|
21
|
+
// Load env
|
|
22
|
+
const envPath = (0, path_1.join)(process.cwd(), options.env);
|
|
23
|
+
if ((0, fs_1.existsSync)(envPath)) {
|
|
24
|
+
(0, dotenv_1.config)({ path: envPath });
|
|
25
|
+
}
|
|
26
|
+
(0, dotenv_1.config)({ path: (0, path_1.join)(process.cwd(), '.env') });
|
|
27
|
+
const baseUrl = process.env.NEXT_PUBLIC_DRUPAL_BASE_URL;
|
|
28
|
+
const clientId = process.env.DRUPAL_CLIENT_ID;
|
|
29
|
+
const clientSecret = process.env.DRUPAL_CLIENT_SECRET;
|
|
30
|
+
if (!baseUrl || !clientId || !clientSecret) {
|
|
31
|
+
console.error(chalk_1.default.red('Missing required environment variables.'));
|
|
32
|
+
console.log('Ensure these are set in .env.local:');
|
|
33
|
+
console.log(' NEXT_PUBLIC_DRUPAL_BASE_URL');
|
|
34
|
+
console.log(' DRUPAL_CLIENT_ID');
|
|
35
|
+
console.log(' DRUPAL_CLIENT_SECRET');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// 1. Get OAuth token
|
|
39
|
+
console.log(chalk_1.default.blue('Authenticating with Drupal...'));
|
|
40
|
+
const authRes = await fetch(`${baseUrl}/oauth/token`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
43
|
+
body: new URLSearchParams({
|
|
44
|
+
grant_type: 'client_credentials',
|
|
45
|
+
client_id: clientId,
|
|
46
|
+
client_secret: clientSecret,
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
if (!authRes.ok) {
|
|
50
|
+
throw new Error(`OAuth failed: ${authRes.status} ${authRes.statusText}`);
|
|
51
|
+
}
|
|
52
|
+
const authData = await authRes.json();
|
|
53
|
+
const token = authData.access_token;
|
|
54
|
+
console.log(chalk_1.default.green('✓ Authenticated'));
|
|
55
|
+
// 2. Introspect GraphQL schema
|
|
56
|
+
console.log(chalk_1.default.blue('Introspecting GraphQL schema...'));
|
|
57
|
+
const introspectionQuery = `
|
|
58
|
+
query IntrospectionQuery {
|
|
59
|
+
__schema {
|
|
60
|
+
queryType { name }
|
|
61
|
+
mutationType { name }
|
|
62
|
+
subscriptionType { name }
|
|
63
|
+
types {
|
|
64
|
+
...FullType
|
|
65
|
+
}
|
|
66
|
+
directives {
|
|
67
|
+
name
|
|
68
|
+
description
|
|
69
|
+
locations
|
|
70
|
+
args { ...InputValue }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fragment FullType on __Type {
|
|
76
|
+
kind name description
|
|
77
|
+
fields(includeDeprecated: true) {
|
|
78
|
+
name description
|
|
79
|
+
args { ...InputValue }
|
|
80
|
+
type { ...TypeRef }
|
|
81
|
+
isDeprecated deprecationReason
|
|
82
|
+
}
|
|
83
|
+
inputFields { ...InputValue }
|
|
84
|
+
interfaces { ...TypeRef }
|
|
85
|
+
enumValues(includeDeprecated: true) { name description isDeprecated deprecationReason }
|
|
86
|
+
possibleTypes { ...TypeRef }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
fragment InputValue on __InputValue {
|
|
90
|
+
name description
|
|
91
|
+
type { ...TypeRef }
|
|
92
|
+
defaultValue
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
fragment TypeRef on __Type {
|
|
96
|
+
kind name
|
|
97
|
+
ofType {
|
|
98
|
+
kind name
|
|
99
|
+
ofType {
|
|
100
|
+
kind name
|
|
101
|
+
ofType {
|
|
102
|
+
kind name
|
|
103
|
+
ofType {
|
|
104
|
+
kind name
|
|
105
|
+
ofType {
|
|
106
|
+
kind name
|
|
107
|
+
ofType { kind name }
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
`;
|
|
115
|
+
const gqlRes = await fetch(`${baseUrl}/graphql`, {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
headers: {
|
|
118
|
+
Authorization: `Bearer ${token}`,
|
|
119
|
+
'Content-Type': 'application/json',
|
|
120
|
+
},
|
|
121
|
+
body: JSON.stringify({ query: introspectionQuery }),
|
|
122
|
+
});
|
|
123
|
+
if (!gqlRes.ok) {
|
|
124
|
+
throw new Error(`GraphQL introspection failed: ${gqlRes.status}`);
|
|
125
|
+
}
|
|
126
|
+
const gqlData = await gqlRes.json();
|
|
127
|
+
if (gqlData.errors) {
|
|
128
|
+
throw new Error(`GraphQL errors: ${gqlData.errors.map((e) => e.message).join(', ')}`);
|
|
129
|
+
}
|
|
130
|
+
if (!gqlData.data?.__schema) {
|
|
131
|
+
throw new Error('No schema returned from introspection');
|
|
132
|
+
}
|
|
133
|
+
console.log(chalk_1.default.green('✓ Schema introspected'));
|
|
134
|
+
// 3. Write files
|
|
135
|
+
const outDir = (0, path_1.join)(process.cwd(), options.dir);
|
|
136
|
+
(0, fs_1.mkdirSync)(outDir, { recursive: true });
|
|
137
|
+
// Write introspection JSON
|
|
138
|
+
const introspectionPath = (0, path_1.join)(outDir, 'introspection.json');
|
|
139
|
+
(0, fs_1.writeFileSync)(introspectionPath, JSON.stringify(gqlData.data, null, 2));
|
|
140
|
+
// Build SDL from introspection
|
|
141
|
+
const sdl = buildSDL(gqlData.data.__schema);
|
|
142
|
+
const schemaPath = (0, path_1.join)(outDir, 'schema.graphql');
|
|
143
|
+
(0, fs_1.writeFileSync)(schemaPath, sdl);
|
|
144
|
+
// Generate TypeScript types for content types
|
|
145
|
+
const typesContent = generateTypeScript(gqlData.data.__schema);
|
|
146
|
+
const typesPath = (0, path_1.join)(outDir, 'types.ts');
|
|
147
|
+
(0, fs_1.writeFileSync)(typesPath, typesContent);
|
|
148
|
+
console.log(chalk_1.default.green('\n✓ Schema sync complete!'));
|
|
149
|
+
console.log(` ${chalk_1.default.cyan(schemaPath)} — GraphQL SDL`);
|
|
150
|
+
console.log(` ${chalk_1.default.cyan(introspectionPath)} — Introspection JSON`);
|
|
151
|
+
console.log(` ${chalk_1.default.cyan(typesPath)} — TypeScript types`);
|
|
152
|
+
// Print summary of content types
|
|
153
|
+
const nodeTypes = gqlData.data.__schema.types
|
|
154
|
+
.filter((t) => t.name.startsWith('Node') && t.kind === 'OBJECT' && !t.name.includes('Connection') && !t.name.includes('Edge'))
|
|
155
|
+
.map((t) => t.name);
|
|
156
|
+
const paragraphTypes = gqlData.data.__schema.types
|
|
157
|
+
.filter((t) => t.name.startsWith('Paragraph') && t.kind === 'OBJECT' && !t.name.includes('Connection'))
|
|
158
|
+
.map((t) => t.name);
|
|
159
|
+
if (nodeTypes.length) {
|
|
160
|
+
console.log(`\n ${chalk_1.default.bold('Node types:')} ${nodeTypes.join(', ')}`);
|
|
161
|
+
}
|
|
162
|
+
if (paragraphTypes.length) {
|
|
163
|
+
console.log(` ${chalk_1.default.bold('Paragraph types:')} ${paragraphTypes.join(', ')}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.error(chalk_1.default.red(`\nError: ${error.message}`));
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
// ── SDL generator (simplified — covers the types we care about) ──
|
|
172
|
+
function buildSDL(schema) {
|
|
173
|
+
const lines = [];
|
|
174
|
+
const skipTypes = new Set(['__Schema', '__Type', '__Field', '__InputValue', '__EnumValue', '__Directive']);
|
|
175
|
+
for (const type of schema.types) {
|
|
176
|
+
if (type.name.startsWith('__') || skipTypes.has(type.name))
|
|
177
|
+
continue;
|
|
178
|
+
if (type.kind === 'OBJECT') {
|
|
179
|
+
const interfaces = type.interfaces?.length
|
|
180
|
+
? ` implements ${type.interfaces.map((i) => i.name).join(' & ')}`
|
|
181
|
+
: '';
|
|
182
|
+
lines.push(`type ${type.name}${interfaces} {`);
|
|
183
|
+
for (const field of type.fields || []) {
|
|
184
|
+
const args = field.args?.length
|
|
185
|
+
? `(${field.args.map((a) => `${a.name}: ${typeRefToString(a.type)}`).join(', ')})`
|
|
186
|
+
: '';
|
|
187
|
+
lines.push(` ${field.name}${args}: ${typeRefToString(field.type)}`);
|
|
188
|
+
}
|
|
189
|
+
lines.push('}', '');
|
|
190
|
+
}
|
|
191
|
+
else if (type.kind === 'INPUT_OBJECT') {
|
|
192
|
+
lines.push(`input ${type.name} {`);
|
|
193
|
+
for (const field of type.inputFields || []) {
|
|
194
|
+
lines.push(` ${field.name}: ${typeRefToString(field.type)}`);
|
|
195
|
+
}
|
|
196
|
+
lines.push('}', '');
|
|
197
|
+
}
|
|
198
|
+
else if (type.kind === 'ENUM') {
|
|
199
|
+
lines.push(`enum ${type.name} {`);
|
|
200
|
+
for (const val of type.enumValues || []) {
|
|
201
|
+
lines.push(` ${val.name}`);
|
|
202
|
+
}
|
|
203
|
+
lines.push('}', '');
|
|
204
|
+
}
|
|
205
|
+
else if (type.kind === 'UNION') {
|
|
206
|
+
const members = type.possibleTypes?.map((t) => t.name).join(' | ') || '';
|
|
207
|
+
lines.push(`union ${type.name} = ${members}`, '');
|
|
208
|
+
}
|
|
209
|
+
else if (type.kind === 'INTERFACE') {
|
|
210
|
+
lines.push(`interface ${type.name} {`);
|
|
211
|
+
for (const field of type.fields || []) {
|
|
212
|
+
lines.push(` ${field.name}: ${typeRefToString(field.type)}`);
|
|
213
|
+
}
|
|
214
|
+
lines.push('}', '');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return lines.join('\n');
|
|
218
|
+
}
|
|
219
|
+
function typeRefToString(type) {
|
|
220
|
+
if (!type)
|
|
221
|
+
return 'String';
|
|
222
|
+
if (type.kind === 'NON_NULL')
|
|
223
|
+
return `${typeRefToString(type.ofType)}!`;
|
|
224
|
+
if (type.kind === 'LIST')
|
|
225
|
+
return `[${typeRefToString(type.ofType)}]`;
|
|
226
|
+
return type.name || 'String';
|
|
227
|
+
}
|
|
228
|
+
// ── TypeScript generator for Node and Paragraph types ──
|
|
229
|
+
function generateTypeScript(schema) {
|
|
230
|
+
const lines = [
|
|
231
|
+
'// Auto-generated TypeScript types from Drupal GraphQL schema.',
|
|
232
|
+
'// Run `decoupled-cli schema sync` to regenerate.',
|
|
233
|
+
'',
|
|
234
|
+
];
|
|
235
|
+
const contentTypes = schema.types.filter((t) => (t.name.startsWith('Node') || t.name.startsWith('Paragraph')) &&
|
|
236
|
+
t.kind === 'OBJECT' &&
|
|
237
|
+
!t.name.includes('Connection') &&
|
|
238
|
+
!t.name.includes('Edge') &&
|
|
239
|
+
t.fields?.length > 0);
|
|
240
|
+
for (const type of contentTypes) {
|
|
241
|
+
lines.push(`export interface ${type.name} {`);
|
|
242
|
+
for (const field of type.fields) {
|
|
243
|
+
// Skip internal fields
|
|
244
|
+
if (['uuid', 'langcode', 'status', 'created', 'changed', 'promote', 'sticky', 'defaultLangcode', 'revisionTranslationAffected', 'metatag'].includes(field.name))
|
|
245
|
+
continue;
|
|
246
|
+
const tsType = gqlTypeToTS(field.type);
|
|
247
|
+
lines.push(` ${field.name}: ${tsType};`);
|
|
248
|
+
}
|
|
249
|
+
lines.push('}', '');
|
|
250
|
+
}
|
|
251
|
+
return lines.join('\n');
|
|
252
|
+
}
|
|
253
|
+
function gqlTypeToTS(type) {
|
|
254
|
+
if (!type)
|
|
255
|
+
return 'any';
|
|
256
|
+
if (type.kind === 'NON_NULL')
|
|
257
|
+
return gqlTypeToTS(type.ofType);
|
|
258
|
+
if (type.kind === 'LIST')
|
|
259
|
+
return `${gqlTypeToTS(type.ofType)}[]`;
|
|
260
|
+
if (type.name === 'String' || type.name === 'ID')
|
|
261
|
+
return 'string';
|
|
262
|
+
if (type.name === 'Int' || type.name === 'Float')
|
|
263
|
+
return 'number';
|
|
264
|
+
if (type.name === 'Boolean')
|
|
265
|
+
return 'boolean';
|
|
266
|
+
if (type.name === 'Text')
|
|
267
|
+
return '{ value: string }';
|
|
268
|
+
if (type.name === 'TextSummary')
|
|
269
|
+
return '{ value: string; summary?: string }';
|
|
270
|
+
if (type.name === 'DateTime')
|
|
271
|
+
return '{ time: string }';
|
|
272
|
+
if (type.name === 'Image')
|
|
273
|
+
return '{ url: string; alt: string; width: number; height: number }';
|
|
274
|
+
if (type.name === 'Link')
|
|
275
|
+
return '{ uri: string; title: string }';
|
|
276
|
+
if (type.name === 'Language')
|
|
277
|
+
return 'string';
|
|
278
|
+
// Union types and unknown custom types → any
|
|
279
|
+
if (type.name?.endsWith('Union') || type.name?.endsWith('Connection'))
|
|
280
|
+
return 'any';
|
|
281
|
+
return type.name || 'any';
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/commands/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,SA2IrB,CAAC"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.setupCommand = void 0;
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const readline = __importStar(require("readline"));
|
|
46
|
+
exports.setupCommand = new commander_1.Command('setup')
|
|
47
|
+
.description('Interactive setup — create a space, configure env, and import content')
|
|
48
|
+
.option('--content <file>', 'content JSON file to import', 'data/components-content.json')
|
|
49
|
+
.option('--name <name>', 'space name (skip prompt)')
|
|
50
|
+
.option('--no-import', 'skip content import')
|
|
51
|
+
.action(async (options) => {
|
|
52
|
+
console.log(`
|
|
53
|
+
${chalk_1.default.magenta('╔══════════════════════════════════════════════════╗')}
|
|
54
|
+
${chalk_1.default.magenta('║')} ${chalk_1.default.magenta('║')}
|
|
55
|
+
${chalk_1.default.magenta('║')} ${chalk_1.default.bold('Decoupled Drupal — Interactive Setup')} ${chalk_1.default.magenta('║')}
|
|
56
|
+
${chalk_1.default.magenta('║')} ${chalk_1.default.magenta('║')}
|
|
57
|
+
${chalk_1.default.magenta('╚══════════════════════════════════════════════════╝')}
|
|
58
|
+
`);
|
|
59
|
+
const totalSteps = options.import === false ? 4 : 5;
|
|
60
|
+
let currentStep = 1;
|
|
61
|
+
// ── Step 1: Auth ──
|
|
62
|
+
step(currentStep++, totalSteps, 'Checking authentication');
|
|
63
|
+
const isAuthed = checkAuth();
|
|
64
|
+
if (!isAuthed) {
|
|
65
|
+
console.log(chalk_1.default.yellow('You need to authenticate with Decoupled.io first.'));
|
|
66
|
+
const shouldAuth = await confirm('Open browser to authenticate?');
|
|
67
|
+
if (shouldAuth) {
|
|
68
|
+
console.log(chalk_1.default.dim('\nOpening browser for authentication...'));
|
|
69
|
+
await runInteractive('npx', ['decoupled-cli@latest', 'auth', 'login']);
|
|
70
|
+
if (!checkAuth()) {
|
|
71
|
+
fail('Authentication failed. Please try again.');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
fail('Authentication required to continue.');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
ok('Authenticated with Decoupled.io');
|
|
79
|
+
// ── Step 2: Create space ──
|
|
80
|
+
step(currentStep++, totalSteps, 'Creating Drupal space');
|
|
81
|
+
const spaceName = options.name || await prompt('Enter a name for your site', 'My Decoupled Site');
|
|
82
|
+
console.log(chalk_1.default.dim(`\nCreating space "${spaceName}"...`));
|
|
83
|
+
const createOutput = runSync(`npx decoupled-cli@latest spaces create "${spaceName}" 2>&1`);
|
|
84
|
+
let spaceId = parseSpaceId(createOutput);
|
|
85
|
+
if (!spaceId) {
|
|
86
|
+
console.log(chalk_1.default.red('Failed to parse space ID from output:'));
|
|
87
|
+
console.log(createOutput);
|
|
88
|
+
const manual = await prompt('Enter space ID manually (or press Enter to exit)');
|
|
89
|
+
if (manual && !isNaN(parseInt(manual))) {
|
|
90
|
+
spaceId = parseInt(manual);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
ok(`Space created with ID: ${spaceId}`);
|
|
97
|
+
// ── Step 3: Wait for provisioning ──
|
|
98
|
+
step(currentStep++, totalSteps, 'Waiting for space provisioning');
|
|
99
|
+
console.log(chalk_1.default.dim('New spaces take ~90 seconds to provision...'));
|
|
100
|
+
const ready = await waitForReady(spaceId);
|
|
101
|
+
if (!ready) {
|
|
102
|
+
console.log(chalk_1.default.yellow(`Check status later: npx decoupled-cli@latest spaces show ${spaceId}`));
|
|
103
|
+
const cont = await confirm('Continue anyway?', false);
|
|
104
|
+
if (!cont)
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
// ── Step 4: Configure .env.local ──
|
|
108
|
+
step(currentStep++, totalSteps, 'Configuring environment');
|
|
109
|
+
const envPath = path.join(process.cwd(), '.env.local');
|
|
110
|
+
const envExists = fs.existsSync(envPath);
|
|
111
|
+
if (envExists) {
|
|
112
|
+
const overwrite = await confirm('.env.local already exists. Overwrite?', false);
|
|
113
|
+
if (!overwrite) {
|
|
114
|
+
console.log(chalk_1.default.dim('Skipping environment configuration'));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
await runInteractive('npx', ['decoupled-cli@latest', 'spaces', 'env', String(spaceId), '--write', '.env.local']);
|
|
118
|
+
ok('Environment configured in .env.local');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
await runInteractive('npx', ['decoupled-cli@latest', 'spaces', 'env', String(spaceId), '--write', '.env.local']);
|
|
123
|
+
ok('Environment configured in .env.local');
|
|
124
|
+
}
|
|
125
|
+
// ── Step 5: Import content ──
|
|
126
|
+
if (options.import !== false) {
|
|
127
|
+
step(currentStep++, totalSteps, 'Importing content');
|
|
128
|
+
const contentFile = path.join(process.cwd(), options.content);
|
|
129
|
+
if (!fs.existsSync(contentFile)) {
|
|
130
|
+
console.log(chalk_1.default.yellow(`Content file not found: ${options.content}`));
|
|
131
|
+
console.log(chalk_1.default.dim('Skipping content import. You can import later with:'));
|
|
132
|
+
console.log(chalk_1.default.cyan(` npx decoupled-cli@latest content import --file ${options.content}`));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const shouldImport = await confirm(`Import content from ${options.content}?`);
|
|
136
|
+
if (shouldImport) {
|
|
137
|
+
console.log(chalk_1.default.dim('\nImporting content model and sample data...'));
|
|
138
|
+
const result = await runInteractive('npx', ['decoupled-cli@latest', 'content', 'import', '--file', options.content]);
|
|
139
|
+
if (result) {
|
|
140
|
+
ok('Content imported successfully');
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.log(chalk_1.default.yellow('Content import had issues. Retry with:'));
|
|
144
|
+
console.log(chalk_1.default.cyan(` npx decoupled-cli@latest content import --file ${options.content}`));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// ── Done ──
|
|
150
|
+
const machineMatch = createOutput.match(/Machine Name:\s*(\w+)/i);
|
|
151
|
+
const spaceUrl = machineMatch ? `https://${machineMatch[1]}.decoupled.website` : null;
|
|
152
|
+
console.log(`
|
|
153
|
+
${chalk_1.default.green('╔══════════════════════════════════════════════════╗')}
|
|
154
|
+
${chalk_1.default.green('║')} ${chalk_1.default.green('║')}
|
|
155
|
+
${chalk_1.default.green('║')} ${chalk_1.default.bold('Setup Complete!')} ${chalk_1.default.green('║')}
|
|
156
|
+
${chalk_1.default.green('║')} ${chalk_1.default.green('║')}
|
|
157
|
+
${chalk_1.default.green('╚══════════════════════════════════════════════════╝')}
|
|
158
|
+
|
|
159
|
+
${chalk_1.default.bold('Next steps:')}
|
|
160
|
+
|
|
161
|
+
1. Build and start:
|
|
162
|
+
${chalk_1.default.cyan('npm run build && npm start')}
|
|
163
|
+
|
|
164
|
+
2. Open ${chalk_1.default.cyan('http://localhost:3000')}
|
|
165
|
+
|
|
166
|
+
3. Sync GraphQL schema (generates TypeScript types):
|
|
167
|
+
${chalk_1.default.cyan('npx decoupled-cli@latest schema sync')}
|
|
168
|
+
|
|
169
|
+
4. Access Drupal admin:
|
|
170
|
+
${chalk_1.default.cyan(`npx decoupled-cli@latest spaces login ${spaceId}`)}
|
|
171
|
+
|
|
172
|
+
${chalk_1.default.dim(`Space ID: ${spaceId}`)}
|
|
173
|
+
${spaceUrl ? chalk_1.default.dim(`Drupal URL: ${spaceUrl}`) : ''}
|
|
174
|
+
`);
|
|
175
|
+
});
|
|
176
|
+
// ── Helpers ──
|
|
177
|
+
function step(n, total, msg) {
|
|
178
|
+
console.log(`\n${chalk_1.default.cyan(`[${n}/${total}]`)} ${chalk_1.default.bold(msg)}`);
|
|
179
|
+
}
|
|
180
|
+
function ok(msg) {
|
|
181
|
+
console.log(`${chalk_1.default.green('✓')} ${msg}`);
|
|
182
|
+
}
|
|
183
|
+
function fail(msg) {
|
|
184
|
+
console.log(`${chalk_1.default.red('✗')} ${msg}`);
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
function checkAuth() {
|
|
188
|
+
try {
|
|
189
|
+
const output = (0, child_process_1.execSync)('npx decoupled-cli@latest auth status 2>&1', { encoding: 'utf8', stdio: 'pipe' });
|
|
190
|
+
return !output.includes('not authenticated');
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
function runSync(command) {
|
|
197
|
+
try {
|
|
198
|
+
return (0, child_process_1.execSync)(command, { encoding: 'utf8', stdio: 'pipe' });
|
|
199
|
+
}
|
|
200
|
+
catch (e) {
|
|
201
|
+
return e.message || '';
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function parseSpaceId(output) {
|
|
205
|
+
const match = output.match(/Space ID:\s*(\d+)/i) || output.match(/ID:\s*(\d+)/i);
|
|
206
|
+
return match ? parseInt(match[1]) : null;
|
|
207
|
+
}
|
|
208
|
+
function runInteractive(command, args) {
|
|
209
|
+
return new Promise((resolve) => {
|
|
210
|
+
const child = (0, child_process_1.spawn)(command, args, { stdio: 'inherit', shell: true });
|
|
211
|
+
child.on('close', (code) => resolve(code === 0));
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
async function waitForReady(spaceId, maxSeconds = 200) {
|
|
215
|
+
const spinners = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
216
|
+
let i = 0;
|
|
217
|
+
const start = Date.now();
|
|
218
|
+
while ((Date.now() - start) / 1000 < maxSeconds) {
|
|
219
|
+
const elapsed = Math.floor((Date.now() - start) / 1000);
|
|
220
|
+
process.stdout.write(`\r${chalk_1.default.cyan(spinners[i++ % spinners.length])} Waiting for space... (${elapsed}s)`);
|
|
221
|
+
const result = runSync(`npx decoupled-cli@latest spaces status ${spaceId} 2>/dev/null`);
|
|
222
|
+
if (result.includes('Ready: Yes')) {
|
|
223
|
+
process.stdout.write(`\r${chalk_1.default.green('✓')} Space is ready! \n`);
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
await new Promise(r => setTimeout(r, 5000));
|
|
227
|
+
}
|
|
228
|
+
process.stdout.write(`\r${chalk_1.default.red('✗')} Timeout (${maxSeconds}s) \n`);
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
async function prompt(question, defaultValue) {
|
|
232
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
233
|
+
const hint = defaultValue ? ` (${defaultValue})` : '';
|
|
234
|
+
return new Promise((resolve) => {
|
|
235
|
+
rl.question(`${question}${hint}: `, (answer) => {
|
|
236
|
+
rl.close();
|
|
237
|
+
resolve(answer.trim() || defaultValue || '');
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
async function confirm(question, defaultYes = true) {
|
|
242
|
+
const hint = defaultYes ? '[Y/n]' : '[y/N]';
|
|
243
|
+
const answer = await prompt(`${question} ${hint}`);
|
|
244
|
+
if (!answer)
|
|
245
|
+
return defaultYes;
|
|
246
|
+
return answer.toLowerCase().startsWith('y');
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,8 @@ const config_1 = require("./commands/config");
|
|
|
17
17
|
const content_1 = require("./commands/content");
|
|
18
18
|
const config_import_1 = require("./commands/config-import");
|
|
19
19
|
const mcp_1 = require("./commands/mcp");
|
|
20
|
+
const schema_1 = require("./commands/schema");
|
|
21
|
+
const setup_1 = require("./commands/setup");
|
|
20
22
|
// Read version from package.json
|
|
21
23
|
const packageJson = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../package.json'), 'utf-8'));
|
|
22
24
|
const program = new commander_1.Command();
|
|
@@ -40,6 +42,8 @@ program.addCommand(config_1.configCommand);
|
|
|
40
42
|
program.addCommand(content_1.contentCommand);
|
|
41
43
|
program.addCommand(config_import_1.configImportCommand);
|
|
42
44
|
program.addCommand(mcp_1.mcpCommand);
|
|
45
|
+
program.addCommand(schema_1.schemaCommand);
|
|
46
|
+
program.addCommand(setup_1.setupCommand);
|
|
43
47
|
// Handle unknown commands
|
|
44
48
|
program.on('command:*', () => {
|
|
45
49
|
console.error(chalk_1.default.red(`Invalid command: ${program.args.join(' ')}`));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,2BAAkC;AAClC,+BAA4B;AAC5B,0CAA8C;AAC9C,8CAAkD;AAClD,4CAAgD;AAChD,wCAA4C;AAC5C,8CAAkD;AAClD,8CAAkD;AAClD,gDAAoD;AACpD,4DAA+D;AAC/D,wCAA4C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAEA,yCAAoC;AACpC,kDAA0B;AAC1B,2BAAkC;AAClC,+BAA4B;AAC5B,0CAA8C;AAC9C,8CAAkD;AAClD,4CAAgD;AAChD,wCAA4C;AAC5C,8CAAkD;AAClD,8CAAkD;AAClD,gDAAoD;AACpD,4DAA+D;AAC/D,wCAA4C;AAC5C,8CAAkD;AAClD,4CAAgD;AAEhD,iCAAiC;AACjC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,yCAAyC,CAAC;KACtD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;KAC5B,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;KAClD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC;KAClD,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC;KAC3C,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;KAC9C,MAAM,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;AAE1D,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,gBAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,mCAAmB,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,gBAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,sBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AAEjC,0BAA0B;AAC1B,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,oCAAoC;AACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -134,6 +134,7 @@ Common field types you can use in the `"type"` field:
|
|
|
134
134
|
|
|
135
135
|
- `"string"` - Short text (max 255 chars)
|
|
136
136
|
- `"text"` - Long text with HTML formatting
|
|
137
|
+
- `"select(opt1|opt2|opt3)"` - Dropdown select with predefined options (e.g., `"select(draft|published|archived)"`)
|
|
137
138
|
- `"datetime"` - Date and time (ISO 8601 format: "2026-01-19")
|
|
138
139
|
- `"bool"` - Boolean true/false
|
|
139
140
|
- `"image"` - Single image upload
|
|
@@ -35,6 +35,18 @@
|
|
|
35
35
|
"type": "term(tags)[]",
|
|
36
36
|
"description": "Multiple taxonomy term references"
|
|
37
37
|
},
|
|
38
|
+
{
|
|
39
|
+
"id": "status",
|
|
40
|
+
"label": "Status",
|
|
41
|
+
"type": "select(draft|published|archived)",
|
|
42
|
+
"description": "Dropdown select field with predefined options"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "layout",
|
|
46
|
+
"label": "Layout",
|
|
47
|
+
"type": "select(default|wide|sidebar)",
|
|
48
|
+
"description": "Select field for choosing page layout style"
|
|
49
|
+
},
|
|
38
50
|
{
|
|
39
51
|
"id": "featured",
|
|
40
52
|
"label": "Featured Article",
|
|
@@ -149,6 +161,8 @@
|
|
|
149
161
|
"body": "<p>Decoupled Drupal enables you to use Drupal as a powerful content management backend while building your frontend with modern JavaScript frameworks.</p><p>This architecture provides flexibility, performance, and an excellent developer experience.</p>",
|
|
150
162
|
"published_date": "2024-03-15T09:00:00",
|
|
151
163
|
"author": "Jane Smith",
|
|
164
|
+
"status": "published",
|
|
165
|
+
"layout": "wide",
|
|
152
166
|
"featured": true,
|
|
153
167
|
"key_points": [
|
|
154
168
|
"Use Drupal for content management",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "decoupled-cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.13.0",
|
|
4
4
|
"description": "Command-line interface for managing Decoupled Drupal spaces, deploying content, and automating workflows. Features content import, space management, and CI/CD integration.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|