pqb 0.7.0 → 0.7.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 (51) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/index.d.ts +45 -9
  3. package/dist/index.esm.js +73 -6
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +73 -6
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/adapter.test.ts +1 -1
  9. package/src/columnSchema/columnType.test.ts +2 -1
  10. package/src/columnSchema/columnTypes.test.ts +1 -1
  11. package/src/columnSchema/timestamps.test.ts +2 -2
  12. package/src/columnSchema/utils.ts +1 -1
  13. package/src/columnsOperators.test.ts +1 -1
  14. package/src/db.test.ts +83 -1
  15. package/src/db.ts +27 -10
  16. package/src/errors.test.ts +6 -1
  17. package/src/queryMethods/aggregate.test.ts +1 -1
  18. package/src/queryMethods/callbacks.test.ts +1 -1
  19. package/src/queryMethods/clear.test.ts +1 -1
  20. package/src/queryMethods/columnInfo.test.ts +5 -1
  21. package/src/queryMethods/copy.test.ts +63 -0
  22. package/src/queryMethods/copy.ts +17 -0
  23. package/src/queryMethods/create.test.ts +1 -1
  24. package/src/queryMethods/delete.test.ts +1 -1
  25. package/src/queryMethods/for.test.ts +5 -1
  26. package/src/queryMethods/from.test.ts +6 -1
  27. package/src/queryMethods/get.test.ts +7 -1
  28. package/src/queryMethods/having.test.ts +6 -1
  29. package/src/queryMethods/join.test.ts +6 -1
  30. package/src/queryMethods/json.test.ts +1 -1
  31. package/src/queryMethods/log.test.ts +6 -1
  32. package/src/queryMethods/log.ts +1 -0
  33. package/src/queryMethods/merge.test.ts +1 -1
  34. package/src/queryMethods/queryMethods.test.ts +1 -1
  35. package/src/queryMethods/queryMethods.ts +4 -1
  36. package/src/queryMethods/raw.test.ts +1 -1
  37. package/src/queryMethods/select.test.ts +1 -1
  38. package/src/queryMethods/then.test.ts +6 -1
  39. package/src/queryMethods/transaction.test.ts +1 -1
  40. package/src/queryMethods/union.test.ts +1 -1
  41. package/src/queryMethods/update.test.ts +1 -1
  42. package/src/queryMethods/upsert.test.ts +6 -1
  43. package/src/queryMethods/where.test.ts +1 -1
  44. package/src/queryMethods/window.test.ts +1 -1
  45. package/src/queryMethods/with.test.ts +6 -1
  46. package/src/sql/copy.ts +59 -0
  47. package/src/sql/data.ts +29 -1
  48. package/src/sql/toSql.ts +6 -0
  49. package/src/{test-utils.ts → test-utils/test-utils.ts} +8 -7
  50. package/src/test-utils/user.csv +1 -0
  51. package/src/utils.test.ts +1 -1
package/dist/index.js CHANGED
@@ -1312,6 +1312,45 @@ const pushColumnInfoSql = (ctx, table, query) => {
1312
1312
  }
1313
1313
  };
1314
1314
 
1315
+ const pushCopySql = (ctx, model, query, quotedAs) => {
1316
+ const { sql } = ctx;
1317
+ const { copy } = query;
1318
+ const columns = copy.columns ? `(${copy.columns.map(q).join(", ")})` : "";
1319
+ const target = "from" in copy ? copy.from : copy.to;
1320
+ sql.push(
1321
+ `COPY ${q(model.table)}${columns} ${"from" in copy ? "FROM" : "TO"} ${typeof target === "string" ? quote(target) : `PROGRAM ${quote(target.program)}`}`
1322
+ );
1323
+ if (Object.keys(copy).length > (copy.columns ? 2 : 1)) {
1324
+ const options = [];
1325
+ if (copy.format)
1326
+ options.push(`FORMAT ${copy.format}`);
1327
+ if (copy.freeze)
1328
+ options.push(`FREEZE ${copy.freeze}`);
1329
+ if (copy.delimiter)
1330
+ options.push(`DELIMITER ${quote(copy.delimiter)}`);
1331
+ if (copy.null)
1332
+ options.push(`NULL ${quote(copy.null)}`);
1333
+ if (copy.header)
1334
+ options.push(`HEADER ${copy.header}`);
1335
+ if (copy.quote)
1336
+ options.push(`QUOTE ${quote(copy.quote)}`);
1337
+ if (copy.escape)
1338
+ options.push(`ESCAPE ${quote(copy.escape)}`);
1339
+ if (copy.forceQuote)
1340
+ options.push(
1341
+ `FORCE_QUOTE ${copy.forceQuote === "*" ? "*" : `(${copy.forceQuote.map(q).join(", ")})`}`
1342
+ );
1343
+ if (copy.forceNotNull)
1344
+ options.push(`FORCE_NOT_NULL (${copy.forceNotNull.map(q).join(", ")})`);
1345
+ if (copy.forceNull)
1346
+ options.push(`FORCE_NULL (${copy.forceNull.map(q).join(", ")})`);
1347
+ if (copy.encoding)
1348
+ options.push(`ENCODING ${quote(copy.encoding)}`);
1349
+ sql.push(`WITH (${options.join(", ")})`);
1350
+ }
1351
+ pushWhereStatementSql(ctx, model, query, quotedAs);
1352
+ };
1353
+
1315
1354
  const toSqlCacheKey = Symbol("toSqlCache");
