knex 3.0.1 → 3.2.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 (199) hide show
  1. package/CHANGELOG.md +2431 -2358
  2. package/CONTRIBUTING.md +190 -194
  3. package/LICENSE +22 -22
  4. package/README.md +156 -149
  5. package/UPGRADING.md +245 -245
  6. package/bin/cli.js +516 -475
  7. package/bin/knexfile-runtime-error.js +27 -0
  8. package/bin/utils/cli-config-utils.js +217 -212
  9. package/bin/utils/constants.js +7 -7
  10. package/bin/utils/migrationsLister.js +37 -37
  11. package/knex.js +23 -23
  12. package/knex.mjs +11 -11
  13. package/lib/builder-interface-augmenter.js +120 -120
  14. package/lib/client.js +585 -495
  15. package/lib/constants.js +61 -61
  16. package/lib/dialects/better-sqlite3/index.js +101 -77
  17. package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
  18. package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
  19. package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
  20. package/lib/dialects/cockroachdb/crdb-tablecompiler.js +46 -37
  21. package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
  22. package/lib/dialects/cockroachdb/index.js +86 -86
  23. package/lib/dialects/index.js +34 -34
  24. package/lib/dialects/mssql/index.js +498 -500
  25. package/lib/dialects/mssql/mssql-formatter.js +34 -34
  26. package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -601
  27. package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
  28. package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
  29. package/lib/dialects/mssql/schema/mssql-tablecompiler.js +393 -378
  30. package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
  31. package/lib/dialects/mssql/transaction.js +176 -176
  32. package/lib/dialects/mysql/index.js +317 -201
  33. package/lib/dialects/mysql/query/mysql-querybuilder.js +14 -0
  34. package/lib/dialects/mysql/query/mysql-querycompiler.js +292 -274
  35. package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
  36. package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
  37. package/lib/dialects/mysql/schema/mysql-tablecompiler.js +426 -381
  38. package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
  39. package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
  40. package/lib/dialects/mysql/transaction.js +46 -46
  41. package/lib/dialects/mysql2/index.js +53 -53
  42. package/lib/dialects/mysql2/transaction.js +44 -44
  43. package/lib/dialects/oracle/DEAD_CODE.md +5 -5
  44. package/lib/dialects/oracle/index.js +92 -92
  45. package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -343
  46. package/lib/dialects/oracle/schema/internal/incrementUtils.js +22 -20
  47. package/lib/dialects/oracle/schema/internal/trigger.js +155 -135
  48. package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
  49. package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
  50. package/lib/dialects/oracle/schema/oracle-compiler.js +124 -122
  51. package/lib/dialects/oracle/schema/oracle-tablecompiler.js +210 -190
  52. package/lib/dialects/oracle/utils.js +107 -87
  53. package/lib/dialects/oracledb/index.js +381 -327
  54. package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
  55. package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -61
  56. package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
  57. package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
  58. package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
  59. package/lib/dialects/oracledb/transaction.js +98 -98
  60. package/lib/dialects/oracledb/utils.js +208 -208
  61. package/lib/dialects/pgnative/index.js +60 -60
  62. package/lib/dialects/postgres/execution/pg-transaction.js +19 -19
  63. package/lib/dialects/postgres/index.js +373 -358
  64. package/lib/dialects/postgres/query/pg-querybuilder.js +43 -43
  65. package/lib/dialects/postgres/query/pg-querycompiler.js +400 -400
  66. package/lib/dialects/postgres/schema/pg-columncompiler.js +162 -156
  67. package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
  68. package/lib/dialects/postgres/schema/pg-tablecompiler.js +331 -304
  69. package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
  70. package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
  71. package/lib/dialects/redshift/index.js +86 -86
  72. package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
  73. package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
  74. package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
  75. package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
  76. package/lib/dialects/redshift/schema/redshift-tablecompiler.js +134 -122
  77. package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
  78. package/lib/dialects/redshift/transaction.js +32 -32
  79. package/lib/dialects/sqlite3/execution/sqlite-transaction.js +172 -25
  80. package/lib/dialects/sqlite3/index.js +263 -250
  81. package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
  82. package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +341 -334
  83. package/lib/dialects/sqlite3/schema/ddl.js +380 -400
  84. package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
  85. package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
  86. package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
  87. package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
  88. package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
  89. package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
  90. package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
  91. package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
  92. package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +364 -347
  93. package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
  94. package/lib/execution/batch-insert.js +51 -51
  95. package/lib/execution/internal/delay.js +6 -6
  96. package/lib/execution/internal/ensure-connection-callback.js +41 -41
  97. package/lib/execution/internal/query-executioner.js +62 -62
  98. package/lib/execution/runner.js +325 -325
  99. package/lib/execution/transaction.js +417 -409
  100. package/lib/formatter/formatterUtils.js +42 -42
  101. package/lib/formatter/rawFormatter.js +84 -84
  102. package/lib/formatter/wrappingFormatter.js +253 -250
  103. package/lib/formatter.js +25 -25
  104. package/lib/index.js +3 -3
  105. package/lib/knex-builder/FunctionHelper.js +80 -80
  106. package/lib/knex-builder/Knex.js +59 -59
  107. package/lib/knex-builder/internal/config-resolver.js +57 -57
  108. package/lib/knex-builder/internal/parse-connection.js +87 -87
  109. package/lib/knex-builder/make-knex.js +345 -345
  110. package/lib/logger.js +76 -76
  111. package/lib/migrations/common/MigrationsLoader.js +36 -36
  112. package/lib/migrations/migrate/MigrationGenerator.js +84 -84
  113. package/lib/migrations/migrate/Migrator.js +632 -599
  114. package/lib/migrations/migrate/migrate-stub.js +17 -17
  115. package/lib/migrations/migrate/migration-list-resolver.js +33 -33
  116. package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
  117. package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
  118. package/lib/migrations/migrate/stub/cjs.stub +15 -15
  119. package/lib/migrations/migrate/stub/coffee.stub +13 -13
  120. package/lib/migrations/migrate/stub/eg.stub +14 -14
  121. package/lib/migrations/migrate/stub/js-schema.stub +22 -22
  122. package/lib/migrations/migrate/stub/js.stub +22 -22
  123. package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
  124. package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
  125. package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
  126. package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
  127. package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
  128. package/lib/migrations/migrate/stub/ls.stub +14 -14
  129. package/lib/migrations/migrate/stub/mjs.stub +23 -23
  130. package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
  131. package/lib/migrations/migrate/stub/ts.stub +21 -21
  132. package/lib/migrations/migrate/table-creator.js +77 -77
  133. package/lib/migrations/migrate/table-resolver.js +27 -27
  134. package/lib/migrations/seed/Seeder.js +137 -137
  135. package/lib/migrations/seed/seed-stub.js +13 -13
  136. package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
  137. package/lib/migrations/seed/sources/fs-seeds.js +65 -65
  138. package/lib/migrations/seed/stub/coffee.stub +9 -9
  139. package/lib/migrations/seed/stub/eg.stub +11 -11
  140. package/lib/migrations/seed/stub/js.stub +13 -13
  141. package/lib/migrations/seed/stub/ls.stub +11 -11
  142. package/lib/migrations/seed/stub/mjs.stub +12 -12
  143. package/lib/migrations/seed/stub/ts.stub +13 -13
  144. package/lib/migrations/util/fs.js +86 -86
  145. package/lib/migrations/util/import-file.js +12 -12
  146. package/lib/migrations/util/is-module-type.js +9 -9
  147. package/lib/migrations/util/template.js +52 -52
  148. package/lib/migrations/util/timestamp.js +14 -14
  149. package/lib/query/analytic.js +52 -52
  150. package/lib/query/constants.js +15 -15
  151. package/lib/query/joinclause.js +270 -270
  152. package/lib/query/method-constants.js +136 -136
  153. package/lib/query/querybuilder.js +1793 -1793
  154. package/lib/query/querycompiler.js +1634 -1591
  155. package/lib/raw.js +139 -139
  156. package/lib/ref.js +39 -39
  157. package/lib/schema/builder.js +115 -115
  158. package/lib/schema/columnbuilder.js +146 -146
  159. package/lib/schema/columncompiler.js +307 -307
  160. package/lib/schema/compiler.js +187 -187
  161. package/lib/schema/internal/helpers.js +55 -55
  162. package/lib/schema/tablebuilder.js +379 -376
  163. package/lib/schema/tablecompiler.js +450 -433
  164. package/lib/schema/viewbuilder.js +92 -92
  165. package/lib/schema/viewcompiler.js +138 -138
  166. package/lib/util/finally-mixin.js +13 -13
  167. package/lib/util/helpers.js +95 -95
  168. package/lib/util/is.js +32 -32
  169. package/lib/util/nanoid.js +40 -40
  170. package/lib/util/noop.js +1 -1
  171. package/lib/util/save-async-stack.js +14 -14
  172. package/lib/util/security.js +32 -26
  173. package/lib/util/string.js +190 -190
  174. package/lib/util/timeout.js +29 -29
  175. package/package.json +285 -266
  176. package/scripts/act-testing/act.sh +19 -0
  177. package/scripts/act-testing/merged-no-label.json +11 -0
  178. package/scripts/act-testing/merged-patch-labeled.json +12 -0
  179. package/scripts/act-testing/merged-skip-labeled.json +12 -0
  180. package/scripts/act-testing/not-merged-patch-labeled.json +12 -0
  181. package/scripts/build-for-release.sh +122 -0
  182. package/scripts/build.js +125 -125
  183. package/scripts/clean.js +31 -31
  184. package/scripts/docker-compose.yml +150 -152
  185. package/scripts/format-changelog.js +55 -0
  186. package/scripts/next-release-howto.md +24 -24
  187. package/scripts/oracledb-install-driver-libs.sh +82 -82
  188. package/scripts/release.sh +36 -36
  189. package/scripts/runkit-example.js +35 -35
  190. package/scripts/stress-test/README.txt +18 -18
  191. package/scripts/stress-test/docker-compose.yml +55 -57
  192. package/scripts/stress-test/knex-stress-test.js +212 -212
  193. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +149 -149
  194. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +101 -101
  195. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +188 -188
  196. package/types/index.d.ts +3321 -3272
  197. package/types/result.d.ts +27 -27
  198. package/types/tables.d.ts +4 -4
  199. package/scripts/update_gitignore_for_tsc_output.js +0 -90
