knex 2.4.2 → 2.5.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.
Files changed (190) hide show
  1. package/CHANGELOG.md +54 -18
  2. package/CONTRIBUTING.md +194 -194
  3. package/LICENSE +22 -22
  4. package/README.md +147 -148
  5. package/UPGRADING.md +233 -233
  6. package/bin/cli.js +473 -473
  7. package/bin/utils/cli-config-utils.js +210 -210
  8. package/bin/utils/constants.js +7 -7
  9. package/bin/utils/migrationsLister.js +37 -37
  10. package/knex.js +23 -23
  11. package/knex.mjs +11 -0
  12. package/lib/builder-interface-augmenter.js +120 -120
  13. package/lib/client.js +495 -475
  14. package/lib/constants.js +61 -61
  15. package/lib/dialects/better-sqlite3/index.js +77 -72
  16. package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
  17. package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
  18. package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
  19. package/lib/dialects/cockroachdb/crdb-tablecompiler.js +37 -37
  20. package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
  21. package/lib/dialects/cockroachdb/index.js +86 -86
  22. package/lib/dialects/index.js +33 -33
  23. package/lib/dialects/mssql/index.js +500 -495
  24. package/lib/dialects/mssql/mssql-formatter.js +34 -34
  25. package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -600
  26. package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
  27. package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
  28. package/lib/dialects/mssql/schema/mssql-tablecompiler.js +378 -378
  29. package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
  30. package/lib/dialects/mssql/transaction.js +176 -176
  31. package/lib/dialects/mysql/index.js +201 -201
  32. package/lib/dialects/mysql/query/mysql-querycompiler.js +274 -274
  33. package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
  34. package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
  35. package/lib/dialects/mysql/schema/mysql-tablecompiler.js +381 -381
  36. package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
  37. package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
  38. package/lib/dialects/mysql/transaction.js +46 -46
  39. package/lib/dialects/mysql2/index.js +53 -33
  40. package/lib/dialects/mysql2/transaction.js +44 -44
  41. package/lib/dialects/oracle/DEAD_CODE.md +5 -5
  42. package/lib/dialects/oracle/index.js +92 -92
  43. package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -342
  44. package/lib/dialects/oracle/schema/internal/incrementUtils.js +20 -20
  45. package/lib/dialects/oracle/schema/internal/trigger.js +135 -135
  46. package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
  47. package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
  48. package/lib/dialects/oracle/schema/oracle-compiler.js +122 -122
  49. package/lib/dialects/oracle/schema/oracle-tablecompiler.js +190 -190
  50. package/lib/dialects/oracle/utils.js +87 -87
  51. package/lib/dialects/oracledb/index.js +327 -327
  52. package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
  53. package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -55
  54. package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
  55. package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
  56. package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
  57. package/lib/dialects/oracledb/transaction.js +98 -98
  58. package/lib/dialects/oracledb/utils.js +208 -208
  59. package/lib/dialects/pgnative/index.js +60 -60
  60. package/lib/dialects/postgres/execution/pg-transaction.js +19 -12
  61. package/lib/dialects/postgres/index.js +358 -358
  62. package/lib/dialects/postgres/query/pg-querybuilder.js +43 -38
  63. package/lib/dialects/postgres/query/pg-querycompiler.js +400 -395
  64. package/lib/dialects/postgres/schema/pg-columncompiler.js +156 -156
  65. package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
  66. package/lib/dialects/postgres/schema/pg-tablecompiler.js +304 -299
  67. package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
  68. package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
  69. package/lib/dialects/redshift/index.js +86 -86
  70. package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
  71. package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
  72. package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
  73. package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
  74. package/lib/dialects/redshift/schema/redshift-tablecompiler.js +122 -122
  75. package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
  76. package/lib/dialects/redshift/transaction.js +32 -25
  77. package/lib/dialects/sqlite3/execution/sqlite-transaction.js +25 -18
  78. package/lib/dialects/sqlite3/index.js +250 -250
  79. package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
  80. package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +334 -334
  81. package/lib/dialects/sqlite3/schema/ddl.js +400 -400
  82. package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
  83. package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
  84. package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
  85. package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
  86. package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
  87. package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
  88. package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
  89. package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
  90. package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +347 -347
  91. package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
  92. package/lib/execution/batch-insert.js +51 -51
  93. package/lib/execution/internal/delay.js +6 -6
  94. package/lib/execution/internal/ensure-connection-callback.js +41 -41
  95. package/lib/execution/internal/query-executioner.js +62 -62
  96. package/lib/execution/runner.js +325 -307
  97. package/lib/execution/transaction.js +409 -401
  98. package/lib/formatter/formatterUtils.js +42 -42
  99. package/lib/formatter/rawFormatter.js +84 -84
  100. package/lib/formatter/wrappingFormatter.js +250 -250
  101. package/lib/formatter.js +25 -25
  102. package/lib/index.js +3 -3
  103. package/lib/knex-builder/FunctionHelper.js +80 -54
  104. package/lib/knex-builder/Knex.js +59 -59
  105. package/lib/knex-builder/internal/config-resolver.js +57 -57
  106. package/lib/knex-builder/internal/parse-connection.js +87 -87
  107. package/lib/knex-builder/make-knex.js +345 -340
  108. package/lib/logger.js +76 -76
  109. package/lib/migrations/common/MigrationsLoader.js +36 -36
  110. package/lib/migrations/migrate/MigrationGenerator.js +84 -84
  111. package/lib/migrations/migrate/Migrator.js +598 -598
  112. package/lib/migrations/migrate/migrate-stub.js +17 -17
  113. package/lib/migrations/migrate/migration-list-resolver.js +33 -33
  114. package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
  115. package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
  116. package/lib/migrations/migrate/stub/cjs.stub +15 -15
  117. package/lib/migrations/migrate/stub/coffee.stub +13 -13
  118. package/lib/migrations/migrate/stub/eg.stub +14 -14
  119. package/lib/migrations/migrate/stub/js-schema.stub +22 -22
  120. package/lib/migrations/migrate/stub/js.stub +22 -22
  121. package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
  122. package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
  123. package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
  124. package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
  125. package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
  126. package/lib/migrations/migrate/stub/ls.stub +14 -14
  127. package/lib/migrations/migrate/stub/mjs.stub +23 -23
  128. package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
  129. package/lib/migrations/migrate/stub/ts.stub +21 -21
  130. package/lib/migrations/migrate/table-creator.js +77 -77
  131. package/lib/migrations/migrate/table-resolver.js +27 -27
  132. package/lib/migrations/seed/Seeder.js +137 -137
  133. package/lib/migrations/seed/seed-stub.js +13 -13
  134. package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
  135. package/lib/migrations/seed/sources/fs-seeds.js +65 -65
  136. package/lib/migrations/seed/stub/coffee.stub +9 -9
  137. package/lib/migrations/seed/stub/eg.stub +11 -11
  138. package/lib/migrations/seed/stub/js.stub +13 -13
  139. package/lib/migrations/seed/stub/ls.stub +11 -11
  140. package/lib/migrations/seed/stub/mjs.stub +12 -12
  141. package/lib/migrations/seed/stub/ts.stub +13 -13
  142. package/lib/migrations/util/fs.js +86 -86
  143. package/lib/migrations/util/import-file.js +12 -12
  144. package/lib/migrations/util/is-module-type.js +9 -9
  145. package/lib/migrations/util/template.js +52 -52
  146. package/lib/migrations/util/timestamp.js +14 -14
  147. package/lib/query/analytic.js +52 -52
  148. package/lib/query/constants.js +15 -15
  149. package/lib/query/joinclause.js +270 -270
  150. package/lib/query/method-constants.js +136 -135
  151. package/lib/query/querybuilder.js +1793 -1794
  152. package/lib/query/querycompiler.js +1591 -1580
  153. package/lib/raw.js +139 -139
  154. package/lib/ref.js +39 -39
  155. package/lib/schema/builder.js +115 -115
  156. package/lib/schema/columnbuilder.js +146 -146
  157. package/lib/schema/columncompiler.js +307 -307
  158. package/lib/schema/compiler.js +187 -187
  159. package/lib/schema/internal/helpers.js +55 -55
  160. package/lib/schema/tablebuilder.js +376 -376
  161. package/lib/schema/tablecompiler.js +433 -433
  162. package/lib/schema/viewbuilder.js +92 -92
  163. package/lib/schema/viewcompiler.js +138 -138
  164. package/lib/util/finally-mixin.js +13 -13
  165. package/lib/util/helpers.js +95 -95
  166. package/lib/util/is.js +32 -32
  167. package/lib/util/nanoid.js +40 -40
  168. package/lib/util/noop.js +1 -1
  169. package/lib/util/save-async-stack.js +14 -14
  170. package/lib/util/security.js +26 -0
  171. package/lib/util/string.js +190 -190
  172. package/lib/util/timeout.js +29 -29
  173. package/package.json +12 -10
  174. package/scripts/build.js +125 -125
  175. package/scripts/clean.js +31 -31
  176. package/scripts/docker-compose.yml +152 -152
  177. package/scripts/next-release-howto.md +24 -24
  178. package/scripts/oracledb-install-driver-libs.sh +82 -82
  179. package/scripts/release.sh +34 -34
  180. package/scripts/runkit-example.js +34 -34
  181. package/scripts/stress-test/README.txt +18 -18
  182. package/scripts/stress-test/docker-compose.yml +57 -57
  183. package/scripts/stress-test/knex-stress-test.js +208 -208
  184. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +145 -145
  185. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +100 -100
  186. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +184 -184
  187. package/scripts/update_gitignore_for_tsc_output.js +90 -90
  188. package/types/index.d.ts +3273 -3233
  189. package/types/result.d.ts +27 -27
  190. package/types/tables.d.ts +4 -4
