dyrected 2.5.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE.md +50 -0
  2. package/README.md +3 -0
  3. package/dist/commands/generate-ai-rules.d.ts +3 -0
  4. package/dist/commands/generate-ai-rules.d.ts.map +1 -0
  5. package/dist/commands/generate-ai-rules.js +16 -0
  6. package/dist/commands/generate-ai-rules.js.map +1 -0
  7. package/dist/commands/generate-types.d.ts +3 -0
  8. package/dist/commands/generate-types.d.ts.map +1 -0
  9. package/dist/commands/generate-types.js +34 -0
  10. package/dist/commands/generate-types.js.map +1 -0
  11. package/dist/commands/init.d.ts +3 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +397 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/sync-schema.d.ts +3 -0
  16. package/dist/commands/sync-schema.d.ts.map +1 -0
  17. package/dist/commands/sync-schema.js +89 -0
  18. package/dist/commands/sync-schema.js.map +1 -0
  19. package/dist/commands/upgrade.d.ts +3 -0
  20. package/dist/commands/upgrade.d.ts.map +1 -0
  21. package/dist/commands/upgrade.js +58 -0
  22. package/dist/commands/upgrade.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +29 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/utils/ai-rules-template.d.ts +2 -0
  28. package/dist/utils/ai-rules-template.d.ts.map +1 -0
  29. package/dist/utils/ai-rules-template.js +411 -0
  30. package/dist/utils/ai-rules-template.js.map +1 -0
  31. package/dist/utils/config-templates.d.ts +5 -0
  32. package/dist/utils/config-templates.d.ts.map +1 -0
  33. package/dist/utils/config-templates.js +65 -0
  34. package/dist/utils/config-templates.js.map +1 -0
  35. package/dist/utils/detect.d.ts +11 -0
  36. package/dist/utils/detect.d.ts.map +1 -0
  37. package/dist/utils/detect.js +45 -0
  38. package/dist/utils/detect.js.map +1 -0
  39. package/dist/utils/env.d.ts +10 -0
  40. package/dist/utils/env.d.ts.map +1 -0
  41. package/dist/utils/env.js +52 -0
  42. package/dist/utils/env.js.map +1 -0
  43. package/dist/utils/type-generator.d.ts +8 -0
  44. package/dist/utils/type-generator.d.ts.map +1 -0
  45. package/dist/utils/type-generator.js +246 -0
  46. package/dist/utils/type-generator.js.map +1 -0
  47. package/dist/utils/writers.d.ts +6 -0
  48. package/dist/utils/writers.d.ts.map +1 -0
  49. package/dist/utils/writers.js +152 -0
  50. package/dist/utils/writers.js.map +1 -0
  51. package/package.json +43 -0
