prisma-generator-express 1.27.0 → 1.29.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 +255 -16
- package/dist/constants.d.ts +1 -0
- package/dist/generators/generateFastifyHandler.d.ts +4 -0
- package/dist/generators/generateFastifyHandler.js +78 -0
- package/dist/generators/generateFastifyHandler.js.map +1 -0
- package/dist/generators/generateOperationCore.d.ts +6 -0
- package/dist/generators/generateOperationCore.js +534 -0
- package/dist/generators/generateOperationCore.js.map +1 -0
- package/dist/generators/generateQueryBuilderHelper.js +85 -69
- package/dist/generators/generateQueryBuilderHelper.js.map +1 -1
- package/dist/generators/generateRouter.js +1 -25
- package/dist/generators/generateRouter.js.map +1 -1
- package/dist/generators/generateRouterFastify.d.ts +5 -0
- package/dist/generators/generateRouterFastify.js +512 -0
- package/dist/generators/generateRouterFastify.js.map +1 -0
- package/dist/generators/generateUnifiedDocs.d.ts +2 -1
- package/dist/generators/generateUnifiedDocs.js +147 -82
- package/dist/generators/generateUnifiedDocs.js.map +1 -1
- package/dist/generators/generateUnifiedHandler.d.ts +0 -1
- package/dist/generators/generateUnifiedHandler.js +47 -516
- package/dist/generators/generateUnifiedHandler.js.map +1 -1
- package/dist/generators/generateUnifiedScalarUI.d.ts +2 -0
- package/dist/generators/generateUnifiedScalarUI.js +127 -1324
- package/dist/generators/generateUnifiedScalarUI.js.map +1 -1
- package/dist/index.js +33 -8
- package/dist/index.js.map +1 -1
- package/dist/utils/copyFiles.d.ts +2 -1
- package/dist/utils/copyFiles.js +64 -38
- package/dist/utils/copyFiles.js.map +1 -1
- package/dist/utils/writeFileSafely.js +3 -0
- package/dist/utils/writeFileSafely.js.map +1 -1
- package/package.json +4 -1
- package/src/client/encodeQueryParams.ts +1 -1
- package/src/constants.ts +2 -0
- package/src/copy/createOutputValidatorMiddleware.ts +9 -12
- package/src/copy/docsRenderer.ts +1285 -0
- package/src/copy/parseQueryParams.ts +4 -8
- package/src/copy/routeConfig.ts +10 -4
- package/src/generators/generateFastifyHandler.ts +86 -0
- package/src/generators/generateOperationCore.ts +545 -0
- package/src/generators/generateQueryBuilderHelper.ts +86 -70
- package/src/generators/generateRouter.ts +1 -25
- package/src/generators/generateRouterFastify.ts +522 -0
- package/src/generators/generateUnifiedDocs.ts +164 -81
- package/src/generators/generateUnifiedHandler.ts +45 -533
- package/src/generators/generateUnifiedScalarUI.ts +134 -1323
- package/src/index.ts +45 -9
- package/src/utils/copyFiles.ts +79 -45
- package/src/utils/writeFileSafely.ts +4 -0
|
@@ -12,6 +12,7 @@ import { createRequire } from 'module'
|
|
|
12
12
|
import type { ChildProcess } from 'child_process'
|
|
13
13
|
|
|
14
14
|
let _process: ChildProcess | null = null
|
|
15
|
+
let _starting: Promise<void> | null = null
|
|
15
16
|
let _stopping = false
|
|
16
17
|
let _cleanupRegistered = false
|
|
17
18
|
|
|
@@ -43,90 +44,105 @@ function findCliPath(): string | null {
|
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
export function startQueryBuilder(options: QueryBuilderOptions = {}): void {
|
|
46
|
-
if (_process) return
|
|
47
|
+
if (_process || _starting) return
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
}
|
|
49
|
+
_starting = doStart(options)
|
|
50
|
+
_starting.finally(() => { _starting = null })
|
|
51
|
+
}
|
|
57
52
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const databaseUrl = options.databaseUrl || env.DATABASE_URL || ''
|
|
53
|
+
function doStart(options: QueryBuilderOptions): Promise<void> {
|
|
54
|
+
return new Promise<void>((resolvePromise) => {
|
|
55
|
+
const env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
|
|
62
56
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
57
|
+
if (env.NODE_ENV === 'production') {
|
|
58
|
+
resolvePromise()
|
|
59
|
+
return
|
|
60
|
+
}
|
|
67
61
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
62
|
+
const cliPath = findCliPath()
|
|
63
|
+
if (!cliPath) {
|
|
64
|
+
console.warn('[query-builder] prisma-query-builder-ui not found. Install: npm install prisma-query-builder-ui')
|
|
65
|
+
resolvePromise()
|
|
66
|
+
return
|
|
67
|
+
}
|
|
75
68
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
})
|
|
69
|
+
const port = options.port || 5173
|
|
70
|
+
const host = options.host || 'localhost'
|
|
71
|
+
const schemaPath = options.schemaPath || ${schemaPath}
|
|
72
|
+
const databaseUrl = options.databaseUrl || env.DATABASE_URL || ''
|
|
91
73
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
74
|
+
if (!existsSync(schemaPath)) {
|
|
75
|
+
console.error('[query-builder] Schema file not found: ' + schemaPath)
|
|
76
|
+
resolvePromise()
|
|
77
|
+
return
|
|
78
|
+
}
|
|
96
79
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
80
|
+
let schemaContent: string
|
|
81
|
+
try {
|
|
82
|
+
schemaContent = readFileSync(schemaPath, 'utf-8')
|
|
83
|
+
} catch (err) {
|
|
84
|
+
console.error('[query-builder] Failed to read schema:', err)
|
|
85
|
+
resolvePromise()
|
|
86
|
+
return
|
|
103
87
|
}
|
|
104
|
-
})
|
|
105
88
|
|
|
106
|
-
|
|
107
|
-
|
|
89
|
+
const schemaCwd = dirname(resolve(schemaPath))
|
|
90
|
+
|
|
91
|
+
_process = spawn(process.execPath, [cliPath], {
|
|
92
|
+
stdio: 'inherit',
|
|
93
|
+
env: {
|
|
94
|
+
...env,
|
|
95
|
+
PORT: String(port),
|
|
96
|
+
HOST: host,
|
|
97
|
+
PRISMA_QUERY_BUILDER_MODE: 'embedded',
|
|
98
|
+
DISABLE_PERSISTENCE: 'true',
|
|
99
|
+
PRISMA_QUERY_BUILDER_SCHEMA_CONTENT: schemaContent,
|
|
100
|
+
PRISMA_QUERY_BUILDER_CWD: schemaCwd,
|
|
101
|
+
DATABASE_URL: databaseUrl,
|
|
102
|
+
},
|
|
103
|
+
})
|
|
108
104
|
|
|
109
|
-
|
|
110
|
-
|
|
105
|
+
_process.on('error', (err) => {
|
|
106
|
+
console.error('[query-builder] Failed to start:', err.message)
|
|
107
|
+
_process = null
|
|
108
|
+
resolvePromise()
|
|
111
109
|
})
|
|
112
110
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
111
|
+
_process.on('exit', (code) => {
|
|
112
|
+
const wasStopping = _stopping
|
|
113
|
+
_stopping = false
|
|
114
|
+
_process = null
|
|
115
|
+
if (!wasStopping && code !== 0) {
|
|
116
|
+
console.warn('[query-builder] Process exited with code ' + code)
|
|
117
|
+
}
|
|
118
|
+
})
|
|
118
119
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
process.removeListener('SIGTERM', handleSigterm)
|
|
122
|
-
process.kill(process.pid, 'SIGTERM')
|
|
123
|
-
}
|
|
120
|
+
if (!_cleanupRegistered) {
|
|
121
|
+
_cleanupRegistered = true
|
|
124
122
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
123
|
+
process.on('exit', () => {
|
|
124
|
+
stopQueryBuilder()
|
|
125
|
+
})
|
|
128
126
|
|
|
129
|
-
|
|
127
|
+
const handleSigint = () => {
|
|
128
|
+
stopQueryBuilder()
|
|
129
|
+
process.removeListener('SIGINT', handleSigint)
|
|
130
|
+
process.kill(process.pid, 'SIGINT')
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const handleSigterm = () => {
|
|
134
|
+
stopQueryBuilder()
|
|
135
|
+
process.removeListener('SIGTERM', handleSigterm)
|
|
136
|
+
process.kill(process.pid, 'SIGTERM')
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
process.on('SIGINT', handleSigint)
|
|
140
|
+
process.on('SIGTERM', handleSigterm)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
console.log('[query-builder] Starting on http://' + host + ':' + port)
|
|
144
|
+
resolvePromise()
|
|
145
|
+
})
|
|
130
146
|
}
|
|
131
147
|
|
|
132
148
|
export function stopQueryBuilder(): void {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateQueryBuilderHelper.js","sourceRoot":"","sources":["../../src/generators/generateQueryBuilderHelper.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"generateQueryBuilderHelper.js","sourceRoot":"","sources":["../../src/generators/generateQueryBuilderHelper.ts"],"names":[],"mappings":";;AAEA,gEAuJC;AAvJD,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA+DsC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkFxD,CAAA;AACD,CAAC"}
|
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
import type { RouteConfig } from '../routeConfig.js'
|
|
49
49
|
import { parseQueryParams } from '../parseQueryParams.js'
|
|
50
50
|
import { buildModelOpenApi } from '../buildModelOpenApi.js'
|
|
51
|
+
import { transformResult } from '../operationRuntime.js'
|
|
51
52
|
|
|
52
53
|
const _env = typeof process !== 'undefined' && process.env ? process.env : {} as Record<string, string | undefined>
|
|
53
54
|
|
|
@@ -69,31 +70,6 @@ function normalizePrefix(p: string): string {
|
|
|
69
70
|
return result
|
|
70
71
|
}
|
|
71
72
|
|
|
72
|
-
function transformResult(value: unknown): unknown {
|
|
73
|
-
if (value === null || value === undefined) return value
|
|
74
|
-
if (typeof value === 'bigint') return value.toString()
|
|
75
|
-
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {
|
|
76
|
-
return value.toString('base64')
|
|
77
|
-
}
|
|
78
|
-
if (value instanceof Uint8Array) {
|
|
79
|
-
let binary = ''
|
|
80
|
-
for (let i = 0; i < value.length; i++) binary += String.fromCharCode(value[i])
|
|
81
|
-
return btoa(binary)
|
|
82
|
-
}
|
|
83
|
-
if (value instanceof Date) return value
|
|
84
|
-
if (Array.isArray(value)) return value.map(transformResult)
|
|
85
|
-
if (typeof value === 'object') {
|
|
86
|
-
const proto = Object.getPrototypeOf(value)
|
|
87
|
-
if (proto !== Object.prototype && proto !== null) return value
|
|
88
|
-
const out: Record<string, unknown> = {}
|
|
89
|
-
for (const [k, v] of Object.entries(value as Record<string, unknown>)) {
|
|
90
|
-
out[k] = transformResult(v)
|
|
91
|
-
}
|
|
92
|
-
return out
|
|
93
|
-
}
|
|
94
|
-
return value
|
|
95
|
-
}
|
|
96
|
-
|
|
97
73
|
function isQueryBuilderEnabled(config: RouteConfig): boolean {
|
|
98
74
|
if (config.queryBuilder === false) return false
|
|
99
75
|
if (typeof config.queryBuilder === 'object' && config.queryBuilder.enabled === false) return false
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":";;AAEA,wDAqUC;AArUD,SAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,KAAK,EACL,kBAAkB,GAKnB;IACC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,EAAE,CAAA;IAC9C,MAAM,kBAAkB,GAAG,GAAG,SAAS,QAAQ,CAAA;IAE/C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,eAAe,EAAE,CAAC,CAAC,eAAe;QAClC,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,KAAK;QACnC,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;KACzC,CAAC,CAAC,CAAA;IAEH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CACjC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACjE,CAAA;IAED,MAAM,SAAS,GAAG,KAAK;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;KAChD,CAAC,CAAC,CAAA;IAEL,OAAO;qCAC4B,kBAAkB;;IAEnD,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;YACD,SAAS;;;;;;;;uBAQE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;;sBAEpC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6BtC,kBAAkB;;;;;;4DAMwB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAgE/D,SAAS;;;;;;;;;;;WAWT,SAAS;;;;;;;;;;;;;;kEAc8C,SAAS;;;;;;;kEAOT,SAAS;;;;;;;kEAOT,SAAS;;;;;;;kEAOT,SAAS;;;;;;;kEAOT,SAAS;;;;;;;kEAOT,SAAS;;;;;;;kEAOT,SAAS;;;;;;;kEAOT,SAAS;;;;;;;kEAOT,SAAS;;;;;;;uDAOpB,SAAS;;;;;;;uDAOT,SAAS;;;;;;;uDAOT,SAAS;;;;;;;sDAOV,SAAS;;;;;;;sDAOT,SAAS;;;;;;;sDAOT,SAAS;;;;;;;wDAOP,SAAS;;;;;;;yDAOR,SAAS;;;;;;;yDAOT,SAAS;;;;;;;;;;;;;;CAcjE,CAAA;AACD,CAAC"}
|