package/CHANGELOG.md CHANGED
@@ -1,18 +1,54 @@
1
1
  # Master (Unreleased)
2
2
 
3
- # 2.4.2 - 22 January, 2022
3
+ # 2.5.0 - 08 July, 2023
4
+
5
+ ### New features
6
+
7
+ - Add uuid helper function #5617
8
+ - Add `nativeBindings` option to `better-sqlite3` options #5461
9
+ - Add QueryBuilder#updateFrom #5386
10
+ - Add readonly transaction access mode #5445
11
+ - Add readonly option to Better-SQLite3 #5530
12
+ - Add EXCEPT as a valid keyword #5357
13
+ - Add ability to prepend query comments #5289
14
+ - Add fetchAsString option #5484
15
+
16
+ ### Bug fixes
17
+
18
+ - Avoid password leaks on query logs #5559
19
+ - Add knex.mjs to files in package.json #5518
20
+ - Handle numeric array elements in .orderBy() #5551
21
+ - Attach error handler early enough #5552
22
+ - Fix Returning * in Oracle #5598
23
+ - Fix indexType option in `Postgres` #5601
24
+ - Add mjs extension type #5616
25
+ - Use implicit check on json fields for OracleDB #5478
26
+ - Fix when manually close source stream #5466
27
+ - Fix case sensitive issue with get table #5509
28
+
29
+ ### Typings
30
+
31
+ - Add Object syntax overload to increment method #5512
32
+ - Add object syntax overload to decrement method #5555
33
+ - Fix typing for toSql #5594
34
+ - Add ResolveTableType for `.merge()` #5605
35
+ - Add missing types for havingNull and havingNotNull #5529
36
+ - Add collate to the columnbuilder interface #5568
37
+ - TableBuilder methods return the SchemaBuilder. #5486
38
+
39
+ # 2.4.2 - 22 January, 2023
4
40
 
