@dyrected/cli 0.0.1 → 1.0.1

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/index.js CHANGED
@@ -1,29 +1,386 @@
1
1
  #!/usr/bin/env node
2
- import { Command } from 'commander';
3
- import prettier from 'prettier';
4
- import chalk from 'chalk';
5
- import fs from 'fs-extra';
6
- import path from 'path';
2
+ import { Command } from "commander";
3
+ import prettier from "prettier";
4
+ import chalk from "chalk";
5
+ import fs from "fs-extra";
6
+ import path from "path";
7
+ import prompts from "prompts";
8
+ import { execSync } from "child_process";
9
+ import { createJiti } from "jiti";
10
+ import { generateAIPrompt } from "@dyrected/core";
7
11
  const program = new Command();
12
+ program.name("dyrected").description("Dyrected CMS CLI tool").version("0.0.1");
13
+ // ─── init ──────────────────────────────────────────────────────────────────
8
14
  program
9
- .name('dyrected')
10
- .description('Dyrected CMS CLI tool')
11
- .version('0.0.1');
15
+ .command("init")
16
+ .description("Bootstrap a new Dyrected CMS project")
17
+ .action(async () => {
18
+ console.log(chalk.bold("\n🚀 Welcome to Dyrected CMS\n"));
19
+ const { framework } = await prompts({
20
+ type: "select",
21
+ name: "framework",
22
+ message: "Which framework are you using?",
23
+ choices: [
24
+ { title: "Next.js (App Router)", value: "next" },
25
+ { title: "Nuxt 3", value: "nuxt" },
26
+ ],
27
+ });
28
+ if (!framework) {
29
+ console.log(chalk.yellow("\nAborted."));
30
+ process.exit(0);
31
+ }
32
+ const { quickSetup } = await prompts({
33
+ type: "confirm",
34
+ name: "quickSetup",
35
+ message: "Use Quick Setup (SQLite + Local Storage)?",
36
+ initial: true,
37
+ });
38
+ const { adminPath } = await prompts({
39
+ type: "text",
40
+ name: "adminPath",
41
+ message: "What path should the admin dashboard use?",
42
+ initial: "cms",
43
+ format: (val) => val.replace(/^\//, "").replace(/\/$/, ""),
44
+ });
45
+ let db = "sqlite";
46
+ let storage = "local";
47
+ if (!quickSetup) {
48
+ const dbResponse = await prompts({
49
+ type: "select",
50
+ name: "value",
51
+ message: "Which database adapter?",
52
+ choices: [
53
+ { title: "PostgreSQL (recommended)", value: "postgres" },
54
+ { title: "SQLite (local dev)", value: "sqlite" },
55
+ { title: "MongoDB", value: "mongodb" },
56
+ ],
57
+ });
58
+ db = dbResponse.value;
59
+ const storageResponse = await prompts({
60
+ type: "select",
61
+ name: "value",
62
+ message: "Which storage adapter?",
63
+ choices: [
64
+ { title: "Local filesystem", value: "local" },
65
+ { title: "AWS S3", value: "s3" },
66
+ { title: "Backblaze B2", value: "b2" },
67
+ { title: "Cloudinary", value: "cloudinary" },
68
+ ],
69
+ });
70
+ storage = storageResponse.value;
71
+ }
72
+ const cwd = process.cwd();
73
+ const packageManager = detectPackageManager(cwd);
74
+ // ── 1. Install dependencies ──────────────────────────────────────────
75
+ const frameworkPkg = framework === "next" ? "@dyrected/next" : "@dyrected/nuxt";
76
+ const dbPkg = `@dyrected/db-${db}`;
77
+ const storagePkg = `@dyrected/storage-${storage}`;
78
+ const deps = [frameworkPkg, dbPkg, storagePkg].join(" ");
79
+ console.log(chalk.blue(`\nInstalling ${deps}...`));
80
+ try {
81
+ execSync(`${packageManager} add ${deps}`, { cwd, stdio: "inherit" });
82
+ }
83
+ catch {
84
+ console.log(chalk.yellow("\nCould not auto-install. Run the following manually:"));
85
+ console.log(chalk.cyan(` ${packageManager} add ${deps}\n`));
86
+ }
87
+ // ── 2. Write dyrected.config.ts ──────────────────────────────────────
88
+ const dbImport = `import { ${db}Adapter } from '${dbPkg}'`;
89
+ const storageImport = `import { ${storage}Adapter } from '${storagePkg}'`;
90
+ const dbConfig = buildDbConfig(db);
91
+ const storageConfig = buildStorageConfig(storage);
92
+ const configContent = `import { defineCollection, defineGlobal, defineConfig } from '@dyrected/core'
93
+ ${dbImport}
94
+ ${storageImport}
95
+
96
+ // ── Collections ──────────────────────────────────────────────────────────
97
+
98
+ const media = defineCollection({
99
+ slug: 'media',
100
+ labels: { singular: 'Media', plural: 'Media' },
101
+ upload: true,
102
+ fields: [
103
+ { name: 'alt', type: 'text' },
104
+ ],
105
+ })
106
+
107
+ const pages = defineCollection({
108
+ slug: 'pages',
109
+ labels: { singular: 'Page', plural: 'Pages' },
110
+ fields: [
111
+ { name: 'title', type: 'text', required: true },
112
+ { name: 'slug', type: 'text', required: true },
113
+ { name: 'content', type: 'richText' },
114
+ { name: 'featuredImage', type: 'relationship', relationTo: 'media' },
115
+ ],
116
+ })
117
+
118
+ const posts = defineCollection({
119
+ slug: 'posts',
120
+ labels: { singular: 'Post', plural: 'Posts' },
121
+ fields: [
122
+ { name: 'title', type: 'text', required: true },
123
+ { name: 'content', type: 'richText' },
124
+ { name: 'featuredImage', type: 'relationship', relationTo: 'media' },
125
+ ],
126
+ })
127
+
128
+ // ── Globals ───────────────────────────────────────────────────────────────
129
+
130
+ const navigation = defineGlobal({
131
+ slug: 'navigation',
132
+ label: 'Navigation',
133
+ fields: [
134
+ {
135
+ name: 'menuItems',
136
+ type: 'array',
137
+ fields: [
138
+ { name: 'label', type: 'text' },
139
+ { name: 'link', type: 'relationship', relationTo: 'pages' },
140
+ ],
141
+ },
142
+ ],
143
+ })
144
+
145
+ const settings = defineGlobal({
146
+ slug: 'settings',
147
+ label: 'Site Settings',
148
+ fields: [
149
+ { name: 'siteName', type: 'text' },
150
+ { name: 'logo', type: 'relationship', relationTo: 'media' },
151
+ { name: 'footerText', type: 'textarea' },
152
+ ],
153
+ })
154
+
155
+ // ── Config ────────────────────────────────────────────────────────────────
156
+
157
+ export default defineConfig({
158
+ collections: [media, pages, posts],
159
+ globals: [navigation, settings],
160
+ db: ${dbConfig},
161
+ storage: ${storageConfig},
162
+ })
163
+ `;
164
+ const configPath = path.join(cwd, "dyrected.config.ts");
165
+ if (await fs.pathExists(configPath)) {
166
+ const { overwrite } = await prompts({
167
+ type: "confirm",
168
+ name: "overwrite",
169
+ message: "dyrected.config.ts already exists. Overwrite?",
170
+ initial: false,
171
+ });
172
+ if (!overwrite) {
173
+ console.log(chalk.yellow("Skipping config file."));
174
+ }
175
+ else {
176
+ await fs.outputFile(configPath, configContent);
177
+ console.log(chalk.green("✔ dyrected.config.ts written"));
178
+ }
179
+ }
180
+ else {
181
+ await fs.outputFile(configPath, configContent);
182
+ console.log(chalk.green("✔ dyrected.config.ts written"));
183
+ }
184
+ // ── 3. Framework-specific files ──────────────────────────────────────
185
+ if (framework === "next") {
186
+ await writeNextFiles(cwd, adminPath);
187
+ }
188
+ else {
189
+ await writeNuxtFiles(cwd, adminPath);
190
+ }
191
+ // ── 4. .env setup ───────────────────────────────────────────────────
192
+ const envContent = buildEnvTemplate(db, storage, framework);
193
+ const envExamplePath = path.join(cwd, ".env.example");
194
+ await fs.outputFile(envExamplePath, envContent);
195
+ console.log(chalk.green("✔ .env.example written"));
196
+ const envPath = path.join(cwd, ".env");
197
+ if (await fs.pathExists(envPath)) {
198
+ const existingEnv = await fs.readFile(envPath, "utf-8");
199
+ const missingVars = envContent
200
+ .split("\n")
201
+ .filter((line) => {
202
+ if (!line || line.startsWith("#"))
203
+ return false;
204
+ const key = line.split("=")[0];
205
+ return !existingEnv.includes(`${key}=`);
206
+ })
207
+ .join("\n");
208
+ if (missingVars) {
209
+ const { appendEnv } = await prompts({
210
+ type: "confirm",
211
+ name: "appendEnv",
212
+ message: ".env already exists. Append missing Dyrected variables?",
213
+ initial: true,
214
+ });
215
+ if (appendEnv) {
216
+ await fs.appendFile(envPath, `\n# ── Dyrected CMS ──────────────────────────────────────────────────\n${missingVars}`);
217
+ console.log(chalk.green("✔ .env file updated with missing variables"));
218
+ }
219
+ }
220
+ else {
221
+ console.log(chalk.dim("ℹ .env already contains all required variables."));
222
+ }
223
+ }
224
+ else {
225
+ const { createEnv } = await prompts({
226
+ type: "confirm",
227
+ name: "createEnv",
228
+ message: ".env file is missing. Create it now?",
229
+ initial: true,
230
+ });
231
+ if (createEnv) {
232
+ await fs.outputFile(envPath, envContent);
233
+ console.log(chalk.green("✔ .env file created"));
234
+ }
235
+ }
236
+ // ── Done ─────────────────────────────────────────────────────────────
237
+ console.log(chalk.bold.green("\n✅ Dyrected is ready!\n"));
238
+ console.log(chalk.cyan(` 1. Configure your environment variables in .env`));
239
+ console.log(chalk.cyan(` 2. Open http://localhost:3000/${adminPath} to start managing content.`));
240
+ console.log(chalk.cyan(" 3. Run: npx @dyrected/cli generate:types\n"));
241
+ console.log(chalk.bold.magenta("🤖 AI INTEGRATION PROMPT"));
242
+ console.log(chalk.dim("Copy this prompt and give it to your AI tool (Claude, GPT, etc.) to scaffold your CMS logic:\n"));
243
+ const promptText = generateAIPrompt(framework, {
244
+ baseUrl: "http://localhost:3000",
245
+ isSelfHosted: true,
246
+ });
247
+ console.log(chalk.white(promptText));
248
+ console.log("\n" + chalk.dim("━".repeat(50)) + "\n");
249
+ });
250
+ // ── Helpers ────────────────────────────────────────────────────────────────
251
+ function detectPackageManager(cwd) {
252
+ if (fs.existsSync(path.join(cwd, "pnpm-lock.yaml")))
253
+ return "pnpm";
254
+ if (fs.existsSync(path.join(cwd, "yarn.lock")))
255
+ return "yarn";
256
+ return "npm";
257
+ }
258
+ function buildDbConfig(db) {
259
+ switch (db) {
260
+ case "postgres":
261
+ return `postgresAdapter({ url: process.env.DATABASE_URL! })`;
262
+ case "sqlite":
263
+ return `sqliteAdapter({ filename: './data.db' })`;
264
+ case "mongodb":
265
+ return `mongodbAdapter({ url: process.env.DATABASE_URL! })`;
266
+ default:
267
+ return `postgresAdapter({ url: process.env.DATABASE_URL! })`;
268
+ }
269
+ }
270
+ function buildStorageConfig(storage) {
271
+ switch (storage) {
272
+ case "local":
273
+ return `localAdapter({ directory: './public/uploads', serveFrom: '/uploads' })`;
274
+ case "s3":
275
+ return `s3Adapter({ bucket: process.env.S3_BUCKET!, region: process.env.S3_REGION!, accessKeyId: process.env.S3_ACCESS_KEY_ID!, secretAccessKey: process.env.S3_SECRET_ACCESS_KEY! })`;
276
+ case "b2":
277
+ return `b2Adapter({ bucketId: process.env.B2_BUCKET_ID!, keyId: process.env.B2_KEY_ID!, applicationKey: process.env.B2_APPLICATION_KEY! })`;
278
+ case "cloudinary":
279
+ return `cloudinaryAdapter({ cloudName: process.env.CLOUDINARY_CLOUD_NAME!, apiKey: process.env.CLOUDINARY_API_KEY!, apiSecret: process.env.CLOUDINARY_API_SECRET! })`;
280
+ default:
281
+ return `localAdapter({ directory: './public/uploads', serveFrom: '/uploads' })`;
282
+ }
283
+ }
284
+ async function writeNextFiles(cwd, adminPath) {
285
+ const apiRoutePath = path.join(cwd, "app/dyrected/[...route]/route.ts");
286
+ if (!(await fs.pathExists(apiRoutePath))) {
287
+ await fs.outputFile(apiRoutePath, `export { GET, POST, PUT, PATCH, DELETE } from '@dyrected/next'\n`);
288
+ console.log(chalk.green("✔ app/dyrected/[...route]/route.ts written"));
289
+ }
290
+ const adminPagePath = path.join(cwd, `app/${adminPath}/[[...route]]/page.tsx`);
291
+ if (!(await fs.pathExists(adminPagePath))) {
292
+ await fs.outputFile(adminPagePath, `import { DyrectedAdmin } from '@dyrected/next/admin'
293
+
294
+ export default function AdminPage() {
295
+ return <DyrectedAdmin apiPath="/dyrected" />
296
+ }
297
+ `);
298
+ console.log(chalk.green(`✔ app/${adminPath}/[[...route]]/page.tsx written`));
299
+ }
300
+ }
301
+ async function writeNuxtFiles(cwd, adminPath) {
302
+ console.log(chalk.yellow("\n⚠ Add the module to your nuxt.config.ts manually:"));
303
+ console.log(chalk.dim(`
304
+ modules: ['@dyrected/nuxt'],
305
+ runtimeConfig: {
306
+ public: { dyrectedApiKey: process.env.NUXT_PUBLIC_DYRECTED_API_KEY }
307
+ }
308
+ `));
309
+ const adminPagePath = path.join(cwd, `pages/${adminPath}/[[...route]].vue`);
310
+ if (!(await fs.pathExists(adminPagePath))) {
311
+ await fs.outputFile(adminPagePath, `<template>
312
+ <DyrectedAdmin api-path="/dyrected" />
313
+ </template>
314
+
315
+ <script setup lang="ts">
316
+ import { DyrectedAdmin } from '@dyrected/nuxt/admin'
317
+ </script>
318
+ `);
319
+ console.log(chalk.green(`✔ pages/${adminPath}/[[...route]].vue written`));
320
+ }
321
+ }
322
+ function buildEnvTemplate(db, storage, framework) {
323
+ const lines = [
324
+ `# Dyrected CMS — Environment Variables`,
325
+ `DATABASE_URL=${db === "mongodb" ? "mongodb://localhost:27017/dyrected" : "postgres://user:pass@localhost:5432/dyrected"}`,
326
+ `JWT_SECRET=change-me-32-characters-minimum`,
327
+ `ENCRYPTION_KEY=change-me-aes-256-key`,
328
+ ``,
329
+ ];
330
+ if (storage === "s3") {
331
+ lines.push(`S3_BUCKET=my-bucket`, `S3_REGION=us-east-1`, `S3_ACCESS_KEY_ID=`, `S3_SECRET_ACCESS_KEY=`);
332
+ }
333
+ else if (storage === "b2") {
334
+ lines.push(`B2_BUCKET_ID=`, `B2_KEY_ID=`, `B2_APPLICATION_KEY=`);
335
+ }
336
+ else if (storage === "cloudinary") {
337
+ lines.push(`CLOUDINARY_CLOUD_NAME=`, `CLOUDINARY_API_KEY=`, `CLOUDINARY_API_SECRET=`);
338
+ }
339
+ lines.push(``, framework === "next" ? `NEXT_PUBLIC_DYRECTED_API_KEY=local-dev` : `NUXT_PUBLIC_DYRECTED_API_KEY=local-dev`);
340
+ return lines.join("\n") + "\n";
341
+ }
342
+ // ─── generate:types ─────────────────────────────────────────────────────────
12
343
  program
13
- .command('generate:types')
14
- .description('Generate TypeScript interfaces from your Dyrected schema')
15
- .option('-u, --url <url>', 'Base URL of your Dyrected API', 'http://localhost:3000')
16
- .option('-o, --output <path>', 'Output file path', './dyrected-types.ts')
344
+ .command("generate:types")
345
+ .description("Generate TypeScript interfaces from your Dyrected schema")
346
+ .option("-u, --url <url>", "Base URL of your Dyrected API (Cloud or self-hosted)")
347
+ .option("-c, --config <path>", "Path to your dyrected.config.ts (Self-hosted)", "./dyrected.config.ts")
348
+ .option("-o, --output <path>", "Output file path", "./dyrected-types.ts")
17
349
  .action(async (options) => {
18
350
  try {
19
- console.log(chalk.blue(`Fetching schemas from ${options.url}/api/schemas...`));
20
- const response = await fetch(`${options.url}/api/schemas`);
21
- if (!response.ok) {
22
- throw new Error(`Failed to fetch schemas: ${response.statusText}`);
351
+ let schema;
352
+ if (options.url) {
353
+ console.log(chalk.blue(`Fetching schemas from ${options.url}/api/schemas...`));
354
+ const response = await fetch(`${options.url}/api/schemas`);
355
+ if (!response.ok) {
356
+ throw new Error(`Failed to fetch schemas: ${response.statusText}`);
357
+ }
358
+ schema = await response.json();
359
+ }
360
+ else {
361
+ const configPath = path.resolve(process.cwd(), options.config);
362
+ if (await fs.pathExists(configPath)) {
363
+ console.log(chalk.blue(`Generating types from local config: ${configPath}...`));
364
+ const jiti = createJiti(configPath);
365
+ const configModule = (await jiti.import(configPath));
366
+ schema = configModule.default || configModule;
367
+ }
368
+ else {
369
+ // Fallback to default localhost if no config found
370
+ const url = "http://localhost:3000";
371
+ console.log(chalk.blue(`No local config found. Fetching schemas from ${url}/api/schemas...`));
372
+ const response = await fetch(`${url}/api/schemas`);
373
+ if (!response.ok) {
374
+ throw new Error(`Failed to fetch schemas: ${response.statusText}`);
375
+ }
376
+ schema = await response.json();
377
+ }
378
+ }
379
+ if (!schema || !schema.collections) {
380
+ throw new Error("Invalid schema: collections missing.");
23
381
  }
24
- const schema = await response.json();
25
382
  const code = generateTypes(schema);
26
- const formattedCode = await prettier.format(code, { parser: 'typescript' });
383
+ const formattedCode = await prettier.format(code, { parser: "typescript" });
27
384
  await fs.outputFile(path.resolve(process.cwd(), options.output), formattedCode);
28
385
  console.log(chalk.green(`\nSuccess! Types generated at ${options.output}`));
29
386
  }
@@ -50,28 +407,53 @@ export interface Media {
50
407
  updatedAt: string;
51
408
  }
52
409
  \n`;
53
- // Collections
54
410
  for (const col of schema.collections) {
411
+ if (!col || !col.slug)
412
+ continue;
55
413
  const interfaceName = toPascalCase(col.slug);
414
+ // Skip if it's the base Media interface and we already have it
415
+ if (interfaceName === "Media") {
416
+ // We could merge fields here if we want, but usually base Media is enough
417
+ // For now, let's just add the custom fields to a separate interface or merge
418
+ code = code.replace("export interface Media {", `export interface MediaBase {`);
419
+ code = code.replace("export interface MediaBase {", `export interface Media {`);
420
+ }
421
+ const existingInterface = code.includes(`export interface ${interfaceName} {`);
422
+ if (existingInterface && interfaceName !== "Media")
423
+ continue;
424
+ if (interfaceName === "Media") {
425
+ // If it's Media, we just want to add the extra fields to the existing interface
426
+ const extraFields = col.fields.filter((f) => !["filename", "filesize", "mimeType", "url", "width", "height", "createdAt", "updatedAt"].includes(f.name));
427
+ if (extraFields.length > 0) {
428
+ const insertionPoint = code.indexOf("}", code.indexOf("export interface Media {"));
429
+ const fieldsCode = extraFields
430
+ .map((f) => ` ${f.name}${f.required ? "" : "?"}: ${mapFieldType(f)};`)
431
+ .join("\n");
432
+ code = code.slice(0, insertionPoint) + fieldsCode + "\n" + code.slice(insertionPoint);
433
+ }
434
+ continue;
435
+ }
56
436
  code += `export interface ${interfaceName} {\n`;
57
437
  code += ` id: string;\n`;
58
438
  for (const field of col.fields) {
59
- code += ` ${field.name}${field.required ? '' : '?'}: ${mapFieldType(field)};\n`;
439
+ if (field.name === "createdAt" || field.name === "updatedAt" || field.name === "id")
440
+ continue;
441
+ code += ` ${field.name}${field.required ? "" : "?"}: ${mapFieldType(field)};\n`;
60
442
  }
61
443
  code += ` createdAt: string;\n`;
62
444
  code += ` updatedAt: string;\n`;
63
445
  code += `}\n\n`;
64
446
  }
65
- // Globals
66
447
  for (const glb of schema.globals) {
448
+ if (!glb || !glb.slug)
449
+ continue;
67
450
  const interfaceName = `${toPascalCase(glb.slug)}Global`;
68
451
  code += `export interface ${interfaceName} {\n`;
69
452
  for (const field of glb.fields) {
70
- code += ` ${field.name}${field.required ? '' : '?'}: ${mapFieldType(field)};\n`;
453
+ code += ` ${field.name}${field.required ? "" : "?"}: ${mapFieldType(field)};\n`;
71
454
  }
72
455
  code += `}\n\n`;
73
456
  }
74
- // Registry
75
457
  code += `export interface DyrectedSchema {\n`;
76
458
  code += ` collections: {\n`;
77
459
  for (const col of schema.collections) {
@@ -88,31 +470,106 @@ export interface Media {
88
470
  }
89
471
  function mapFieldType(field) {
90
472
  switch (field.type) {
91
- case 'text':
92
- case 'textarea':
93
- case 'richText':
94
- case 'date':
95
- case 'email':
96
- case 'url':
97
- return 'string';
98
- case 'number':
99
- return 'number';
100
- case 'boolean':
101
- return 'boolean';
102
- case 'select':
103
- return field.options ? field.options.map((o) => `'${typeof o === 'string' ? o : o.value}'`).join(' | ') : 'string';
104
- case 'relationship':
105
- return field.collection === 'media' ? 'Media | string' : `${toPascalCase(field.collection)} | string`;
106
- case 'array':
107
- return 'any[]'; // Deep nesting handled later
108
- case 'object':
109
- return 'any';
473
+ case "text":
474
+ case "textarea":
475
+ case "richText":
476
+ case "date":
477
+ case "email":
478
+ case "url":
479
+ return "string";
480
+ case "number":
481
+ return "number";
482
+ case "boolean":
483
+ return "boolean";
484
+ case "select":
485
+ return field.options
486
+ ? field.options.map((o) => `'${typeof o === "string" ? o : o.value}'`).join(" | ")
487
+ : "string";
488
+ case "relationship": {
489
+ const relationTo = field.relationTo || field.collection;
490
+ return relationTo === "media" ? "Media | string" : `${toPascalCase(relationTo)} | string`;
491
+ }
492
+ case "array":
493
+ if (field.fields) {
494
+ return `Array<{\n${field.fields.map((f) => ` ${f.name}${f.required ? "" : "?"}: ${mapFieldType(f)};`).join("\n")}\n }>`;
495
+ }
496
+ return "any[]";
497
+ case "blocks":
498
+ if (field.blocks) {
499
+ return `Array<${field.blocks.map((b) => `{\n blockType: '${b.slug}';\n${b.fields.map((f) => ` ${f.name}${f.required ? "" : "?"}: ${mapFieldType(f)};`).join("\n")}\n }`).join(" | ")}>`;
500
+ }
501
+ return "any[]";
502
+ case "object":
503
+ if (field.fields) {
504
+ return `{\n${field.fields.map((f) => ` ${f.name}${f.required ? "" : "?"}: ${mapFieldType(f)};`).join("\n")}\n }`;
505
+ }
506
+ return "any";
110
507
  default:
111
- return 'any';
508
+ return "any";
112
509
  }
113
510
  }
114
511
  function toPascalCase(str) {
115
- return str.replace(/(^\w|-\w)/g, (m) => m.replace(/-/, '').toUpperCase());
512
+ if (!str)
513
+ return "Unknown";
514
+ return str.replace(/(^\w|-\w)/g, (m) => m.replace(/-/, "").toUpperCase());
116
515
  }
516
+ // ─── sync:schema ─────────────────────────────────────────────────────────────
517
+ program
518
+ .command("sync:schema")
519
+ .description("Sync your local Dyrected schema with the Cloud dashboard")
520
+ .option("-k, --api-key <key>", "Your Dyrected API Key")
521
+ .option("-s, --site-id <id>", "Your Dyrected Site ID")
522
+ .option("-u, --url <url>", "Cloud API URL", "https://prodeegi-vault.onrender.com")
523
+ .option("-c, --config <path>", "Path to your dyrected.config.ts", "./dyrected.config.ts")
524
+ .option("--skip-on-error", "Do not exit with error if sync fails (useful for local builds)")
525
+ .action(async (options) => {
526
+ try {
527
+ const apiKey = options.apiKey || process.env.DYRECTED_API_KEY;
528
+ const siteId = options.siteId || process.env.DYRECTED_SITE_ID;
529
+ const apiUrl = options.url || process.env.DYRECTED_URL || "https://prodeegi-vault.onrender.com";
530
+ const configPath = path.resolve(process.cwd(), options.config);
531
+ const jiti = createJiti(configPath);
532
+ if (!apiKey || !siteId) {
533
+ console.warn(chalk.yellow("\n⚠ Skipping schema sync: API Key or Site ID missing. (Required for Cloud sync, but optional for self-hosted builds)\n"));
534
+ return;
535
+ }
536
+ if (!(await fs.pathExists(configPath))) {
537
+ throw new Error(`Config file not found at ${configPath}`);
538
+ }
539
+ console.log(chalk.blue(`Loading config from ${configPath}...`));
540
+ const configModule = (await jiti.import(configPath));
541
+ const config = configModule.default || configModule;
542
+ if (!config.collections) {
543
+ throw new Error("Invalid config: No collections found.");
544
+ }
545
+ console.log(chalk.blue(`Syncing schema to ${apiUrl}...`));
546
+ const response = await fetch(`${apiUrl}/cloud/workspaces/sites/${siteId}/schema/sync`, {
547
+ method: "POST",
548
+ headers: {
549
+ "Content-Type": "application/json",
550
+ Authorization: `Bearer ${apiKey}`,
551
+ "X-API-Key": apiKey,
552
+ },
553
+ body: JSON.stringify({
554
+ collections: config.collections,
555
+ globals: config.globals || [],
556
+ admin: config.admin || {},
557
+ }),
558
+ });
559
+ if (!response.ok) {
560
+ const error = await response.json().catch(() => ({ message: response.statusText }));
561
+ throw new Error(`Sync failed: ${error.message || response.statusText}`);
562
+ }
563
+ console.log(chalk.green(`\nSuccess! Schema synced successfully for site ${siteId}`));
564
+ }
565
+ catch (error) {
566
+ if (options.skipOnError) {
567
+ console.warn(chalk.yellow(`\n⚠ Sync failed, but skipping error as requested: ${error.message}`));
568
+ return;
569
+ }
570
+ console.error(chalk.red(`\nError: ${error.message}`));
571
+ process.exit(1);
572
+ }
573
+ });
117
574
  program.parse();
118
575
  //# 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":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,uBAAuB,CAAC;KACpC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,EAAE,uBAAuB,CAAC;KACnF,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,qBAAqB,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;QAE/E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,cAAc,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAEnC,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAE5E,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC;QAEhF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,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,SAAS,aAAa,CAAC,MAAW;IAChC,IAAI,IAAI,GAAG;;;;;;;;;;;;;;;;GAgBV,CAAC;IAEF,cAAc;IACd,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,IAAI,oBAAoB,aAAa,MAAM,CAAC;QAChD,IAAI,IAAI,iBAAiB,CAAC;QAE1B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;QACnF,CAAC;QAED,IAAI,IAAI,wBAAwB,CAAC;QACjC,IAAI,IAAI,wBAAwB,CAAC;QACjC,IAAI,IAAI,OAAO,CAAC;IAClB,CAAC;IAED,UAAU;IACV,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxD,IAAI,IAAI,oBAAoB,aAAa,MAAM,CAAC;QAEhD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;QACnF,CAAC;QAED,IAAI,IAAI,OAAO,CAAC;IAClB,CAAC;IAED,WAAW;IACX,IAAI,IAAI,qCAAqC,CAAC;IAC9C,IAAI,IAAI,oBAAoB,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,QAAQ,CAAC;IACjB,IAAI,IAAI,gBAAgB,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IAChE,CAAC;IACD,IAAI,IAAI,QAAQ,CAAC;IACjB,IAAI,IAAI,KAAK,CAAC;IAEd,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,KAAU;IAC9B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU,CAAC;QAChB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC1H,KAAK,cAAc;YACjB,OAAO,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;QACxG,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,CAAC,6BAA6B;QAC/C,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}