prisma-ts-select 0.0.34 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1242 -315
  3. package/assets/groupBy.gif +0 -0
  4. package/assets/joinUnsafeIgnoreType.gif +0 -0
  5. package/assets/joinUnsafeTypeEnforced.gif +0 -0
  6. package/assets/typesafe-join.gif +0 -0
  7. package/assets/typesafe-join.png +0 -0
  8. package/assets/whereNotNull.gif +0 -0
  9. package/assets/whereisNull.gif +0 -0
  10. package/dist/bin.cjs +1 -1
  11. package/dist/bin.js +1 -1
  12. package/dist/chunk-47KZVQLD.js +283 -0
  13. package/dist/chunk-54D2J5AR.cjs +291 -0
  14. package/dist/extend/dialects/index.d.ts +13 -0
  15. package/dist/extend/dialects/index.js +186 -0
  16. package/dist/extend/dialects/mysql-v6.d.ts +100 -0
  17. package/dist/extend/dialects/mysql-v6.js +152 -0
  18. package/dist/extend/dialects/mysql-v7.d.ts +6 -0
  19. package/dist/extend/dialects/mysql-v7.js +138 -0
  20. package/dist/extend/dialects/mysql.d.ts +90 -0
  21. package/dist/extend/dialects/mysql.js +156 -0
  22. package/dist/extend/dialects/postgresql-v6.d.ts +97 -0
  23. package/dist/extend/dialects/postgresql-v6.js +136 -0
  24. package/dist/extend/dialects/postgresql-v7.d.ts +97 -0
  25. package/dist/extend/dialects/postgresql-v7.js +136 -0
  26. package/dist/extend/dialects/postgresql.d.ts +89 -0
  27. package/dist/extend/dialects/postgresql.js +147 -0
  28. package/dist/extend/dialects/shared.d.ts +6 -0
  29. package/dist/extend/dialects/shared.js +5 -0
  30. package/dist/extend/dialects/sqlite.d.ts +63 -0
  31. package/dist/extend/dialects/sqlite.js +138 -0
  32. package/dist/extend/dialects/types.d.ts +12 -0
  33. package/dist/extend/dialects/types.js +4 -0
  34. package/dist/extend/extend.d.ts +286 -43
  35. package/dist/extend/extend.js +735 -163
  36. package/dist/extend/sql-expr-BaKWzJ-r.d.ts +10 -0
  37. package/dist/extend/types-D84lxYVc.d.ts +5 -0
  38. package/dist/generator.cjs +1 -1
  39. package/dist/generator.js +1 -1
  40. package/package.json +46 -42
  41. package/built/extend.cjs +0 -680
  42. package/built/extend.d.cts +0 -520
  43. package/built/extend.d.ts +0 -520
  44. package/built/extend.js +0 -678
  45. package/dist/chunk-TBO3MX7Q.cjs +0 -195
  46. package/dist/chunk-X3N5N5KQ.js +0 -187
  47. package/dist/extend/extend.cjs +0 -357
  48. package/dist/extend/extend.d.cts +0 -264
