prisma-flare 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/cli/db-create.cjs +240 -0
  2. package/dist/cli/db-create.d.cts +1 -0
  3. package/dist/cli/db-create.d.ts +1 -0
  4. package/dist/cli/db-create.js +217 -0
  5. package/dist/cli/db-drop.cjs +263 -0
  6. package/dist/cli/db-drop.d.cts +1 -0
  7. package/dist/cli/db-drop.d.ts +1 -0
  8. package/dist/cli/db-drop.js +240 -0
  9. package/dist/cli/db-migrate.cjs +318 -0
  10. package/dist/cli/db-migrate.d.cts +1 -0
  11. package/dist/cli/db-migrate.d.ts +1 -0
  12. package/dist/cli/db-migrate.js +295 -0
  13. package/dist/cli/db-reset.cjs +110 -0
  14. package/dist/cli/db-reset.d.cts +1 -0
  15. package/dist/cli/db-reset.d.ts +1 -0
  16. package/dist/cli/db-reset.js +87 -0
  17. package/dist/cli/db-seed.cjs +87 -0
  18. package/dist/cli/db-seed.d.cts +1 -0
  19. package/dist/cli/db-seed.d.ts +1 -0
  20. package/dist/cli/db-seed.js +64 -0
  21. package/dist/cli/index.cjs +352 -0
  22. package/dist/cli/index.d.cts +1 -0
  23. package/dist/cli/index.d.ts +1 -0
  24. package/dist/cli/index.js +328 -0
  25. package/dist/core/flareBuilder.cjs +681 -0
  26. package/dist/core/flareBuilder.d.cts +402 -0
  27. package/dist/core/flareBuilder.d.ts +402 -0
  28. package/dist/core/flareBuilder.js +658 -0
  29. package/dist/core/hooks.cjs +243 -0
  30. package/dist/core/hooks.d.cts +13 -0
  31. package/dist/core/hooks.d.ts +13 -0
  32. package/dist/core/hooks.js +209 -0
  33. package/dist/generated.cjs +31 -0
  34. package/dist/generated.d.cts +4 -0
  35. package/dist/generated.d.ts +4 -0
  36. package/dist/generated.js +6 -0
  37. package/dist/index.cjs +1315 -0
  38. package/dist/index.d.cts +237 -0
  39. package/dist/index.d.ts +237 -0
  40. package/dist/index.js +1261 -0
  41. package/dist/prisma.types-nGNe1CG8.d.cts +201 -0
  42. package/dist/prisma.types-nGNe1CG8.d.ts +201 -0
  43. package/license.md +21 -0
  44. package/package.json +115 -0
  45. package/readme.md +957 -0
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
25
+
26
+ // src/cli/db-create.ts
27
+ var dotenv = __toESM(require("dotenv"), 1);
28
+
29
+ // src/core/adapters/postgres.ts
30
+ var PostgresAdapter = {
31
+ name: "postgres",
32
+ matches(url) {
33
+ return url.startsWith("postgresql://") || url.startsWith("postgres://");
34
+ },
35
+ async create(url) {
36
+ const config3 = parseDatabaseUrl(url);
37
+ const { Client } = await import("pg");
38
+ const client = new Client({
39
+ user: config3.user,
40
+ password: config3.password,
41
+ host: config3.host,
42
+ port: config3.port,
43
+ database: "postgres"
44
+ });
45
+ try {
46
+ await client.connect();
47
+ const checkRes = await client.query(
48
+ `SELECT 1 FROM pg_database WHERE datname = $1`,
49
+ [config3.database]
50
+ );
51
+ if (checkRes.rowCount === 0) {
52
+ await client.query(`CREATE DATABASE "${config3.database}"`);
53
+ console.log(`\u2705 Database "${config3.database}" created successfully.`);
54
+ } else {
55
+ console.log(`\u26A0\uFE0F Database "${config3.database}" already exists.`);
56
+ }
57
+ } catch (error) {
58
+ console.error("\u274C Error creating database:", error);
59
+ throw error;
60
+ } finally {
61
+ await client.end();
62
+ }
63
+ },
64
+ async drop(url) {
65
+ const config3 = parseDatabaseUrl(url);
66
+ const { Client } = await import("pg");
67
+ const client = new Client({
68
+ user: config3.user,
69
+ password: config3.password,
70
+ host: config3.host,
71
+ port: config3.port,
72
+ database: "postgres"
73
+ });
74
+ try {
75
+ await client.connect();
76
+ await client.query(
77
+ `SELECT pg_terminate_backend(pg_stat_activity.pid)
78
+ FROM pg_stat_activity
79
+ WHERE pg_stat_activity.datname = $1
80
+ AND pid <> pg_backend_pid()`,
81
+ [config3.database]
82
+ );
83
+ await client.query(`DROP DATABASE IF EXISTS "${config3.database}"`);
84
+ console.log(`\u2705 Database "${config3.database}" dropped successfully.`);
85
+ } catch (error) {
86
+ console.error("\u274C Error dropping database:", error);
87
+ throw error;
88
+ } finally {
89
+ await client.end();
90
+ }
91
+ }
92
+ };
93
+ function parseDatabaseUrl(url) {
94
+ const regex = /postgres(?:ql)?:\/\/([^:]+):([^@]+)@([^:]+):(\d+)\/([^?]+)(\?.*)?/;
95
+ const match = url.match(regex);
96
+ if (!match) {
97
+ throw new Error("Invalid PostgreSQL connection string");
98
+ }
99
+ return {
100
+ user: decodeURIComponent(match[1]),
101
+ password: decodeURIComponent(match[2]),
102
+ host: match[3],
103
+ port: parseInt(match[4], 10),
104
+ database: match[5]
105
+ };
106
+ }
107
+
108
+ // src/core/adapters/sqlite.ts
109
+ var fs = __toESM(require("fs"), 1);
110
+ var path = __toESM(require("path"), 1);
111
+ var SqliteAdapter = {
112
+ name: "sqlite",
113
+ matches(url) {
114
+ return url.startsWith("file:");
115
+ },
116
+ async create(url) {
117
+ const filePath = parseSqliteUrl(url);
118
+ const dir = path.dirname(filePath);
119
+ try {
120
+ if (!fs.existsSync(dir)) {
121
+ fs.mkdirSync(dir, { recursive: true });
122
+ }
123
+ if (!fs.existsSync(filePath)) {
124
+ fs.writeFileSync(filePath, "");
125
+ console.log(`\u2705 SQLite database created at "${filePath}"`);
126
+ } else {
127
+ console.log(`\u26A0\uFE0F SQLite database already exists at "${filePath}"`);
128
+ }
129
+ } catch (error) {
130
+ console.error("\u274C Error creating SQLite database:", error);
131
+ throw error;
132
+ }
133
+ },
134
+ async drop(url) {
135
+ const filePath = parseSqliteUrl(url);
136
+ try {
137
+ if (fs.existsSync(filePath)) {
138
+ fs.unlinkSync(filePath);
139
+ console.log(`\u2705 SQLite database at "${filePath}" dropped successfully.`);
140
+ } else {
141
+ console.log(`\u26A0\uFE0F SQLite database does not exist at "${filePath}"`);
142
+ }
143
+ if (fs.existsSync(`${filePath}-journal`)) {
144
+ fs.unlinkSync(`${filePath}-journal`);
145
+ }
146
+ if (fs.existsSync(`${filePath}-wal`)) {
147
+ fs.unlinkSync(`${filePath}-wal`);
148
+ }
149
+ if (fs.existsSync(`${filePath}-shm`)) {
150
+ fs.unlinkSync(`${filePath}-shm`);
151
+ }
152
+ } catch (error) {
153
+ console.error("\u274C Error dropping SQLite database:", error);
154
+ throw error;
155
+ }
156
+ }
157
+ };
158
+ function parseSqliteUrl(url) {
159
+ let cleanPath = url.replace(/^file:/, "");
160
+ if (!path.isAbsolute(cleanPath)) {
161
+ cleanPath = path.resolve(process.cwd(), cleanPath);
162
+ }
163
+ return cleanPath;
164
+ }
165
+
166
+ // src/core/adapters/index.ts
167
+ var AdapterRegistry = class {
168
+ constructor() {
169
+ this.adapters = [];
170
+ }
171
+ register(adapter) {
172
+ this.adapters.push(adapter);
173
+ }
174
+ getAdapter(url) {
175
+ const adapter = this.adapters.find((a) => a.matches(url));
176
+ if (!adapter) {
177
+ throw new Error(`No database adapter found for URL: ${url}`);
178
+ }
179
+ return adapter;
180
+ }
181
+ };
182
+ var registry = new AdapterRegistry();
183
+ registry.register(PostgresAdapter);
184
+ registry.register(SqliteAdapter);
185
+
186
+ // src/cli/config.ts
187
+ var fs2 = __toESM(require("fs"), 1);
188
+ var path2 = __toESM(require("path"), 1);
189
+ function findProjectRoot(currentDir) {
190
+ if (fs2.existsSync(path2.join(currentDir, "package.json"))) {
191
+ return currentDir;
192
+ }
193
+ const parentDir = path2.dirname(currentDir);
194
+ if (parentDir === currentDir) {
195
+ throw new Error("Could not find package.json");
196
+ }
197
+ return findProjectRoot(parentDir);
198
+ }
199
+ function loadConfig(rootDir) {
200
+ const projectRoot = rootDir || findProjectRoot(process.cwd());
201
+ const configPath = path2.join(projectRoot, "prisma-flare.config.json");
202
+ let config3 = {
203
+ modelsPath: "prisma/models",
204
+ dbPath: "prisma/db",
205
+ callbacksPath: "prisma/callbacks"
206
+ };
207
+ if (fs2.existsSync(configPath)) {
208
+ try {
209
+ const configFile = fs2.readFileSync(configPath, "utf-8");
210
+ const userConfig = JSON.parse(configFile);
211
+ config3 = { ...config3, ...userConfig };
212
+ } catch {
213
+ console.warn("\u26A0\uFE0F Could not read prisma-flare.config.json, using defaults.");
214
+ }
215
+ }
216
+ return {
217
+ ...config3
218
+ };
219
+ }
220
+
221
+ // src/cli/db-create.ts
222
+ var config2 = loadConfig();
223
+ dotenv.config({ path: config2.envPath });
224
+ async function createDatabase() {
225
+ const databaseUrl = process.env.DATABASE_URL;
226
+ if (!databaseUrl) {
227
+ console.error("\u274C DATABASE_URL environment variable is not set");
228
+ process.exit(1);
229
+ }
230
+ try {
231
+ const adapter = registry.getAdapter(databaseUrl);
232
+ console.log(`\u2713 Using adapter: ${adapter.name}`);
233
+ await adapter.create(databaseUrl);
234
+ process.exit(0);
235
+ } catch (error) {
236
+ console.error("\u274C Error creating database:", error);
237
+ process.exit(1);
238
+ }
239
+ }
240
+ createDatabase();
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli/db-create.ts
4
+ import * as dotenv from "dotenv";
5
+
6
+ // src/core/adapters/postgres.ts
7
+ var PostgresAdapter = {
8
+ name: "postgres",
9
+ matches(url) {
10
+ return url.startsWith("postgresql://") || url.startsWith("postgres://");
11
+ },
12
+ async create(url) {
13
+ const config3 = parseDatabaseUrl(url);
14
+ const { Client } = await import("pg");
15
+ const client = new Client({
16
+ user: config3.user,
17
+ password: config3.password,
18
+ host: config3.host,
19
+ port: config3.port,
20
+ database: "postgres"
21
+ });
22
+ try {
23
+ await client.connect();
24
+ const checkRes = await client.query(
25
+ `SELECT 1 FROM pg_database WHERE datname = $1`,
26
+ [config3.database]
27
+ );
28
+ if (checkRes.rowCount === 0) {
29
+ await client.query(`CREATE DATABASE "${config3.database}"`);
30
+ console.log(`\u2705 Database "${config3.database}" created successfully.`);
31
+ } else {
32
+ console.log(`\u26A0\uFE0F Database "${config3.database}" already exists.`);
33
+ }
34
+ } catch (error) {
35
+ console.error("\u274C Error creating database:", error);
36
+ throw error;
37
+ } finally {
38
+ await client.end();
39
+ }
40
+ },
41
+ async drop(url) {
42
+ const config3 = parseDatabaseUrl(url);
43
+ const { Client } = await import("pg");
44
+ const client = new Client({
45
+ user: config3.user,
46
+ password: config3.password,
47
+ host: config3.host,
48
+ port: config3.port,
49
+ database: "postgres"
50
+ });
51
+ try {
52
+ await client.connect();
53
+ await client.query(
54
+ `SELECT pg_terminate_backend(pg_stat_activity.pid)
55
+ FROM pg_stat_activity
56
+ WHERE pg_stat_activity.datname = $1
57
+ AND pid <> pg_backend_pid()`,
58
+ [config3.database]
59
+ );
60
+ await client.query(`DROP DATABASE IF EXISTS "${config3.database}"`);
61
+ console.log(`\u2705 Database "${config3.database}" dropped successfully.`);
62
+ } catch (error) {
63
+ console.error("\u274C Error dropping database:", error);
64
+ throw error;
65
+ } finally {
66
+ await client.end();
67
+ }
68
+ }
69
+ };
70
+ function parseDatabaseUrl(url) {
71
+ const regex = /postgres(?:ql)?:\/\/([^:]+):([^@]+)@([^:]+):(\d+)\/([^?]+)(\?.*)?/;
72
+ const match = url.match(regex);
73
+ if (!match) {
74
+ throw new Error("Invalid PostgreSQL connection string");
75
+ }
76
+ return {
77
+ user: decodeURIComponent(match[1]),
78
+ password: decodeURIComponent(match[2]),
79
+ host: match[3],
80
+ port: parseInt(match[4], 10),
81
+ database: match[5]
82
+ };
83
+ }
84
+
85
+ // src/core/adapters/sqlite.ts
86
+ import * as fs from "fs";
87
+ import * as path from "path";
88
+ var SqliteAdapter = {
89
+ name: "sqlite",
90
+ matches(url) {
91
+ return url.startsWith("file:");
92
+ },
93
+ async create(url) {
94
+ const filePath = parseSqliteUrl(url);
95
+ const dir = path.dirname(filePath);
96
+ try {
97
+ if (!fs.existsSync(dir)) {
98
+ fs.mkdirSync(dir, { recursive: true });
99
+ }
100
+ if (!fs.existsSync(filePath)) {
101
+ fs.writeFileSync(filePath, "");
102
+ console.log(`\u2705 SQLite database created at "${filePath}"`);
103
+ } else {
104
+ console.log(`\u26A0\uFE0F SQLite database already exists at "${filePath}"`);
105
+ }
106
+ } catch (error) {
107
+ console.error("\u274C Error creating SQLite database:", error);
108
+ throw error;
109
+ }
110
+ },
111
+ async drop(url) {
112
+ const filePath = parseSqliteUrl(url);
113
+ try {
114
+ if (fs.existsSync(filePath)) {
115
+ fs.unlinkSync(filePath);
116
+ console.log(`\u2705 SQLite database at "${filePath}" dropped successfully.`);
117
+ } else {
118
+ console.log(`\u26A0\uFE0F SQLite database does not exist at "${filePath}"`);
119
+ }
120
+ if (fs.existsSync(`${filePath}-journal`)) {
121
+ fs.unlinkSync(`${filePath}-journal`);
122
+ }
123
+ if (fs.existsSync(`${filePath}-wal`)) {
124
+ fs.unlinkSync(`${filePath}-wal`);
125
+ }
126
+ if (fs.existsSync(`${filePath}-shm`)) {
127
+ fs.unlinkSync(`${filePath}-shm`);
128
+ }
129
+ } catch (error) {
130
+ console.error("\u274C Error dropping SQLite database:", error);
131
+ throw error;
132
+ }
133
+ }
134
+ };
135
+ function parseSqliteUrl(url) {
136
+ let cleanPath = url.replace(/^file:/, "");
137
+ if (!path.isAbsolute(cleanPath)) {
138
+ cleanPath = path.resolve(process.cwd(), cleanPath);
139
+ }
140
+ return cleanPath;
141
+ }
142
+
143
+ // src/core/adapters/index.ts
144
+ var AdapterRegistry = class {
145
+ constructor() {
146
+ this.adapters = [];
147
+ }
148
+ register(adapter) {
149
+ this.adapters.push(adapter);
150
+ }
151
+ getAdapter(url) {
152
+ const adapter = this.adapters.find((a) => a.matches(url));
153
+ if (!adapter) {
154
+ throw new Error(`No database adapter found for URL: ${url}`);
155
+ }
156
+ return adapter;
157
+ }
158
+ };
159
+ var registry = new AdapterRegistry();
160
+ registry.register(PostgresAdapter);
161
+ registry.register(SqliteAdapter);
162
+
163
+ // src/cli/config.ts
164
+ import * as fs2 from "fs";
165
+ import * as path2 from "path";
166
+ function findProjectRoot(currentDir) {
167
+ if (fs2.existsSync(path2.join(currentDir, "package.json"))) {
168
+ return currentDir;
169
+ }
170
+ const parentDir = path2.dirname(currentDir);
171
+ if (parentDir === currentDir) {
172
+ throw new Error("Could not find package.json");
173
+ }
174
+ return findProjectRoot(parentDir);
175
+ }
176
+ function loadConfig(rootDir) {
177
+ const projectRoot = rootDir || findProjectRoot(process.cwd());
178
+ const configPath = path2.join(projectRoot, "prisma-flare.config.json");
179
+ let config3 = {
180
+ modelsPath: "prisma/models",
181
+ dbPath: "prisma/db",
182
+ callbacksPath: "prisma/callbacks"
183
+ };
184
+ if (fs2.existsSync(configPath)) {
185
+ try {
186
+ const configFile = fs2.readFileSync(configPath, "utf-8");
187
+ const userConfig = JSON.parse(configFile);
188
+ config3 = { ...config3, ...userConfig };
189
+ } catch {
190
+ console.warn("\u26A0\uFE0F Could not read prisma-flare.config.json, using defaults.");
191
+ }
192
+ }
193
+ return {
194
+ ...config3
195
+ };
196
+ }
197
+
198
+ // src/cli/db-create.ts
199
+ var config2 = loadConfig();
200
+ dotenv.config({ path: config2.envPath });
201
+ async function createDatabase() {
202
+ const databaseUrl = process.env.DATABASE_URL;
203
+ if (!databaseUrl) {
204
+ console.error("\u274C DATABASE_URL environment variable is not set");
205
+ process.exit(1);
206
+ }
207
+ try {
208
+ const adapter = registry.getAdapter(databaseUrl);
209
+ console.log(`\u2713 Using adapter: ${adapter.name}`);
210
+ await adapter.create(databaseUrl);
211
+ process.exit(0);
212
+ } catch (error) {
213
+ console.error("\u274C Error creating database:", error);
214
+ process.exit(1);
215
+ }
216
+ }
217
+ createDatabase();