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.
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const schemaCommand: Command;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -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":";;;;;;AAAA,yCAAoC;AACpC,kDAA0B;AAC1B,2BAAwE;AACxE,+BAA4B;AAC5B,mCAAgD;AAEnC,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,yCAAyC,CAAC,CAAC;AAE1D,qBAAa;KACV,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0FAA0F,CAAC;KACvG,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE,QAAQ,CAAC;KACpD,MAAM,CAAC,cAAc,EAAE,yBAAyB,EAAE,YAAY,CAAC;KAC/D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,WAAW;QACX,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,IAAA,eAAU,EAAC,OAAO,CAAC,EAAE,CAAC;YACxB,IAAA,eAAY,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,IAAA,eAAY,EAAC,EAAE,IAAI,EAAE,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAEtD,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,qBAAqB;QACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,cAAc,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC;gBACxB,UAAU,EAAE,oBAAoB;gBAChC,SAAS,EAAE,QAAQ;gBACnB,aAAa,EAAE,YAAY;aAC5B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,iBAAiB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAS,CAAC;QAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAE5C,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAE3D,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyD1B,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,UAAU,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,EAAS,CAAC;QAE3C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAElD,iBAAiB;QACjB,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAChD,IAAA,cAAS,EAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvC,2BAA2B;QAC3B,MAAM,iBAAiB,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;QAC7D,IAAA,kBAAa,EAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAExE,+BAA+B;QAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAClD,IAAA,kBAAa,EAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAE/B,8CAA8C;QAC9C,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAA,kBAAa,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAEvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAE7D,iCAAiC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;aAC1C,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aAClI,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;aAC/C,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;aAC3G,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,OAAO,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IAEH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,oEAAoE;AAEpE,SAAS,QAAQ,CAAC,MAAW;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IAE3G,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAErE,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM;gBACxC,CAAC,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACtE,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,GAAG,UAAU,IAAI,CAAC,CAAC;YAC/C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM;oBAC7B,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBACvF,CAAC,CAAC,EAAE,CAAC;gBACP,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,IAAI,KAAK,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YAClC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9E,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,MAAM,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,IAAS;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IACxE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IACrE,OAAO,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC;AAC/B,CAAC;AAED,0DAA0D;AAE1D,SAAS,kBAAkB,CAAC,MAAW;IACrC,MAAM,KAAK,GAAa;QACtB,gEAAgE;QAChE,mDAAmD;QACnD,EAAE;KACH,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAClD,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7D,CAAC,CAAC,IAAI,KAAK,QAAQ;QACnB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC9B,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxB,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CACrB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,uBAAuB;YACvB,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAE1K,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,IAAS;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACjE,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IAClE,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IAClE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,mBAAmB,CAAC;IACrD,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,qCAAqC,CAAC;IAC9E,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,kBAAkB,CAAC;IACxD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,6DAA6D,CAAC;IAChG,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,gCAAgC,CAAC;IAClE,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,QAAQ,CAAC;IAC9C,6CAA6C;IAC7C,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IACpF,OAAO,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const setupCommand: Command;
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -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;AAE5C,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;AAE/B,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"}
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.12.1",
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": {