rps-flagforge 1.0.5 → 1.0.7
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/bin/mergeSchema.js +91 -18
- package/dist/bin/mergeSchema.js.map +1 -1
- package/package.json +1 -1
package/dist/bin/mergeSchema.js
CHANGED
|
@@ -28,36 +28,109 @@ var import_fs = __toESM(require("fs"));
|
|
|
28
28
|
var import_path = __toESM(require("path"));
|
|
29
29
|
var import_chalk = __toESM(require("chalk"));
|
|
30
30
|
var import_prompts = __toESM(require("prompts"));
|
|
31
|
+
var args = process.argv.slice(2);
|
|
32
|
+
var isDryRun = args.includes("--dry-run");
|
|
33
|
+
var isForce = args.includes("--force");
|
|
31
34
|
var appSchema = import_path.default.resolve(process.cwd(), "prisma/schema.prisma");
|
|
32
35
|
var packageSchema = import_path.default.resolve(__dirname, "../../prisma/schema.prisma");
|
|
36
|
+
function extractBlocks(schema, type) {
|
|
37
|
+
const regex = new RegExp(`${type}\\s+\\w+\\s+{[\\s\\S]*?}\\n?`, "g");
|
|
38
|
+
return schema.match(regex) || [];
|
|
39
|
+
}
|
|
40
|
+
function extractNames(schema, type) {
|
|
41
|
+
const regex = new RegExp(`${type}\\s+(\\w+)\\s+{`, "g");
|
|
42
|
+
const names = [];
|
|
43
|
+
let match;
|
|
44
|
+
while ((match = regex.exec(schema)) !== null) {
|
|
45
|
+
names.push(match[1]);
|
|
46
|
+
}
|
|
47
|
+
return names;
|
|
48
|
+
}
|
|
49
|
+
function stripNonStructuralBlocks(schema) {
|
|
50
|
+
return schema.replace(/generator\s+\w+\s+{[\s\S]*?}\n?/g, "").replace(/datasource\s+\w+\s+{[\s\S]*?}\n?/g, "");
|
|
51
|
+
}
|
|
33
52
|
async function main() {
|
|
34
53
|
console.log(import_chalk.default.blueBright.bold("\n\u26A1 FlagsForge Prisma Schema Merger\n"));
|
|
54
|
+
if (isDryRun) {
|
|
55
|
+
console.log(import_chalk.default.cyan("\u{1F50D} Running in DRY RUN mode (no files will be modified)\n"));
|
|
56
|
+
}
|
|
57
|
+
if (isForce) {
|
|
58
|
+
console.log(import_chalk.default.yellow("\u26A0\uFE0F Force mode enabled (existing models will be replaced)\n"));
|
|
59
|
+
}
|
|
35
60
|
if (!import_fs.default.existsSync(appSchema)) {
|
|
36
|
-
console.error(import_chalk.default.red(
|
|
61
|
+
console.error(import_chalk.default.red("\u274C App schema not found at prisma/schema.prisma"));
|
|
37
62
|
process.exit(1);
|
|
38
63
|
}
|
|
39
64
|
if (!import_fs.default.existsSync(packageSchema)) {
|
|
40
|
-
console.error(import_chalk.default.red(
|
|
65
|
+
console.error(import_chalk.default.red("\u274C Package Prisma models not found"));
|
|
41
66
|
process.exit(1);
|
|
42
67
|
}
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
68
|
+
const appContent = import_fs.default.readFileSync(appSchema, "utf-8");
|
|
69
|
+
const packageRaw = import_fs.default.readFileSync(packageSchema, "utf-8");
|
|
70
|
+
const packageContent = stripNonStructuralBlocks(packageRaw);
|
|
71
|
+
const appModelNames = extractNames(appContent, "model");
|
|
72
|
+
const appEnumNames = extractNames(appContent, "enum");
|
|
73
|
+
const packageModels = extractBlocks(packageContent, "model");
|
|
74
|
+
const packageEnums = extractBlocks(packageContent, "enum");
|
|
75
|
+
let newModels = [];
|
|
76
|
+
let newEnums = [];
|
|
77
|
+
if (isForce) {
|
|
78
|
+
newModels = packageModels;
|
|
79
|
+
newEnums = packageEnums;
|
|
80
|
+
} else {
|
|
81
|
+
newModels = packageModels.filter((block) => {
|
|
82
|
+
const match = block.match(/model\s+(\w+)\s+{/);
|
|
83
|
+
if (!match) return false;
|
|
84
|
+
return !appModelNames.includes(match[1]);
|
|
85
|
+
});
|
|
86
|
+
newEnums = packageEnums.filter((block) => {
|
|
87
|
+
const match = block.match(/enum\s+(\w+)\s+{/);
|
|
88
|
+
if (!match) return false;
|
|
89
|
+
return !appEnumNames.includes(match[1]);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (newModels.length === 0 && newEnums.length === 0) {
|
|
93
|
+
console.log(import_chalk.default.yellow("\u26A0\uFE0F No new models or enums to merge.\n"));
|
|
94
|
+
process.exit(0);
|
|
95
|
+
}
|
|
96
|
+
console.log(
|
|
97
|
+
import_chalk.default.green(
|
|
98
|
+
`\u{1F4E6} Found ${newModels.length} model(s) and ${newEnums.length} enum(s) to merge.
|
|
99
|
+
`
|
|
100
|
+
)
|
|
101
|
+
);
|
|
102
|
+
if (isDryRun) {
|
|
103
|
+
console.log(import_chalk.default.gray("----- PREVIEW -----\n"));
|
|
104
|
+
console.log([...newEnums, ...newModels].join("\n\n"));
|
|
105
|
+
console.log(import_chalk.default.gray("\n-------------------"));
|
|
106
|
+
console.log(import_chalk.default.cyan("\n\u2728 Dry run complete. No changes were made.\n"));
|
|
107
|
+
process.exit(0);
|
|
108
|
+
}
|
|
109
|
+
let shouldBackup = true;
|
|
110
|
+
if (!isForce) {
|
|
111
|
+
const response = await (0, import_prompts.default)({
|
|
112
|
+
type: "confirm",
|
|
113
|
+
name: "backup",
|
|
114
|
+
message: "Create a backup of your current schema?",
|
|
115
|
+
initial: true
|
|
116
|
+
});
|
|
117
|
+
shouldBackup = response.backup;
|
|
118
|
+
}
|
|
119
|
+
if (shouldBackup) {
|
|
120
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
121
|
+
const backupPath = `${appSchema}.bak-${timestamp}`;
|
|
52
122
|
import_fs.default.copyFileSync(appSchema, backupPath);
|
|
53
|
-
console.log(import_chalk.default.green(`\u2705 Backup created: ${backupPath}
|
|
123
|
+
console.log(import_chalk.default.green(`\u2705 Backup created: ${backupPath}
|
|
124
|
+
`));
|
|
54
125
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
126
|
+
let finalContent = appContent.trim();
|
|
127
|
+
if (isForce) {
|
|
128
|
+
finalContent = stripNonStructuralBlocks(appContent);
|
|
129
|
+
}
|
|
130
|
+
finalContent += "\n\n// ------------------------------\n// FlagsForge Schema Extensions\n// ------------------------------\n\n" + [...newEnums, ...newModels].join("\n\n");
|
|
131
|
+
import_fs.default.writeFileSync(appSchema, finalContent);
|
|
132
|
+
console.log(import_chalk.default.green.bold("\u2705 Prisma schema merged successfully!"));
|
|
133
|
+
console.log(import_chalk.default.yellow("Run `npx prisma generate` to update your client.\n"));
|
|
61
134
|
}
|
|
62
135
|
main().catch((err) => {
|
|
63
136
|
console.error(import_chalk.default.red("\u274C Error merging schemas:"), err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../bin/mergeSchema.ts"],"sourcesContent":["#!/usr/bin/env node\r\nimport fs from \"fs\"\r\nimport path from \"path\"\r\nimport chalk from \"chalk\"\r\nimport prompts from \"prompts\"\r\n\r\n// Paths\r\nconst appSchema = path.resolve(process.cwd(), \"prisma/schema.prisma\")\r\nconst packageSchema = path.resolve(__dirname, \"../../prisma/schema.prisma\")\r\n\r\nasync function main() {\r\n console.log(chalk.blueBright.bold(\"\\n⚡ FlagsForge Prisma Schema Merger\\n\"))\r\n\r\n //
|
|
1
|
+
{"version":3,"sources":["../../bin/mergeSchema.ts"],"sourcesContent":["#!/usr/bin/env node\r\nimport fs from \"fs\"\r\nimport path from \"path\"\r\nimport chalk from \"chalk\"\r\nimport prompts from \"prompts\"\r\n\r\n// -----------------------------\r\n// CLI Flags\r\n// -----------------------------\r\n\r\nconst args = process.argv.slice(2)\r\nconst isDryRun = args.includes(\"--dry-run\")\r\nconst isForce = args.includes(\"--force\")\r\n\r\n// -----------------------------\r\n// Paths\r\n// -----------------------------\r\n\r\nconst appSchema = path.resolve(process.cwd(), \"prisma/schema.prisma\")\r\nconst packageSchema = path.resolve(__dirname, \"../../prisma/schema.prisma\")\r\n\r\n// -----------------------------\r\n// Helpers\r\n// -----------------------------\r\n\r\nfunction extractBlocks(schema: string, type: \"model\" | \"enum\"): string[] {\r\n const regex = new RegExp(`${type}\\\\s+\\\\w+\\\\s+{[\\\\s\\\\S]*?}\\\\n?`, \"g\")\r\n return schema.match(regex) || []\r\n}\r\n\r\nfunction extractNames(schema: string, type: \"model\" | \"enum\"): string[] {\r\n const regex = new RegExp(`${type}\\\\s+(\\\\w+)\\\\s+{`, \"g\")\r\n const names: string[] = []\r\n let match\r\n while ((match = regex.exec(schema)) !== null) {\r\n names.push(match[1])\r\n }\r\n return names\r\n}\r\n\r\nfunction stripNonStructuralBlocks(schema: string) {\r\n return schema\r\n .replace(/generator\\s+\\w+\\s+{[\\s\\S]*?}\\n?/g, \"\")\r\n .replace(/datasource\\s+\\w+\\s+{[\\s\\S]*?}\\n?/g, \"\")\r\n}\r\n\r\n// -----------------------------\r\n// Main\r\n// -----------------------------\r\n\r\nasync function main() {\r\n console.log(chalk.blueBright.bold(\"\\n⚡ FlagsForge Prisma Schema Merger\\n\"))\r\n\r\n if (isDryRun) {\r\n console.log(chalk.cyan(\"🔍 Running in DRY RUN mode (no files will be modified)\\n\"))\r\n }\r\n\r\n if (isForce) {\r\n console.log(chalk.yellow(\"⚠️ Force mode enabled (existing models will be replaced)\\n\"))\r\n }\r\n\r\n // Validate files\r\n if (!fs.existsSync(appSchema)) {\r\n console.error(chalk.red(\"❌ App schema not found at prisma/schema.prisma\"))\r\n process.exit(1)\r\n }\r\n\r\n if (!fs.existsSync(packageSchema)) {\r\n console.error(chalk.red(\"❌ Package Prisma models not found\"))\r\n process.exit(1)\r\n }\r\n\r\n const appContent = fs.readFileSync(appSchema, \"utf-8\")\r\n const packageRaw = fs.readFileSync(packageSchema, \"utf-8\")\r\n\r\n const packageContent = stripNonStructuralBlocks(packageRaw)\r\n\r\n const appModelNames = extractNames(appContent, \"model\")\r\n const appEnumNames = extractNames(appContent, \"enum\")\r\n\r\n const packageModels = extractBlocks(packageContent, \"model\")\r\n const packageEnums = extractBlocks(packageContent, \"enum\")\r\n\r\n let newModels: string[] = []\r\n let newEnums: string[] = []\r\n\r\n if (isForce) {\r\n newModels = packageModels\r\n newEnums = packageEnums\r\n } else {\r\n newModels = packageModels.filter(block => {\r\n const match = block.match(/model\\s+(\\w+)\\s+{/)\r\n if (!match) return false\r\n return !appModelNames.includes(match[1])\r\n })\r\n\r\n newEnums = packageEnums.filter(block => {\r\n const match = block.match(/enum\\s+(\\w+)\\s+{/)\r\n if (!match) return false\r\n return !appEnumNames.includes(match[1])\r\n })\r\n }\r\n\r\n if (newModels.length === 0 && newEnums.length === 0) {\r\n console.log(chalk.yellow(\"⚠️ No new models or enums to merge.\\n\"))\r\n process.exit(0)\r\n }\r\n\r\n console.log(\r\n chalk.green(\r\n `📦 Found ${newModels.length} model(s) and ${newEnums.length} enum(s) to merge.\\n`\r\n )\r\n )\r\n\r\n if (isDryRun) {\r\n console.log(chalk.gray(\"----- PREVIEW -----\\n\"))\r\n console.log([...newEnums, ...newModels].join(\"\\n\\n\"))\r\n console.log(chalk.gray(\"\\n-------------------\"))\r\n console.log(chalk.cyan(\"\\n✨ Dry run complete. No changes were made.\\n\"))\r\n process.exit(0)\r\n }\r\n\r\n // Backup (skip prompt in force mode)\r\n let shouldBackup = true\r\n\r\n if (!isForce) {\r\n const response = await prompts({\r\n type: \"confirm\",\r\n name: \"backup\",\r\n message: \"Create a backup of your current schema?\",\r\n initial: true\r\n })\r\n\r\n shouldBackup = response.backup\r\n }\r\n\r\n if (shouldBackup) {\r\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\")\r\n const backupPath = `${appSchema}.bak-${timestamp}`\r\n fs.copyFileSync(appSchema, backupPath)\r\n console.log(chalk.green(`✅ Backup created: ${backupPath}\\n`))\r\n }\r\n\r\n let finalContent = appContent.trim()\r\n\r\n if (isForce) {\r\n // Remove existing models/enums before re-adding\r\n finalContent = stripNonStructuralBlocks(appContent)\r\n }\r\n\r\n finalContent +=\r\n \"\\n\\n// ------------------------------\\n\" +\r\n \"// FlagsForge Schema Extensions\\n\" +\r\n \"// ------------------------------\\n\\n\" +\r\n [...newEnums, ...newModels].join(\"\\n\\n\")\r\n\r\n fs.writeFileSync(appSchema, finalContent)\r\n\r\n console.log(chalk.green.bold(\"✅ Prisma schema merged successfully!\"))\r\n console.log(chalk.yellow(\"Run `npx prisma generate` to update your client.\\n\"))\r\n}\r\n\r\nmain().catch(err => {\r\n console.error(chalk.red(\"❌ Error merging schemas:\"), err)\r\n process.exit(1)\r\n})\r\n"],"mappings":"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","names":["path","chalk","fs","prompts"]}
|