@@ -0,0 +1,12 @@
1
+ {
2
+ "pull_request": {
3
+ "head": {
4
+ "ref": "pr-getting-merged"
5
+ },
6
+ "base": {
7
+ "ref": "master"
8
+ },
9
+ "merged": false,
10
+ "labels": [{ "name": "patch" }]
11
+ }
12
+ }
@@ -0,0 +1,122 @@
1
+ #!/bin/bash -e
2
+
3
+ # context: currently, no package lockfile is utilized in this repository.
4
+ # this is so that CI tests run on the ~latest versions of dependencies,
5
+ # especially the peer dependencies of database clients, so that our tests
6
+ # will more readily surface problems that our users will experience when
7
+ # they just do the normal thing.
8
+
9
+ # however, for automatic release publishing, we want to be much stricter
10
+ # with the dependencies that are involved in the workflow to avoid risks
11
+ # from e.g. supply chain attacks.
12
+
13
+ # we could use "npm ci" if we had a lockfile, but instead we're going to
14
+ # separately maintain pinned versions of the build dependencies and run
15
+ # exactly those versions. care should be taken when updating/altering the
16
+ # versions to vet them.
17
+
18
+ # pinned versions of the dependencies required to perform a release build
19
+ declare -A PINNED_VERSIONS=(
20
+ [typescript]="5.0.4"
21
+ [prettier]="2.8.7"
22
+ [@types/node]="20.19.11"
23
+ [@tsconfig/node12]="1.0.11"
24
+ )
25
+
26
+ # validate args
27
+ BUMP_TYPE="$1"
28
+ case "$BUMP_TYPE" in
29
+ major|minor|patch)
30
+ # valid
31
+ ;;
32
+ *)
33
+ >&2 echo "Invalid bump type. Use: $0 {major|minor|patch}"
34
+ exit 1
35
+ ;;
36
+ esac
37
+
38
+
39
+ # npm 7 doesn't provide a way to install only a specific dependency, it's
40
+ # all-or-nothing. so we have to do some shenanigans to validate our pinned
41
+ # versions against package.json
42
+
43
+ # create a jq expression for a minimal package.json that includes only
44
+ # our build dependencies
45
+ tmpl='
46
+ {
47
+ name: "dep-check",
48
+ private: true,
49
+ version: "0.0.0",
50
+ devDependencies: {
51
+ '
52
+ for pkg in "${!PINNED_VERSIONS[@]}"; do
53
+ # for each pinned dependency, add something like:
54
+ # pkg: .devDependencies.pkg
55
+ tmpl+=" \"${pkg}\": .devDependencies[\"${pkg}\"],
56
+ "
57
+ done
58
+ tmpl+='
59
+ }
60
+ }'
61
+
62
+ PROJECT_DIR="$(pwd)"
63
+ TMP_DIR="$(mktemp -d)"
64
+
65
+ # render the template to a package.json file in a temp dir
66
+ echo
67
+ echo "Build dependencies:"
68
+ jq "$tmpl" package.json | tee "$TMP_DIR/package.json"
69
+
70
+ # install dependencies at the pinned version in the temp dir
71
+ # ignore pre/post script hooks
72
+ echo
73
+ echo "Installing packages"
74
+ >/dev/null pushd "$TMP_DIR"
75
+
76
+ failed=0
77
+ for pkg in "${!PINNED_VERSIONS[@]}"; do
78
+ fqpkg="${pkg}@${PINNED_VERSIONS[$pkg]}"
79
+ echo "npm install --no-save --ignore-scripts $fqpkg"
80
+ >/dev/null 2>/dev/null npm install --no-save --ignore-scripts "$fqpkg"
81
+
82
+
83
+ # ensure the pinned version conforms to package.json semver specification
84
+ if npm ls 2>/dev/null | grep invalid; then
85
+ failed=1
86
+ fi
87
+ done
88
+
89
+ # one or more pins is incorrect, do not publish
90
+ if [[ "$failed" = 1 ]]; then
91
+ echo
92
+ echo "One or more pinned dependencies do not satisfy package.json requirements"
93
+ echo "Please update '$0'"
94
+ exit 1
95
+ fi
96
+
97
+ >/dev/null popd
98
+
99
+ # move tempdir node_modules to build dir
100
+ mv "$TMP_DIR/node_modules" "$PROJECT_DIR/node_modules"
101
+ echo
102
+ echo "node_modules:"
103
+ ls -l node_modules
104
+
105
+ echo "Running build steps"
106
+
107
+ # run the package.json build script
108
+ # currently, this executes typescript and uses
109
+ # prettier to format the TS output
110
+ npm run build
111
+
112
+ # bump the version in package.json
113
+ npm version "$BUMP_TYPE" --no-git-tag-version
114
+
115
+ # we don't commit here, but we do create the tarball that
116
+ # will be published to npm. the dependent job takes the
117
+ # tarball and commits the changes + publishes the tarball
118
+
119
+ # create the tarball for handoff and record its filename
120
+ TARBALL="$(npm pack --silent)"
121
+ echo "tarball=$TARBALL" >> "$GITHUB_OUTPUT"
122
+ ls -la "$TARBALL"
package/scripts/build.js CHANGED
@@ -1,125 +1,125 @@
1
- #!/usr/bin/env node
2
- const fs = require('fs');
3
- const path = require('path');
4
- const child_process = require('child_process');
5
- const _ = require('lodash');
6
-
7
- const exec = function (cmd, args) {
8
- return new Promise(function (resolve, reject) {
9
- // Execute command
10
- const child = child_process.exec(cmd, {
11
- cwd: process.cwd(),
12
- env: process.env,
13
- });
14
-
15
- // Pass stdout and stderr
16
- child.stdout.on('data', function (data) {
17
- process.stdout.write(data.toString());
18
- });
19
- child.stderr.on('data', function (data) {
20
- process.stderr.write(data.toString());
21
- });
22
- // Handle result
23
- child.on('exit', function (code) {
24
- if (code) reject(code);
25
- else resolve();
26
- });
27
- child.on('error', reject);
28
- });
29
- };
30
-
31
- const CWD = process.cwd();
32
- const POSTINSTALL_BUILD_CWD = process.env.POSTINSTALL_BUILD_CWD;
33
-
34
- // If we didn't have this check, then we'd be stuck in an infinite `postinstall`
35
- // loop, since we run `npm install --only=dev` below, triggering another
36
- // `postinstall`. We can't use `--ignore-scripts` because that ignores scripts
37
- // on all the modules that get installed, too, which would break stuff. So
38
- // instead, we set an environment variable, `POSTINSTALL_BUILD_CWD`, that keeps
39
- // track of what we're installing. It's more than just a yes/no flag because
40
- // the dev dependencies we're installing might use `postinstall-build` too, and
41
- // we don't want the flag to prevent them from running.
42
- if (POSTINSTALL_BUILD_CWD !== CWD) {
43
- const BUILD_ARTIFACT = process.argv[2];
44
- const BUILD_COMMAND = process.argv[3];
45
-
46
- fs.stat(BUILD_ARTIFACT, function (err, stats) {
47
- if (err || !(stats.isFile() || stats.isDirectory())) {
48
- // This script will run again after we run `npm install` below. Set an
49
- // environment variable to tell it to skip the check. Really we just want
50
- // the execSync's `env` to be modified, but it's easier just modify and
51
- // pass along the entire `process.env`.
52
- process.env.POSTINSTALL_BUILD_CWD = CWD;
53
- // We already have prod dependencies, that's what triggered `postinstall`
54
- // in the first place. So only install dev.
55
-
56
- // Fetch package.json
57
- const pkgJson = require(path.join(CWD, 'package.json'));
58
- const devDeps = pkgJson.devDependencies;
59
- // Values listed under `buildDependencies` contain the dependency names
60
- // that are required for `lib` building.
61
- const buildDependencies = _.pick(devDeps, pkgJson.buildDependencies);
62
-
63
- // Proceed only if there is something to install
64
- if (!_.isEmpty(buildDependencies)) {
65
- const opts = { env: process.env, stdio: 'inherit' };
66
-
67
- console.log('Building Knex.js');
68
-
69
- // Map all key (dependency) value (semver) pairs to
70
- // "dependency@semver dependency@semver ..." string that can be used
71
- // for `npm install` command
72
- const installArgs = _(buildDependencies)
73
- .pickBy(function (semver, dep) {
74
- // Check if the dependency is already installed
75
- try {
76
- require(dep);
77
- return false;
78
- } catch (err) {
79
- return true;
80
- }
81
- })
82
- .map(function (semver, dep) {
83
- // Format installable dependencies
84
- return dep + '@' + semver;
85
- })
86
- .value()
87
- .join(' ');
88
- const needsDepInstallation = !_.isEmpty(installArgs);
89
- const dependenciesInstalledQ = needsDepInstallation
90
- ? exec('npm install ' + installArgs, opts)
91
- : Promise.resolve();
92
- dependenciesInstalledQ
93
- .then(function () {
94
- console.log('✓');
95
- // Don't need the flag anymore as `postinstall` was already run.
96
- // Change it back so the environment is minimally changed for the
97
- // remaining commands.
98
- process.env.POSTINSTALL_BUILD_CWD = POSTINSTALL_BUILD_CWD;
99
- console.log('Building compiled files (' + BUILD_COMMAND + ')');
100
- return exec(BUILD_COMMAND, opts);
101
- })
102
- .catch(function (err) {
103
- console.error(err);
104
- process.exit(1);
105
- })
106
- .then(function () {
107
- if (process.env.NODE_ENV === 'production') {
108
- console.log('✓');
109
- console.log('Pruning dev dependencies for production build');
110
- return exec('npm prune --production', opts);
111
- } else {
112
- console.log('Skipping npm prune');
113
- }
114
- })
115
- .then(function () {
116
- console.log('✓');
117
- })
118
- .catch(function (err) {
119
- console.error(err);
120
- process.exit(1);
121
- });
122
- }
123
- }
124
- });
125
- }
1
+ #!/usr/bin/env node
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const child_process = require('child_process');
5
+ const _ = require('lodash');
6
+
7
+ const exec = function (cmd, args) {
8
+ return new Promise(function (resolve, reject) {
9
+ // Execute command
10
+ const child = child_process.exec(cmd, {
11
+ cwd: process.cwd(),
12
+ env: process.env,
13
+ });
14
+
15
+ // Pass stdout and stderr
16
+ child.stdout.on('data', function (data) {
17
+ process.stdout.write(data.toString());
18
+ });
19
+ child.stderr.on('data', function (data) {
20
+ process.stderr.write(data.toString());
21
+ });
22
+ // Handle result
23
+ child.on('exit', function (code) {
24
+ if (code) reject(code);
25
+ else resolve();
26
+ });
27
+ child.on('error', reject);
28
+ });
29
+ };
30
+
31
+ const CWD = process.cwd();
32
+ const POSTINSTALL_BUILD_CWD = process.env.POSTINSTALL_BUILD_CWD;
33
+
34
+ // If we didn't have this check, then we'd be stuck in an infinite `postinstall`
35
+ // loop, since we run `npm install --only=dev` below, triggering another
36
+ // `postinstall`. We can't use `--ignore-scripts` because that ignores scripts
37
+ // on all the modules that get installed, too, which would break stuff. So
38
+ // instead, we set an environment variable, `POSTINSTALL_BUILD_CWD`, that keeps
39
+ // track of what we're installing. It's more than just a yes/no flag because
40
+ // the dev dependencies we're installing might use `postinstall-build` too, and
41
+ // we don't want the flag to prevent them from running.
42
+ if (POSTINSTALL_BUILD_CWD !== CWD) {
43
+ const BUILD_ARTIFACT = process.argv[2];
44
+ const BUILD_COMMAND = process.argv[3];
45
+
46
+ fs.stat(BUILD_ARTIFACT, function (err, stats) {
47
+ if (err || !(stats.isFile() || stats.isDirectory())) {
48
+ // This script will run again after we run `npm install` below. Set an
49
+ // environment variable to tell it to skip the check. Really we just want
50
+ // the execSync's `env` to be modified, but it's easier just modify and
51
+ // pass along the entire `process.env`.
52
+ process.env.POSTINSTALL_BUILD_CWD = CWD;
53
+ // We already have prod dependencies, that's what triggered `postinstall`
54
+ // in the first place. So only install dev.
55
+
56
+ // Fetch package.json
57
+ const pkgJson = require(path.join(CWD, 'package.json'));
58
+ const devDeps = pkgJson.devDependencies;
59
+ // Values listed under `buildDependencies` contain the dependency names
60
+ // that are required for `lib` building.
61
+ const buildDependencies = _.pick(devDeps, pkgJson.buildDependencies);
62
+
63
+ // Proceed only if there is something to install
64
+ if (!_.isEmpty(buildDependencies)) {
65
+ const opts = { env: process.env, stdio: 'inherit' };
66
+
67
+ console.log('Building Knex.js');
68
+
69
+ // Map all key (dependency) value (semver) pairs to
70
+ // "dependency@semver dependency@semver ..." string that can be used
71
+ // for `npm install` command
72
+ const installArgs = _(buildDependencies)
73
+ .pickBy(function (semver, dep) {
74
+ // Check if the dependency is already installed
75
+ try {
76
+ require(dep);
77
+ return false;
78
+ } catch (err) {
79
+ return true;
80
+ }
81
+ })
82
+ .map(function (semver, dep) {
83
+ // Format installable dependencies
84
+ return dep + '@' + semver;
85
+ })
86
+ .value()
87
+ .join(' ');
88
+ const needsDepInstallation = !_.isEmpty(installArgs);
89
+ const dependenciesInstalledQ = needsDepInstallation
90
+ ? exec('npm install ' + installArgs, opts)
91
+ : Promise.resolve();
92
+ dependenciesInstalledQ
93
+ .then(function () {
94
+ console.log('✓');
95
+ // Don't need the flag anymore as `postinstall` was already run.
96
+ // Change it back so the environment is minimally changed for the
97
+ // remaining commands.
98
+ process.env.POSTINSTALL_BUILD_CWD = POSTINSTALL_BUILD_CWD;
99
+ console.log('Building compiled files (' + BUILD_COMMAND + ')');
100
+ return exec(BUILD_COMMAND, opts);
101
+ })
102
+ .catch(function (err) {
103
+ console.error(err);
104
+ process.exit(1);
105
+ })
106
+ .then(function () {
107
+ if (process.env.NODE_ENV === 'production') {
108
+ console.log('✓');
109
+ console.log('Pruning dev dependencies for production build');
110
+ return exec('npm prune --production', opts);
111
+ } else {
112
+ console.log('Skipping npm prune');
113
+ }
114
+ })
115
+ .then(function () {
116
+ console.log('✓');
117
+ })
118
+ .catch(function (err) {
119
+ console.error(err);
120
+ process.exit(1);
121
+ });
122
+ }
123
+ }
124
+ });
125
+ }
package/scripts/clean.js CHANGED
@@ -1,31 +1,31 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const path = require('path');
5
- const { execSync } = require('child_process');
6
-
7
- function main() {
8
- const repoDir = path.dirname(__dirname);
9
- const gitDir = path.join(repoDir, '.git');
10
- const gitDirExists = doesDirectoryExist(gitDir);
11
- if (!gitDirExists) {
12
- console.log("No .git directory detected so can not clean 'lib/'. Exiting.");
13
- process.exit(0);
14
- }
15
- console.log(
16
- "Cleaning 'lib/' of outputted files from Typescript compilation ..."
17
- );
18
- const cmd = 'git clean -f -X lib/';
19
- const output = execSync(cmd, { cwd: repoDir });
20
- console.log(output.toString('utf8'));
21
- console.log('Done');
22
- }
23
-
24
- function doesDirectoryExist(p) {
25
- if (fs.existsSync(p)) {
26
- return fs.lstatSync(p).isDirectory();
27
- }
28
- return false;
29
- }
30
-
31
- main();
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { execSync } = require('child_process');
6
+
7
+ function main() {
8
+ const repoDir = path.dirname(__dirname);
9
+ const gitDir = path.join(repoDir, '.git');
10
+ const gitDirExists = doesDirectoryExist(gitDir);
11
+ if (!gitDirExists) {
12
+ console.log("No .git directory detected so can not clean 'lib/'. Exiting.");
13
+ process.exit(0);
14
+ }
15
+ console.log(
16
+ "Cleaning 'lib/' of outputted files from Typescript compilation ..."
17
+ );
18
+ const cmd = 'git clean -f -X lib/';
19
+ const output = execSync(cmd, { cwd: repoDir });
20
+ console.log(output.toString('utf8'));
21
+ console.log('Done');
22
+ }
23
+
24
+ function doesDirectoryExist(p) {
25
+ if (fs.existsSync(p)) {
26
+ return fs.lstatSync(p).isDirectory();
27
+ }
28
+ return false;
29
+ }
30
+
31
+ main();