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.
@@ -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((resolve, reject) => {
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 ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
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.9.0",
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, join2, wantNull) {
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} ${join2})`;
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, join2, sub) {
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} ${join2} ${SQL_TEMPLATES.AND} ${sub.clause})`;
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, join2, sub) {
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} ${join2} ${SQL_TEMPLATES.AND} ${sub.clause})`;
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: join2
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 ${join2}`;
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} ${join2} ${SQL_TEMPLATES.AND} ${c})`
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} ${join2} ${SQL_TEMPLATES.AND} ${SQL_TEMPLATES.NOT} (${c}))`
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} ${join2}${condition})`;
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: join2
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
- join2,
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, join2, sub) : buildToOneNotExistsMatch(relTable, relAlias, join2, sub);
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 join2 = joinCondition(field, ctx.alias, relAlias);
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: join2
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
- yield promises.mkdir(outputDir, { recursive: true });
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
- yield promises.writeFile(path.join(outputDir, "index.ts"), code);
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(models, null, 2)}
4435
+ const MODELS = ${JSON.stringify(cleanModels, null, 2)}
4430
4436
 
4431
- const QUERIES = ${formatQueries(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/client/sql",
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 = ((_a = generator.output) == null ? void 0 : _a.value) || "../node_modules/.prisma/client/sql";
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}`);