knex 3.2.3 → 3.2.5
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/CHANGELOG.md +2447 -2441
- package/CONTRIBUTING.md +190 -190
- package/LICENSE +22 -22
- package/README.md +177 -156
- package/UPGRADING.md +245 -245
- package/bin/cli.js +516 -516
- package/bin/knexfile-runtime-error.js +27 -27
- package/bin/utils/cli-config-utils.js +217 -217
- package/bin/utils/constants.js +7 -7
- package/bin/utils/migrationsLister.js +37 -37
- package/knex.js +23 -23
- package/knex.mjs +11 -11
- package/lib/builder-interface-augmenter.js +120 -120
- package/lib/client.js +585 -585
- package/lib/constants.js +61 -61
- package/lib/dialects/better-sqlite3/index.js +101 -101
- package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
- package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
- package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
- package/lib/dialects/cockroachdb/crdb-tablecompiler.js +46 -46
- package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
- package/lib/dialects/cockroachdb/index.js +86 -86
- package/lib/dialects/index.js +34 -34
- package/lib/dialects/mssql/index.js +498 -498
- package/lib/dialects/mssql/mssql-formatter.js +34 -34
- package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -601
- package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
- package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
- package/lib/dialects/mssql/schema/mssql-tablecompiler.js +393 -393
- package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
- package/lib/dialects/mssql/transaction.js +176 -176
- package/lib/dialects/mysql/index.js +317 -317
- package/lib/dialects/mysql/query/mysql-querybuilder.js +14 -14
- package/lib/dialects/mysql/query/mysql-querycompiler.js +292 -292
- package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
- package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
- package/lib/dialects/mysql/schema/mysql-tablecompiler.js +426 -426
- package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
- package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
- package/lib/dialects/mysql/transaction.js +46 -46
- package/lib/dialects/mysql2/index.js +53 -53
- package/lib/dialects/mysql2/transaction.js +44 -44
- package/lib/dialects/oracle/DEAD_CODE.md +5 -5
- package/lib/dialects/oracle/index.js +92 -92
- package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -343
- package/lib/dialects/oracle/schema/internal/incrementUtils.js +22 -22
- package/lib/dialects/oracle/schema/internal/trigger.js +155 -155
- package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
- package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
- package/lib/dialects/oracle/schema/oracle-compiler.js +124 -124
- package/lib/dialects/oracle/schema/oracle-tablecompiler.js +210 -210
- package/lib/dialects/oracle/utils.js +107 -107
- package/lib/dialects/oracledb/index.js +381 -381
- package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
- package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -61
- package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
- package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
- package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
- package/lib/dialects/oracledb/transaction.js +98 -98
- package/lib/dialects/oracledb/utils.js +208 -208
- package/lib/dialects/pgnative/index.js +60 -60
- package/lib/dialects/postgres/execution/pg-transaction.js +19 -19
- package/lib/dialects/postgres/index.js +373 -373
- package/lib/dialects/postgres/query/pg-querybuilder.js +43 -43
- package/lib/dialects/postgres/query/pg-querycompiler.js +400 -400
- package/lib/dialects/postgres/schema/pg-columncompiler.js +162 -162
- package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
- package/lib/dialects/postgres/schema/pg-tablecompiler.js +331 -331
- package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
- package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
- package/lib/dialects/redshift/index.js +86 -86
- package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
- package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
- package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
- package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
- package/lib/dialects/redshift/schema/redshift-tablecompiler.js +134 -134
- package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
- package/lib/dialects/redshift/transaction.js +32 -32
- package/lib/dialects/sqlite3/execution/sqlite-transaction.js +172 -172
- package/lib/dialects/sqlite3/index.js +263 -263
- package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
- package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +341 -341
- package/lib/dialects/sqlite3/schema/ddl.js +380 -380
- package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
- package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
- package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
- package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
- package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
- package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
- package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
- package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
- package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +364 -364
- package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
- package/lib/execution/batch-insert.js +51 -51
- package/lib/execution/internal/delay.js +6 -6
- package/lib/execution/internal/ensure-connection-callback.js +41 -41
- package/lib/execution/internal/query-executioner.js +62 -62
- package/lib/execution/runner.js +325 -325
- package/lib/execution/transaction.js +417 -417
- package/lib/formatter/formatterUtils.js +42 -42
- package/lib/formatter/rawFormatter.js +84 -84
- package/lib/formatter/wrappingFormatter.js +253 -253
- package/lib/formatter.js +25 -25
- package/lib/index.js +3 -3
- package/lib/knex-builder/FunctionHelper.js +80 -80
- package/lib/knex-builder/Knex.js +59 -59
- package/lib/knex-builder/internal/config-resolver.js +57 -57
- package/lib/knex-builder/internal/parse-connection.js +87 -87
- package/lib/knex-builder/make-knex.js +345 -345
- package/lib/logger.js +76 -76
- package/lib/migrations/common/MigrationsLoader.js +36 -36
- package/lib/migrations/migrate/MigrationGenerator.js +84 -84
- package/lib/migrations/migrate/Migrator.js +632 -632
- package/lib/migrations/migrate/migrate-stub.js +17 -17
- package/lib/migrations/migrate/migration-list-resolver.js +33 -33
- package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
- package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
- package/lib/migrations/migrate/stub/cjs.stub +15 -15
- package/lib/migrations/migrate/stub/coffee.stub +13 -13
- package/lib/migrations/migrate/stub/eg.stub +14 -14
- package/lib/migrations/migrate/stub/js-schema.stub +22 -22
- package/lib/migrations/migrate/stub/js.stub +22 -22
- package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
- package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
- package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
- package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
- package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
- package/lib/migrations/migrate/stub/ls.stub +14 -14
- package/lib/migrations/migrate/stub/mjs.stub +23 -23
- package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
- package/lib/migrations/migrate/stub/ts.stub +21 -21
- package/lib/migrations/migrate/table-creator.js +77 -77
- package/lib/migrations/migrate/table-resolver.js +27 -27
- package/lib/migrations/seed/Seeder.js +137 -137
- package/lib/migrations/seed/seed-stub.js +13 -13
- package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
- package/lib/migrations/seed/sources/fs-seeds.js +65 -65
- package/lib/migrations/seed/stub/coffee.stub +9 -9
- package/lib/migrations/seed/stub/eg.stub +11 -11
- package/lib/migrations/seed/stub/js.stub +13 -13
- package/lib/migrations/seed/stub/ls.stub +11 -11
- package/lib/migrations/seed/stub/mjs.stub +12 -12
- package/lib/migrations/seed/stub/ts.stub +13 -13
- package/lib/migrations/util/fs.js +86 -86
- package/lib/migrations/util/import-file.js +12 -12
- package/lib/migrations/util/is-module-type.js +9 -9
- package/lib/migrations/util/template.js +52 -52
- package/lib/migrations/util/timestamp.js +14 -14
- package/lib/query/analytic.js +52 -52
- package/lib/query/constants.js +15 -15
- package/lib/query/joinclause.js +270 -270
- package/lib/query/method-constants.js +136 -136
- package/lib/query/querybuilder.js +1793 -1793
- package/lib/query/querycompiler.js +1634 -1634
- package/lib/raw.js +139 -139
- package/lib/ref.js +39 -39
- package/lib/schema/builder.js +115 -115
- package/lib/schema/columnbuilder.js +146 -146
- package/lib/schema/columncompiler.js +307 -307
- package/lib/schema/compiler.js +187 -187
- package/lib/schema/internal/helpers.js +55 -55
- package/lib/schema/tablebuilder.js +379 -379
- package/lib/schema/tablecompiler.js +450 -450
- package/lib/schema/viewbuilder.js +92 -92
- package/lib/schema/viewcompiler.js +138 -138
- package/lib/util/finally-mixin.js +13 -13
- package/lib/util/helpers.js +95 -95
- package/lib/util/is.js +32 -32
- package/lib/util/nanoid.js +40 -40
- package/lib/util/noop.js +1 -1
- package/lib/util/save-async-stack.js +14 -14
- package/lib/util/security.js +32 -32
- package/lib/util/string.js +190 -190
- package/lib/util/timeout.js +29 -29
- package/package.json +295 -293
- package/scripts/act-testing/act.sh +19 -19
- package/scripts/act-testing/merged-no-label.json +11 -11
- package/scripts/act-testing/merged-patch-labeled.json +12 -12
- package/scripts/act-testing/merged-skip-labeled.json +12 -12
- package/scripts/act-testing/not-merged-patch-labeled.json +12 -12
- package/scripts/build-for-release.sh +121 -121
- package/scripts/build.js +125 -125
- package/scripts/clean.js +31 -31
- package/scripts/docker-compose.yml +150 -150
- package/scripts/format-changelog.js +55 -55
- package/scripts/next-release-howto.md +24 -24
- package/scripts/oracledb-install-driver-libs.sh +82 -82
- package/scripts/release.sh +36 -36
- package/scripts/runkit-example.js +35 -35
- package/scripts/stress-test/README.txt +18 -18
- package/scripts/stress-test/docker-compose.yml +55 -55
- package/scripts/stress-test/knex-stress-test.js +212 -212
- package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +149 -149
- package/scripts/stress-test/mysql2-sudden-exit-without-error.js +101 -101
- package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +188 -188
- package/types/index.d.mts +14 -0
- package/types/index.d.ts +3321 -3321
- package/types/result.d.ts +27 -27
- package/types/tables.d.ts +4 -4
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
{
|
|
2
|
-
"pull_request": {
|
|
3
|
-
"head": {
|
|
4
|
-
"ref": "pr-getting-merged"
|
|
5
|
-
},
|
|
6
|
-
"base": {
|
|
7
|
-
"ref": "master"
|
|
8
|
-
},
|
|
9
|
-
"merged": true
|
|
10
|
-
}
|
|
11
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"pull_request": {
|
|
3
|
+
"head": {
|
|
4
|
+
"ref": "pr-getting-merged"
|
|
5
|
+
},
|
|
6
|
+
"base": {
|
|
7
|
+
"ref": "master"
|
|
8
|
+
},
|
|
9
|
+
"merged": true
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
{
|
|
2
|
-
"pull_request": {
|
|
3
|
-
"head": {
|
|
4
|
-
"ref": "pr-getting-merged"
|
|
5
|
-
},
|
|
6
|
-
"base": {
|
|
7
|
-
"ref": "master"
|
|
8
|
-
},
|
|
9
|
-
"merged": true,
|
|
10
|
-
"labels": [{ "name": "patch" }]
|
|
11
|
-
}
|
|
12
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"pull_request": {
|
|
3
|
+
"head": {
|
|
4
|
+
"ref": "pr-getting-merged"
|
|
5
|
+
},
|
|
6
|
+
"base": {
|
|
7
|
+
"ref": "master"
|
|
8
|
+
},
|
|
9
|
+
"merged": true,
|
|
10
|
+
"labels": [{ "name": "patch" }]
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
{
|
|
2
|
-
"pull_request": {
|
|
3
|
-
"head": {
|
|
4
|
-
"ref": "pr-getting-merged"
|
|
5
|
-
},
|
|
6
|
-
"base": {
|
|
7
|
-
"ref": "master"
|
|
8
|
-
},
|
|
9
|
-
"merged": true,
|
|
10
|
-
"labels": [{ "name": "skip-release" }]
|
|
11
|
-
}
|
|
12
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"pull_request": {
|
|
3
|
+
"head": {
|
|
4
|
+
"ref": "pr-getting-merged"
|
|
5
|
+
},
|
|
6
|
+
"base": {
|
|
7
|
+
"ref": "master"
|
|
8
|
+
},
|
|
9
|
+
"merged": true,
|
|
10
|
+
"labels": [{ "name": "skip-release" }]
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -1,12 +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
|
-
}
|
|
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
|
+
}
|
|
@@ -1,122 +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"
|
|
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
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();
|