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.
- package/LICENSE.md +50 -0
- package/README.md +3 -0
- package/dist/commands/generate-ai-rules.d.ts +3 -0
- package/dist/commands/generate-ai-rules.d.ts.map +1 -0
- package/dist/commands/generate-ai-rules.js +16 -0
- package/dist/commands/generate-ai-rules.js.map +1 -0
- package/dist/commands/generate-types.d.ts +3 -0
- package/dist/commands/generate-types.d.ts.map +1 -0
- package/dist/commands/generate-types.js +34 -0
- package/dist/commands/generate-types.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +397 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/sync-schema.d.ts +3 -0
- package/dist/commands/sync-schema.d.ts.map +1 -0
- package/dist/commands/sync-schema.js +89 -0
- package/dist/commands/sync-schema.js.map +1 -0
- package/dist/commands/upgrade.d.ts +3 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +58 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/ai-rules-template.d.ts +2 -0
- package/dist/utils/ai-rules-template.d.ts.map +1 -0
- package/dist/utils/ai-rules-template.js +411 -0
- package/dist/utils/ai-rules-template.js.map +1 -0
- package/dist/utils/config-templates.d.ts +5 -0
- package/dist/utils/config-templates.d.ts.map +1 -0
- package/dist/utils/config-templates.js +65 -0
- package/dist/utils/config-templates.js.map +1 -0
- package/dist/utils/detect.d.ts +11 -0
- package/dist/utils/detect.d.ts.map +1 -0
- package/dist/utils/detect.js +45 -0
- package/dist/utils/detect.js.map +1 -0
- package/dist/utils/env.d.ts +10 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +52 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/type-generator.d.ts +8 -0
- package/dist/utils/type-generator.d.ts.map +1 -0
- package/dist/utils/type-generator.js +246 -0
- package/dist/utils/type-generator.js.map +1 -0
- package/dist/utils/writers.d.ts +6 -0
- package/dist/utils/writers.d.ts.map +1 -0
- package/dist/utils/writers.js +152 -0
- package/dist/utils/writers.js.map +1 -0
- 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 @@
|
|
|
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
|