@@ -0,0 +1,65 @@
1
+ export function buildDbConfig(db) {
2
+ switch (db) {
3
+ case "postgres":
4
+ return `postgresAdapter({ url: process.env.DATABASE_URL! })`;
5
+ case "mysql":
6
+ return `mysqlAdapter({ url: process.env.DATABASE_URL! })`;
7
+ case "sqlite":
8
+ return `sqliteAdapter({ filename: './data.db' })`;
9
+ case "mongodb":
10
+ return `mongodbAdapter({ url: process.env.DATABASE_URL!, dbName: process.env.MONGODB_DB_NAME || 'dyrected' })`;
11
+ default:
12
+ return `postgresAdapter({ url: process.env.DATABASE_URL! })`;
13
+ }
14
+ }
15
+ export function buildStorageConfig(storage) {
16
+ switch (storage) {
17
+ case "local":
18
+ return `localStorage({ uploadDir: './public/uploads', staticUrlPrefix: '/uploads' })`;
19
+ case "s3":
20
+ return `s3Storage({ bucket: process.env.S3_BUCKET!, region: process.env.S3_REGION!, credentials: { accessKeyId: process.env.S3_ACCESS_KEY_ID!, secretAccessKey: process.env.S3_SECRET_ACCESS_KEY! } })`;
21
+ case "b2":
22
+ return `b2Storage({ bucketId: process.env.B2_BUCKET_ID!, bucketName: process.env.B2_BUCKET_NAME!, applicationKeyId: process.env.B2_KEY_ID!, applicationKey: process.env.B2_APPLICATION_KEY! })`;
23
+ case "cloudinary":
24
+ return `cloudinaryStorage({ cloudName: process.env.CLOUDINARY_CLOUD_NAME!, apiKey: process.env.CLOUDINARY_API_KEY!, apiSecret: process.env.CLOUDINARY_API_SECRET! })`;
25
+ default:
26
+ return `localStorage({ uploadDir: './public/uploads', staticUrlPrefix: '/uploads' })`;
27
+ }
28
+ }
29
+ export function buildEnvTemplate(db, storage, framework) {
30
+ const lines = [
31
+ `# Dyrected CMS — Environment Variables`,
32
+ `DATABASE_URL=${db === "mongodb"
33
+ ? "mongodb://localhost:27017/dyrected"
34
+ : db === "mysql"
35
+ ? "mysql://user:pass@localhost:3306/dyrected"
36
+ : "postgres://user:pass@localhost:5432/dyrected"}`,
37
+ `JWT_SECRET=change-me-32-characters-minimum`,
38
+ `ENCRYPTION_KEY=change-me-aes-256-key`,
39
+ ``,
40
+ ];
41
+ if (storage === "s3") {
42
+ lines.push(`S3_BUCKET=my-bucket`, `S3_REGION=us-east-1`, `S3_ACCESS_KEY_ID=`, `S3_SECRET_ACCESS_KEY=`);
43
+ }
44
+ else if (storage === "b2") {
45
+ lines.push(`B2_BUCKET_ID=`, `B2_BUCKET_NAME=`, `B2_KEY_ID=`, `B2_APPLICATION_KEY=`);
46
+ }
47
+ else if (storage === "cloudinary") {
48
+ lines.push(`CLOUDINARY_CLOUD_NAME=`, `CLOUDINARY_API_KEY=`, `CLOUDINARY_API_SECRET=`);
49
+ }
50
+ if (db === "mongodb")
51
+ lines.push(`MONGODB_DB_NAME=dyrected`);
52
+ const prefix = framework === "next" ? "NEXT_PUBLIC_" : "NUXT_PUBLIC_";
53
+ lines.push(``, `${prefix}DYRECTED_URL=http://localhost:3000`, `${prefix}DYRECTED_API_KEY=local-dev`);
54
+ return lines.join("\n") + "\n";
55
+ }
56
+ export function buildViteEnvTemplate() {
57
+ return ([
58
+ `# Dyrected CMS — Environment Variables`,
59
+ `# Connect to Dyrected Cloud or a self-hosted instance`,
60
+ `VITE_DYRECTED_URL=https://api.dyrected.cloud`,
61
+ `VITE_DYRECTED_API_KEY=sk_live_...`,
62
+ `VITE_DYRECTED_SITE_ID=site_...`,
63
+ ].join("\n") + "\n");
64
+ }
65
+ //# sourceMappingURL=config-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-templates.js","sourceRoot":"","sources":["../../src/utils/config-templates.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,UAAU;YACb,OAAO,qDAAqD,CAAC;QAC/D,KAAK,OAAO;YACV,OAAO,kDAAkD,CAAC;QAC5D,KAAK,QAAQ;YACX,OAAO,0CAA0C,CAAC;QACpD,KAAK,SAAS;YACZ,OAAO,uGAAuG,CAAC;QACjH;YACE,OAAO,qDAAqD,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,8EAA8E,CAAC;QACxF,KAAK,IAAI;YACP,OAAO,gMAAgM,CAAC;QAC1M,KAAK,IAAI;YACP,OAAO,wLAAwL,CAAC;QAClM,KAAK,YAAY;YACf,OAAO,8JAA8J,CAAC;QACxK;YACE,OAAO,8EAA8E,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,EAAU,EACV,OAAe,EACf,SAAiB;IAEjB,MAAM,KAAK,GAAG;QACZ,wCAAwC;QACxC,gBACE,EAAE,KAAK,SAAS;YACd,CAAC,CAAC,oCAAoC;YACtC,CAAC,CAAC,EAAE,KAAK,OAAO;gBACd,CAAC,CAAC,2CAA2C;gBAC7C,CAAC,CAAC,8CACR,EAAE;QACF,4CAA4C;QAC5C,sCAAsC;QACtC,EAAE;KACH,CAAC;IAEF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CACR,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,CACxB,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CACR,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,CACtB,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CACR,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,CACzB,CAAC;IACJ,CAAC;IAED,IAAI,EAAE,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;IACtE,KAAK,CAAC,IAAI,CACR,EAAE,EACF,GAAG,MAAM,oCAAoC,EAC7C,GAAG,MAAM,4BAA4B,CACtC,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,CACL;QACE,wCAAwC;QACxC,uDAAuD;QACvD,8CAA8C;QAC9C,mCAAmC;QACnC,gCAAgC;KACjC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare function detectPackageManager(cwd: string): string;
2
+ export type SupportedFramework = "next" | "nuxt" | "react" | "vue";
3
+ export type FrameworkDetection = {
4
+ supported: true;
5
+ framework: SupportedFramework;
6
+ } | {
7
+ supported: false;
8
+ name: string;
9
+ } | null;
10
+ export declare function detectFramework(cwd: string): Promise<FrameworkDetection>;
11
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/utils/detect.ts"],"names":[],"mappings":"AAGA,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKxD;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAC1B;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,kBAAkB,CAAA;CAAE,GAClD;IAAE,SAAS,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC,IAAI,CAAC;AAWT,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoB9E"}
@@ -0,0 +1,45 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ export function detectPackageManager(cwd) {
4
+ if (fs.existsSync(path.join(cwd, "bun.lockb")) || fs.existsSync(path.join(cwd, "bun.lock")))
5
+ return "bun";
6
+ if (fs.existsSync(path.join(cwd, "pnpm-lock.yaml")))
7
+ return "pnpm";
8
+ if (fs.existsSync(path.join(cwd, "yarn.lock")))
9
+ return "yarn";
10
+ return "npm";
11
+ }
12
+ const UNSUPPORTED = {
13
+ "@angular/core": "Angular",
14
+ astro: "Astro",
15
+ "@sveltejs/kit": "SvelteKit",
16
+ svelte: "Svelte",
17
+ gatsby: "Gatsby",
18
+ "@remix-run/react": "Remix",
19
+ };
20
+ export async function detectFramework(cwd) {
21
+ const pkgPath = path.join(cwd, "package.json");
22
+ if (!(await fs.pathExists(pkgPath)))
23
+ return null;
24
+ try {
25
+ const pkg = await fs.readJson(pkgPath);
26
+ const all = { ...pkg.dependencies, ...pkg.devDependencies };
27
+ // Supported — check full-stack frameworks before their underlying libraries
28
+ if (all["next"])
29
+ return { supported: true, framework: "next" };
30
+ if (all["nuxt"])
31
+ return { supported: true, framework: "nuxt" };
32
+ // Unsupported — check before react/vue since some (Remix, Gatsby) also list react
33
+ for (const [dep, name] of Object.entries(UNSUPPORTED)) {
34
+ if (all[dep])
35
+ return { supported: false, name };
36
+ }
37
+ if (all["vue"])
38
+ return { supported: true, framework: "vue" };
39
+ if (all["react"])
40
+ return { supported: true, framework: "react" };
41
+ }
42
+ catch { }
43
+ return null;
44
+ }
45
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/utils/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1G,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACnE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AASD,MAAM,WAAW,GAA2B;IAC1C,eAAe,EAAE,SAAS;IAC1B,KAAK,EAAE,OAAO;IACd,eAAe,EAAE,WAAW;IAC5B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,kBAAkB,EAAE,OAAO;CAC5B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAE5D,4EAA4E;QAC5E,IAAI,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC/D,IAAI,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAE/D,kFAAkF;QAClF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACtD,IAAI,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAClD,CAAC;QAED,IAAI,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7D,IAAI,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ type LoadEnvOptions = {
2
+ cwd: string;
3
+ envPath?: string;
4
+ };
5
+ type LoadEnvResult = {
6
+ loadedFiles: string[];
7
+ };
8
+ export declare function loadCommandEnv(options: LoadEnvOptions): Promise<LoadEnvResult>;
9
+ export {};
10
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAGA,KAAK,cAAc,GAAG;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AA4CF,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAcpF"}
@@ -0,0 +1,52 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ function parseEnvLine(line) {
4
+ const trimmed = line.trim();
5
+ if (!trimmed || trimmed.startsWith("#"))
6
+ return null;
7
+ const normalized = trimmed.startsWith("export ") ? trimmed.slice("export ".length).trim() : trimmed;
8
+ const equalsIndex = normalized.indexOf("=");
9
+ if (equalsIndex <= 0)
10
+ return null;
11
+ const key = normalized.slice(0, equalsIndex).trim();
12
+ let value = normalized.slice(equalsIndex + 1).trim();
13
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
14
+ return null;
15
+ if ((value.startsWith('"') && value.endsWith('"')) ||
16
+ (value.startsWith("'") && value.endsWith("'"))) {
17
+ value = value.slice(1, -1);
18
+ }
19
+ else {
20
+ const commentIndex = value.indexOf(" #");
21
+ if (commentIndex >= 0)
22
+ value = value.slice(0, commentIndex).trim();
23
+ }
24
+ return [key, value];
25
+ }
26
+ async function loadEnvFile(filePath, originalKeys) {
27
+ const contents = await fs.readFile(filePath, "utf8");
28
+ for (const line of contents.split(/\r?\n/)) {
29
+ const parsed = parseEnvLine(line);
30
+ if (!parsed)
31
+ continue;
32
+ const [key, value] = parsed;
33
+ if (originalKeys.has(key))
34
+ continue;
35
+ process.env[key] = value;
36
+ }
37
+ }
38
+ export async function loadCommandEnv(options) {
39
+ const originalKeys = new Set(Object.keys(process.env));
40
+ const loadedFiles = [];
41
+ const candidates = options.envPath
42
+ ? [path.resolve(options.cwd, options.envPath)]
43
+ : [path.resolve(options.cwd, ".env"), path.resolve(options.cwd, ".env.local")];
44
+ for (const candidate of candidates) {
45
+ if (!(await fs.pathExists(candidate)))
46
+ continue;
47
+ await loadEnvFile(candidate, originalKeys);
48
+ loadedFiles.push(candidate);
49
+ }
50
+ return { loadedFiles };
51
+ }
52
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function runGenerateTypes(options: {
2
+ url?: string;
3
+ config: string;
4
+ output: string;
5
+ }): Promise<void>;
6
+ export declare function generateTypes(schema: any): string;
7
+ export declare function mapFieldType(field: any): string;
8
+ //# sourceMappingURL=type-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-generator.d.ts","sourceRoot":"","sources":["../../src/utils/type-generator.ts"],"names":[],"mappings":"AAMA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,iBA6CA;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAwHjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAyF/C"}
@@ -0,0 +1,246 @@
1
+ import prettier from "prettier";
2
+ import chalk from "chalk";
3
+ import fs from "fs-extra";
4
+ import path from "path";
5
+ import { createJiti } from "jiti";
6
+ export async function runGenerateTypes(options) {
7
+ let schema;
8
+ if (options.url) {
9
+ console.log(chalk.blue(`Fetching schemas from ${options.url}/api/schemas...`));
10
+ const response = await fetch(`${options.url}/api/schemas`);
11
+ if (!response.ok)
12
+ throw new Error(`Failed to fetch schemas: ${response.statusText}`);
13
+ schema = await response.json();
14
+ }
15
+ else {
16
+ const configPath = path.resolve(process.cwd(), options.config);
17
+ if (await fs.pathExists(configPath)) {
18
+ console.log(chalk.blue(`Generating types from local config: ${configPath}...`));
19
+ const jiti = createJiti(configPath);
20
+ const configModule = (await jiti.import(configPath));
21
+ schema = configModule.default || configModule;
22
+ }
23
+ else {
24
+ const url = "http://localhost:3000";
25
+ console.log(chalk.blue(`No local config found. Fetching schemas from ${url}/api/schemas...`));
26
+ const response = await fetch(`${url}/api/schemas`);
27
+ if (!response.ok)
28
+ throw new Error(`Failed to fetch schemas: ${response.statusText}`);
29
+ schema = await response.json();
30
+ }
31
+ }
32
+ if (!schema || !schema.collections)
33
+ throw new Error("Invalid schema: collections missing.");
34
+ const code = generateTypes(schema);
35
+ const formattedCode = await prettier.format(code, { parser: "typescript" });
36
+ await fs.outputFile(path.resolve(process.cwd(), options.output), formattedCode);
37
+ console.log(chalk.green(`✔ Types generated at ${options.output}`));
38
+ }
39
+ export function generateTypes(schema) {
40
+ let code = `/**
41
+ * This file was automatically generated by Dyrected CLI.
42
+ * DO NOT MODIFY IT BY HAND.
43
+ */
44
+
45
+ export interface Media {
46
+ id: string;
47
+ filename: string;
48
+ filesize: number;
49
+ mimeType: string;
50
+ url: string;
51
+ width?: number;
52
+ height?: number;
53
+ focalPoint?: { x: number; y: number };
54
+ blurhash?: string;
55
+ sizes?: Record<string, { filename?: string; url?: string; width?: number; height?: number }>;
56
+ createdAt: string;
57
+ updatedAt: string;
58
+ }
59
+
60
+ // URL field types
61
+ export type UrlFieldValue = {
62
+ type: 'custom';
63
+ url: string;
64
+ label?: string;
65
+ } | {
66
+ type: 'internal';
67
+ url: string;
68
+ relationTo: string;
69
+ value: string;
70
+ label?: string;
71
+ };
72
+
73
+ // Backward compatibility for simple string URLs
74
+ export type UrlField = UrlFieldValue | string;
75
+ \n`;
76
+ for (const col of schema.collections) {
77
+ if (!col || !col.slug)
78
+ continue;
79
+ const interfaceName = toPascalCase(col.slug);
80
+ if (interfaceName === "Media") {
81
+ const extraFields = col.fields.filter((f) => ![
82
+ "filename",
83
+ "filesize",
84
+ "mimeType",
85
+ "url",
86
+ "width",
87
+ "height",
88
+ "createdAt",
89
+ "updatedAt",
90
+ ].includes(f.name));
91
+ if (extraFields.length > 0) {
92
+ const insertionPoint = code.indexOf("}", code.indexOf("export interface Media {"));
93
+ const fieldsCode = extraFields
94
+ .map((f) => ` ${f.name}${f.required ? "" : "?"}: ${mapFieldType(f)};`)
95
+ .join("\n");
96
+ code =
97
+ code.slice(0, insertionPoint) +
98
+ fieldsCode +
99
+ "\n" +
100
+ code.slice(insertionPoint);
101
+ }
102
+ continue;
103
+ }
104
+ if (code.includes(`export interface ${interfaceName} {`))
105
+ continue;
106
+ code += `export interface ${interfaceName} {\n`;
107
+ code += ` id: string;\n`;
108
+ for (const field of col.fields) {
109
+ if (!field.name || field.type === "join")
110
+ continue;
111
+ if (["createdAt", "updatedAt", "id"].includes(field.name))
112
+ continue;
113
+ code += ` ${propertyName(field.name)}${field.required ? "" : "?"}: ${mapFieldType(field)};\n`;
114
+ }
115
+ if (col.auth) {
116
+ code += ` email: string;\n`;
117
+ code += ` roles?: string[];\n`;
118
+ }
119
+ if (col.upload)
120
+ code += uploadFields();
121
+ code += ` createdAt: string;\n`;
122
+ code += ` updatedAt: string;\n`;
123
+ code += `}\n\n`;
124
+ }
125
+ for (const glb of schema.globals) {
126
+ if (!glb || !glb.slug)
127
+ continue;
128
+ const interfaceName = `${toPascalCase(glb.slug)}Global`;
129
+ code += `export interface ${interfaceName} {\n`;
130
+ for (const field of glb.fields) {
131
+ if (!field.name || field.type === "join")
132
+ continue;
133
+ code += ` ${propertyName(field.name)}${field.required ? "" : "?"}: ${mapFieldType(field)};\n`;
134
+ }
135
+ code += `}\n\n`;
136
+ }
137
+ code += `export interface DyrectedSchema {\n`;
138
+ code += ` collections: {\n`;
139
+ for (const col of schema.collections) {
140
+ code += ` ${propertyName(col.slug)}: ${toPascalCase(col.slug)};\n`;
141
+ }
142
+ code += ` };\n`;
143
+ code += ` globals: {\n`;
144
+ for (const glb of schema.globals) {
145
+ code += ` ${propertyName(glb.slug)}: ${toPascalCase(glb.slug)}Global;\n`;
146
+ }
147
+ code += ` };\n`;
148
+ code += `}\n`;
149
+ return code;
150
+ }
151
+ export function mapFieldType(field) {
152
+ switch (field.type) {
153
+ case "text":
154
+ case "textarea":
155
+ case "date":
156
+ case "datetime":
157
+ case "time":
158
+ case "email":
159
+ case "icon":
160
+ return "string";
161
+ case "richText":
162
+ case "json":
163
+ return "Record<string, unknown>";
164
+ case "url":
165
+ return "UrlField";
166
+ case "number":
167
+ return "number";
168
+ case "boolean":
169
+ return "boolean";
170
+ case "select":
171
+ case "radio":
172
+ return Array.isArray(field.options) && field.options.length > 0
173
+ ? field.options
174
+ .map((o) => JSON.stringify(typeof o === "string" ? o : o.value))
175
+ .join(" | ")
176
+ : "string";
177
+ case "multiSelect":
178
+ return "string[]";
179
+ case "image":
180
+ case "relationship": {
181
+ const relationTo = field.relationTo || field.collection;
182
+ const related = relationTo === "media"
183
+ ? "Media | string"
184
+ : `${toPascalCase(relationTo)} | string`;
185
+ return field.hasMany ? `Array<${related}>` : related;
186
+ }
187
+ case "array":
188
+ return field.fields
189
+ ? `Array<{\n${field.fields
190
+ .filter((f) => f.name)
191
+ .map((f) => ` ${propertyName(f.name)}${f.required ? "" : "?"}: ${mapFieldType(f)};`)
192
+ .join("\n")}\n }>`
193
+ : "unknown[]";
194
+ case "blocks":
195
+ return field.blocks
196
+ ? `Array<${field.blocks
197
+ .map((b) => `{\n blockType: ${JSON.stringify(b.slug)};\n${b.fields
198
+ .filter((f) => f.name)
199
+ .map((f) => ` ${propertyName(f.name)}${f.required ? "" : "?"}: ${mapFieldType(f)};`)
200
+ .join("\n")}\n }`)
201
+ .join(" | ")}>`
202
+ : "unknown[]";
203
+ case "object":
204
+ return field.fields
205
+ ? `{\n${field.fields
206
+ .filter((f) => f.name)
207
+ .map((f) => ` ${propertyName(f.name)}${f.required ? "" : "?"}: ${mapFieldType(f)};`)
208
+ .join("\n")}\n }`
209
+ : "Record<string, unknown>";
210
+ case "join":
211
+ return "unknown[]";
212
+ case "row":
213
+ return field.fields
214
+ ? `{\n${field.fields
215
+ .filter((f) => f.name)
216
+ .map((f) => ` ${propertyName(f.name)}${f.required ? "" : "?"}: ${mapFieldType(f)};`)
217
+ .join("\n")}\n }`
218
+ : "Record<string, unknown>";
219
+ default:
220
+ return "unknown";
221
+ }
222
+ }
223
+ function propertyName(value) {
224
+ return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value)
225
+ ? value
226
+ : JSON.stringify(value);
227
+ }
228
+ function uploadFields() {
229
+ return [
230
+ " filename: string;",
231
+ " filesize?: number;",
232
+ " mimeType: string;",
233
+ " url: string;",
234
+ " width?: number;",
235
+ " height?: number;",
236
+ " blurhash?: string;",
237
+ " sizes?: Record<string, { filename?: string; url?: string; width?: number; height?: number }>;",
238
+ "",
239
+ ].join("\n");
240
+ }
241
+ function toPascalCase(str) {
242
+ if (!str)
243
+ return "Unknown";
244
+ return str.replace(/(^\w|-\w)/g, (m) => m.replace(/-/, "").toUpperCase());
245
+ }
246
+ //# sourceMappingURL=type-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-generator.js","sourceRoot":"","sources":["../../src/utils/type-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function writeReactFiles(cwd: string, adminPath: string): Promise<void>;
2
+ export declare function writeVueFiles(cwd: string, adminPath: string): Promise<void>;
3
+ export declare function writeNextFiles(cwd: string, adminPath: string): Promise<void>;
4
+ export declare function writeNuxtFiles(cwd: string, adminPath: string): Promise<void>;
5
+ export declare function patchNuxtConfig(cwd: string, adminPath?: string): Promise<void>;
6
+ //# sourceMappingURL=writers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writers.d.ts","sourceRoot":"","sources":["../../src/utils/writers.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAyBnE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAiCjE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBA8DlE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAyBlE;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,iBAiCpE"}
@@ -0,0 +1,152 @@
1
+ import chalk from "chalk";
2
+ import fs from "fs-extra";
3
+ import path from "path";
4
+ export async function writeReactFiles(cwd, adminPath) {
5
+ const hasSrc = await fs.pathExists(path.join(cwd, "src"));
6
+ const base = hasSrc ? "src" : ".";
7
+ const rel = hasSrc ? `src/${adminPath}` : adminPath;
8
+ const adminPagePath = path.join(cwd, base, `${adminPath}.tsx`);
9
+ if (!(await fs.pathExists(adminPagePath))) {
10
+ await fs.outputFile(adminPagePath, `import { DyrectedAdmin } from '@dyrected/admin'
11
+
12
+ export default function AdminPage() {
13
+ return (
14
+ <DyrectedAdmin
15
+ apiPath={import.meta.env.VITE_DYRECTED_URL}
16
+ apiKey={import.meta.env.VITE_DYRECTED_API_KEY}
17
+ />
18
+ )
19
+ }
20
+ `);
21
+ console.log(chalk.green(`✔ ${rel}.tsx written`));
22
+ }
23
+ console.log(chalk.yellow(`\n Add a route for /${adminPath} pointing to AdminPage in your router config.\n`));
24
+ }
25
+ export async function writeVueFiles(cwd, adminPath) {
26
+ const hasSrc = await fs.pathExists(path.join(cwd, "src"));
27
+ const viewsDir = hasSrc ? path.join(cwd, "src/views") : path.join(cwd, "views");
28
+ const rel = hasSrc ? `src/views/AdminView.vue` : `views/AdminView.vue`;
29
+ const adminPagePath = path.join(viewsDir, "AdminView.vue");
30
+ if (!(await fs.pathExists(adminPagePath))) {
31
+ await fs.outputFile(adminPagePath, `<template>
32
+ <DyrectedAdmin
33
+ :config="{
34
+ baseUrl: dyrectedUrl,
35
+ apiKey: dyrectedApiKey,
36
+ siteId: dyrectedSiteId,
37
+ }"
38
+ basename="/${adminPath}"
39
+ />
40
+ </template>
41
+
42
+ <script setup lang="ts">
43
+ import { DyrectedAdmin } from '@dyrected/vue'
44
+
45
+ const dyrectedUrl = import.meta.env.VITE_DYRECTED_URL
46
+ const dyrectedApiKey = import.meta.env.VITE_DYRECTED_API_KEY
47
+ const dyrectedSiteId = import.meta.env.VITE_DYRECTED_SITE_ID
48
+ </script>
49
+ `);
50
+ console.log(chalk.green(`✔ ${rel} written`));
51
+ }
52
+ console.log(chalk.yellow(`\n Add a route for /${adminPath} pointing to AdminView in your router config.\n`));
53
+ }
54
+ export async function writeNextFiles(cwd, adminPath) {
55
+ const hasSrc = await fs.pathExists(path.join(cwd, "src"));
56
+ const appDir = hasSrc ? path.join(cwd, "src/app") : path.join(cwd, "app");
57
+ const pagesDir = hasSrc ? path.join(cwd, "src/pages") : path.join(cwd, "pages");
58
+ const hasAppRouter = await fs.pathExists(appDir);
59
+ const hasPagesRouter = await fs.pathExists(pagesDir);
60
+ if (hasPagesRouter && !hasAppRouter) {
61
+ throw new Error("@dyrected/next requires the Next.js App Router. Add an app/ directory before running init.");
62
+ }
63
+ else {
64
+ const rel = hasSrc ? "src/app" : "app";
65
+ const apiRoutePath = path.join(appDir, "dyrected/[...route]/route.ts");
66
+ if (!(await fs.pathExists(apiRoutePath))) {
67
+ const configImport = hasSrc
68
+ ? "../../../../dyrected.config"
69
+ : "../../../dyrected.config";
70
+ await fs.outputFile(apiRoutePath, `import { dyrectedNextHandler } from '@dyrected/next'
71
+ import config from '${configImport}'
72
+
73
+ export const { GET, POST, PUT, PATCH, DELETE, OPTIONS } = dyrectedNextHandler(config)
74
+ `);
75
+ console.log(chalk.green(`✔ ${rel}/dyrected/[...route]/route.ts written`));
76
+ }
77
+ const adminPagePath = path.join(appDir, `${adminPath}/page.tsx`);
78
+ if (!(await fs.pathExists(adminPagePath))) {
79
+ await fs.outputFile(adminPagePath, `import { DyrectedAdmin } from '@dyrected/next/admin'
80
+
81
+ export default function AdminPage() {
82
+ return <DyrectedAdmin />
83
+ }
84
+ `);
85
+ console.log(chalk.green(`✔ ${rel}/${adminPath}/page.tsx written`));
86
+ }
87
+ }
88
+ // instrumentation.ts — logs Dyrected URLs to the console on server start
89
+ const instrumentationDir = hasSrc ? path.join(cwd, "src") : cwd;
90
+ const instrumentationPath = path.join(instrumentationDir, "instrumentation.ts");
91
+ if (!(await fs.pathExists(instrumentationPath))) {
92
+ const apiPath = hasPagesRouter && !hasAppRouter ? "/api/dyrected" : "/dyrected";
93
+ await fs.outputFile(instrumentationPath, `export async function register() {
94
+ if (process.env.NEXT_RUNTIME === 'nodejs') {
95
+ const base = (process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000').replace(/\\/$/, '')
96
+ console.log(\`\\n ➜ Dyrected admin: \${base}/${adminPath}\`)
97
+ console.log(\` ➜ Dyrected API: \${base}${apiPath}\\n\`)
98
+ }
99
+ }
100
+ `);
101
+ const relInstrumentation = hasSrc ? "src/instrumentation.ts" : "instrumentation.ts";
102
+ console.log(chalk.green(`✔ ${relInstrumentation} written`));
103
+ }
104
+ }
105
+ export async function writeNuxtFiles(cwd, adminPath) {
106
+ const hasAppDir = await fs.pathExists(path.join(cwd, "app"));
107
+ const pagesBase = hasAppDir ? "app/pages" : "pages";
108
+ const adminPagePath = path.join(cwd, pagesBase, adminPath, "index.vue");
109
+ if (!(await fs.pathExists(adminPagePath))) {
110
+ await fs.outputFile(adminPagePath, `<template>
111
+ <ClientOnly>
112
+ <DyrectedAdmin basename="/${adminPath}" />
113
+ </ClientOnly>
114
+ </template>
115
+
116
+ <script setup lang="ts">
117
+ definePageMeta({
118
+ layout: false,
119
+ });
120
+ </script>
121
+ `);
122
+ console.log(chalk.green(`✔ ${pagesBase}/${adminPath}/index.vue written`));
123
+ }
124
+ await patchNuxtConfig(cwd, adminPath);
125
+ }
126
+ export async function patchNuxtConfig(cwd, adminPath) {
127
+ const tsConfig = path.join(cwd, "nuxt.config.ts");
128
+ const jsConfig = path.join(cwd, "nuxt.config.js");
129
+ const configPath = (await fs.pathExists(tsConfig)) ? tsConfig : (await fs.pathExists(jsConfig)) ? jsConfig : null;
130
+ if (!configPath) {
131
+ console.log(chalk.yellow("\n⚠ No nuxt.config.ts found. Add the module manually:"));
132
+ console.log(chalk.dim(` modules: [['@dyrected/nuxt', { adminPath: '${adminPath || "cms"}' }]]`));
133
+ return;
134
+ }
135
+ let content = await fs.readFile(configPath, "utf-8");
136
+ if (content.includes("@dyrected/nuxt")) {
137
+ console.log(chalk.dim("ℹ @dyrected/nuxt already in nuxt.config"));
138
+ return;
139
+ }
140
+ const moduleEntry = adminPath
141
+ ? `['@dyrected/nuxt', { adminPath: '${adminPath}' }]`
142
+ : `'@dyrected/nuxt'`;
143
+ if (/modules\s*:\s*\[/.test(content)) {
144
+ content = content.replace(/modules\s*:\s*\[/, `modules: [${moduleEntry}, `);
145
+ }
146
+ else {
147
+ content = content.replace(/defineNuxtConfig\s*\(\s*\{/, `defineNuxtConfig({\n modules: [${moduleEntry}],`);
148
+ }
149
+ await fs.writeFile(configPath, content, "utf-8");
150
+ console.log(chalk.green(`✔ @dyrected/nuxt added to ${path.relative(cwd, configPath)}`));
151
+ }
152
+ //# sourceMappingURL=writers.js.map