5
41
  ### Bug fixes
6
42
 
7
43
  - CLI: Fix incorrent EOL causing errors on Linux #5455
8
44
 
9
- # 2.4.1 - 18 January, 2022
45
+ # 2.4.1 - 18 January, 2023
10
46
 
11
47
  ### Bug fixes
12
48
 
13
49
  - PostgreSQL: Fix Malformed array literal 2.4.0 Regression #5439
14
50
 
15
- # 2.4.0 - 06 January, 2022
51
+ # 2.4.0 - 06 January, 2023
16
52
 
17
53
  ### New features:
18
54
 
@@ -1367,7 +1403,7 @@ Note: there are many breaking changes in this version, particularly in TypeScrip
1367
1403
 
1368
1404
  ### New features:
1369
1405
 
1370
- - Support passing explicit connection to query builder (#2817)
1406
+ - Support passing explicit connection to query builder #2817
1371
1407
  - Introduced abstraction for getting migrations to make migration bundling easier #2775
1372
1408
  - Allow timestamp with timezone on mssql databases #2724
1373
1409
  - Allow specifying multiple migration directories #2735
@@ -1424,7 +1460,7 @@ Note: there are many breaking changes in this version, particularly in TypeScrip
1424
1460
 
1425
1461
  ### Changes:
1426
1462
 
1427
- - THIS RELEASE WAS UNPUBLISHED FROM NPM BECAUSE IT HAD BROKEN MIGRATIONS USING `postprocessResponse` FEATURE (#2644)
1463
+ - THIS RELEASE WAS UNPUBLISHED FROM NPM BECAUSE IT HAD BROKEN MIGRATIONS USING `postprocessResponse` FEATURE #2644
1428
1464
 
1429
1465
  # 0.15.2 - 19 Jul, 2018
1430
1466
 
@@ -1485,7 +1521,7 @@ Note: there are many breaking changes in this version, particularly in TypeScrip
1485
1521
 
1486
1522
  ### Bug fixes:
1487
1523
 
1488
- - Restored functionality of query event #2566 (#2549)
1524
+ - Restored functionality of query event #2566 #2549
1489
1525
 
1490
1526
  # 0.14.5 - 8 Apr, 2018
1491
1527
 
@@ -1513,23 +1549,23 @@ Note: there are many breaking changes in this version, particularly in TypeScrip
1513
1549
 
1514
1550
  ### Bug fixes:
1515
1551
 
1516
- - containsUndefined only validate plain objects. Fixes #1898 (#2468)
1517
- - Add warning when using .returning() in sqlite3. Fixes #1660 (#2471)
1518
- - Throw an error if .update() results in an empty sql (#2472)
1519
- - Removed unnecessary createTableIfNotExist and replaced with createTable (#2473)
1552
+ - containsUndefined only validate plain objects. Fixes #1898 #2468
1553
+ - Add warning when using .returning() in sqlite3. Fixes #1660 #2471
1554
+ - Throw an error if .update() results in an empty sql #2472
1555
+ - Removed unnecessary createTableIfNotExist and replaced with createTable #2473
1520
1556
 
1521
1557
  ### New Features:
1522
1558
 
1523
- - Allow calling lock procedures (such as forUpdate) outside of transaction. Fixes #2403. (#2475)
1524
- - Added test and documentation for Event 'start' (#2488)
1559
+ - Allow calling lock procedures (such as forUpdate) outside of transaction. Fixes #2403. #2475
1560
+ - Added test and documentation for Event 'start' #2488
1525
1561
 
1526
1562
  ### Test / internal changes:
1527
1563
 
1528
1564
  - Added stress test, which uses TCP proxy to simulate flaky connection #2460
1529
- - Removed old docker tests, new stress test setup (#2474)
1530
- - Removed unused property \_\_cid on the base client (#2481)
1531
- - Changed rm to rimraf in 'npm run dev' (#2483)
1532
- - Changed babel preset and use latest node as target when running dev (#2484)
1565
+ - Removed old docker tests, new stress test setup #2474
1566
+ - Removed unused property \_\_cid on the base client #2481
1567
+ - Changed rm to rimraf in 'npm run dev' #2483
1568
+ - Changed babel preset and use latest node as target when running dev #2484
1533
1569
 
1534
1570
  # 0.14.3 - 8 Feb, 2018
1535
1571
 
@@ -1680,8 +1716,8 @@ Note: there are many breaking changes in this version, particularly in TypeScrip
1680
1716
 
1681
1717
  # 0.12.6 - 19 Oct, 2016
1682
1718
 
1683
- - Address warnings mentioned in #1388 (#1740)
1684
- - Remove postinstall script (#1746)
1719
+ - Address warnings mentioned in #1388 #1740
1720
+ - Remove postinstall script #1746
1685
1721
 
1686
1722
  # 0.12.5 - 12 Oct, 2016
1687
1723
 
package/CONTRIBUTING.md CHANGED
@@ -1,194 +1,194 @@
1
- ## How to contribute to Knex.js
2
-
3
- - Make changes in the `/lib` directory.
4
-
5
- - Before sending a pull request for a feature or bug fix, be sure to have
6
- [tests](https://github.com/knex/knex/tree/master/test). Every pull request that changes the queries should have
7
- also **integration tests which are ran against real database** (in addition to unit tests which checks which kind of queries
8
- are being created).
9
-
10
- - Use the same coding style as the rest of the
11
- [codebase](https://github.com/knex/knex/blob/master/knex.js).
12
-
13
- - All pull requests should be made to the `master` branch.
14
-
15
- - Pull request description should have link to corresponding PR of documentation branch.
16
-
17
- - All pull requests that modify the public API should be updated in [types/index.d.ts](https://github.com/knex/knex/blob/master/types/index.d.ts)
18
-
19
- ## Documentation
20
-
21
- Documentation is no longer maintained in knex master repository. All the documentation pull requests should be sent to https://github.com/knex/documentation
22
-
23
- Documentation pull requests should not be merged before knex version which has the new documented feature is released.
24
-
25
- ## I would like to add support for new dialect to knex, is it possible?
26
-
27
- Currently there are already way too many dialects supported in `knex` and instead of adding new dialect to central codebase, all the dialects should be moved to separate npm packages out from `knex` core library with their respective maintainers and test suites.
28
-
29
- So if you like to write your own dialect, you can just inherit own dialect from knex base classes and use it by passing dialect to knex in knex configuration (https://runkit.com/embed/90b3cpyr4jh2):
30
-
31
- ```js
32
- // simple dialect overriding sqlite3 dialect to use sqlite3-offline driver
33
- require('sqlite3-offline');
34
- const Knex = require('knex');
35
-
36
- const Dialect = require(`knex/lib/dialects/sqlite3/index.js`);
37
- Dialect.prototype._driver = () => require('sqlite3-offline');
38
-
39
- const knex = Knex({
40
- client: Dialect,
41
- connection: ':memory:',
42
- });
43
-
44
- console.log(knex.select(knex.raw(1)).toSQL());
45
-
46
- await knex.schema.createTable('fooobar', (t) => {
47
- t.bigincrements('id');
48
- t.string('data');
49
- });
50
- await knex('fooobar').insert({ data: 'nomnom' });
51
-
52
- console.log('Gimme all the data:', await knex('fooobar'));
53
- ```
54
-
55
- ## What is minimal code to reproduce bug and why I have to provide that when I can just tell whats the problem is
56
-
57
- Writing minimal reproduction code for the problem is time-consuming and sometimes it is also really hard, for
58
- example when the original code where the bug happens is written using express or mocha. So why is it necessary
59
- for me to commit so much time to it when the problem is in `knex`? Contributors should be grateful that I reported
60
- the bug I found.
61
-
62
- The point of runnable code to reproduce the problem is to easily verify that there really is a problem and that the one
63
- who did the report did nothing wrong (surprisingly often problem is in the user code). So instead of just description
64
- what to do the complete code encourages devs to actually test out that problem exists and start solving it and it
65
- saves lots of time.
66
-
67
- tl;dr list:
68
-
69
- 1. Actually in most of the cases developer already figures out what was the problem when writing the minimal test case
70
- or if there was problem how stuff was initialized or how async code was written it is easy to point out the problem.
71
-
72
- 2. It motivates developer to actually try out if the bug really exist by not having to figure out from incomplete example
73
- environment in which and how bug actually manifests.
74
-
75
- 3. There are currently very few people fixing knex issues and if one has to put easily 15-30 minutes time to issue just
76
- to see that I cannot reproduce this issue it just wastes development hours that were available for improving knex.
77
-
78
- Test case should initialize needed tables, insert needed data and fail...
79
-
80
- ```js
81
- const knex = require('knex')({
82
- client: 'pg',
83
- connection: 'postgres:///knex_test'
84
- });
85
-
86
- async function main() {
87
- await knex.schema.createTable(...);
88
- await knex('table').insert({foo: 'bar}');
89
- await knex.destroy();
90
- }
91
-
92
- main();
93
- ```
94
-
95
- Usually issues without reproduction code available are just closed and if the same issue is reported multiple
96
- times maybe someone looks into it.
97
-
98
- One easy way to setup database for your reproduction is to use database from knex's docker-compose setup (npm run db:start) and by checking the connection settings from tests' `test/knexfile.js`.
99
-
100
- ## Integration Tests
101
-
102
- ### The Easy Way
103
-
104
- By default, Knex runs tests against sqlite3, postgresql, mysql, mysql2, mssql and oracledb drivers. All databases can be initialized and ran with docker.
105
-
106
- Docker databases can be started and initialized with:
107
-
108
- ```bash
109
- npm run db:start
110
- ```
111
-
112
- and stopped with:
113
-
114
- ```bash
115
- npm run db:stop
116
- ```
117
-
118
- In case you don't need all of the databases, you can use simplified dev Docker configuration that only runs PostgreSQL, by running `npm run db:start:postgres` and `npm run db:stop:postgres` accordingly.
119
-
120
- ### Installing support for oracledb
121
-
122
- Oracle has started providing precompiled driver libs for all the platforms, which makes it viable to run oracle tests also locally against oracledb running in docker.
123
-
124
- Check message when running
125
-
126
- ```bash
127
- npm install oracledb
128
- ```
129
-
130
- and download driver library binary packages and unzip it to ~/lib directory.
131
-
132
- ### Specifying Databases
133
-
134
- You can optionally specify which dialects to test using the `DB` environment variable. Values should be space separated and can include:
135
-
136
- - mysql
137
- - mysql2
138
- - postgres
139
- - sqlite3
140
- - oracledb
141
- - mssql
142
-
143
- ```bash
144
- $ DB='postgres mysql' npm test
145
- ```
146
-
147
- ### Custom Configuration
148
-
149
- If you'd like to override the database configuration (to use a different host, for example), you can override the path to the [default test configuration](https://github.com/knex/knex/blob/master/test/knexfile.js) using the `KNEX_TEST` environment variable.
150
-
151
- ```bash
152
- $ KNEX_TEST='./path/to/my/config.js' npm test
153
- ```
154
-
155
- ### Creating Postgres User
156
-
157
- If you are running tests against own local database one might need to setup test user and database for knex to connect.
158
-
159
- To create a new user, login to Postgres and use the following queries to add the user. This assumes you've already created the `knex_test` database.
160
-
161
- ```
162
- CREATE ROLE postgres WITH LOGIN PASSWORD '';
163
- GRANT ALL PRIVILEGES ON DATABASE "knex_test" TO postgres;
164
- ```
165
-
166
- Once this is done, check it works by attempting to login:
167
-
168
- ```
169
- psql -h localhost -U postgres -d knex_test
170
- ```
171
-
172
- ## Typescript source files
173
-
174
- > TL;DR: Starting with release 2.0.0 Knex is adding support for Typescript source files. Thus to develop in this repo you will need to run `npm run build` each time you edit `.ts` files to generate the resulting `.js` files. This is automatically run whenever you run `npm install` or checkout a new Git branch so when developing in Javascript you don't have to worry about it. It is encouraged that new functionality and sources be written in Typescript but this is not required.
175
-
176
- Starting with release 2.0.0, Knex is support source additions in Typescript! This allows for better safety in the code added. However, pre-2.0.0 Knex was always written in pure Javascript and thus a "hybrid" approach is being used for 2.0.0 to allow for the new `.ts` files to exist along `.js` files that make up the majority of this repository.
177
-
178
- To develop in this repository use the `npm run build` and `npm run clean` commands to compile and delete the `.js` and related files from `.ts` files. If you wish to have the `tsc` compiled watch and recompile on changes then run `npm run build:ts -- --watch`. Note that for easy integration with Javascript the outputted files are done in a "side-by-side" manner meaning that `lib/foo/bar.ts` will result in `lib/foo/bar.js`. This is done automatically via the npm script command `"prepare"` whenever you run `npm install` and Git hook for `post-checkout` (added by Husky) which executes when you run commands like `git checkout` , thus making it easier to not have to worry about this if you're working in pure Javascript.
179
-
180
- The script file `./scripts/update_gitignore_for_tsc_output.js` file is called as part of the `npm run build` command which will update the `lib/.gitignore` file which is used to ensure generated `.js` and related files from `tsc` compilation are not checked into the git repo.
181
-
182
- ## Want to be Collaborator?
183
-
184
- There is always room for more collaborators. Be active on resolving github issues / sending pull requests / reviewing code and we will ask you to join.
185
-
186
- ### Etiquette (/ˈɛtᵻkɛt/ or /ˈɛtᵻkɪt/, French: [e.ti.kɛt])
187
-
188
- Make pull requests for your changes, do not commit directly to master (release stuff like fixing changelog are ok though).
189
-
190
- All the pull requests must be peer reviewed by other collaborator, so don't merge your request before that. If there is no response ping others.
191
-
192
- If you are going to add new feature to knex (not just a bugfix) it should be discussed first with others to agree on details.
193
-
194
- Join Gitter chat if you feel to chat outside of github issues.
1
+ ## How to contribute to Knex.js
2
+
3
+ - Make changes in the `/lib` directory.
4
+
5
+ - Before sending a pull request for a feature or bug fix, be sure to have
6
+ [tests](https://github.com/knex/knex/tree/master/test). Every pull request that changes the queries should have
7
+ also **integration tests which are ran against real database** (in addition to unit tests which checks which kind of queries
8
+ are being created).
9
+
10
+ - Use the same coding style as the rest of the
11
+ [codebase](https://github.com/knex/knex/blob/master/knex.js).
12
+
13
+ - All pull requests should be made to the `master` branch.
14
+
15
+ - Pull request description should have link to corresponding PR of documentation branch.
16
+
17
+ - All pull requests that modify the public API should be updated in [types/index.d.ts](https://github.com/knex/knex/blob/master/types/index.d.ts)
18
+
19
+ ## Documentation
20
+
21
+ Documentation is no longer maintained in knex master repository. All the documentation pull requests should be sent to https://github.com/knex/documentation
22
+
23
+ Documentation pull requests should not be merged before knex version which has the new documented feature is released.
24
+
25
+ ## I would like to add support for new dialect to knex, is it possible?
26
+
27
+ Currently there are already way too many dialects supported in `knex` and instead of adding new dialect to central codebase, all the dialects should be moved to separate npm packages out from `knex` core library with their respective maintainers and test suites.
28
+
29
+ So if you like to write your own dialect, you can just inherit own dialect from knex base classes and use it by passing dialect to knex in knex configuration (https://runkit.com/embed/90b3cpyr4jh2):
30
+
31
+ ```js
32
+ // simple dialect overriding sqlite3 dialect to use sqlite3-offline driver
33
+ require('sqlite3-offline');
34
+ const Knex = require('knex');
35
+
36
+ const Dialect = require(`knex/lib/dialects/sqlite3/index.js`);
37
+ Dialect.prototype._driver = () => require('sqlite3-offline');
38
+
39
+ const knex = Knex({
40
+ client: Dialect,
41
+ connection: ':memory:',
42
+ });
43
+
44
+ console.log(knex.select(knex.raw(1)).toSQL());
45
+
46
+ await knex.schema.createTable('fooobar', (t) => {
47
+ t.bigincrements('id');
48
+ t.string('data');
49
+ });
50
+ await knex('fooobar').insert({ data: 'nomnom' });
51
+
52
+ console.log('Gimme all the data:', await knex('fooobar'));
53
+ ```
54
+
55
+ ## What is minimal code to reproduce bug and why I have to provide that when I can just tell whats the problem is
56
+
57
+ Writing minimal reproduction code for the problem is time-consuming and sometimes it is also really hard, for
58
+ example when the original code where the bug happens is written using express or mocha. So why is it necessary
59
+ for me to commit so much time to it when the problem is in `knex`? Contributors should be grateful that I reported
60
+ the bug I found.
61
+
62
+ The point of runnable code to reproduce the problem is to easily verify that there really is a problem and that the one
63
+ who did the report did nothing wrong (surprisingly often problem is in the user code). So instead of just description
64
+ what to do the complete code encourages devs to actually test out that problem exists and start solving it and it
65
+ saves lots of time.
66
+
67
+ tl;dr list:
68
+
69
+ 1. Actually in most of the cases developer already figures out what was the problem when writing the minimal test case
70
+ or if there was problem how stuff was initialized or how async code was written it is easy to point out the problem.
71
+
72
+ 2. It motivates developer to actually try out if the bug really exist by not having to figure out from incomplete example
73
+ environment in which and how bug actually manifests.
74
+
75
+ 3. There are currently very few people fixing knex issues and if one has to put easily 15-30 minutes time to issue just
76
+ to see that I cannot reproduce this issue it just wastes development hours that were available for improving knex.
77
+
78
+ Test case should initialize needed tables, insert needed data and fail...
79
+
80
+ ```js
81
+ const knex = require('knex')({
82
+ client: 'pg',
83
+ connection: 'postgres:///knex_test'
84
+ });
85
+
86
+ async function main() {
87
+ await knex.schema.createTable(...);
88
+ await knex('table').insert({foo: 'bar}');
89
+ await knex.destroy();
90
+ }
91
+
92
+ main();
93
+ ```
94
+
95
+ Usually issues without reproduction code available are just closed and if the same issue is reported multiple
96
+ times maybe someone looks into it.
97
+
98
+ One easy way to setup database for your reproduction is to use database from knex's docker-compose setup (npm run db:start) and by checking the connection settings from tests' `test/knexfile.js`.
99
+
100
+ ## Integration Tests
101
+
102
+ ### The Easy Way
103
+
104
+ By default, Knex runs tests against sqlite3, postgresql, mysql, mysql2, mssql and oracledb drivers. All databases can be initialized and ran with docker.
105
+
106
+ Docker databases can be started and initialized with:
107
+
108
+ ```bash
109
+ npm run db:start
110
+ ```
111
+
112
+ and stopped with:
113
+
114
+ ```bash
115
+ npm run db:stop
116
+ ```
117
+
118
+ In case you don't need all of the databases, you can use simplified dev Docker configuration that only runs PostgreSQL, by running `npm run db:start:postgres` and `npm run db:stop:postgres` accordingly.
119
+
120
+ ### Installing support for oracledb
121
+
122
+ Oracle has started providing precompiled driver libs for all the platforms, which makes it viable to run oracle tests also locally against oracledb running in docker.
123
+
124
+ Check message when running
125
+
126
+ ```bash
127
+ npm install oracledb
128
+ ```
129
+
130
+ and download driver library binary packages and unzip it to ~/lib directory.
131
+
132
+ ### Specifying Databases
133
+
134
+ You can optionally specify which dialects to test using the `DB` environment variable. Values should be space separated and can include:
135
+
136
+ - mysql
137
+ - mysql2
138
+ - postgres
139
+ - sqlite3
140
+ - oracledb
141
+ - mssql
142
+
143
+ ```bash
144
+ $ DB='postgres mysql' npm test
145
+ ```
146
+
147
+ ### Custom Configuration
148
+
149
+ If you'd like to override the database configuration (to use a different host, for example), you can override the path to the [default test configuration](https://github.com/knex/knex/blob/master/test/knexfile.js) using the `KNEX_TEST` environment variable.
150
+
151
+ ```bash
152
+ $ KNEX_TEST='./path/to/my/config.js' npm test
153
+ ```
154
+
155
+ ### Creating Postgres User
156
+
157
+ If you are running tests against own local database one might need to setup test user and database for knex to connect.
158
+
159
+ To create a new user, login to Postgres and use the following queries to add the user. This assumes you've already created the `knex_test` database.
160
+
161
+ ```
162
+ CREATE ROLE postgres WITH LOGIN PASSWORD '';
163
+ GRANT ALL PRIVILEGES ON DATABASE "knex_test" TO postgres;
164
+ ```
165
+
166
+ Once this is done, check it works by attempting to login:
167
+
168
+ ```
169
+ psql -h localhost -U postgres -d knex_test
170
+ ```
171
+
172
+ ## Typescript source files
173
+
174
+ > TL;DR: Starting with release 2.0.0 Knex is adding support for Typescript source files. Thus to develop in this repo you will need to run `npm run build` each time you edit `.ts` files to generate the resulting `.js` files. This is automatically run whenever you run `npm install` or checkout a new Git branch so when developing in Javascript you don't have to worry about it. It is encouraged that new functionality and sources be written in Typescript but this is not required.
175
+
176
+ Starting with release 2.0.0, Knex is support source additions in Typescript! This allows for better safety in the code added. However, pre-2.0.0 Knex was always written in pure Javascript and thus a "hybrid" approach is being used for 2.0.0 to allow for the new `.ts` files to exist along `.js` files that make up the majority of this repository.
177
+
178
+ To develop in this repository use the `npm run build` and `npm run clean` commands to compile and delete the `.js` and related files from `.ts` files. If you wish to have the `tsc` compiled watch and recompile on changes then run `npm run build:ts -- --watch`. Note that for easy integration with Javascript the outputted files are done in a "side-by-side" manner meaning that `lib/foo/bar.ts` will result in `lib/foo/bar.js`. This is done automatically via the npm script command `"prepare"` whenever you run `npm install` and Git hook for `post-checkout` (added by Husky) which executes when you run commands like `git checkout` , thus making it easier to not have to worry about this if you're working in pure Javascript.
179
+
180
+ The script file `./scripts/update_gitignore_for_tsc_output.js` file is called as part of the `npm run build` command which will update the `lib/.gitignore` file which is used to ensure generated `.js` and related files from `tsc` compilation are not checked into the git repo.
181
+
182
+ ## Want to be Collaborator?
183
+
184
+ There is always room for more collaborators. Be active on resolving github issues / sending pull requests / reviewing code and we will ask you to join.
185
+
186
+ ### Etiquette (/ˈɛtᵻkɛt/ or /ˈɛtᵻkɪt/, French: [e.ti.kɛt])
187
+
188
+ Make pull requests for your changes, do not commit directly to master (release stuff like fixing changelog are ok though).
189
+
190
+ All the pull requests must be peer reviewed by other collaborator, so don't merge your request before that. If there is no response ping others.
191
+
192
+ If you are going to add new feature to knex (not just a bugfix) it should be discussed first with others to agree on details.
193
+
194
+ Join Gitter chat if you feel to chat outside of github issues.
package/LICENSE CHANGED
@@ -1,22 +1,22 @@
1
- Copyright (c) 2013-present Tim Griesser
2
-
3
- Permission is hereby granted, free of charge, to any person
4
- obtaining a copy of this software and associated documentation
5
- files (the "Software"), to deal in the Software without
6
- restriction, including without limitation the rights to use,
7
- copy, modify, merge, publish, distribute, sublicense, and/or sell
8
- copies of the Software, and to permit persons to whom the
9
- Software is furnished to do so, subject to the following
10
- conditions:
11
-
12
- The above copyright notice and this permission notice shall be
13
- included in all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
- OTHER DEALINGS IN THE SOFTWARE.
1
+ Copyright (c) 2013-present Tim Griesser
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.