prisma-generator-express 1.16.7 → 1.19.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.
- package/README.md +399 -194
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +1 -1
- package/dist/bin.js.map +1 -1
- package/dist/client/encodeQueryParams.d.ts +1 -0
- package/dist/client/encodeQueryParams.js +33 -0
- package/dist/client/encodeQueryParams.js.map +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/copy/misc.d.ts +5 -0
- package/dist/copy/misc.js +52 -0
- package/dist/copy/misc.js.map +1 -0
- package/dist/generators/generateImportPrismaStatement.d.ts +3 -0
- package/dist/generators/generateImportPrismaStatement.js +55 -0
- package/dist/generators/generateImportPrismaStatement.js.map +1 -0
- package/dist/generators/generateQueryBuilderHelper.d.ts +2 -0
- package/dist/generators/generateQueryBuilderHelper.js +139 -0
- package/dist/generators/generateQueryBuilderHelper.js.map +1 -0
- package/dist/generators/generateRouter.d.ts +6 -0
- package/dist/generators/generateRouter.js +340 -0
- package/dist/generators/generateRouter.js.map +1 -0
- package/dist/generators/generateUnifiedDocs.d.ts +1 -0
- package/dist/generators/generateUnifiedDocs.js +171 -0
- package/dist/generators/generateUnifiedDocs.js.map +1 -0
- package/dist/generators/generateUnifiedHandler.d.ts +6 -0
- package/dist/generators/generateUnifiedHandler.js +444 -0
- package/dist/generators/generateUnifiedHandler.js.map +1 -0
- package/dist/generators/generateUnifiedScalarUI.d.ts +5 -0
- package/dist/generators/generateUnifiedScalarUI.js +1390 -0
- package/dist/generators/generateUnifiedScalarUI.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/copyFiles.d.ts +6 -0
- package/dist/utils/copyFiles.js +123 -21
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/strings.d.ts +2 -0
- package/dist/utils/writeFileSafely.d.ts +10 -0
- package/dist/utils/writeFileSafely.js +86 -14
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +64 -31
- package/src/client/encodeQueryParams.ts +56 -0
- package/src/copy/buildModelOpenApi.ts +1569 -0
- package/src/copy/createOutputValidatorMiddleware.ts +1 -1
- package/src/copy/createValidatorMiddleware.ts +1 -1
- package/src/copy/misc.ts +22 -1
- package/src/copy/operationDefinitions.ts +96 -0
- package/src/copy/parseQueryParams.ts +36 -21
- package/src/copy/routeConfig.ts +69 -27
- package/src/copy/transformZod.ts +15 -16
- package/dist/generator.js +0 -168
- package/dist/generator.js.map +0 -1
- package/dist/helpers/generateAggregate.js +0 -51
- package/dist/helpers/generateAggregate.js.map +0 -1
- package/dist/helpers/generateCount.js +0 -50
- package/dist/helpers/generateCount.js.map +0 -1
- package/dist/helpers/generateCreate.js +0 -49
- package/dist/helpers/generateCreate.js.map +0 -1
- package/dist/helpers/generateCreateMany.js +0 -49
- package/dist/helpers/generateCreateMany.js.map +0 -1
- package/dist/helpers/generateDelete.js +0 -49
- package/dist/helpers/generateDelete.js.map +0 -1
- package/dist/helpers/generateDeleteMany.js +0 -49
- package/dist/helpers/generateDeleteMany.js.map +0 -1
- package/dist/helpers/generateFindFirst.js +0 -56
- package/dist/helpers/generateFindFirst.js.map +0 -1
- package/dist/helpers/generateFindMany.js +0 -56
- package/dist/helpers/generateFindMany.js.map +0 -1
- package/dist/helpers/generateFindUnique.js +0 -56
- package/dist/helpers/generateFindUnique.js.map +0 -1
- package/dist/helpers/generateGroupBy.js +0 -51
- package/dist/helpers/generateGroupBy.js.map +0 -1
- package/dist/helpers/generateImportPrismaStatement.js +0 -25
- package/dist/helpers/generateImportPrismaStatement.js.map +0 -1
- package/dist/helpers/generateRouteFile.js +0 -192
- package/dist/helpers/generateRouteFile.js.map +0 -1
- package/dist/helpers/generateUpdate.js +0 -49
- package/dist/helpers/generateUpdate.js.map +0 -1
- package/dist/helpers/generateUpdateMany.js +0 -49
- package/dist/helpers/generateUpdateMany.js.map +0 -1
- package/dist/helpers/generateUpsert.js +0 -49
- package/dist/helpers/generateUpsert.js.map +0 -1
- package/dist/utils/formatFile.js +0 -26
- package/dist/utils/formatFile.js.map +0 -1
- package/src/bin.ts +0 -2
- package/src/constants.ts +0 -1
- package/src/copy/encodeQueryParams.spec.ts +0 -303
- package/src/copy/encodeQueryParams.ts +0 -44
- package/src/copy/misc.spec.ts +0 -62
- package/src/copy/parseQueryParams.spec.ts +0 -187
- package/src/copy/transformZod.spec.ts +0 -763
- package/src/generator.ts +0 -188
- package/src/helpers/generateAggregate.ts +0 -59
- package/src/helpers/generateCount.ts +0 -58
- package/src/helpers/generateCreate.ts +0 -56
- package/src/helpers/generateCreateMany.ts +0 -55
- package/src/helpers/generateDelete.ts +0 -57
- package/src/helpers/generateDeleteMany.ts +0 -57
- package/src/helpers/generateFindFirst.ts +0 -62
- package/src/helpers/generateFindMany.ts +0 -62
- package/src/helpers/generateFindUnique.ts +0 -62
- package/src/helpers/generateGroupBy.ts +0 -60
- package/src/helpers/generateImportPrismaStatement.ts +0 -38
- package/src/helpers/generateRouteFile.ts +0 -195
- package/src/helpers/generateUpdate.ts +0 -56
- package/src/helpers/generateUpdateMany.ts +0 -56
- package/src/helpers/generateUpsert.ts +0 -57
- package/src/utils/copyFiles.ts +0 -27
- package/src/utils/formatFile.ts +0 -22
- package/src/utils/strings.ts +0 -7
- package/src/utils/writeFileSafely.ts +0 -29
package/dist/bin.d.ts
ADDED
package/dist/bin.js
CHANGED
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";;;AACA,aAAU"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const encodeQueryParams: (params: Record<string, unknown>) => string;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.encodeQueryParams = void 0;
|
|
4
|
+
const misc_1 = require("../copy/misc");
|
|
5
|
+
function replacer(_key, value) {
|
|
6
|
+
if (typeof value === 'bigint') {
|
|
7
|
+
return value.toString();
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
const encodeQueryParams = (params) => {
|
|
12
|
+
const entries = [];
|
|
13
|
+
for (const [key, value] of Object.entries(params)) {
|
|
14
|
+
if (value === undefined)
|
|
15
|
+
continue;
|
|
16
|
+
if (value === null) {
|
|
17
|
+
entries.push(`${encodeURIComponent(key)}=null`);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === 'bigint') {
|
|
21
|
+
entries.push(`${encodeURIComponent(key)}=${encodeURIComponent(value.toString())}`);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(value) || (0, misc_1.isObject)(value)) {
|
|
25
|
+
entries.push(`${encodeURIComponent(key)}=${encodeURIComponent(JSON.stringify(value, replacer))}`);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
entries.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
|
|
29
|
+
}
|
|
30
|
+
return entries.join('&');
|
|
31
|
+
};
|
|
32
|
+
exports.encodeQueryParams = encodeQueryParams;
|
|
33
|
+
//# sourceMappingURL=encodeQueryParams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encodeQueryParams.js","sourceRoot":"","sources":["../../src/client/encodeQueryParams.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AAiBvC,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAEM,MAAM,iBAAiB,GAAG,CAAC,MAA+B,EAAU,EAAE;IAC3E,MAAM,OAAO,GAAa,EAAE,CAAA;IAE5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QAEjC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YAC/C,SAAQ;QACV,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CACV,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CACrE,CAAA;YACD,SAAQ;QACV,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAA,eAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CACV,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CACpF,CAAA;YACD,SAAQ;QACV,CAAC;QAED,OAAO,CAAC,IAAI,CACV,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAClE,CAAA;IACH,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC,CAAA;AA/BY,QAAA,iBAAiB,qBA+B7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const GENERATOR_NAME = "prisma-generator-express";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function isJsonString(str: string | unknown): boolean;
|
|
2
|
+
export declare function safeJSONparse<T>(data: unknown): T | boolean | undefined | null;
|
|
3
|
+
export declare const isObject: (value: unknown) => value is Record<string, unknown>;
|
|
4
|
+
export declare function isSafeKey(key: string): boolean;
|
|
5
|
+
export declare function sanitizeKeys<T>(value: T): T;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isObject = void 0;
|
|
4
|
+
exports.isJsonString = isJsonString;
|
|
5
|
+
exports.safeJSONparse = safeJSONparse;
|
|
6
|
+
exports.isSafeKey = isSafeKey;
|
|
7
|
+
exports.sanitizeKeys = sanitizeKeys;
|
|
8
|
+
function isJsonString(str) {
|
|
9
|
+
if (typeof str !== 'string') {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
JSON.parse(str);
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
function safeJSONparse(data) {
|
|
21
|
+
if (data === 'false')
|
|
22
|
+
return false;
|
|
23
|
+
if (data === 'undefined')
|
|
24
|
+
return undefined;
|
|
25
|
+
if (data === 'null')
|
|
26
|
+
return null;
|
|
27
|
+
return isJsonString(data) ? JSON.parse(data) : data;
|
|
28
|
+
}
|
|
29
|
+
const isObject = (value) => {
|
|
30
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
31
|
+
};
|
|
32
|
+
exports.isObject = isObject;
|
|
33
|
+
const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
34
|
+
function isSafeKey(key) {
|
|
35
|
+
return !UNSAFE_KEYS.has(key);
|
|
36
|
+
}
|
|
37
|
+
function sanitizeKeys(value) {
|
|
38
|
+
if (Array.isArray(value)) {
|
|
39
|
+
return value.map(sanitizeKeys);
|
|
40
|
+
}
|
|
41
|
+
if ((0, exports.isObject)(value)) {
|
|
42
|
+
const result = {};
|
|
43
|
+
for (const key of Object.keys(value)) {
|
|
44
|
+
if (!isSafeKey(key))
|
|
45
|
+
continue;
|
|
46
|
+
result[key] = sanitizeKeys(value[key]);
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=misc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/copy/misc.ts"],"names":[],"mappings":";;;AAAA,oCAWC;AAED,sCAOC;AAQD,8BAEC;AAED,oCAaC;AA7CD,SAAgB,YAAY,CAAC,GAAqB;IAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjB,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,aAAa,CAC3B,IAAa;IAEb,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAA;IAClC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,SAAS,CAAA;IAC1C,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IAChC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,IAAW,CAAA;AACtE,CAAC;AAEM,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE;IAC3E,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC,CAAA;AAFY,QAAA,QAAQ,YAEpB;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;AAEtE,SAAgB,SAAS,CAAC,GAAW;IACnC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED,SAAgB,YAAY,CAAI,KAAQ;IACtC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAM,CAAA;IACrC,CAAC;IACD,IAAI,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,GAA4B,EAAE,CAAA;QAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;gBAAE,SAAQ;YAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAA;QACrE,CAAC;QACD,OAAO,MAAW,CAAA;IACpB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateImportPrismaStatement = generateImportPrismaStatement;
|
|
7
|
+
exports.getRelativeClientPath = getRelativeClientPath;
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
function findClientGenerator(options) {
|
|
10
|
+
const byName = options.otherGenerators.find((gen) => gen.name === 'client');
|
|
11
|
+
if (byName)
|
|
12
|
+
return byName;
|
|
13
|
+
const byProvider = options.otherGenerators.find((gen) => gen.provider.value === 'prisma-client-js' ||
|
|
14
|
+
gen.provider.value === '@prisma/client' ||
|
|
15
|
+
gen.provider.value === 'prisma-client');
|
|
16
|
+
if (byProvider)
|
|
17
|
+
return byProvider;
|
|
18
|
+
const withOutput = options.otherGenerators.find((gen) => gen.output?.value?.includes('prisma') ||
|
|
19
|
+
gen.output?.value?.includes('client'));
|
|
20
|
+
return withOutput || null;
|
|
21
|
+
}
|
|
22
|
+
function getRelativeImportPath(fromDir, clientOutputPath) {
|
|
23
|
+
let relativeImportPath = path_1.default.relative(fromDir, clientOutputPath);
|
|
24
|
+
relativeImportPath = relativeImportPath.split(path_1.default.sep).join(path_1.default.posix.sep);
|
|
25
|
+
if (!relativeImportPath.startsWith('.')) {
|
|
26
|
+
relativeImportPath = './' + relativeImportPath;
|
|
27
|
+
}
|
|
28
|
+
return relativeImportPath;
|
|
29
|
+
}
|
|
30
|
+
function generateImportPrismaStatement(generatorOptions) {
|
|
31
|
+
const clientGenerator = findClientGenerator(generatorOptions);
|
|
32
|
+
if (!clientGenerator || !clientGenerator.output?.value) {
|
|
33
|
+
throw new Error('Prisma client generator not found. Ensure a generator with provider "prisma-client-js" exists in your schema.');
|
|
34
|
+
}
|
|
35
|
+
const outputValue = generatorOptions.generator.output?.value;
|
|
36
|
+
if (!outputValue) {
|
|
37
|
+
throw new Error('Generator output path not defined.');
|
|
38
|
+
}
|
|
39
|
+
const subDir = path_1.default.join(outputValue, '_relative');
|
|
40
|
+
const outputPath = getRelativeImportPath(subDir, clientGenerator.output.value);
|
|
41
|
+
return `import { Prisma, PrismaClient } from '${outputPath}';\n`;
|
|
42
|
+
}
|
|
43
|
+
function getRelativeClientPath(generatorOptions, modelName) {
|
|
44
|
+
const clientGenerator = findClientGenerator(generatorOptions);
|
|
45
|
+
if (!clientGenerator || !clientGenerator.output?.value) {
|
|
46
|
+
throw new Error('Prisma client generator not found. Ensure a generator with provider "prisma-client-js" exists in your schema.');
|
|
47
|
+
}
|
|
48
|
+
const outputValue = generatorOptions.generator.output?.value;
|
|
49
|
+
if (!outputValue) {
|
|
50
|
+
throw new Error('Generator output path not defined.');
|
|
51
|
+
}
|
|
52
|
+
const routerDirPath = path_1.default.join(outputValue, modelName);
|
|
53
|
+
return getRelativeImportPath(routerDirPath, clientGenerator.output.value);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=generateImportPrismaStatement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateImportPrismaStatement.js","sourceRoot":"","sources":["../../src/generators/generateImportPrismaStatement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateQueryBuilderHelper = generateQueryBuilderHelper;
|
|
4
|
+
function generateQueryBuilderHelper(options) {
|
|
5
|
+
const schemaPath = options.schemaPath
|
|
6
|
+
? JSON.stringify(options.schemaPath)
|
|
7
|
+
: "require('path').resolve(process.cwd(), 'prisma/schema.prisma')";
|
|
8
|
+
return `import { spawn } from 'child_process'
|
|
9
|
+
import { resolve, join, dirname } from 'path'
|
|
10
|
+
import { existsSync, readFileSync } from 'fs'
|
|
11
|
+
import { createRequire } from 'module'
|
|
12
|
+
import type { ChildProcess } from 'child_process'
|
|
13
|
+
|
|
14
|
+
let _process: ChildProcess | null = null
|
|
15
|
+
let _stopping = false
|
|
16
|
+
let _cleanupRegistered = false
|
|
17
|
+
|
|
18
|
+
export interface QueryBuilderOptions {
|
|
19
|
+
port?: number
|
|
20
|
+
host?: string
|
|
21
|
+
schemaPath?: string
|
|
22
|
+
databaseUrl?: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function findCliPath(): string | null {
|
|
26
|
+
try {
|
|
27
|
+
const req = createRequire(resolve(process.cwd(), 'package.json'))
|
|
28
|
+
const pkgJsonPath = req.resolve('prisma-query-builder-ui/package.json')
|
|
29
|
+
const pkgDir = dirname(pkgJsonPath)
|
|
30
|
+
const cliPath = join(pkgDir, 'bin', 'cli.js')
|
|
31
|
+
if (existsSync(cliPath)) return cliPath
|
|
32
|
+
} catch {}
|
|
33
|
+
|
|
34
|
+
let dir = process.cwd()
|
|
35
|
+
const root = resolve(dir, '/')
|
|
36
|
+
while (dir !== root) {
|
|
37
|
+
const candidate = join(dir, 'node_modules', 'prisma-query-builder-ui', 'bin', 'cli.js')
|
|
38
|
+
if (existsSync(candidate)) return candidate
|
|
39
|
+
dir = dirname(dir)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return null
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function startQueryBuilder(options: QueryBuilderOptions = {}): void {
|
|
46
|
+
if (_process) return
|
|
47
|
+
|
|
48
|
+
const env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
|
|
49
|
+
|
|
50
|
+
if (env.NODE_ENV === 'production') return
|
|
51
|
+
|
|
52
|
+
const cliPath = findCliPath()
|
|
53
|
+
if (!cliPath) {
|
|
54
|
+
console.warn('[query-builder] prisma-query-builder-ui not found. Install: npm install prisma-query-builder-ui')
|
|
55
|
+
return
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const port = options.port || 5173
|
|
59
|
+
const host = options.host || 'localhost'
|
|
60
|
+
const schemaPath = options.schemaPath || ${schemaPath}
|
|
61
|
+
const databaseUrl = options.databaseUrl || env.DATABASE_URL || ''
|
|
62
|
+
|
|
63
|
+
if (!existsSync(schemaPath)) {
|
|
64
|
+
console.error('[query-builder] Schema file not found: ' + schemaPath)
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let schemaContent: string
|
|
69
|
+
try {
|
|
70
|
+
schemaContent = readFileSync(schemaPath, 'utf-8')
|
|
71
|
+
} catch (err) {
|
|
72
|
+
console.error('[query-builder] Failed to read schema:', err)
|
|
73
|
+
return
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const schemaCwd = dirname(resolve(schemaPath))
|
|
77
|
+
|
|
78
|
+
_process = spawn(process.execPath, [cliPath], {
|
|
79
|
+
stdio: 'inherit',
|
|
80
|
+
env: {
|
|
81
|
+
...env,
|
|
82
|
+
PORT: String(port),
|
|
83
|
+
HOST: host,
|
|
84
|
+
PRISMA_QUERY_BUILDER_MODE: 'embedded',
|
|
85
|
+
DISABLE_PERSISTENCE: 'true',
|
|
86
|
+
PRISMA_QUERY_BUILDER_SCHEMA_CONTENT: schemaContent,
|
|
87
|
+
PRISMA_QUERY_BUILDER_CWD: schemaCwd,
|
|
88
|
+
DATABASE_URL: databaseUrl,
|
|
89
|
+
},
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
_process.on('error', (err) => {
|
|
93
|
+
console.error('[query-builder] Failed to start:', err.message)
|
|
94
|
+
_process = null
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
_process.on('exit', (code) => {
|
|
98
|
+
const wasStopping = _stopping
|
|
99
|
+
_stopping = false
|
|
100
|
+
_process = null
|
|
101
|
+
if (!wasStopping && code !== 0) {
|
|
102
|
+
console.warn('[query-builder] Process exited with code ' + code)
|
|
103
|
+
}
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
if (!_cleanupRegistered) {
|
|
107
|
+
_cleanupRegistered = true
|
|
108
|
+
|
|
109
|
+
process.on('exit', () => {
|
|
110
|
+
stopQueryBuilder()
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
const handleSigint = () => {
|
|
114
|
+
stopQueryBuilder()
|
|
115
|
+
process.removeListener('SIGINT', handleSigint)
|
|
116
|
+
process.kill(process.pid, 'SIGINT')
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const handleSigterm = () => {
|
|
120
|
+
stopQueryBuilder()
|
|
121
|
+
process.removeListener('SIGTERM', handleSigterm)
|
|
122
|
+
process.kill(process.pid, 'SIGTERM')
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
process.on('SIGINT', handleSigint)
|
|
126
|
+
process.on('SIGTERM', handleSigterm)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
console.log('[query-builder] Starting on http://' + host + ':' + port)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function stopQueryBuilder(): void {
|
|
133
|
+
if (!_process || _process.killed) return
|
|
134
|
+
_stopping = true
|
|
135
|
+
_process.kill()
|
|
136
|
+
}
|
|
137
|
+
`;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=generateQueryBuilderHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateQueryBuilderHelper.js","sourceRoot":"","sources":["../../src/generators/generateQueryBuilderHelper.ts"],"names":[],"mappings":";;AAEA,gEAuIC;AAvID,SAAgB,0BAA0B,CAAC,OAAyB;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;QACnC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;QACpC,CAAC,CAAC,gEAAgE,CAAA;IAEpE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CAoDoC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6EtD,CAAA;AACD,CAAC"}
|