@@ -1,195 +0,0 @@
1
- 'use strict';
2
-
3
- var generatorHelper = require('@prisma/generator-helper');
4
- var internals = require('@prisma/internals');
5
- var path2 = require('path');
6
- var fs2 = require('fs');
7
- var module$1 = require('module');
8
-
9
- var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
10
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
-
12
- var path2__default = /*#__PURE__*/_interopDefault(path2);
13
- var fs2__default = /*#__PURE__*/_interopDefault(fs2);
14
-
15
- // src/generator.ts
16
-
17
- // src/constants.ts
18
- var GENERATOR_NAME = "prisma-ts-select";
19
- function writeFileSafely(writeLocation, content) {
20
- fs2__default.default.mkdirSync(path2__default.default.dirname(writeLocation), {
21
- recursive: true
22
- });
23
- fs2__default.default.writeFileSync(writeLocation, content);
24
- }
25
- var _require = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.src || new URL('out.js', document.baseURI).href)));
26
- var SupportedProviders = {
27
- sqlite: true,
28
- mysql: true,
29
- postgresql: true,
30
- cockroachdb: false,
31
- mongodb: false,
32
- postgres: false,
33
- sqlserver: false
34
- };
35
- generatorHelper.generatorHandler({
36
- onManifest() {
37
- internals.logger.info(`${GENERATOR_NAME}:Registered`);
38
- return {
39
- defaultOutput: "../generated",
40
- prettyName: GENERATOR_NAME
41
- };
42
- },
43
- onGenerate: async (options) => {
44
- const validDS = options.datasources.map((ds) => ds.provider).filter((type) => SupportedProviders[type]);
45
- if (validDS.length === 0) {
46
- throw new Error(`${GENERATOR_NAME}: Supported DataSource Providers are: ${Object.entries(SupportedProviders).reduce((acc, [name, supported]) => {
47
- if (!supported) return acc;
48
- acc.push(name);
49
- return acc;
50
- }, []).join(", ")}`);
51
- }
52
- const modelToId = {};
53
- const models = options.dmmf.datamodel.models.reduce((acc, model) => {
54
- const modelObj = acc[model.name] = acc[model.name] ?? {
55
- fields: {},
56
- relations: {}
57
- };
58
- for (const field of model.fields) {
59
- if (field.kind !== "object") {
60
- if (field.isId) modelToId[model.name] = [field.name, field.type];
61
- modelObj.fields = modelObj.fields ?? {};
62
- modelObj.fields[field.name] = (!field.isRequired ? "?" : "") + field.type;
63
- } else {
64
- if (field.relationFromFields && field.relationFromFields.length > 0 && (field.relationToFields && field.relationToFields.length > 0)) {
65
- const fieldObj = modelObj.relations[field.type] = modelObj.relations[field.type] ?? {};
66
- field.relationFromFields.forEach((relationFromField, i) => {
67
- if (!field.relationToFields) return;
68
- const relationToField = field.relationToFields[i];
69
- if (!relationToField) return;
70
- fieldObj[relationFromField] = fieldObj[relationFromField] || [];
71
- fieldObj[relationFromField].push(relationToField);
72
- const accModel = acc[field.type] = acc[field.type] ?? {};
73
- const accModelRelations = accModel.relations = accModel.relations ?? {};
74
- const accModelRelationToModel = accModelRelations[model.name] = accModelRelations[model.name] ?? {};
75
- const relationFromFieldList = accModelRelationToModel[relationToField] = accModelRelationToModel[relationToField] ?? [];
76
- relationFromFieldList.push(relationFromField);
77
- });
78
- } else {
79
- if (!isManyToManyRelationShip(field)) continue;
80
- debugger;
81
- const joinTableName = "_" + field.relationName;
82
- const joinTableModel = acc[joinTableName] = acc[joinTableName] ?? {
83
- fields: {
84
- "A": "",
85
- "B": ""
86
- },
87
- relations: {}
88
- };
89
- const abJoin = [field.type, model.name].toSorted().indexOf(model.name) === 0 ? "A" : "B";
90
- const [idName, idType] = getModelId(model.name);
91
- joinTableModel.fields[abJoin] = idType;
92
- {
93
- const mr = joinTableModel.relations[model.name] = joinTableModel.relations[model.name] ?? {};
94
- const mrt = mr[abJoin] = mr[abJoin] ?? [];
95
- mrt.push(idName);
96
- }
97
- const m = modelObj.relations[joinTableName] = modelObj.relations[joinTableName] ?? {};
98
- const mf = m[idName] = m[idName] ?? [];
99
- mf.push(abJoin);
100
- }
101
- }
102
- }
103
- return acc;
104
- }, {});
105
- const pTSSelPath = path2__default.default.dirname(_require.resolve("@gcm/prisma-ts-select"));
106
- internals.logger.info("pTSSelPath", pTSSelPath);
107
- const srcDir = path2__default.default.join(pTSSelPath, "extend");
108
- const outDir = path2__default.default.join(pTSSelPath, "..", "built");
109
- {
110
- const file = "extend.js";
111
- const contents = fs2__default.default.readFileSync(path2__default.default.join(srcDir, file), { encoding: "utf-8" });
112
- writeFileSafely(
113
- path2__default.default.join(outDir, file),
114
- contents.replace(
115
- "const DB = {};",
116
- `const DB = ${JSON.stringify(models, null, 2)};`
117
- )
118
- );
119
- }
120
- {
121
- const file = "extend.cjs";
122
- const contents = fs2__default.default.readFileSync(path2__default.default.join(srcDir, file), { encoding: "utf-8" });
123
- writeFileSafely(
124
- path2__default.default.join(outDir, file),
125
- contents.replace(
126
- "const DB = {};",
127
- `const DB = ${JSON.stringify(models, null, 2)};`
128
- )
129
- );
130
- }
131
- const declaration = generateReadonlyDeclaration(models);
132
- {
133
- const file = "extend.d.ts";
134
- const contents = fs2__default.default.readFileSync(path2__default.default.join(srcDir, file), { encoding: "utf-8" });
135
- writeFileSafely(
136
- path2__default.default.join(outDir, file),
137
- contents.replace("declare const DB: DBType;", declaration)
138
- );
139
- }
140
- {
141
- const file = "extend.d.cts";
142
- const contents = fs2__default.default.readFileSync(path2__default.default.join(srcDir, file), { encoding: "utf-8" });
143
- writeFileSafely(
144
- path2__default.default.join(outDir, file),
145
- contents.replace("declare const DB: DBType;", declaration)
146
- );
147
- }
148
- function isManyToManyRelationShip(field) {
149
- if (!(field.kind === "object" && field.isList)) return false;
150
- const { type, relationName } = field;
151
- const typeModel = options.dmmf.datamodel.models.find((m) => m.name === type);
152
- if (!typeModel) return false;
153
- if (!typeModel.fields.find((f) => f.kind === "object" && f.isList && f.relationName === relationName)) return false;
154
- return true;
155
- }
156
- function getModelId(name) {
157
- if (!modelToId[name]) {
158
- for (const m of options.dmmf.datamodel.models) {
159
- if (m.name !== name) continue;
160
- for (const f of m.fields) {
161
- if (f.isId) {
162
- modelToId[m.name] = [f.name, f.type];
163
- break;
164
- }
165
- }
166
- }
167
- }
168
- const remoteId = modelToId[name];
169
- if (!remoteId) throw new Error(`Remote: Unable to find @id field for model, ${name}`);
170
- return remoteId;
171
- }
172
- }
173
- });
174
- function generateReadonlyDeclaration(db) {
175
- const traverse = (obj, level = 0) => {
176
- const indent = " ".repeat(level);
177
- const lines = [];
178
- if (obj === null) return lines.join("\n");
179
- for (const [key, value] of Object.entries(obj)) {
180
- if (typeof value === "object" && !Array.isArray(value)) {
181
- lines.push(`${indent}readonly ${key}: {`);
182
- lines.push(traverse(value, level + 1));
183
- lines.push(`${indent}};`);
184
- } else if (Array.isArray(value)) {
185
- lines.push(`${indent}readonly ${key}: [${value.map((v) => `"${v}"`).join(", ")}];`);
186
- } else {
187
- lines.push(`${indent}readonly ${key}: "${value}";`);
188
- }
189
- }
190
- return lines.join("\n");
191
- };
192
- return `declare const DB: {
193
- ${traverse(db, 1)}
194
- };`;
195
- }
@@ -1,187 +0,0 @@
1
- import { generatorHandler } from '@prisma/generator-helper';
2
- import { logger } from '@prisma/internals';
3
- import path2 from 'node:path';
4
- import fs2 from 'node:fs';
5
- import { createRequire } from 'node:module';
6
-
7
- // src/generator.ts
8
-
9
- // src/constants.ts
10
- var GENERATOR_NAME = "prisma-ts-select";
11
- function writeFileSafely(writeLocation, content) {
12
- fs2.mkdirSync(path2.dirname(writeLocation), {
13
- recursive: true
14
- });
15
- fs2.writeFileSync(writeLocation, content);
16
- }
17
- var _require = createRequire(import.meta.url);
18
- var SupportedProviders = {
19
- sqlite: true,
20
- mysql: true,
21
- postgresql: true,
22
- cockroachdb: false,
23
- mongodb: false,
24
- postgres: false,
25
- sqlserver: false
26
- };
27
- generatorHandler({
28
- onManifest() {
29
- logger.info(`${GENERATOR_NAME}:Registered`);
30
- return {
31
- defaultOutput: "../generated",
32
- prettyName: GENERATOR_NAME
33
- };
34
- },
35
- onGenerate: async (options) => {
36
- const validDS = options.datasources.map((ds) => ds.provider).filter((type) => SupportedProviders[type]);
37
- if (validDS.length === 0) {
38
- throw new Error(`${GENERATOR_NAME}: Supported DataSource Providers are: ${Object.entries(SupportedProviders).reduce((acc, [name, supported]) => {
39
- if (!supported) return acc;
40
- acc.push(name);
41
- return acc;
42
- }, []).join(", ")}`);
43
- }
44
- const modelToId = {};
45
- const models = options.dmmf.datamodel.models.reduce((acc, model) => {
46
- const modelObj = acc[model.name] = acc[model.name] ?? {
47
- fields: {},
48
- relations: {}
49
- };
50
- for (const field of model.fields) {
51
- if (field.kind !== "object") {
52
- if (field.isId) modelToId[model.name] = [field.name, field.type];
53
- modelObj.fields = modelObj.fields ?? {};
54
- modelObj.fields[field.name] = (!field.isRequired ? "?" : "") + field.type;
55
- } else {
56
- if (field.relationFromFields && field.relationFromFields.length > 0 && (field.relationToFields && field.relationToFields.length > 0)) {
57
- const fieldObj = modelObj.relations[field.type] = modelObj.relations[field.type] ?? {};
58
- field.relationFromFields.forEach((relationFromField, i) => {
59
- if (!field.relationToFields) return;
60
- const relationToField = field.relationToFields[i];
61
- if (!relationToField) return;
62
- fieldObj[relationFromField] = fieldObj[relationFromField] || [];
63
- fieldObj[relationFromField].push(relationToField);
64
- const accModel = acc[field.type] = acc[field.type] ?? {};
65
- const accModelRelations = accModel.relations = accModel.relations ?? {};
66
- const accModelRelationToModel = accModelRelations[model.name] = accModelRelations[model.name] ?? {};
67
- const relationFromFieldList = accModelRelationToModel[relationToField] = accModelRelationToModel[relationToField] ?? [];
68
- relationFromFieldList.push(relationFromField);
69
- });
70
- } else {
71
- if (!isManyToManyRelationShip(field)) continue;
72
- debugger;
73
- const joinTableName = "_" + field.relationName;
74
- const joinTableModel = acc[joinTableName] = acc[joinTableName] ?? {
75
- fields: {
76
- "A": "",
77
- "B": ""
78
- },
79
- relations: {}
80
- };
81
- const abJoin = [field.type, model.name].toSorted().indexOf(model.name) === 0 ? "A" : "B";
82
- const [idName, idType] = getModelId(model.name);
83
- joinTableModel.fields[abJoin] = idType;
84
- {
85
- const mr = joinTableModel.relations[model.name] = joinTableModel.relations[model.name] ?? {};
86
- const mrt = mr[abJoin] = mr[abJoin] ?? [];
87
- mrt.push(idName);
88
- }
89
- const m = modelObj.relations[joinTableName] = modelObj.relations[joinTableName] ?? {};
90
- const mf = m[idName] = m[idName] ?? [];
91
- mf.push(abJoin);
92
- }
93
- }
94
- }
95
- return acc;
96
- }, {});
97
- const pTSSelPath = path2.dirname(_require.resolve("@gcm/prisma-ts-select"));
98
- logger.info("pTSSelPath", pTSSelPath);
99
- const srcDir = path2.join(pTSSelPath, "extend");
100
- const outDir = path2.join(pTSSelPath, "..", "built");
101
- {
102
- const file = "extend.js";
103
- const contents = fs2.readFileSync(path2.join(srcDir, file), { encoding: "utf-8" });
104
- writeFileSafely(
105
- path2.join(outDir, file),
106
- contents.replace(
107
- "const DB = {};",
108
- `const DB = ${JSON.stringify(models, null, 2)};`
109
- )
110
- );
111
- }
112
- {
113
- const file = "extend.cjs";
114
- const contents = fs2.readFileSync(path2.join(srcDir, file), { encoding: "utf-8" });
115
- writeFileSafely(
116
- path2.join(outDir, file),
117
- contents.replace(
118
- "const DB = {};",
119
- `const DB = ${JSON.stringify(models, null, 2)};`
120
- )
121
- );
122
- }
123
- const declaration = generateReadonlyDeclaration(models);
124
- {
125
- const file = "extend.d.ts";
126
- const contents = fs2.readFileSync(path2.join(srcDir, file), { encoding: "utf-8" });
127
- writeFileSafely(
128
- path2.join(outDir, file),
129
- contents.replace("declare const DB: DBType;", declaration)
130
- );
131
- }
132
- {
133
- const file = "extend.d.cts";
134
- const contents = fs2.readFileSync(path2.join(srcDir, file), { encoding: "utf-8" });
135
- writeFileSafely(
136
- path2.join(outDir, file),
137
- contents.replace("declare const DB: DBType;", declaration)
138
- );
139
- }
140
- function isManyToManyRelationShip(field) {
141
- if (!(field.kind === "object" && field.isList)) return false;
142
- const { type, relationName } = field;
143
- const typeModel = options.dmmf.datamodel.models.find((m) => m.name === type);
144
- if (!typeModel) return false;
145
- if (!typeModel.fields.find((f) => f.kind === "object" && f.isList && f.relationName === relationName)) return false;
146
- return true;
147
- }
148
- function getModelId(name) {
149
- if (!modelToId[name]) {
150
- for (const m of options.dmmf.datamodel.models) {
151
- if (m.name !== name) continue;
152
- for (const f of m.fields) {
153
- if (f.isId) {
154
- modelToId[m.name] = [f.name, f.type];
155
- break;
156
- }
157
- }
158
- }
159
- }
160
- const remoteId = modelToId[name];
161
- if (!remoteId) throw new Error(`Remote: Unable to find @id field for model, ${name}`);
162
- return remoteId;
163
- }
164
- }
165
- });
166
- function generateReadonlyDeclaration(db) {
167
- const traverse = (obj, level = 0) => {
168
- const indent = " ".repeat(level);
169
- const lines = [];
170
- if (obj === null) return lines.join("\n");
171
- for (const [key, value] of Object.entries(obj)) {
172
- if (typeof value === "object" && !Array.isArray(value)) {
173
- lines.push(`${indent}readonly ${key}: {`);
174
- lines.push(traverse(value, level + 1));
175
- lines.push(`${indent}};`);
176
- } else if (Array.isArray(value)) {
177
- lines.push(`${indent}readonly ${key}: [${value.map((v) => `"${v}"`).join(", ")}];`);
178
- } else {
179
- lines.push(`${indent}readonly ${key}: "${value}";`);
180
- }
181
- }
182
- return lines.join("\n");
183
- };
184
- return `declare const DB: {
185
- ${traverse(db, 1)}
186
- };`;
187
- }