@visulima/prisma-dmmf-transformer 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/CHANGELOG.md +16 -0
- package/README.md +39 -55
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +30 -30
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
## @visulima/prisma-dmmf-transformer [1.0.7](https://github.com/visulima/visulima/compare/@visulima/prisma-dmmf-transformer@1.0.6...@visulima/prisma-dmmf-transformer@1.0.7) (2023-06-06)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* Add npm package provenance, see https://docs.npmjs.com/generating-provenance-statements for more info ([9e7da04](https://github.com/visulima/visulima/commit/9e7da0491584e16a806fc7575c00080f192ec15e))
|
|
7
|
+
|
|
8
|
+
## @visulima/prisma-dmmf-transformer [1.0.6](https://github.com/visulima/visulima/compare/@visulima/prisma-dmmf-transformer@1.0.5...@visulima/prisma-dmmf-transformer@1.0.6) (2023-05-25)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* chore updated the dev deps and changed the engine to allow node v20 ([892f9f2](https://github.com/visulima/visulima/commit/892f9f29f03b4704fa0199f4431400ec88bb6525))
|
|
14
|
+
* fixed all calls to radar with sonarjs, removed radar eslint package ([001aecf](https://github.com/visulima/visulima/commit/001aecf78dde134bade44f382698d52eedbd3bbe))
|
|
15
|
+
* updated package deps ([5f605aa](https://github.com/visulima/visulima/commit/5f605aab74a7c1f4cbdfe4502363e36d57716921))
|
|
16
|
+
|
|
1
17
|
## @visulima/prisma-dmmf-transformer [1.0.5](https://github.com/visulima/visulima/compare/@visulima/prisma-dmmf-transformer@1.0.4...@visulima/prisma-dmmf-transformer@1.0.5) (2023-01-25)
|
|
2
18
|
|
|
3
19
|
|
package/README.md
CHANGED
|
@@ -113,74 +113,58 @@ Into:
|
|
|
113
113
|
|
|
114
114
|
```json5
|
|
115
115
|
{
|
|
116
|
-
$schema:
|
|
116
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
117
117
|
definitions: {
|
|
118
118
|
Post: {
|
|
119
119
|
properties: {
|
|
120
|
-
id: { type:
|
|
120
|
+
id: { type: "integer" },
|
|
121
121
|
user: {
|
|
122
|
-
anyOf: [
|
|
123
|
-
{ $ref: '#/definitions/User' },
|
|
124
|
-
{ type: 'null' },
|
|
125
|
-
],
|
|
122
|
+
anyOf: [{ $ref: "#/definitions/User" }, { type: "null" }],
|
|
126
123
|
},
|
|
127
124
|
},
|
|
128
|
-
type:
|
|
125
|
+
type: "object",
|
|
129
126
|
},
|
|
130
127
|
User: {
|
|
131
128
|
properties: {
|
|
132
129
|
biography: {
|
|
133
|
-
type: [
|
|
134
|
-
'number',
|
|
135
|
-
'string',
|
|
136
|
-
'boolean',
|
|
137
|
-
'object',
|
|
138
|
-
'array',
|
|
139
|
-
'null'
|
|
140
|
-
],
|
|
130
|
+
type: ["number", "string", "boolean", "object", "array", "null"],
|
|
141
131
|
},
|
|
142
|
-
createdAt: { format:
|
|
132
|
+
createdAt: { format: "date-time", type: "string" },
|
|
143
133
|
email: {
|
|
144
|
-
description:
|
|
145
|
-
type:
|
|
134
|
+
description: "Triple Slash Comment: Will show up in JSON schema [EMAIL]",
|
|
135
|
+
type: "string",
|
|
146
136
|
},
|
|
147
|
-
id: { type:
|
|
148
|
-
is18: { type: [
|
|
149
|
-
keywords: { items: { type:
|
|
150
|
-
name: { type: [
|
|
151
|
-
number: { type:
|
|
137
|
+
id: { type: "integer" },
|
|
138
|
+
is18: { type: ["boolean", "null"] },
|
|
139
|
+
keywords: { items: { type: "string" }, type: "array" },
|
|
140
|
+
name: { type: ["string", "null"] },
|
|
141
|
+
number: { type: "integer", default: "34534535435353" },
|
|
152
142
|
bytes: {
|
|
153
|
-
description:
|
|
154
|
-
type:
|
|
143
|
+
description: "Triple Slash Inline Comment: Will show up in JSON schema [BYTES]",
|
|
144
|
+
type: "string",
|
|
155
145
|
},
|
|
156
|
-
favouriteDecimal: { type:
|
|
146
|
+
favouriteDecimal: { type: "number" },
|
|
157
147
|
posts: {
|
|
158
|
-
items: { $ref:
|
|
159
|
-
type:
|
|
148
|
+
items: { $ref: "#/definitions/Post" },
|
|
149
|
+
type: "array",
|
|
160
150
|
},
|
|
161
151
|
predecessor: {
|
|
162
|
-
anyOf: [
|
|
163
|
-
{ $ref: '#/definitions/User' },
|
|
164
|
-
{ type: 'null' },
|
|
165
|
-
],
|
|
152
|
+
anyOf: [{ $ref: "#/definitions/User" }, { type: "null" }],
|
|
166
153
|
},
|
|
167
|
-
role: { enum: [
|
|
154
|
+
role: { enum: ["USER", "ADMIN"], type: "string", default: "USER" },
|
|
168
155
|
successor: {
|
|
169
|
-
anyOf: [
|
|
170
|
-
{ $ref: '#/definitions/User' },
|
|
171
|
-
{ type: 'null' },
|
|
172
|
-
],
|
|
156
|
+
anyOf: [{ $ref: "#/definitions/User" }, { type: "null" }],
|
|
173
157
|
},
|
|
174
|
-
weight: { type: [
|
|
158
|
+
weight: { type: ["integer", "null"] },
|
|
175
159
|
},
|
|
176
|
-
type:
|
|
160
|
+
type: "object",
|
|
177
161
|
},
|
|
178
162
|
},
|
|
179
163
|
properties: {
|
|
180
|
-
post: { $ref:
|
|
181
|
-
user: { $ref:
|
|
164
|
+
post: { $ref: "#/definitions/Post" },
|
|
165
|
+
user: { $ref: "#/definitions/User" },
|
|
182
166
|
},
|
|
183
|
-
type:
|
|
167
|
+
type: "object",
|
|
184
168
|
}
|
|
185
169
|
```
|
|
186
170
|
|
|
@@ -210,39 +194,39 @@ Output:
|
|
|
210
194
|
|
|
211
195
|
```json5
|
|
212
196
|
{
|
|
213
|
-
$schema:
|
|
197
|
+
$schema: "http://json-schema.org/draft-07/schema#",
|
|
214
198
|
definitions: {
|
|
215
199
|
User: {
|
|
216
200
|
properties: {
|
|
217
|
-
id: { type:
|
|
201
|
+
id: { type: "string" },
|
|
218
202
|
photos: {
|
|
219
|
-
items: { $ref:
|
|
220
|
-
type:
|
|
203
|
+
items: { $ref: "#/definitions/Photo" },
|
|
204
|
+
type: "array",
|
|
221
205
|
},
|
|
222
206
|
},
|
|
223
|
-
type:
|
|
207
|
+
type: "object",
|
|
224
208
|
},
|
|
225
209
|
Photo: {
|
|
226
210
|
properties: {
|
|
227
211
|
height: {
|
|
228
|
-
type:
|
|
212
|
+
type: "integer",
|
|
229
213
|
default: 200,
|
|
230
214
|
},
|
|
231
215
|
width: {
|
|
232
|
-
type:
|
|
216
|
+
type: "integer",
|
|
233
217
|
default: 100,
|
|
234
218
|
},
|
|
235
219
|
url: {
|
|
236
|
-
type:
|
|
220
|
+
type: "string",
|
|
237
221
|
},
|
|
238
222
|
},
|
|
239
|
-
type:
|
|
223
|
+
type: "object",
|
|
240
224
|
},
|
|
241
225
|
},
|
|
242
226
|
properties: {
|
|
243
|
-
user: { $ref:
|
|
227
|
+
user: { $ref: "#/definitions/User" },
|
|
244
228
|
},
|
|
245
|
-
type:
|
|
229
|
+
type: "object",
|
|
246
230
|
}
|
|
247
231
|
```
|
|
248
232
|
|
|
@@ -272,5 +256,5 @@ The visulima prisma-dmmf-transformer is open-sourced software licensed under the
|
|
|
272
256
|
[typescript-url]: "typescript"
|
|
273
257
|
[license-image]: https://img.shields.io/npm/l/@visulima/prisma-dmmf-transformer?color=blueviolet&style=for-the-badge
|
|
274
258
|
[license-url]: LICENSE.md "license"
|
|
275
|
-
[npm-image]: https://img.shields.io/npm/v/@visulima/prisma-dmmf-transformer/
|
|
276
|
-
[npm-url]: https://www.npmjs.com/package/@visulima/prisma-dmmf-transformer/v/
|
|
259
|
+
[npm-image]: https://img.shields.io/npm/v/@visulima/prisma-dmmf-transformer/latest.svg?style=for-the-badge&logo=npm
|
|
260
|
+
[npm-url]: https://www.npmjs.com/package/@visulima/prisma-dmmf-transformer/v/latest "npm"
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
var S = require('assert');
|
|
4
4
|
|
|
5
|
-
function
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var S__default = /*#__PURE__*/_interopDefault(S);
|
|
8
|
+
|
|
9
|
+
function l(e){return e!=null}var f=e=>{switch(e){case"Int":case"BigInt":return "integer";case"DateTime":case"Bytes":case"String":return "string";case"Float":case"Decimal":return "number";case"Json":return ["number","string","boolean","object","array","null"];case"Boolean":return "boolean";default:throw new Error(`Unhandled discriminated union member: ${JSON.stringify(e)}`)}},D=e=>{let{isList:t,isRequired:r,kind:n,type:i}=e,a="object";return n==="scalar"&&!t?a=f(i):t?a="array":n==="enum"&&(a="string"),r||t?a:Array.isArray(a)?[...new Set([...a,"null"])]:[a,"null"]},h=e=>{let t=e.default;if(!e.hasDefaultValue)return null;if(e.kind==="enum")return typeof t=="string"?t:null;if(e.kind!=="scalar")return null;switch(e.type){case"String":case"BigInt":case"DateTime":return typeof t=="string"?t:null;case"Int":case"Float":case"Decimal":return typeof t=="number"?t:null;case"Boolean":return typeof t=="boolean"?t:null;case"Json":case"Bytes":return null;default:throw new Error(`Unhandled discriminated union member: ${JSON.stringify(e.type)}`)}},g=e=>{if(e==="DateTime")return "date-time"},d=(e,{schemaId:t,persistOriginalType:r})=>{let n=e.isRequired||e.isList;S__default.default.equal(typeof e.type,"string");let i=`#/definitions/${e.type}`,a={$ref:t?`${t}${i}`:i};return n?a:{anyOf:[a,{type:"null"}],...r&&{originalType:e.type}}},F=(e,t)=>{if(!(e.kind==="scalar"&&!e.isList||e.kind==="enum"))return e.kind==="scalar"&&e.isList?{type:f(e.type)}:d(e,t)},O=e=>e.kind!=="scalar"&&!e.isList&&e.kind!=="enum",N=e=>t=>{let r=e.enums.find(({name:n})=>n===t.type);if(r)return r.values.map(n=>n.name)},J=e=>e.documentation,T=(e,t,r)=>{let n=D(r),i=g(r.type),a=F(r,t),o=N(e)(r),p=h(r),c=J(r);return {type:n,...t.persistOriginalType&&{originalType:r.type},...l(p)&&{default:p},...l(i)&&{format:i},...l(a)&&{items:a},...l(o)&&{enum:o},...l(c)&&{description:c}}},P=(e,t)=>r=>{let n={required:r.isRequired,hasDefaultValue:r.hasDefaultValue,isScalar:r.kind==="scalar"||r.kind==="enum"},i=O(r)?d(r,t):T(e,t,r);return [r.name,i,n]},y=P;function b(e){return e.fields.flatMap(t=>t.relationFromFields??[])}var $=(e,t)=>r=>{let n=r.fields.map(y(e,t)),i=n.map(([s,m])=>[s,m]),a=b(r),o=i.filter(s=>!a.includes(s[0])),c={type:"object",properties:Object.fromEntries(t.keepRelationScalarFields==="true"?i:o)};return t.includeRequiredFields&&(c.required=n.reduce((s,[m,,u])=>(u.required&&u.isScalar&&!u.hasDefaultValue&&s.push(m),s),[])),[r.name,c]},M=$;var j=e=>e.slice(0,1).toLowerCase()+e.slice(1),k=({schemaId:e})=>t=>{let r=`#/definitions/${t.name}`;return [j(t.name),{$ref:e?`${e}${r}`:r}]},R=(e,t={})=>{let{models:r=[],enums:n=[],types:i=[]}=e.datamodel,a={$schema:"http://json-schema.org/draft-07/schema#",definitions:{},type:"object"},{schemaId:o}=t,p=r.map(M({enums:n},t)),c=i.map(M({enums:n},t)),s=r.map(k(t)),m=Object.fromEntries([...p,...c]),u=Object.fromEntries(s);return {...o?{$id:o}:null,...a,definitions:m,properties:u}},B=R;
|
|
6
10
|
|
|
7
11
|
exports.getJSONSchemaProperty = y;
|
|
8
12
|
exports.transformDMMF = B;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/properties.ts","../src/model.ts","../src/transform-dmmf.ts"],"names":["assert","isDefined","value","getJSONSchemaScalar","fieldType","getJSONSchemaType","field","isList","isRequired","kind","type","scalarFieldType","getDefaultValue","fieldDefault","getFormatByDMMFType","getJSONSchemaForPropertyReference","schemaId","persistOriginalType","notNullable","typeReference","reference","getItemsByDMMFType","transformOptions","isSingleReference","getEnumListByDMMFType","modelMetaData","enumItem","name","item","getDescription","getPropertyDefinition","format","items","enumList","defaultValue","description","getJSONSchemaProperty","propertyMetaData","property","properties_default","getRelationScalarFields","model","getJSONSchemaModel","definitionPropertiesMap","propertiesMap","definition","relationScalarFields","propertiesWithoutRelationScalars","filtered","fieldMetaData","model_default","toCamelCase","transformDmmf","dmmf","models","enums","types","initialJSON","modelDefinitionsMap","typeDefinitionsMap","modelPropertyDefinitionsMap","definitions","properties","transform_dmmf_default"],"mappings":"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","sourcesContent":["import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7, JSONSchema7TypeName } from \"json-schema\";\nimport assert from \"node:assert\";\n\nimport type {\n ModelMetaData, PrismaPrimitive, PropertyMap, PropertyMetaData, TransformOptions,\n} from \"./types.d\";\n\nfunction isDefined<T>(value: T | null | undefined): value is T {\n return value !== undefined && value !== null;\n}\n\nconst getJSONSchemaScalar = (fieldType: PrismaPrimitive): Array<JSONSchema7TypeName> | JSONSchema7TypeName => {\n switch (fieldType) {\n case \"Int\":\n case \"BigInt\": {\n return \"integer\";\n }\n case \"DateTime\":\n case \"Bytes\":\n case \"String\": {\n return \"string\";\n }\n case \"Float\":\n case \"Decimal\": {\n return \"number\";\n }\n case \"Json\": {\n return [\"number\", \"string\", \"boolean\", \"object\", \"array\", \"null\"];\n }\n case \"Boolean\": {\n return \"boolean\";\n }\n default: {\n throw new Error(`Unhandled discriminated union member: ${JSON.stringify(fieldType)}`);\n }\n }\n};\n\nconst getJSONSchemaType = (field: DMMF.Field): JSONSchema7[\"type\"] => {\n const {\n isList, isRequired, kind, type,\n } = field;\n\n let scalarFieldType: JSONSchema7[\"type\"] = \"object\";\n\n if (kind === \"scalar\" && !isList) {\n scalarFieldType = getJSONSchemaScalar(type as PrismaPrimitive);\n } else if (isList) {\n scalarFieldType = \"array\";\n } else if (kind === \"enum\") {\n scalarFieldType = \"string\";\n }\n\n if (isRequired || isList) {\n return scalarFieldType;\n }\n\n const isFieldUnion = Array.isArray(scalarFieldType);\n\n if (isFieldUnion) {\n return [...new Set([...scalarFieldType, \"null\"])] as JSONSchema7[\"type\"];\n }\n\n return [scalarFieldType as JSONSchema7TypeName, \"null\"];\n};\n\nconst getDefaultValue = (field: DMMF.Field): JSONSchema7[\"default\"] => {\n const fieldDefault = field.default;\n\n if (!field.hasDefaultValue) {\n return null;\n }\n\n if (field.kind === \"enum\") {\n return typeof fieldDefault === \"string\" ? fieldDefault : null;\n }\n\n if (field.kind !== \"scalar\") {\n return null;\n }\n\n switch (field.type) {\n case \"String\":\n case \"BigInt\":\n case \"DateTime\": {\n return typeof fieldDefault === \"string\" ? fieldDefault : null;\n }\n case \"Int\":\n case \"Float\":\n case \"Decimal\": {\n return typeof fieldDefault === \"number\" ? fieldDefault : null;\n }\n case \"Boolean\": {\n return typeof fieldDefault === \"boolean\" ? fieldDefault : null;\n }\n case \"Json\":\n case \"Bytes\": {\n return null;\n }\n default: {\n throw new Error(`Unhandled discriminated union member: ${JSON.stringify(field.type)}`);\n }\n }\n};\n\nconst getFormatByDMMFType = (fieldType: DMMF.Field[\"type\"]): string | undefined => {\n if (fieldType === \"DateTime\") {\n return \"date-time\";\n }\n\n return undefined;\n};\n\nconst getJSONSchemaForPropertyReference = (field: DMMF.Field, { schemaId, persistOriginalType }: TransformOptions): JSONSchema7 => {\n const notNullable = field.isRequired || field.isList;\n\n assert.equal(typeof field.type, \"string\");\n\n const typeReference = `#/definitions/${field.type}`;\n const reference = { $ref: schemaId ? `${schemaId}${typeReference}` : typeReference };\n\n return notNullable\n ? reference\n : {\n anyOf: [reference, { type: \"null\" }],\n ...(persistOriginalType && {\n originalType: field.type,\n }),\n };\n};\n\nconst getItemsByDMMFType = (field: DMMF.Field, transformOptions: TransformOptions): JSONSchema7[\"items\"] => {\n if ((field.kind === \"scalar\" && !field.isList) || field.kind === \"enum\") {\n return undefined;\n }\n\n if (field.kind === \"scalar\" && field.isList) {\n return { type: getJSONSchemaScalar(field.type as PrismaPrimitive) };\n }\n\n return getJSONSchemaForPropertyReference(field, transformOptions);\n};\n\nconst isSingleReference = (field: DMMF.Field) => field.kind !== \"scalar\" && !field.isList && field.kind !== \"enum\";\n\nconst getEnumListByDMMFType = (modelMetaData: ModelMetaData) => (field: DMMF.Field): string[] | undefined => {\n const enumItem = modelMetaData.enums.find(({ name }) => name === field.type);\n\n if (!enumItem) {\n return undefined;\n }\n\n return enumItem.values.map((item) => item.name);\n};\n\nconst getDescription = (field: DMMF.Field) => field.documentation;\n\nconst getPropertyDefinition = (modelMetaData: ModelMetaData, transformOptions: TransformOptions, field: DMMF.Field) => {\n const type = getJSONSchemaType(field);\n const format = getFormatByDMMFType(field.type);\n const items = getItemsByDMMFType(field, transformOptions);\n const enumList = getEnumListByDMMFType(modelMetaData)(field);\n const defaultValue = getDefaultValue(field);\n const description = getDescription(field);\n\n return {\n type,\n ...(transformOptions.persistOriginalType && {\n originalType: field.type,\n }),\n ...(isDefined(defaultValue) && { default: defaultValue }),\n ...(isDefined(format) && { format }),\n ...(isDefined(items) && { items }),\n ...(isDefined(enumList) && { enum: enumList }),\n ...(isDefined(description) && { description }),\n };\n};\n\nconst getJSONSchemaProperty = (modelMetaData: ModelMetaData, transformOptions: TransformOptions) => (field: DMMF.Field): PropertyMap => {\n const propertyMetaData: PropertyMetaData = {\n required: field.isRequired,\n hasDefaultValue: field.hasDefaultValue,\n isScalar: field.kind === \"scalar\" || field.kind === \"enum\",\n };\n\n const property = isSingleReference(field)\n ? getJSONSchemaForPropertyReference(field, transformOptions)\n : getPropertyDefinition(modelMetaData, transformOptions, field);\n\n return [field.name, property, propertyMetaData];\n};\n\nexport default getJSONSchemaProperty;\n","import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7Definition } from \"json-schema\";\n\nimport getJSONSchemaProperty from \"./properties\";\nimport type { DefinitionMap, ModelMetaData, TransformOptions } from \"./types.d\";\n\nfunction getRelationScalarFields(model: DMMF.Model): string[] {\n return model.fields.flatMap((field) => field.relationFromFields ?? []);\n}\n\nconst getJSONSchemaModel = (modelMetaData: ModelMetaData, transformOptions: TransformOptions) => (model: DMMF.Model): DefinitionMap => {\n const definitionPropertiesMap = model.fields.map(getJSONSchemaProperty(modelMetaData, transformOptions));\n\n const propertiesMap = definitionPropertiesMap.map(([name, definition]) => [name, definition] as DefinitionMap);\n const relationScalarFields = getRelationScalarFields(model);\n const propertiesWithoutRelationScalars = propertiesMap.filter((property) => !relationScalarFields.includes(property[0]));\n\n const properties = Object.fromEntries(transformOptions.keepRelationScalarFields === \"true\" ? propertiesMap : propertiesWithoutRelationScalars);\n\n const definition: JSONSchema7Definition = {\n type: \"object\",\n properties,\n };\n\n if (transformOptions.includeRequiredFields) {\n definition.required = definitionPropertiesMap.reduce((filtered: string[], [name, , fieldMetaData]) => {\n if (fieldMetaData.required && fieldMetaData.isScalar && !fieldMetaData.hasDefaultValue) {\n filtered.push(name);\n }\n return filtered;\n }, []);\n }\n\n return [model.name, definition];\n};\n\nexport default getJSONSchemaModel;\n","import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7, JSONSchema7Definition } from \"json-schema\";\n\nimport getJSONSchemaModel from \"./model\";\nimport type { TransformOptions } from \"./types.d\";\n\nconst toCamelCase = (name: string): string => name.slice(0, 1).toLowerCase() + name.slice(1);\n\nconst getPropertyDefinition = ({ schemaId }: TransformOptions) => (model: DMMF.Model): [name: string, reference: JSONSchema7Definition] => {\n const reference = `#/definitions/${model.name}`;\n\n return [\n toCamelCase(model.name),\n {\n $ref: schemaId ? `${schemaId}${reference}` : reference,\n },\n ];\n};\n\nconst transformDmmf = (dmmf: DMMF.Document, transformOptions: TransformOptions = {}): JSONSchema7 => {\n // TODO: Remove default values as soon as prisma version < 3.10.0 doesn't have to be supported anymore\n const { models = [], enums = [], types = [] } = dmmf.datamodel;\n const initialJSON = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n definitions: {},\n type: \"object\",\n } as JSONSchema7;\n const { schemaId } = transformOptions;\n\n const modelDefinitionsMap = models.map(getJSONSchemaModel({ enums }, transformOptions));\n const typeDefinitionsMap = types.map(getJSONSchemaModel({ enums }, transformOptions));\n const modelPropertyDefinitionsMap = models.map(getPropertyDefinition(transformOptions));\n const definitions = Object.fromEntries([...modelDefinitionsMap, ...typeDefinitionsMap]);\n const properties = Object.fromEntries(modelPropertyDefinitionsMap);\n\n return {\n ...(schemaId ? { $id: schemaId } : null),\n ...initialJSON,\n definitions,\n properties,\n };\n};\n\nexport default transformDmmf;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/properties.ts","../src/model.ts","../src/transform-dmmf.ts"],"names":["assert","isDefined","value","getJSONSchemaScalar","fieldType","getJSONSchemaType","field","isList","isRequired","kind","type","scalarFieldType","getDefaultValue","fieldDefault","getFormatByDMMFType","getJSONSchemaForPropertyReference","schemaId","persistOriginalType","notNullable","typeReference","reference","getItemsByDMMFType","transformOptions","isSingleReference","getEnumListByDMMFType","modelMetaData","enumItem","name","item","getDescription","getPropertyDefinition","format","items","enumList","defaultValue","description","getJSONSchemaProperty","propertyMetaData","property","properties_default","getRelationScalarFields","model","getJSONSchemaModel","definitionPropertiesMap","propertiesMap","definition","relationScalarFields","propertiesWithoutRelationScalars","filtered","fieldMetaData","model_default","toCamelCase","transformDmmf","dmmf","models","enums","types","initialJSON","modelDefinitionsMap","typeDefinitionsMap","modelPropertyDefinitionsMap","definitions","properties","transform_dmmf_default"],"mappings":"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","sourcesContent":["import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7, JSONSchema7TypeName } from \"json-schema\";\nimport assert from \"node:assert\";\n\nimport type {\n ModelMetaData, PrismaPrimitive, PropertyMap, PropertyMetaData, TransformOptions,\n} from \"./types.d\";\n\nfunction isDefined<T>(value: T | null | undefined): value is T {\n return value !== undefined && value !== null;\n}\n\nconst getJSONSchemaScalar = (fieldType: PrismaPrimitive): Array<JSONSchema7TypeName> | JSONSchema7TypeName => {\n switch (fieldType) {\n case \"Int\":\n case \"BigInt\": {\n return \"integer\";\n }\n case \"DateTime\":\n case \"Bytes\":\n case \"String\": {\n return \"string\";\n }\n case \"Float\":\n case \"Decimal\": {\n return \"number\";\n }\n case \"Json\": {\n return [\"number\", \"string\", \"boolean\", \"object\", \"array\", \"null\"];\n }\n case \"Boolean\": {\n return \"boolean\";\n }\n default: {\n throw new Error(`Unhandled discriminated union member: ${JSON.stringify(fieldType)}`);\n }\n }\n};\n\nconst getJSONSchemaType = (field: DMMF.Field): JSONSchema7[\"type\"] => {\n const {\n isList, isRequired, kind, type,\n } = field;\n\n let scalarFieldType: JSONSchema7[\"type\"] = \"object\";\n\n if (kind === \"scalar\" && !isList) {\n scalarFieldType = getJSONSchemaScalar(type as PrismaPrimitive);\n } else if (isList) {\n scalarFieldType = \"array\";\n } else if (kind === \"enum\") {\n scalarFieldType = \"string\";\n }\n\n if (isRequired || isList) {\n return scalarFieldType;\n }\n\n const isFieldUnion = Array.isArray(scalarFieldType);\n\n if (isFieldUnion) {\n return [...new Set([...scalarFieldType, \"null\"])] as JSONSchema7[\"type\"];\n }\n\n return [scalarFieldType as JSONSchema7TypeName, \"null\"];\n};\n\nconst getDefaultValue = (field: DMMF.Field): JSONSchema7[\"default\"] => {\n const fieldDefault = field.default;\n\n if (!field.hasDefaultValue) {\n return null;\n }\n\n if (field.kind === \"enum\") {\n return typeof fieldDefault === \"string\" ? fieldDefault : null;\n }\n\n if (field.kind !== \"scalar\") {\n return null;\n }\n\n switch (field.type) {\n case \"String\":\n case \"BigInt\":\n case \"DateTime\": {\n return typeof fieldDefault === \"string\" ? fieldDefault : null;\n }\n case \"Int\":\n case \"Float\":\n case \"Decimal\": {\n return typeof fieldDefault === \"number\" ? fieldDefault : null;\n }\n case \"Boolean\": {\n return typeof fieldDefault === \"boolean\" ? fieldDefault : null;\n }\n case \"Json\":\n case \"Bytes\": {\n return null;\n }\n default: {\n throw new Error(`Unhandled discriminated union member: ${JSON.stringify(field.type)}`);\n }\n }\n};\n\nconst getFormatByDMMFType = (fieldType: DMMF.Field[\"type\"]): string | undefined => {\n if (fieldType === \"DateTime\") {\n return \"date-time\";\n }\n\n return undefined;\n};\n\nconst getJSONSchemaForPropertyReference = (field: DMMF.Field, { schemaId, persistOriginalType }: TransformOptions): JSONSchema7 => {\n const notNullable = field.isRequired || field.isList;\n\n assert.equal(typeof field.type, \"string\");\n\n const typeReference = `#/definitions/${field.type}`;\n const reference = { $ref: schemaId ? `${schemaId}${typeReference}` : typeReference };\n\n return notNullable\n ? reference\n : {\n anyOf: [reference, { type: \"null\" }],\n ...(persistOriginalType && {\n originalType: field.type,\n }),\n };\n};\n\nconst getItemsByDMMFType = (field: DMMF.Field, transformOptions: TransformOptions): JSONSchema7[\"items\"] => {\n if ((field.kind === \"scalar\" && !field.isList) || field.kind === \"enum\") {\n return undefined;\n }\n\n if (field.kind === \"scalar\" && field.isList) {\n return { type: getJSONSchemaScalar(field.type as PrismaPrimitive) };\n }\n\n return getJSONSchemaForPropertyReference(field, transformOptions);\n};\n\nconst isSingleReference = (field: DMMF.Field) => field.kind !== \"scalar\" && !field.isList && field.kind !== \"enum\";\n\nconst getEnumListByDMMFType = (modelMetaData: ModelMetaData) => (field: DMMF.Field): string[] | undefined => {\n const enumItem = modelMetaData.enums.find(({ name }) => name === field.type);\n\n if (!enumItem) {\n return undefined;\n }\n\n return enumItem.values.map((item) => item.name);\n};\n\nconst getDescription = (field: DMMF.Field) => field.documentation;\n\nconst getPropertyDefinition = (modelMetaData: ModelMetaData, transformOptions: TransformOptions, field: DMMF.Field) => {\n const type = getJSONSchemaType(field);\n const format = getFormatByDMMFType(field.type);\n const items = getItemsByDMMFType(field, transformOptions);\n const enumList = getEnumListByDMMFType(modelMetaData)(field);\n const defaultValue = getDefaultValue(field);\n const description = getDescription(field);\n\n return {\n type,\n ...(transformOptions.persistOriginalType && {\n originalType: field.type,\n }),\n ...(isDefined(defaultValue) && { default: defaultValue }),\n ...(isDefined(format) && { format }),\n ...(isDefined(items) && { items }),\n ...(isDefined(enumList) && { enum: enumList }),\n ...(isDefined(description) && { description }),\n };\n};\n\nconst getJSONSchemaProperty = (modelMetaData: ModelMetaData, transformOptions: TransformOptions) => (field: DMMF.Field): PropertyMap => {\n const propertyMetaData: PropertyMetaData = {\n required: field.isRequired,\n hasDefaultValue: field.hasDefaultValue,\n isScalar: field.kind === \"scalar\" || field.kind === \"enum\",\n };\n\n const property = isSingleReference(field)\n ? getJSONSchemaForPropertyReference(field, transformOptions)\n : getPropertyDefinition(modelMetaData, transformOptions, field);\n\n return [field.name, property, propertyMetaData];\n};\n\nexport default getJSONSchemaProperty;\n","import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7Definition } from \"json-schema\";\n\nimport getJSONSchemaProperty from \"./properties\";\nimport type { DefinitionMap, ModelMetaData, TransformOptions } from \"./types.d\";\n\nfunction getRelationScalarFields(model: DMMF.Model): string[] {\n return model.fields.flatMap((field) => field.relationFromFields ?? []);\n}\n\nconst getJSONSchemaModel = (modelMetaData: ModelMetaData, transformOptions: TransformOptions) => (model: DMMF.Model): DefinitionMap => {\n const definitionPropertiesMap = model.fields.map(getJSONSchemaProperty(modelMetaData, transformOptions));\n\n const propertiesMap = definitionPropertiesMap.map(([name, definition]) => [name, definition] as DefinitionMap);\n const relationScalarFields = getRelationScalarFields(model);\n const propertiesWithoutRelationScalars = propertiesMap.filter((property) => !relationScalarFields.includes(property[0]));\n\n const properties = Object.fromEntries(transformOptions.keepRelationScalarFields === \"true\" ? propertiesMap : propertiesWithoutRelationScalars);\n\n const definition: JSONSchema7Definition = {\n type: \"object\",\n properties,\n };\n\n if (transformOptions.includeRequiredFields) {\n definition.required = definitionPropertiesMap.reduce((filtered: string[], [name, , fieldMetaData]) => {\n if (fieldMetaData.required && fieldMetaData.isScalar && !fieldMetaData.hasDefaultValue) {\n filtered.push(name);\n }\n return filtered;\n }, []);\n }\n\n return [model.name, definition];\n};\n\nexport default getJSONSchemaModel;\n","import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7, JSONSchema7Definition } from \"json-schema\";\n\nimport getJSONSchemaModel from \"./model\";\nimport type { TransformOptions } from \"./types.d\";\n\nconst toCamelCase = (name: string): string => name.slice(0, 1).toLowerCase() + name.slice(1);\n\nconst getPropertyDefinition = ({ schemaId }: TransformOptions) => (model: DMMF.Model): [name: string, reference: JSONSchema7Definition] => {\n const reference = `#/definitions/${model.name}`;\n\n return [\n toCamelCase(model.name),\n {\n $ref: schemaId ? `${schemaId}${reference}` : reference,\n },\n ];\n};\n\nconst transformDmmf = (dmmf: DMMF.Document, transformOptions: TransformOptions = {}): JSONSchema7 => {\n // TODO: Remove default values as soon as prisma version < 3.10.0 doesn't have to be supported anymore\n const { models = [], enums = [], types = [] } = dmmf.datamodel;\n const initialJSON = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n definitions: {},\n type: \"object\",\n } as JSONSchema7;\n const { schemaId } = transformOptions;\n\n const modelDefinitionsMap = models.map(getJSONSchemaModel({ enums }, transformOptions));\n const typeDefinitionsMap = types.map(getJSONSchemaModel({ enums }, transformOptions));\n const modelPropertyDefinitionsMap = models.map(getPropertyDefinition(transformOptions));\n const definitions = Object.fromEntries([...modelDefinitionsMap, ...typeDefinitionsMap]);\n const properties = Object.fromEntries(modelPropertyDefinitionsMap);\n\n return {\n ...(schemaId ? { $id: schemaId } : null),\n ...initialJSON,\n definitions,\n properties,\n };\n};\n\nexport default transformDmmf;\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import S from 'assert';
|
|
2
2
|
|
|
3
|
-
function l(e){return e!=null}var f=e=>{switch(e){case"Int":case"BigInt":return "integer";case"DateTime":case"Bytes":case"String":return "string";case"Float":case"Decimal":return "number";case"Json":return ["number","string","boolean","object","array","null"];case"Boolean":return "boolean";default:throw new Error(`Unhandled discriminated union member: ${JSON.stringify(e)}`)}},D=e=>{let{isList:t,isRequired:r,kind:n,type:i}=e,a="object";return n==="scalar"&&!t?a=f(i):t?a="array":n==="enum"&&(a="string"),r||t?a:Array.isArray(a)?[...new Set([...a,"null"])]:[a,"null"]},h=e=>{let t=e.default;if(!e.hasDefaultValue)return null;if(e.kind==="enum")return typeof t=="string"?t:null;if(e.kind!=="scalar")return null;switch(e.type){case"String":case"BigInt":case"DateTime":return typeof t=="string"?t:null;case"Int":case"Float":case"Decimal":return typeof t=="number"?t:null;case"Boolean":return typeof t=="boolean"?t:null;case"Json":case"Bytes":return null;default:throw new Error(`Unhandled discriminated union member: ${JSON.stringify(e.type)}`)}},g=e=>{if(e==="DateTime")return "date-time"},d=(e,{schemaId:t,persistOriginalType:r})=>{let n=e.isRequired||e.isList;S.equal(typeof e.type,"string");let i=`#/definitions/${e.type}`,a={$ref:t?`${t}${i}`:i};return n?a:{anyOf:[a,{type:"null"}],...r&&{originalType:e.type}}},F=(e,t)=>{if(!(e.kind==="scalar"&&!e.isList||e.kind==="enum"))return e.kind==="scalar"&&e.isList?{type:f(e.type)}:d(e,t)},O=e=>e.kind!=="scalar"&&!e.isList&&e.kind!=="enum",N=e=>t=>{let r=e.enums.find(({name:n})=>n===t.type);if(
|
|
3
|
+
function l(e){return e!=null}var f=e=>{switch(e){case"Int":case"BigInt":return "integer";case"DateTime":case"Bytes":case"String":return "string";case"Float":case"Decimal":return "number";case"Json":return ["number","string","boolean","object","array","null"];case"Boolean":return "boolean";default:throw new Error(`Unhandled discriminated union member: ${JSON.stringify(e)}`)}},D=e=>{let{isList:t,isRequired:r,kind:n,type:i}=e,a="object";return n==="scalar"&&!t?a=f(i):t?a="array":n==="enum"&&(a="string"),r||t?a:Array.isArray(a)?[...new Set([...a,"null"])]:[a,"null"]},h=e=>{let t=e.default;if(!e.hasDefaultValue)return null;if(e.kind==="enum")return typeof t=="string"?t:null;if(e.kind!=="scalar")return null;switch(e.type){case"String":case"BigInt":case"DateTime":return typeof t=="string"?t:null;case"Int":case"Float":case"Decimal":return typeof t=="number"?t:null;case"Boolean":return typeof t=="boolean"?t:null;case"Json":case"Bytes":return null;default:throw new Error(`Unhandled discriminated union member: ${JSON.stringify(e.type)}`)}},g=e=>{if(e==="DateTime")return "date-time"},d=(e,{schemaId:t,persistOriginalType:r})=>{let n=e.isRequired||e.isList;S.equal(typeof e.type,"string");let i=`#/definitions/${e.type}`,a={$ref:t?`${t}${i}`:i};return n?a:{anyOf:[a,{type:"null"}],...r&&{originalType:e.type}}},F=(e,t)=>{if(!(e.kind==="scalar"&&!e.isList||e.kind==="enum"))return e.kind==="scalar"&&e.isList?{type:f(e.type)}:d(e,t)},O=e=>e.kind!=="scalar"&&!e.isList&&e.kind!=="enum",N=e=>t=>{let r=e.enums.find(({name:n})=>n===t.type);if(r)return r.values.map(n=>n.name)},J=e=>e.documentation,T=(e,t,r)=>{let n=D(r),i=g(r.type),a=F(r,t),o=N(e)(r),p=h(r),c=J(r);return {type:n,...t.persistOriginalType&&{originalType:r.type},...l(p)&&{default:p},...l(i)&&{format:i},...l(a)&&{items:a},...l(o)&&{enum:o},...l(c)&&{description:c}}},P=(e,t)=>r=>{let n={required:r.isRequired,hasDefaultValue:r.hasDefaultValue,isScalar:r.kind==="scalar"||r.kind==="enum"},i=O(r)?d(r,t):T(e,t,r);return [r.name,i,n]},y=P;function b(e){return e.fields.flatMap(t=>t.relationFromFields??[])}var $=(e,t)=>r=>{let n=r.fields.map(y(e,t)),i=n.map(([s,m])=>[s,m]),a=b(r),o=i.filter(s=>!a.includes(s[0])),c={type:"object",properties:Object.fromEntries(t.keepRelationScalarFields==="true"?i:o)};return t.includeRequiredFields&&(c.required=n.reduce((s,[m,,u])=>(u.required&&u.isScalar&&!u.hasDefaultValue&&s.push(m),s),[])),[r.name,c]},M=$;var j=e=>e.slice(0,1).toLowerCase()+e.slice(1),k=({schemaId:e})=>t=>{let r=`#/definitions/${t.name}`;return [j(t.name),{$ref:e?`${e}${r}`:r}]},R=(e,t={})=>{let{models:r=[],enums:n=[],types:i=[]}=e.datamodel,a={$schema:"http://json-schema.org/draft-07/schema#",definitions:{},type:"object"},{schemaId:o}=t,p=r.map(M({enums:n},t)),c=i.map(M({enums:n},t)),s=r.map(k(t)),m=Object.fromEntries([...p,...c]),u=Object.fromEntries(s);return {...o?{$id:o}:null,...a,definitions:m,properties:u}},B=R;
|
|
4
4
|
|
|
5
5
|
export { y as getJSONSchemaProperty, B as transformDMMF };
|
|
6
6
|
//# sourceMappingURL=out.js.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/properties.ts","../src/model.ts","../src/transform-dmmf.ts"],"names":["assert","isDefined","value","getJSONSchemaScalar","fieldType","getJSONSchemaType","field","isList","isRequired","kind","type","scalarFieldType","getDefaultValue","fieldDefault","getFormatByDMMFType","getJSONSchemaForPropertyReference","schemaId","persistOriginalType","notNullable","typeReference","reference","getItemsByDMMFType","transformOptions","isSingleReference","getEnumListByDMMFType","modelMetaData","enumItem","name","item","getDescription","getPropertyDefinition","format","items","enumList","defaultValue","description","getJSONSchemaProperty","propertyMetaData","property","properties_default","getRelationScalarFields","model","getJSONSchemaModel","definitionPropertiesMap","propertiesMap","definition","relationScalarFields","propertiesWithoutRelationScalars","filtered","fieldMetaData","model_default","toCamelCase","transformDmmf","dmmf","models","enums","types","initialJSON","modelDefinitionsMap","typeDefinitionsMap","modelPropertyDefinitionsMap","definitions","properties","transform_dmmf_default"],"mappings":"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","sourcesContent":["import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7, JSONSchema7TypeName } from \"json-schema\";\nimport assert from \"node:assert\";\n\nimport type {\n ModelMetaData, PrismaPrimitive, PropertyMap, PropertyMetaData, TransformOptions,\n} from \"./types.d\";\n\nfunction isDefined<T>(value: T | null | undefined): value is T {\n return value !== undefined && value !== null;\n}\n\nconst getJSONSchemaScalar = (fieldType: PrismaPrimitive): Array<JSONSchema7TypeName> | JSONSchema7TypeName => {\n switch (fieldType) {\n case \"Int\":\n case \"BigInt\": {\n return \"integer\";\n }\n case \"DateTime\":\n case \"Bytes\":\n case \"String\": {\n return \"string\";\n }\n case \"Float\":\n case \"Decimal\": {\n return \"number\";\n }\n case \"Json\": {\n return [\"number\", \"string\", \"boolean\", \"object\", \"array\", \"null\"];\n }\n case \"Boolean\": {\n return \"boolean\";\n }\n default: {\n throw new Error(`Unhandled discriminated union member: ${JSON.stringify(fieldType)}`);\n }\n }\n};\n\nconst getJSONSchemaType = (field: DMMF.Field): JSONSchema7[\"type\"] => {\n const {\n isList, isRequired, kind, type,\n } = field;\n\n let scalarFieldType: JSONSchema7[\"type\"] = \"object\";\n\n if (kind === \"scalar\" && !isList) {\n scalarFieldType = getJSONSchemaScalar(type as PrismaPrimitive);\n } else if (isList) {\n scalarFieldType = \"array\";\n } else if (kind === \"enum\") {\n scalarFieldType = \"string\";\n }\n\n if (isRequired || isList) {\n return scalarFieldType;\n }\n\n const isFieldUnion = Array.isArray(scalarFieldType);\n\n if (isFieldUnion) {\n return [...new Set([...scalarFieldType, \"null\"])] as JSONSchema7[\"type\"];\n }\n\n return [scalarFieldType as JSONSchema7TypeName, \"null\"];\n};\n\nconst getDefaultValue = (field: DMMF.Field): JSONSchema7[\"default\"] => {\n const fieldDefault = field.default;\n\n if (!field.hasDefaultValue) {\n return null;\n }\n\n if (field.kind === \"enum\") {\n return typeof fieldDefault === \"string\" ? fieldDefault : null;\n }\n\n if (field.kind !== \"scalar\") {\n return null;\n }\n\n switch (field.type) {\n case \"String\":\n case \"BigInt\":\n case \"DateTime\": {\n return typeof fieldDefault === \"string\" ? fieldDefault : null;\n }\n case \"Int\":\n case \"Float\":\n case \"Decimal\": {\n return typeof fieldDefault === \"number\" ? fieldDefault : null;\n }\n case \"Boolean\": {\n return typeof fieldDefault === \"boolean\" ? fieldDefault : null;\n }\n case \"Json\":\n case \"Bytes\": {\n return null;\n }\n default: {\n throw new Error(`Unhandled discriminated union member: ${JSON.stringify(field.type)}`);\n }\n }\n};\n\nconst getFormatByDMMFType = (fieldType: DMMF.Field[\"type\"]): string | undefined => {\n if (fieldType === \"DateTime\") {\n return \"date-time\";\n }\n\n return undefined;\n};\n\nconst getJSONSchemaForPropertyReference = (field: DMMF.Field, { schemaId, persistOriginalType }: TransformOptions): JSONSchema7 => {\n const notNullable = field.isRequired || field.isList;\n\n assert.equal(typeof field.type, \"string\");\n\n const typeReference = `#/definitions/${field.type}`;\n const reference = { $ref: schemaId ? `${schemaId}${typeReference}` : typeReference };\n\n return notNullable\n ? reference\n : {\n anyOf: [reference, { type: \"null\" }],\n ...(persistOriginalType && {\n originalType: field.type,\n }),\n };\n};\n\nconst getItemsByDMMFType = (field: DMMF.Field, transformOptions: TransformOptions): JSONSchema7[\"items\"] => {\n if ((field.kind === \"scalar\" && !field.isList) || field.kind === \"enum\") {\n return undefined;\n }\n\n if (field.kind === \"scalar\" && field.isList) {\n return { type: getJSONSchemaScalar(field.type as PrismaPrimitive) };\n }\n\n return getJSONSchemaForPropertyReference(field, transformOptions);\n};\n\nconst isSingleReference = (field: DMMF.Field) => field.kind !== \"scalar\" && !field.isList && field.kind !== \"enum\";\n\nconst getEnumListByDMMFType = (modelMetaData: ModelMetaData) => (field: DMMF.Field): string[] | undefined => {\n const enumItem = modelMetaData.enums.find(({ name }) => name === field.type);\n\n if (!enumItem) {\n return undefined;\n }\n\n return enumItem.values.map((item) => item.name);\n};\n\nconst getDescription = (field: DMMF.Field) => field.documentation;\n\nconst getPropertyDefinition = (modelMetaData: ModelMetaData, transformOptions: TransformOptions, field: DMMF.Field) => {\n const type = getJSONSchemaType(field);\n const format = getFormatByDMMFType(field.type);\n const items = getItemsByDMMFType(field, transformOptions);\n const enumList = getEnumListByDMMFType(modelMetaData)(field);\n const defaultValue = getDefaultValue(field);\n const description = getDescription(field);\n\n return {\n type,\n ...(transformOptions.persistOriginalType && {\n originalType: field.type,\n }),\n ...(isDefined(defaultValue) && { default: defaultValue }),\n ...(isDefined(format) && { format }),\n ...(isDefined(items) && { items }),\n ...(isDefined(enumList) && { enum: enumList }),\n ...(isDefined(description) && { description }),\n };\n};\n\nconst getJSONSchemaProperty = (modelMetaData: ModelMetaData, transformOptions: TransformOptions) => (field: DMMF.Field): PropertyMap => {\n const propertyMetaData: PropertyMetaData = {\n required: field.isRequired,\n hasDefaultValue: field.hasDefaultValue,\n isScalar: field.kind === \"scalar\" || field.kind === \"enum\",\n };\n\n const property = isSingleReference(field)\n ? getJSONSchemaForPropertyReference(field, transformOptions)\n : getPropertyDefinition(modelMetaData, transformOptions, field);\n\n return [field.name, property, propertyMetaData];\n};\n\nexport default getJSONSchemaProperty;\n","import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7Definition } from \"json-schema\";\n\nimport getJSONSchemaProperty from \"./properties\";\nimport type { DefinitionMap, ModelMetaData, TransformOptions } from \"./types.d\";\n\nfunction getRelationScalarFields(model: DMMF.Model): string[] {\n return model.fields.flatMap((field) => field.relationFromFields ?? []);\n}\n\nconst getJSONSchemaModel = (modelMetaData: ModelMetaData, transformOptions: TransformOptions) => (model: DMMF.Model): DefinitionMap => {\n const definitionPropertiesMap = model.fields.map(getJSONSchemaProperty(modelMetaData, transformOptions));\n\n const propertiesMap = definitionPropertiesMap.map(([name, definition]) => [name, definition] as DefinitionMap);\n const relationScalarFields = getRelationScalarFields(model);\n const propertiesWithoutRelationScalars = propertiesMap.filter((property) => !relationScalarFields.includes(property[0]));\n\n const properties = Object.fromEntries(transformOptions.keepRelationScalarFields === \"true\" ? propertiesMap : propertiesWithoutRelationScalars);\n\n const definition: JSONSchema7Definition = {\n type: \"object\",\n properties,\n };\n\n if (transformOptions.includeRequiredFields) {\n definition.required = definitionPropertiesMap.reduce((filtered: string[], [name, , fieldMetaData]) => {\n if (fieldMetaData.required && fieldMetaData.isScalar && !fieldMetaData.hasDefaultValue) {\n filtered.push(name);\n }\n return filtered;\n }, []);\n }\n\n return [model.name, definition];\n};\n\nexport default getJSONSchemaModel;\n","import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7, JSONSchema7Definition } from \"json-schema\";\n\nimport getJSONSchemaModel from \"./model\";\nimport type { TransformOptions } from \"./types.d\";\n\nconst toCamelCase = (name: string): string => name.slice(0, 1).toLowerCase() + name.slice(1);\n\nconst getPropertyDefinition = ({ schemaId }: TransformOptions) => (model: DMMF.Model): [name: string, reference: JSONSchema7Definition] => {\n const reference = `#/definitions/${model.name}`;\n\n return [\n toCamelCase(model.name),\n {\n $ref: schemaId ? `${schemaId}${reference}` : reference,\n },\n ];\n};\n\nconst transformDmmf = (dmmf: DMMF.Document, transformOptions: TransformOptions = {}): JSONSchema7 => {\n // TODO: Remove default values as soon as prisma version < 3.10.0 doesn't have to be supported anymore\n const { models = [], enums = [], types = [] } = dmmf.datamodel;\n const initialJSON = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n definitions: {},\n type: \"object\",\n } as JSONSchema7;\n const { schemaId } = transformOptions;\n\n const modelDefinitionsMap = models.map(getJSONSchemaModel({ enums }, transformOptions));\n const typeDefinitionsMap = types.map(getJSONSchemaModel({ enums }, transformOptions));\n const modelPropertyDefinitionsMap = models.map(getPropertyDefinition(transformOptions));\n const definitions = Object.fromEntries([...modelDefinitionsMap, ...typeDefinitionsMap]);\n const properties = Object.fromEntries(modelPropertyDefinitionsMap);\n\n return {\n ...(schemaId ? { $id: schemaId } : null),\n ...initialJSON,\n definitions,\n properties,\n };\n};\n\nexport default transformDmmf;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/properties.ts","../src/model.ts","../src/transform-dmmf.ts"],"names":["assert","isDefined","value","getJSONSchemaScalar","fieldType","getJSONSchemaType","field","isList","isRequired","kind","type","scalarFieldType","getDefaultValue","fieldDefault","getFormatByDMMFType","getJSONSchemaForPropertyReference","schemaId","persistOriginalType","notNullable","typeReference","reference","getItemsByDMMFType","transformOptions","isSingleReference","getEnumListByDMMFType","modelMetaData","enumItem","name","item","getDescription","getPropertyDefinition","format","items","enumList","defaultValue","description","getJSONSchemaProperty","propertyMetaData","property","properties_default","getRelationScalarFields","model","getJSONSchemaModel","definitionPropertiesMap","propertiesMap","definition","relationScalarFields","propertiesWithoutRelationScalars","filtered","fieldMetaData","model_default","toCamelCase","transformDmmf","dmmf","models","enums","types","initialJSON","modelDefinitionsMap","typeDefinitionsMap","modelPropertyDefinitionsMap","definitions","properties","transform_dmmf_default"],"mappings":"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","sourcesContent":["import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7, JSONSchema7TypeName } from \"json-schema\";\nimport assert from \"node:assert\";\n\nimport type {\n ModelMetaData, PrismaPrimitive, PropertyMap, PropertyMetaData, TransformOptions,\n} from \"./types.d\";\n\nfunction isDefined<T>(value: T | null | undefined): value is T {\n return value !== undefined && value !== null;\n}\n\nconst getJSONSchemaScalar = (fieldType: PrismaPrimitive): Array<JSONSchema7TypeName> | JSONSchema7TypeName => {\n switch (fieldType) {\n case \"Int\":\n case \"BigInt\": {\n return \"integer\";\n }\n case \"DateTime\":\n case \"Bytes\":\n case \"String\": {\n return \"string\";\n }\n case \"Float\":\n case \"Decimal\": {\n return \"number\";\n }\n case \"Json\": {\n return [\"number\", \"string\", \"boolean\", \"object\", \"array\", \"null\"];\n }\n case \"Boolean\": {\n return \"boolean\";\n }\n default: {\n throw new Error(`Unhandled discriminated union member: ${JSON.stringify(fieldType)}`);\n }\n }\n};\n\nconst getJSONSchemaType = (field: DMMF.Field): JSONSchema7[\"type\"] => {\n const {\n isList, isRequired, kind, type,\n } = field;\n\n let scalarFieldType: JSONSchema7[\"type\"] = \"object\";\n\n if (kind === \"scalar\" && !isList) {\n scalarFieldType = getJSONSchemaScalar(type as PrismaPrimitive);\n } else if (isList) {\n scalarFieldType = \"array\";\n } else if (kind === \"enum\") {\n scalarFieldType = \"string\";\n }\n\n if (isRequired || isList) {\n return scalarFieldType;\n }\n\n const isFieldUnion = Array.isArray(scalarFieldType);\n\n if (isFieldUnion) {\n return [...new Set([...scalarFieldType, \"null\"])] as JSONSchema7[\"type\"];\n }\n\n return [scalarFieldType as JSONSchema7TypeName, \"null\"];\n};\n\nconst getDefaultValue = (field: DMMF.Field): JSONSchema7[\"default\"] => {\n const fieldDefault = field.default;\n\n if (!field.hasDefaultValue) {\n return null;\n }\n\n if (field.kind === \"enum\") {\n return typeof fieldDefault === \"string\" ? fieldDefault : null;\n }\n\n if (field.kind !== \"scalar\") {\n return null;\n }\n\n switch (field.type) {\n case \"String\":\n case \"BigInt\":\n case \"DateTime\": {\n return typeof fieldDefault === \"string\" ? fieldDefault : null;\n }\n case \"Int\":\n case \"Float\":\n case \"Decimal\": {\n return typeof fieldDefault === \"number\" ? fieldDefault : null;\n }\n case \"Boolean\": {\n return typeof fieldDefault === \"boolean\" ? fieldDefault : null;\n }\n case \"Json\":\n case \"Bytes\": {\n return null;\n }\n default: {\n throw new Error(`Unhandled discriminated union member: ${JSON.stringify(field.type)}`);\n }\n }\n};\n\nconst getFormatByDMMFType = (fieldType: DMMF.Field[\"type\"]): string | undefined => {\n if (fieldType === \"DateTime\") {\n return \"date-time\";\n }\n\n return undefined;\n};\n\nconst getJSONSchemaForPropertyReference = (field: DMMF.Field, { schemaId, persistOriginalType }: TransformOptions): JSONSchema7 => {\n const notNullable = field.isRequired || field.isList;\n\n assert.equal(typeof field.type, \"string\");\n\n const typeReference = `#/definitions/${field.type}`;\n const reference = { $ref: schemaId ? `${schemaId}${typeReference}` : typeReference };\n\n return notNullable\n ? reference\n : {\n anyOf: [reference, { type: \"null\" }],\n ...(persistOriginalType && {\n originalType: field.type,\n }),\n };\n};\n\nconst getItemsByDMMFType = (field: DMMF.Field, transformOptions: TransformOptions): JSONSchema7[\"items\"] => {\n if ((field.kind === \"scalar\" && !field.isList) || field.kind === \"enum\") {\n return undefined;\n }\n\n if (field.kind === \"scalar\" && field.isList) {\n return { type: getJSONSchemaScalar(field.type as PrismaPrimitive) };\n }\n\n return getJSONSchemaForPropertyReference(field, transformOptions);\n};\n\nconst isSingleReference = (field: DMMF.Field) => field.kind !== \"scalar\" && !field.isList && field.kind !== \"enum\";\n\nconst getEnumListByDMMFType = (modelMetaData: ModelMetaData) => (field: DMMF.Field): string[] | undefined => {\n const enumItem = modelMetaData.enums.find(({ name }) => name === field.type);\n\n if (!enumItem) {\n return undefined;\n }\n\n return enumItem.values.map((item) => item.name);\n};\n\nconst getDescription = (field: DMMF.Field) => field.documentation;\n\nconst getPropertyDefinition = (modelMetaData: ModelMetaData, transformOptions: TransformOptions, field: DMMF.Field) => {\n const type = getJSONSchemaType(field);\n const format = getFormatByDMMFType(field.type);\n const items = getItemsByDMMFType(field, transformOptions);\n const enumList = getEnumListByDMMFType(modelMetaData)(field);\n const defaultValue = getDefaultValue(field);\n const description = getDescription(field);\n\n return {\n type,\n ...(transformOptions.persistOriginalType && {\n originalType: field.type,\n }),\n ...(isDefined(defaultValue) && { default: defaultValue }),\n ...(isDefined(format) && { format }),\n ...(isDefined(items) && { items }),\n ...(isDefined(enumList) && { enum: enumList }),\n ...(isDefined(description) && { description }),\n };\n};\n\nconst getJSONSchemaProperty = (modelMetaData: ModelMetaData, transformOptions: TransformOptions) => (field: DMMF.Field): PropertyMap => {\n const propertyMetaData: PropertyMetaData = {\n required: field.isRequired,\n hasDefaultValue: field.hasDefaultValue,\n isScalar: field.kind === \"scalar\" || field.kind === \"enum\",\n };\n\n const property = isSingleReference(field)\n ? getJSONSchemaForPropertyReference(field, transformOptions)\n : getPropertyDefinition(modelMetaData, transformOptions, field);\n\n return [field.name, property, propertyMetaData];\n};\n\nexport default getJSONSchemaProperty;\n","import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7Definition } from \"json-schema\";\n\nimport getJSONSchemaProperty from \"./properties\";\nimport type { DefinitionMap, ModelMetaData, TransformOptions } from \"./types.d\";\n\nfunction getRelationScalarFields(model: DMMF.Model): string[] {\n return model.fields.flatMap((field) => field.relationFromFields ?? []);\n}\n\nconst getJSONSchemaModel = (modelMetaData: ModelMetaData, transformOptions: TransformOptions) => (model: DMMF.Model): DefinitionMap => {\n const definitionPropertiesMap = model.fields.map(getJSONSchemaProperty(modelMetaData, transformOptions));\n\n const propertiesMap = definitionPropertiesMap.map(([name, definition]) => [name, definition] as DefinitionMap);\n const relationScalarFields = getRelationScalarFields(model);\n const propertiesWithoutRelationScalars = propertiesMap.filter((property) => !relationScalarFields.includes(property[0]));\n\n const properties = Object.fromEntries(transformOptions.keepRelationScalarFields === \"true\" ? propertiesMap : propertiesWithoutRelationScalars);\n\n const definition: JSONSchema7Definition = {\n type: \"object\",\n properties,\n };\n\n if (transformOptions.includeRequiredFields) {\n definition.required = definitionPropertiesMap.reduce((filtered: string[], [name, , fieldMetaData]) => {\n if (fieldMetaData.required && fieldMetaData.isScalar && !fieldMetaData.hasDefaultValue) {\n filtered.push(name);\n }\n return filtered;\n }, []);\n }\n\n return [model.name, definition];\n};\n\nexport default getJSONSchemaModel;\n","import type { DMMF } from \"@prisma/generator-helper\";\nimport type { JSONSchema7, JSONSchema7Definition } from \"json-schema\";\n\nimport getJSONSchemaModel from \"./model\";\nimport type { TransformOptions } from \"./types.d\";\n\nconst toCamelCase = (name: string): string => name.slice(0, 1).toLowerCase() + name.slice(1);\n\nconst getPropertyDefinition = ({ schemaId }: TransformOptions) => (model: DMMF.Model): [name: string, reference: JSONSchema7Definition] => {\n const reference = `#/definitions/${model.name}`;\n\n return [\n toCamelCase(model.name),\n {\n $ref: schemaId ? `${schemaId}${reference}` : reference,\n },\n ];\n};\n\nconst transformDmmf = (dmmf: DMMF.Document, transformOptions: TransformOptions = {}): JSONSchema7 => {\n // TODO: Remove default values as soon as prisma version < 3.10.0 doesn't have to be supported anymore\n const { models = [], enums = [], types = [] } = dmmf.datamodel;\n const initialJSON = {\n $schema: \"http://json-schema.org/draft-07/schema#\",\n definitions: {},\n type: \"object\",\n } as JSONSchema7;\n const { schemaId } = transformOptions;\n\n const modelDefinitionsMap = models.map(getJSONSchemaModel({ enums }, transformOptions));\n const typeDefinitionsMap = types.map(getJSONSchemaModel({ enums }, transformOptions));\n const modelPropertyDefinitionsMap = models.map(getPropertyDefinition(transformOptions));\n const definitions = Object.fromEntries([...modelDefinitionsMap, ...typeDefinitionsMap]);\n const properties = Object.fromEntries(modelPropertyDefinitionsMap);\n\n return {\n ...(schemaId ? { $id: schemaId } : null),\n ...initialJSON,\n definitions,\n properties,\n };\n};\n\nexport default transformDmmf;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visulima/prisma-dmmf-transformer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "A generator for Prisma to generate a valid JSON Schema v7.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"anolilab",
|
|
@@ -59,35 +59,36 @@
|
|
|
59
59
|
"build:prod": "cross-env NODE_ENV=production tsup",
|
|
60
60
|
"clean": "rimraf node_modules dist .eslintcache",
|
|
61
61
|
"coverage": "vitest run --coverage",
|
|
62
|
-
"dev": "pnpm
|
|
62
|
+
"dev": "pnpm run build --watch",
|
|
63
63
|
"lint:eslint": "cross-env NO_LOGS=true eslint . --ext js,jsx,ts,tsx --max-warnings=0 --config .eslintrc.cjs --cache --cache-strategy content .",
|
|
64
64
|
"lint:eslint:fix": "pnpm run lint:eslint --fix",
|
|
65
65
|
"test": "vitest run",
|
|
66
66
|
"test:watch": "vitest"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@prisma/generator-helper": "4.
|
|
70
|
-
"@prisma/internals": "4.
|
|
69
|
+
"@prisma/generator-helper": "4.14.1",
|
|
70
|
+
"@prisma/internals": "4.14.1"
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
|
-
"@anolilab/eslint-config": "^5.0.
|
|
74
|
-
"@anolilab/semantic-release-preset": "^2.2.
|
|
75
|
-
"@prisma/client": "4.
|
|
76
|
-
"@rushstack/eslint-plugin-security": "^0.
|
|
77
|
-
"@types/json-schema": "7.0.
|
|
73
|
+
"@anolilab/eslint-config": "^5.0.5",
|
|
74
|
+
"@anolilab/semantic-release-preset": "^2.2.1",
|
|
75
|
+
"@prisma/client": "4.14.1",
|
|
76
|
+
"@rushstack/eslint-plugin-security": "^0.6.0",
|
|
77
|
+
"@types/json-schema": "7.0.12",
|
|
78
78
|
"@types/micromatch": "^4.0.2",
|
|
79
|
-
"@types/node": "
|
|
80
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
81
|
-
"@typescript-eslint/parser": "^5.
|
|
79
|
+
"@types/node": "18.16.16",
|
|
80
|
+
"@typescript-eslint/eslint-plugin": "^5.59.8",
|
|
81
|
+
"@typescript-eslint/parser": "^5.59.8",
|
|
82
|
+
"@vitest/coverage-c8": "^0.31.1",
|
|
82
83
|
"ajv": "8.12.0",
|
|
83
84
|
"ajv-formats": "2.1.1",
|
|
84
85
|
"cross-env": "^7.0.3",
|
|
85
|
-
"eslint": "^8.
|
|
86
|
-
"eslint-plugin-compat": "^4.
|
|
86
|
+
"eslint": "^8.41.0",
|
|
87
|
+
"eslint-plugin-compat": "^4.1.4",
|
|
87
88
|
"eslint-plugin-eslint-comments": "^3.2.0",
|
|
88
89
|
"eslint-plugin-import": "^2.27.5",
|
|
89
90
|
"eslint-plugin-json": "^3.1.0",
|
|
90
|
-
"eslint-plugin-jsonc": "^2.
|
|
91
|
+
"eslint-plugin-jsonc": "^2.8.0",
|
|
91
92
|
"eslint-plugin-jsx-a11y": "^6.7.1",
|
|
92
93
|
"eslint-plugin-markdown": "^3.0.0",
|
|
93
94
|
"eslint-plugin-material-ui": "^1.0.1",
|
|
@@ -96,32 +97,31 @@
|
|
|
96
97
|
"eslint-plugin-node": "^11.1.0",
|
|
97
98
|
"eslint-plugin-optimize-regex": "^1.2.1",
|
|
98
99
|
"eslint-plugin-promise": "^6.1.1",
|
|
99
|
-
"eslint-plugin-
|
|
100
|
-
"eslint-plugin-react": "7.32.1",
|
|
100
|
+
"eslint-plugin-react": "7.32.2",
|
|
101
101
|
"eslint-plugin-react-hooks": "4.6.0",
|
|
102
|
-
"eslint-plugin-simple-import-sort": "^
|
|
102
|
+
"eslint-plugin-simple-import-sort": "^10.0.0",
|
|
103
103
|
"eslint-plugin-sort-keys-fix": "^1.1.2",
|
|
104
|
-
"eslint-plugin-testing-library": "^5.
|
|
105
|
-
"eslint-plugin-unicorn": "^
|
|
104
|
+
"eslint-plugin-testing-library": "^5.11.0",
|
|
105
|
+
"eslint-plugin-unicorn": "^47.0.0",
|
|
106
106
|
"eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0",
|
|
107
107
|
"eslint-plugin-you-dont-need-momentjs": "^1.6.0",
|
|
108
|
-
"prettier": "^2.8.
|
|
109
|
-
"prisma": "4.
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"vitest": "^0.28.2"
|
|
108
|
+
"prettier": "^2.8.8",
|
|
109
|
+
"prisma": "4.14.1",
|
|
110
|
+
"rimraf": "^5.0.1",
|
|
111
|
+
"semantic-release": "^21.0.2",
|
|
112
|
+
"tsup": "^6.7.0",
|
|
113
|
+
"typescript": "^5.0.4",
|
|
114
|
+
"vitest": "^0.31.1"
|
|
116
115
|
},
|
|
117
116
|
"peerDependencies": {
|
|
118
117
|
"@prisma/client": "3.* || 4.*",
|
|
119
118
|
"prisma": "3.* || 4.*"
|
|
120
119
|
},
|
|
121
120
|
"engines": {
|
|
122
|
-
"node": ">=16.18.0 <=
|
|
121
|
+
"node": ">=16.18.0 <=20.*"
|
|
123
122
|
},
|
|
124
123
|
"publishConfig": {
|
|
125
|
-
"access": "public"
|
|
124
|
+
"access": "public",
|
|
125
|
+
"provenance": true
|
|
126
126
|
}
|
|
127
127
|
}
|