prisma-sql 1.9.0 → 1.10.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/dist/generator.cjs +53 -29
- package/dist/generator.cjs.map +1 -1
- package/dist/generator.js +54 -30
- package/dist/generator.js.map +1 -1
- package/package.json +1 -1
package/dist/generator.cjs
CHANGED
|
@@ -31,7 +31,7 @@ var __commonJS = (cb, mod) => function __require() {
|
|
|
31
31
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
32
32
|
};
|
|
33
33
|
var __async = (__this, __arguments, generator) => {
|
|
34
|
-
return new Promise((
|
|
34
|
+
return new Promise((resolve3, reject) => {
|
|
35
35
|
var fulfilled = (value) => {
|
|
36
36
|
try {
|
|
37
37
|
step(generator.next(value));
|
|
@@ -46,7 +46,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
46
46
|
reject(e);
|
|
47
47
|
}
|
|
48
48
|
};
|
|
49
|
-
var step = (x) => x.done ?
|
|
49
|
+
var step = (x) => x.done ? resolve3(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
50
50
|
step((generator = generator.apply(__this, __arguments)).next());
|
|
51
51
|
});
|
|
52
52
|
};
|
|
@@ -56,7 +56,7 @@ var require_package = __commonJS({
|
|
|
56
56
|
"package.json"(exports$1, module) {
|
|
57
57
|
module.exports = {
|
|
58
58
|
name: "prisma-sql",
|
|
59
|
-
version: "1.
|
|
59
|
+
version: "1.10.0",
|
|
60
60
|
description: "Convert Prisma queries to optimized SQL with type safety. 2-7x faster than Prisma Client.",
|
|
61
61
|
main: "dist/index.cjs",
|
|
62
62
|
module: "dist/index.js",
|
|
@@ -1340,7 +1340,7 @@ var NO_JOINS = Object.freeze([]);
|
|
|
1340
1340
|
function isListRelation(fieldType) {
|
|
1341
1341
|
return typeof fieldType === "string" && fieldType.endsWith("[]");
|
|
1342
1342
|
}
|
|
1343
|
-
function buildToOneNullCheck(field, parentAlias, relTable, relAlias,
|
|
1343
|
+
function buildToOneNullCheck(field, parentAlias, relTable, relAlias, join3, wantNull) {
|
|
1344
1344
|
const isLocal = field.isForeignKeyLocal === true;
|
|
1345
1345
|
const fkFields = normalizeKeyList(field.foreignKey);
|
|
1346
1346
|
if (isLocal) {
|
|
@@ -1357,16 +1357,16 @@ function buildToOneNullCheck(field, parentAlias, relTable, relAlias, join2, want
|
|
|
1357
1357
|
if (parts.length === 1) return parts[0];
|
|
1358
1358
|
return wantNull ? `(${parts.join(" OR ")})` : `(${parts.join(" AND ")})`;
|
|
1359
1359
|
}
|
|
1360
|
-
const existsSql = `EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias} ${SQL_TEMPLATES.WHERE} ${
|
|
1360
|
+
const existsSql = `EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias} ${SQL_TEMPLATES.WHERE} ${join3})`;
|
|
1361
1361
|
return wantNull ? `${SQL_TEMPLATES.NOT} ${existsSql}` : existsSql;
|
|
1362
1362
|
}
|
|
1363
|
-
function buildToOneExistsMatch(relTable, relAlias,
|
|
1363
|
+
function buildToOneExistsMatch(relTable, relAlias, join3, sub) {
|
|
1364
1364
|
const joins = sub.joins.length > 0 ? ` ${sub.joins.join(" ")}` : "";
|
|
1365
|
-
return `EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${joins} ${SQL_TEMPLATES.WHERE} ${
|
|
1365
|
+
return `EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${joins} ${SQL_TEMPLATES.WHERE} ${join3} ${SQL_TEMPLATES.AND} ${sub.clause})`;
|
|
1366
1366
|
}
|
|
1367
|
-
function buildToOneNotExistsMatch(relTable, relAlias,
|
|
1367
|
+
function buildToOneNotExistsMatch(relTable, relAlias, join3, sub) {
|
|
1368
1368
|
const joins = sub.joins.length > 0 ? ` ${sub.joins.join(" ")}` : "";
|
|
1369
|
-
return `${SQL_TEMPLATES.NOT} EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${joins} ${SQL_TEMPLATES.WHERE} ${
|
|
1369
|
+
return `${SQL_TEMPLATES.NOT} EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${joins} ${SQL_TEMPLATES.WHERE} ${join3} ${SQL_TEMPLATES.AND} ${sub.clause})`;
|
|
1370
1370
|
}
|
|
1371
1371
|
function buildListRelationFilters(args) {
|
|
1372
1372
|
const {
|
|
@@ -1377,7 +1377,7 @@ function buildListRelationFilters(args) {
|
|
|
1377
1377
|
relModel,
|
|
1378
1378
|
relTable,
|
|
1379
1379
|
relAlias,
|
|
1380
|
-
join:
|
|
1380
|
+
join: join3
|
|
1381
1381
|
} = args;
|
|
1382
1382
|
const noneValue = value[RelationFilters.NONE];
|
|
1383
1383
|
if (noneValue !== void 0 && noneValue !== null) {
|
|
@@ -1395,7 +1395,7 @@ function buildListRelationFilters(args) {
|
|
|
1395
1395
|
(f) => !f.isRelation && f.isRequired && f.name !== "id"
|
|
1396
1396
|
) || relModel.fields.find((f) => !f.isRelation && f.name === "id");
|
|
1397
1397
|
if (checkField) {
|
|
1398
|
-
const leftJoinSql = `LEFT JOIN ${relTable} ${relAlias} ON ${
|
|
1398
|
+
const leftJoinSql = `LEFT JOIN ${relTable} ${relAlias} ON ${join3}`;
|
|
1399
1399
|
const whereClause = `${relAlias}.${quote(checkField.name)} IS NULL`;
|
|
1400
1400
|
return Object.freeze({
|
|
1401
1401
|
clause: whereClause,
|
|
@@ -1407,17 +1407,17 @@ function buildListRelationFilters(args) {
|
|
|
1407
1407
|
const filters = [
|
|
1408
1408
|
{
|
|
1409
1409
|
key: RelationFilters.SOME,
|
|
1410
|
-
wrap: (c, j) => `EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${j} ${SQL_TEMPLATES.WHERE} ${
|
|
1410
|
+
wrap: (c, j) => `EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${j} ${SQL_TEMPLATES.WHERE} ${join3} ${SQL_TEMPLATES.AND} ${c})`
|
|
1411
1411
|
},
|
|
1412
1412
|
{
|
|
1413
1413
|
key: RelationFilters.EVERY,
|
|
1414
|
-
wrap: (c, j) => `${SQL_TEMPLATES.NOT} EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${j} ${SQL_TEMPLATES.WHERE} ${
|
|
1414
|
+
wrap: (c, j) => `${SQL_TEMPLATES.NOT} EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${j} ${SQL_TEMPLATES.WHERE} ${join3} ${SQL_TEMPLATES.AND} ${SQL_TEMPLATES.NOT} (${c}))`
|
|
1415
1415
|
},
|
|
1416
1416
|
{
|
|
1417
1417
|
key: RelationFilters.NONE,
|
|
1418
1418
|
wrap: (c, j) => {
|
|
1419
1419
|
const condition = c === DEFAULT_WHERE_CLAUSE ? "" : ` ${SQL_TEMPLATES.AND} ${c}`;
|
|
1420
|
-
return `${SQL_TEMPLATES.NOT} EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${j} ${SQL_TEMPLATES.WHERE} ${
|
|
1420
|
+
return `${SQL_TEMPLATES.NOT} EXISTS (${SQL_TEMPLATES.SELECT} 1 ${SQL_TEMPLATES.FROM} ${relTable} ${relAlias}${j} ${SQL_TEMPLATES.WHERE} ${join3}${condition})`;
|
|
1421
1421
|
}
|
|
1422
1422
|
}
|
|
1423
1423
|
];
|
|
@@ -1456,7 +1456,7 @@ function buildToOneRelationFilters(args) {
|
|
|
1456
1456
|
relModel,
|
|
1457
1457
|
relTable,
|
|
1458
1458
|
relAlias,
|
|
1459
|
-
join:
|
|
1459
|
+
join: join3
|
|
1460
1460
|
} = args;
|
|
1461
1461
|
const hasSomeEveryNone = isNotNullish(value[RelationFilters.SOME]) || isNotNullish(value[RelationFilters.EVERY]) || isNotNullish(value[RelationFilters.NONE]);
|
|
1462
1462
|
if (hasSomeEveryNone) {
|
|
@@ -1492,7 +1492,7 @@ function buildToOneRelationFilters(args) {
|
|
|
1492
1492
|
ctx.alias,
|
|
1493
1493
|
relTable,
|
|
1494
1494
|
relAlias,
|
|
1495
|
-
|
|
1495
|
+
join3,
|
|
1496
1496
|
wantNull
|
|
1497
1497
|
);
|
|
1498
1498
|
return Object.freeze({
|
|
@@ -1518,7 +1518,7 @@ function buildToOneRelationFilters(args) {
|
|
|
1518
1518
|
isSubquery: true,
|
|
1519
1519
|
depth: ctx.depth + 1
|
|
1520
1520
|
}));
|
|
1521
|
-
const clause = filterKey === "is" ? buildToOneExistsMatch(relTable, relAlias,
|
|
1521
|
+
const clause = filterKey === "is" ? buildToOneExistsMatch(relTable, relAlias, join3, sub) : buildToOneNotExistsMatch(relTable, relAlias, join3, sub);
|
|
1522
1522
|
return Object.freeze({
|
|
1523
1523
|
clause,
|
|
1524
1524
|
joins: NO_JOINS
|
|
@@ -1560,7 +1560,7 @@ function buildRelation(fieldName, value, ctx, whereBuilder) {
|
|
|
1560
1560
|
ctx.dialect
|
|
1561
1561
|
);
|
|
1562
1562
|
const relAlias = ctx.aliasGen.next(fieldName);
|
|
1563
|
-
const
|
|
1563
|
+
const join3 = joinCondition(field, ctx.alias, relAlias);
|
|
1564
1564
|
const args = {
|
|
1565
1565
|
fieldName,
|
|
1566
1566
|
value,
|
|
@@ -1570,7 +1570,7 @@ function buildRelation(fieldName, value, ctx, whereBuilder) {
|
|
|
1570
1570
|
relModel,
|
|
1571
1571
|
relTable,
|
|
1572
1572
|
relAlias,
|
|
1573
|
-
join:
|
|
1573
|
+
join: join3
|
|
1574
1574
|
};
|
|
1575
1575
|
if (isListRelation(field.type)) return buildListRelationFilters(args);
|
|
1576
1576
|
return buildToOneRelationFilters(args);
|
|
@@ -4412,23 +4412,34 @@ function generateClient(options) {
|
|
|
4412
4412
|
queries.set(modelName, modelQueries);
|
|
4413
4413
|
}
|
|
4414
4414
|
}
|
|
4415
|
-
|
|
4415
|
+
const absoluteOutputDir = path.resolve(process.cwd(), outputDir);
|
|
4416
|
+
yield promises.mkdir(absoluteOutputDir, { recursive: true });
|
|
4416
4417
|
const code = generateCode(models, queries, config.dialect);
|
|
4417
|
-
|
|
4418
|
+
const outputPath = path.join(absoluteOutputDir, "index.ts");
|
|
4419
|
+
yield promises.writeFile(outputPath, code);
|
|
4418
4420
|
const totalQueries = Array.from(queries.values()).reduce(
|
|
4419
4421
|
(sum, m) => sum + m.size,
|
|
4420
4422
|
0
|
|
4421
4423
|
);
|
|
4422
4424
|
console.log(`\u2713 Generated ${queries.size} models, ${totalQueries} queries`);
|
|
4425
|
+
console.log(`\u2713 Output: ${outputPath}`);
|
|
4423
4426
|
});
|
|
4424
4427
|
}
|
|
4425
4428
|
function generateCode(models, queries, dialect) {
|
|
4429
|
+
const cleanModels = models.map((model) => __spreadProps(__spreadValues({}, model), {
|
|
4430
|
+
fields: model.fields.filter((f) => f !== void 0 && f !== null)
|
|
4431
|
+
}));
|
|
4426
4432
|
return `// Generated by @prisma-sql/generator - DO NOT EDIT
|
|
4427
4433
|
import { buildSQL, transformQueryResults, type PrismaMethod } from 'prisma-sql'
|
|
4428
4434
|
|
|
4429
|
-
const MODELS = ${JSON.stringify(
|
|
4435
|
+
const MODELS = ${JSON.stringify(cleanModels, null, 2)}
|
|
4430
4436
|
|
|
4431
|
-
const QUERIES
|
|
4437
|
+
const QUERIES: Record<string, Record<string, {
|
|
4438
|
+
sql: string
|
|
4439
|
+
params: unknown[]
|
|
4440
|
+
dynamicKeys: string[]
|
|
4441
|
+
paramMappings: any[]
|
|
4442
|
+
}>> = ${formatQueries(queries)}
|
|
4432
4443
|
|
|
4433
4444
|
const DIALECT = ${JSON.stringify(dialect)}
|
|
4434
4445
|
|
|
@@ -4504,7 +4515,6 @@ export function createExtension(config: {
|
|
|
4504
4515
|
const modelName = this?.name || this?.$name
|
|
4505
4516
|
const startTime = Date.now()
|
|
4506
4517
|
|
|
4507
|
-
// Try prebaked query first
|
|
4508
4518
|
const queryKey = normalizeQuery(args)
|
|
4509
4519
|
const prebakedQuery = QUERIES[modelName]?.[queryKey]
|
|
4510
4520
|
|
|
@@ -4513,12 +4523,10 @@ export function createExtension(config: {
|
|
|
4513
4523
|
let prebaked = false
|
|
4514
4524
|
|
|
4515
4525
|
if (prebakedQuery) {
|
|
4516
|
-
// \u26A1 Use prebaked SQL
|
|
4517
4526
|
sql = prebakedQuery.sql
|
|
4518
4527
|
params = [...prebakedQuery.params, ...extractDynamicParams(args, prebakedQuery.dynamicKeys)]
|
|
4519
4528
|
prebaked = true
|
|
4520
4529
|
} else {
|
|
4521
|
-
// \u{1F528} Fall back to runtime generation
|
|
4522
4530
|
const model = MODELS.find((m: any) => m.name === modelName)
|
|
4523
4531
|
|
|
4524
4532
|
if (!model) {
|
|
@@ -4586,6 +4594,9 @@ export function createExtension(config: {
|
|
|
4586
4594
|
`;
|
|
4587
4595
|
}
|
|
4588
4596
|
function formatQueries(queries) {
|
|
4597
|
+
if (queries.size === 0) {
|
|
4598
|
+
return "{}";
|
|
4599
|
+
}
|
|
4589
4600
|
const entries = [];
|
|
4590
4601
|
for (const [modelName, modelQueries] of queries) {
|
|
4591
4602
|
const queryEntries = [];
|
|
@@ -4615,18 +4626,31 @@ function getDialectFromProvider(provider) {
|
|
|
4615
4626
|
`Unsupported database provider: ${provider}. Supported: postgresql, postgres, sqlite`
|
|
4616
4627
|
);
|
|
4617
4628
|
}
|
|
4629
|
+
function getOutputDir(options) {
|
|
4630
|
+
var _a, _b;
|
|
4631
|
+
if ((_a = options.generator.output) == null ? void 0 : _a.value) {
|
|
4632
|
+
return options.generator.output.value;
|
|
4633
|
+
}
|
|
4634
|
+
const clientGenerator = options.otherGenerators.find(
|
|
4635
|
+
(g) => g.provider.value === "prisma-client-js"
|
|
4636
|
+
);
|
|
4637
|
+
if ((_b = clientGenerator == null ? void 0 : clientGenerator.output) == null ? void 0 : _b.value) {
|
|
4638
|
+
const clientOutput = clientGenerator.output.value;
|
|
4639
|
+
return path.join(path.resolve(path.dirname(clientOutput), ".."), "sql");
|
|
4640
|
+
}
|
|
4641
|
+
return "../node_modules/.prisma/sql";
|
|
4642
|
+
}
|
|
4618
4643
|
generatorHelper.generatorHandler({
|
|
4619
4644
|
onManifest() {
|
|
4620
4645
|
return {
|
|
4621
4646
|
version,
|
|
4622
|
-
defaultOutput: "../node_modules/.prisma/
|
|
4647
|
+
defaultOutput: "../node_modules/.prisma/sql",
|
|
4623
4648
|
prettyName: "prisma-sql-generator",
|
|
4624
4649
|
requiresGenerators: ["prisma-client-js"]
|
|
4625
4650
|
};
|
|
4626
4651
|
},
|
|
4627
4652
|
onGenerate(options) {
|
|
4628
4653
|
return __async(this, null, function* () {
|
|
4629
|
-
var _a;
|
|
4630
4654
|
const { generator, dmmf, datasources } = options;
|
|
4631
4655
|
if (!datasources || datasources.length === 0) {
|
|
4632
4656
|
throw new Error("No datasource found in schema");
|
|
@@ -4643,7 +4667,7 @@ generatorHelper.generatorHandler({
|
|
|
4643
4667
|
dialect,
|
|
4644
4668
|
skipInvalid: generator.config.skipInvalid === "true"
|
|
4645
4669
|
};
|
|
4646
|
-
const outputDir = (
|
|
4670
|
+
const outputDir = getOutputDir(options);
|
|
4647
4671
|
internals.logger.info(`Generating SQL client to ${outputDir}`);
|
|
4648
4672
|
internals.logger.info(`Datasource: ${datasources[0].provider}`);
|
|
4649
4673
|
internals.logger.info(`Dialect: ${config.dialect}`);
|