1316
1355
  const toSql = (model, options) => {
1317
1356
  return !(options == null ? void 0 : options.clearCache) && model.query[toSqlCacheKey] || (model.query[toSqlCacheKey] = makeSql(model, options));
@@ -1356,6 +1395,10 @@ const makeSql = (model, { values = [] } = {}) => {
1356
1395
  pushDeleteSql(ctx, model, query, quotedAs2);
1357
1396
  return { text: sql.join(" "), values };
1358
1397
  }
1398
+ if (query.type === "copy") {
1399
+ pushCopySql(ctx, model, query, quotedAs2);
1400
+ return { text: sql.join(" "), values };
1401
+ }
1359
1402
  }
1360
1403
  const quotedAs = model.table && q(query.as || model.table);
1361
1404
  sql.push("SELECT");
@@ -1566,7 +1609,7 @@ const assignMethodsToClass = (klass, methods) => {
1566
1609
  writable: true,
1567
1610
  value(...args) {
1568
1611
  const cloned = cloneInstance(this);
1569
- return methods[name].call(cloned, args);
1612
+ return methods[name].apply(cloned, args);
1570
1613
  }
1571
1614
  });
1572
1615
  }
@@ -5466,6 +5509,19 @@ class RawMethods {
5466
5509
  }
5467
5510
  }
5468
5511
 
5512
+ class CopyMethods {
5513
+ copy(arg) {
5514
+ return this.clone()._copy(arg);
5515
+ }
5516
+ _copy(arg) {
5517
+ Object.assign(this.query, {
5518
+ type: "copy",
5519
+ copy: arg
5520
+ });
5521
+ return this;
5522
+ }
5523
+ }
5524
+
5469
5525
  class QueryMethods {
5470
5526
  all() {
5471
5527
  return this.clone()._all();
@@ -5653,7 +5709,8 @@ applyMixins(QueryMethods, [
5653
5709
  QueryUpsert,
5654
5710
  QueryGet,
5655
5711
  MergeQueryMethods,
5656
- RawMethods
5712
+ RawMethods,
5713
+ CopyMethods
5657
5714
  ]);
5658
5715
 
5659
5716
  var __defProp = Object.defineProperty;
@@ -5694,7 +5751,7 @@ class Db {
5694
5751
  this.columnTypes = columnTypes;
5695
5752
  this.whereQueryBuilder = WhereQueryBuilder;
5696
5753
  this.onQueryBuilder = OnQueryBuilder;
5697
- var _a;
5754
+ var _a, _b;
5698
5755
  this.__model = this;
5699
5756
  const logger = options.logger || console;
5700
5757
  this.query = {
@@ -5710,8 +5767,17 @@ class Db {
5710
5767
  this.primaryKeys = Object.keys(shape).filter(
5711
5768
  (key) => shape[key].isPrimaryKey
5712
5769
  );
5770
+ const primaryKeysFromData = (_b = getTableData().primaryKey) == null ? void 0 : _b.columns;
5771
+ if (primaryKeysFromData)
5772
+ this.primaryKeys.push(...primaryKeysFromData);
5713
5773
  if (this.primaryKeys.length === 1) {
5714
5774
  this.singlePrimaryKey = this.primaryKeys[0];
5775
+ } else if (this.primaryKeys.length === 0 && shape !== anyShape && options.noPrimaryKey !== "ignore") {
5776
+ const message = `Table ${table} has no primary key`;
5777
+ if (options.noPrimaryKey === "error")
5778
+ throw new Error(message);
5779
+ else
5780
+ logger.warn(message);
5715
5781
  }
5716
5782
  const columns = Object.keys(
5717
5783
  shape
@@ -5761,18 +5827,19 @@ const createDb = (_a) => {
5761
5827
  "logger",
5762
5828
  "columnTypes"
5763
5829
  ]);
5764
- var _a2;
5830
+ var _a2, _b2;
5765
5831
  const adapter = "adapter" in options ? options.adapter : new Adapter(options);
5766
5832
  const commonOptions = {
5767
5833
  log,
5768
5834
  logger,
5769
- autoPreparedStatements: (_a2 = options.autoPreparedStatements) != null ? _a2 : false
5835
+ autoPreparedStatements: (_a2 = options.autoPreparedStatements) != null ? _a2 : false,
5836
+ noPrimaryKey: (_b2 = options.noPrimaryKey) != null ? _b2 : "error"
5770
5837
  };
5771
5838
  const qb = new Db(
5772
5839
  adapter,
5773
5840
  void 0,
5774
5841
  void 0,
5775
- {},
5842
+ anyShape,
5776
5843
  ct,
5777
5844
  commonOptions
5778
5845
  );