From b461ad4ca038af415610237b6f14f0a491ca0c44 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 9 Jan 2019 18:50:47 +1300 Subject: [PATCH 01/74] TypeScript upgrade --- .gitignore | 1 + .jshintrc | 10 - .npmignore | 10 + .prettierrc | 8 + .travis.yml | 7 +- @types/sliced/index.d.ts | 12 + LICENSE | 1 + Makefile | 17 - README.md | 88 +- lib/column.js | 102 -- lib/column.ts | 155 +++ lib/configTypes.ts | 53 + lib/dialect/dialect.ts | 6 + lib/dialect/index.js | 21 - lib/dialect/index.ts | 24 + lib/dialect/mssql.js | 467 --------- lib/dialect/mssql.ts | 501 +++++++++ lib/dialect/mysql.js | 221 ---- lib/dialect/mysql.ts | 199 ++++ lib/dialect/oracle.js | 325 ------ lib/dialect/oracle.ts | 346 +++++++ lib/dialect/postgres.js | 1224 ---------------------- lib/dialect/postgres.ts | 1241 +++++++++++++++++++++++ lib/dialect/sqlite.js | 205 ---- lib/dialect/sqlite.ts | 199 ++++ lib/functions.js | 75 -- lib/functions.ts | 68 ++ lib/index.js | 91 -- lib/index.ts | 74 ++ lib/joiner.js | 40 - lib/joiner.ts | 50 + lib/node/addColumn.js | 7 - lib/node/addColumn.ts | 9 + lib/node/alias.js | 29 - lib/node/alias.ts | 31 + lib/node/alter.js | 7 - lib/node/alter.ts | 9 + lib/node/arrayCall.js | 24 - lib/node/arrayCall.ts | 20 + lib/node/at.js | 27 - lib/node/at.ts | 25 + lib/node/binary.js | 29 - lib/node/binary.ts | 28 + lib/node/cascade.js | 7 - lib/node/cascade.ts | 9 + lib/node/case.js | 29 - lib/node/case.ts | 28 + lib/node/cast.js | 27 - lib/node/cast.ts | 25 + lib/node/column.js | 36 - lib/node/column.ts | 69 ++ lib/node/create.js | 14 - lib/node/create.ts | 13 + lib/node/createIndex.js | 63 -- lib/node/createIndex.ts | 67 ++ lib/node/createView.js | 13 - lib/node/createView.ts | 13 + lib/node/default.js | 8 - lib/node/default.ts | 9 + lib/node/delete.js | 7 - lib/node/delete.ts | 9 + lib/node/distinct.js | 7 - lib/node/distinct.ts | 9 + lib/node/distinctOn.js | 7 - lib/node/distinctOn.ts | 9 + lib/node/drop.js | 12 - lib/node/drop.ts | 11 + lib/node/dropColumn.js | 7 - lib/node/dropColumn.ts | 9 + lib/node/dropIndex.js | 39 - lib/node/dropIndex.ts | 26 + lib/node/forShare.js | 7 - lib/node/forShare.ts | 9 + lib/node/forUpdate.js | 7 - lib/node/forUpdate.ts | 9 + lib/node/foreignKey.js | 19 - lib/node/foreignKey.ts | 34 + lib/node/from.js | 9 - lib/node/from.ts | 10 + lib/node/functionCall.js | 24 - lib/node/functionCall.ts | 20 + lib/node/groupBy.js | 7 - lib/node/groupBy.ts | 9 + lib/node/having.js | 7 - lib/node/having.ts | 9 + lib/node/ifExists.js | 7 - lib/node/ifExists.ts | 9 + lib/node/ifNotExists.js | 7 - lib/node/ifNotExists.ts | 9 + lib/node/in.js | 28 - lib/node/in.ts | 26 + lib/node/index.js | 101 -- lib/node/index.ts | 65 ++ lib/node/indexes.js | 15 - lib/node/indexes.ts | 14 + lib/node/insert.js | 70 -- lib/node/insert.ts | 69 ++ lib/node/interval.js | 21 - lib/node/interval.ts | 31 + lib/node/join.js | 23 - lib/node/join.ts | 29 + lib/node/literal.js | 16 - lib/node/literal.ts | 17 + lib/node/modifier.ts | 11 + lib/node/node.ts | 86 ++ lib/node/notIn.js | 28 - lib/node/notIn.ts | 26 + lib/node/onConflict.js | 7 - lib/node/onConflict.ts | 16 + lib/node/onDuplicate.js | 7 - lib/node/onDuplicate.ts | 9 + lib/node/orIgnore.js | 7 - lib/node/orIgnore.ts | 9 + lib/node/orderBy.js | 7 - lib/node/orderBy.ts | 14 + lib/node/orderByValue.js | 17 - lib/node/orderByValue.ts | 13 + lib/node/parameter.js | 26 - lib/node/parameter.ts | 27 + lib/node/postfixUnary.js | 28 - lib/node/postfixUnary.ts | 26 + lib/node/prefixUnary.js | 28 - lib/node/prefixUnary.ts | 26 + lib/node/query.js | 552 ---------- lib/node/query.ts | 573 +++++++++++ lib/node/rename.js | 7 - lib/node/rename.ts | 9 + lib/node/renameColumn.js | 7 - lib/node/renameColumn.ts | 9 + lib/node/replace.js | 70 -- lib/node/replace.ts | 69 ++ lib/node/restrict.js | 7 - lib/node/restrict.ts | 9 + lib/node/returning.js | 7 - lib/node/returning.ts | 9 + lib/node/select.js | 17 - lib/node/select.ts | 15 + lib/node/slice.js | 28 - lib/node/slice.ts | 27 + lib/node/table.js | 10 - lib/node/table.ts | 12 + lib/node/ternary.js | 31 - lib/node/ternary.ts | 32 + lib/node/text.js | 11 - lib/node/text.ts | 11 + lib/node/truncate.js | 12 - lib/node/truncate.ts | 11 + lib/node/update.js | 7 - lib/node/update.ts | 9 + lib/node/valueExpression.js | 160 --- lib/node/valueExpression.ts | 231 +++++ lib/node/where.js | 74 -- lib/node/where.ts | 73 ++ lib/nodeable.ts | 9 + lib/table.js | 290 ------ lib/table.ts | 303 ++++++ lib/tableTracker.ts | 9 + lib/{types.d.ts => types.d.ts.old} | 0 package-lock.json | 520 ++++++++++ package.json | 68 +- test/binary-clause-tests.js | 44 - test/binary-clause-tests.ts | 44 + test/clause-definition.js | 31 - test/clause-definition.ts | 34 + test/column-tests.js | 131 --- test/column-tests.ts | 167 +++ test/dialects/aggregate-tests.js | 477 --------- test/dialects/aggregate-tests.ts | 476 +++++++++ test/dialects/alias-tests.js | 122 --- test/dialects/alias-tests.ts | 133 +++ test/dialects/alter-table-tests.js | 338 ------ test/dialects/alter-table-tests.ts | 356 +++++++ test/dialects/array-tests.js | 96 -- test/dialects/array-tests.ts | 91 ++ test/dialects/binary-clause-tests.js | 103 -- test/dialects/binary-clause-tests.ts | 112 ++ test/dialects/case-tests.js | 222 ---- test/dialects/case-tests.ts | 243 +++++ test/dialects/cast-tests.js | 314 ------ test/dialects/cast-tests.ts | 323 ++++++ test/dialects/clause-ordering-tests.js | 118 --- test/dialects/clause-ordering-tests.ts | 134 +++ test/dialects/create-table-tests.js | 761 -------------- test/dialects/create-table-tests.ts | 825 +++++++++++++++ test/dialects/create-view-tests.js | 80 -- test/dialects/create-view-tests.ts | 86 ++ test/dialects/date-tests.js | 228 ----- test/dialects/date-tests.ts | 230 +++++ test/dialects/delete-tests.js | 169 --- test/dialects/delete-tests.ts | 171 ++++ test/dialects/distinct-on-tests.js | 24 - test/dialects/distinct-on-tests.ts | 22 + test/dialects/distinct-tests.js | 132 --- test/dialects/distinct-tests.ts | 136 +++ test/dialects/drop-table-tests.js | 96 -- test/dialects/drop-table-tests.ts | 96 ++ test/dialects/for-share-tests.js | 23 - test/dialects/for-share-tests.ts | 28 + test/dialects/for-update-tests.js | 31 - test/dialects/for-update-tests.ts | 37 + test/dialects/from-clause-tests.js | 93 -- test/dialects/from-clause-tests.ts | 99 ++ test/dialects/function-tests.js | 82 -- test/dialects/function-tests.ts | 81 ++ test/dialects/group-by-tests.js | 129 --- test/dialects/group-by-tests.ts | 129 +++ test/dialects/having-tests.js | 79 -- test/dialects/having-tests.ts | 118 +++ test/dialects/hstore-tests.js | 25 - test/dialects/hstore-tests.ts | 26 + test/dialects/ilike-tests.js | 45 - test/dialects/ilike-tests.ts | 53 + test/dialects/in-clause-tests.js | 179 ---- test/dialects/in-clause-tests.ts | 179 ++++ test/dialects/{index.js => index.ts} | 0 test/dialects/indexes-tests.js | 235 ----- test/dialects/indexes-tests.ts | 235 +++++ test/dialects/insert-tests.js | 1094 -------------------- test/dialects/insert-tests.ts | 1175 +++++++++++++++++++++ test/dialects/join-tests.js | 176 ---- test/dialects/join-tests.ts | 203 ++++ test/dialects/join-to-tests.js | 112 -- test/dialects/join-to-tests.ts | 113 +++ test/dialects/json-tests.js | 41 - test/dialects/json-tests.ts | 40 + test/dialects/limit-and-offset-tests.js | 105 -- test/dialects/limit-and-offset-tests.ts | 145 +++ test/dialects/literal-tests.js | 72 -- test/dialects/literal-tests.ts | 83 ++ test/dialects/matches-test.js | 49 - test/dialects/matches-test.ts | 52 + test/dialects/namespace-tests.js | 146 --- test/dialects/namespace-tests.ts | 156 +++ test/dialects/not-in-clause-tests.js | 179 ---- test/dialects/not-in-clause-tests.ts | 179 ++++ test/dialects/order-tests.js | 365 ------- test/dialects/order-tests.ts | 368 +++++++ test/dialects/regex-tests.js | 41 - test/dialects/regex-tests.ts | 40 + test/dialects/replace-tests.js | 1000 ------------------ test/dialects/replace-tests.ts | 1064 +++++++++++++++++++ test/dialects/returning-tests.js | 20 - test/dialects/returning-tests.ts | 22 + test/dialects/schema-tests.js | 168 --- test/dialects/schema-tests.ts | 189 ++++ test/dialects/select-tests.js | 461 --------- test/dialects/select-tests.ts | 475 +++++++++ test/dialects/shortcut-tests.js | 161 --- test/dialects/shortcut-tests.ts | 164 +++ test/dialects/subfield-tests.js | 42 - test/dialects/subfield-tests.ts | 40 + test/dialects/subquery-tests.js | 221 ---- test/dialects/subquery-tests.ts | 270 +++++ test/dialects/support.js | 137 --- test/dialects/support.ts | 197 ++++ test/dialects/table-tests.js | 675 ------------ test/dialects/table-tests.ts | 741 ++++++++++++++ test/dialects/ternary-clause-tests.js | 55 - test/dialects/ternary-clause-tests.ts | 67 ++ test/dialects/tostring-tests.js | 202 ---- test/dialects/tostring-tests.ts | 201 ++++ test/dialects/truncate-table-tests.js | 29 - test/dialects/truncate-table-tests.ts | 29 + test/dialects/unary-clause-tests.js | 55 - test/dialects/unary-clause-tests.ts | 72 ++ test/dialects/update-tests.js | 246 ----- test/dialects/update-tests.ts | 255 +++++ test/dialects/value-expression-tests.js | 133 --- test/dialects/value-expression-tests.ts | 168 +++ test/dialects/where-clause-tests.js | 205 ---- test/dialects/where-clause-tests.ts | 210 ++++ test/function-tests.js | 93 -- test/function-tests.ts | 102 ++ test/index-tests.js | 214 ---- test/index-tests.ts | 274 +++++ test/index.js | 21 - test/index.ts | 19 + test/mocha.opts | 3 + test/select-tests.js | 15 - test/select-tests.ts | 10 + test/table-tests.js | 273 ----- test/table-tests.ts | 290 ++++++ test/ternary-clause-tests.js | 14 - test/ternary-clause-tests.ts | 14 + test/tsconfig.json | 4 + test/tslint.json | 7 + test/unary-clause-tests.js | 14 - test/unary-clause-tests.ts | 14 + test/value-expression-tests.js | 18 - test/value-expression-tests.ts | 17 + tsconfig.json | 28 + tslint.json | 6 + 292 files changed, 18182 insertions(+), 16368 deletions(-) delete mode 100644 .jshintrc create mode 100644 .npmignore create mode 100644 .prettierrc create mode 100644 @types/sliced/index.d.ts delete mode 100644 Makefile delete mode 100644 lib/column.js create mode 100644 lib/column.ts create mode 100644 lib/configTypes.ts create mode 100644 lib/dialect/dialect.ts delete mode 100644 lib/dialect/index.js create mode 100644 lib/dialect/index.ts delete mode 100644 lib/dialect/mssql.js create mode 100644 lib/dialect/mssql.ts delete mode 100644 lib/dialect/mysql.js create mode 100644 lib/dialect/mysql.ts delete mode 100644 lib/dialect/oracle.js create mode 100644 lib/dialect/oracle.ts delete mode 100644 lib/dialect/postgres.js create mode 100644 lib/dialect/postgres.ts delete mode 100644 lib/dialect/sqlite.js create mode 100644 lib/dialect/sqlite.ts delete mode 100644 lib/functions.js create mode 100644 lib/functions.ts delete mode 100644 lib/index.js create mode 100644 lib/index.ts delete mode 100644 lib/joiner.js create mode 100644 lib/joiner.ts delete mode 100644 lib/node/addColumn.js create mode 100644 lib/node/addColumn.ts delete mode 100644 lib/node/alias.js create mode 100644 lib/node/alias.ts delete mode 100644 lib/node/alter.js create mode 100644 lib/node/alter.ts delete mode 100644 lib/node/arrayCall.js create mode 100644 lib/node/arrayCall.ts delete mode 100644 lib/node/at.js create mode 100644 lib/node/at.ts delete mode 100644 lib/node/binary.js create mode 100644 lib/node/binary.ts delete mode 100644 lib/node/cascade.js create mode 100644 lib/node/cascade.ts delete mode 100644 lib/node/case.js create mode 100644 lib/node/case.ts delete mode 100644 lib/node/cast.js create mode 100644 lib/node/cast.ts delete mode 100644 lib/node/column.js create mode 100644 lib/node/column.ts delete mode 100644 lib/node/create.js create mode 100644 lib/node/create.ts delete mode 100644 lib/node/createIndex.js create mode 100644 lib/node/createIndex.ts delete mode 100644 lib/node/createView.js create mode 100644 lib/node/createView.ts delete mode 100644 lib/node/default.js create mode 100644 lib/node/default.ts delete mode 100644 lib/node/delete.js create mode 100644 lib/node/delete.ts delete mode 100644 lib/node/distinct.js create mode 100644 lib/node/distinct.ts delete mode 100644 lib/node/distinctOn.js create mode 100644 lib/node/distinctOn.ts delete mode 100644 lib/node/drop.js create mode 100644 lib/node/drop.ts delete mode 100644 lib/node/dropColumn.js create mode 100644 lib/node/dropColumn.ts delete mode 100644 lib/node/dropIndex.js create mode 100644 lib/node/dropIndex.ts delete mode 100644 lib/node/forShare.js create mode 100644 lib/node/forShare.ts delete mode 100644 lib/node/forUpdate.js create mode 100644 lib/node/forUpdate.ts delete mode 100644 lib/node/foreignKey.js create mode 100644 lib/node/foreignKey.ts delete mode 100644 lib/node/from.js create mode 100644 lib/node/from.ts delete mode 100644 lib/node/functionCall.js create mode 100644 lib/node/functionCall.ts delete mode 100644 lib/node/groupBy.js create mode 100644 lib/node/groupBy.ts delete mode 100644 lib/node/having.js create mode 100644 lib/node/having.ts delete mode 100644 lib/node/ifExists.js create mode 100644 lib/node/ifExists.ts delete mode 100644 lib/node/ifNotExists.js create mode 100644 lib/node/ifNotExists.ts delete mode 100644 lib/node/in.js create mode 100644 lib/node/in.ts delete mode 100644 lib/node/index.js create mode 100644 lib/node/index.ts delete mode 100644 lib/node/indexes.js create mode 100644 lib/node/indexes.ts delete mode 100644 lib/node/insert.js create mode 100644 lib/node/insert.ts delete mode 100644 lib/node/interval.js create mode 100644 lib/node/interval.ts delete mode 100644 lib/node/join.js create mode 100644 lib/node/join.ts delete mode 100644 lib/node/literal.js create mode 100644 lib/node/literal.ts create mode 100644 lib/node/modifier.ts create mode 100644 lib/node/node.ts delete mode 100644 lib/node/notIn.js create mode 100644 lib/node/notIn.ts delete mode 100644 lib/node/onConflict.js create mode 100644 lib/node/onConflict.ts delete mode 100644 lib/node/onDuplicate.js create mode 100644 lib/node/onDuplicate.ts delete mode 100644 lib/node/orIgnore.js create mode 100644 lib/node/orIgnore.ts delete mode 100644 lib/node/orderBy.js create mode 100644 lib/node/orderBy.ts delete mode 100644 lib/node/orderByValue.js create mode 100644 lib/node/orderByValue.ts delete mode 100644 lib/node/parameter.js create mode 100644 lib/node/parameter.ts delete mode 100644 lib/node/postfixUnary.js create mode 100644 lib/node/postfixUnary.ts delete mode 100644 lib/node/prefixUnary.js create mode 100644 lib/node/prefixUnary.ts delete mode 100644 lib/node/query.js create mode 100644 lib/node/query.ts delete mode 100644 lib/node/rename.js create mode 100644 lib/node/rename.ts delete mode 100644 lib/node/renameColumn.js create mode 100644 lib/node/renameColumn.ts delete mode 100644 lib/node/replace.js create mode 100644 lib/node/replace.ts delete mode 100644 lib/node/restrict.js create mode 100644 lib/node/restrict.ts delete mode 100644 lib/node/returning.js create mode 100644 lib/node/returning.ts delete mode 100644 lib/node/select.js create mode 100644 lib/node/select.ts delete mode 100644 lib/node/slice.js create mode 100644 lib/node/slice.ts delete mode 100644 lib/node/table.js create mode 100644 lib/node/table.ts delete mode 100644 lib/node/ternary.js create mode 100644 lib/node/ternary.ts delete mode 100644 lib/node/text.js create mode 100644 lib/node/text.ts delete mode 100644 lib/node/truncate.js create mode 100644 lib/node/truncate.ts delete mode 100644 lib/node/update.js create mode 100644 lib/node/update.ts delete mode 100644 lib/node/valueExpression.js create mode 100644 lib/node/valueExpression.ts delete mode 100644 lib/node/where.js create mode 100644 lib/node/where.ts create mode 100644 lib/nodeable.ts delete mode 100644 lib/table.js create mode 100644 lib/table.ts create mode 100644 lib/tableTracker.ts rename lib/{types.d.ts => types.d.ts.old} (100%) create mode 100644 package-lock.json delete mode 100644 test/binary-clause-tests.js create mode 100644 test/binary-clause-tests.ts delete mode 100644 test/clause-definition.js create mode 100644 test/clause-definition.ts delete mode 100644 test/column-tests.js create mode 100644 test/column-tests.ts delete mode 100644 test/dialects/aggregate-tests.js create mode 100644 test/dialects/aggregate-tests.ts delete mode 100644 test/dialects/alias-tests.js create mode 100644 test/dialects/alias-tests.ts delete mode 100644 test/dialects/alter-table-tests.js create mode 100644 test/dialects/alter-table-tests.ts delete mode 100644 test/dialects/array-tests.js create mode 100644 test/dialects/array-tests.ts delete mode 100644 test/dialects/binary-clause-tests.js create mode 100644 test/dialects/binary-clause-tests.ts delete mode 100644 test/dialects/case-tests.js create mode 100644 test/dialects/case-tests.ts delete mode 100644 test/dialects/cast-tests.js create mode 100644 test/dialects/cast-tests.ts delete mode 100644 test/dialects/clause-ordering-tests.js create mode 100644 test/dialects/clause-ordering-tests.ts delete mode 100644 test/dialects/create-table-tests.js create mode 100644 test/dialects/create-table-tests.ts delete mode 100644 test/dialects/create-view-tests.js create mode 100644 test/dialects/create-view-tests.ts delete mode 100644 test/dialects/date-tests.js create mode 100644 test/dialects/date-tests.ts delete mode 100644 test/dialects/delete-tests.js create mode 100644 test/dialects/delete-tests.ts delete mode 100644 test/dialects/distinct-on-tests.js create mode 100644 test/dialects/distinct-on-tests.ts delete mode 100644 test/dialects/distinct-tests.js create mode 100644 test/dialects/distinct-tests.ts delete mode 100644 test/dialects/drop-table-tests.js create mode 100644 test/dialects/drop-table-tests.ts delete mode 100644 test/dialects/for-share-tests.js create mode 100644 test/dialects/for-share-tests.ts delete mode 100644 test/dialects/for-update-tests.js create mode 100644 test/dialects/for-update-tests.ts delete mode 100644 test/dialects/from-clause-tests.js create mode 100644 test/dialects/from-clause-tests.ts delete mode 100644 test/dialects/function-tests.js create mode 100644 test/dialects/function-tests.ts delete mode 100644 test/dialects/group-by-tests.js create mode 100644 test/dialects/group-by-tests.ts delete mode 100644 test/dialects/having-tests.js create mode 100644 test/dialects/having-tests.ts delete mode 100644 test/dialects/hstore-tests.js create mode 100644 test/dialects/hstore-tests.ts delete mode 100644 test/dialects/ilike-tests.js create mode 100644 test/dialects/ilike-tests.ts delete mode 100644 test/dialects/in-clause-tests.js create mode 100644 test/dialects/in-clause-tests.ts rename test/dialects/{index.js => index.ts} (100%) delete mode 100644 test/dialects/indexes-tests.js create mode 100644 test/dialects/indexes-tests.ts delete mode 100644 test/dialects/insert-tests.js create mode 100644 test/dialects/insert-tests.ts delete mode 100644 test/dialects/join-tests.js create mode 100644 test/dialects/join-tests.ts delete mode 100644 test/dialects/join-to-tests.js create mode 100644 test/dialects/join-to-tests.ts delete mode 100644 test/dialects/json-tests.js create mode 100644 test/dialects/json-tests.ts delete mode 100644 test/dialects/limit-and-offset-tests.js create mode 100644 test/dialects/limit-and-offset-tests.ts delete mode 100644 test/dialects/literal-tests.js create mode 100644 test/dialects/literal-tests.ts delete mode 100644 test/dialects/matches-test.js create mode 100644 test/dialects/matches-test.ts delete mode 100644 test/dialects/namespace-tests.js create mode 100644 test/dialects/namespace-tests.ts delete mode 100644 test/dialects/not-in-clause-tests.js create mode 100644 test/dialects/not-in-clause-tests.ts delete mode 100644 test/dialects/order-tests.js create mode 100644 test/dialects/order-tests.ts delete mode 100644 test/dialects/regex-tests.js create mode 100644 test/dialects/regex-tests.ts delete mode 100644 test/dialects/replace-tests.js create mode 100644 test/dialects/replace-tests.ts delete mode 100644 test/dialects/returning-tests.js create mode 100644 test/dialects/returning-tests.ts delete mode 100644 test/dialects/schema-tests.js create mode 100644 test/dialects/schema-tests.ts delete mode 100644 test/dialects/select-tests.js create mode 100644 test/dialects/select-tests.ts delete mode 100644 test/dialects/shortcut-tests.js create mode 100644 test/dialects/shortcut-tests.ts delete mode 100644 test/dialects/subfield-tests.js create mode 100644 test/dialects/subfield-tests.ts delete mode 100644 test/dialects/subquery-tests.js create mode 100644 test/dialects/subquery-tests.ts delete mode 100644 test/dialects/support.js create mode 100644 test/dialects/support.ts delete mode 100644 test/dialects/table-tests.js create mode 100644 test/dialects/table-tests.ts delete mode 100644 test/dialects/ternary-clause-tests.js create mode 100644 test/dialects/ternary-clause-tests.ts delete mode 100644 test/dialects/tostring-tests.js create mode 100644 test/dialects/tostring-tests.ts delete mode 100644 test/dialects/truncate-table-tests.js create mode 100644 test/dialects/truncate-table-tests.ts delete mode 100644 test/dialects/unary-clause-tests.js create mode 100644 test/dialects/unary-clause-tests.ts delete mode 100644 test/dialects/update-tests.js create mode 100644 test/dialects/update-tests.ts delete mode 100644 test/dialects/value-expression-tests.js create mode 100644 test/dialects/value-expression-tests.ts delete mode 100644 test/dialects/where-clause-tests.js create mode 100644 test/dialects/where-clause-tests.ts delete mode 100644 test/function-tests.js create mode 100644 test/function-tests.ts delete mode 100644 test/index-tests.js create mode 100644 test/index-tests.ts delete mode 100644 test/index.js create mode 100644 test/index.ts delete mode 100644 test/select-tests.js create mode 100644 test/select-tests.ts delete mode 100644 test/table-tests.js create mode 100644 test/table-tests.ts delete mode 100644 test/ternary-clause-tests.js create mode 100644 test/ternary-clause-tests.ts create mode 100644 test/tsconfig.json create mode 100644 test/tslint.json delete mode 100644 test/unary-clause-tests.js create mode 100644 test/unary-clause-tests.ts delete mode 100644 test/value-expression-tests.js create mode 100644 test/value-expression-tests.ts create mode 100644 tsconfig.json create mode 100644 tslint.json diff --git a/.gitignore b/.gitignore index 9cf6fffa..3881e74e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ +dist/ .idea diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index a8e1e5f9..00000000 --- a/.jshintrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "node": true, - "globals": { - "describe" : true, - "it" : true, - "Node" : true, - "suite" : true, - "test" : true - } -} diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..af597b0d --- /dev/null +++ b/.npmignore @@ -0,0 +1,10 @@ +@types/ +lib/ +node_modules/ +test/ +.gitignore +.prettierrc +.travis.yml +runtests.js +tsconfig.json +tslint.json \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..cc96c5a8 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "$schema": "http://json.schemastore.org/prettierrc", + "singleQuote": true, + "arrowParens": "always", + "bracketSpacing": true, + "tabWidth": 4, + "printWidth": 140 +} diff --git a/.travis.yml b/.travis.yml index f04dabe6..05845fe2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ language: node_js node_js: - - "5.0" - - "4.2" - - "0.10" - - "0.11" + - '11.6' + - '10.15' + - '8.15' diff --git a/@types/sliced/index.d.ts b/@types/sliced/index.d.ts new file mode 100644 index 00000000..d7668402 --- /dev/null +++ b/@types/sliced/index.d.ts @@ -0,0 +1,12 @@ +declare module 'sliced' { + /** + * Returns a section of an array. + * @param args something with a length. + * @param start The beginning of the specified portion of the array. + * @param end The end of the specified portion of the array. + */ + function sliced(args: T[], start?: number, end?: number): T[]; + function sliced(args: IArguments, start?: number, end?: number): any[]; + + export = sliced; +} diff --git a/LICENSE b/LICENSE index 722cf041..aee57264 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ Copyright (C) 2011 Brian Carlson +Copyright (C) 2019 Stefan Charsley Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/Makefile b/Makefile deleted file mode 100644 index 4d56d98a..00000000 --- a/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -.PHONY: jshint test publish-patch test - -test: - npm test - -patch: test - npm version patch -m "Bump version" - git push origin master --tags - npm publish - -minor: test - npm version minor -m "Bump version" - git push origin master --tags - npm publish - -jshint: - ./node_modules/.bin/jshint lib diff --git a/README.md b/README.md index e1a3af8c..a657f852 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ -# node-sql +# node-sql-ts _sql string builder for node_ - supports PostgreSQL, mysql, Microsoft SQL Server, Oracle and sqlite dialects. Building SQL statements by hand is no fun, especially in a language which has clumsy support for multi-line strings. -So let's build it with JavaScript. +So let's build it with TypeScript (JavaScript also supported). Maybe it's still not fun, but at least it's _less not fun_. -[![Build Status](https://secure.travis-ci.org/brianc/node-sql.png)](http://travis-ci.org/brianc/node-sql) +[![Build Status](https://secure.travis-ci.org/charsleysa/node-sql-ts.png)](http://travis-ci.org/charsleysa/node-sql-ts) ## install @@ -17,31 +17,31 @@ $ npm install sql ## use -```js +```ts //require the module -var sql = require('sql'); +import { Sql } from 'sql'; //(optionally) set the SQL dialect -sql.setDialect('postgres'); +const sql = new Sql('postgres'); //possible dialects: mssql, mysql, postgres (default), sqlite //first we define our tables -var user = sql.define({ +const user = sql.define<{ id: number; name: string; email: string; lastLogin: Date }>({ name: 'user', columns: ['id', 'name', 'email', 'lastLogin'] }); -var post = sql.define({ +const post = sql.define<{ id: number; userId: number; date: Date; title: string; body: string }>({ name: 'post', columns: ['id', 'userId', 'date', 'title', 'body'] }); //now let's make a simple query -var query = user.select(user.star()).from(user).toQuery(); +const query = user.select(user.star()).from(user).toQuery(); console.log(query.text); //SELECT "user".* FROM "user" //something more interesting -var query = user +const query = user .select(user.id) .from(user) .where( @@ -56,35 +56,35 @@ console.log(query.text); //SELECT "user"."id" FROM "user" WHERE ((("user"."name" console.log(query.values); //['boom', 1, 'bang', 2] //queries can be named -var query = user.select(user.star()).from(user).toNamedQuery('user.all'); +const query = user.select(user.star()).from(user).toNamedQuery('user.all'); console.log(query.name); //'user.all' //how about a join? -var query = user.select(user.name, post.body) +const query = user.select(user.name, post.body) .from(user.join(post).on(user.id.equals(post.userId))).toQuery(); console.log(query.text); //'SELECT "user"."name", "post"."body" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' //this also makes parts of your queries composable, which is handy -var friendship = sql.define({ +const friendship = sql.define<{ userId: number; friendId: number }>({ name: 'friendship', columns: ['userId', 'friendId'] }); -var friends = user.as('friends'); -var userToFriends = user +const friends = user.as('friends'); +const userToFriends = user .leftJoin(friendship).on(user.id.equals(friendship.userId)) .leftJoin(friends).on(friendship.friendId.equals(friends.id)); //and now...compose... -var friendsWhoHaveLoggedInQuery = user.from(userToFriends).where(friends.lastLogin.isNotNull()); +const friendsWhoHaveLoggedInQuery = user.from(userToFriends).where(friends.lastLogin.isNotNull()); //SELECT * FROM "user" //LEFT JOIN "friendship" ON ("user"."id" = "friendship"."userId") //LEFT JOIN "user" AS "friends" ON ("friendship"."friendId" = "friends"."id") //WHERE "friends"."lastLogin" IS NOT NULL -var friendsWhoUseGmailQuery = user.from(userToFriends).where(friends.email.like('%@gmail.com')); +const friendsWhoUseGmailQuery = user.from(userToFriends).where(friends.email.like('%@gmail.com')); //SELECT * FROM "user" //LEFT JOIN "friendship" ON ("user"."id" = "friendship"."userId") //LEFT JOIN "user" AS "friends" ON ("friendship"."friendId" = "friends"."id") @@ -92,7 +92,7 @@ var friendsWhoUseGmailQuery = user.from(userToFriends).where(friends.email.like( //Using different property names for columns //helpful if your column name is long or not camelCase -var user = sql.define({ +const user = sql.define<{ id: number; state: string }>({ name: 'user', columns: [{ name: 'id' @@ -108,53 +108,7 @@ console.log(user.select().where(user.state.equals('WA')).toQuery().text); // "SELECT "user".* FROM "user" WHERE ("user"."state_or_province" = $1)" ``` -There are a __lot__ more examples included in the [test/dialects](https://github.com/brianc/node-sql/tree/master/test/dialects) folder. We encourage you to read through them if you have any questions on usage! - -## from the command line -You can use the [sql-generate module](https://github.com/tmont/node-sql-generate) -to automatically generate definition files from a database instance. For example, -running `node-sql-generate --dsn "mysql://user:password@host/database"` will generate -something similar to: - -```javascript -// autogenerated by node-sql-generate v0.0.1 on Tue May 21 2013 01:04:12 GMT-0700 (PDT) -var sql = require('sql'); - -/** - * SQL definition for database.bar - */ -exports.bar = sql.define({ - name: 'bar', - columns: [ - 'id', - 'foo_id' - ] -}); - -/** - * SQL definition for database.foo - */ -exports.foo = sql.define({ - name: 'foo', - columns: [ - 'id', - 'field_1', - 'foo_bar_baz' - ] -}); - -/** - * Adding a column to an existing table: - */ -var model = sql.define({ name: 'foo', columns: [] }); -model.addColumn('id'); - -// If you try to add another column "id", node-sql will throw an error. -// You can suppress that error via: -model.addColumn('id', { noisy: false }); -``` - -Read the module's documentation for more details. +There are a __lot__ more examples included in the [test/dialects](https://github.com/charsleysa/node-sql-ts/tree/master/test/dialects) folder. We encourage you to read through them if you have any questions on usage! ## contributing @@ -164,8 +118,8 @@ node-sql wouldn't be anything without all the contributors and collaborators who If you'd like to become a collaborator here's how it's done: 1. fork the repo -2. `git pull https://github.com/(your_username)/node-sql` -3. `cd node-sql` +2. `git pull https://github.com/(your_username)/node-sql-ts` +3. `cd node-sql-ts` 4. `npm install` 5. `npm test` diff --git a/lib/column.js b/lib/column.js deleted file mode 100644 index 55a3da18..00000000 --- a/lib/column.js +++ /dev/null @@ -1,102 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var ColumnNode = require('./node/column'); -var OrderByValueNode = require('./node/orderByValue'); -var TextNode = require('./node/text'); -var valueExpressionMixin = require('./node/valueExpression'); - -var Column = function(config) { - this.table = config.table; - for (var name in config) { - if (config.hasOwnProperty(name)) { - this[name] = config[name]; - } - } - this.asc = this.ascending = this; - this.alias = null; - this.desc = this.descending = new OrderByValueNode({ - value : this.toNode(), - direction : new TextNode('DESC') - }); - this.dataType = config.dataType; - this.defaultValue = config.defaultValue; -}; - -// mix in value expression -_.extend(Column.prototype, valueExpressionMixin()); - -var contextify = function(base) { - var context = Object.create(Column.prototype); - Object.keys(base).forEach(function (key) { - context[key] = base[key]; - }); - return context; -}; - -Column.prototype.value = function(value) { - var context = contextify(this); - context._value = value; - return context; -}; - -Column.prototype.getValue = function() { - return this._value; -}; - -Column.prototype.toNode = function() { - // creates a query node from this column - return new ColumnNode(contextify(this)); -}; - -Column.prototype.as = function(alias) { - var context = contextify(this); - context.alias = alias; - return new ColumnNode(context); -}; - -Column.prototype.arrayAgg = function(alias) { - var context = contextify(this); - context.asArray = true; - context.alias = alias || context.name + 's'; - return new ColumnNode(context); -}; - -Column.prototype.aggregate = function(alias, aggregator) { - var context = contextify(this); - context.aggregator = aggregator.toUpperCase(); - context.alias = alias || context.name + '_' + context.aggregator.toLowerCase(); - return new ColumnNode(context); -}; - -Column.prototype.count = function(alias) { - return this.aggregate(alias, 'count'); -}; - -Column.prototype.min = function(alias) { - return this.aggregate(alias, 'min'); -}; - -Column.prototype.max = function(alias) { - return this.aggregate(alias, 'max'); -}; - -Column.prototype.sum = function(alias) { - return this.aggregate(alias, 'sum'); -}; - -Column.prototype.avg = function(alias) { - return this.aggregate(alias, 'avg'); -}; - -Column.prototype.distinct = function() { - var context = contextify(this); - context.distinct = true; - return new ColumnNode(context); -}; - -Column.prototype.toQuery = function() { - return this.toNode().toQuery(); -}; - -module.exports = Column; diff --git a/lib/column.ts b/lib/column.ts new file mode 100644 index 00000000..569efb05 --- /dev/null +++ b/lib/column.ts @@ -0,0 +1,155 @@ +'use strict'; + +import _ = require('lodash'); +import { ColumnNode, IValueExpressionMixin, OrderByValueNode, TextNode, valueExpressionMixin } from './node'; +import { INodeable } from './nodeable'; +import { Table } from './table'; + +interface ColumnConfig { + name?: string; + property?: string; + autoGenerated?: boolean; + jsType?: any; + dataType?: string; + primaryKey?: boolean; + references?: + | string + | { + table?: string; + column?: string; + constraint?: string; + onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; + onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; + }; + notNull?: boolean; + unique?: boolean; + defaultValue?: any; + subfields?: string[]; + table?: Table; + star?: boolean; + subfieldContainer?: Column; + isConstant?: boolean; + constantValue?: any; +} + +export class Column implements INodeable { + public name: string; + public property?: string; + public table?: Table; + public asc: this; + public alias?: string; + public desc: OrderByValueNode; + public dataType?: string; + // tslint:disable-next-line:variable-name + public _value: any; + public star?: boolean; + public subfields: { [key: string]: Column } = {}; + public asArray?: boolean = false; + public aggregator?: string; + public isConstant?: boolean; + public constantValue?: any; + public primaryKey?: boolean; + public notNull?: boolean; + public defaultValue?: any; + public references?: + | string + | { + table?: string; + column?: string; + constraint?: string; + onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; + onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; + }; + public subfieldContainer?: Column; + public autoGenerated?: boolean; + public unique?: boolean; + public isDistinct?: boolean; + constructor(config: ColumnConfig) { + this.name = config.name as string; + this.property = config.property; + this.star = config.star; + this.table = config.table; + this.asc = this; + this.alias = undefined; + this.desc = new OrderByValueNode({ + direction: new TextNode('DESC'), + value: this.toNode() + }); + this.isConstant = config.isConstant; + this.constantValue = config.constantValue; + this.dataType = config.dataType; + this.primaryKey = config.primaryKey; + this.notNull = config.notNull; + this.defaultValue = config.defaultValue; + this.references = config.references; + this.subfieldContainer = config.subfieldContainer; + this.autoGenerated = config.autoGenerated; + this.unique = config.unique; + } + public value(value: any): Column { + const context = contextify(this); + context._value = value; + return context; + } + public getValue() { + return this._value; + } + public toNode(): ColumnNode { + // creates a query node from this column + return new ColumnNode(contextify(this)); + } + public as(alias: string): ColumnNode { + const context = contextify(this); + context.alias = alias; + return new ColumnNode(context); + } + public arrayAgg(alias?: string): ColumnNode { + const context = contextify(this); + context.asArray = true; + context.alias = alias || context.name + 's'; + return new ColumnNode(context); + } + public aggregate(alias: string | undefined, aggregator: string): ColumnNode { + const context = contextify(this); + context.aggregator = aggregator.toUpperCase(); + context.alias = alias || context.name + '_' + context.aggregator.toLowerCase(); + return new ColumnNode(context); + } + public count(alias?: string) { + return this.aggregate(alias, 'count'); + } + public min(alias?: string) { + return this.aggregate(alias, 'min'); + } + public max(alias?: string) { + return this.aggregate(alias, 'max'); + } + public sum(alias?: string) { + return this.aggregate(alias, 'sum'); + } + public avg(alias?: string) { + return this.aggregate(alias, 'avg'); + } + public distinct(): ColumnNode { + const context = contextify(this); + context.isDistinct = true; + return new ColumnNode(context); + } + public toQuery() { + return this.toNode().toQuery(); + } +} + +// mix in value expression +_.extend(Column.prototype, valueExpressionMixin()); + +const contextify = (base: Column): Column => { + const context = Object.create(Column.prototype); + Object.keys(base).forEach((key) => { + context[key] = (base as any)[key]; + }); + return context; +}; + +// tslint:disable-next-line:no-empty-interface +export interface Column extends IValueExpressionMixin {} diff --git a/lib/configTypes.ts b/lib/configTypes.ts new file mode 100644 index 00000000..2ee07ea8 --- /dev/null +++ b/lib/configTypes.ts @@ -0,0 +1,53 @@ +import { Sql } from './'; + +export type SQLDialects = 'mssql' | 'mysql' | 'oracle' | 'postgres' | 'sqlite'; + +export interface ColumnDefinitionBase { + property?: string; + autoGenerated?: boolean; + dataType?: string; + primaryKey?: boolean; + references?: + | string + | { + table?: string; + column?: string; + constraint?: string; + onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; + onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; + }; + notNull?: boolean; + unique?: boolean; + defaultValue?: any; + subfields?: string[]; +} + +export interface ColumnDefinition extends ColumnDefinitionBase { + name: string; +} + +export interface ColumnDefinitionObject { + [name: string]: ColumnDefinitionBase; +} + +export interface ForeignKeyDefinition { + name?: string; + table: string; + columns: string[]; + refColumns?: string[]; + onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; + onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; +} + +export interface TableDefinition { + name: string; + schema?: string; + columns: Array | ColumnDefinitionObject; + isTemporary?: boolean; + foreignKeys?: ForeignKeyDefinition | ForeignKeyDefinition[]; + sql?: Sql; + engine?: string; + charset?: string; + snakeToCamel?: boolean; + columnWhiteList?: boolean; +} diff --git a/lib/dialect/dialect.ts b/lib/dialect/dialect.ts new file mode 100644 index 00000000..b93614ff --- /dev/null +++ b/lib/dialect/dialect.ts @@ -0,0 +1,6 @@ +export abstract class Dialect { + public config: any; + constructor(config: any) { + this.config = config; + } +} diff --git a/lib/dialect/index.js b/lib/dialect/index.js deleted file mode 100644 index c26f15de..00000000 --- a/lib/dialect/index.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -// given a dialect name, return the class -var getDialect = function(dialect) { - switch (dialect.toLowerCase()) { - case 'postgres': - return require('./postgres'); - case 'mysql': - return require('./mysql'); - case 'sqlite': - return require('./sqlite'); - case 'mssql': - return require('./mssql'); - case 'oracle': - return require('./oracle'); - default: - throw new Error(dialect + ' is unsupported'); - } -}; - -module.exports = getDialect; diff --git a/lib/dialect/index.ts b/lib/dialect/index.ts new file mode 100644 index 00000000..9c4e3674 --- /dev/null +++ b/lib/dialect/index.ts @@ -0,0 +1,24 @@ +'use strict'; + +import { Dialect } from './dialect'; + +// given a dialect name, return the class +export const getDialect = (dialect: string): Dialect => { + switch (dialect.toLowerCase()) { + case 'postgres': + return require('./postgres').Postgres; + case 'mysql': + return require('./mysql').Mysql; + case 'sqlite': + return require('./sqlite').Sqlite; + case 'mssql': + return require('./mssql').Mssql; + case 'oracle': + return require('./oracle').Oracle; + default: + throw new Error(dialect + ' is unsupported'); + } +}; + +// default dialect is postgres +export const DEFAULT_DIALECT = 'postgres'; diff --git a/lib/dialect/mssql.js b/lib/dialect/mssql.js deleted file mode 100644 index 488f7fa2..00000000 --- a/lib/dialect/mssql.js +++ /dev/null @@ -1,467 +0,0 @@ -// TODO: visitCreate needs to support schemas -// TODO: visitDrop needs to support schemas - -'use strict'; - -var util = require('util'); -var assert = require('assert'); - -/** - * Config can contain: - * - * questionMarkParameterPlaceholder:true which will use a "?" for the parameter placeholder instead of the @index. - * - * @param config - * @constructor - */ -var Mssql = function(config) { - this.output = []; - this.params = []; - this.config = config || {}; -}; - -var Postgres = require('./postgres'); - -util.inherits(Mssql, Postgres); - -Mssql.prototype._myClass = Mssql; - -Mssql.prototype._quoteCharacter = '['; - -Mssql.prototype._arrayAggFunctionName = ''; - -Mssql.prototype.visitReplace = function(replace) { - throw new Error('Mssql does not support REPLACE.'); -}; - -Mssql.prototype._getParameterPlaceholder = function(index, value) { - if (this.config.questionMarkParameterPlaceholder) return '?'; - return '@' + index; -}; - -Mssql.prototype.visitBinary = function(binary) { - if(binary.operator === '@@'){ - var self = this; - var text = '(CONTAINS (' + this.visit(binary.left) + ', '; - text += this.visit(binary.right); - text += '))'; - return [text]; - } - - if (!isRightSideArray(binary)){ - return Mssql.super_.prototype.visitBinary.call(this, binary); - } - if (binary.operator=='IN' || binary.operator=='NOT IN'){ - return Mssql.super_.prototype.visitBinary.call(this, binary); - } - throw new Error('SQL Sever does not support arrays in this type of expression.'); -}; - -Mssql.prototype.visitAlter = function(alter) { - var self=this; - var errMsg='ALTER TABLE cannot be used to perform multiple different operations in the same statement.'; - - // Implement our own add column: - // PostgreSQL: ALTER TABLE "name" ADD COLUMN "col1", ADD COLUMN "col2" - // Mssql: ALTER TABLE [name] ADD [col1], [col2] - function _addColumn(){ - self._visitingAlter = true; - var table = self._queryNode.table; - self._visitingAddColumn = true; - var result='ALTER TABLE '+self.visit(table.toNode())+' ADD '+self.visit(alter.nodes[0].nodes[0]); - for (var i= 1,len=alter.nodes.length; i= 0) txt = _extract(); - // Override CURRENT_TIMESTAMP function to remove parens - else if ('CURRENT_TIMESTAMP' == functionCall.name) txt = functionCall.name; - else { - var name = functionCall.name; - // override the LENGTH function since mssql calls it LEN - if (name == "LENGTH") name = "LEN"; - txt = name + '(' + functionCall.nodes.map(this.visit.bind(this)).join(', ') + ')'; - } - this._visitingFunctionCall = false; - return [txt]; -}; - -Mssql.prototype.visitOrderBy = function(orderBy) { - var result=Mssql.super_.prototype.visitOrderBy.call(this, orderBy); - var offsetNode=orderBy.msSQLOffsetNode; - var limitNode=orderBy.msSQLLimitNode; - if (!offsetNode && !limitNode) return result; - assert(offsetNode,"Something bad happened, should have had an msSQLOffsetNode here."); - result.push("OFFSET "+getModifierValue(this,offsetNode)+" ROWS"); - if (!limitNode) return result; - result.push("FETCH NEXT "+getModifierValue(this,limitNode)+" ROWS ONLY"); - return result; -}; - -/** - * We override this so that we can deal with the LIMIT and OFFSET clauses specially since they have to become - * part of the SELECT and ORDER BY clauses. - * - * Basically if there's an ORDER BY clause we attach OFFSET and LIMIT to it so that it can be processed by the - * ORDER BY handler later. - * - * If there's a LIMIT clause without OFFSET, we attach it to the SELECT clause so we can process it later. - * - * @param {Node[]} actions - * @param {Node[]} targets - * @param {Node[]} filters - * @returns {String[]} - */ -Mssql.prototype.visitQueryHelper=function(actions,targets,filters){ - function _handleLimitAndOffset(){ - var limitInfo=Mssql.super_.prototype.findNode.call(this, filters, "LIMIT"); // jshint ignore:line - var offsetInfo=Mssql.super_.prototype.findNode.call(this, filters, "OFFSET"); // jshint ignore:line - var orderByInfo=Mssql.super_.prototype.findNode.call(this, filters, "ORDER BY"); // jshint ignore:line - - // no OFFSET or LIMIT then there's nothing special to do - if (!offsetInfo && !limitInfo) return; - // ORDER BY with OFFSET we have work to do, may consume LIMIT as well - if (orderByInfo && offsetInfo) _processOrderByOffsetLimit(orderByInfo,offsetInfo,limitInfo); - else if (offsetInfo) throw new Error("MS SQL Server does not allow OFFSET without ORDER BY"); - else if (limitInfo) _processLimit(limitInfo); - } - - /** - * We need to turn LIMIT into a TOP clause on the SELECT STATEMENT - * - * @param limitInfo - * @private - */ - function _processLimit(limitInfo){ - var selectInfo=Mssql.super_.prototype.findNode.call(this, actions, "SELECT"); // jshint ignore:line - assert(selectInfo!==undefined,"MS SQL Server requires a SELECT clause when using LIMIT"); - // save the LIMIT node with the SELECT node - selectInfo.node.msSQLLimitNode=limitInfo.node; - // remove the LIMIT node from the filters so it doesn't get processed later. - filters.splice(limitInfo.index,1); - } - - /** - * We need to turn LIMIT into a TOP clause on the SELECT STATEMENT - * - * @param orderByInfo - * @param offsetInfo - * @param limitInfo - * @private - */ - function _processOrderByOffsetLimit(orderByInfo,offsetInfo,limitInfo){ - // save the OFFSET AND LIMIT nodes with the ORDER BY node - orderByInfo.node.msSQLOffsetNode=offsetInfo.node; - if (limitInfo) orderByInfo.node.msSQLLimitNode=limitInfo.node; - // remove the OFFSET and LIMIT nodes from the filters so they don't get processed later. - filters.splice(offsetInfo.index,1); - if (limitInfo) filters.splice(limitInfo.index,1); - } - - // MAIN - - Mssql.super_.prototype.handleDistinct.call(this, actions, filters); - _handleLimitAndOffset(); - - // lazy-man sorting - var sortedNodes = actions.concat(targets).concat(filters); - for(var i = 0; i < sortedNodes.length; i++) { - var res = this.visit(sortedNodes[i]); - this.output = this.output.concat(res); - } - return this.output; -}; - -//Mysql.prototype.visitRenameColumn = function(renameColumn) { -// var dataType = renameColumn.nodes[1].dataType || renameColumn.nodes[0].dataType; -// assert(dataType, 'dataType missing for column ' + (renameColumn.nodes[1].name || renameColumn.nodes[0].name || '') + -// ' (CHANGE COLUMN statements require a dataType)'); -// return ['CHANGE COLUMN ' + this.visit(renameColumn.nodes[0]) + ' ' + this.visit(renameColumn.nodes[1]) + ' ' + dataType]; -//}; -// -//Mysql.prototype.visitInsert = function(insert) { -// var result = Postgres.prototype.visitInsert.call(this, insert); -// if (result[2] === 'DEFAULT VALUES') { -// result[2] = '() VALUES ()'; -// } -// return result; -//}; -// -//Mysql.prototype.visitIndexes = function(node) { -// var tableName = this.visit(this._queryNode.table.toNode()); -// -// return "SHOW INDEX FROM " + tableName; -//}; - -Mssql.prototype.visitOnDuplicate = function(onDuplicate) { - throw new Error('MSSQL does not allow onDuplicate clause.'); -}; - -Mssql.prototype.visitOnConflict = function(onConflict) { - throw new Error('MSSQL does not allow onConflict clause.'); -}; - -Mssql.prototype.visitReturning = function() { - // TODO: need to add some code to the INSERT clause to support this since its the equivalent of the OUTPUT clause - // in MS SQL which appears before the values, not at the end of the statement. - throw new Error('Returning clause is not yet supported for MS SQL.'); -}; - -// We deal with SELECT specially so we can add the TOP clause if needed -Mssql.prototype.visitSelect = function(select) { - if (!select.msSQLLimitNode) return Mssql.super_.prototype.visitSelect.call(this, select); - var result=[ - 'SELECT', - 'TOP('+getModifierValue(this,select.msSQLLimitNode)+')', - select.nodes.map(this.visit.bind(this)).join(', ') - ]; - this._selectOrDeleteEndIndex = this.output.length + result.length; - return result; -}; - -// Node is either an OFFSET or LIMIT node -function getModifierValue(dialect,node){ - return node.count.type ? dialect.visit(node.count) : node.count; -} - -function isAlterAddColumn(alter){ - if (alter.nodes.length===0) return false; - if (alter.nodes[0].type!='ADD COLUMN') return false; - return true; -} - -function isAlterDropColumn(alter){ - if (alter.nodes.length===0) return false; - if (alter.nodes[0].type!='DROP COLUMN') return false; - return true; -} - -function isAlterRename(alter){ - if (alter.nodes.length===0) return false; - if (alter.nodes[0].type!='RENAME') return false; - return true; -} - -function isAlterRenameColumn(alter){ - if (alter.nodes.length===0) return false; - if (alter.nodes[0].type!='RENAME COLUMN') return false; - return true; -} - -function isCountStarExpression(columnNode){ - if (!columnNode.aggregator) return false; - if (columnNode.aggregator.toLowerCase()!='count') return false; - if (!columnNode.star) return false; - return true; -} - -function isCreateIfNotExists(create){ - if (create.nodes.length===0) return false; - if (create.nodes[0].type!='IF NOT EXISTS') return false; - return true; -} - -function isCreateTemporary(create){ - return create.options.isTemporary; -} - -function isDropIfExists(drop){ - if (drop.nodes.length===0) return false; - if (drop.nodes[0].type!='IF EXISTS') return false; - return true; -} - -// SQL Server does not support array expressions except in the IN clause. -function isRightSideArray(binary){ - return Array.isArray(binary.right); -} - -module.exports = Mssql; diff --git a/lib/dialect/mssql.ts b/lib/dialect/mssql.ts new file mode 100644 index 00000000..fd60f6e6 --- /dev/null +++ b/lib/dialect/mssql.ts @@ -0,0 +1,501 @@ +// TODO: visitCreate needs to support schemas +// TODO: visitDrop needs to support schemas + +'use strict'; + +import assert = require('assert'); + +import { + AlterNode, + BinaryNode, + CaseNode, + ColumnNode, + CreateNode, + DropNode, + FunctionCallNode, + ModifierNode, + Node, + OnConflictNode, + OnDuplicateNode, + OrderByNode, + ParameterNode, + ReplaceNode, + ReturningNode, + SelectNode +} from '../node'; +import { Postgres } from './postgres'; + +/** + * Config can contain: + * + * questionMarkParameterPlaceholder:true which will use a "?" for the parameter placeholder instead of the @index. + * + * @param config + * @constructor + */ +export class Mssql extends Postgres { + protected myClass = Mssql; + protected quoteCharacter = '['; + protected arrayAggFunctionName = ''; + constructor(config: { questionMarkParameterPlaceholder?: boolean }) { + super(config); + } + public _getParameterPlaceholder(index: string | number, value: any): string { + if (this.config.questionMarkParameterPlaceholder) { + return '?'; + } + return `@${index}`; + } + public visitReplace(replaceNode: ReplaceNode): string[] { + throw new Error('Mssql does not support REPLACE.'); + } + public visitBinary(binaryNode: BinaryNode): string[] { + if (binaryNode.operator === '@@') { + return [`(CONTAINS (${this.visit(binaryNode.left)}, ${this.visit(binaryNode.right)}))`]; + } + if (!isRightSideArray(binaryNode)) { + return super.visitBinary(binaryNode); + } + if (binaryNode.operator === 'IN' || binaryNode.operator === 'NOT IN') { + return super.visitBinary(binaryNode); + } + throw new Error('SQL Sever does not support arrays in this type of expression.'); + } + public visitAlter(alterNode: AlterNode): string[] { + const errMsg = 'ALTER TABLE cannot be used to perform multiple different operations in the same statement.'; + // Implement our own add column: + // PostgreSQL: ALTER TABLE "name" ADD COLUMN "col1", ADD COLUMN "col2" + // Mssql: ALTER TABLE [name] ADD [col1], [col2] + const addColumn = () => { + this.visitingAlter = true; + const table = this.queryNode!.table; + this.visitingAddColumn = true; + let result = `ALTER TABLE ${this.visit(table.toNode())} ADD ${this.visit(alterNode.nodes[0].nodes[0])}`; + for (let i = 1, len = alterNode.nodes.length; i < len; i++) { + const node = alterNode.nodes[i]; + assert(node.type === 'ADD COLUMN', errMsg); + result += `, ${this.visit(node.nodes[0])}`; + } + this.visitingAddColumn = false; + this.visitingAlter = false; + return [result]; + }; + // Implement our own drop column: + // PostgreSQL: ALTER TABLE "name" DROP COLUMN "col1", DROP COLUMN "col2" + // Mssql: ALTER TABLE [name] DROP COLUMN [col1], [col2] + const dropColumn = () => { + this.visitingAlter = true; + const table = this.queryNode!.table; + const result = ['ALTER TABLE', ...this.visit(table.toNode())]; + let columns = `DROP COLUMN ${this.visit(alterNode.nodes[0].nodes[0])}`; + for (let i = 1, len = alterNode.nodes.length; i < len; i++) { + const node = alterNode.nodes[i]; + assert(node.type === 'DROP COLUMN', errMsg); + columns += `, ${this.visit(node.nodes[0])}`; + } + result.push(columns); + this.visitingAlter = false; + return result; + }; + // Implement our own rename table: + // PostgreSQL: ALTER TABLE "post" RENAME TO "posts" + // Mssql: EXEC sp_rename [post], [posts] + const rename = () => { + this.visitingAlter = true; + const table = this.queryNode!.table; + const result = ['EXEC sp_rename ' + this.visit(table.toNode()) + ', ' + this.visit(alterNode.nodes[0].nodes[0])]; + this.visitingAlter = false; + return result; + }; + // Implement our own rename column: + // PostgreSQL: ALTER TABLE "group" RENAME COLUMN "userId" TO "newUserId" + // Mssql: EXEC sp_rename '[group].[userId]', [newUserId] + const renameColumn = () => { + this.visitingAlter = true; + const table = this.queryNode!.table; + const result = [ + `EXEC sp_rename '${this.visit(table.toNode())}.${this.visit(alterNode.nodes[0].nodes[0])}', ${this.visit( + alterNode.nodes[0].nodes[1] + )}, 'COLUMN'` + ]; + this.visitingAlter = false; + return result; + }; + if (isAlterAddColumn(alterNode)) { + return addColumn(); + } + if (isAlterDropColumn(alterNode)) { + return dropColumn(); + } + if (isAlterRename(alterNode)) { + return rename(); + } + if (isAlterRenameColumn(alterNode)) { + return renameColumn(); + } + return super.visitAlter(alterNode); + } + // Need to implement a special version of CASE since SQL doesn't support + // CASE WHEN true THEN xxx END + // the "true" has to be a boolean expression like 1=1 + public visitCase(caseNode: CaseNode): string[] { + const whenValue = (node: Node) => { + if (node.type !== 'PARAMETER') { + return this.visit(node); + } + // dealing with a true/false value + const val = (node as ParameterNode).value(); + if (val === true) { + return '1=1'; + } else { + return '0=1'; + } + }; + assert(caseNode.whenList.length === caseNode.thenList.length); + let text = '(CASE'; + this.visitingCase = true; + for (let i = 0; i < caseNode.whenList.length; i++) { + text += ` WHEN ${whenValue(caseNode.whenList[i])} THEN ${this.visit(caseNode.thenList[i])}`; + } + if (caseNode.else != null) { + text += ` ELSE ${this.visit(caseNode.else)}`; + } + this.visitingCase = false; + text += ' END)'; + return [text]; + } + public visitColumn(columnNode: ColumnNode): string[] { + let table; + let inSelectClause: boolean = false; + table = columnNode.table; + inSelectClause = !this.selectOrDeleteEndIndex; + const arrayAgg = () => { + throw new Error('SQL Server does not support array_agg.'); + }; + const countStar = () => { + // Implement our own since count(table.*) is invalid in Mssql + let result = 'COUNT(*)'; + if (inSelectClause && columnNode.alias) { + result += ` AS ${this.quote(columnNode.alias)}`; + } + return result; + }; + if (isCountStarExpression(columnNode)) { + return [countStar()]; + } + if (inSelectClause && table && !table.alias && columnNode.asArray) { + return arrayAgg(); + } + return super.visitColumn(columnNode); + } + public visitCreate(createNode: CreateNode): string[] { + const isNotExists = isCreateIfNotExists(createNode); + const isTemporary = isCreateTemporary(createNode); + if (!isNotExists && !isTemporary) { + return super.visitCreate(createNode); + } + // Implement our own create if not exists: + // PostgreSQL: CREATE TABLE IF NOT EXISTS "group" ("id" constchar(100)) + // Mssql: IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'group') BEGIN ... END + const table = this.queryNode!.table; + const colNodes = table.columns.map((col) => col.toNode()); + const tableResult = this.visit(table.toNode()); + this.visitingCreate = true; + const createResult = ['CREATE TABLE']; + createResult.push(...tableResult); + createResult.push(`(${colNodes.map(this.visit.bind(this)).join(', ')})`); + this.visitingCreate = false; + let tableStr = tableResult.join(' '); + tableStr = tableStr.replace("'", "''"); + tableStr = `'${tableStr.substring(1, tableStr.length - 1)}'`; + const whereClause = `WHERE TABLE_NAME = ${tableStr}`; + // TODO: need to add schema check, sudo code: + // if (schema) { whereClause+=' AND TABLE_SCHEMA = schemaResult.join(' ')} + // Add some tests for this as well + if (!isNotExists) { + return createResult; + } + return [`IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES ${whereClause}) BEGIN ${createResult.join(' ')} END`]; + } + public visitDrop(dropNode: DropNode): string[] { + if (!isDropIfExists(dropNode)) { + return super.visitDrop(dropNode); + } + // Implement our own drop if exists: + // PostgreSQL: DROP TABLE IF EXISTS "group" + // Mssql: IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = [group]) BEGIN ... END + const table = this.queryNode!.table; + const tableResult = this.visit(table.toNode()); + const dropResult = ['DROP TABLE']; + dropResult.push(...tableResult); + const whereClause = `WHERE TABLE_NAME = ${tableResult.join(' ')}`; + // TODO: need to add schema check, sudo code: + // if (schema) { whereClause+=' AND TABLE_SCHEMA = schemaResult.join(' ')} + // Add some tests for this as well + return [`IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES ${whereClause}) BEGIN ${dropResult.join(' ')} END`]; + } + public visitFunctionCall(functionCallNode: FunctionCallNode): string[] { + this.visitingFunctionCall = true; + const extract = () => { + const nodes = functionCallNode.nodes.map(this.visit.bind(this)); + if (nodes.length !== 1) { + throw new Error(`Not enough parameters passed to ${functionCallNode.name} function`); + } + return `DATEPART(${functionCallNode.name.toLowerCase()}, ${nodes[0] + ''})`; + }; + let txt; + // Override date functions since mssql uses datepart + if (['YEAR', 'MONTH', 'DAY', 'HOUR'].indexOf(functionCallNode.name) >= 0) { + txt = extract(); + } + // Override CURRENT_TIMESTAMP function to remove parens + else if ('CURRENT_TIMESTAMP' === functionCallNode.name) { + txt = functionCallNode.name; + } else { + let name = functionCallNode.name; + // override the LENGTH function since mssql calls it LEN + if (name === 'LENGTH') { + name = 'LEN'; + } + txt = `${name}(${functionCallNode.nodes.map(this.visit.bind(this)).join(', ')})`; + } + this.visitingFunctionCall = false; + return [txt]; + } + public visitOrderBy(orderByNode: OrderByNode): string[] { + const result = super.visitOrderBy(orderByNode); + const offsetNode = orderByNode.msSQLOffsetNode; + const limitNode = orderByNode.msSQLLimitNode; + if (!offsetNode && !limitNode) { + return result; + } + assert(offsetNode, 'Something bad happened, should have had an msSQLOffsetNode here.'); + result.push('OFFSET ' + getModifierValue(this, offsetNode!) + ' ROWS'); + if (!limitNode) { + return result; + } + result.push('FETCH NEXT ' + getModifierValue(this, limitNode) + ' ROWS ONLY'); + return result; + } + /** + * We override this so that we can deal with the LIMIT and OFFSET clauses specially since they have to become + * part of the SELECT and ORDER BY clauses. + * + * Basically if there's an ORDER BY clause we attach OFFSET and LIMIT to it so that it can be processed by the + * ORDER BY handler later. + * + * If there's a LIMIT clause without OFFSET, we attach it to the SELECT clause so we can process it later. + * + * @param {Node[]} actions + * @param {Node[]} targets + * @param {Node[]} filters + * @returns {String[]} + */ + public visitQueryHelper(actions: Node[], targets: Node[], filters: Node[]): string[] { + const handleLimitAndOffset = () => { + const limitInfo = super.findNode(filters, 'LIMIT'); + const offsetInfo = super.findNode(filters, 'OFFSET'); + const orderByInfo = super.findNode(filters, 'ORDER BY'); + // no OFFSET or LIMIT then there's nothing special to do + if (!offsetInfo && !limitInfo) { + return; + } + // ORDER BY with OFFSET we have work to do, may consume LIMIT as well + if (orderByInfo && offsetInfo) { + processOrderByOffsetLimit(orderByInfo, offsetInfo, limitInfo); + } else if (offsetInfo) { + throw new Error('MS SQL Server does not allow OFFSET without ORDER BY'); + } else if (limitInfo) { + processLimit(limitInfo); + } + }; + /** + * We need to turn LIMIT into a TOP clause on the SELECT STATEMENT + * + * @param limitInfo + * @private + */ + const processLimit = (limitInfo: { index: number; node: Node }) => { + const selectInfo = super.findNode(actions, 'SELECT'); + assert(selectInfo !== undefined, 'MS SQL Server requires a SELECT clause when using LIMIT'); + // save the LIMIT node with the SELECT node + (selectInfo!.node as SelectNode).msSQLLimitNode = limitInfo.node as ModifierNode; + // remove the LIMIT node from the filters so it doesn't get processed later. + filters.splice(limitInfo.index, 1); + }; + /** + * We need to turn LIMIT into a TOP clause on the SELECT STATEMENT + * + * @param orderByInfo + * @param offsetInfo + * @param limitInfo + * @private + */ + const processOrderByOffsetLimit = ( + orderByInfo: { + index: number; + node: Node; + }, + offsetInfo: { + index: number; + node: Node; + }, + limitInfo?: { + index: number; + node: Node; + } + ) => { + // save the OFFSET AND LIMIT nodes with the ORDER BY node + (orderByInfo.node as OrderByNode).msSQLOffsetNode = offsetInfo.node as ModifierNode; + if (limitInfo) { + (orderByInfo.node as OrderByNode).msSQLLimitNode = limitInfo.node as ModifierNode; + } + // remove the OFFSET and LIMIT nodes from the filters so they don't get processed later. + filters.splice(offsetInfo.index, 1); + if (limitInfo) { + filters.splice(limitInfo.index, 1); + } + }; + // MAIN + super.handleDistinct(actions, filters); + handleLimitAndOffset(); + // lazy-man sorting + const sortedNodes = actions.concat(targets).concat(filters); + for (const node of sortedNodes) { + const res = this.visit(node); + this.output = this.output.concat(res); + } + return this.output; + } + // Mysql.prototype.visitRenameColumn = function(renameColumn) { + // const dataType = renameColumn.nodes[1].dataType || renameColumn.nodes[0].dataType; + // assert(dataType, 'dataType missing for column ' + (renameColumn.nodes[1].name || renameColumn.nodes[0].name || '') + + // ' (CHANGE COLUMN statements require a dataType)'); + // return ['CHANGE COLUMN ' + this.visit(renameColumn.nodes[0]) + ' ' + this.visit(renameColumn.nodes[1]) + ' ' + dataType]; + // }; + // + // Mysql.prototype.visitInsert = function(insert) { + // const result = Postgres.prototype.visitInsert.call(this, insert); + // if (result[2] === 'DEFAULT VALUES') { + // result[2] = '() VALUES ()'; + // } + // return result; + // }; + // + // Mysql.prototype.visitIndexes = function(node) { + // const tableName = this.visit(this._queryNode.table.toNode()); + // + // return "SHOW INDEX FROM " + tableName; + // }; + public visitOnDuplicate(onDuplicateNode: OnDuplicateNode): string[] { + throw new Error('MSSQL does not allow onDuplicate clause.'); + } + public visitOnConflict(onConflictNode: OnConflictNode): string[] { + throw new Error('MSSQL does not allow onConflict clause.'); + } + public visitReturning(returningNode: ReturningNode): string[] { + // TODO: need to add some code to the INSERT clause to support this since its the equivalent of the OUTPUT clause + // in MS SQL which appears before the values, not at the end of the statement. + throw new Error('Returning clause is not yet supported for MS SQL.'); + } + // We deal with SELECT specially so we can add the TOP clause if needed + public visitSelect(selectNode: SelectNode): string[] { + if (!selectNode.msSQLLimitNode) { + return super.visitSelect(selectNode); + } + const result = [ + 'SELECT', + 'TOP(' + getModifierValue(this, selectNode.msSQLLimitNode) + ')', + selectNode.nodes.map(this.visit.bind(this)).join(', ') + ]; + this.selectOrDeleteEndIndex = this.output.length + result.length; + return result; + } +} + +// Node is either an OFFSET or LIMIT node +function getModifierValue(dialect: Mssql, node: ModifierNode) { + return node.count.type ? dialect.visit(node.count) : node.count; +} + +function isAlterAddColumn(alterNode: AlterNode) { + if (alterNode.nodes.length === 0) { + return false; + } + if (alterNode.nodes[0].type !== 'ADD COLUMN') { + return false; + } + return true; +} + +function isAlterDropColumn(alterNode: AlterNode) { + if (alterNode.nodes.length === 0) { + return false; + } + if (alterNode.nodes[0].type !== 'DROP COLUMN') { + return false; + } + return true; +} + +function isAlterRename(alterNode: AlterNode) { + if (alterNode.nodes.length === 0) { + return false; + } + if (alterNode.nodes[0].type !== 'RENAME') { + return false; + } + return true; +} + +function isAlterRenameColumn(alterNode: AlterNode) { + if (alterNode.nodes.length === 0) { + return false; + } + if (alterNode.nodes[0].type !== 'RENAME COLUMN') { + return false; + } + return true; +} + +function isCountStarExpression(columnNode: ColumnNode) { + if (!columnNode.aggregator) { + return false; + } + if (columnNode.aggregator.toLowerCase() !== 'count') { + return false; + } + if (!columnNode.star) { + return false; + } + return true; +} + +function isCreateIfNotExists(createNode: CreateNode) { + if (createNode.nodes.length === 0) { + return false; + } + if (createNode.nodes[0].type !== 'IF NOT EXISTS') { + return false; + } + return true; +} + +function isCreateTemporary(createNode: CreateNode) { + return createNode.options.isTemporary; +} + +function isDropIfExists(dropNode: DropNode) { + if (dropNode.nodes.length === 0) { + return false; + } + if (dropNode.nodes[0].type !== 'IF EXISTS') { + return false; + } + return true; +} + +// SQL Server does not support array expressions except in the IN clause. +function isRightSideArray(binaryNode: BinaryNode) { + return Array.isArray(binaryNode.right); +} diff --git a/lib/dialect/mysql.js b/lib/dialect/mysql.js deleted file mode 100644 index 0a63f3be..00000000 --- a/lib/dialect/mysql.js +++ /dev/null @@ -1,221 +0,0 @@ -'use strict'; - -var util = require('util'); -var assert = require('assert'); -var _ = require('lodash'); - -var Mysql = function(config) { - this.output = []; - this.params = []; - this.config = config || {}; -}; - -var Postgres = require('./postgres'); - -util.inherits(Mysql, Postgres); - -Mysql.prototype._myClass = Mysql; - -Mysql.prototype._quoteCharacter = '`'; - -Mysql.prototype._arrayAggFunctionName = 'GROUP_CONCAT'; - -Mysql.prototype.visitReplace = function(replace) { - var self = this; - // don't use table.column for replaces - this._visitedReplace = true; - - var result = ['REPLACE']; - result = result.concat(replace.nodes.map(this.visit.bind(this))); - result.push('INTO ' + this.visit(this._queryNode.table.toNode())); - result.push('(' + replace.columns.map(this.visit.bind(this)).join(', ') + ')'); - - var paramNodes = replace.getParameters(); - - if (paramNodes.length > 0) { - var paramText = paramNodes.map(function (paramSet) { - return paramSet.map(function (param) { - return self.visit(param); - }).join(', '); - }).map(function (param) { - return '('+param+')'; - }).join(', '); - - result.push('VALUES', paramText); - - if (result.slice(2, 5).join(' ') === '() VALUES ()') { - result.splice(2, 3, 'DEFAULT VALUES'); - } - } - - this._visitedReplace = false; - - if (result[2] === 'DEFAULT VALUES') { - result[2] = '() VALUES ()'; - } - return result; -}; - -Mysql.prototype._getParameterPlaceholder = function() { - return '?'; -}; - -Mysql.prototype._getParameterValue = function(value) { - if (Buffer.isBuffer(value)) { - value = 'x' + this._getParameterValue(value.toString('hex')); - } else { - value = Postgres.prototype._getParameterValue.call(this, value); - } - return value; -}; - -Mysql.prototype.visitOnDuplicate = function(onDuplicate) { - var params = []; - /* jshint boss: true */ - for(var i = 0, node; node = onDuplicate.nodes[i]; i++) { - var target_col = this.visit(node); - params = params.concat(target_col + ' = ' + this.visit(node.value)); - } - var result = [ - 'ON DUPLICATE KEY UPDATE', - params.join(', ') - ]; - return result; -}; - -Mysql.prototype.visitOnConflict = function(onConflict) { - throw new Error('Mysql does not allow onConflict clause.'); -}; - -Mysql.prototype.visitReturning = function() { - throw new Error('MySQL does not allow returning clause.'); -}; - -Mysql.prototype.visitForShare = function() { - throw new Error('MySQL does not allow FOR SHARE clause.'); -}; - -Mysql.prototype.visitCreate = function(create) { - var result = Mysql.super_.prototype.visitCreate.call(this, create); - var engine = this._queryNode.table._initialConfig.engine; - var charset = this._queryNode.table._initialConfig.charset; - - if ( !! engine) { - result.push('ENGINE=' + engine); - } - - if ( !! charset) { - result.push('DEFAULT CHARSET=' + charset); - } - - return result; -}; - -Mysql.prototype.visitRenameColumn = function(renameColumn) { - var dataType = renameColumn.nodes[1].dataType || renameColumn.nodes[0].dataType; - assert(dataType, 'dataType missing for column ' + (renameColumn.nodes[1].name || renameColumn.nodes[0].name || '') + - ' (CHANGE COLUMN statements require a dataType)'); - return ['CHANGE COLUMN ' + this.visit(renameColumn.nodes[0]) + ' ' + this.visit(renameColumn.nodes[1]) + ' ' + dataType]; -}; - -Mysql.prototype.visitInsert = function(insert) { - var result = Postgres.prototype.visitInsert.call(this, insert); - if (result[2] === 'DEFAULT VALUES') { - result[2] = '() VALUES ()'; - } - return result; -}; - -Mysql.prototype.visitIndexes = function(node) { - var tableName = this.visit(this._queryNode.table.toNode())[0]; - - return "SHOW INDEX FROM " + tableName; -}; - -Mysql.prototype.visitBinary = function(binary) { - if (binary.operator === '@@') { - var self = this; - var text = '(MATCH ' + this.visit(binary.left) + ' AGAINST '; - text += this.visit(binary.right); - text += ')'; - return [text]; - } - return Mysql.super_.prototype.visitBinary.call(this, binary); -}; - -Mysql.prototype.visitFunctionCall = function(functionCall) { - var _this=this; - - this._visitingFunctionCall = true; - - function _extract() { - var nodes = functionCall.nodes.map(_this.visit.bind(_this)); - if (nodes.length != 1) throw new Error('Not enough parameters passed to ' + functionCall.name + ' function'); - var txt = functionCall.name + '(' + (nodes[0]+'') + ')'; - return txt; - } - - var txt=""; - var name = functionCall.name; - // Override date functions since mysql is different than postgres - if (['YEAR', 'MONTH', 'DAY', 'HOUR'].indexOf(functionCall.name) >= 0) txt = _extract(); - // Override CURRENT_TIMESTAMP function to remove parens - else if ('CURRENT_TIMESTAMP' == functionCall.name) txt = functionCall.name; - else txt = name + '(' + functionCall.nodes.map(this.visit.bind(this)).join(', ') + ')'; - - this._visitingFunctionCall = false; - return [txt]; -}; - -Mysql.prototype.visitColumn = function(columnNode) { - var self = this; - var inSelectClause; - - function isCountStarExpression(columnNode){ - if (!columnNode.aggregator) return false; - if (columnNode.aggregator.toLowerCase()!='count') return false; - if (!columnNode.star) return false; - return true; - } - - function _countStar(){ - // Implement our own since count(table.*) is invalid in Mysql - var result='COUNT(*)'; - if(inSelectClause && columnNode.alias) { - result += ' AS ' + self.quote(columnNode.alias); - } - return result; - } - - inSelectClause = !this._selectOrDeleteEndIndex; - if(isCountStarExpression(columnNode)) return _countStar(); - return Mysql.super_.prototype.visitColumn.call(this, columnNode); -}; - -Mysql.prototype.visitInterval = function(interval) { - var parameter; - if(_.isNumber(interval.years)) { - if(_.isNumber(interval.months)) { - parameter = "'" + interval.years + '-' + interval.months + "' YEAR_MONTH"; - } else { - parameter = interval.years + ' YEAR'; - } - } else if(_.isNumber(interval.months)) { - parameter = interval.months + ' MONTH'; - } else if(_.isNumber(interval.days)) { - parameter = "'" + interval.days + ' ' + - (_.isNumber(interval.hours)?interval.hours:0) + ':' + - (_.isNumber(interval.minutes)?interval.minutes:0) + ':' + - (_.isNumber(interval.seconds)?interval.seconds:0) + "' DAY_SECOND"; - } else { - parameter = "'" + (_.isNumber(interval.hours)?interval.hours:0) + ':' + - (_.isNumber(interval.minutes)?interval.minutes:0) + ':' + - (_.isNumber(interval.seconds)?interval.seconds:0) + "' HOUR_SECOND"; - } - var result = "INTERVAL " + parameter; - return result; -}; - - - -module.exports = Mysql; diff --git a/lib/dialect/mysql.ts b/lib/dialect/mysql.ts new file mode 100644 index 00000000..c1a60f3e --- /dev/null +++ b/lib/dialect/mysql.ts @@ -0,0 +1,199 @@ +'use strict'; + +import assert = require('assert'); +import _ = require('lodash'); + +import { + BinaryNode, + ColumnNode, + CreateNode, + ForShareNode, + FunctionCallNode, + IndexesNode, + InsertNode, + IntervalNode, + OnConflictNode, + OnDuplicateNode, + RenameColumnNode, + ReplaceNode, + ReturningNode +} from '../node'; +import { Postgres } from './postgres'; + +export class Mysql extends Postgres { + protected myClass = Mysql; + protected quoteCharacter = '`'; + protected arrayAggFunctionName = 'GROUP_CONCAT'; + + constructor(config: any) { + super(config); + } + public _getParameterPlaceholder(index: string | number, value: any): string { + return '?'; + } + public _getParameterValue( + value: null | boolean | number | string | any[] | Date | Buffer | object, + quoteChar?: string + ): string | number { + return Buffer.isBuffer(value) + ? 'x' + this._getParameterValue(value.toString('hex')) + : Postgres.prototype._getParameterValue.call(this, value); + } + public visitReplace(replaceNode: ReplaceNode): string[] { + // don't use table.column for replaces + this.visitedReplace = true; + const result = [ + 'REPLACE', + ...replaceNode.nodes.map((n) => this.visit(n).join()), + `INTO ${this.visit(this.queryNode!.table.toNode())}`, + `(${replaceNode.columns.map((n) => this.visit(n).join()).join(', ')})` + ]; + const paramNodes = replaceNode.getParameters(); + if (paramNodes.length > 0) { + const paramText = paramNodes + .map((paramSet) => { + return paramSet.map((param) => this.visit(param).join()).join(', '); + }) + .map((param) => `(${param})`) + .join(', '); + result.push('VALUES', paramText); + if (result.slice(2, 5).join(' ') === '() VALUES ()') { + result.splice(2, 3, 'DEFAULT VALUES'); + } + } + this.visitedReplace = false; + if (result[2] === 'DEFAULT VALUES') { + result[2] = '() VALUES ()'; + } + return result; + } + public visitOnDuplicate(onDuplicateNode: OnDuplicateNode): string[] { + const params: string[] = []; + /* jshint boss: true */ + for (const node of onDuplicateNode.nodes as ColumnNode[]) { + const targetCol = this.visit(node); + params.push(`${targetCol} = ${this.visit(node.value)}`); + } + const result = ['ON DUPLICATE KEY UPDATE', params.join(', ')]; + return result; + } + public visitOnConflict(onConflictNode: OnConflictNode): string[] { + throw new Error('Mysql does not allow onConflict clause.'); + } + public visitReturning(returningNode: ReturningNode): string[] { + throw new Error('MySQL does not allow returning clause.'); + } + public visitForShare(forShareNode: ForShareNode): string[] { + throw new Error('MySQL does not allow FOR SHARE clause.'); + } + public visitCreate(createNode: CreateNode): string[] { + const result = super.visitCreate(createNode); + const engine = this.queryNode!.table.initialConfig.engine; + const charset = this.queryNode!.table.initialConfig.charset; + if (!!engine) { + result.push('ENGINE=' + engine); + } + if (!!charset) { + result.push('DEFAULT CHARSET=' + charset); + } + return result; + } + public visitRenameColumn(renameColumnNode: RenameColumnNode): string[] { + const dataType = (renameColumnNode.nodes[1] as ColumnNode).dataType || (renameColumnNode.nodes[0] as ColumnNode).dataType; + assert( + dataType, + 'dataType missing for column ' + + ((renameColumnNode.nodes[1] as ColumnNode).name || (renameColumnNode.nodes[0] as ColumnNode).name || '') + + ' (CHANGE COLUMN statements require a dataType)' + ); + return [`CHANGE COLUMN ${this.visit(renameColumnNode.nodes[0])} ${this.visit(renameColumnNode.nodes[1])} ${dataType}`]; + } + public visitInsert(insertNode: InsertNode): string[] { + const result = super.visitInsert(insertNode); + if (result[2] === 'DEFAULT VALUES') { + result[2] = '() VALUES ()'; + } + return result; + } + public visitIndexes(indexesNode: IndexesNode): string[] { + const tableName = this.visit(this.queryNode!.table.toNode())[0]; + return [`SHOW INDEX FROM ${tableName}`]; + } + public visitBinary(binaryNode: BinaryNode): string[] { + if (binaryNode.operator === '@@') { + return [`(MATCH ${this.visit(binaryNode.left)} AGAINST ${this.visit(binaryNode.right)})`]; + } + return super.visitBinary(binaryNode); + } + public visitFunctionCall(functionCallNode: FunctionCallNode): string[] { + this.visitingFunctionCall = true; + const extract = () => { + const nodes = functionCallNode.nodes.map((n) => this.visit(n).join()); + if (nodes.length !== 1) { + throw new Error(`Not enough parameters passed to ${functionCallNode.name} function`); + } + return `${functionCallNode.name}(${nodes[0]})`; + }; + let txt = ''; + const name = functionCallNode.name; + // Override date functions since mysql is different than postgres + if (['YEAR', 'MONTH', 'DAY', 'HOUR'].indexOf(functionCallNode.name) >= 0) { + txt = extract(); + } + // Override CURRENT_TIMESTAMP function to remove parens + else if ('CURRENT_TIMESTAMP' === functionCallNode.name) { + txt = functionCallNode.name; + } else { + txt = `${name}(${functionCallNode.nodes.map((n) => this.visit(n).join()).join(', ')})`; + } + this.visitingFunctionCall = false; + return [txt]; + } + public visitColumn(columnNode: ColumnNode): string[] { + let inSelectClause: boolean = false; + inSelectClause = !this.selectOrDeleteEndIndex; + const isCountStarExpression = (node: ColumnNode) => { + if (!node.aggregator) { + return false; + } + if (node.aggregator.toLowerCase() !== 'count') { + return false; + } + if (!node.star) { + return false; + } + return true; + }; + const countStar = () => { + // Implement our own since count(table.*) is invalid in Mysql + let result = 'COUNT(*)'; + if (inSelectClause && columnNode.alias) { + result += ` AS ${this.quote(columnNode.alias)}`; + } + return result; + }; + if (isCountStarExpression(columnNode)) { + return [countStar()]; + } + return super.visitColumn(columnNode); + } + public visitInterval(intervalNode: IntervalNode): string[] { + let parameter; + if (_.isNumber(intervalNode.years)) { + parameter = _.isNumber(intervalNode.months) + ? `'${intervalNode.years}-${intervalNode.months}' YEAR_MONTH` + : `${intervalNode.years} YEAR`; + } else if (_.isNumber(intervalNode.months)) { + parameter = `${intervalNode.months} MONTH`; + } else if (_.isNumber(intervalNode.days)) { + parameter = `'${intervalNode.days} ${_.isNumber(intervalNode.hours) ? intervalNode.hours : 0}:${ + _.isNumber(intervalNode.minutes) ? intervalNode.minutes : 0 + }:${_.isNumber(intervalNode.seconds) ? intervalNode.seconds : 0}' DAY_SECOND`; + } else { + parameter = `'${_.isNumber(intervalNode.hours) ? intervalNode.hours : 0}:${ + _.isNumber(intervalNode.minutes) ? intervalNode.minutes : 0 + }:${_.isNumber(intervalNode.seconds) ? intervalNode.seconds : 0}' HOUR_SECOND`; + } + return [`INTERVAL ${parameter}`]; + } +} diff --git a/lib/dialect/oracle.js b/lib/dialect/oracle.js deleted file mode 100644 index 38267339..00000000 --- a/lib/dialect/oracle.js +++ /dev/null @@ -1,325 +0,0 @@ -'use strict'; - -var util = require('util'); -var assert = require('assert'); - -var Oracle = function(config) { - this.output = []; - this.params = []; - this.config = config || {}; -}; - -var Postgres = require('./postgres'); - -var Mssql = require('./mssql'); - -util.inherits(Oracle, Postgres); - -Oracle.prototype._myClass = Oracle; - -Oracle.prototype.visitReplace = function(replace) { - throw new Error('Oracle does not support REPLACE.'); -}; - -Oracle.prototype._aliasText = ' '; -Oracle.prototype._getParameterPlaceholder = function(index, value) { - /* jshint unused: false */ - return ':' + index; -}; - -Oracle.prototype.visitAlias = function(alias) { - var result = [this.visit(alias.value) + ' ' + this.quote(alias.alias)]; - return result; -}; - -Oracle.prototype.visitAlter = function(alter) { - var self=this; - var errMsg='ALTER TABLE cannot be used to perform multiple different operations in the same statement.'; - - // Implement our own add column: - // PostgreSQL: ALTER TABLE "name" ADD COLUMN "col1", ADD COLUMN "col2" - // Oracle: ALTER TABLE "name" ADD ("col1", "col2") - function _addColumn(){ - self._visitingAlter = true; - var table = self._queryNode.table; - self._visitingAddColumn = true; - var result='ALTER TABLE '+self.visit(table.toNode())+' ADD ('+self.visit(alter.nodes[0].nodes[0]); - for (var i= 1,len=alter.nodes.length; i= 0) { - ret.push('ROWS'); - } - if (ret.indexOf('LIMIT') >= 0) { - ret[0] = 'FETCH NEXT'; - ret.push('ROWS ONLY'); - } - return ret; -}; - -Oracle.prototype.visitQueryHelper=function(actions,targets,filters){ - var output = Oracle.super_.prototype.visitQueryHelper.call(this,actions,targets,filters); - - //In Oracle, OFFSET must come before FETCH NEXT (limit) - //Change positions, if both are present and not done already - var offset = output.indexOf('OFFSET'); - var limit = output.indexOf('FETCH NEXT'); - if (offset != -1 && limit != -1 && offset > limit){ - var temp = [output[offset], output[offset+1], output[offset+2]]; - output[offset] = output[limit]; - output[offset+1] = output[limit+1]; - output[offset+2] = output[limit+2]; - output[limit] = temp[0]; - output[limit+1] = temp[1]; - output[limit+2] = temp[2]; - } - - return this.output; -}; - -Oracle.prototype.visitColumn = function(columnNode) { - var self=this; - var table; - var inSelectClause; - - function _arrayAgg(){ - throw new Error("Oracle does not support array_agg."); - } - - function _countStar(){ - // Implement our own since count(table.*) is invalid in Oracle - var result='COUNT(*)'; - if(inSelectClause && columnNode.alias) { - result += self._aliasText + self.quote(columnNode.alias); - } - return result; - } - - table = columnNode.table; - inSelectClause = !this._selectOrDeleteEndIndex; - if (isCountStarExpression(columnNode)) return _countStar(); - if (inSelectClause && table && !table.alias && columnNode.asArray) return _arrayAgg(); - return Oracle.super_.prototype.visitColumn.call(this, columnNode); -}; - - -Oracle.prototype.visitReturning = function() { - // TODO: need to add some code to the INSERT clause to support this since its the equivalent of the OUTPUT clause - // in MS SQL which appears before the values, not at the end of the statement. - throw new Error('Returning clause is not yet supported for Oracle.'); -}; - - -Oracle.prototype._getParameterValue = function(value) { - if (Buffer.isBuffer(value)) { - value = "utl_raw.cast_to_varchar2(hextoraw('" + value.toString('hex') + "'))"; - } else { - value = Oracle.super_.prototype._getParameterValue.call(this, value); - //value = Postgres.prototype._getParameterValue.call(this, value); - } - return value; -}; - - -Oracle.prototype.visitIndexes = function(node) { - - var tableName = this._queryNode.table.getName(); - var schemaName = this._queryNode.table.getSchema(); - - var indexes = "SELECT * FROM USER_INDEXES WHERE TABLE_NAME = '" + tableName + "'"; - - if (schemaName) { - indexes += " AND TABLE_OWNER = '" + schemaName + "'"; - } - - return indexes; -}; - - -Oracle.prototype.visitDropIndex = function(node) { - var result = [ 'DROP INDEX' ]; - var schemaName = node.table.getSchema(); - if (schemaName) { - result.push(this.quote(schemaName) + "."); - } - - result.push(this.quote(node.options.indexName)); - - return result; -}; - -// Using same CASE implementation as MSSQL -Oracle.prototype.visitCase = function(caseExp) { - - return Mssql.prototype.visitCase.call(this, caseExp); -}; - -Oracle.prototype.visitOnConflict = function(onConflict) { - throw new Error('Oracle does not allow onConflict clause.'); -}; - -function isCreateIfNotExists(create){ - if (create.nodes.length===0) return false; - if (create.nodes[0].type!='IF NOT EXISTS') return false; - return true; -} - -function isCreateTemporary(create){ - return create.options.isTemporary; -} - -function isDropIfExists(drop){ - if (drop.nodes.length===0) return false; - if (drop.nodes[0].type!='IF EXISTS') return false; - return true; -} - -// SQL Server does not support array expressions except in the IN clause. -function isRightSideArray(binary){ - return Array.isArray(binary.right); -} - -function isCountStarExpression(columnNode){ - if (!columnNode.aggregator) return false; - if (columnNode.aggregator.toLowerCase()!='count') return false; - if (!columnNode.star) return false; - return true; -} - -function isAlterAddColumn(alter){ - if (alter.nodes.length===0) return false; - if (alter.nodes[0].type!='ADD COLUMN') return false; - return true; -} - -function isAlterDropColumn(alter){ - if (alter.nodes.length===0) return false; - if (alter.nodes[0].type!='DROP COLUMN') return false; - return true; -} - -module.exports = Oracle; diff --git a/lib/dialect/oracle.ts b/lib/dialect/oracle.ts new file mode 100644 index 00000000..6da8f106 --- /dev/null +++ b/lib/dialect/oracle.ts @@ -0,0 +1,346 @@ +'use strict'; + +import assert = require('assert'); + +import { + AliasNode, + AlterNode, + BinaryNode, + CascadeNode, + CaseNode, + ColumnNode, + CreateNode, + DropIndexNode, + DropNode, + IndexesNode, + ModifierNode, + Node, + OnConflictNode, + ParameterNode, + ReplaceNode, + RestrictNode, + ReturningNode, + TableNode +} from '../node'; +import { Postgres } from './postgres'; + +export class Oracle extends Postgres { + protected myClass = Oracle; + + protected aliasText = ' '; + constructor(config: any) { + super(config); + } + public _getParameterValue( + value: null | boolean | number | string | any[] | Date | Buffer | object, + quoteChar?: string + ): string | number { + return Buffer.isBuffer(value) + ? "utl_raw.cast_to_varchar2(hextoraw('" + value.toString('hex') + "'))" + : super._getParameterValue(value); + } + public _getParameterPlaceholder(index: string | number, value: any): string { + return `:${index}`; + } + public visitReplace(replaceNode: ReplaceNode): string[] { + throw new Error('Oracle does not support REPLACE.'); + } + public visitAlias(aliasNode: AliasNode): string[] { + const result = [this.visit(aliasNode.value) + ' ' + this.quote(aliasNode.alias)]; + return result; + } + public visitAlter(alterNode: AlterNode): string[] { + const errMsg = 'ALTER TABLE cannot be used to perform multiple different operations in the same statement.'; + // Implement our own add column: + // PostgreSQL: ALTER TABLE "name" ADD COLUMN "col1", ADD COLUMN "col2" + // Oracle: ALTER TABLE "name" ADD ("col1", "col2") + const addColumn = () => { + this.visitingAlter = true; + const table = this.queryNode!.table; + this.visitingAddColumn = true; + let result = 'ALTER TABLE ' + this.visit(table.toNode()) + ' ADD (' + this.visit(alterNode.nodes[0].nodes[0]); + for (let i = 1, len = alterNode.nodes.length; i < len; i++) { + const node = alterNode.nodes[i]; + assert(node.type === 'ADD COLUMN', errMsg); + result += ', ' + this.visit(node.nodes[0]); + } + result += ')'; + this.visitingAddColumn = false; + this.visitingAlter = false; + return [result]; + }; + // Implement our own drop column: + // PostgreSQL: ALTER TABLE "name" DROP COLUMN "col1", DROP COLUMN "col2" + // Oracle: ALTER TABLE "name" DROP ("col1", "col2") + const dropColumn = () => { + this.visitingAlter = true; + const table = this.queryNode!.table; + const result = ['ALTER TABLE', ...this.visit(table.toNode())]; + let columns = 'DROP (' + this.visit(alterNode.nodes[0].nodes[0]); + for (let i = 1, len = alterNode.nodes.length; i < len; i++) { + const node = alterNode.nodes[i]; + assert(node.type === 'DROP COLUMN', errMsg); + columns += ', ' + this.visit(node.nodes[0]); + } + columns += ')'; + result.push(columns); + this.visitingAlter = false; + return result; + }; + if (isAlterAddColumn(alterNode)) { + return addColumn(); + } + if (isAlterDropColumn(alterNode)) { + return dropColumn(); + } + return super.visitAlter(alterNode); + } + public visitTable(tableNode: TableNode): string[] { + const table = tableNode.table; + let txt = ''; + if (table.getSchema()) { + txt = this.quote(table.getSchema()!); + txt += '.'; + } + txt += this.quote(table.getName()); + if (table.alias) { + txt += ' ' + this.quote(table.alias); + } + return [txt]; + } + public visitCascade(cascadeNode: CascadeNode): string[] { + return ['CASCADE CONSTRAINTS']; + } + public visitRestrict(restrictNode: RestrictNode): string[] { + throw new Error('Oracle do not support RESTRICT in DROP TABLE'); + } + public visitDrop(dropNode: DropNode): string[] { + if (!isDropIfExists(dropNode)) { + return super.visitDrop(dropNode); + } + // Implement our own drop if exists: + // PostgreSQL: DROP TABLE IF EXISTS "group" + // Oracle: + // BEGIN + // EXECUTE IMMEDIATE 'DROP TABLE POST'; + // EXCEPTION + // WHEN OTHERS THEN + // IF SQLCODE != -942 THEN + // RAISE; + // END IF; + // END; + const table = this.queryNode!.table; + const tableResult = this.visit(table.toNode()); + const dropResult = ['DROP TABLE']; + dropResult.push(...tableResult); + return [ + "BEGIN EXECUTE IMMEDIATE '" + dropResult.join(' ') + "'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;" + ]; + } + public visitCreate(createNode: CreateNode): string[] { + const isNotExists = isCreateIfNotExists(createNode); + // const isTemporary=isCreateTemporary(create) + let createText = super.visitCreate(createNode); + if (isNotExists) { + // Implement our own create if not exists: + // PostgreSQL: CREATE TABLE IF NOT EXISTS "group" ("id" constchar(100)) + // Oracle: + // BEGIN + // EXECUTE IMMEDIATE 'CREATE TABLE ...'; + // EXCEPTION + // WHEN OTHERS THEN + // IF SQLCODE != -955 THEN + // RAISE; + // END IF; + // END; + createText = [ + "BEGIN EXECUTE IMMEDIATE '" + + createText.join(' ').replace(' IF NOT EXISTS', '') + + "'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -955 THEN RAISE; END IF; END;" + ]; + } + return createText; + } + public visitBinary(binaryNode: BinaryNode): string[] { + if (binaryNode.operator === '@@') { + let text = '(INSTR (' + this.visit(binaryNode.left) + ', '; + text += this.visit(binaryNode.right); + text += ') > 0)'; + return [text]; + } + if (!isRightSideArray(binaryNode)) { + return super.visitBinary(binaryNode); + } + if (binaryNode.operator === 'IN' || binaryNode.operator === 'NOT IN') { + return super.visitBinary(binaryNode); + } + throw new Error('Oracle does not support arrays in this type of expression.'); + } + public visitModifier(modifierNode: ModifierNode): string[] { + const ret = super.visitModifier(modifierNode); + if (ret.indexOf('OFFSET') >= 0) { + ret.push('ROWS'); + } + if (ret.indexOf('LIMIT') >= 0) { + ret[0] = 'FETCH NEXT'; + ret.push('ROWS ONLY'); + } + return ret; + } + public visitQueryHelper(actions: Node[], targets: Node[], filters: Node[]): string[] { + const output = super.visitQueryHelper(actions, targets, filters); + // In Oracle, OFFSET must come before FETCH NEXT (limit) + // Change positions, if both are present and not done already + const offset = output.indexOf('OFFSET'); + const limit = output.indexOf('FETCH NEXT'); + if (offset !== -1 && limit !== -1 && offset > limit) { + const temp = [output[offset], output[offset + 1], output[offset + 2]]; + output[offset] = output[limit]; + output[offset + 1] = output[limit + 1]; + output[offset + 2] = output[limit + 2]; + output[limit] = temp[0]; + output[limit + 1] = temp[1]; + output[limit + 2] = temp[2]; + } + return this.output; + } + public visitColumn(columnNode: ColumnNode): string[] { + const table = columnNode.table; + const inSelectClause = !this.selectOrDeleteEndIndex; + const arrayAgg = () => { + throw new Error('Oracle does not support array_agg.'); + }; + const countStar = () => { + // Implement our own since count(table.*) is invalid in Oracle + let result = 'COUNT(*)'; + if (inSelectClause && columnNode.alias) { + result += this.aliasText + this.quote(columnNode.alias); + } + return [result]; + }; + if (isCountStarExpression(columnNode)) { + return countStar(); + } + if (inSelectClause && table && !table.alias && columnNode.asArray) { + return arrayAgg(); + } + return super.visitColumn(columnNode); + } + public visitReturning(returningNode: ReturningNode): string[] { + // TODO: need to add some code to the INSERT clause to support this since its the equivalent of the OUTPUT clause + // in MS SQL which appears before the values, not at the end of the statement. + throw new Error('Returning clause is not yet supported for Oracle.'); + } + public visitIndexes(indexesNode: IndexesNode): string[] { + const tableName = this.queryNode!.table.getName(); + const schemaName = this.queryNode!.table.getSchema(); + let indexes = "SELECT * FROM USER_INDEXES WHERE TABLE_NAME = '" + tableName + "'"; + if (schemaName) { + indexes += " AND TABLE_OWNER = '" + schemaName + "'"; + } + return [indexes]; + } + public visitDropIndex(dropIndexNode: DropIndexNode): string[] { + const result = ['DROP INDEX']; + const schemaName = dropIndexNode.table.getSchema(); + if (schemaName) { + result.push(this.quote(schemaName) + '.'); + } + result.push(this.quote(dropIndexNode.options.indexName)); + return result; + } + // Need to implement a special version of CASE since Oracle doesn't support + // CASE WHEN true THEN xxx END + // the "true" has to be a boolean expression like 1=1 + public visitCase(caseNode: CaseNode): string[] { + const whenValue = (node: Node) => { + if (node.type !== 'PARAMETER') { + return this.visit(node); + } + // dealing with a true/false value + const val = (node as ParameterNode).value(); + if (val === true) { + return '1=1'; + } else { + return '0=1'; + } + }; + assert(caseNode.whenList.length === caseNode.thenList.length); + let text = '(CASE'; + this.visitingCase = true; + for (let i = 0; i < caseNode.whenList.length; i++) { + text += ` WHEN ${whenValue(caseNode.whenList[i])} THEN ${this.visit(caseNode.thenList[i])}`; + } + if (caseNode.else != null) { + text += ` ELSE ${this.visit(caseNode.else)}`; + } + this.visitingCase = false; + text += ' END)'; + return [text]; + } + public visitOnConflict(onConflictNode: OnConflictNode): string[] { + throw new Error('Oracle does not allow onConflict clause.'); + } +} + +function isCreateIfNotExists(createNode: CreateNode) { + if (createNode.nodes.length === 0) { + return false; + } + if (createNode.nodes[0].type !== 'IF NOT EXISTS') { + return false; + } + return true; +} + +function isCreateTemporary(createNode: CreateNode) { + return createNode.options.isTemporary; +} + +function isDropIfExists(dropNode: DropNode) { + if (dropNode.nodes.length === 0) { + return false; + } + if (dropNode.nodes[0].type !== 'IF EXISTS') { + return false; + } + return true; +} + +// SQL Server does not support array expressions except in the IN clause. +function isRightSideArray(binaryNode: BinaryNode) { + return Array.isArray(binaryNode.right); +} + +function isCountStarExpression(columnNode: ColumnNode) { + if (!columnNode.aggregator) { + return false; + } + if (columnNode.aggregator.toLowerCase() !== 'count') { + return false; + } + if (!columnNode.star) { + return false; + } + return true; +} + +function isAlterAddColumn(alterNode: AlterNode) { + if (alterNode.nodes.length === 0) { + return false; + } + if (alterNode.nodes[0].type !== 'ADD COLUMN') { + return false; + } + return true; +} + +function isAlterDropColumn(alterNode: AlterNode) { + if (alterNode.nodes.length === 0) { + return false; + } + if (alterNode.nodes[0].type !== 'DROP COLUMN') { + return false; + } + return true; +} diff --git a/lib/dialect/postgres.js b/lib/dialect/postgres.js deleted file mode 100644 index 2816c901..00000000 --- a/lib/dialect/postgres.js +++ /dev/null @@ -1,1224 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var assert = require('assert'); -var From = require('../node/from'); -var Select = require('../node/select'); -var Table = require('../table'); - -var Postgres = function(config) { - this.output = []; - this.params = []; - this.config = config || {}; -}; - -Postgres.prototype._myClass = Postgres; - -Postgres.prototype._arrayAggFunctionName = 'array_agg'; - -Postgres.prototype._getParameterText = function(index, value) { - if (this._disableParameterPlaceholders) { - // do not use placeholder - return this._getParameterValue(value); - } else { - // use placeholder - return this._getParameterPlaceholder(index, value); - } -}; - -Postgres.prototype._getParameterValue = function(value, quoteChar) { - // handle primitives - if (null === value) { - value = 'NULL'; - } else if ('boolean' === typeof value) { - value = value ? 'TRUE' : 'FALSE'; - } else if ('number' === typeof value) { - // number is just number - value = value; - } else if ('string' === typeof value) { - // string uses single quote by default - value = this.quote(value, quoteChar || "'"); - } else if ('object' === typeof value) { - if (Array.isArray(value)) { - if (this._myClass === Postgres) { - // naive check to see if this is an array of objects, which - // is handled differently than an array of primitives - if (value.length && 'object' === typeof value[0] && - !_.isFunction(value[0].toISOString) && - !Array.isArray(value[0])) { - value = "'" + JSON.stringify(value) + "'"; - } else { - var self = this; - value = value.map(function (item) { - // In a Postgres array, strings must be double-quoted - return self._getParameterValue(item, '"'); - }); - value = '\'{' + value.join(',') + '}\''; - } - } else { - value = _.map(value, this._getParameterValue.bind(this)); - value = '(' + value.join(', ') + ')'; - } - } else if (value instanceof Date) { - // Date object's default toString format does not get parsed well - // Handle dates using toISOString - value = this._getParameterValue(value.toISOString()); - } else if (Buffer.isBuffer(value)) { - value = this._getParameterValue('\\x' + value.toString('hex')); - } else { - // rich object represent with string - var strValue = value.toString(); - value = strValue === '[object Object]' ? this._getParameterValue(JSON.stringify(value)) : this._getParameterValue(strValue); - } - } else { - throw new Error('Unable to use ' + value + ' in query'); - } - - // value has been converted at this point - return value; -}; - -Postgres.prototype._getParameterPlaceholder = function(index, value) { - /* jshint unused: false */ - return '$' + index; -}; - -Postgres.prototype.getQuery = function(queryNode) { - // passed in a table, not a query - if (queryNode instanceof Table) { - queryNode = queryNode.select(queryNode.star()); - } - this.output = this.visit(queryNode); - - //if is a create view, must replace paramaters with values - if (this.output.indexOf('CREATE VIEW') > -1) { - var previousFlagStatus = this._disableParameterPlaceholders; - this._disableParameterPlaceholders = true; - this.output = []; - this.output = this.visit(queryNode); - this.params = []; - this._disableParameterPlaceholders = previousFlagStatus; - } - - // create the query object - var query = { text: this.output.join(' '), values: this.params }; - - // reset the internal state of this builder - this.output = []; - this.params = []; - - return query; -}; - -Postgres.prototype.getString = function(queryNode) { - // switch off parameter placeholders - var previousFlagStatus = this._disableParameterPlaceholders; - this._disableParameterPlaceholders = true; - var query; - try { - // use the same code path for query building - query = this.getQuery(queryNode); - } finally { - // always restore the flag afterwards - this._disableParameterPlaceholders = previousFlagStatus; - } - return query.text; -}; - -Postgres.prototype.visit = function(node) { - switch(node.type) { - case 'QUERY' : return this.visitQuery(node); - case 'SUBQUERY' : return this.visitSubquery(node); - case 'SELECT' : return this.visitSelect(node); - case 'INSERT' : return this.visitInsert(node); - case 'REPLACE' : return this.visitReplace(node); - case 'UPDATE' : return this.visitUpdate(node); - case 'DELETE' : return this.visitDelete(node); - case 'CREATE' : return this.visitCreate(node); - case 'DROP' : return this.visitDrop(node); - case 'TRUNCATE' : return this.visitTruncate(node); - case 'DISTINCT' : return this.visitDistinct(node); - case 'DISTINCT ON' : return this.visitDistinctOn(node); - case 'ALIAS' : return this.visitAlias(node); - case 'ALTER' : return this.visitAlter(node); - case 'CAST' : return this.visitCast(node); - case 'FROM' : return this.visitFrom(node); - case 'WHERE' : return this.visitWhere(node); - case 'ORDER BY' : return this.visitOrderBy(node); - case 'ORDER BY VALUE' : return this.visitOrderByValue(node); - case 'GROUP BY' : return this.visitGroupBy(node); - case 'HAVING' : return this.visitHaving(node); - case 'RETURNING' : return this.visitReturning(node); - case 'ONDUPLICATE' : return this.visitOnDuplicate(node); - case 'ONCONFLICT' : return this.visitOnConflict(node); - case 'FOR UPDATE' : return this.visitForUpdate(); - case 'FOR SHARE' : return this.visitForShare(); - case 'TABLE' : return this.visitTable(node); - case 'COLUMN' : return this.visitColumn(node); - case 'FOREIGN KEY' : return this.visitForeignKey(node); - case 'JOIN' : return this.visitJoin(node); - case 'LITERAL' : return this.visitLiteral(node); - case 'TEXT' : return node.text; - case 'PARAMETER' : return this.visitParameter(node); - case 'DEFAULT' : return this.visitDefault(node); - case 'IF EXISTS' : return this.visitIfExists(); - case 'IF NOT EXISTS' : return this.visitIfNotExists(); - case 'OR IGNORE' : return this.visitOrIgnore(); - case 'CASCADE' : return this.visitCascade(); - case 'RESTRICT' : return this.visitRestrict(); - case 'RENAME' : return this.visitRename(node); - case 'ADD COLUMN' : return this.visitAddColumn(node); - case 'DROP COLUMN' : return this.visitDropColumn(node); - case 'RENAME COLUMN' : return this.visitRenameColumn(node); - case 'INDEXES' : return this.visitIndexes(node); - case 'CREATE INDEX' : return this.visitCreateIndex(node); - case 'DROP INDEX' : return this.visitDropIndex(node); - case 'FUNCTION CALL' : return this.visitFunctionCall(node); - case 'ARRAY CALL' : return this.visitArrayCall(node); - case 'CREATE VIEW' : return this.visitCreateView(node); - case 'INTERVAL' : return this.visitInterval(node); - - case 'POSTFIX UNARY' : return this.visitPostfixUnary(node); - case 'PREFIX UNARY' : return this.visitPrefixUnary(node); - case 'BINARY' : return this.visitBinary(node); - case 'TERNARY' : return this.visitTernary(node); - case 'IN' : return this.visitIn(node); - case 'NOT IN' : return this.visitNotIn(node); - case 'CASE' : return this.visitCase(node); - case 'AT' : return this.visitAt(node); - case 'SLICE' : return this.visitSlice(node); - - case 'LIMIT' : - case 'OFFSET': - return this.visitModifier(node); - default: - throw new Error("Unrecognized node type " + node.type); - } -}; - -Postgres.prototype._quoteCharacter = '"'; -Postgres.prototype._aliasText = ' AS '; - -Postgres.prototype.quote = function(word, quoteCharacter) { - var q; - if (quoteCharacter) { - // use the specified quote character if given - q = quoteCharacter; - } else { - q = this._quoteCharacter; - } - // handle square brackets specially - if (q=='['){ - return '['+word+']'; - } else { - return q + word.replace(new RegExp(q,'g'),q+q) + q; - } -}; - -Postgres.prototype.visitSelect = function(select) { - var result = ['SELECT']; - - if (select.isDistinct) result.push('DISTINCT'); - - var distinctOnNode = select.nodes.filter(function (node) {return node.type === 'DISTINCT ON';}).shift(); - var nonDistinctOnNodes = select.nodes.filter(function (node) {return node.type !== 'DISTINCT ON';}); - - if (distinctOnNode) { - result.push(this.visit(distinctOnNode)); - } - - result.push(nonDistinctOnNodes.map(this.visit.bind(this)).join(', ')); - - this._selectOrDeleteEndIndex = this.output.length + result.length; - - return result; -}; - -Postgres.prototype.visitInsert = function(insert) { - var self = this; - // don't use table.column for inserts - this._visitedInsert = true; - - var result = ['INSERT']; - result = result.concat(insert.nodes.map(this.visit.bind(this))); - result.push('INTO ' + this.visit(this._queryNode.table.toNode())); - result.push('(' + insert.columns.map(this.visit.bind(this)).join(', ') + ')'); - - var paramNodes = insert.getParameters(); - - if (paramNodes.length > 0) { - var paramText = paramNodes.map(function (paramSet) { - return paramSet.map(function (param) { - return self.visit(param); - }).join(', '); - }).map(function (param) { - return '('+param+')'; - }).join(', '); - - result.push('VALUES', paramText); - - if (result.slice(2, 5).join(' ') === '() VALUES ()') { - result.splice(2, 3, 'DEFAULT VALUES'); - } - } - - this._visitedInsert = false; - - return result; -}; - -Postgres.prototype.visitReplace = function(replace) { - throw new Error('Postgres does not support REPLACE.'); -}; - -Postgres.prototype.visitUpdate = function(update) { - // don't auto-generate from clause - var params = []; - /* jshint boss: true */ - for(var i = 0, node; node = update.nodes[i]; i++) { - this._visitingUpdateTargetColumn = true; - var target_col = this.visit(node); - this._visitingUpdateTargetColumn = false; - params = params.concat(target_col + ' = ' + this.visit(node.value)); - } - var result = [ - 'UPDATE', - this.visit(this._queryNode.table.toNode()), - 'SET', - params.join(', ') - ]; - return result; -}; - -Postgres.prototype.visitDelete = function (del) { - var result = ['DELETE']; - if (del.nodes.length) { - result.push(del.nodes.map(this.visit.bind(this)).join(', ')); - } - this._selectOrDeleteEndIndex = result.length; - return result; -}; - -Postgres.prototype.visitCreate = function(create) { - this._visitingCreate = true; - // don't auto-generate from clause - var table = this._queryNode.table; - var col_nodes = table.columns.map(function(col) { return col.toNode(); }); - var foreign_key_nodes = table.foreignKeys; - - var result = ['CREATE TABLE']; - if (create.options.isTemporary) result=['CREATE TEMPORARY TABLE']; - result = result.concat(create.nodes.map(this.visit.bind(this))); - result.push(this.visit(table.toNode())); - var primary_col_nodes = col_nodes.filter(function(n) { - return n.primaryKey; - }); - this._visitCreateCompoundPrimaryKey = primary_col_nodes.length > 1; - var colspec = '(' + col_nodes.map(this.visit.bind(this)).join(', '); - if (this._visitCreateCompoundPrimaryKey) { - colspec += ', PRIMARY KEY ('; - colspec += primary_col_nodes.map(function(node) { - return this.quote(node.name); - }.bind(this)).join(', '); - colspec += ')'; - } - if(foreign_key_nodes.length > 0) { - colspec += ', ' + foreign_key_nodes.map(this.visit.bind(this)).join(', '); - } - colspec += ')'; - result.push(colspec); - this._visitCreateCompoundPrimaryKey = false; - this._visitingCreate = false; - return result; -}; - -Postgres.prototype.visitDrop = function(drop) { - // don't auto-generate from clause - var result = ['DROP TABLE']; - result = result.concat(drop.nodes.map(this.visit.bind(this))); - return result; -}; - -Postgres.prototype.visitTruncate = function(truncate) { - var result = ['TRUNCATE TABLE']; - result = result.concat(truncate.nodes.map(this.visit.bind(this))); - return result; -}; - -Postgres.prototype.visitDistinct = function(truncate) { - // Nothing to do here since it's handled in the SELECT clause - return []; -}; - -Postgres.prototype.visitDistinctOn = function(distinctOn) { - return ['DISTINCT ON('+distinctOn.nodes.map(this.visit.bind(this)).join(', ')+')']; -}; - -Postgres.prototype.visitAlias = function(alias) { - var result = [this.visit(alias.value) + this._aliasText + this.quote(alias.alias)]; - return result; -}; - -Postgres.prototype.visitAlter = function(alter) { - this._visitingAlter = true; - // don't auto-generate from clause - var table = this._queryNode.table; - var result = [ - 'ALTER TABLE', - this.visit(table.toNode()), - alter.nodes.map(this.visit.bind(this)).join(', ') - ]; - this._visitingAlter = false; - return result; -}; - -Postgres.prototype.visitCast = function(cast) { - this._visitingCast = true; - var result = ['CAST(' + this.visit(cast.value) + ' AS ' + cast.dataType + ')']; - this._visitingCast = false; - return result; -}; - -Postgres.prototype.visitFrom = function(from) { - var result = []; - if (from.skipFromStatement) { - result.push(','); - } else { - result.push('FROM'); - } - for(var i = 0; i < from.nodes.length; i++) { - result = result.concat(this.visit(from.nodes[i])); - } - return result; -}; - -Postgres.prototype.visitWhere = function(where) { - this._visitingWhere = true; - var result = ['WHERE', where.nodes.map(this.visit.bind(this)).join(', ')]; - this._visitingWhere = false; - return result; -}; - -Postgres.prototype.visitOrderBy = function(orderBy) { - var result = ['ORDER BY', orderBy.nodes.map(this.visit.bind(this)).join(', ')]; - if (this._myClass === Postgres && this.config.nullOrder) { - result.push('NULLS ' + this.config.nullOrder.toUpperCase()); - } - return result; -}; - -Postgres.prototype.visitOrderByValue = function(orderByValue) { - var text = this.visit(orderByValue.value); - if (orderByValue.direction) { - text += ' ' + this.visit(orderByValue.direction); - } - return [text]; -}; - -Postgres.prototype.visitGroupBy = function(groupBy) { - var result = ['GROUP BY', groupBy.nodes.map(this.visit.bind(this)).join(', ')]; - return result; -}; - -Postgres.prototype.visitHaving = function(having) { - var result = ['HAVING', having.nodes.map(this.visit.bind(this)).join(' AND ')]; - return result; -}; - -Postgres.prototype.visitPrefixUnary = function(unary) { - var text = '(' + unary.operator + ' ' + this.visit(unary.left) + ')'; - return [text]; -}; - -Postgres.prototype.visitPostfixUnary = function(unary) { - var text = '(' + this.visit(unary.left) + ' ' + unary.operator + ')'; - return [text]; -}; - -Postgres.prototype.visitBinary = function(binary) { - var self = this; - - binary.left.property = binary.left.name; - binary.right.property = binary.right.name; - - var text = '(' + this.visit(binary.left) + ' ' + binary.operator + ' '; - if (Array.isArray(binary.right)) { - text += '(' + binary.right.map(function (node) { - return self.visit(node); - }).join(', ') + ')'; - } - else { - text += this.visit(binary.right); - } - text += ')'; - return [text]; -}; - -Postgres.prototype.visitTernary = function(ternary) { - var self = this; - var text = '(' + this.visit(ternary.left) + ' ' + ternary.operator + ' '; - - var visitPart = function(value) { - var text = ''; - if (Array.isArray(value)) { - text += '(' + value.map(function (node) { - return self.visit(node); - }).join(', ') + ')'; - } - else { - text += self.visit(value); - } - return text; - }; - - text += visitPart(ternary.middle); - text += ' ' + ternary.separator + ' '; - text += visitPart(ternary.right); - - text += ')'; - return [text]; -}; - -Postgres.prototype.visitIn = function(binary) { - var self = this; - var text = '('; - - if (Array.isArray(binary.right)) { - if (binary.right.length) { - var params = []; - var hasNull = false; - - binary.right.forEach(function(node) { - if (node.type === 'PARAMETER' && node._val === null) { - hasNull = true; - } else { - params.push(self.visit(node)); - } - }); - - if (params.length) { - text += this.visit(binary.left) + ' IN (' + params.join(', ') + ')'; - - if (hasNull) { - text += ' OR ' + this.visit(binary.left) + ' IS NULL'; - } - } else { // implicitely has null - text += this.visit(binary.left) + ' IS NULL'; - } - } else { - text += '1=0'; - } - } else { - text += this.visit(binary.left) + ' IN ' + this.visit(binary.right); - } - - text += ')'; - return [text]; -}; - -Postgres.prototype.visitNotIn = function(binary) { - var self = this; - var text = '('; - - if (Array.isArray(binary.right)) { - if (binary.right.length) { - var params = []; - var hasNull = false; - - binary.right.forEach(function(node) { - if (node.type === 'PARAMETER' && node._val === null) { - hasNull = true; - } else { - params.push(self.visit(node)); - } - }); - - if (params.length && hasNull) { - text += 'NOT ('; - text += this.visit(binary.left) + ' IN (' + params.join(', ') + ')'; - text += ' OR ' + this.visit(binary.left) + ' IS NULL'; - text += ')'; - } else if (params.length) { - text += this.visit(binary.left) + ' NOT IN (' + params.join(', ') + ')'; - } else { // implicitely has null - text += this.visit(binary.left) + ' IS NOT NULL'; - } - } else { - text += '1=1'; - } - } else { - text += this.visit(binary.left) + ' NOT IN ' + this.visit(binary.right); - } - - text += ')'; - return [text]; -}; - -Postgres.prototype.visitCase = function(caseExp) { - assert(caseExp.whenList.length == caseExp.thenList.length); - - var self = this; - var text = '(CASE'; - - this.visitingCase = true; - - for (var i = 0; i < caseExp.whenList.length; i++) { - var whenExp = ' WHEN ' + this.visit(caseExp.whenList[i]); - var thenExp = ' THEN ' + this.visit(caseExp.thenList[i]); - text += whenExp + thenExp; - } - - if (null !== caseExp.else && undefined !== caseExp.else) { - text += ' ELSE ' + this.visit(caseExp.else); - } - - this.visitingCase = false; - - text += ' END)'; - return [text]; -}; - -Postgres.prototype.visitAt = function(at) { - var text = '(' + this.visit(at.value) + ')[' + this.visit(at.index) + ']'; - return [text]; -}; - -Postgres.prototype.visitSlice = function(slice) { - var text = '(' + this.visit(slice.value) + ')'; - text += '[' + this.visit(slice.start) + ':' + this.visit(slice.end) + ']'; - return [text]; -}; - -Postgres.prototype.visitContains = function(contains) { - var text = this.visit(contains.value); - text += ' @> ' + this.visit(contains.set); - return [text]; -}; - -Postgres.prototype.visitContainedBy = function(containedBy) { - var text = this.visit(containedBy.value); - text += ' <@ ' + this.visit(containedBy.set); - return [text]; -}; - -Postgres.prototype.visitOverlap = function(overlap) { - var text = this.visit(overlap.value); - text += ' && ' + this.visit(overlap.set); - return [text]; -}; - -Postgres.prototype.visitQuery = function(queryNode) { - if (this._queryNode) return this.visitSubquery(queryNode,dontParenthesizeSubQuery(this._queryNode)); - this._queryNode = queryNode; - // need to sort the top level query nodes on visitation priority - // so select/insert/update/delete comes before from comes before where - var missingFrom = true; - var hasFrom = false; - var createView; - var isSelect = false; - var actions = []; - var targets = []; - var filters = []; - for(var i = 0; i < queryNode.nodes.length; i++) { - var node = queryNode.nodes[i]; - switch(node.type) { - case "SELECT": - isSelect = true; // jshint ignore:line - case "DELETE": - actions.push(node); - break; - case "INDEXES": - case "INSERT": - case "REPLACE": - case "UPDATE": - case "CREATE": - case "DROP": - case "TRUNCATE": - case "ALTER": - actions.push(node); - missingFrom = false; - break; - case "FROM": - node.skipFromStatement = hasFrom; - hasFrom = true; - missingFrom = false; - targets.push(node); - break; - case "CREATE VIEW": - createView = node; - break; - default: - filters.push(node); - break; - } - } - if(!actions.length) { - // if no actions are given, guess it's a select - actions.push(new Select().add('*')); - isSelect = true; - } - if(missingFrom && queryNode.table instanceof Table) { - // the instanceof handles the situation where a sql.select(some expression) is used and there should be no FROM clause - targets.push(new From().add(queryNode.table)); - } - if (createView) { - if (isSelect) { - actions.unshift(createView); - } else { - throw new Error('Create View requires a Select.'); - } - } - return this.visitQueryHelper(actions,targets,filters); -}; - -/** - * We separate out this part of query building so it can be overridden by other implementations. - * - * @param {Node[]} actions - * @param {Node[]} targets - * @param {Node[]} filters - * @returns {String[]} - */ -Postgres.prototype.visitQueryHelper=function(actions,targets,filters){ - this.handleDistinct(actions, filters); - // lazy-man sorting - var sortedNodes = actions.concat(targets).concat(filters); - for(var i = 0; i < sortedNodes.length; i++) { - var res = this.visit(sortedNodes[i]); - this.output = this.output.concat(res); - } - // implicit 'from' - return this.output; -}; - -Postgres.prototype.visitSubquery = function(queryNode,dontParenthesize) { - // create another query builder of the current class to build the subquery - var subQuery = new this._myClass(this.config); - - // let the subquery modify this instance's params array - subQuery.params = this.params; - - // pass on the disable parameter placeholder flag - var previousFlagStatus = subQuery._disableParameterPlaceholders; - subQuery._disableParameterPlaceholders = this._disableParameterPlaceholders; - try { - subQuery.visitQuery(queryNode); - } finally { - // restore the flag - subQuery._disableParameterPlaceholders = previousFlagStatus; - } - - var alias = queryNode.alias; - if (dontParenthesize) { - return [subQuery.output.join(' ') + (alias ? ' ' + this.quote(alias) : '')]; - } - return ['(' + subQuery.output.join(' ') + ')' + (alias ? ' ' + this.quote(alias) : '')]; -}; - -Postgres.prototype.visitTable = function(tableNode) { - var table = tableNode.table; - var txt=""; - if(table.getSchema()) { - txt = this.quote(table.getSchema()); - txt += '.'; - } - txt += this.quote(table.getName()); - if(typeof table.alias === 'string') { - txt += this._aliasText + this.quote(table.alias); - } - return [txt]; -}; - -Postgres.prototype.visitColumn = function(columnNode) { - var table = columnNode.table; - var inInsertUpdateClause = this._visitedInsert || this._visitedReplace || this._visitingUpdateTargetColumn; - var inDdlClause = this._visitingAddColumn || this._visitingAlter || this._visitingCreate; - var inSelectClause = - this.visitingReturning || - (!this._selectOrDeleteEndIndex - && !this._visitingWhere // jshint ignore:line - && !inInsertUpdateClause // jshint ignore:line - && !inDdlClause // jshint ignore:line - && !this.visitingCase // jshint ignore:line - && !this._visitingJoin // jshint ignore:line - ); - var inFunctionCall = this._visitingFunctionCall; - var inCast = this._visitingCast; - var txt = []; - var closeParen = 0; - if(inSelectClause && (table && !table.alias || !!columnNode.alias)) { - if (columnNode.asArray) { - closeParen++; - txt.push(this._arrayAggFunctionName+'('); - } - - if (!!columnNode.aggregator) { - closeParen++; - txt.push(columnNode.aggregator + '('); - } - - if (columnNode.distinct === true) { - closeParen++; - txt.push('DISTINCT('); - } - } - if(!inInsertUpdateClause && !this.visitingReturning && !this._visitingCreate && !this._visitingAlter && !columnNode.subfieldContainer) { - if (table) { - if (typeof table.alias === 'string') { - txt.push(this.quote(table.alias)); - } else { - if (table.getSchema()) { - txt.push(this.quote(table.getSchema())); - txt.push('.'); - } - txt.push(this.quote(table.getName())); - } - txt.push('.'); - } - } - if (columnNode.star) { - var allCols = []; - var hasAliases = false; - if(columnNode.aggregator !== 'COUNT') { - var tableName = txt.join(''); - for (var i = 0; i < table.columns.length; ++i) { - var col = table.columns[i]; - var aliased = col.name !== (col.alias || col.property); - hasAliases = hasAliases || aliased; - allCols.push(tableName + this.quote(col.name) + (aliased ? this._aliasText + this.quote(col.alias || col.property) : '')); - } - } - if(hasAliases) { - txt = [allCols.join(', ')]; - } - else { - txt.push('*'); - } - } - else if (columnNode.isConstant) { - // this injects directly into SELECT statement rather than creating a parameter - // txt.push(this._getParameterValue(columnNode.literalValue)) - // currently thinking it is better to generate a parameter - var value = columnNode.constantValue; - this.params.push(value); - txt.push(this._getParameterText(this.params.length, value)); - } - else { - if (columnNode.subfieldContainer) { - txt.push('(' + this.visitColumn(columnNode.subfieldContainer) + ').'); - } - txt.push(this.quote(columnNode.name)); - } - if(closeParen) { - for(var j = 0; j < closeParen; j++) { - txt.push(')'); - } - } - if(inSelectClause && !inFunctionCall && !inCast && (columnNode.alias || columnNode.property !== columnNode.name)) { - txt.push(this._aliasText + this.quote(columnNode.alias || columnNode.property)); - } - if(this._visitingCreate || this._visitingAddColumn) { - assert(columnNode.dataType, 'dataType missing for column ' + columnNode.name + - ' (CREATE TABLE and ADD COLUMN statements require a dataType)'); - txt.push(' ' + columnNode.dataType); - - if (this._visitingCreate) { - if (columnNode.primaryKey && !this._visitCreateCompoundPrimaryKey) { - // creating a column as a primary key - txt.push(' PRIMARY KEY'); - } else if (columnNode.notNull) { - txt.push(' NOT NULL'); - } - if (!columnNode.primaryKey && columnNode.unique) { - txt.push(' UNIQUE'); - } - if (columnNode.defaultValue !== undefined) { - txt.push(' DEFAULT ' + this._getParameterValue(columnNode.defaultValue)); - } - } - - if (!!columnNode.references) { - assert.equal(typeof (columnNode.references), 'object', - 'references is not a object for column ' + columnNode.name + - ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + - ' require refrences to be expressed as an object)'); - - //Empty refrence objects are ok - if (Object.keys(columnNode.references).length > 0){ - assert(columnNode.references.table, 'reference.table missing for column ' + - columnNode.name + - ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + - ' require a table and column)'); - assert(columnNode.references.column, 'reference.column missing for column ' + - columnNode.name + - ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + - ' require a table and column)'); - txt.push(' REFERENCES '); - if(columnNode.references.schema) { - txt.push(this.quote(columnNode.references.schema) + '.'); - } - txt.push(this.quote(columnNode.references.table) + '(' + - this.quote(columnNode.references.column) + ')'); - - var onDelete = columnNode.references.onDelete; - if (onDelete) onDelete = onDelete.toUpperCase(); - if (onDelete === 'CASCADE' || onDelete === 'RESTRICT' || onDelete === 'SET NULL' || onDelete === 'SET DEFAULT' || onDelete === 'NO ACTION') { - txt.push(' ON DELETE ' + onDelete); - } - var onUpdate = columnNode.references.onUpdate; - if (onUpdate) onUpdate = onUpdate.toUpperCase(); - if (onUpdate === 'CASCADE' || onUpdate === 'RESTRICT' || onUpdate === 'SET NULL' || onUpdate === 'SET DEFAULT' || onUpdate === 'NO ACTION') { - txt.push(' ON UPDATE ' + onUpdate); - } - var constraint = columnNode.references.constraint; - if (constraint) { - constraint = ' ' + constraint.toUpperCase(); - txt.push(constraint); - } - } - } - } - return [txt.join('')]; -}; - -Postgres.prototype.visitForeignKey = function(foreignKeyNode) -{ - var txt = []; - if(this._visitingCreate) { - assert(foreignKeyNode.table, 'Foreign table missing for table reference'); - assert(foreignKeyNode.columns, 'Columns missing for table reference'); - if(foreignKeyNode.refColumns !== undefined) { - assert.equal(foreignKeyNode.columns.length, foreignKeyNode.refColumns.length, 'Number of local columns and foreign columns differ in table reference'); - } - if(foreignKeyNode.name !== undefined) { - txt.push('CONSTRAINT ' + this.quote(foreignKeyNode.name) + ' '); - } - txt.push('FOREIGN KEY ( '); - for(var i = 0; i < foreignKeyNode.columns.length; i++) { - if(i>0) { - txt.push(', '); - } - txt.push(this.quote(foreignKeyNode.columns[i])); - } - txt.push(' ) REFERENCES '); - if(foreignKeyNode.schema !== undefined) { - txt.push(this.quote(foreignKeyNode.schema) + '.'); - } - txt.push(this.quote(foreignKeyNode.table)); - if(foreignKeyNode.refColumns !== undefined) { - txt.push(' ( '); - for(i = 0; i < foreignKeyNode.refColumns.length; i++) { - if(i>0) { - txt.push(', '); - } - txt.push(this.quote(foreignKeyNode.refColumns[i])); - } - txt.push(' )'); - } - var onDelete = foreignKeyNode.onDelete; - if(onDelete) { - onDelete = onDelete.toUpperCase(); - if(onDelete === 'CASCADE' || onDelete === 'RESTRICT' || onDelete === 'SET NULL' || onDelete === 'SET DEFAULT' || onDelete === 'NO ACTION') { - txt.push(' ON DELETE ' + onDelete); - } - } - var onUpdate = foreignKeyNode.onUpdate; - if(onUpdate) { - onUpdate = onUpdate.toUpperCase(); - if(onUpdate === 'CASCADE' || onUpdate === 'RESTRICT' || onUpdate === 'SET NULL' || onUpdate === 'SET DEFAULT' || onUpdate === 'NO ACTION') { - txt.push(' ON UPDATE ' + onUpdate); - } - } - if(foreignKeyNode.constraint) { - txt.push(' ' + foreignKeyNode.constraint.toUpperCase()); - } - } - return [txt.join('')]; -}; - -Postgres.prototype.visitFunctionCall = function(functionCall) { - this._visitingFunctionCall = true; - var _this = this; - - function _extract() { - var nodes = functionCall.nodes.map(_this.visit.bind(_this)); - if (nodes.length != 1) throw new Error('Not enough parameters passed to ' + functionCall.name + ' function'); - var txt = 'EXTRACT(' + functionCall.name + ' FROM ' + (nodes[0]+'') + ')'; - return txt; - } - - var txt = ""; - // Override date functions since postgres (and others) uses extract - if (['YEAR', 'MONTH', 'DAY', 'HOUR'].indexOf(functionCall.name) >= 0) txt = _extract(); - // Override CURRENT_TIMESTAMP function to remove parens - else if ('CURRENT_TIMESTAMP' == functionCall.name) txt = functionCall.name; - else txt = functionCall.name + '(' + functionCall.nodes.map(this.visit.bind(this)).join(', ') + ')'; - this._visitingFunctionCall = false; - return [txt]; -}; - -Postgres.prototype.visitArrayCall = function(arrayCall) { - var txt = 'ARRAY[' + arrayCall.nodes.map(this.visit.bind(this)).join(', ') + ']'; - return [txt]; -}; - -Postgres.prototype.visitParameter = function(parameter) { - // save the value into the parameters array - var value = parameter.value(); - this.params.push(value); - return parameter.isExplicit ? [] : [this._getParameterText(this.params.length, value)]; -}; - -Postgres.prototype.visitDefault = function(parameter) { - /* jshint unused: false */ - return ['DEFAULT']; -}; - -Postgres.prototype.visitAddColumn = function(addColumn) { - this._visitingAddColumn = true; - var result = ['ADD COLUMN ' + this.visit(addColumn.nodes[0])]; - this._visitingAddColumn = false; - return result; -}; - -Postgres.prototype.visitDropColumn = function(dropColumn) { - return ['DROP COLUMN ' + this.visit(dropColumn.nodes[0])]; -}; - -Postgres.prototype.visitRenameColumn = function(renameColumn) { - return ['RENAME COLUMN ' + this.visit(renameColumn.nodes[0]) + ' TO ' + this.visit(renameColumn.nodes[1])]; -}; - -Postgres.prototype.visitRename = function(rename) { - return ['RENAME TO ' + this.visit(rename.nodes[0])]; -}; - -Postgres.prototype.visitIfExists = function() { - return ['IF EXISTS']; -}; - -Postgres.prototype.visitIfNotExists = function() { - return ['IF NOT EXISTS']; -}; - -Postgres.prototype.visitOrIgnore = function() { - throw new Error('PostgreSQL does not allow orIgnore clause.'); -}; - -Postgres.prototype.visitCascade = function() { - return ['CASCADE']; -}; - -Postgres.prototype.visitRestrict = function() { - return ['RESTRICT']; -}; - -Postgres.prototype.visitForUpdate = function() { - return ['FOR UPDATE']; -}; - -Postgres.prototype.visitForShare = function() { - return ['FOR SHARE']; -}; - -Postgres.prototype.visitJoin = function(join) { - var result = []; - this._visitingJoin = true; - result = result.concat(this.visit(join.from)); - result = result.concat(join.subType + ' JOIN'); - result = result.concat(this.visit(join.to)); - result = result.concat('ON'); - result = result.concat(this.visit(join.on)); - return result; -}; - -Postgres.prototype.visitLiteral = function(node) { - var txt = [node.literal]; - if(node.alias) { - txt.push(this._aliasText + this.quote(node.alias)); - } - return [txt.join('')]; -}; - -Postgres.prototype.visitReturning = function(returning) { - this.visitingReturning = true; - var r = ['RETURNING', returning.nodes.map(this.visit.bind(this)).join(', ')]; - this.visitingReturning = false; - - return r; -}; - -Postgres.prototype.visitOnDuplicate = function(onDuplicate) { - throw new Error('PostgreSQL does not allow onDuplicate clause.'); -}; - -Postgres.prototype.visitOnConflict = function(onConflict) { - var result = ['ON CONFLICT']; - var columns = []; - var updateClause = [], i, col; - var table = this._queryNode.table; - if(onConflict.constraint) - result.push(['ON CONSTRAINT', this.quote(onConflict.constraint)].join(' ')); - else if(onConflict.columns) { - for(i=0; i < onConflict.columns.length; i++) { - columns.push(this.quote(table.getColumn(onConflict.columns[i]).name)); - } - result.push( '(' + columns.join(', ') + ')' ); - } - - if(onConflict.update){ - updateClause.push("DO UPDATE SET"); - var update = onConflict.update; - var setClause = []; - for(i=0; i; + protected myClass: typeof Postgres = Postgres; + protected arrayAggFunctionName: string = 'array_agg'; + protected aliasText: string = ' AS '; + protected quoteCharacter: string = '"'; + protected disableParameterPlaceholders: boolean = false; + protected selectOrDeleteEndIndex: number = 0; + protected visitedInsert: boolean = false; + protected visitingUpdateTargetColumn: boolean = false; + protected visitingCreate: boolean = false; + protected visitCreateCompoundPrimaryKey: boolean = false; + protected visitingAlter: boolean = false; + protected visitingCast: boolean = false; + protected visitingWhere: boolean = false; + protected visitingCase: boolean = false; + protected visitedReplace: boolean = false; + protected visitingAddColumn: boolean = false; + protected visitingReturning: boolean = false; + protected visitingJoin: boolean = false; + protected visitingFunctionCall: boolean = false; + constructor(config: any) { + super(config); + this.output = []; + this.params = []; + } + public _getParameterText(index: number, value: any): string { + if (this.disableParameterPlaceholders) { + // do not use placeholder + return this._getParameterValue(value).toString(); + } else { + // use placeholder + return this._getParameterPlaceholder(index, value); + } + } + public _getParameterValue( + value: null | boolean | number | string | any[] | Date | Buffer | object, + quoteChar?: string + ): string | number { + // handle primitives + if (null === value) { + value = 'NULL'; + } else if ('boolean' === typeof value) { + value = value ? 'TRUE' : 'FALSE'; + } else if ('number' === typeof value) { + // number is just number + value = value; + } else if ('string' === typeof value) { + // string uses single quote by default + value = this.quote(value, quoteChar || "'"); + } else if ('object' === typeof value) { + if (Array.isArray(value)) { + if (this.myClass === Postgres) { + // naive check to see if this is an array of objects, which + // is handled differently than an array of primitives + if (value.length && 'object' === typeof value[0] && !_.isFunction(value[0].toISOString) && !Array.isArray(value[0])) { + value = `'${JSON.stringify(value)}'`; + } else { + // In a Postgres array, strings must be double-quoted + value = value.map((item) => this._getParameterValue(item, '"')); + value = `'{${(value as any[]).join(',')}}'`; + } + } else { + value = _.map(value, this._getParameterValue.bind(this)); + value = `(${(value as any[]).join(', ')})`; + } + } else if (value instanceof Date) { + // Date object's default toString format does not get parsed well + // Handle dates using toISOString + value = this._getParameterValue(value.toISOString()); + } else if (Buffer.isBuffer(value)) { + value = this._getParameterValue('\\x' + value.toString('hex')); + } else { + // rich object represent with string + const strValue = value.toString(); + value = strValue === '[object Object]' ? this._getParameterValue(JSON.stringify(value)) : this._getParameterValue(strValue); + } + } else { + throw new Error(`Unable to use ${value} in query`); + } + // value has been converted at this point + return value; + } + public _getParameterPlaceholder(index: string | number, value: any): string { + return '$' + index; + } + public getQuery(queryNode: Query | Table) { + // passed in a table, not a query + if (queryNode instanceof Table) { + queryNode = queryNode.select(queryNode.star()); + } + this.output = this.visit(queryNode); + // if is a create view, must replace paramaters with values + if (this.output.indexOf('CREATE VIEW') > -1) { + const previousFlagStatus = this.disableParameterPlaceholders; + this.disableParameterPlaceholders = true; + this.output = []; + this.output = this.visit(queryNode); + this.params = []; + this.disableParameterPlaceholders = previousFlagStatus; + } + // create the query object + const query = { text: this.output.join(' '), values: this.params }; + // reset the internal state of this builder + this.output = []; + this.params = []; + return query; + } + public getString(queryNode: Query) { + // switch off parameter placeholders + const previousFlagStatus = this.disableParameterPlaceholders; + this.disableParameterPlaceholders = true; + let query; + try { + // use the same code path for query building + query = this.getQuery(queryNode); + } finally { + // always restore the flag afterwards + this.disableParameterPlaceholders = previousFlagStatus; + } + return query.text; + } + public visit(node: Node): string[] { + switch (node.type) { + case 'QUERY': + return this.visitQuery(node as Query); + case 'SUBQUERY': + return this.visitSubquery(node as Query); + case 'SELECT': + return this.visitSelect(node as SelectNode); + case 'INSERT': + return this.visitInsert(node as InsertNode); + case 'REPLACE': + return this.visitReplace(node as ReplaceNode); + case 'UPDATE': + return this.visitUpdate(node as UpdateNode); + case 'DELETE': + return this.visitDelete(node as DeleteNode); + case 'CREATE': + return this.visitCreate(node as CreateNode); + case 'DROP': + return this.visitDrop(node as DropNode); + case 'TRUNCATE': + return this.visitTruncate(node as TruncateNode); + case 'DISTINCT': + return this.visitDistinct(node as DistinctNode); + case 'DISTINCT ON': + return this.visitDistinctOn(node as DistinctOnNode); + case 'ALIAS': + return this.visitAlias(node as AliasNode); + case 'ALTER': + return this.visitAlter(node as AlterNode); + case 'CAST': + return this.visitCast(node as CastNode); + case 'FROM': + return this.visitFrom(node as FromNode); + case 'WHERE': + return this.visitWhere(node as WhereNode); + case 'ORDER BY': + return this.visitOrderBy(node as OrderByNode); + case 'ORDER BY VALUE': + return this.visitOrderByValue(node as OrderByValueNode); + case 'GROUP BY': + return this.visitGroupBy(node as GroupByNode); + case 'HAVING': + return this.visitHaving(node as HavingNode); + case 'RETURNING': + return this.visitReturning(node as ReturningNode); + case 'ONDUPLICATE': + return this.visitOnDuplicate(node as OnDuplicateNode); + case 'ONCONFLICT': + return this.visitOnConflict(node as OnConflictNode); + case 'FOR UPDATE': + return this.visitForUpdate(node as ForUpdateNode); + case 'FOR SHARE': + return this.visitForShare(node as ForShareNode); + case 'TABLE': + return this.visitTable(node as TableNode); + case 'COLUMN': + return this.visitColumn(node as ColumnNode); + case 'FOREIGN KEY': + return this.visitForeignKey(node as ForeignKeyNode); + case 'JOIN': + return this.visitJoin(node as JoinNode); + case 'LITERAL': + return this.visitLiteral(node as LiteralNode); + case 'TEXT': + return this.visitText(node as TextNode); + case 'PARAMETER': + return this.visitParameter(node as ParameterNode); + case 'DEFAULT': + return this.visitDefault(node as DefaultNode); + case 'IF EXISTS': + return this.visitIfExists(node as IfExistsNode); + case 'IF NOT EXISTS': + return this.visitIfNotExists(node as IfNotExistsNode); + case 'OR IGNORE': + return this.visitOrIgnore(node as OrIgnoreNode); + case 'CASCADE': + return this.visitCascade(node as CascadeNode); + case 'RESTRICT': + return this.visitRestrict(node as RestrictNode); + case 'RENAME': + return this.visitRename(node as RenameNode); + case 'ADD COLUMN': + return this.visitAddColumn(node as AddColumnNode); + case 'DROP COLUMN': + return this.visitDropColumn(node as DropColumnNode); + case 'RENAME COLUMN': + return this.visitRenameColumn(node as RenameColumnNode); + case 'INDEXES': + return this.visitIndexes(node as IndexesNode); + case 'CREATE INDEX': + return this.visitCreateIndex(node as CreateIndexNode); + case 'DROP INDEX': + return this.visitDropIndex(node as DropIndexNode); + case 'FUNCTION CALL': + return this.visitFunctionCall(node as FunctionCallNode); + case 'ARRAY CALL': + return this.visitArrayCall(node as ArrayCallNode); + case 'CREATE VIEW': + return this.visitCreateView(node as CreateViewNode); + case 'INTERVAL': + return this.visitInterval(node as IntervalNode); + case 'POSTFIX UNARY': + return this.visitPostfixUnary(node as PostfixUnaryNode); + case 'PREFIX UNARY': + return this.visitPrefixUnary(node as PrefixUnaryNode); + case 'BINARY': + return this.visitBinary(node as BinaryNode); + case 'TERNARY': + return this.visitTernary(node as TernaryNode); + case 'IN': + return this.visitIn(node as InNode); + case 'NOT IN': + return this.visitNotIn(node as NotInNode); + case 'CASE': + return this.visitCase(node as CaseNode); + case 'AT': + return this.visitAt(node as AtNode); + case 'SLICE': + return this.visitSlice(node as SliceNode); + case 'LIMIT': + case 'OFFSET': + return this.visitModifier(node as ModifierNode); + default: + throw new Error(`Unrecognized node type ${node.type}`); + } + } + public quote(word: string, quoteCharacter?: string) { + const q = quoteCharacter != null ? quoteCharacter : this.quoteCharacter; + // handle square brackets specially + if (q === '[') { + return '[' + word + ']'; + } else { + return q + word.replace(new RegExp(q, 'g'), q + q) + q; + } + } + public visitSelect(selectNode: SelectNode): string[] { + const result = ['SELECT']; + if (selectNode.isDistinct) { + result.push('DISTINCT'); + } + const distinctOnNode = selectNode.nodes.filter((node) => node.type === 'DISTINCT ON').shift(); + const nonDistinctOnNodes = selectNode.nodes.filter((node) => node.type !== 'DISTINCT ON'); + if (distinctOnNode) { + result.push(this.visit(distinctOnNode).join()); + } + result.push(nonDistinctOnNodes.map(this.visit.bind(this)).join(', ')); + this.selectOrDeleteEndIndex = this.output.length + result.length; + return result; + } + public visitInsert(insertNode: InsertNode): string[] { + // don't use table.column for inserts + this.visitedInsert = true; + const result = ['INSERT', ...insertNode.nodes.map((n) => this.visit(n).join())]; + result.push(`INTO ${this.visit(this.queryNode!.table.toNode()).join()}`); + result.push(`(${insertNode.columns.map(this.visit.bind(this)).join(', ')})`); + const paramNodes = insertNode.getParameters(); + if (paramNodes.length > 0) { + const paramText = paramNodes + .map((paramSet) => { + return paramSet.map((param) => this.visit(param)).join(', '); + }) + .map((param) => `(${param})`) + .join(', '); + result.push('VALUES', paramText); + if (result.slice(2, 5).join(' ') === '() VALUES ()') { + result.splice(2, 3, 'DEFAULT VALUES'); + } + } + this.visitedInsert = false; + return result; + } + public visitReplace(replaceNode: ReplaceNode): string[] { + throw new Error('Postgres does not support REPLACE.'); + } + public visitUpdate(updateNode: UpdateNode): string[] { + // don't auto-generate from clause + const params: string[] = []; + /* jshint boss: true */ + for (const node of updateNode.nodes as ColumnNode[]) { + this.visitingUpdateTargetColumn = true; + const targetCol = this.visit(node); + this.visitingUpdateTargetColumn = false; + params.push(`${targetCol} = ${this.visit(node.value)}`); + } + const result = ['UPDATE', this.visit(this.queryNode!.table.toNode()).join(), 'SET', params.join(', ')]; + return result; + } + public visitDelete(deleteNode: DeleteNode): string[] { + const result = ['DELETE']; + if (deleteNode.nodes.length) { + result.push(deleteNode.nodes.map(this.visit.bind(this)).join(', ')); + } + this.selectOrDeleteEndIndex = result.length; + return result; + } + public visitCreate(createNode: CreateNode): string[] { + this.visitingCreate = true; + // don't auto-generate from clause + const table = this.queryNode!.table; + const colNodes = table.columns.map((col) => col.toNode()); + const foreignKeyNodes = table.foreignKeys; + let result = ['CREATE TABLE']; + if (createNode.options.isTemporary) { + result = ['CREATE TEMPORARY TABLE']; + } + result = result.concat(createNode.nodes.map((n) => this.visit(n).join())); + result.push(this.visit(table.toNode()).join()); + const primaryColNodes = colNodes.filter((n) => n.primaryKey); + this.visitCreateCompoundPrimaryKey = primaryColNodes.length > 1; + let colspec = `(${colNodes.map((n) => this.visit(n).join()).join(', ')}`; + if (this.visitCreateCompoundPrimaryKey) { + colspec += `, PRIMARY KEY (${primaryColNodes.map((node) => this.quote(node.name)).join(', ')})`; + } + if (foreignKeyNodes.length > 0) { + colspec += `, ${foreignKeyNodes.map((n) => this.visit(n).join()).join(', ')}`; + } + colspec += ')'; + result.push(colspec); + this.visitCreateCompoundPrimaryKey = false; + this.visitingCreate = false; + return result; + } + public visitDrop(dropNode: DropNode): string[] { + // don't auto-generate from clause + let result = ['DROP TABLE']; + result = result.concat(dropNode.nodes.map((n) => this.visit(n).join())); + return result; + } + public visitTruncate(truncateNode: TruncateNode): string[] { + let result = ['TRUNCATE TABLE']; + result = result.concat(truncateNode.nodes.map((n) => this.visit(n).join())); + return result; + } + public visitDistinct(distinctNode: DistinctNode): string[] { + // Nothing to do here since it's handled in the SELECT clause + return []; + } + public visitDistinctOn(distinctOnNode: DistinctOnNode): string[] { + return [`DISTINCT ON(${distinctOnNode.nodes.map((n) => this.visit(n).join()).join(', ')})`]; + } + public visitAlias(aliasNode: AliasNode): string[] { + const result = [this.visit(aliasNode.value) + this.aliasText + this.quote(aliasNode.alias)]; + return result; + } + public visitAlter(alterNode: AlterNode): string[] { + this.visitingAlter = true; + // don't auto-generate from clause + const table = this.queryNode!.table; + const result: string[] = ['ALTER TABLE', ...this.visit(table.toNode()), alterNode.nodes.map(this.visit.bind(this)).join(', ')]; + this.visitingAlter = false; + return result; + } + public visitCast(castNode: CastNode): string[] { + this.visitingCast = true; + const result: string[] = ['CAST(' + this.visit(castNode.value) + ' AS ' + castNode.dataType + ')']; + this.visitingCast = false; + return result; + } + public visitFrom(fromNode: FromNode): string[] { + let result = []; + if (fromNode.skipFromStatement) { + result.push(','); + } else { + result.push('FROM'); + } + for (const node of fromNode.nodes) { + result = result.concat(this.visit(node)); + } + return result; + } + public visitWhere(whereNode: WhereNode): string[] { + this.visitingWhere = true; + const result = ['WHERE', whereNode.nodes.map(this.visit.bind(this)).join(', ')]; + this.visitingWhere = false; + return result; + } + public visitOrderBy(orderByNode: OrderByNode): string[] { + const result = ['ORDER BY', orderByNode.nodes.map(this.visit.bind(this)).join(', ')]; + if (this.myClass === Postgres && this.config.nullOrder) { + result.push('NULLS ' + this.config.nullOrder.toUpperCase()); + } + return result; + } + public visitOrderByValue(orderByValueNode: OrderByValueNode): string[] { + let text = this.visit(orderByValueNode.value).join(); + if (orderByValueNode.direction) { + text += ' ' + this.visit(orderByValueNode.direction).join(); + } + return [text]; + } + public visitGroupBy(groupByNode: GroupByNode): string[] { + const result = ['GROUP BY', groupByNode.nodes.map(this.visit.bind(this)).join(', ')]; + return result; + } + public visitHaving(havingNode: HavingNode): string[] { + const result = ['HAVING', havingNode.nodes.map(this.visit.bind(this)).join(' AND ')]; + return result; + } + public visitPrefixUnary(prefixUnaryNode: PrefixUnaryNode): string[] { + const text = '(' + prefixUnaryNode.operator + ' ' + this.visit(prefixUnaryNode.left) + ')'; + return [text]; + } + public visitPostfixUnary(postfixUnaryNode: PostfixUnaryNode): string[] { + const text = '(' + this.visit(postfixUnaryNode.left) + ' ' + postfixUnaryNode.operator + ')'; + return [text]; + } + public visitBinary(binaryNode: BinaryNode): string[] { + (binaryNode.left as any).property = (binaryNode.left as any).name; + (binaryNode.right as any).property = (binaryNode.right as any).name; + let text = `(${this.visit(binaryNode.left)} ${binaryNode.operator} `; + if (Array.isArray(binaryNode.right)) { + text += `(${binaryNode.right.map((node) => this.visit(node)).join(', ')})`; + } else { + text += this.visit(binaryNode.right).join(); + } + text += ')'; + return [text]; + } + public visitTernary(ternaryNode: TernaryNode): string[] { + const visitPart = (value: Node) => { + return Array.isArray(value) ? `(${value.map((node) => this.visit(node)).join(', ')})` : this.visit(value).join(); + }; + const text = `(${this.visit(ternaryNode.left)} ${ternaryNode.operator} ${visitPart(ternaryNode.middle)} ${ + ternaryNode.separator + } ${visitPart(ternaryNode.right)})`; + return [text]; + } + public visitIn(inNode: InNode): string[] { + let text = '('; + if (Array.isArray(inNode.right)) { + if (inNode.right.length) { + const params: string[] = []; + let hasNull = false; + inNode.right.forEach((node) => { + if (node.type === 'PARAMETER' && (node as ParameterNode).value() === null) { + hasNull = true; + } else { + params.push(this.visit(node).join()); + } + }); + if (params.length) { + text += `${this.visit(inNode.left)} IN (${params.join(', ')})`; + if (hasNull) { + text += ` OR ${this.visit(inNode.left)} IS NULL`; + } + } else { + // implicitely has null + text += `${this.visit(inNode.left)} IS NULL`; + } + } else { + text += '1=0'; + } + } else { + text += `${this.visit(inNode.left)} IN ${this.visit(inNode.right)}`; + } + text += ')'; + return [text]; + } + public visitNotIn(notInNode: NotInNode): string[] { + let text = '('; + if (Array.isArray(notInNode.right)) { + if (notInNode.right.length) { + const params: string[] = []; + let hasNull = false; + notInNode.right.forEach((node) => { + if (node.type === 'PARAMETER' && (node as ParameterNode).value() === null) { + hasNull = true; + } else { + params.push(this.visit(node).join()); + } + }); + if (params.length && hasNull) { + text += `NOT (${this.visit(notInNode.left)} IN (${params.join(', ')}) OR ${this.visit(notInNode.left)} IS NULL)`; + } else if (params.length) { + text += `${this.visit(notInNode.left)} NOT IN (${params.join(', ')})`; + } else { + // implicitely has null + text += `${this.visit(notInNode.left)} IS NOT NULL`; + } + } else { + text += '1=1'; + } + } else { + text += `${this.visit(notInNode.left)} NOT IN ${this.visit(notInNode.right)}`; + } + text += ')'; + return [text]; + } + public visitCase(caseNode: CaseNode): string[] { + assert(caseNode.whenList.length === caseNode.thenList.length); + let text = '(CASE'; + this.visitingCase = true; + for (let i = 0; i < caseNode.whenList.length; i++) { + text += ` WHEN ${this.visit(caseNode.whenList[i])} THEN ${this.visit(caseNode.thenList[i])}`; + } + if (caseNode.else != null) { + text += ` ELSE ${this.visit(caseNode.else)}`; + } + this.visitingCase = false; + text += ' END)'; + return [text]; + } + public visitAt(atNode: AtNode): string[] { + const text = `(${this.visit(atNode.value)})[${this.visit(atNode.index)}]`; + return [text]; + } + public visitSlice(sliceNode: SliceNode): string[] { + const text = `(${this.visit(sliceNode.value)})[${this.visit(sliceNode.start)}:${this.visit(sliceNode.end)}]`; + return [text]; + } + public visitQuery(queryNode: Query): string[] { + if (this.queryNode) { + return this.visitSubquery(queryNode, dontParenthesizeSubQuery(this.queryNode)); + } + this.queryNode = queryNode; + // need to sort the top level query nodes on visitation priority + // so select/insert/update/delete comes before from comes before where + let missingFrom = true; + let hasFrom = false; + let createView; + let isSelect = false; + const actions = []; + const targets = []; + const filters = []; + for (const node of queryNode.nodes) { + switch (node.type) { + case 'SELECT': + isSelect = true; + case 'DELETE': + actions.push(node); + break; + case 'INDEXES': + case 'INSERT': + case 'REPLACE': + case 'UPDATE': + case 'CREATE': + case 'DROP': + case 'TRUNCATE': + case 'ALTER': + actions.push(node); + missingFrom = false; + break; + case 'FROM': + (node as FromNode).skipFromStatement = hasFrom; + hasFrom = true; + missingFrom = false; + targets.push(node); + break; + case 'CREATE VIEW': + createView = node; + break; + default: + filters.push(node); + break; + } + } + if (!actions.length) { + // if no actions are given, guess it's a select + actions.push(new SelectNode().add('*')); + isSelect = true; + } + if (missingFrom && queryNode.table instanceof Table) { + // the instanceof handles the situation where a sql.select(some expression) is used and there should be no FROM clause + targets.push(new FromNode().add(queryNode.table)); + } + if (createView) { + if (isSelect) { + actions.unshift(createView); + } else { + throw new Error('Create View requires a Select.'); + } + } + return this.visitQueryHelper(actions, targets, filters); + } + /** + * We separate out this part of query building so it can be overridden by other implementations. + * + * @param {Node[]} actions + * @param {Node[]} targets + * @param {Node[]} filters + * @returns {String[]} + */ + public visitQueryHelper(actions: Node[], targets: Node[], filters: Node[]): string[] { + this.handleDistinct(actions, filters); + // lazy-man sorting + const sortedNodes = actions.concat(targets).concat(filters); + for (const node of sortedNodes) { + const res = this.visit(node); + this.output = this.output.concat(res); + } + // implicit 'from' + return this.output; + } + public visitSubquery(queryNode: Query, dontParenthesize?: boolean): string[] { + // create another query builder of the current class to build the subquery + const subQuery = new this.myClass(this.config); + // let the subquery modify this instance's params array + subQuery.params = this.params; + // pass on the disable parameter placeholder flag + const previousFlagStatus = subQuery.disableParameterPlaceholders; + subQuery.disableParameterPlaceholders = this.disableParameterPlaceholders; + try { + subQuery.visitQuery(queryNode); + } finally { + // restore the flag + subQuery.disableParameterPlaceholders = previousFlagStatus; + } + const alias = queryNode.alias; + if (dontParenthesize) { + return [subQuery.output.join(' ') + (alias ? ' ' + this.quote(alias) : '')]; + } + return ['(' + subQuery.output.join(' ') + ')' + (alias ? ' ' + this.quote(alias) : '')]; + } + public visitTable(tableNode: TableNode): string[] { + const table = tableNode.table; + let txt = ''; + if (table.getSchema()) { + txt = this.quote(table.getSchema()!); + txt += '.'; + } + txt += this.quote(table.getName()); + if (typeof table.alias === 'string') { + txt += this.aliasText + this.quote(table.alias); + } + return [txt]; + } + public visitColumn(columnNode: ColumnNode): string[] { + const table = columnNode.table; + const inInsertUpdateClause = this.visitedInsert || this.visitedReplace || this.visitingUpdateTargetColumn; + const inDdlClause = this.visitingAddColumn || this.visitingAlter || this.visitingCreate; + const inSelectClause = + this.visitingReturning || + (!this.selectOrDeleteEndIndex && + !this.visitingWhere && + !inInsertUpdateClause && + !inDdlClause && + !this.visitingCase && + !this.visitingJoin); + const inFunctionCall = this.visitingFunctionCall; + const inCast = this.visitingCast; + const txt = []; + let closeParen = 0; + if (inSelectClause && ((table && !table.alias) || !!columnNode.alias)) { + if (columnNode.asArray) { + closeParen++; + txt.push(`${this.arrayAggFunctionName}(`); + } + if (!!columnNode.aggregator) { + closeParen++; + txt.push(`${columnNode.aggregator}(`); + } + if (columnNode.isDistinct === true) { + closeParen++; + txt.push('DISTINCT('); + } + } + if ( + !inInsertUpdateClause && + !this.visitingReturning && + !this.visitingCreate && + !this.visitingAlter && + !columnNode.subfieldContainer + ) { + if (table) { + if (typeof table.alias === 'string') { + txt.push(this.quote(table.alias)); + } else { + if (table.getSchema()) { + txt.push(this.quote(table.getSchema()!)); + txt.push('.'); + } + txt.push(this.quote(table.getName())); + } + txt.push('.'); + } + } + if (columnNode.star) { + const allCols = []; + let hasAliases = false; + if (columnNode.aggregator !== 'COUNT') { + const tableName = txt.join(''); + for (const col of table!.columns) { + const aliased = col.name !== (col.alias || col.property!); + hasAliases = hasAliases || aliased; + allCols.push( + tableName + this.quote(col.name) + (aliased ? this.aliasText + this.quote(col.alias || col.property!) : '') + ); + } + } + if (hasAliases) { + txt.length = 0; + txt.push(allCols.join(', ')); + } else { + txt.push('*'); + } + } else if (columnNode.isConstant) { + // this injects directly into SELECT statement rather than creating a parameter + // txt.push(this._getParameterValue(columnNode.literalValue)) + // currently thinking it is better to generate a parameter + const value = columnNode.constantValue; + this.params.push(value); + txt.push(this._getParameterText(this.params.length, value)); + } else { + if (columnNode.subfieldContainer) { + txt.push('(' + this.visitColumn(columnNode.subfieldContainer.toNode()) + ').'); + } + txt.push(this.quote(columnNode.name)); + } + if (closeParen) { + for (let j = 0; j < closeParen; j++) { + txt.push(')'); + } + } + if (inSelectClause && !inFunctionCall && !inCast && (columnNode.alias || columnNode.property !== columnNode.name)) { + txt.push(this.aliasText + this.quote(columnNode.alias || columnNode.property)); + } + if (this.visitingCreate || this.visitingAddColumn) { + assert( + columnNode.dataType, + `dataType missing for column ${columnNode.name} (CREATE TABLE and ADD COLUMN statements require a dataType)` + ); + txt.push(` ${columnNode.dataType}`); + if (this.visitingCreate) { + if (columnNode.primaryKey && !this.visitCreateCompoundPrimaryKey) { + // creating a column as a primary key + txt.push(' PRIMARY KEY'); + } else if (columnNode.notNull) { + txt.push(' NOT NULL'); + } + if (!columnNode.primaryKey && columnNode.unique) { + txt.push(' UNIQUE'); + } + if (columnNode.defaultValue !== undefined) { + txt.push(` DEFAULT ${this._getParameterValue(columnNode.defaultValue)}`); + } + } + if (!!columnNode.references) { + assert.equal( + typeof columnNode.references, + 'object', + 'references is not a object for column ' + + columnNode.name + + ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + + ' require refrences to be expressed as an object)' + ); + // Empty refrence objects are ok + if (Object.keys(columnNode.references).length > 0) { + const references = columnNode.references! as Exclude, string>; + assert( + references.table, + 'reference.table missing for column ' + + columnNode.name + + ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + + ' require a table and column)' + ); + assert( + references.column, + 'reference.column missing for column ' + + columnNode.name + + ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + + ' require a table and column)' + ); + txt.push(' REFERENCES '); + // TODO: if this is used need to put back in + // if (references.schema) { + // txt.push(this.quote(references.schema) + '.'); + // } + txt.push(this.quote(references.table!) + '(' + this.quote(references.column!) + ')'); + let onDelete: string | undefined = references.onDelete; + if (onDelete) { + onDelete = onDelete.toUpperCase(); + } + if ( + onDelete === 'CASCADE' || + onDelete === 'RESTRICT' || + onDelete === 'SET NULL' || + onDelete === 'SET DEFAULT' || + onDelete === 'NO ACTION' + ) { + txt.push(` ON DELETE ${onDelete}`); + } + let onUpdate: string | undefined = references.onUpdate; + if (onUpdate) { + onUpdate = onUpdate.toUpperCase(); + } + if ( + onUpdate === 'CASCADE' || + onUpdate === 'RESTRICT' || + onUpdate === 'SET NULL' || + onUpdate === 'SET DEFAULT' || + onUpdate === 'NO ACTION' + ) { + txt.push(` ON UPDATE ${onUpdate}`); + } + const constraint: string | undefined = references.constraint; + if (constraint) { + txt.push(` ${constraint.toUpperCase()}`); + } + } + } + } + return [txt.join('')]; + } + public visitForeignKey(foreignKeyNode: ForeignKeyNode): string[] { + const txt = []; + if (this.visitingCreate) { + assert(foreignKeyNode.table, 'Foreign table missing for table reference'); + assert(foreignKeyNode.columns, 'Columns missing for table reference'); + if (foreignKeyNode.refColumns !== undefined) { + assert.equal( + foreignKeyNode.columns.length, + foreignKeyNode.refColumns.length, + 'Number of local columns and foreign columns differ in table reference' + ); + } + if (foreignKeyNode.name !== undefined) { + txt.push('CONSTRAINT ' + this.quote(foreignKeyNode.name) + ' '); + } + txt.push('FOREIGN KEY ( '); + for (let i = 0; i < foreignKeyNode.columns.length; i++) { + if (i > 0) { + txt.push(', '); + } + txt.push(this.quote(foreignKeyNode.columns[i])); + } + txt.push(' ) REFERENCES '); + if (foreignKeyNode.schema !== undefined) { + txt.push(this.quote(foreignKeyNode.schema) + '.'); + } + txt.push(this.quote(foreignKeyNode.table)); + if (foreignKeyNode.refColumns !== undefined) { + txt.push(' ( '); + for (let i = 0; i < foreignKeyNode.refColumns.length; i++) { + if (i > 0) { + txt.push(', '); + } + txt.push(this.quote(foreignKeyNode.refColumns[i])); + } + txt.push(' )'); + } + let onDelete = foreignKeyNode.onDelete; + if (onDelete) { + onDelete = onDelete.toUpperCase(); + if ( + onDelete === 'CASCADE' || + onDelete === 'RESTRICT' || + onDelete === 'SET NULL' || + onDelete === 'SET DEFAULT' || + onDelete === 'NO ACTION' + ) { + txt.push(` ON DELETE ${onDelete}`); + } + } + let onUpdate = foreignKeyNode.onUpdate; + if (onUpdate) { + onUpdate = onUpdate.toUpperCase(); + if ( + onUpdate === 'CASCADE' || + onUpdate === 'RESTRICT' || + onUpdate === 'SET NULL' || + onUpdate === 'SET DEFAULT' || + onUpdate === 'NO ACTION' + ) { + txt.push(` ON UPDATE ${onUpdate}`); + } + } + if (foreignKeyNode.constraint) { + txt.push(` ${foreignKeyNode.constraint.toUpperCase()}`); + } + } + return [txt.join('')]; + } + public visitFunctionCall(functionCallNode: FunctionCallNode): string[] { + this.visitingFunctionCall = true; + const extract = () => { + const nodes = functionCallNode.nodes.map(this.visit.bind(this)); + if (nodes.length !== 1) { + throw new Error(`Not enough parameters passed to ${functionCallNode.name} function`); + } + return `EXTRACT(${functionCallNode.name} FROM ${nodes[0] + ''})`; + }; + let txt = ''; + // Override date functions since postgres (and others) uses extract + if (['YEAR', 'MONTH', 'DAY', 'HOUR'].indexOf(functionCallNode.name) >= 0) { + txt = extract(); + } + // Override CURRENT_TIMESTAMP function to remove parens + else if ('CURRENT_TIMESTAMP' === functionCallNode.name) { + txt = functionCallNode.name; + } else { + txt = `${functionCallNode.name}(${functionCallNode.nodes.map(this.visit.bind(this)).join(', ')})`; + } + this.visitingFunctionCall = false; + return [txt]; + } + public visitArrayCall(arrayCallNode: ArrayCallNode): string[] { + const txt = `ARRAY[${arrayCallNode.nodes.map(this.visit.bind(this)).join(', ')}]`; + return [txt]; + } + public visitParameter(parameterNode: ParameterNode): string[] { + // save the value into the parameters array + const value = parameterNode.value(); + this.params.push(value); + return parameterNode.isExplicit ? [] : [this._getParameterText(this.params.length, value)]; + } + public visitDefault(defaultNode: DefaultNode): string[] { + /* jshint unused: false */ + return ['DEFAULT']; + } + public visitAddColumn(addColumnNode: AddColumnNode): string[] { + this.visitingAddColumn = true; + const result = [`ADD COLUMN ${this.visit(addColumnNode.nodes[0])}`]; + this.visitingAddColumn = false; + return result; + } + public visitDropColumn(dropColumnNode: DropColumnNode): string[] { + return [`DROP COLUMN ${this.visit(dropColumnNode.nodes[0])}`]; + } + public visitRenameColumn(renameColumnNode: RenameColumnNode): string[] { + return [`RENAME COLUMN ${this.visit(renameColumnNode.nodes[0])} TO ${this.visit(renameColumnNode.nodes[1])}`]; + } + public visitRename(renameNode: RenameNode): string[] { + return [`RENAME TO ${this.visit(renameNode.nodes[0])}`]; + } + public visitIfExists(ifExistsNode: IfExistsNode): string[] { + return ['IF EXISTS']; + } + public visitIfNotExists(ifNotExistsNode: IfNotExistsNode): string[] { + return ['IF NOT EXISTS']; + } + public visitOrIgnore(orIgnoreNode: OrIgnoreNode): string[] { + throw new Error('PostgreSQL does not allow orIgnore clause.'); + } + public visitCascade(cascadeNode: CascadeNode): string[] { + return ['CASCADE']; + } + public visitRestrict(restrictNode: RestrictNode): string[] { + return ['RESTRICT']; + } + public visitForUpdate(forUpdateNode: ForUpdateNode): string[] { + return ['FOR UPDATE']; + } + public visitForShare(forShareNode: ForShareNode): string[] { + return ['FOR SHARE']; + } + public visitJoin(joinNode: JoinNode): string[] { + this.visitingJoin = true; + return [...this.visit(joinNode.from), `${joinNode.subType} JOIN`, ...this.visit(joinNode.to), 'ON', ...this.visit(joinNode.onNode)]; + } + public visitLiteral(literalNode: LiteralNode): string[] { + const txt = [literalNode.literal]; + if (literalNode.alias) { + txt.push(this.aliasText + this.quote(literalNode.alias)); + } + return [txt.join('')]; + } + public visitText(textNode: TextNode): string[] { + return [textNode.text]; + } + public visitReturning(returningNode: ReturningNode): string[] { + this.visitingReturning = true; + const r = ['RETURNING', returningNode.nodes.map(this.visit.bind(this)).join(', ')]; + this.visitingReturning = false; + return r; + } + public visitOnDuplicate(onDuplicateNode: OnDuplicateNode): string[] { + throw new Error('PostgreSQL does not allow onDuplicate clause.'); + } + public visitOnConflict(onConflictNode: OnConflictNode): string[] { + const result = ['ON CONFLICT']; + const columns = []; + const updateClause = []; + let i; + let col; + const table = this.queryNode!.table; + if (onConflictNode.constraint) { + result.push(['ON CONSTRAINT', this.quote(onConflictNode.constraint)].join(' ')); + } else if (onConflictNode.columns) { + for (i = 0; i < onConflictNode.columns.length; i++) { + columns.push(this.quote(table.getColumn(onConflictNode.columns[i])!.name)); + } + result.push('(' + columns.join(', ') + ')'); + } + if (onConflictNode.update) { + updateClause.push('DO UPDATE SET'); + const update = onConflictNode.update; + const setClause = []; + for (i = 0; i < update.length; i++) { + col = this.quote(table.getColumn(update[i])!.name); + setClause.push(col + ' = EXCLUDED.' + col); + } + updateClause.push(setClause.join(', ')); + } else { + updateClause.push('DO NOTHING'); + } + result.push(updateClause.join(' ')); + return result; + } + public visitModifier(modifierNode: ModifierNode): string[] { + return [modifierNode.type, ...this.visit(modifierNode.count)]; + } + public visitIndexes(indexesNode: IndexesNode): string[] { + /* jshint unused: false */ + const tableName = this.queryNode!.table.getName(); + const schemaName = this.queryNode!.table.getSchema() || 'public'; + return [ + 'SELECT relname', + 'FROM pg_class', + 'WHERE oid IN (', + 'SELECT indexrelid', + `FROM pg_index, pg_class WHERE pg_class.relname='${tableName}'`, + `AND pg_class.relnamespace IN (SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = '${schemaName}')`, + 'AND pg_class.oid=pg_index.indrelid)' + ]; + } + public visitCreateIndex(createIndexNode: CreateIndexNode): string[] { + if (!createIndexNode.options.columns || createIndexNode.options.columns.length === 0) { + throw new Error('No columns defined!'); + } + const tableName = this.visit(createIndexNode.table.toNode()); + let result = ['CREATE']; + if (createIndexNode.options.type) { + result.push(createIndexNode.options.type.toUpperCase()); + } + result = result.concat(['INDEX', this.quote(createIndexNode.indexName())]); + if (createIndexNode.options.algorithm) { + result.push('USING ' + createIndexNode.options.algorithm.toUpperCase()); + } + result = result.concat([ + 'ON', + ...tableName, + '(' + + createIndexNode.options.columns.reduce( + (res, col) => { + const column = col.name ? col.name : col.value.name; + const direction = col instanceof OrderByValueNode ? ` ${col.direction!.text}` : ''; + return res.concat(this.quote(column) + direction); + }, + [] as string[] + ) + + ')' + ]); + if (createIndexNode.options.parser) { + result.push('WITH PARSER'); + result.push(createIndexNode.options.parser); + } + return result; + } + public visitDropIndex(dropIndexNode: DropIndexNode): string[] { + const result = ['DROP INDEX']; + result.push(this.quote(dropIndexNode.table.getSchema() || 'public') + '.' + this.quote(dropIndexNode.options.indexName)); + return result; + } + public visitCreateView(createViewNode: CreateViewNode): string[] { + const result = ['CREATE VIEW', this.quote(createViewNode.options.viewName), 'AS']; + return result; + } + public visitInterval(intervalNode: IntervalNode): string[] { + let parameter = ''; + const add = (n: number, unit: string) => { + if (!_.isNumber(n)) { + return; + } + if (parameter !== '') { + parameter += ' '; + } + parameter += `${n} ${unit}`; + }; + add(intervalNode.years, 'YEAR'); + add(intervalNode.months, 'MONTH'); + add(intervalNode.days, 'DAY'); + add(intervalNode.hours, 'HOUR'); + add(intervalNode.minutes, 'MINUTE'); + add(intervalNode.seconds, 'SECOND'); + if (parameter === '') { + parameter = '0 SECOND'; + } + return [`INTERVAL '${parameter}'`]; + } + /** + * Broken out as a separate function so that dialects that derive from this class can still use this functionality. + * + * @param {Node[]} list + * @param {String} type + * @returns {Object|undefined} {index:number, node:Node} + */ + public findNode(list: Node[], type: string) { + for (let i = 0, len = list.length; i < len; i++) { + const n = list[i]; + if (n.type === type) { + return { index: i, node: n }; + } + } + return undefined; + } + /** + * pulls the DISTINCT node out of the filters and flags the SELECT node that it should be distinct. + * Broken out as a separate function so that dialects that derive from this class can still use this functionality. + */ + public handleDistinct(actions: Node[], filters: Node[]) { + const distinctNode = this.findNode(filters, 'DISTINCT'); + // if (!distinctNode) distinctNode = _findNode(targets,"DISTINCT"); + // if (!distinctNode) distinctNode = _findNode(actions,"DISTINCT"); + if (!distinctNode) { + return; + } + const selectInfo = this.findNode(actions, 'SELECT'); + if (!selectInfo) { + return; + } // there should be one by now, I think + // mark the SELECT node that it's distinct + (selectInfo.node as SelectNode).isDistinct = true; + } +} + +/** + * If the parent of the subquery is an INSERT we don't want to parenthesize. + * This happens when you create the query like so: + * + * const query=post.insert(post.id) + * const select=user.select(user.id) + * query.add(select) + * + * @param parentQuery + * @returns {boolean} + */ +function dontParenthesizeSubQuery(parentQuery: Query) { + if (!parentQuery) { + return false; + } + if (parentQuery.nodes.length === 0) { + return false; + } + if (['INSERT', 'REPLACE'].indexOf(parentQuery.nodes[0].type) === -1) { + return false; + } + return true; +} diff --git a/lib/dialect/sqlite.js b/lib/dialect/sqlite.js deleted file mode 100644 index 60d46997..00000000 --- a/lib/dialect/sqlite.js +++ /dev/null @@ -1,205 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var util = require('util'); -var assert = require('assert'); - -var Sqlite = function(config) { - this.output = []; - this.params = []; - this._hasAddedAColumn = false; - this.config = config || {}; -}; - -var Postgres = require('./postgres'); - -util.inherits(Sqlite, Postgres); - -Sqlite.prototype._myClass = Sqlite; - -Sqlite.prototype._arrayAggFunctionName = 'GROUP_CONCAT'; - -Sqlite.prototype.visitReplace = function(replace) { - var self = this; - // don't use table.column for replaces - this._visitedReplace = true; - - var result = ['REPLACE']; - result = result.concat(replace.nodes.map(this.visit.bind(this))); - result.push('INTO ' + this.visit(this._queryNode.table.toNode())); - result.push('(' + replace.columns.map(this.visit.bind(this)).join(', ') + ')'); - - var paramNodes = replace.getParameters(); - - if (paramNodes.length > 0) { - var paramText = paramNodes.map(function (paramSet) { - return paramSet.map(function (param) { - return self.visit(param); - }).join(', '); - }).map(function (param) { - return '('+param+')'; - }).join(', '); - - result.push('VALUES', paramText); - - if (result.slice(2, 5).join(' ') === '() VALUES ()') { - result.splice(2, 3, 'DEFAULT VALUES'); - } - } - - this._visitedReplace = false; - - return result; -}; - -Sqlite.prototype._getParameterValue = function(value) { - if (Buffer.isBuffer(value)) { - value = 'x' + this._getParameterValue(value.toString('hex')); - } else if (value instanceof Date && this.config.dateTimeMillis) { - value = value.getTime(); - } else if('boolean' === typeof value) { - value = value ? 1 : 0; - } else if(_.isArray(value)) { - value = Postgres.prototype._getParameterValue.call(this, JSON.stringify(value)); - } else { - value = Postgres.prototype._getParameterValue.call(this, value); - } - return value; -}; - -Sqlite.prototype.visitDefault = function() { - throw new Error('SQLite requires that all rows of a multi-row insert are for the same columns.'); -}; - -Sqlite.prototype.visitDropColumn = function() { - throw new Error('SQLite does not allow dropping columns.'); -}; - -Sqlite.prototype.visitFunctionCall = function (functionCall) { - var _this = this; - - this._visitingFunctionCall = true; - - function _left() { - // convert LEFT(column,4) to SUBSTR(column,1,4) - var nodes = functionCall.nodes.map(_this.visit.bind(_this)); - if (nodes.length != 2) throw new Error('Not enough parameters passed to LEFT function.'); - var txt = "SUBSTR(" + (nodes[0] + '') + ', 1, ' + (nodes[1] + '') + ')'; - return txt; - } - - function _right() { - // convert RIGHT(column,4) to SUBSTR(column,-4) - var nodes = functionCall.nodes.map(_this.visit.bind(_this)); - if (nodes.length != 2) throw new Error('Not enough parameters passed to RIGHT function.'); - var txt = "SUBSTR(" + (nodes[0] + '') + ', -' + (nodes[1] + '') + ')'; - return txt; - } - - function _extract() { - var nodes = functionCall.nodes.map(_this.visit.bind(_this)); - if (nodes.length != 1) throw new Error('Not enough parameters passed to ' + functionCall.name + ' function'); - var format; - switch (functionCall.name) { - case 'YEAR': - format = "'%Y'"; - break; - case 'MONTH': - format = "'%m'"; - break; - case 'DAY': - format = "'%d'"; - break; - case 'HOUR': - format = "'%H'"; - break; - } - var col = (nodes[0] + ''); - if (_this.config.dateTimeMillis) { - // Convert to a datetime before running the strftime function - // Sqlite unix epoch is in seconds, but javascript is milliseconds. - col = 'datetime(' + col + '/1000, "unixepoch")'; - } - var txt = 'strftime(' + format + ', ' + col + ')'; - return txt; - } - - var txt = ""; - var name = functionCall.name; - // Override LEFT and RIGHT and convert to SUBSTR - if (name == "LEFT") txt = _left(); - else if (name == "RIGHT") txt = _right(); - // Override date functions since sqlite uses strftime - else if (['YEAR', 'MONTH', 'DAY', 'HOUR'].indexOf(functionCall.name) >= 0) txt = _extract(); - else if ('CURRENT_TIMESTAMP' == functionCall.name) txt = functionCall.name; - else txt = name + '(' + functionCall.nodes.map(this.visit.bind(this)).join(', ') + ')'; - - this._visitingFunctionCall = false; - return [txt]; -}; - -Sqlite.prototype.visitTruncate = function(truncate) { - var result = ['DELETE FROM']; - result = result.concat(truncate.nodes.map(this.visit.bind(this))); - return result; -}; - -Sqlite.prototype.visitRenameColumn = function() { - throw new Error('SQLite does not allow renaming columns.'); -}; - -Sqlite.prototype.visitOnDuplicate = function() { - throw new Error('SQLite does not allow onDuplicate clause.'); -}; - -Sqlite.prototype.visitOnConflict = function(onConflict) { - throw new Error('Sqlite does not allow onConflict clause.'); -}; - -Sqlite.prototype.visitReturning = function() { - throw new Error('SQLite does not allow returning clause.'); -}; - -Sqlite.prototype.visitForUpdate = function() { - throw new Error('SQLite does not allow FOR UPDATE clause.'); -}; - -Sqlite.prototype.visitForShare = function() { - throw new Error('SQLite does not allow FOR SHARE clause.'); -}; - -Sqlite.prototype.visitAddColumn = function(addColumn) { - assert(!this._hasAddedAColumn, 'SQLite can not add more that one column at a time'); - var result = Postgres.prototype.visitAddColumn.call(this, addColumn); - this._hasAddedAColumn = true; - return result; -}; - -Sqlite.prototype.visitIndexes = function(node) { - var tableName = this.visit(this._queryNode.table.toNode())[0]; - return "PRAGMA INDEX_LIST(" + tableName + ")"; -}; - -Sqlite.prototype.visitCascade = function() { - throw new Error('Sqlite do not support CASCADE in DROP TABLE'); -}; - -Sqlite.prototype.visitRestrict = function() { - throw new Error('Sqlite do not support RESTRICT in DROP TABLE'); -}; - -Sqlite.prototype.visitBinary = function(binary) { - if(binary.operator === '@@'){ - binary.operator = 'MATCH'; - var ret = Sqlite.super_.prototype.visitBinary.call(this, binary); - binary.operator = '@@'; - return ret; - } - return Sqlite.super_.prototype.visitBinary.call(this, binary); -}; - -Sqlite.prototype.visitOrIgnore = function() { - return ['OR IGNORE']; -}; - -module.exports = Sqlite; diff --git a/lib/dialect/sqlite.ts b/lib/dialect/sqlite.ts new file mode 100644 index 00000000..f001d1f1 --- /dev/null +++ b/lib/dialect/sqlite.ts @@ -0,0 +1,199 @@ +'use strict'; + +import assert = require('assert'); +import _ = require('lodash'); + +import { + AddColumnNode, + BinaryNode, + CascadeNode, + DefaultNode, + DropColumnNode, + ForShareNode, + ForUpdateNode, + FunctionCallNode, + IndexesNode, + OnConflictNode, + OnDuplicateNode, + OrIgnoreNode, + RenameColumnNode, + ReplaceNode, + RestrictNode, + ReturningNode, + TruncateNode +} from '../node'; +import { Postgres } from './postgres'; + +export class Sqlite extends Postgres { + public config: { dateTimeMillis?: boolean }; + protected myClass = Sqlite; + + protected arrayAggFunctionName = 'GROUP_CONCAT'; + protected hasAddedAColumn: boolean; + constructor(config: { dateTimeMillis?: boolean }) { + super(config); + this.config = config; + this.hasAddedAColumn = false; + } + public _getParameterValue( + value: null | boolean | number | string | any[] | Date | Buffer | object, + quoteChar?: string + ): string | number { + if (Buffer.isBuffer(value)) { + value = 'x' + this._getParameterValue(value.toString('hex')); + } else if (value instanceof Date && this.config.dateTimeMillis) { + value = value.getTime(); + } else if ('boolean' === typeof value) { + value = value ? 1 : 0; + } else if (_.isArray(value)) { + value = Postgres.prototype._getParameterValue.call(this, JSON.stringify(value)); + } else { + value = Postgres.prototype._getParameterValue.call(this, value); + } + return value; + } + public visitReplace(replaceNode: ReplaceNode): string[] { + // don't use table.column for replaces + this.visitedReplace = true; + let result = ['REPLACE']; + result = result.concat(replaceNode.nodes.map((n) => this.visit(n).join())); + result.push('INTO ' + this.visit(this.queryNode!.table.toNode())); + result.push('(' + replaceNode.columns.map(this.visit.bind(this)).join(', ') + ')'); + const paramNodes = replaceNode.getParameters(); + if (paramNodes.length > 0) { + const paramText = paramNodes + .map((paramSet) => { + return paramSet.map((param) => this.visit(param)).join(', '); + }) + .map((param) => `(${param})`) + .join(', '); + result.push('VALUES', paramText); + if (result.slice(2, 5).join(' ') === '() VALUES ()') { + result.splice(2, 3, 'DEFAULT VALUES'); + } + } + this.visitedReplace = false; + return result; + } + public visitDefault(defaultNode: DefaultNode): string[] { + throw new Error('SQLite requires that all rows of a multi-row insert are for the same columns.'); + } + public visitDropColumn(dropColumnNode: DropColumnNode): string[] { + throw new Error('SQLite does not allow dropping columns.'); + } + public visitFunctionCall(functionCallNode: FunctionCallNode): string[] { + this.visitingFunctionCall = true; + const left = () => { + // convert LEFT(column,4) to SUBSTR(column,1,4) + const nodes = functionCallNode.nodes.map(this.visit.bind(this)); + if (nodes.length !== 2) { + throw new Error('Not enough parameters passed to LEFT function.'); + } + return `SUBSTR(${nodes[0] + ''}, 1, ${nodes[1] + ''})`; + }; + const right = () => { + // convert RIGHT(column,4) to SUBSTR(column,-4) + const nodes = functionCallNode.nodes.map(this.visit.bind(this)); + if (nodes.length !== 2) { + throw new Error('Not enough parameters passed to RIGHT function.'); + } + return `SUBSTR(${nodes[0] + ''}, -${nodes[1] + ''})`; + }; + const extract = () => { + const nodes = functionCallNode.nodes.map(this.visit.bind(this)); + if (nodes.length !== 1) { + throw new Error(`Not enough parameters passed to ${functionCallNode.name} function`); + } + let format; + switch (functionCallNode.name) { + case 'YEAR': + format = "'%Y'"; + break; + case 'MONTH': + format = "'%m'"; + break; + case 'DAY': + format = "'%d'"; + break; + case 'HOUR': + format = "'%H'"; + break; + } + let col = nodes[0] + ''; + if (this.config.dateTimeMillis) { + // Convert to a datetime before running the strftime function + // Sqlite unix epoch is in seconds, but javascript is milliseconds. + col = `datetime(${col}/1000, "unixepoch")`; + } + return `strftime(${format}, ${col})`; + }; + let txt = ''; + const name = functionCallNode.name; + // Override LEFT and RIGHT and convert to SUBSTR + if (name === 'LEFT') { + txt = left(); + } else if (name === 'RIGHT') { + txt = right(); + } + // Override date functions since sqlite uses strftime + else if (['YEAR', 'MONTH', 'DAY', 'HOUR'].indexOf(functionCallNode.name) >= 0) { + txt = extract(); + } else if ('CURRENT_TIMESTAMP' === functionCallNode.name) { + txt = functionCallNode.name; + } else { + txt = `${name}(${functionCallNode.nodes.map(this.visit.bind(this)).join(', ')})`; + } + this.visitingFunctionCall = false; + return [txt]; + } + public visitTruncate(truncateNode: TruncateNode): string[] { + const result = ['DELETE FROM']; + return result.concat(truncateNode.nodes.map((n) => this.visit(n).join())); + } + public visitRenameColumn(renameColumnNode: RenameColumnNode): string[] { + throw new Error('SQLite does not allow renaming columns.'); + } + public visitOnDuplicate(onDuplicateNode: OnDuplicateNode): string[] { + throw new Error('SQLite does not allow onDuplicate clause.'); + } + public visitOnConflict(onConflictNode: OnConflictNode): string[] { + throw new Error('Sqlite does not allow onConflict clause.'); + } + public visitReturning(returningNode: ReturningNode): string[] { + throw new Error('SQLite does not allow returning clause.'); + } + public visitForUpdate(forUpdateNode: ForUpdateNode): string[] { + throw new Error('SQLite does not allow FOR UPDATE clause.'); + } + public visitForShare(forShareNode: ForShareNode): string[] { + throw new Error('SQLite does not allow FOR SHARE clause.'); + } + public visitAddColumn(addColumnNode: AddColumnNode): string[] { + assert(!this.hasAddedAColumn, 'SQLite can not add more that one column at a time'); + const result = Postgres.prototype.visitAddColumn.call(this, addColumnNode); + this.hasAddedAColumn = true; + return result; + } + public visitIndexes(indexesNode: IndexesNode): string[] { + const tableName = this.visit(this.queryNode!.table.toNode())[0]; + return [`PRAGMA INDEX_LIST(${tableName})`]; + } + public visitCascade(cascadeNode: CascadeNode): string[] { + throw new Error('Sqlite do not support CASCADE in DROP TABLE'); + } + public visitRestrict(restrictNode: RestrictNode): string[] { + throw new Error('Sqlite do not support RESTRICT in DROP TABLE'); + } + public visitBinary(binaryNode: BinaryNode): string[] { + if (binaryNode.operator === '@@') { + binaryNode.operator = 'MATCH'; + const ret = super.visitBinary(binaryNode); + binaryNode.operator = '@@'; + return ret; + } + return super.visitBinary(binaryNode); + } + public visitOrIgnore(orIgnoreNode: OrIgnoreNode): string[] { + return ['OR IGNORE']; + } +} diff --git a/lib/functions.js b/lib/functions.js deleted file mode 100644 index fe9cdaaf..00000000 --- a/lib/functions.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; -var _ = require('lodash'); -var sliced = require('sliced'); -var FunctionCall = require('./node/functionCall'); - -// create a function that creates a function call of the specific name, using the specified sql instance -var getFunctionCallCreator = function(name) { - return function() { - // turn array-like arguments object into a true array - return new FunctionCall(name, sliced(arguments)); - }; -}; - -// creates a hash of functions for a sql instance -var getFunctions = function(functionNames) { - if (typeof functionNames === 'string') - return getFunctionCallCreator(functionNames); - - var functions = _.reduce(functionNames, function(reducer, name) { - reducer[name] = getFunctionCallCreator(name); - return reducer; - }, {}); - return functions; -}; - -// aggregate functions available to all databases -var aggregateFunctions = [ - 'AVG', - 'COUNT', - 'DISTINCT', - 'MAX', - 'MIN', - 'SUM' -]; - -// common scalar functions available to most databases -var scalarFunctions = [ - 'ABS', - 'COALESCE', - 'LEFT', - 'LENGTH', - 'LOWER', - 'LTRIM', - 'RANDOM', - 'RIGHT', - 'ROUND', - 'RTRIM', - 'SUBSTR', - 'TRIM', - 'UPPER' -]; - -var dateFunctions = [ - 'YEAR', - 'MONTH', - 'DAY', - 'HOUR', - 'CURRENT_TIMESTAMP' -]; - -// hstore function available to Postgres -var hstoreFunction = 'HSTORE'; - -//text search functions available to Postgres -var textsearchFunctions = ['TS_RANK','TS_RANK_CD', 'PLAINTO_TSQUERY', 'TO_TSQUERY', 'TO_TSVECTOR', 'SETWEIGHT']; - -var standardFunctionNames = aggregateFunctions.concat(scalarFunctions).concat(hstoreFunction).concat(textsearchFunctions).concat(dateFunctions); - -// creates a hash of standard functions for a sql instance -var getStandardFunctions = function() { - return getFunctions(standardFunctionNames); -}; - -module.exports.getFunctions = getFunctions; -module.exports.getStandardFunctions = getStandardFunctions; diff --git a/lib/functions.ts b/lib/functions.ts new file mode 100644 index 00000000..9d5c4b6c --- /dev/null +++ b/lib/functions.ts @@ -0,0 +1,68 @@ +'use strict'; +import _ = require('lodash'); +import sliced = require('sliced'); +import { FunctionCallNode } from './node'; + +// create a function that creates a function call of the specific name, using the specified sql instance +const getFunctionCallCreator = (name: string) => { + return (...args: any[]) => { + // turn array-like arguments object into a true array + return new FunctionCallNode(name, sliced(args)); + }; +}; + +// creates a hash of functions for a sql instance +const getFunctions = (functionNames: string | string[]) => { + if (typeof functionNames === 'string') { return getFunctionCallCreator(functionNames); } + + const functions = _.reduce( + functionNames, + (reducer, name) => { + (reducer as any)[name] = getFunctionCallCreator(name); + return reducer; + }, + {} + ); + return functions; +}; + +// aggregate functions available to all databases +const aggregateFunctions = ['AVG', 'COUNT', 'DISTINCT', 'MAX', 'MIN', 'SUM']; + +// common scalar functions available to most databases +const scalarFunctions = [ + 'ABS', + 'COALESCE', + 'LEFT', + 'LENGTH', + 'LOWER', + 'LTRIM', + 'RANDOM', + 'RIGHT', + 'ROUND', + 'RTRIM', + 'SUBSTR', + 'TRIM', + 'UPPER' +]; + +const dateFunctions = ['YEAR', 'MONTH', 'DAY', 'HOUR', 'CURRENT_TIMESTAMP']; + +// hstore function available to Postgres +const hstoreFunction = 'HSTORE'; + +// text search functions available to Postgres +const textsearchFunctions = ['TS_RANK', 'TS_RANK_CD', 'PLAINTO_TSQUERY', 'TO_TSQUERY', 'TO_TSVECTOR', 'SETWEIGHT']; + +const standardFunctionNames = aggregateFunctions + .concat(scalarFunctions) + .concat(hstoreFunction) + .concat(textsearchFunctions) + .concat(dateFunctions); + +// creates a hash of standard functions for a sql instance +const getStandardFunctions = (): { [key: string]: (...args: any[]) => FunctionCallNode } => { + return getFunctions(standardFunctionNames); +}; + +export { getFunctions, getStandardFunctions }; diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index f6cf39e6..00000000 --- a/lib/index.js +++ /dev/null @@ -1,91 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Column = require("./column"); -var FunctionCall = require('./node/functionCall'); -var ArrayCall = require('./node/arrayCall'); -var functions = require('./functions'); -var getDialect = require('./dialect'); -var Query = require('./node/query'); -var sliced = require('sliced'); -var Table = require('./table'); -var Interval = require('./node/interval'); - -// default dialect is postgres -var DEFAULT_DIALECT = 'postgres'; - -var Sql = function(dialect, config) { - this.setDialect(dialect || DEFAULT_DIALECT, config); - - // attach the standard SQL functions to this instance - this.functions = functions.getStandardFunctions(); - this.function = functions.getFunctions; -}; - -// Define a table -Sql.prototype.define = function(def) { - def = _.defaults(def || {}, { - sql: this - }); - - return Table.define(def); -}; - -// Returns a function call creator -Sql.prototype.functionCallCreator = function(name) { - return function() { - return new FunctionCall(name, sliced(arguments)); - }; -}; - -// Returns a bracketed call creator literal -Sql.prototype.array = function() { - var arrayCall = new ArrayCall(sliced(arguments)); - arrayCall.sql = this; - return arrayCall; -}; - -// Returns a select statement -Sql.prototype.select = function() { - var query = new Query({sql: this}); - query.select.apply(query, arguments); - return query; -}; - -// Returns an interval clause -Sql.prototype.interval = function() { - var interval = new Interval(sliced(arguments)); - return interval; -}; - -// Set the dialect -Sql.prototype.setDialect = function(dialect, config) { - this.dialect = getDialect(dialect); - this.dialectName = dialect; - this.config = config; - - return this; -}; - -// Create a constant Column (for use in SELECT) -Sql.prototype.constant = function(value) { - var config={ - name:"constant", - property:"constant", - isConstant:true, - constantValue:value, - }; - var cn = new Column(config); - return cn; -}; - - -// back compat shim for the Sql class constructor -var create = function(dialect, config) { - return new Sql(dialect, {}); -}; - -module.exports = new Sql(DEFAULT_DIALECT, {}); -module.exports.create = create; -module.exports.Sql = Sql; -module.exports.Table = Table; diff --git a/lib/index.ts b/lib/index.ts new file mode 100644 index 00000000..39226b55 --- /dev/null +++ b/lib/index.ts @@ -0,0 +1,74 @@ +'use strict'; + +import _ = require('lodash'); +import sliced = require('sliced'); +import { Column } from './column'; +import { SQLDialects, TableDefinition } from './configTypes'; +import { DEFAULT_DIALECT, getDialect } from './dialect'; +import * as functions from './functions'; +import { ArrayCallNode, FunctionCallNode, IntervalNode, Query } from './node'; +import { Table, TableWithColumns } from './table'; + +class Sql { + public functions: { [key: string]: (...args: any[]) => FunctionCallNode }; + public dialect: any; + public dialectName!: SQLDialects; + public config: any; + // tslint:disable-next-line:variable-name + private _function: any; + constructor(dialect: SQLDialects = DEFAULT_DIALECT, config: any = {}) { + this.setDialect(dialect, config); + // attach the standard SQL functions to this instance + this.functions = functions.getStandardFunctions(); + this._function = functions.getFunctions; + } + // Define a function + public function(functionNames: string[]): { [key: string]: (...args: any[]) => FunctionCallNode }; + public function(functionName: string): (...args: any[]) => FunctionCallNode; + public function(...args: any[]): any { + return this._function(...args); + } + // Define a table + public define(def: TableDefinition): TableWithColumns { + def = _.defaults(def || {}, { + sql: this + }); + return Table.define(def); + } + // Returns a bracketed call creator literal + public array(...args: any[]) { + const arrayCall = new ArrayCallNode(sliced(args)); + return arrayCall; + } + // Returns a select statement + public select(...args: any[]) { + const query = new Query({ sql: this } as any); + query.select(...args); + return query; + } + // Returns an interval clause + public interval(...args: any[]) { + const interval = new IntervalNode(sliced(args)); + return interval; + } + // Set the dialect + public setDialect(dialect: SQLDialects, config: any = {}) { + this.dialect = getDialect(dialect); + this.dialectName = dialect; + this.config = config; + return this; + } + // Create a constant Column (for use in SELECT) + public constant(value: any) { + const config = { + constantValue: value, + isConstant: true, + name: 'constant', + property: 'constant' + }; + const cn = new Column(config); + return cn; + } +} + +export { Sql, Table }; diff --git a/lib/joiner.js b/lib/joiner.js deleted file mode 100644 index 5ce82cf9..00000000 --- a/lib/joiner.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -var getPrimaryKeyColumn = function(table) { - for (var i = 0; i < table.columns.length; i++) { - var col = table.columns[i]; - if (col.primaryKey) { - return col; - } - } -}; - -var findReference = function(left, right) { - // find reference - for (var i = 0; i < right.columns.length; i++) { - var col = right.columns[i]; - if (col.references) { - var leftName = left.getName(); - if (col.references === leftName || col.references.table === leftName) { - var leftCol = left[col.references.column] || getPrimaryKeyColumn(left); - return { - left: leftCol, - right: col - }; - } - } - } -}; - -module.exports = { - // auto-join two tables based on column properties - // requires one column to have { references: {table: 'foreignTableName', column: 'foreignColumnName'}} - // or to have { references: 'foreignTableName'} -- in which case the foreign table's primary key is assumed - leftJoin: function(left, right) { - var ref = findReference(left, right); - if (!ref) { - ref = findReference(right, left); - } - return left.join(right).on(ref.left.equals(ref.right)); - } -}; diff --git a/lib/joiner.ts b/lib/joiner.ts new file mode 100644 index 00000000..6efd1a4c --- /dev/null +++ b/lib/joiner.ts @@ -0,0 +1,50 @@ +'use strict'; + +import { Table } from './table'; + +const getPrimaryKeyColumn = (table: Table) => { + for (const col of table.columns) { + if (col.primaryKey) { + return col; + } + } + return; +}; + +const findReference = (left: Table, right: Table) => { + // find reference + for (const col of right.columns) { + const references = col.references; + if (references) { + const leftName = left.getName(); + if (typeof references === 'string') { + if (references === leftName) { + const leftCol = getPrimaryKeyColumn(left); + return { + left: leftCol, + right: col + }; + } + } else if (references.table === leftName) { + const leftCol = references.column ? (left as any)[references.column] : getPrimaryKeyColumn(left); + return { + left: leftCol, + right: col + }; + } + } + } + return; +}; +// auto-join two tables based on column properties +// requires one column to have { references: {table: 'foreignTableName', column: 'foreignColumnName'}} +// or to have { references: 'foreignTableName'} -- in which case the foreign table's primary key is assumed +const leftJoin = (left: Table, right: Table) => { + let ref = findReference(left, right); + if (!ref) { + ref = findReference(right, left); + } + return left.join(right).on(ref!.left.equals(ref!.right)); +}; + +export { leftJoin }; diff --git a/lib/node/addColumn.js b/lib/node/addColumn.js deleted file mode 100644 index 3d7d4066..00000000 --- a/lib/node/addColumn.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'ADD COLUMN' -}); diff --git a/lib/node/addColumn.ts b/lib/node/addColumn.ts new file mode 100644 index 00000000..9688f0ab --- /dev/null +++ b/lib/node/addColumn.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class AddColumnNode extends Node { + constructor() { + super('ADD COLUMN'); + } +} diff --git a/lib/node/alias.js b/lib/node/alias.js deleted file mode 100644 index 9f9855f5..00000000 --- a/lib/node/alias.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); - -var AliasNode = Node.define({ - type: 'ALIAS', - constructor: function(value, alias) { - Node.call(this); - - this.value = value; - this.alias = alias; - } -}); - -var AliasMixin = { - as: function(alias) { - // create an alias node - var aliasNode = new AliasNode(this, alias); - - // defaults the properties of the aliased node - _.defaults(aliasNode, this); - - return aliasNode; - } -}; - -module.exports = AliasNode; -module.exports.AliasMixin = AliasMixin; diff --git a/lib/node/alias.ts b/lib/node/alias.ts new file mode 100644 index 00000000..2785610f --- /dev/null +++ b/lib/node/alias.ts @@ -0,0 +1,31 @@ +'use strict'; + +import _ = require('lodash'); +import { Node } from '.'; + +export class AliasNode extends Node { + + public static AliasMixin = { + as(this: Node, alias: string) { + // create an alias node + const aliasNode = new AliasNode(this, alias); + + // defaults the properties of the aliased node + _.defaults(aliasNode, this); + + return aliasNode; + } + }; + public value: Node; + public alias: string; + constructor(value: Node, alias: string) { + super('ALIAS'); + + this.value = value; + this.alias = alias; + } +} + +export interface IAliasMixin { + as(alias: string): AliasNode; +} diff --git a/lib/node/alter.js b/lib/node/alter.js deleted file mode 100644 index 4aae4d83..00000000 --- a/lib/node/alter.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'ALTER' -}); diff --git a/lib/node/alter.ts b/lib/node/alter.ts new file mode 100644 index 00000000..c085b4aa --- /dev/null +++ b/lib/node/alter.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class AlterNode extends Node { + constructor() { + super('ALTER'); + } +} diff --git a/lib/node/arrayCall.js b/lib/node/arrayCall.js deleted file mode 100644 index 7533190d..00000000 --- a/lib/node/arrayCall.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var ParameterNode = require('./parameter'); -var valueExpressionMixin = require('./valueExpression'); - -var ArrayCallNode = Node.define({ - type: 'ARRAY CALL', - constructor: function(args) { - Node.call(this); - args = _.flatten(args); - this.addAll(args.map(ParameterNode.getNodeOrParameterNode)); - } -}); - -// mix in value expression -_.extend(ArrayCallNode.prototype, valueExpressionMixin()); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(ArrayCallNode.prototype, AliasNode.AliasMixin); - -module.exports = ArrayCallNode; diff --git a/lib/node/arrayCall.ts b/lib/node/arrayCall.ts new file mode 100644 index 00000000..adf0a006 --- /dev/null +++ b/lib/node/arrayCall.ts @@ -0,0 +1,20 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, ParameterNode, valueExpressionMixin } from '.'; + +export class ArrayCallNode extends Node { + constructor(args: any[]) { + super('ARRAY CALL'); + args = _.flatten(args); + this.addAll(args.map(ParameterNode.getNodeOrParameterNode)); + } +} + +// mix in value expression +_.extend(ArrayCallNode.prototype, valueExpressionMixin()); + +// allow aliasing +_.extend(ArrayCallNode.prototype, AliasNode.AliasMixin); + +export interface ArrayCallNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/at.js b/lib/node/at.js deleted file mode 100644 index 5e8ca47b..00000000 --- a/lib/node/at.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var AtNode = Node.define({ - type: 'AT', - constructor: function(value, index) { - Node.call(this); - this.value = value; - this.index = index; - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(AtNode.prototype, valueExpressionMixin()); - } - } -}); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(AtNode.prototype, AliasNode.AliasMixin); - -module.exports = AtNode; diff --git a/lib/node/at.ts b/lib/node/at.ts new file mode 100644 index 00000000..92fc6243 --- /dev/null +++ b/lib/node/at.ts @@ -0,0 +1,25 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class AtNode extends Node { + public value: Node; + public index: Node; + constructor(value: Node, index: Node) { + super('AT'); + this.value = value; + this.index = index; + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(AtNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(AtNode.prototype, AliasNode.AliasMixin); + +export interface AtNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/binary.js b/lib/node/binary.js deleted file mode 100644 index da8eb8bd..00000000 --- a/lib/node/binary.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var BinaryNode = Node.define(_.extend({ - type: 'BINARY', - constructor: function(config) { - Node.call(this); - this.left = config.left; - this.operator = config.operator; - this.right = config.right; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(BinaryNode.prototype, valueExpressionMixin()); - } - }, -})); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(BinaryNode.prototype, AliasNode.AliasMixin); - -module.exports = BinaryNode; diff --git a/lib/node/binary.ts b/lib/node/binary.ts new file mode 100644 index 00000000..7924191d --- /dev/null +++ b/lib/node/binary.ts @@ -0,0 +1,28 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class BinaryNode extends Node { + public left: Node; + public operator: string; + public right: Node; + constructor(config: { left: Node; operator: string; right: Node }) { + super('BINARY'); + this.left = config.left; + this.operator = config.operator; + this.right = config.right; + + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(BinaryNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(BinaryNode.prototype, AliasNode.AliasMixin); + +export interface BinaryNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/cascade.js b/lib/node/cascade.js deleted file mode 100644 index 4b6646fd..00000000 --- a/lib/node/cascade.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'CASCADE' -}); diff --git a/lib/node/cascade.ts b/lib/node/cascade.ts new file mode 100644 index 00000000..46610baa --- /dev/null +++ b/lib/node/cascade.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class CascadeNode extends Node { + constructor() { + super('CASCADE'); + } +} diff --git a/lib/node/case.js b/lib/node/case.js deleted file mode 100644 index ac3bf214..00000000 --- a/lib/node/case.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var CaseNode = Node.define(_.extend({ - type: 'CASE', - constructor: function(config) { - Node.call(this); - this.whenList = config.whenList; - this.thenList = config.thenList; - this.else = config.else; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(CaseNode.prototype, valueExpressionMixin()); - } - }, -})); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(CaseNode.prototype, AliasNode.AliasMixin); - -module.exports = CaseNode; diff --git a/lib/node/case.ts b/lib/node/case.ts new file mode 100644 index 00000000..81da7c66 --- /dev/null +++ b/lib/node/case.ts @@ -0,0 +1,28 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class CaseNode extends Node { + public whenList: Node[]; + public thenList: Node[]; + public else?: Node; + constructor(config: { whenList: Node[]; thenList: Node[]; else?: Node }) { + super('CASE'); + this.whenList = config.whenList; + this.thenList = config.thenList; + this.else = config.else; + + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(CaseNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(CaseNode.prototype, AliasNode.AliasMixin); + +export interface CaseNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/cast.js b/lib/node/cast.js deleted file mode 100644 index be915b1e..00000000 --- a/lib/node/cast.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var CastNode = Node.define({ - type: 'CAST', - constructor: function(value, dataType) { - Node.call(this); - this.value = value; - this.dataType = dataType; - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(CastNode.prototype, valueExpressionMixin()); - } - } -}); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(CastNode.prototype, AliasNode.AliasMixin); - -module.exports = CastNode; diff --git a/lib/node/cast.ts b/lib/node/cast.ts new file mode 100644 index 00000000..5da364cf --- /dev/null +++ b/lib/node/cast.ts @@ -0,0 +1,25 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class CastNode extends Node { + public value: Node; + public dataType: string; + constructor(value: Node, dataType: string) { + super('CAST'); + this.value = value; + this.dataType = dataType; + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(CastNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(CastNode.prototype, AliasNode.AliasMixin); + +export interface CastNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/column.js b/lib/node/column.js deleted file mode 100644 index 6b145d74..00000000 --- a/lib/node/column.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'COLUMN', - constructor: function(config) { - Node.call(this); - this.name = config.name; - this.property = config.property || config.name; - this.alias = config.alias; - this.star = config.star; - this.isConstant = config.isConstant; - this.constantValue = config.constantValue; - this.asArray = config.asArray; - this.aggregator = config.aggregator; - this.table = config.table; - this.value = config.getValue(); - this.dataType = config.dataType; - this.distinct = config.distinct; - this.primaryKey = config.primaryKey; - this.notNull = config.notNull; - this.defaultValue = config.defaultValue; - this.references = config.references; - // If subfieldContainer is present, this is a subfield and subfieldContainer - // is the parent Column - this.subfieldContainer = config.subfieldContainer; - this.subfields = config.subfields; - this.autoGenerated = !!config.autoGenerated; - this.unique = !!config.unique; - }, - as: function(alias) { - this.alias = alias; - return this; - } -}); diff --git a/lib/node/column.ts b/lib/node/column.ts new file mode 100644 index 00000000..a9d71ef8 --- /dev/null +++ b/lib/node/column.ts @@ -0,0 +1,69 @@ +'use strict'; + +import { Node } from '.'; +import { Column } from '../column'; +import { Table } from '../table'; + +export class ColumnNode extends Node { + public name: string; + public property: string; + public alias?: string; + public star?: boolean; + public isConstant?: boolean; + public constantValue?: any; + public asArray?: boolean; + public aggregator?: string; + public table?: Table; + public value: any; + public dataType?: string; + public isDistinct?: boolean; + public primaryKey?: boolean; + public notNull?: boolean; + public defaultValue?: any; + public references?: + | string + | { + table?: string; + column?: string; + constraint?: string; + onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; + onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; + }; + public subfieldContainer?: Column; + public subfields: { [key: string]: Column }; + public autoGenerated: boolean; + public unique: boolean; + constructor(config: Column) { + super('COLUMN'); + this.name = config.name; + this.property = config.property || config.name; + this.alias = config.alias; + this.star = config.star; + this.isConstant = config.isConstant; + this.constantValue = config.constantValue; + this.asArray = config.asArray; + this.aggregator = config.aggregator; + this.table = config.table; + this.value = config.getValue(); + this.dataType = config.dataType; + this.isDistinct = config.isDistinct; + this.primaryKey = config.primaryKey; + this.notNull = config.notNull; + this.defaultValue = config.defaultValue; + this.references = config.references; + // If subfieldContainer is present, this is a subfield and subfieldContainer + // is the parent Column + this.subfieldContainer = config.subfieldContainer; + this.subfields = config.subfields; + this.autoGenerated = !!config.autoGenerated; + this.unique = !!config.unique; + } + public distinct(): this { + this.isDistinct = true; + return this; + } + public as(alias: string): this { + this.alias = alias; + return this; + } +} diff --git a/lib/node/create.js b/lib/node/create.js deleted file mode 100644 index 67cd9b3d..00000000 --- a/lib/node/create.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'CREATE', - - constructor: function(isTemporary) { - Node.call(this); - - this.options = { isTemporary: isTemporary}; - }, - -}); diff --git a/lib/node/create.ts b/lib/node/create.ts new file mode 100644 index 00000000..66f2da00 --- /dev/null +++ b/lib/node/create.ts @@ -0,0 +1,13 @@ +'use strict'; + +import { Node } from '.'; + +export class CreateNode extends Node { + public options: { isTemporary: boolean }; + + constructor(isTemporary: boolean) { + super('CREATE'); + + this.options = { isTemporary }; + } +} diff --git a/lib/node/createIndex.js b/lib/node/createIndex.js deleted file mode 100644 index 8f8f0d04..00000000 --- a/lib/node/createIndex.js +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -var Node = require('./'); -var sliced = require('sliced'); - -module.exports = Node.define({ - type: 'CREATE INDEX', - - constructor: function(table, indexName) { - Node.call(this); - - this.table = table; - this.options = { indexName: indexName, columns: [] }; - }, - - unique: function() { - this.options.type = 'unique'; - return this; - }, - - spatial: function() { - this.options.type = 'spatial'; - return this; - }, - - fulltext: function() { - this.options.type = 'fulltext'; - return this; - }, - - using: function(algorithm) { - this.options.algorithm = algorithm; - return this; - }, - - on: function() { - var args = sliced(arguments); - this.options.columns = this.options.columns.concat(args); - return this; - }, - - withParser: function(parser) { - this.options.parser = parser; - return this; - }, - - indexName: function() { - var result = this.options.indexName; - - if (!result) { - var columns = this.options.columns.map(function(col) { - var column = col.name ? col.name : col.value.name; - return column; - }).sort(); - - result = [this.table._name]; - result = result.concat(columns); - result = result.join('_'); - } - - return result; - } -}); diff --git a/lib/node/createIndex.ts b/lib/node/createIndex.ts new file mode 100644 index 00000000..fdd7381d --- /dev/null +++ b/lib/node/createIndex.ts @@ -0,0 +1,67 @@ +'use strict'; + +import sliced = require('sliced'); +import { Node } from '.'; +import { Column } from '../column'; +import { Table } from '../table'; + +export class CreateIndexNode extends Node { + public table: Table; + public options: { + indexName: string; + columns: Array>; + type?: string; + algorithm?: string; + parser?: string; + }; + + constructor(table: Table, indexName: string) { + super('CREATE INDEX'); + + this.table = table; + this.options = { indexName, columns: [] }; + } + + public unique() { + this.options.type = 'unique'; + return this; + } + + public spatial() { + this.options.type = 'spatial'; + return this; + } + + public fulltext() { + this.options.type = 'fulltext'; + return this; + } + + public using(algorithm: string) { + this.options.algorithm = algorithm; + return this; + } + + public on(...columns: Array>) { + const args = sliced(columns); + this.options.columns = this.options.columns.concat(args); + return this; + } + + public withParser(parser: string) { + this.options.parser = parser; + return this; + } + + public indexName() { + let result = this.options.indexName; + + if (!result) { + const columns = this.options.columns.map((col) => (col.name ? col.name : col.value.name)).sort(); + + result = [this.table.getName(), ...columns].join('_'); + } + + return result; + } +} diff --git a/lib/node/createView.js b/lib/node/createView.js deleted file mode 100644 index 7d456d90..00000000 --- a/lib/node/createView.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'CREATE VIEW', - - constructor: function(viewName) { - Node.call(this); - - this.options = { viewName: viewName}; - } -}); diff --git a/lib/node/createView.ts b/lib/node/createView.ts new file mode 100644 index 00000000..3a3ce0ab --- /dev/null +++ b/lib/node/createView.ts @@ -0,0 +1,13 @@ +'use strict'; + +import { Node } from '.'; + +export class CreateViewNode extends Node { + public options: { viewName: string }; + + constructor(viewName: string) { + super('CREATE VIEW'); + + this.options = { viewName }; + } +} diff --git a/lib/node/default.js b/lib/node/default.js deleted file mode 100644 index b5adc894..00000000 --- a/lib/node/default.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -module.exports = require('./index').define({ - type: 'DEFAULT', - value: function() { - return; - } -}); diff --git a/lib/node/default.ts b/lib/node/default.ts new file mode 100644 index 00000000..cd6e8f53 --- /dev/null +++ b/lib/node/default.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class DefaultNode extends Node { + constructor() { + super('DEFAULT'); + } +} diff --git a/lib/node/delete.js b/lib/node/delete.js deleted file mode 100644 index 0d02ebab..00000000 --- a/lib/node/delete.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'DELETE' -}); diff --git a/lib/node/delete.ts b/lib/node/delete.ts new file mode 100644 index 00000000..f8ab1a05 --- /dev/null +++ b/lib/node/delete.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class DeleteNode extends Node { + constructor() { + super('DELETE'); + } +} diff --git a/lib/node/distinct.js b/lib/node/distinct.js deleted file mode 100644 index 8c681551..00000000 --- a/lib/node/distinct.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'DISTINCT', -}); diff --git a/lib/node/distinct.ts b/lib/node/distinct.ts new file mode 100644 index 00000000..fbcf7b91 --- /dev/null +++ b/lib/node/distinct.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class DistinctNode extends Node { + constructor() { + super('DISTINCT'); + } +} diff --git a/lib/node/distinctOn.js b/lib/node/distinctOn.js deleted file mode 100644 index 72c430e8..00000000 --- a/lib/node/distinctOn.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'DISTINCT ON', -}); diff --git a/lib/node/distinctOn.ts b/lib/node/distinctOn.ts new file mode 100644 index 00000000..76200e19 --- /dev/null +++ b/lib/node/distinctOn.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class DistinctOnNode extends Node { + constructor() { + super('DISTINCT ON'); + } +} diff --git a/lib/node/drop.js b/lib/node/drop.js deleted file mode 100644 index b0428347..00000000 --- a/lib/node/drop.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'DROP', - - constructor: function(table) { - Node.call(this); - this.add(table); - } -}); diff --git a/lib/node/drop.ts b/lib/node/drop.ts new file mode 100644 index 00000000..d450872a --- /dev/null +++ b/lib/node/drop.ts @@ -0,0 +1,11 @@ +'use strict'; + +import { Node } from '.'; +import { Table } from '../table'; + +export class DropNode extends Node { + constructor(table: Table) { + super('DROP'); + this.add(table); + } +} diff --git a/lib/node/dropColumn.js b/lib/node/dropColumn.js deleted file mode 100644 index 01fe36c5..00000000 --- a/lib/node/dropColumn.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'DROP COLUMN' -}); diff --git a/lib/node/dropColumn.ts b/lib/node/dropColumn.ts new file mode 100644 index 00000000..74f5cbed --- /dev/null +++ b/lib/node/dropColumn.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class DropColumnNode extends Node { + constructor() { + super('DROP COLUMN'); + } +} diff --git a/lib/node/dropIndex.js b/lib/node/dropIndex.js deleted file mode 100644 index 9b5e020d..00000000 --- a/lib/node/dropIndex.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -var Node = require('./'); - -module.exports = Node.define({ - type: 'DROP INDEX', - - constructor: function(table, indexName) { - if (!indexName) { - throw new Error('No index defined!'); - } else if (Array.isArray(indexName) && (typeof indexName[0] === 'string')) { - indexName = indexName[0]; - } else if (Array.isArray(indexName)) { - var columns = indexName.map(function(col) { return col.name; }).sort(); - indexName = [table._name].concat(columns).join('_'); - } - - Node.call(this); - - this.table = table; - this.options = { indexName: indexName }; - }, - - indexName: function() { - var result = this.options.indexName; - - if (!result) { - var columns = this.options.columns.map(function(col) { - return col.name; - }).sort(); - - result = [this.table._name]; - result = result.concat(columns); - result = result.join('_'); - } - - return result; - } -}); diff --git a/lib/node/dropIndex.ts b/lib/node/dropIndex.ts new file mode 100644 index 00000000..741787a3 --- /dev/null +++ b/lib/node/dropIndex.ts @@ -0,0 +1,26 @@ +'use strict'; + +import { Node } from '.'; +import { Column } from '../column'; +import { Table } from '../table'; + +export class DropIndexNode extends Node { + public table: Table; + public options: { indexName: string }; + + constructor(table: Table, indexName: string | string[] | Array>) { + super('DROP INDEX'); + + if (!indexName) { + throw new Error('No index defined!'); + } else if (Array.isArray(indexName) && typeof indexName[0] === 'string') { + indexName = indexName[0] as string; + } else if (Array.isArray(indexName)) { + const columns = (indexName as Array>).map((col) => col.name).sort(); + indexName = [table.getName()].concat(columns).join('_'); + } + + this.table = table; + this.options = { indexName }; + } +} diff --git a/lib/node/forShare.js b/lib/node/forShare.js deleted file mode 100644 index 68a83678..00000000 --- a/lib/node/forShare.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'FOR SHARE' -}); diff --git a/lib/node/forShare.ts b/lib/node/forShare.ts new file mode 100644 index 00000000..ea4e0630 --- /dev/null +++ b/lib/node/forShare.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class ForShareNode extends Node { + constructor() { + super('FOR SHARE'); + } +} diff --git a/lib/node/forUpdate.js b/lib/node/forUpdate.js deleted file mode 100644 index da4a2518..00000000 --- a/lib/node/forUpdate.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'FOR UPDATE' -}); diff --git a/lib/node/forUpdate.ts b/lib/node/forUpdate.ts new file mode 100644 index 00000000..3f7fe154 --- /dev/null +++ b/lib/node/forUpdate.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class ForUpdateNode extends Node { + constructor() { + super('FOR UPDATE'); + } +} diff --git a/lib/node/foreignKey.js b/lib/node/foreignKey.js deleted file mode 100644 index a0ad99c1..00000000 --- a/lib/node/foreignKey.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'FOREIGN KEY', - constructor: function(config) { - Node.call(this); - this.name = config.name; - this.columns = config.columns; - this.schema = config.schema; - this.table = config.table; - this.refColumns = config.refColumns; - this.onUpdate = config.onUpdate; - this.onDelete = config.onDelete; - this.constraint = config.constraint; - } -}); - diff --git a/lib/node/foreignKey.ts b/lib/node/foreignKey.ts new file mode 100644 index 00000000..f63a7f41 --- /dev/null +++ b/lib/node/foreignKey.ts @@ -0,0 +1,34 @@ +'use strict'; + +import { Node } from '.'; + +export class ForeignKeyNode extends Node { + public name?: string; + public columns: string[]; + public schema?: string; + public table: string; + public refColumns?: string[]; + public onUpdate?: string; + public onDelete?: string; + public constraint?: string; + constructor(config: { + table: string; + columns: string[]; + refColumns?: string[]; + onDelete?: string; + onUpdate?: string; + name?: string; + schema?: string; + constraint?: string; + }) { + super('FOREIGN KEY'); + this.name = config.name; + this.columns = config.columns; + this.schema = config.schema; + this.table = config.table; + this.refColumns = config.refColumns; + this.onUpdate = config.onUpdate; + this.onDelete = config.onDelete; + this.constraint = config.constraint; + } +} diff --git a/lib/node/from.js b/lib/node/from.js deleted file mode 100644 index 12b54565..00000000 --- a/lib/node/from.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -var From = Node.define({ - type: 'FROM' -}); - -module.exports = From; diff --git a/lib/node/from.ts b/lib/node/from.ts new file mode 100644 index 00000000..f16c3442 --- /dev/null +++ b/lib/node/from.ts @@ -0,0 +1,10 @@ +'use strict'; + +import { Node } from '.'; + +export class FromNode extends Node { + public skipFromStatement: boolean = false; + constructor() { + super('FROM'); + } +} diff --git a/lib/node/functionCall.js b/lib/node/functionCall.js deleted file mode 100644 index 608a3c1e..00000000 --- a/lib/node/functionCall.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var ParameterNode = require('./parameter'); -var valueExpressionMixin = require('./valueExpression'); - -var FunctionCallNode = Node.define({ - type: 'FUNCTION CALL', - constructor: function(name, args) { - Node.call(this); - this.name = name; - this.addAll(args.map(ParameterNode.getNodeOrParameterNode)); - } -}); - -// mix in value expression -_.extend(FunctionCallNode.prototype, valueExpressionMixin()); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(FunctionCallNode.prototype, AliasNode.AliasMixin); - -module.exports = FunctionCallNode; diff --git a/lib/node/functionCall.ts b/lib/node/functionCall.ts new file mode 100644 index 00000000..64f81faa --- /dev/null +++ b/lib/node/functionCall.ts @@ -0,0 +1,20 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, ParameterNode, valueExpressionMixin } from '.'; + +export class FunctionCallNode extends Node { + public name: string; + constructor(name: string, args: any[]) { + super('FUNCTION CALL'); + this.name = name; + this.addAll(args.map(ParameterNode.getNodeOrParameterNode)); + } +} + +// mix in value expression +_.extend(FunctionCallNode.prototype, valueExpressionMixin()); + +_.extend(FunctionCallNode.prototype, AliasNode.AliasMixin); + +export interface FunctionCallNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/groupBy.js b/lib/node/groupBy.js deleted file mode 100644 index 53f63e94..00000000 --- a/lib/node/groupBy.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'GROUP BY' -}); diff --git a/lib/node/groupBy.ts b/lib/node/groupBy.ts new file mode 100644 index 00000000..efb1eada --- /dev/null +++ b/lib/node/groupBy.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class GroupByNode extends Node { + constructor() { + super('GROUP BY'); + } +} diff --git a/lib/node/having.js b/lib/node/having.js deleted file mode 100644 index 6f1523ac..00000000 --- a/lib/node/having.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'HAVING' -}); diff --git a/lib/node/having.ts b/lib/node/having.ts new file mode 100644 index 00000000..73dc4195 --- /dev/null +++ b/lib/node/having.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class HavingNode extends Node { + constructor() { + super('HAVING'); + } +} diff --git a/lib/node/ifExists.js b/lib/node/ifExists.js deleted file mode 100644 index c26df660..00000000 --- a/lib/node/ifExists.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'IF EXISTS' -}); diff --git a/lib/node/ifExists.ts b/lib/node/ifExists.ts new file mode 100644 index 00000000..3c46c4bd --- /dev/null +++ b/lib/node/ifExists.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class IfExistsNode extends Node { + constructor() { + super('IF EXISTS'); + } +} diff --git a/lib/node/ifNotExists.js b/lib/node/ifNotExists.js deleted file mode 100644 index d731ccb2..00000000 --- a/lib/node/ifNotExists.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'IF NOT EXISTS' -}); diff --git a/lib/node/ifNotExists.ts b/lib/node/ifNotExists.ts new file mode 100644 index 00000000..f4970129 --- /dev/null +++ b/lib/node/ifNotExists.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class IfNotExistsNode extends Node { + constructor() { + super('IF NOT EXISTS'); + } +} diff --git a/lib/node/in.js b/lib/node/in.js deleted file mode 100644 index 233b7c28..00000000 --- a/lib/node/in.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var InNode = Node.define(_.extend({ - type: 'IN', - constructor: function(config) { - Node.call(this); - this.left = config.left; - this.right = config.right; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(InNode.prototype, valueExpressionMixin()); - } - }, -})); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(InNode.prototype, AliasNode.AliasMixin); - -module.exports = InNode; diff --git a/lib/node/in.ts b/lib/node/in.ts new file mode 100644 index 00000000..c126c9de --- /dev/null +++ b/lib/node/in.ts @@ -0,0 +1,26 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class InNode extends Node { + public left: Node; + public right: Node; + constructor(config: { left: Node; right: Node }) { + super('IN'); + this.left = config.left; + this.right = config.right; + + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(InNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(InNode.prototype, AliasNode.AliasMixin); + +export interface InNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/index.js b/lib/node/index.js deleted file mode 100644 index 66c0e481..00000000 --- a/lib/node/index.js +++ /dev/null @@ -1,101 +0,0 @@ -'use strict'; - -var assert = require('assert'); -var getDialect = require('../dialect'); -var util = require('util'); - -var Node = function(type) { - /* jshint unused: false */ - this.nodes = []; -}; - -Node.prototype.toNode = function() { - return this; -}; - -Node.prototype.add = function(node) { - assert(node, 'Error while trying to add a non-existant node to a query'); - var newNode; - if (typeof node === 'string') newNode = new TextNode(node); - else if (node.toNode) newNode = node.toNode(); - else newNode = node; - this.nodes.push(newNode); - return this; -}; - -Node.prototype.unshift = function(node) { - assert(node, 'Error while trying to add a non-existant node to a query'); - this.nodes.unshift(typeof node === 'string' ? new TextNode(node) : node.toNode()); - return this; -}; - -// Before the change that introduced parallel dialects, every node could be turned -// into a query. The parallel dialects change made it impossible to change some nodes -// into a query because not all nodes are constructed with the sql instance. -var determineDialect = function(query, dialect) { - var sql = query.sql || (query.table && query.table.sql); - var Dialect; - - if (dialect) { - // dialect is specified - Dialect = getDialect(dialect); - } else if (sql && sql.dialect) { - // dialect is not specified, use the dialect from the sql instance - Dialect = sql.dialect; - } else { - // dialect is not specified, use the default dialect - Dialect = require('../').dialect; - } - return Dialect; -}; - -var initializeDialect = function(Dialect, query) { - var config = query.sql ? query.sql.config : {}; - return new Dialect(config); -}; - -Node.prototype.toQuery = function(dialect) { - var Dialect = determineDialect(this, dialect); - return initializeDialect(Dialect, this).getQuery(this); -}; - -Node.prototype.toNamedQuery = function(name, dialect) { - if (!name || typeof name !== 'string' || name === '') { - throw new Error('A query name has to be a non-empty String.'); - } - var query = this.toQuery(dialect); - query.name = name; - return query; -}; - -Node.prototype.toString = function(dialect) { - var Dialect = determineDialect(this, dialect); - return initializeDialect(Dialect, this).getString(this); -}; - -Node.prototype.addAll = function(nodes) { - for(var i = 0, len = nodes.length; i < len; i++) { - this.add(nodes[i]); - } - return this; -}; - -Node.define = function(def) { - var c = function() { - Node.call(this); - }; - // allow custom sub-class constructor - if(def.constructor && def.constructor !== {}.constructor) { - c = def.constructor; - } - util.inherits(c, Node); - for (var key in def) { - if (def.hasOwnProperty(key)) { - c.prototype[key] = def[key]; - } - } - return c; -}; - -module.exports = Node; -var TextNode = require('./text'); diff --git a/lib/node/index.ts b/lib/node/index.ts new file mode 100644 index 00000000..553a35ea --- /dev/null +++ b/lib/node/index.ts @@ -0,0 +1,65 @@ +export * from './node'; + +export * from './valueExpression'; + +export * from './text'; + +export * from './select'; +export * from './insert'; +export * from './replace'; +export * from './update'; +export * from './delete'; +export * from './create'; +export * from './drop'; +export * from './truncate'; +export * from './distinct'; +export * from './distinctOn'; +export * from './alias'; +export * from './alter'; +export * from './cast'; +export * from './from'; +export * from './where'; +export * from './orderBy'; +export * from './orderByValue'; +export * from './groupBy'; +export * from './having'; +export * from './prefixUnary'; +export * from './postfixUnary'; +export * from './binary'; +export * from './ternary'; +export * from './in'; +export * from './notIn'; +export * from './case'; +export * from './at'; +export * from './slice'; +export * from './table'; +export * from './column'; +export * from './foreignKey'; +export * from './functionCall'; +export * from './arrayCall'; +export * from './parameter'; +export * from './default'; +export * from './addColumn'; +export * from './dropColumn'; +export * from './renameColumn'; +export * from './rename'; +export * from './ifExists'; +export * from './ifNotExists'; +export * from './orIgnore'; +export * from './cascade'; +export * from './restrict'; +export * from './forUpdate'; +export * from './forShare'; +export * from './join'; +export * from './literal'; +export * from './returning'; +export * from './onDuplicate'; +export * from './onConflict'; +export * from './indexes'; +export * from './createIndex'; +export * from './dropIndex'; +export * from './createView'; +export * from './interval'; +export * from './modifier'; + +export * from './query'; diff --git a/lib/node/indexes.js b/lib/node/indexes.js deleted file mode 100644 index b1614a9a..00000000 --- a/lib/node/indexes.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -var Node = require('./'); - -var IndexesNode = Node.define({ - type: 'INDEXES', - - constructor: function(table) { - Node.call(this); - - this.table = table; - } -}); - -module.exports = IndexesNode; diff --git a/lib/node/indexes.ts b/lib/node/indexes.ts new file mode 100644 index 00000000..74334887 --- /dev/null +++ b/lib/node/indexes.ts @@ -0,0 +1,14 @@ +'use strict'; + +import { Node } from '.'; +import { Table } from '../table'; + +export class IndexesNode extends Node { + public table: Table; + + constructor(table: Table) { + super('INDEXES'); + + this.table = table; + } +} diff --git a/lib/node/insert.js b/lib/node/insert.js deleted file mode 100644 index 9cd12fbe..00000000 --- a/lib/node/insert.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - -var DefaultNode = require('./default'); -var Node = require('./'); -var ParameterNode = require('./parameter'); - -var Insert = Node.define({ - type: 'INSERT', - constructor: function () { - Node.call(this); - this.names = []; - this.columns = []; - this.valueSets = []; - } -}); - -module.exports = Insert; - -Insert.prototype.add = function (nodes) { - var hasColumns = false; - var hasValues = false; - var self = this; - var values = {}; - nodes.forEach(function (node) { - var column = node.toNode(); - var name = column.name; - var idx = self.names.indexOf(name); - if (idx < 0) { - self.names.push(name); - self.columns.push(column); - } - hasColumns = true; - hasValues = hasValues || column.value !== undefined; - values[name] = column; - }); - - // When none of the columns have a value, it's ambiguous whether the user - // intends to insert a row of default values or append a SELECT statement - // later. Resolve the ambiguity by assuming that if no columns are specified - // it is a row of default values, otherwise a SELECT will be added. - if (hasValues || !hasColumns) { - this.valueSets.push(values); - } - - return self; -}; - -/* - * Get parameters for all values to be inserted. This function - * handles handles bulk inserts, where keys may be present - * in some objects and not others. When keys are not present, - * the insert should refer to the column value as DEFAULT. - */ -Insert.prototype.getParameters = function () { - var self = this; - return this.valueSets - .map(function (nodeDict) { - var set = []; - self.names.forEach(function (name) { - var node = nodeDict[name]; - if (node) { - set.push(ParameterNode.getNodeOrParameterNode(node.value)); - } - else { - set.push(new DefaultNode()); - } - }); - return set; - }); -}; diff --git a/lib/node/insert.ts b/lib/node/insert.ts new file mode 100644 index 00000000..52c73151 --- /dev/null +++ b/lib/node/insert.ts @@ -0,0 +1,69 @@ +'use strict'; + +import { ColumnNode, DefaultNode, Node, ParameterNode } from '.'; +import { Column } from '../column'; +import { INodeable } from '../nodeable'; + +export class InsertNode extends Node { + public names: string[]; + public columns: ColumnNode[]; + public valueSets: Array<{ [key: string]: ColumnNode }>; + constructor() { + super('INSERT'); + this.names = []; + this.columns = []; + this.valueSets = []; + } + + public add(nodes: Array> | Node | INodeable | string): this { + if (!Array.isArray(nodes)) { + throw new Error('Not an array of column instances'); + } + let hasColumns = false; + let hasValues = false; + const values: { [key: string]: ColumnNode } = {}; + nodes.forEach((node) => { + const column = node.toNode(); + const name = column.name; + const idx = this.names.indexOf(name); + if (idx < 0) { + this.names.push(name); + this.columns.push(column); + } + hasColumns = true; + hasValues = hasValues || column.value !== undefined; + values[name] = column; + }); + + // When none of the columns have a value, it's ambiguous whether the user + // intends to insert a row of default values or append a SELECT statement + // later. Resolve the ambiguity by assuming that if no columns are specified + // it is a row of default values, otherwise a SELECT will be added. + if (hasValues || !hasColumns) { + this.valueSets.push(values); + } + + return this; + } + + /* + * Get parameters for all values to be inserted. This function + * handles handles bulk inserts, where keys may be present + * in some objects and not others. When keys are not present, + * the insert should refer to the column value as DEFAULT. + */ + public getParameters() { + return this.valueSets.map((nodeDict) => { + const set: Node[] = []; + this.names.forEach((name) => { + const node = nodeDict[name]; + if (node) { + set.push(ParameterNode.getNodeOrParameterNode(node.value)); + } else { + set.push(new DefaultNode()); + } + }); + return set; + }); + } +} diff --git a/lib/node/interval.js b/lib/node/interval.js deleted file mode 100644 index 9f46f9ab..00000000 --- a/lib/node/interval.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -var Node = require('./index'); -var ParameterNode = require('./parameter'); - -var IntervalNode = Node.define({ - type: 'INTERVAL', - constructor: function(args) { - Node.call(this); - var interval = args[0] || {}; - this.years = interval.years; - this.months = interval.months; - this.days = interval.days; - this.hours = interval.hours; - this.minutes = interval.minutes; - this.seconds = interval.seconds; - } -}); - -module.exports = IntervalNode; - diff --git a/lib/node/interval.ts b/lib/node/interval.ts new file mode 100644 index 00000000..2bccb4a2 --- /dev/null +++ b/lib/node/interval.ts @@ -0,0 +1,31 @@ +'use strict'; + +import { Node } from '.'; + +interface Interval { + years: number; + months: number; + days: number; + hours: number; + minutes: number; + seconds: number; +} + +export class IntervalNode extends Node { + public years: number; + public months: number; + public days: number; + public hours: number; + public minutes: number; + public seconds: number; + constructor(args: Interval[]) { + super('INTERVAL'); + const interval = args[0] || {}; + this.years = interval.years; + this.months = interval.months; + this.days = interval.days; + this.hours = interval.hours; + this.minutes = interval.minutes; + this.seconds = interval.seconds; + } +} diff --git a/lib/node/join.js b/lib/node/join.js deleted file mode 100644 index bbc1f93a..00000000 --- a/lib/node/join.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -var Node = require('./index'); -var JoinNode = module.exports = Node.define({ - type: 'JOIN', - constructor: function(subType, from, to) { - Node.call(this); - this.sql = (from.table && from.table.sql) || (to.table && to.table.sql); - this.subType = subType; - this.from = from.toNode(); - this.to = to.toNode(); - }, - on: function(node) { - this.on = node; - return this; - }, - join: function(other) { - return new JoinNode('INNER', this, other); - }, - leftJoin: function(other) { - return new JoinNode('LEFT', this, other); - } -}); diff --git a/lib/node/join.ts b/lib/node/join.ts new file mode 100644 index 00000000..641713ee --- /dev/null +++ b/lib/node/join.ts @@ -0,0 +1,29 @@ +'use strict'; + +import { Node } from '.'; +import { INodeable } from '../nodeable'; +import { hasTable } from '../tableTracker'; + +export class JoinNode extends Node { + public subType: string; + public from: Node; + public to: Node; + public onNode!: Node; + constructor(subType: string, from: INodeable, to: INodeable) { + super('JOIN'); + this.sql = (hasTable(from) && from.table.sql) || (hasTable(to) && to.table.sql) || undefined; + this.subType = subType; + this.from = from.toNode(); + this.to = to.toNode(); + } + public on(node: Node) { + this.onNode = node; + return this; + } + public join(other: INodeable) { + return new JoinNode('INNER', this, other); + } + public leftJoin(other: INodeable) { + return new JoinNode('LEFT', this, other); + } +} diff --git a/lib/node/literal.js b/lib/node/literal.js deleted file mode 100644 index f5a1ea58..00000000 --- a/lib/node/literal.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'LITERAL', - constructor: function(literal) { - Node.call(this); - this.literal = literal; - this.alias = null; - }, - as: function(alias) { - this.alias = alias; - return this; - } -}); diff --git a/lib/node/literal.ts b/lib/node/literal.ts new file mode 100644 index 00000000..6b9e2030 --- /dev/null +++ b/lib/node/literal.ts @@ -0,0 +1,17 @@ +'use strict'; + +import { Node } from '.'; + +export class LiteralNode extends Node { + public literal: string; + public alias?: string; + constructor(literal: string) { + super('LITERAL'); + this.literal = literal; + this.alias = undefined; + } + public as(alias: string) { + this.alias = alias; + return this; + } +} diff --git a/lib/node/modifier.ts b/lib/node/modifier.ts new file mode 100644 index 00000000..a9efcbe7 --- /dev/null +++ b/lib/node/modifier.ts @@ -0,0 +1,11 @@ +import { Node, ParameterNode, Query } from '.'; + +export class ModifierNode extends Node { + public query: Query; + public count: Node; + constructor(query: Query, type: 'LIMIT' | 'OFFSET', count: any) { + super(type); + this.query = query; + this.count = ParameterNode.getNodeOrParameterNode(count); + } +} diff --git a/lib/node/node.ts b/lib/node/node.ts new file mode 100644 index 00000000..f97c06a2 --- /dev/null +++ b/lib/node/node.ts @@ -0,0 +1,86 @@ +'use strict'; + +import assert = require('assert'); +import { TextNode } from '.'; +import { Sql } from '..'; +import { DEFAULT_DIALECT, getDialect } from '../dialect'; +import { INodeable, instanceofINodeable } from '../nodeable'; + +export abstract class Node implements INodeable { + public sql?: Sql; + public readonly type: string; + public nodes: Node[]; + constructor(type: string) { + this.type = type; + this.nodes = []; + } + public toNode() { + return this; + } + public add(node: Node | INodeable | string) { + assert(node, 'Error while trying to add a non-existant node to a query'); + let newNode; + if (typeof node === 'string') { + newNode = new TextNode(node); + } else if (instanceofINodeable(node)) { + newNode = node.toNode(); + } else { + newNode = node; + } + this.nodes.push(newNode as Node); + return this; + } + public unshift(node: Node | INodeable | string) { + assert(node, 'Error while trying to add a non-existant node to a query'); + this.nodes.unshift(typeof node === 'string' ? new TextNode(node) : node.toNode()); + return this; + } + public toQuery(dialect?: string) { + const Dialect = determineDialect(this, dialect); + return initializeDialect(Dialect, this).getQuery(this); + } + public toNamedQuery(name: string, dialect?: string) { + if (!name || typeof name !== 'string' || name === '') { + throw new Error('A query name has to be a non-empty String.'); + } + const query = this.toQuery(dialect); + query.name = name; + return query; + } + public toString(dialect?: string) { + const Dialect = determineDialect(this, dialect); + return initializeDialect(Dialect, this).getString(this); + } + public addAll(nodes: Array) { + for (let i = 0, len = nodes.length; i < len; i++) { + this.add(nodes[i]); + } + return this; + } +} + +// Before the change that introduced parallel dialects, every node could be turned +// into a query. The parallel dialects change made it impossible to change some nodes +// into a query because not all nodes are constructed with the sql instance. +const determineDialect = (query: any, dialect?: string) => { + const sql = query.sql || (query.table && query.table.sql); + let Dialect; + + if (dialect) { + // dialect is specified + Dialect = getDialect(dialect); + } else if (sql && sql.dialect) { + // dialect is not specified, use the dialect from the sql instance + Dialect = sql.dialect; + } else { + // dialect is not specified, use the default dialect + Dialect = getDialect(DEFAULT_DIALECT); + } + return Dialect; +}; + +const initializeDialect = (Dialect: any, query: any) => { + const sql = query.sql || (query.table && query.table.sql); + const config = sql ? sql.config : {}; + return new Dialect(config); +}; diff --git a/lib/node/notIn.js b/lib/node/notIn.js deleted file mode 100644 index c50976c3..00000000 --- a/lib/node/notIn.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var NotInNode = Node.define(_.extend({ - type: 'NOT IN', - constructor: function(config) { - Node.call(this); - this.left = config.left; - this.right = config.right; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(NotInNode.prototype, valueExpressionMixin()); - } - }, -})); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(NotInNode.prototype, AliasNode.AliasMixin); - -module.exports = NotInNode; diff --git a/lib/node/notIn.ts b/lib/node/notIn.ts new file mode 100644 index 00000000..ec07298a --- /dev/null +++ b/lib/node/notIn.ts @@ -0,0 +1,26 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class NotInNode extends Node { + public left: Node; + public right: Node; + constructor(config: { left: Node; right: Node }) { + super('NOT IN'); + this.left = config.left; + this.right = config.right; + + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(NotInNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(NotInNode.prototype, AliasNode.AliasMixin); + +export interface NotInNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/onConflict.js b/lib/node/onConflict.js deleted file mode 100644 index cc71ac47..00000000 --- a/lib/node/onConflict.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'ONCONFLICT' -}); diff --git a/lib/node/onConflict.ts b/lib/node/onConflict.ts new file mode 100644 index 00000000..b4f73479 --- /dev/null +++ b/lib/node/onConflict.ts @@ -0,0 +1,16 @@ +'use strict'; + +import { Node } from '.'; + +export class OnConflictNode extends Node { + public columns?: string[]; + public constraint?: string; + public update?: string[]; + + constructor(config: { columns?: string[]; constraint?: string; update?: string[] }) { + super('ONCONFLICT'); + this.columns = config.columns; + this.constraint = config.constraint; + this.update = config.update; + } +} diff --git a/lib/node/onDuplicate.js b/lib/node/onDuplicate.js deleted file mode 100644 index cd653cb3..00000000 --- a/lib/node/onDuplicate.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'ONDUPLICATE' -}); diff --git a/lib/node/onDuplicate.ts b/lib/node/onDuplicate.ts new file mode 100644 index 00000000..97e47abf --- /dev/null +++ b/lib/node/onDuplicate.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class OnDuplicateNode extends Node { + constructor() { + super('ONDUPLICATE'); + } +} diff --git a/lib/node/orIgnore.js b/lib/node/orIgnore.js deleted file mode 100644 index e23c9d6d..00000000 --- a/lib/node/orIgnore.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'OR IGNORE' -}); diff --git a/lib/node/orIgnore.ts b/lib/node/orIgnore.ts new file mode 100644 index 00000000..f6a4c7db --- /dev/null +++ b/lib/node/orIgnore.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class OrIgnoreNode extends Node { + constructor() { + super('OR IGNORE'); + } +} diff --git a/lib/node/orderBy.js b/lib/node/orderBy.js deleted file mode 100644 index b97fb891..00000000 --- a/lib/node/orderBy.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'ORDER BY' -}); diff --git a/lib/node/orderBy.ts b/lib/node/orderBy.ts new file mode 100644 index 00000000..9af595e0 --- /dev/null +++ b/lib/node/orderBy.ts @@ -0,0 +1,14 @@ +'use strict'; + +import { ModifierNode, Node } from '.'; + +export class OrderByNode extends Node { + public msSQLOffsetNode?: ModifierNode; + public msSQLLimitNode?: ModifierNode; + constructor() { + super('ORDER BY'); + // used when processing OFFSET and LIMIT clauses in MSSQL + this.msSQLOffsetNode = undefined; + this.msSQLLimitNode = undefined; + } +} diff --git a/lib/node/orderByValue.js b/lib/node/orderByValue.js deleted file mode 100644 index 47a8d5c0..00000000 --- a/lib/node/orderByValue.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -var OrderByColumn = Node.define({ - type: 'ORDER BY VALUE', - constructor: function(config) { - Node.call(this); - this.value = config.value; - this.direction = config.direction; - // used when processing OFFSET and LIMIT clauses in MSSQL - this.msSQLOffsetNode=undefined; - this.msSQLLimitNode=undefined; - } -}); - - module.exports = OrderByColumn; diff --git a/lib/node/orderByValue.ts b/lib/node/orderByValue.ts new file mode 100644 index 00000000..0e9f4f27 --- /dev/null +++ b/lib/node/orderByValue.ts @@ -0,0 +1,13 @@ +'use strict'; + +import { Node, TextNode } from '.'; + +export class OrderByValueNode extends Node { + public value: Node; + public direction?: TextNode; + constructor(config: { value: Node; direction?: TextNode }) { + super('ORDER BY VALUE'); + this.value = config.value; + this.direction = config.direction; + } +} diff --git a/lib/node/parameter.js b/lib/node/parameter.js deleted file mode 100644 index 051ed852..00000000 --- a/lib/node/parameter.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -var ParameterNode = module.exports = Node.define({ - type: 'PARAMETER', - constructor: function(val) { - Node.call(this); - this._val = val; - this.isExplicit = false; - }, - value: function() { - return this._val; - } -}); - -// wrap a value as a parameter node if value is not already a node -module.exports.getNodeOrParameterNode = function(value) { - if (value && value.toNode) { - // use toNode - return value.toNode(); - } else { - // wrap as parameter node - return new ParameterNode(value); - } -}; diff --git a/lib/node/parameter.ts b/lib/node/parameter.ts new file mode 100644 index 00000000..08430bf0 --- /dev/null +++ b/lib/node/parameter.ts @@ -0,0 +1,27 @@ +'use strict'; + +import { Node } from '.'; +import { INodeable, instanceofINodeable } from '../nodeable'; + +export class ParameterNode extends Node { + // wrap a value as a parameter node if value is not already a node + public static getNodeOrParameterNode(value?: INodeable) { + if (value && instanceofINodeable(value)) { + // use toNode + return value.toNode(); + } else { + // wrap as parameter node + return new ParameterNode(value); + } + } + public isExplicit: boolean; + private val: any; + constructor(val: any) { + super('PARAMETER'); + this.val = val; + this.isExplicit = false; + } + public value() { + return this.val; + } +} diff --git a/lib/node/postfixUnary.js b/lib/node/postfixUnary.js deleted file mode 100644 index 8c66b89f..00000000 --- a/lib/node/postfixUnary.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var PostfixUnaryNode = Node.define({ - type: 'POSTFIX UNARY', - constructor: function(config) { - Node.call(this); - this.left = config.left; - this.operator = config.operator; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(PostfixUnaryNode.prototype, valueExpressionMixin()); - } - } -}); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(PostfixUnaryNode.prototype, AliasNode.AliasMixin); - -module.exports = PostfixUnaryNode; diff --git a/lib/node/postfixUnary.ts b/lib/node/postfixUnary.ts new file mode 100644 index 00000000..e3f1947f --- /dev/null +++ b/lib/node/postfixUnary.ts @@ -0,0 +1,26 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class PostfixUnaryNode extends Node { + public left: Node; + public operator: string; + constructor(config: { left: Node; operator: string }) { + super('POSTFIX UNARY'); + this.left = config.left; + this.operator = config.operator; + + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(PostfixUnaryNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(PostfixUnaryNode.prototype, AliasNode.AliasMixin); + +export interface PostfixUnaryNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/prefixUnary.js b/lib/node/prefixUnary.js deleted file mode 100644 index fbde69c0..00000000 --- a/lib/node/prefixUnary.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var PrefixUnaryNode = Node.define({ - type: 'PREFIX UNARY', - constructor: function(config) { - Node.call(this); - this.left = config.left; - this.operator = config.operator; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(PrefixUnaryNode.prototype, valueExpressionMixin()); - } - } -}); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(PrefixUnaryNode.prototype, AliasNode.AliasMixin); - -module.exports = PrefixUnaryNode; diff --git a/lib/node/prefixUnary.ts b/lib/node/prefixUnary.ts new file mode 100644 index 00000000..de9bc30f --- /dev/null +++ b/lib/node/prefixUnary.ts @@ -0,0 +1,26 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class PrefixUnaryNode extends Node { + public left: Node; + public operator: string; + constructor(config: { left: Node; operator: string }) { + super('PREFIX UNARY'); + this.left = config.left; + this.operator = config.operator; + + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(PrefixUnaryNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(PrefixUnaryNode.prototype, AliasNode.AliasMixin); + +export interface PrefixUnaryNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/query.js b/lib/node/query.js deleted file mode 100644 index ebb3ecfa..00000000 --- a/lib/node/query.js +++ /dev/null @@ -1,552 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var alias = require('./alias'); -var assert = require('assert'); -var sliced = require('sliced'); -var util = require('util'); -var valueExpressionMixin = require('./valueExpression'); - -var Node = require('./'); -var Select = require('./select'); -var From = require('./from'); -var Where = require('./where'); -var OrderBy = require('./orderBy'); -var GroupBy = require('./groupBy'); -var Having = require('./having'); -var Insert = require('./insert'); -var Replace = require('./replace'); -var Update = require('./update'); -var Delete = require('./delete'); -var Returning = require('./returning'); -var OnDuplicate = require('./onDuplicate'); -var OnConflict = require('./onConflict'); -var ForUpdate = require('./forUpdate'); -var ForShare = require('./forShare'); -var Create = require('./create'); -var Drop = require('./drop'); -var Truncate = require('./truncate'); -var Distinct = require('./distinct'); -var DistinctOn = require('./distinctOn'); -var Alter = require('./alter'); -var AddColumn = require('./addColumn'); -var DropColumn = require('./dropColumn'); -var RenameColumn = require('./renameColumn'); -var Rename = require('./rename'); -var Column = require('../column'); -var ParameterNode = require('./parameter'); -var PrefixUnaryNode = require('./prefixUnary'); -var IfExists = require('./ifExists'); -var IfNotExists = require('./ifNotExists'); -var OrIgnore = require('./orIgnore'); -var Cascade = require('./cascade'); -var Restrict = require('./restrict'); -var Indexes = require('./indexes'); -var CreateIndex = require('./createIndex'); -var DropIndex = require('./dropIndex'); -var Table = require('./table'); -var CreateView = require('./createView'); -var JoinNode = require('./join'); - -var Modifier = Node.define({ - constructor: function(table, type, count) { - this.table = table; - this.type = type; - this.count = count; - } -}); - -// get the first element of an arguments if it is an array, else return arguments as an array -var getArrayOrArgsAsArray = function(args) { - if (util.isArray(args[0])) { - return args[0]; - } - return sliced(args); -}; - -var Query = Node.define({ - type: 'QUERY', - - constructor: function(table) { - Node.call(this); - this.table = table; - if (table) { - this.sql = table.sql; - } - }, - - select: function() { - var select; - if (this._select) { - select = this._select; - } else { - select = this._select = new Select(); - this.add(select); - } - - //allow things like .select(a.star(), [ a.id, a.name ]) - //this will flatten them into a single array - var args = sliced(arguments).reduce(function(cur, next) { - if (util.isArray(next)) { - return cur.concat(next); - } - - cur.push(next); - return cur; - }, []); - - select.addAll(args); - - // if this is a subquery then add reference to this column - if (this.type === 'SUBQUERY') { - for (var j = 0; j < select.nodes.length; j++) { - var name = select.nodes[j].alias || select.nodes[j].name; - var col = new Column(select.nodes[j]); - col.name = name; - col.property = name; - col.table = this; - if (this[name] === undefined) { - this[name] = col; - } - } - } - return this; - }, - - star: function() { - assert(this.type === 'SUBQUERY', 'star() can only be used on a subQuery'); - return new Column({ - table: this, - star: true - }); - }, - - from: function() { - var tableNodes = arguments; - - if (Array.isArray(arguments[0])) { - tableNodes = arguments[0]; - } - - for (var i=0; i 1) { - // allow multiple where clause arguments - var args = sliced(arguments); - for (var i = 0; i < args.length; i++) { - this.where(args[i]); - } - return this; - } - // calling #where twice functions like calling #where & then #and - if (this.whereClause) { - return this.and(node); - } - this.whereClause = new Where(this.table); - this.whereClause.add(node); - return this.add(this.whereClause); - }, - - or: function(node) { - if (!this.whereClause) return this.where(node); - this.whereClause.or(node); - return this; - }, - - and: function(node) { - if (!this.whereClause) return this.where(node); - this.whereClause.and(node); - return this; - }, - - order: function() { - var args = getArrayOrArgsAsArray(arguments); - var orderBy; - if (args.length === 0) { - return this; - } - if (this._orderBy) { - orderBy = this._orderBy; - } else { - orderBy = this._orderBy = new OrderBy(); - this.add(orderBy); - } - orderBy.addAll(args); - return this; - }, - - group: function() { - var args = getArrayOrArgsAsArray(arguments); - var groupBy = new GroupBy().addAll(args); - return this.add(groupBy); - }, - - having: function() { - var args = getArrayOrArgsAsArray(arguments); - var having = new Having().addAll(args); - return this.add(having); - }, - - insert: function(o) { - var self = this; - - var args = sliced(arguments); - // object literal - if (arguments.length === 1 && !o.toNode && !o.forEach) { - args = []; - Object.keys(o).forEach(function(key) { - var col = self.table.get(key); - if(col && !col.autoGenerated) - args.push(col.value(o[key])); - }); - } else if (o.forEach) { - o.forEach(function(arg) { - return self.insert.call(self, arg); - }); - return self; - } - - if (self.insertClause) { - self.insertClause.add(args); - return self; - } else { - self.insertClause = new Insert(); - self.insertClause.add(args); - return self.add(self.insertClause); - } - - }, - - replace: function(o) { - var self = this; - - var args = sliced(arguments); - // object literal - if (arguments.length === 1 && !o.toNode && !o.forEach) { - args = []; - Object.keys(o).forEach(function(key) { - var col = self.table.get(key); - if(col && !col.autoGenerated) - args.push(col.value(o[key])); - }); - } else if (o.forEach) { - o.forEach(function(arg) { - return self.replace.call(self, arg); - }); - return self; - } - - if (self.replaceClause) { - self.replaceClause.add(args); - return self; - } else { - self.replaceClause = new Replace(); - self.replaceClause.add(args); - return self.add(self.replaceClause); - } - - }, - - update: function(o) { - var self = this; - var update = new Update(); - Object.keys(o).forEach(function(key) { - var col = self.table.get(key); - if(col && !col.autoGenerated) { - var val = o[key]; - update.add(col.value(ParameterNode.getNodeOrParameterNode(val))); - } - }); - return this.add(update); - }, - - parameter: function(v) { - var param = ParameterNode.getNodeOrParameterNode(v); - param.isExplicit = true; - return this.add(param); - }, - - delete: function(params) { - var result; - if (params) { - var TableDefinition = require('../table'); - if (params instanceof TableDefinition || Array.isArray(params)) { - //handle explicit delete queries: - // e.g. post.delete(post).from(post) -> DELETE post FROM post - // e.g. post.delete([post, user]).from(post) -> DELETE post, user FROM post - if (Array.isArray(params)) { - params = params.map(function(table) { return new Table(table); }); - } else { - params = [ new Table(params) ]; - } - result = this.add(new Delete().addAll(params)); - } else { - //syntax sugar for post.delete().from(post).where(params) - result = this.add(new Delete()).where(params); - } - } else{ - result = this.add(new Delete()); - } - return result; - }, - - returning: function() { - var returning = new Returning(); - if (arguments.length === 0) - returning.add('*'); - else - returning.addAll(getArrayOrArgsAsArray(arguments)); - - return this.add(returning); - }, - - onDuplicate: function(o) { - var self = this; - - var onDuplicate = new OnDuplicate(); - Object.keys(o).forEach(function(key) { - var col = self.table.get(key); - if(col && !col.autoGenerated) - var val = o[key]; - onDuplicate.add(col.value(ParameterNode.getNodeOrParameterNode(val))); // jshint ignore:line - }); - - return self.add(onDuplicate); - }, - - onConflict: function(o) { - var self = this; - - var onConflict = new OnConflict(); - Object.keys(o).forEach(function(key) { - onConflict[key] = o[key]; - }); - return self.add(onConflict); - }, - - forUpdate: function() { - assert(typeof this._select !== 'undefined', 'FOR UPDATE can be used only in a select statement'); - this.add(new ForUpdate()); - return this; - }, - - forShare: function() { - assert(typeof this._select !== 'undefined', 'FOR SHARE can be used only in a select statement'); - this.add(new ForShare()); - return this; - }, - - create: function(indexName) { - if (this.indexesClause) { - var createIndex = new CreateIndex(this.table, indexName); - this.add(createIndex); - return createIndex; - } else { - return this.add(new Create(this.table.isTemporary)); - } - }, - - drop: function() { - if (this.indexesClause) { - var args = sliced(arguments); - var dropIndex = new DropIndex(this.table, args); - this.add(dropIndex); - return dropIndex; - } else { - return this.add(new Drop(this.table)); - } - }, - - truncate: function() { - return this.add(new Truncate(this.table)); - }, - - distinct: function() { - return this.add(new Distinct()); - }, - - distinctOn: function() { - var distinctOn; - if (this._distinctOn) { - distinctOn = this._distinctOn; - } else { - var select = this.nodes.filter(function (node) {return node.type === 'SELECT';}).shift(); - - distinctOn = this._distinctOn = new DistinctOn(); - select.add(distinctOn); - } - - //allow things like .distinctOn(a.star(), [ a.id, a.name ]) - //this will flatten them into a single array - var args = sliced(arguments).reduce(function(cur, next) { - if (util.isArray(next)) { - return cur.concat(next); - } - - cur.push(next); - return cur; - }, []); - - distinctOn.addAll(args); - - return this; - }, - - alter: function() { - return this.add(new Alter()); - }, - - rename: function(newName) { - var renameClause = new Rename(); - if (!newName.toNode) { - newName = new Column({ - name: newName, - table: this.table - }); - } - renameClause.add(newName.toNode()); - this.nodes[0].add(renameClause); - return this; - }, - - addColumn: function(column, dataType) { - var addClause = new AddColumn(); - if (!column.toNode) { - column = new Column({ - name: column, - table: this.table - }); - } - if (dataType) { - column.dataType = dataType; - } - addClause.add(column.toNode()); - this.nodes[0].add(addClause); - return this; - }, - - dropColumn: function(column) { - var dropClause = new DropColumn(); - if (!column.toNode) { - column = new Column({ - name: column, - table: this.table - }); - } - dropClause.add(column.toNode()); - this.nodes[0].add(dropClause); - return this; - }, - - renameColumn: function(oldColumn, newColumn) { - var renameClause = new RenameColumn(); - if (!oldColumn.toNode) { - oldColumn = new Column({ - name: oldColumn, - table: this.table - }); - } - if (!newColumn.toNode) { - newColumn = new Column({ - name: newColumn, - table: this.table - }); - } - renameClause.add(oldColumn.toNode()); - renameClause.add(newColumn.toNode()); - this.nodes[0].add(renameClause); - return this; - }, - - limit: function(count) { - return this.add(new Modifier(this, 'LIMIT', count)); - }, - - offset: function(count) { - return this.add(new Modifier(this, 'OFFSET', count)); - }, - - exists: function() { - assert(this.type === 'SUBQUERY', 'exists() can only be used on a subQuery'); - return new PrefixUnaryNode({ - left: this, - operator: "EXISTS" - }); - }, - - notExists: function() { - assert(this.type === 'SUBQUERY', 'notExists() can only be used on a subQuery'); - return new PrefixUnaryNode({ - left: this, - operator: "NOT EXISTS" - }); - }, - - ifExists: function() { - this.nodes[0].unshift(new IfExists()); - return this; - }, - - ifNotExists: function() { - this.nodes[0].unshift(new IfNotExists()); - return this; - }, - - orIgnore: function() { - this.nodes[0].unshift(new OrIgnore()); - return this; - }, - - cascade: function() { - this.nodes[0].add(new Cascade()); - return this; - }, - - restrict: function() { - this.nodes[0].add(new Restrict()); - return this; - }, - - indexes: function() { - this.indexesClause = new Indexes({ - table: this.table - }); - return this.add(this.indexesClause); - }, - - createView: function(viewName) { - this.add(new CreateView(viewName)); - return this; - } -}); - -// Here we are extending query with valueExpressions so that it's possible to write queries like -// var query=sql.select(a.select(a.x.sum()).plus(b.select(b.y.sum())) -// which generates: -// SELECT (SELECT SUM(a.x) FROM a) + (SELECT SUM(b.y) FROM b) -// We need to remove "or" and "and" from here because it conflicts with the already existing functionality of appending -// to the where clause like so: -// var query=a.select().where(a.name.equals("joe")).or(a.name.equals("sam")) -var valueExpressions=valueExpressionMixin(); -delete valueExpressions.or; -delete valueExpressions.and; -_.extend(Query.prototype, valueExpressions); - -// Extend the query with the aliasMixin so that it's possible to write queries like -// var query=sql.select(a.select(a.count()).as("column1")) -// which generates: -// SELECT (SELECT COUNT(*) FROM a) AS "column1" -_.extend(Query.prototype, alias.AliasMixin); - -module.exports = Query; diff --git a/lib/node/query.ts b/lib/node/query.ts new file mode 100644 index 00000000..4e87eea2 --- /dev/null +++ b/lib/node/query.ts @@ -0,0 +1,573 @@ +'use strict'; + +import assert = require('assert'); +import _ = require('lodash'); +import sliced = require('sliced'); + +import { + AddColumnNode, + AliasNode, + AlterNode, + CascadeNode, + ColumnNode, + CreateIndexNode, + CreateNode, + CreateViewNode, + DeleteNode, + DistinctNode, + DistinctOnNode, + DropColumnNode, + DropIndexNode, + DropNode, + ForShareNode, + ForUpdateNode, + FromNode, + GroupByNode, + HavingNode, + IAliasMixin, + IfExistsNode, + IfNotExistsNode, + IndexesNode, + InsertNode, + IValueExpressionMixinBase, + JoinNode, + ModifierNode, + Node, + OnConflictNode, + OnDuplicateNode, + OrderByNode, + OrIgnoreNode, + ParameterNode, + PrefixUnaryNode, + RenameColumnNode, + RenameNode, + ReplaceNode, + RestrictNode, + ReturningNode, + SelectNode, + TableNode, + TruncateNode, + UpdateNode, + valueExpressionMixin, + WhereNode +} from '.'; +import { Column } from '../column'; +import { INodeable, instanceofINodeable } from '../nodeable'; +import { Table } from '../table'; + +// get the first element of an arguments if it is an array, else return arguments as an array +const getArrayOrArgsAsArray = (args: Array): T[] => { + const first = args[0]; + if (Array.isArray(first)) { + return first; + } else { + return sliced(args as T[]); + } +}; + +export class Query extends Node { + public table: Table; + public nodes: Node[] = []; + public alias?: string; + public join?: (other: any) => JoinNode; + private whereClause?: WhereNode; + private insertClause?: InsertNode; + private replaceClause?: ReplaceNode; + private indexesClause?: IndexesNode; + // tslint:disable-next-line:variable-name + private _select?: SelectNode; + // tslint:disable-next-line:variable-name + private _orderBy?: OrderByNode; + // tslint:disable-next-line:variable-name + private _distinctOn?: DistinctOnNode; + + constructor(table: Table, isSubquery?: boolean) { + super(isSubquery ? 'SUBQUERY' : 'QUERY'); + + this.table = table; + if (table) { + this.sql = table.sql; + } + } + + public select(...args: any[]): this { + let select; + if (this._select) { + select = this._select; + } else { + select = this._select = new SelectNode(); + this.add(select); + } + + // allow things like .select(a.star(), [ a.id, a.name ]) + // this will flatten them into a single array + const flattenedArgs = sliced(args).reduce((cur: any[], next: any) => { + if (Array.isArray(next)) { + return cur.concat(next); + } + + cur.push(next); + return cur; + }, []); + + select.addAll(flattenedArgs); + + // if this is a subquery then add reference to this column + if (this.type === 'SUBQUERY') { + for (const node of select.nodes as ColumnNode[]) { + const name = node.alias || node.name; + const col = new Column(node as any); + col.name = name; + col.property = name; + col.table = this as any; + if (((this as unknown) as SubQuery)[name] === undefined) { + ((this as unknown) as SubQuery)[name] = col; + } + } + } + return this; + } + + public star(): Column { + assert(this.type === 'SUBQUERY', 'star() can only be used on a subQuery'); + return new Column({ + star: true, + table: this as any + }); + } + + public from(node: INodeable[] | INodeable | string): this; + public from(...nodes: INodeable[]): this; + public from(...nodes: Array): this { + const sourceNodes = Array.isArray(nodes[0]) ? (nodes[0] as Array>) : (nodes as Array>); + + for (const node of sourceNodes) { + this.add(new FromNode().add(node)); + } + + return this; + } + + public leftJoin(other: INodeable): JoinNode { + assert(this.type === 'SUBQUERY', 'leftJoin() can only be used on a subQuery'); + return new JoinNode('LEFT', this, other.toNode()); + } + + public where(object: Partial | Node[] | Node | string): this; + public where(...nodes: Node[]): this; + public where(...nodes: Array | string>): this { + if (nodes.length > 1) { + // allow multiple where clause arguments + const args = sliced(nodes as Node[]); + for (const arg of args) { + this.where(arg); + } + return this; + } else { + const node = nodes[0] as Node[] | Node | Partial | string; + // calling #where twice functions like calling #where & then #and + if (this.whereClause) { + return this.and(node); + } + this.whereClause = new WhereNode(this.table); + this.whereClause.add(node); + return this.add(this.whereClause); + } + } + + public or(object: Partial | Node | string): this { + if (!this.whereClause) { + return this.where(object); + } + this.whereClause.or(object); + return this; + } + + public and(object: Partial | Node[] | Node | string): this; + public and(node: Node[] | Node | Partial | string): this { + if (!this.whereClause) { + return this.where(node); + } + this.whereClause.and(node); + return this; + } + + public order(node: INodeable[] | INodeable): this; + public order(...nodes: INodeable[]): this; + public order(...nodes: Array): this { + const args: INodeable[] = getArrayOrArgsAsArray(nodes); + let orderBy; + if (args.length === 0) { + return this; + } + if (this._orderBy) { + orderBy = this._orderBy; + } else { + orderBy = this._orderBy = new OrderByNode(); + this.add(orderBy); + } + orderBy.addAll(args); + return this; + } + + public group(node: INodeable[] | INodeable): this; + public group(...nodes: INodeable[]): this; + public group(...nodes: Array): this { + const args: INodeable[] = getArrayOrArgsAsArray(nodes); + const groupBy = new GroupByNode().addAll(args); + return this.add(groupBy); + } + + public having(node: INodeable[] | INodeable): this; + public having(...nodes: INodeable[]): this; + public having(...nodes: Array): this { + const args: INodeable[] = getArrayOrArgsAsArray(nodes); + const having = new HavingNode().addAll(args); + return this.add(having); + } + + public insert(object: Array> | Partial | Array> | Column): this; + public insert(...nodes: Array>): this; + public insert(...nodes: Array> | Column | Array> | Partial>): this { + let args = sliced(nodes) as Array>; + const object = nodes[0]; + + if (Array.isArray(object)) { + for (const col of object) { + this.insert(col); + } + return this; + } else if (!instanceofINodeable(object) && typeof object === 'object') { + args = []; + Object.keys(object).forEach((key) => { + const col = this.table.get(key); + if (col && !col.autoGenerated) { + args.push(col.value((object as any)[key])); + } + }); + } + + if (this.insertClause) { + this.insertClause.add(args); + return this; + } else { + this.insertClause = new InsertNode(); + this.insertClause.add(args); + return this.add(this.insertClause); + } + } + + public replace(object: Array> | Partial | Array> | Column): this; + public replace(...nodes: Array>): this; + public replace(...nodes: Array> | Column | Array> | Partial>): this { + let args = sliced(nodes) as Array>; + const object = nodes[0]; + + if (Array.isArray(object)) { + for (const col of object) { + this.replace(col); + } + return this; + } else if (!instanceofINodeable(object) && typeof object === 'object') { + args = []; + Object.keys(object).forEach((key) => { + const col = this.table.get(key); + if (col && !col.autoGenerated) { + args.push(col.value((object as any)[key])); + } + }); + } + + if (this.replaceClause) { + this.replaceClause.add(args); + return this; + } else { + this.replaceClause = new ReplaceNode(); + this.replaceClause.add(args); + return this.add(this.replaceClause); + } + } + + public update(object: Partial): this { + const update = new UpdateNode(); + Object.keys(object).forEach((key) => { + const col = this.table.get(key); + if (col && !col.autoGenerated) { + const val = (object as any)[key]; + update.add(col.value(ParameterNode.getNodeOrParameterNode(val))); + } + }); + return this.add(update); + } + + public parameter(v: any): this { + const param = ParameterNode.getNodeOrParameterNode(v) as ParameterNode; + param.isExplicit = true; + return this.add(param); + } + + public delete(table: Array> | Table | Partial): this; + public delete(): this; + public delete(params?: Table | Array> | Partial): this { + let result; + if (params) { + if (params instanceof Table || Array.isArray(params)) { + // handle explicit delete queries: + // e.g. post.delete(post).from(post) -> DELETE post FROM post + // e.g. post.delete([post, user]).from(post) -> DELETE post, user FROM post + const newParams = Array.isArray(params) ? params.map((table) => new TableNode(table)) : [new TableNode(params)]; + result = this.add(new DeleteNode().addAll(newParams)); + } else { + // syntax sugar for post.delete().from(post).where(params) + result = this.add(new DeleteNode()).where(params); + } + } else { + result = this.add(new DeleteNode()); + } + return result; + } + + public returning(...args: any[]): this { + const returning = new ReturningNode(); + if (args.length === 0) { + returning.add('*'); + } else { + returning.addAll(getArrayOrArgsAsArray(args)); + } + + return this.add(returning); + } + + public onDuplicate(object: Partial): this { + const onDuplicate = new OnDuplicateNode(); + Object.keys(object).forEach((key) => { + const col = this.table.get(key)!; + let val; + if (col && !col.autoGenerated) { + val = (object as any)[key]; + } + onDuplicate.add(col.value(ParameterNode.getNodeOrParameterNode(val))); + }); + + return this.add(onDuplicate); + } + + public onConflict(options: { constraint: string; update?: string[] } | { columns: string[]; update?: string[] }): this { + const onConflict = new OnConflictNode(options); + return this.add(onConflict); + } + + public forUpdate(): this { + assert(typeof this._select !== 'undefined', 'FOR UPDATE can be used only in a select statement'); + this.add(new ForUpdateNode()); + return this; + } + + public forShare(): this { + assert(typeof this._select !== 'undefined', 'FOR SHARE can be used only in a select statement'); + return this.add(new ForShareNode()); + } + + public create(indexName: string): this | CreateIndexNode { + if (this.indexesClause) { + const createIndex = new CreateIndexNode(this.table, indexName); + this.add(createIndex); + return createIndex; + } else { + return this.add(new CreateNode(this.table.isTemporary)); + } + } + + public drop(): this | DropIndexNode { + if (this.indexesClause) { + const args = sliced(arguments); + const dropIndex = new DropIndexNode(this.table, args); + this.add(dropIndex); + return dropIndex; + } else { + return this.add(new DropNode(this.table)); + } + } + + public truncate(): this { + return this.add(new TruncateNode(this.table)); + } + + public distinct(): this { + return this.add(new DistinctNode()); + } + + public distinctOn(...args: any[]): this { + let distinctOn; + if (this._distinctOn) { + distinctOn = this._distinctOn; + } else { + const select = this.nodes.filter((node) => node.type === 'SELECT').shift(); + + distinctOn = this._distinctOn = new DistinctOnNode(); + select!.add(distinctOn); + } + + // allow things like .distinctOn(a.star(), [ a.id, a.name ]) + // this will flatten them into a single array + const flattenedArgs = sliced(args).reduce((cur, next) => { + if (Array.isArray(next)) { + return cur.concat(next); + } + + cur.push(next); + return cur; + }, []); + + distinctOn.addAll(flattenedArgs); + + return this; + } + + public alter(): this { + return this.add(new AlterNode()); + } + + public rename(newName: Column | string): this { + const renameClause = new RenameNode(); + if (typeof newName === 'string') { + newName = new Column({ + name: newName, + table: this.table + }); + } + renameClause.add(newName.toNode()); + this.nodes[0].add(renameClause); + return this; + } + + public addColumn(column: Column | string, dataType?: string): this { + const addClause = new AddColumnNode(); + if (typeof column === 'string') { + column = new Column({ + name: column, + table: this.table + }); + } + if (dataType) { + column.dataType = dataType; + } + addClause.add(column.toNode()); + this.nodes[0].add(addClause); + return this; + } + + public dropColumn(column: Column | string): this { + const dropClause = new DropColumnNode(); + if (typeof column === 'string') { + column = new Column({ + name: column, + table: this.table + }); + } + dropClause.add(column.toNode()); + this.nodes[0].add(dropClause); + return this; + } + + public renameColumn(oldColumn: Column | string, newColumn: Column | string): this { + const renameClause = new RenameColumnNode(); + if (typeof oldColumn === 'string') { + oldColumn = new Column({ + name: oldColumn, + table: this.table + }); + } + if (typeof newColumn === 'string') { + newColumn = new Column({ + name: newColumn, + table: this.table + }); + } + renameClause.add(oldColumn.toNode()); + renameClause.add(newColumn.toNode()); + this.nodes[0].add(renameClause); + return this; + } + + public limit(count: any): this { + return this.add(new ModifierNode(this, 'LIMIT', count)); + } + + public offset(count: any): this { + return this.add(new ModifierNode(this, 'OFFSET', count)); + } + + public exists(): PrefixUnaryNode { + assert(this.type === 'SUBQUERY', 'exists() can only be used on a subQuery'); + return new PrefixUnaryNode({ + left: this, + operator: 'EXISTS' + }); + } + + public notExists(): PrefixUnaryNode { + assert(this.type === 'SUBQUERY', 'notExists() can only be used on a subQuery'); + return new PrefixUnaryNode({ + left: this, + operator: 'NOT EXISTS' + }); + } + + public ifExists(): this { + this.nodes[0].unshift(new IfExistsNode()); + return this; + } + + public ifNotExists(): this { + this.nodes[0].unshift(new IfNotExistsNode()); + return this; + } + + public orIgnore(): this { + this.nodes[0].unshift(new OrIgnoreNode()); + return this; + } + + public cascade(): this { + this.nodes[0].add(new CascadeNode()); + return this; + } + + public restrict(): this { + this.nodes[0].add(new RestrictNode()); + return this; + } + + public indexes(): this { + this.indexesClause = new IndexesNode(this.table); + return this.add(this.indexesClause); + } + + public createView(viewName: string): this { + this.add(new CreateViewNode(viewName)); + return this; + } +} + +// Here we are extending query with valueExpressions so that it's possible to write queries like +// const query=sql.select(a.select(a.x.sum()).plus(b.select(b.y.sum())) +// which generates: +// SELECT (SELECT SUM(a.x) FROM a) + (SELECT SUM(b.y) FROM b) +// We need to remove "or" and "and" from here because it conflicts with the already existing functionality of appending +// to the where clause like so: +// const query=a.select().where(a.name.equals("joe")).or(a.name.equals("sam")) +const valueExpressions = valueExpressionMixin(); +delete valueExpressions.or; +delete valueExpressions.and; +_.extend(Query.prototype, valueExpressions); + +// Extend the query with the aliasMixin so that it's possible to write queries like +// const query=sql.select(a.select(a.count()).as("column1")) +// which generates: +// SELECT (SELECT COUNT(*) FROM a) AS "column1" +_.extend(Query.prototype, AliasNode.AliasMixin); + +export interface Query extends IValueExpressionMixinBase, IAliasMixin {} + +export type SubQuery = Query & { [key: string]: Column }; diff --git a/lib/node/rename.js b/lib/node/rename.js deleted file mode 100644 index c87bcfb3..00000000 --- a/lib/node/rename.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'RENAME' -}); diff --git a/lib/node/rename.ts b/lib/node/rename.ts new file mode 100644 index 00000000..6a14417c --- /dev/null +++ b/lib/node/rename.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class RenameNode extends Node { + constructor() { + super('RENAME'); + } +} diff --git a/lib/node/renameColumn.js b/lib/node/renameColumn.js deleted file mode 100644 index c3c66865..00000000 --- a/lib/node/renameColumn.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'RENAME COLUMN' -}); diff --git a/lib/node/renameColumn.ts b/lib/node/renameColumn.ts new file mode 100644 index 00000000..c1bb6b25 --- /dev/null +++ b/lib/node/renameColumn.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class RenameColumnNode extends Node { + constructor() { + super('RENAME COLUMN'); + } +} diff --git a/lib/node/replace.js b/lib/node/replace.js deleted file mode 100644 index d17099d2..00000000 --- a/lib/node/replace.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - -var DefaultNode = require('./default'); -var Node = require('./'); -var ParameterNode = require('./parameter'); - -var Replace = Node.define({ - type: 'REPLACE', - constructor: function () { - Node.call(this); - this.names = []; - this.columns = []; - this.valueSets = []; - } -}); - -module.exports = Replace; - -Replace.prototype.add = function (nodes) { - var hasColumns = false; - var hasValues = false; - var self = this; - var values = {}; - nodes.forEach(function (node) { - var column = node.toNode(); - var name = column.name; - var idx = self.names.indexOf(name); - if (idx < 0) { - self.names.push(name); - self.columns.push(column); - } - hasColumns = true; - hasValues = hasValues || column.value !== undefined; - values[name] = column; - }); - - // When none of the columns have a value, it's ambiguous whether the user - // intends to replace a row of default values or append a SELECT statement - // later. Resolve the ambiguity by assuming that if no columns are specified - // it is a row of default values, otherwise a SELECT will be added. - if (hasValues || !hasColumns) { - this.valueSets.push(values); - } - - return self; -}; - -/* - * Get parameters for all values to be replaced. This function - * handles handles bulk replaces, where keys may be present - * in some objects and not others. When keys are not present, - * the replace should refer to the column value as DEFAULT. - */ -Replace.prototype.getParameters = function () { - var self = this; - return this.valueSets - .map(function (nodeDict) { - var set = []; - self.names.forEach(function (name) { - var node = nodeDict[name]; - if (node) { - set.push(ParameterNode.getNodeOrParameterNode(node.value)); - } - else { - set.push(new DefaultNode()); - } - }); - return set; - }); -}; diff --git a/lib/node/replace.ts b/lib/node/replace.ts new file mode 100644 index 00000000..5822c346 --- /dev/null +++ b/lib/node/replace.ts @@ -0,0 +1,69 @@ +'use strict'; + +import { ColumnNode, DefaultNode, Node, ParameterNode } from '.'; +import { Column } from '../column'; +import { INodeable } from '../nodeable'; + +export class ReplaceNode extends Node { + public columns: ColumnNode[]; + public names: string[]; + public valueSets: Array<{ [key: string]: ColumnNode }>; + constructor() { + super('REPLACE'); + this.names = []; + this.columns = []; + this.valueSets = []; + } + + public add(nodes: Array> | Node | INodeable | string): this { + if (!Array.isArray(nodes)) { + throw new Error('Not an array of column instances'); + } + let hasColumns = false; + let hasValues = false; + const values: { [key: string]: ColumnNode } = {}; + nodes.forEach((node) => { + const column = node.toNode() as ColumnNode; + const name = column.name; + const idx = this.names.indexOf(name); + if (idx < 0) { + this.names.push(name); + this.columns.push(column); + } + hasColumns = true; + hasValues = hasValues || column.value !== undefined; + values[name] = column; + }); + + // When none of the columns have a value, it's ambiguous whether the user + // intends to replace a row of default values or append a SELECT statement + // later. Resolve the ambiguity by assuming that if no columns are specified + // it is a row of default values, otherwise a SELECT will be added. + if (hasValues || !hasColumns) { + this.valueSets.push(values); + } + + return this; + } + + /* + * Get parameters for all values to be replaced. This function + * handles handles bulk replaces, where keys may be present + * in some objects and not others. When keys are not present, + * the replace should refer to the column value as DEFAULT. + */ + public getParameters() { + return this.valueSets.map((nodeDict) => { + const set: Node[] = []; + this.names.forEach((name) => { + const node = nodeDict[name]; + if (node) { + set.push(ParameterNode.getNodeOrParameterNode(node.value)); + } else { + set.push(new DefaultNode()); + } + }); + return set; + }); + } +} diff --git a/lib/node/restrict.js b/lib/node/restrict.js deleted file mode 100644 index 942f4112..00000000 --- a/lib/node/restrict.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'RESTRICT' -}); diff --git a/lib/node/restrict.ts b/lib/node/restrict.ts new file mode 100644 index 00000000..56589d24 --- /dev/null +++ b/lib/node/restrict.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class RestrictNode extends Node { + constructor() { + super('RESTRICT'); + } +} diff --git a/lib/node/returning.js b/lib/node/returning.js deleted file mode 100644 index 2f27d067..00000000 --- a/lib/node/returning.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'RETURNING' -}); diff --git a/lib/node/returning.ts b/lib/node/returning.ts new file mode 100644 index 00000000..4e27e2fa --- /dev/null +++ b/lib/node/returning.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class ReturningNode extends Node { + constructor() { + super('RETURNING'); + } +} diff --git a/lib/node/select.js b/lib/node/select.js deleted file mode 100644 index 93e22538..00000000 --- a/lib/node/select.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'SELECT', - constructor: function(arg) { - Node.call(this); - if (arg && arg.sql) { - this.sql = arg.sql; - } - // used when processing LIMIT clauses in MSSQL - this.msSQLLimitNode = undefined; - // set to true when a DISTINCT is used on the entire result set - this.isDistinct = false; - } -}); diff --git a/lib/node/select.ts b/lib/node/select.ts new file mode 100644 index 00000000..bbf3fd0b --- /dev/null +++ b/lib/node/select.ts @@ -0,0 +1,15 @@ +'use strict'; + +import { ModifierNode, Node } from '.'; + +export class SelectNode extends Node { + public msSQLLimitNode?: ModifierNode; + public isDistinct: boolean; + constructor() { + super('SELECT'); + // used when processing LIMIT clauses in MSSQL + this.msSQLLimitNode = undefined; + // set to true when a DISTINCT is used on the entire result set + this.isDistinct = false; + } +} diff --git a/lib/node/slice.js b/lib/node/slice.js deleted file mode 100644 index 86c1ce21..00000000 --- a/lib/node/slice.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var SliceNode = Node.define({ - type: 'SLICE', - constructor: function(value, start, end) { - Node.call(this); - this.value = value; - this.start = start; - this.end = end; - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(SliceNode.prototype, valueExpressionMixin()); - } - } -}); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(SliceNode.prototype, AliasNode.AliasMixin); - -module.exports = SliceNode; diff --git a/lib/node/slice.ts b/lib/node/slice.ts new file mode 100644 index 00000000..f7037606 --- /dev/null +++ b/lib/node/slice.ts @@ -0,0 +1,27 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class SliceNode extends Node { + public value: Node; + public start: Node; + public end: Node; + constructor(value: Node, start: Node, end: Node) { + super('SLICE'); + this.value = value; + this.start = start; + this.end = end; + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(SliceNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(SliceNode.prototype, AliasNode.AliasMixin); + +export interface SliceNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/table.js b/lib/node/table.js deleted file mode 100644 index 4fca70d1..00000000 --- a/lib/node/table.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -var Node = require('./index'); -module.exports = Node.define({ - type: 'TABLE', - constructor: function(table) { - Node.call(this); - this.table = table; - } -}); diff --git a/lib/node/table.ts b/lib/node/table.ts new file mode 100644 index 00000000..dcd73fd8 --- /dev/null +++ b/lib/node/table.ts @@ -0,0 +1,12 @@ +'use strict'; + +import { Node } from '.'; +import { Table } from '../table'; + +export class TableNode extends Node { + public table: Table; + constructor(table: Table) { + super('TABLE'); + this.table = table; + } +} diff --git a/lib/node/ternary.js b/lib/node/ternary.js deleted file mode 100644 index 3f688ba9..00000000 --- a/lib/node/ternary.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -var _ = require('lodash'); -var Node = require('./index'); -var valueExpressionMixin = require('./valueExpression'); - -var valueExpressionMixed = false; -var TernaryNode = Node.define(_.extend({ - type: 'TERNARY', - constructor: function(config) { - Node.call(this); - this.left = config.left; - this.middle = config.middle; - this.operator = config.operator; - this.right = config.right; - this.separator = config.separator; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - _.extend(TernaryNode.prototype, valueExpressionMixin()); - } - }, -})); - -// allow aliasing -var AliasNode = require('./alias'); -_.extend(TernaryNode.prototype, AliasNode.AliasMixin); - -module.exports = TernaryNode; diff --git a/lib/node/ternary.ts b/lib/node/ternary.ts new file mode 100644 index 00000000..15ad394b --- /dev/null +++ b/lib/node/ternary.ts @@ -0,0 +1,32 @@ +'use strict'; + +import _ = require('lodash'); +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; + +let valueExpressionMixed = false; +export class TernaryNode extends Node { + public left: Node; + public middle: Node; + public operator: string; + public right: Node; + public separator: string; + constructor(config: { left: Node; middle: Node; operator: string; right: Node; separator: string }) { + super('TERNARY'); + this.left = config.left; + this.middle = config.middle; + this.operator = config.operator; + this.right = config.right; + this.separator = config.separator; + + // Delay mixin to runtime, when all nodes have been defined, and + // mixin only once. ValueExpressionMixin has circular dependencies. + if (!valueExpressionMixed) { + valueExpressionMixed = true; + _.extend(TernaryNode.prototype, valueExpressionMixin()); + } + } +} + +_.extend(TernaryNode.prototype, AliasNode.AliasMixin); + +export interface TernaryNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/text.js b/lib/node/text.js deleted file mode 100644 index bf026151..00000000 --- a/lib/node/text.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'TEXT', - constructor: function(text) { - Node.call(this); - this.text = text; - } -}); diff --git a/lib/node/text.ts b/lib/node/text.ts new file mode 100644 index 00000000..a04c2ef3 --- /dev/null +++ b/lib/node/text.ts @@ -0,0 +1,11 @@ +'use strict'; + +import { Node } from '.'; + +export class TextNode extends Node { + public text: string; + constructor(text: string) { + super('TEXT'); + this.text = text; + } +} diff --git a/lib/node/truncate.js b/lib/node/truncate.js deleted file mode 100644 index 165e0d9e..00000000 --- a/lib/node/truncate.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'TRUNCATE', - - constructor: function(table) { - Node.call(this); - this.add(table); - } -}); diff --git a/lib/node/truncate.ts b/lib/node/truncate.ts new file mode 100644 index 00000000..539fd887 --- /dev/null +++ b/lib/node/truncate.ts @@ -0,0 +1,11 @@ +'use strict'; + +import { Node } from '.'; +import { Table } from '../table'; + +export class TruncateNode extends Node { + constructor(table: Table) { + super('TRUNCATE'); + this.add(table); + } +} diff --git a/lib/node/update.js b/lib/node/update.js deleted file mode 100644 index 890fbee9..00000000 --- a/lib/node/update.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -var Node = require('./index'); - -module.exports = Node.define({ - type: 'UPDATE' -}); diff --git a/lib/node/update.ts b/lib/node/update.ts new file mode 100644 index 00000000..587933dc --- /dev/null +++ b/lib/node/update.ts @@ -0,0 +1,9 @@ +'use strict'; + +import { Node } from '.'; + +export class UpdateNode extends Node { + constructor() { + super('UPDATE'); + } +} diff --git a/lib/node/valueExpression.js b/lib/node/valueExpression.js deleted file mode 100644 index 2fa741a9..00000000 --- a/lib/node/valueExpression.js +++ /dev/null @@ -1,160 +0,0 @@ -'use strict'; - -var OrderByValueNode = require('./orderByValue'); -var ParameterNode = require('./parameter'); -var TextNode = require('./text'); - -// Process values, wrapping them in ParameterNode if necessary. -var processParams = function(val) { - return Array.isArray(val) ? val.map(ParameterNode.getNodeOrParameterNode) : ParameterNode.getNodeOrParameterNode(val); -}; - -// Value expressions can be composed to form new value expressions. -// ValueExpressionMixin is evaluated at runtime, hence the -// "thunk" around it. -var ValueExpressionMixin = function() { - var BinaryNode = require('./binary'); - var InNode = require('./in'); - var NotInNode = require('./notIn'); - var CastNode = require('./cast'); - var PostfixUnaryNode = require('./postfixUnary'); - var TernaryNode = require('./ternary'); - var CaseNode = require('./case'); - var AtNode = require('./at'); - var SliceNode = require('./slice'); - - var postfixUnaryMethod = function(operator) { - /*jshint unused: false */ - return function(val) { - return new PostfixUnaryNode({ - left : this.toNode(), - operator : operator - }); - }; - }; - - var binaryMethod = function(operator) { - return function(val) { - return new BinaryNode({ - left : this.toNode(), - operator : operator, - right : processParams(val) - }); - }; - }; - - var inMethod = function(val) { - return new InNode({ - left : this.toNode(), - right : processParams(val) - }); - }; - - var notInMethod = function(val) { - return new NotInNode({ - left : this.toNode(), - right : processParams(val) - }); - }; - - var ternaryMethod = function(operator, separator) { - return function(middle, right) { - return new TernaryNode({ - left : this.toNode(), - operator : operator, - middle : processParams(middle), - separator : separator, - right : processParams(right) - }); - }; - }; - - var atMethod = function(index) { - return new AtNode(this.toNode(), processParams(index)); - }; - - var sliceMethod = function(start, end) { - return new SliceNode(this.toNode(), processParams(start), processParams(end)); - }; - - var castMethod = function(dataType) { - return new CastNode(this.toNode(), dataType); - }; - - var orderMethod = function(direction) { - return function() { - return new OrderByValueNode({ - value : this.toNode(), - direction : direction ? new TextNode(direction) : undefined - }); - }; - }; - - var caseMethod = function(whenList, thenList, elseBranch) { - if (undefined !== elseBranch) { - elseBranch = processParams(elseBranch); - } - return new CaseNode({ - whenList : processParams(whenList), - thenList : processParams(thenList), - else : elseBranch - }); - }; - - return { - isNull : postfixUnaryMethod('IS NULL'), - isNotNull : postfixUnaryMethod('IS NOT NULL'), - or : binaryMethod('OR'), - and : binaryMethod('AND'), - equals : binaryMethod('='), - equal : binaryMethod('='), - notEquals : binaryMethod('<>'), - notEqual : binaryMethod('<>'), - gt : binaryMethod('>'), - gte : binaryMethod('>='), - lt : binaryMethod('<'), - lte : binaryMethod('<='), - plus : binaryMethod('+'), - minus : binaryMethod('-'), - multiply : binaryMethod('*'), - divide : binaryMethod('/'), - modulo : binaryMethod('%'), - leftShift : binaryMethod('<<'), - rightShift : binaryMethod('>>'), - bitwiseAnd : binaryMethod('&'), - bitwiseNot : binaryMethod('~'), - bitwiseOr : binaryMethod('|'), - bitwiseXor : binaryMethod('#'), - regex : binaryMethod('~'), - iregex : binaryMethod('~*'), - regexp : binaryMethod('REGEXP'), - notRegex : binaryMethod('!~'), - notIregex : binaryMethod('!~*'), - concat : binaryMethod('||'), - key : binaryMethod('->'), - keyText : binaryMethod('->>'), - path : binaryMethod('#>'), - pathText : binaryMethod('#>>'), - like : binaryMethod('LIKE'), - rlike : binaryMethod('RLIKE'), - notLike : binaryMethod('NOT LIKE'), - ilike : binaryMethod('ILIKE'), - notIlike : binaryMethod('NOT ILIKE'), - match : binaryMethod('@@'), - in : inMethod, - notIn : notInMethod, - between : ternaryMethod('BETWEEN', 'AND'), - notBetween : ternaryMethod('NOT BETWEEN', 'AND'), - at : atMethod, - contains : binaryMethod('@>'), - containedBy : binaryMethod('<@'), - containsKey : binaryMethod('?'), - overlap : binaryMethod('&&'), - slice : sliceMethod, - cast : castMethod, - descending : orderMethod('DESC'), - case : caseMethod - }; -}; - -module.exports = ValueExpressionMixin; diff --git a/lib/node/valueExpression.ts b/lib/node/valueExpression.ts new file mode 100644 index 00000000..54629b33 --- /dev/null +++ b/lib/node/valueExpression.ts @@ -0,0 +1,231 @@ +'use strict'; +// tslint:disable:object-literal-sort-keys + +import { + AtNode, + BinaryNode, + CaseNode, + CastNode, + InNode, + NotInNode, + OrderByValueNode, + ParameterNode, + PostfixUnaryNode, + SliceNode, + TernaryNode, + TextNode +} from '.'; +import { INodeable } from '../nodeable'; + +// Process values, wrapping them in ParameterNode if necessary. +const processParams = (val: any) => { + return Array.isArray(val) ? val.map(ParameterNode.getNodeOrParameterNode) : ParameterNode.getNodeOrParameterNode(val); +}; + +// Value expressions can be composed to form new value expressions. +// ValueExpressionMixin is evaluated at runtime, hence the +// "thunk" around it. +export const valueExpressionMixin = () => { + // tslint:disable:no-shadowed-variable + const BinaryNode = require('./binary').BinaryNode; + const InNode = require('./in').InNode; + const NotInNode = require('./notIn').NotInNode; + const CastNode = require('./cast').CastNode; + const PostfixUnaryNode = require('./postfixUnary').PostfixUnaryNode; + const TernaryNode = require('./ternary').TernaryNode; + const CaseNode = require('./case').CaseNode; + const AtNode = require('./at').AtNode; + const SliceNode = require('./slice').SliceNode; + // tslint:enable:no-shadowed-variable + + const postfixUnaryMethod = (operator: string) => { + /*jshint unused: false */ + return function(this: INodeable) { + return new PostfixUnaryNode({ + left: this.toNode(), + operator + }); + }; + }; + + const binaryMethod = (operator: string) => { + return function(this: INodeable, val: any) { + return new BinaryNode({ + left: this.toNode(), + operator, + right: processParams(val) + }); + }; + }; + + const inMethod = function(this: INodeable, val: any) { + return new InNode({ + left: this.toNode(), + right: processParams(val) + }); + }; + + const notInMethod = function(this: INodeable, val: any) { + return new NotInNode({ + left: this.toNode(), + right: processParams(val) + }); + }; + + const ternaryMethod = (operator: string, separator: string) => { + return function(this: INodeable, middle: any, right: any) { + return new TernaryNode({ + left: this.toNode(), + operator, + middle: processParams(middle), + separator, + right: processParams(right) + }); + }; + }; + + const atMethod = function(this: INodeable, index: any) { + return new AtNode(this.toNode(), processParams(index)); + }; + + const sliceMethod = function(this: INodeable, start: number, end: number) { + return new SliceNode(this.toNode(), processParams(start), processParams(end)); + }; + + const castMethod = function(this: INodeable, dataType: string) { + return new CastNode(this.toNode(), dataType); + }; + + const orderMethod = (direction: string) => { + return function(this: INodeable) { + return new OrderByValueNode({ + value: this.toNode(), + direction: direction ? new TextNode(direction) : undefined + }); + }; + }; + + const caseMethod = function(this: INodeable, whenList: any[], thenList: any[], elseBranch?: any) { + if (undefined !== elseBranch) { + elseBranch = processParams(elseBranch); + } + return new CaseNode({ + whenList: processParams(whenList), + thenList: processParams(thenList), + else: elseBranch + }); + }; + + return { + isNull: postfixUnaryMethod('IS NULL'), + isNotNull: postfixUnaryMethod('IS NOT NULL'), + or: binaryMethod('OR'), + and: binaryMethod('AND'), + equals: binaryMethod('='), + equal: binaryMethod('='), + notEquals: binaryMethod('<>'), + notEqual: binaryMethod('<>'), + gt: binaryMethod('>'), + gte: binaryMethod('>='), + lt: binaryMethod('<'), + lte: binaryMethod('<='), + plus: binaryMethod('+'), + minus: binaryMethod('-'), + multiply: binaryMethod('*'), + divide: binaryMethod('/'), + modulo: binaryMethod('%'), + leftShift: binaryMethod('<<'), + rightShift: binaryMethod('>>'), + bitwiseAnd: binaryMethod('&'), + bitwiseNot: binaryMethod('~'), + bitwiseOr: binaryMethod('|'), + bitwiseXor: binaryMethod('#'), + regex: binaryMethod('~'), + iregex: binaryMethod('~*'), + regexp: binaryMethod('REGEXP'), + notRegex: binaryMethod('!~'), + notIregex: binaryMethod('!~*'), + concat: binaryMethod('||'), + key: binaryMethod('->'), + keyText: binaryMethod('->>'), + path: binaryMethod('#>'), + pathText: binaryMethod('#>>'), + like: binaryMethod('LIKE'), + rlike: binaryMethod('RLIKE'), + notLike: binaryMethod('NOT LIKE'), + ilike: binaryMethod('ILIKE'), + notIlike: binaryMethod('NOT ILIKE'), + match: binaryMethod('@@'), + in: inMethod, + notIn: notInMethod, + between: ternaryMethod('BETWEEN', 'AND'), + notBetween: ternaryMethod('NOT BETWEEN', 'AND'), + at: atMethod, + contains: binaryMethod('@>'), + containedBy: binaryMethod('<@'), + containsKey: binaryMethod('?'), + overlap: binaryMethod('&&'), + slice: sliceMethod, + cast: castMethod, + descending: orderMethod('DESC'), + case: caseMethod + }; +}; + +export interface IValueExpressionMixinBase { + isNull(): PostfixUnaryNode; + isNotNull(): PostfixUnaryNode; + equals(val: any): BinaryNode; + equal(val: any): BinaryNode; + notEquals(val: any): BinaryNode; + notEqual(val: any): BinaryNode; + gt(val: any): BinaryNode; + gte(val: any): BinaryNode; + lt(val: any): BinaryNode; + lte(val: any): BinaryNode; + plus(val: any): BinaryNode; + minus(val: any): BinaryNode; + multiply(val: any): BinaryNode; + divide(val: any): BinaryNode; + modulo(val: any): BinaryNode; + leftShift(val: any): BinaryNode; + rightShift(val: any): BinaryNode; + bitwiseAnd(val: any): BinaryNode; + bitwiseNot(val: any): BinaryNode; + bitwiseOr(val: any): BinaryNode; + bitwiseXor(val: any): BinaryNode; + regex(val: any): BinaryNode; + iregex(val: any): BinaryNode; + regexp(val: any): BinaryNode; + notRegex(val: any): BinaryNode; + notIregex(val: any): BinaryNode; + concat(val: any): BinaryNode; + key(val: any): BinaryNode; + keyText(val: any): BinaryNode; + path(val: any): BinaryNode; + pathText(val: any): BinaryNode; + like(val: any): BinaryNode; + rlike(val: any): BinaryNode; + notLike(val: any): BinaryNode; + ilike(val: any): BinaryNode; + notIlike(val: any): BinaryNode; + match(val: any): BinaryNode; + in(val: any): InNode; + notIn(val: any): NotInNode; + between(middle: any, right: any): TernaryNode; + notBetween(middle: any, right: any): TernaryNode; + at(index: any): AtNode; + contains(val: any): BinaryNode; + containedBy(val: any): BinaryNode; + containsKey(val: any): BinaryNode; + overlap(val: any): BinaryNode; + slice(start: number, end: number): SliceNode; + cast(dataType: string): CastNode; + descending(): OrderByValueNode; + case(whenList: any[], thenList: any[], elseBranch?: any): CaseNode; +} + +export interface IValueExpressionMixin extends IValueExpressionMixinBase { + or(val: any): BinaryNode; + and(val: any): BinaryNode; +} diff --git a/lib/node/where.js b/lib/node/where.js deleted file mode 100644 index 5c0465fc..00000000 --- a/lib/node/where.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict'; - -var Node = require('./index'); -var BinaryNode = require('./binary'); -var TextNode = require('./text'); - -var normalizeNode = function(table, node) { - var result = node; - if(typeof node === 'string') { - result = new TextNode('(' + node + ')'); - } - else if (Array.isArray(node)) { - result = false; - - if (node.length === 0) { - result = new TextNode('(1 = 1)'); - } else { - node.forEach(function (subNode) { - if (!result) { - result = subNode; - } else { - result = result.and(subNode); - } - }); - } - } - else if (!node.toNode && typeof node === 'object'){ - result = false; - for (var colName in node) { - if (node.hasOwnProperty(colName)) { - var column = table.getColumn(colName); - var query = column.equals(node[colName]); - if (!result) { - result = query; - } else { - result = result.and(query); - } - } - } - } - return result; -}; - -module.exports = Node.define({ - constructor: function(table) { - Node.call(this); - this.table = table; - }, - type: 'WHERE', - add: function(node) { - node = normalizeNode(this.table, node); - return Node.prototype.add.call(this, node); - }, - or: function(other) { - var right = normalizeNode(this.table, other); - // calling 'or' without an initial 'where' - if(!this.nodes.length) { - return this.add(other); - } - return this.nodes.push(new BinaryNode({ - left: this.nodes.pop(), - operator: 'OR', - right: right - })); - }, - and: function(other) { - var right = normalizeNode(this.table, other); - return this.nodes.push(new BinaryNode({ - left: this.nodes.pop(), - operator: 'AND', - right: right - })); - } -}); diff --git a/lib/node/where.ts b/lib/node/where.ts new file mode 100644 index 00000000..dc2fcb6a --- /dev/null +++ b/lib/node/where.ts @@ -0,0 +1,73 @@ +'use strict'; + +import { BinaryNode, Node, TextNode } from '.'; +import { INodeable, instanceofINodeable } from '../nodeable'; +import { Table } from '../table'; + +const normalizeNode = (table: Table, node: Node[] | Node | INodeable | object | string): Node => { + if (typeof node === 'string') { + return new TextNode(`(${node})`); + } else if (Array.isArray(node)) { + if (node.length === 0) { + return new TextNode('(1 = 1)'); + } else { + let result: Node | undefined; + for (const subNode of node) { + result = !result ? subNode : (result as any).and(subNode); + } + return result!; + } + } else if (!instanceofINodeable(node) && typeof node === 'object') { + let result: Node | undefined; + for (const colName in node) { + if (colName in node) { + const column = table.getColumn(colName)!; + const query = column.equals((node as any)[colName]); + result = !result ? query : (result as any).and(query); + } + } + return result!; + } else { + return node.toNode(); + } +}; + +export class WhereNode extends Node { + public table: Table; + constructor(table: Table) { + super('WHERE'); + this.table = table; + } + + public add(node: Node[] | Node | INodeable | object | string) { + const add = normalizeNode(this.table, node); + return super.add(add); + } + + public or(other: Node | object | string): void { + const right = normalizeNode(this.table, other); + // calling 'or' without an initial 'where' + if (!this.nodes.length) { + this.add(other); + } else { + this.nodes.push( + new BinaryNode({ + left: this.nodes.pop()!, + operator: 'OR', + right + }) + ); + } + } + + public and(other: Node[] | Node | object | string): void { + const right = normalizeNode(this.table, other); + this.nodes.push( + new BinaryNode({ + left: this.nodes.pop()!, + operator: 'AND', + right + }) + ); + } +} diff --git a/lib/nodeable.ts b/lib/nodeable.ts new file mode 100644 index 00000000..2441d8d9 --- /dev/null +++ b/lib/nodeable.ts @@ -0,0 +1,9 @@ +import { Node } from './node'; + +export interface INodeable { + toNode(): Node; +} + +export function instanceofINodeable(o: object): o is INodeable { + return typeof o === 'object' && o !== null && 'toNode' in o; +} diff --git a/lib/table.js b/lib/table.js deleted file mode 100644 index 3fae2710..00000000 --- a/lib/table.js +++ /dev/null @@ -1,290 +0,0 @@ -'use strict'; - -var util = require('util'); -var lodash = require('lodash'); - -var Query = require('./node/query'); -var Column = require('./column'); -var TableNode = require('./node/table'); -var JoinNode = require('./node/join'); -var LiteralNode = require('./node/literal'); -var Joiner = require('./joiner'); -var ForeignKeyNode = require('./node/foreignKey'); - -var Table = function(config) { - this._schema = config.schema; - this._name = config.name; - this._initialConfig = config; - this.columnWhiteList = !!config.columnWhiteList; - this.isTemporary=!!config.isTemporary; - this.snakeToCamel = !!config.snakeToCamel; - this.columns = []; - this.foreignKeys = []; - this.table = this; - if (!config.sql) { - config.sql = require('./index'); - } - this.sql = config.sql; -}; - -Table.define = function(config) { - var table = new Table(config); - // allow hash of columns as well as array - if (config.columns && !util.isArray(config.columns)) { - var cols = []; - - for (var key in config.columns) { - if (config.columns.hasOwnProperty(key)) { - var col = config.columns[key]; - col.name = key; - cols.push(col); - } - } - - config.columns = cols; - } - - for (var i = 0; i < config.columns.length; i++) { - table.addColumn(config.columns[i]); - } - - if(config.foreignKeys !== undefined) { - if(util.isArray(config.foreignKeys)) { - for(i = 0; i < config.foreignKeys.length; i++) { - table.foreignKeys.push(new ForeignKeyNode(config.foreignKeys[i])); - } - } else { - table.foreignKeys.push(new ForeignKeyNode(config.foreignKeys)); - } - } - return table; -}; - -Table.prototype.clone = function(config) { - return Table.define(lodash.extend({ - schema: this._schema, - name: this._name, - sql: this.sql, - columnWhiteList: !!this.columnWhiteList, - snakeToCamel: !!this.snakeToCamel, - columns: this.columns, - foreignKeys: this.foreignKeys - }, config || {})); -}; - -Table.prototype.createColumn = function(col) { - if(!(col instanceof Column)) { - if(typeof col === 'string') { - col = { name: col }; - } - - col.table = this; - col = new Column(col); - - // Load subfields from array into an object of form name: Column - if(util.isArray(col.subfields)) { - col.subfields = lodash.chain(col.subfields) - .map(lodash.bind(function (subfield) { - return [subfield, new Column({ - table: this, - subfieldContainer: col, - name: subfield - })]; - }, this)) - .fromPairs() - .value(); - } - } - - return col; -}; - -Table.prototype.addColumn = function(col, options) { - col = this.createColumn(col); - options = lodash.extend({ - noisy: true - }, options || {}); - - if(this.hasColumn(col)) { - if (options.noisy) { - throw new Error('Table ' + this._name + ' already has column or property by the name of ' + col.name); - } else { - return this; - } - } else if(!!this[col.name] && (process.env.NODE_ENV === 'debug')) { - console.log('Please notice that you have just defined the column "' + col.name + '". In order to access it, you need to use "table.getColumn(\'' + col.name + '\');"!'); - } - this.columns.push(col); - - function snakeToCamel(snakeName) { - return snakeName.replace(/[\-_]([a-z])/g, function(m, $1){ return $1.toUpperCase(); }); - } - - var property = col.property = col.property || (this.snakeToCamel ? snakeToCamel(col.name) : col.name); - this[property] = this[property] || col; - return this; -}; - -Table.prototype.hasColumn = function(col) { - var columnName = col instanceof Column ? col.name : col; - return this.columns.some(function(column) { - return column.property === columnName || column.name === columnName; - }); -}; - -Table.prototype.getColumn = -Table.prototype.get = -function(colName) { - for(var i = 0; i < this.columns.length; i++) { - var col = this.columns[i]; - if (colName === col.property || colName === col.name) { - return col; - } - } - if(this.columnWhiteList) - return null; - throw new Error('Table ' + this._name + ' does not have a column or property named ' + colName); -}; - -Table.prototype.getSchema = function() { - return this._schema; -}; - -Table.prototype.setSchema = function(schema) { - this._schema = schema; -}; - -Table.prototype.getName = function() { - if (this.sql && this.sql.dialectName=="mssql" && this.isTemporary) return "#"+this._name; - return this._name; -}; - -Table.prototype.star = function(options) { - options = options || {}; - if (options.prefix) { - return this.columns.map(function(column) { - return this[column.name].as(options.prefix + column.name); - }.bind(this)); - } - - return new Column({table: this, star: true}); -}; - -Table.prototype.literal = function(literal) { - return new LiteralNode(literal); -}; - -Table.prototype.count = function(alias) { - var name = this.alias || this._name, - col = new Column({table: this, star: true}); - // ColumnNode - return col.count(alias || name + '_count'); -}; - -Table.prototype.select = function() { - // create the query and pass it off - var query = new Query(this); - if (arguments.length === 0) { - query.select.call(query, this.star()); - } else { - query.select.apply(query, arguments); - } - return query; -}; - -Table.prototype.subQuery = function(alias) { - // create the query and pass it off - var query = new Query(this); - query.type = 'SUBQUERY'; - query.alias = alias; - query.join = function(other) { - return new JoinNode('INNER', this.toNode(), other.toNode(), other); - }; - return query; -}; - -Table.prototype.insert = function() { - var query = new Query(this); - if(!arguments[0] || (util.isArray(arguments[0]) && arguments[0].length === 0)){ - query.select.call(query, this.star()); - query.where.apply(query,["1=2"]); - } else { - query.insert.apply(query, arguments); - } - return query; -}; - -Table.prototype.replace = function() { - var query = new Query(this); - if(!arguments[0] || (util.isArray(arguments[0]) && arguments[0].length === 0)){ - query.select.call(query, this.star()); - query.where.apply(query,["1=2"]); - } else { - query.replace.apply(query, arguments); - } - return query; -}; - -Table.prototype.toNode = function() { - return new TableNode(this); -}; - -Table.prototype.join = function(other) { - return new JoinNode('INNER', this.toNode(), other.toNode(), other); -}; - -Table.prototype.leftJoin = function(other) { - return new JoinNode('LEFT', this.toNode(), other.toNode()); -}; - -// auto-join tables based on column intropsection -Table.prototype.joinTo = function(other) { - return Joiner.leftJoin(this, other); -}; - -Table.prototype.as = function(alias) { - // TODO could this be cleaner? - var t = Table.define(this._initialConfig); - t.alias = alias; - return t; -}; - -// called in shorthand when not calling select -Table.prototype.__defineGetter__("nodes", function() { - return this.select(this.star()).nodes; -}); - -Table.prototype.and = function() { - var query = new Query(this); - query.where.apply(query, arguments); - return query; -}; - -Table.prototype.indexes = function() { - return new Query(this).indexes(); -}; - -var queryMethods = [ - 'alter', - 'create', - 'delete', - 'drop', - 'from', - 'limit', - 'offset', - 'or', - 'order', - 'truncate', - 'update', - 'where' -]; - -queryMethods.forEach(function (method) { - Table.prototype[method] = function () { - var query = new Query(this); - query[method].apply(query, arguments); - return query; - }; -}); - -module.exports = Table; diff --git a/lib/table.ts b/lib/table.ts new file mode 100644 index 00000000..42b1bb11 --- /dev/null +++ b/lib/table.ts @@ -0,0 +1,303 @@ +'use strict'; + +import lodash = require('lodash'); + +import { Sql } from './'; +import { Column } from './column'; +import { ColumnDefinition, TableDefinition } from './configTypes'; +import { leftJoin } from './joiner'; +import { ColumnNode, ForeignKeyNode, JoinNode, LiteralNode, Node, OrderByValueNode, Query, SubQuery, TableNode } from './node'; +import { INodeable } from './nodeable'; + +export type TableWithColumns = Table & { [Name in NonNullable]: Column }; + +export class Table implements INodeable { + get nodes(): Node[] { + return this.select(this.star()).nodes; + } + public static define(config: TableDefinition): TableWithColumns { + const table = new Table(config); + // allow hash of columns as well as array + if (config.columns && !Array.isArray(config.columns)) { + const cols = []; + + for (const key in config.columns) { + if (config.columns.hasOwnProperty(key)) { + const col = (config.columns as any)[key]; + col.name = key; + cols.push(col); + } + } + + config.columns = cols; + } + for (const col of config.columns) { + table.addColumn(col); + } + if (config.foreignKeys !== undefined) { + if (Array.isArray(config.foreignKeys)) { + for (const key of config.foreignKeys) { + table.foreignKeys.push(new ForeignKeyNode(key)); + } + } else { + table.foreignKeys.push(new ForeignKeyNode(config.foreignKeys)); + } + } + return table as TableWithColumns; + } + public columnWhiteList: boolean; + public isTemporary: boolean; + public snakeToCamel: boolean; + public columns: Array>; + public foreignKeys: ForeignKeyNode[]; + public table: this; + public sql!: Sql; + public engine?: string; + public charset?: string; + public alias?: string; + public initialConfig: TableDefinition; + private schema?: string; + private tableName: string; + constructor(config: TableDefinition) { + this.schema = config.schema; + this.tableName = config.name; + this.initialConfig = config; + this.columnWhiteList = !!config.columnWhiteList; + this.isTemporary = !!config.isTemporary; + this.snakeToCamel = !!config.snakeToCamel; + this.columns = []; + this.foreignKeys = []; + this.table = this; + if (!config.sql) { + config.sql = new Sql(); + } + this.sql = config.sql; + this.engine = config.engine; + this.charset = config.charset; + } + public clone(config?: Partial): TableWithColumns { + return Table.define({ + columnWhiteList: !!this.columnWhiteList, + columns: this.columns, + foreignKeys: this.foreignKeys, + name: this.tableName, + schema: this.schema, + snakeToCamel: !!this.snakeToCamel, + sql: this.sql, + ...(config || {}) + } as any); + } + public createColumn(col: string | ColumnDefinition | Column): Column { + if (!(col instanceof Column)) { + if (typeof col === 'string') { + // tslint:disable-next-line:no-object-literal-type-assertion + col = { name: col } as ColumnDefinition; + } + const column = new Column({ ...col, table: this }); + // Load subfields from array into an object of form name: Column + if (Array.isArray(col.subfields)) { + column.subfields = lodash + .chain(col.subfields) + .map((subfield) => { + return [ + subfield, + new Column({ + name: subfield, + subfieldContainer: column, + table: this + }) + ]; + }) + .fromPairs() + .value(); + } + return column; + } + return col; + } + public addColumn(col: string | ColumnDefinition | Column, options?: any) { + const column = this.createColumn(col); + options = { noisy: true, ...options }; + if (this.hasColumn(column)) { + if (options.noisy) { + throw new Error(`Table ${this.tableName} already has column or property by the name of ${column.name}`); + } else { + return this; + } + } else if (!!(this as any)[column.name] && process.env.NODE_ENV === 'debug') { + // tslint:disable-next-line:no-console + console.log( + `Please notice that you have just defined the column "${ + column.name + }". In order to access it, you need to use "table.getColumn('${column.name}');"!` + ); + } + this.columns.push(column); + const snakeToCamel = (snakeName: string) => { + return snakeName.replace(/[\-_]([a-z])/g, (m, $1: string) => $1.toUpperCase()); + }; + const property = (column.property = column.property || (this.snakeToCamel ? snakeToCamel(column.name) : column.name)); + (this as any)[property] = (this as any)[property] || column; + return this; + } + public hasColumn(col: Column | string): boolean { + const columnName = col instanceof Column ? col.name : col; + return this.columns.some((column) => column.property === columnName || column.name === columnName); + } + public getColumn(colName: string) { + for (const col of this.columns) { + if (colName === col.property || colName === col.name) { + return col; + } + } + if (this.columnWhiteList) { + return null; + } + throw new Error(`Table ${this.tableName} does not have a column or property named ${colName}`); + } + public get(colName: string) { + return this.getColumn(colName); + } + public getSchema() { + return this.schema; + } + public setSchema(schema: string) { + this.schema = schema; + } + public getName() { + if (this.sql && this.sql.dialectName === 'mssql' && this.isTemporary) { + return `#${this.tableName}`; + } + return this.tableName; + } + public star(): Column; + public star(options: { prefix: string }): ColumnNode[]; + public star(options?: any): Column | ColumnNode[] { + options = options || {}; + if ('prefix' in options) { + return this.columns.map((column) => column.as(options.prefix + column.name)); + } + return new Column({ table: this, star: true }); + } + public literal(literal: any): LiteralNode { + return new LiteralNode(literal); + } + public count(alias?: string): ColumnNode { + const name = this.alias || this.tableName; + const col: Column = new Column({ table: this, star: true }); + // ColumnNode + return col.count(alias || name + '_count'); + } + public select(...args: any[]): Query { + // create the query and pass it off + const query = new Query(this); + if (args.length === 0) { + query.select(this.star()); + } else { + query.select(...args); + } + return query; + } + public subQuery(alias?: string): SubQuery { + // create the query and pass it off + const query = new Query(this, true); + query.alias = alias; + query.join = (other: any) => { + return new JoinNode('INNER', this.toNode(), other.toNode()); + }; + return query as SubQuery; + } + public insert(...args: any[]): Query { + const query = new Query(this); + if (!args[0] || (Array.isArray(args[0]) && args[0].length === 0)) { + query.select(this.star()); + query.where('1=2'); + } else { + query.insert(...args); + } + return query; + } + public replace(...args: any[]): Query { + const query = new Query(this); + if (!args[0] || (Array.isArray(args[0]) && args[0].length === 0)) { + query.select(this.star()); + query.where('1=2'); + } else { + query.replace(...args); + } + return query; + } + public toNode(): TableNode { + return new TableNode(this); + } + public join(other: INodeable): JoinNode { + return new JoinNode('INNER', this.toNode(), other.toNode()); + } + public leftJoin(other: INodeable): JoinNode { + return new JoinNode('LEFT', this.toNode(), other.toNode()); + } + // auto-join tables based on column intropsection + public joinTo(other: Table): JoinNode { + return leftJoin(this, other); + } + public as(alias: string): TableWithColumns { + // TODO could this be cleaner? + const t = Table.define(this.initialConfig); + t.alias = alias; + return t; + } + public and(...args: Node[]): Query { + const query = new Query(this); + query.where(...args); + return query; + } + public indexes(): IndexQuery { + return (new Query(this).indexes() as unknown) as IndexQuery; + } +} + +const queryMethods = ['alter', 'create', 'delete', 'drop', 'from', 'limit', 'offset', 'or', 'order', 'truncate', 'update', 'where']; + +queryMethods.forEach((method) => { + (Table.prototype as any)[method] = function(this: Table, ...args: any[]) { + const query = new Query(this); + (query as any)[method].apply(query, args); + return query; + }; +}); + +type PartialNodeable = { [P in keyof T]?: T[P] | INodeable }; + +export interface Table { + alter(): Query; + create(): Query; + delete(table: Array> | Table | Partial): Query; + delete(): Query; + drop(): Query; + from(table: Array> | Table | JoinNode): Query; + from(...tables: Array>): Query; + limit(count: any): Query; + offset(count: any): Query; + or(object: Partial | Node | string): Query; + order(node: INodeable[] | INodeable): Query; + order(...nodes: INodeable[]): Query; + truncate(): Query; + update(object: PartialNodeable): Query; + where(object: Partial | Node[] | Node | string): Query; + where(...nodes: Node[]): Query; +} + +interface IndexQuery { + create(indexName?: string): IndexCreationQuery; + drop(indexName: string): Node; + drop(...columns: Array>): Node; +} + +interface IndexCreationQuery extends Node { + unique(): IndexCreationQuery; + using(name: string): IndexCreationQuery; + on(...columns: Array | OrderByValueNode>): IndexCreationQuery; + withParser(parserName: string): IndexCreationQuery; + fulltext(): IndexCreationQuery; + spatial(): IndexCreationQuery; +} diff --git a/lib/tableTracker.ts b/lib/tableTracker.ts new file mode 100644 index 00000000..f6306d6c --- /dev/null +++ b/lib/tableTracker.ts @@ -0,0 +1,9 @@ +import { Table } from './table'; + +export interface ITableTracker { + table?: Table; +} + +export function hasTable(o: object): o is Required { + return typeof o === 'object' && o !== null && 'table' in o; +} diff --git a/lib/types.d.ts b/lib/types.d.ts.old similarity index 100% rename from lib/types.d.ts rename to lib/types.d.ts.old diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..16a743b5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,520 @@ +{ + "name": "sql-ts", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/lodash": { + "version": "4.14.119", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.119.tgz", + "integrity": "sha512-Z3TNyBL8Vd/M9D9Ms2S3LmFq2sSMzahodD6rCS9V2N44HUMINb75jNkSuwAx7eo2ufqTdfOdtGQpNbieUjPQmw==", + "dev": true + }, + "@types/mocha": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", + "dev": true + }, + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tslint": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz", + "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + } + }, + "tslint-config-prettier": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.17.0.tgz", + "integrity": "sha512-NKWNkThwqE4Snn4Cm6SZB7lV5RMDDFsBwz6fWUkTxOKGjMx8ycOHnjIbhn7dZd5XmssW3CwqUjlANR6EhP9YQw==", + "dev": true + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + } + } +} diff --git a/package.json b/package.json index dc250c01..d2e1da13 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,42 @@ { - "author": "brianc ", - "name": "sql", - "description": "sql builder", - "version": "0.78.0", - "homepage": "https://github.com/brianc/node-sql", - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/brianc/node-sql.git" - }, - "main": "lib/", - "types": "lib/types.d.ts", - "scripts": { - "test": "node_modules/.bin/mocha", - "lint": "jshint lib test", - "posttest": "jshint lib test" - }, - "engines": { - "node": "*" - }, - "dependencies": { - "sliced": "0.0.x", - "lodash": "4.1.x" - }, - "devDependencies": { - "jshint": "*", - "mocha": "*" - } + "author": { + "name": "Stefan Charsley", + "email": "charsleysa@gmail.com" + }, + "name": "sql-ts", + "description": "SQL Builder", + "version": "1.0.0", + "homepage": "https://github.com/charsleysa/node-sql-ts", + "license": "MIT", + "repository": { + "type": "git", + "url": "git://github.com/charsleysa/node-sql-ts.git" + }, + "main": "dist/", + "types": "dist/index.d.ts", + "scripts": { + "pretest": "tslint --project .", + "test": "node_modules/.bin/mocha --opts ./test/mocha.opts", + "lint": "tslint --project .", + "release:major": "npm run test && npm version major -m \"Bump version\" && git push origin master --tags && npm publish", + "release:minor": "npm run test && npm version major -m \"Bump version\" && git push origin master --tags && npm publish", + "release:patch": "npm run test && npm version major -m \"Bump version\" && git push origin master --tags && npm publish" + }, + "engines": { + "node": "*" + }, + "dependencies": { + "sliced": "~1.0.x", + "lodash": "~4.17.x" + }, + "devDependencies": { + "@types/lodash": "^4.14.119", + "@types/mocha": "^5.2.5", + "@types/node": "^10.12.18", + "mocha": "*", + "typescript": "^3.2.2", + "ts-node": "^7.0.1", + "tslint": "^5.12.0", + "tslint-config-prettier": "^1.17.0" + } } diff --git a/test/binary-clause-tests.js b/test/binary-clause-tests.js deleted file mode 100644 index 10c50737..00000000 --- a/test/binary-clause-tests.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; - -var assert = require('assert'); -var Table = require(__dirname + '/../lib/table'); - -var Foo = Table.define({ - name: 'foo', - columns: ['baz','bar'] -}); - -test('operators', function() { - assert.equal(Foo.baz.equals(1).operator, '='); - assert.equal(Foo.baz.equal(1).operator, '='); - assert.equal(Foo.baz.notEqual(1).operator, '<>'); - assert.equal(Foo.baz.notEquals(1).operator, '<>'); - assert.equal(Foo.baz.like('asdf').operator, 'LIKE'); - assert.equal(Foo.baz.notLike('asdf').operator, 'NOT LIKE'); - assert.equal(Foo.baz.isNull().operator, 'IS NULL'); - assert.equal(Foo.baz.isNotNull().operator, 'IS NOT NULL'); - assert.equal(Foo.baz.gt(1).operator, '>'); - assert.equal(Foo.baz.gte(1).operator, '>='); - assert.equal(Foo.baz.lt(1).operator, '<'); - assert.equal(Foo.baz.lte(1).operator, '<='); - assert.equal(Foo.baz.plus(1).operator, '+'); - assert.equal(Foo.baz.minus(1).operator, '-'); - assert.equal(Foo.baz.multiply(1).operator, '*'); - assert.equal(Foo.baz.leftShift(1).operator, '<<'); - assert.equal(Foo.baz.rightShift(1).operator, '>>'); - assert.equal(Foo.baz.bitwiseAnd(1).operator, '&'); - assert.equal(Foo.baz.bitwiseNot(1).operator, '~'); - assert.equal(Foo.baz.bitwiseOr(1).operator, '|'); - assert.equal(Foo.baz.bitwiseXor(1).operator, '#'); - assert.equal(Foo.baz.divide(1).operator, '/'); - assert.equal(Foo.baz.modulo(1).operator, '%'); - assert.equal(Foo.baz.regex(1).operator, '~'); - assert.equal(Foo.baz.iregex(1).operator, '~*'); - assert.equal(Foo.baz.notRegex(1).operator, '!~'); - assert.equal(Foo.baz.notIregex(1).operator, '!~*'); - assert.equal(Foo.baz.regexp(1).operator, 'REGEXP'); - assert.equal(Foo.baz.rlike(1).operator, 'RLIKE'); - assert.equal(Foo.baz.ilike('asdf').operator, 'ILIKE'); - assert.equal(Foo.baz.notIlike('asdf').operator, 'NOT ILIKE'); - assert.equal(Foo.baz.match('asdf').operator, '@@'); -}); diff --git a/test/binary-clause-tests.ts b/test/binary-clause-tests.ts new file mode 100644 index 00000000..e7ed1857 --- /dev/null +++ b/test/binary-clause-tests.ts @@ -0,0 +1,44 @@ +'use strict'; + +import { equal } from 'assert'; +import { Table } from '../lib/table'; + +const Foo = Table.define<{ baz: string; bar: string }>({ + name: 'foo', + columns: ['baz', 'bar'] +}); + +test('operators', function() { + equal(Foo.baz.equals(1).operator, '='); + equal(Foo.baz.equal(1).operator, '='); + equal(Foo.baz.notEqual(1).operator, '<>'); + equal(Foo.baz.notEquals(1).operator, '<>'); + equal(Foo.baz.like('asdf').operator, 'LIKE'); + equal(Foo.baz.notLike('asdf').operator, 'NOT LIKE'); + equal(Foo.baz.isNull().operator, 'IS NULL'); + equal(Foo.baz.isNotNull().operator, 'IS NOT NULL'); + equal(Foo.baz.gt(1).operator, '>'); + equal(Foo.baz.gte(1).operator, '>='); + equal(Foo.baz.lt(1).operator, '<'); + equal(Foo.baz.lte(1).operator, '<='); + equal(Foo.baz.plus(1).operator, '+'); + equal(Foo.baz.minus(1).operator, '-'); + equal(Foo.baz.multiply(1).operator, '*'); + equal(Foo.baz.leftShift(1).operator, '<<'); + equal(Foo.baz.rightShift(1).operator, '>>'); + equal(Foo.baz.bitwiseAnd(1).operator, '&'); + equal(Foo.baz.bitwiseNot(1).operator, '~'); + equal(Foo.baz.bitwiseOr(1).operator, '|'); + equal(Foo.baz.bitwiseXor(1).operator, '#'); + equal(Foo.baz.divide(1).operator, '/'); + equal(Foo.baz.modulo(1).operator, '%'); + equal(Foo.baz.regex(1).operator, '~'); + equal(Foo.baz.iregex(1).operator, '~*'); + equal(Foo.baz.notRegex(1).operator, '!~'); + equal(Foo.baz.notIregex(1).operator, '!~*'); + equal(Foo.baz.regexp(1).operator, 'REGEXP'); + equal(Foo.baz.rlike(1).operator, 'RLIKE'); + equal(Foo.baz.ilike('asdf').operator, 'ILIKE'); + equal(Foo.baz.notIlike('asdf').operator, 'NOT ILIKE'); + equal(Foo.baz.match('asdf').operator, '@@'); +}); diff --git a/test/clause-definition.js b/test/clause-definition.js deleted file mode 100644 index ebbf936d..00000000 --- a/test/clause-definition.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -var assert = require('assert'); - -var Node = require(__dirname + '/../lib/node/'); - -var Bang = Node.define({ - type: 'SELECT' -}); - -var Boom = Node.define({ - constructor: function(n) { - Node.call(this); - this.name = n; - } -}); - -test('clause definition', function() { - var select = new Bang(); - assert.equal(select.type, 'SELECT'); - assert.equal(select.nodes.length, 0); - - var q = new Boom('hai'); - assert.equal(q.nodes.length, 0); - var q2 = new Boom('bai'); - q.nodes.push(1); - assert.equal(q.nodes.length, 1); - assert.equal(q.name, 'hai'); - assert.equal(q2.nodes.length, 0); - assert.equal(q2.name, 'bai'); -}); diff --git a/test/clause-definition.ts b/test/clause-definition.ts new file mode 100644 index 00000000..aad35261 --- /dev/null +++ b/test/clause-definition.ts @@ -0,0 +1,34 @@ +'use strict'; + +import { equal } from 'assert'; + +import { Node } from '../lib/node/'; + +class Bang extends Node { + constructor() { + super('SELECT'); + } +} + +class Boom extends Node { + name: string; + constructor(n: string) { + super('BOOM'); + this.name = n; + } +} + +test('clause definition', function() { + const select = new Bang(); + equal(select.type, 'SELECT'); + equal(select.nodes.length, 0); + + const q = new Boom('hai'); + equal(q.nodes.length, 0); + const q2 = new Boom('bai'); + q.nodes.push(select); + equal(q.nodes.length, 1); + equal(q.name, 'hai'); + equal(q2.nodes.length, 0); + equal(q2.name, 'bai'); +}); diff --git a/test/column-tests.js b/test/column-tests.js deleted file mode 100644 index d0b95a14..00000000 --- a/test/column-tests.js +++ /dev/null @@ -1,131 +0,0 @@ -'use strict'; - -var assert = require('assert'); -var sql = require(__dirname + '/../lib'); - -describe('column', function() { - var table = sql.define({ - name: 'user', - columns: ['id', 'created', 'alias'] - }); - - it('can be accessed by property and array', function() { - assert.equal(table.created, table.columns[1], 'should be able to access created both by array and property'); - }); - - describe('toQuery()', function() { - it('works', function() { - assert.equal(table.id.toQuery().text, '"user"."id"'); - }); - - it('works with a column name of "alias"', function() { - assert.equal(table.alias.toQuery().text, '"user"."alias"'); - }); - - it('respects AS rename', function() { - assert.equal(table.id.as('userId').toQuery().text, '"user"."id" AS "userId"'); - }); - - it('respects count and distinct', function() { - assert.equal(table.id.count().distinct().as("userIdCount").toQuery().text, 'COUNT(DISTINCT("user"."id")) AS "userIdCount"'); - }); - - describe('in subquery with min', function() { - var subquery = table.subQuery('subTable').select(table.id.min().as('subId')); - var col = subquery.subId.toQuery().text; - assert.equal(col, '"subTable"."subId"'); - }); - - describe('property', function() { - var table = sql.define({ - name: 'roundtrip', - columns: { - column_name: { property: 'propertyName' } - } - }); - it('used as alias when !== column name', function() { - assert.equal(table.propertyName.toQuery().text, '"roundtrip"."column_name" AS "propertyName"'); - }); - it('uses explicit alias when !== column name', function() { - assert.equal(table.propertyName.as('alias').toQuery().text, '"roundtrip"."column_name" AS "alias"'); - }); - it('maps to column name in insert', function() { - assert.equal(table.insert({propertyName:'propVal'}).toQuery().text, 'INSERT INTO "roundtrip" ("column_name") VALUES ($1)'); - }); - it('maps to column name in update', function() { - assert.equal(table.update({propertyName:'propVal'}).toQuery().text, 'UPDATE "roundtrip" SET "column_name" = $1'); - }); - it('explicitly selected by *', function() { - assert.equal(table.select(table.star()).from(table).toQuery().text, 'SELECT "roundtrip"."column_name" AS "propertyName" FROM "roundtrip"'); - }); - }); - - describe('autoGenerate', function() { - var table = sql.define({ - name: 'ag', - columns: { - id: {autoGenerated: true}, - name: {} - } - }); - it('does not include auto generated columns in insert', function() { - assert.equal(table.insert({id:0, name:'name'}).toQuery().text,'INSERT INTO "ag" ("name") VALUES ($1)'); - }); - it('does not include auto generated columns in update', function() { - assert.equal(table.update({id:0, name:'name'}).toQuery().text,'UPDATE "ag" SET "name" = $1'); - }); - }); - - describe('white listed', function() { - var table = sql.define({ - name: 'wl', - columnWhiteList: true, - columns: ['id', 'name'] - }); - it('excludes insert properties that are not a column', function() { - assert.equal(table.insert({id:0, _private:'_private', name:'name'}).toQuery().text, 'INSERT INTO "wl" ("id", "name") VALUES ($1, $2)'); - }); - it('excludes update properties that are not a column', function() { - assert.equal(table.update({id:0, _private:'_private', name:'name'}).toQuery().text, 'UPDATE "wl" SET "id" = $1, "name" = $2'); - }); - }); - - describe('not white listed', function() { - var table = sql.define({ - name: 'wl', - columns: ['id', 'name'] - }); - it('throws for insert properties that are not a column', function() { - assert.throws(function() { table.insert({id:0, _private:'_private', name:'name'}); }, Error); - }); - it('throws for update properties that are not a column', function() { - assert.throws(function() { table.update({id:0, _private:'_private', name:'name'}); }, Error); - }); - }); - - describe('snake to camel', function() { - var table = sql.define({ - name: 'sc', - snakeToCamel: true, - columns: { - make_me_camel: {}, - not_to_camel: {property: 'not2Cam'} - } - }); - it('for snake column names with no explicit property name', function(){ - assert.equal(table.makeMeCamel.toQuery().text, '"sc"."make_me_camel" AS "makeMeCamel"'); - }); - it('but not when with explicit property name', function() { - assert.equal(table.not2Cam.toQuery().text, '"sc"."not_to_camel" AS "not2Cam"'); - }); - it('does not use property alias within CASE ... END', function() { - assert.equal(table.makeMeCamel.case([table.makeMeCamel.equals(0)],[table.makeMeCamel]).as('rename').toQuery().text, - '(CASE WHEN ("sc"."make_me_camel" = $1) THEN "sc"."make_me_camel" END) AS "rename"'); - }); - it('respects AS rename in RETURNING clause', function() { - assert.equal(table.update({makeMeCamel:0}).returning(table.makeMeCamel.as('rename')).toQuery().text, - 'UPDATE "sc" SET "make_me_camel" = $1 RETURNING "make_me_camel" AS "rename"'); - }); - }); - }); -}); diff --git a/test/column-tests.ts b/test/column-tests.ts new file mode 100644 index 00000000..02ac4a73 --- /dev/null +++ b/test/column-tests.ts @@ -0,0 +1,167 @@ +'use strict'; + +import { equal, throws } from 'assert'; +import { Sql } from '../lib'; + +const sql = new Sql(); + +describe('column', function() { + const table = sql.define<{ id: number; created: boolean; alias: string }>({ + name: 'user', + columns: ['id', 'created', 'alias'] + }); + + it('can be accessed by property and array', function() { + equal(table.created, table.columns[1], 'should be able to access created both by array and property'); + }); + + describe('toQuery()', function() { + it('works', function() { + equal(table.id.toQuery().text, '"user"."id"'); + }); + + it('works with a column name of "alias"', function() { + equal(table.alias.toQuery().text, '"user"."alias"'); + }); + + it('respects AS rename', function() { + equal(table.id.as('userId').toQuery().text, '"user"."id" AS "userId"'); + }); + + it('respects count and distinct', function() { + equal( + table.id + .count() + .distinct() + .as('userIdCount') + .toQuery().text, + 'COUNT(DISTINCT("user"."id")) AS "userIdCount"' + ); + }); + + describe('in subquery with min', function() { + const subquery = table.subQuery('subTable').select(table.id.min().as('subId')); + const col = subquery.subId.toQuery().text; + equal(col, '"subTable"."subId"'); + }); + + describe('property', function() { + const table = sql.define<{ propertyName: string }>({ + name: 'roundtrip', + columns: { + column_name: { property: 'propertyName' } + } + }); + it('used as alias when !== column name', function() { + equal(table.propertyName.toQuery().text, '"roundtrip"."column_name" AS "propertyName"'); + }); + it('uses explicit alias when !== column name', function() { + equal(table.propertyName.as('alias').toQuery().text, '"roundtrip"."column_name" AS "alias"'); + }); + it('maps to column name in insert', function() { + equal(table.insert({ propertyName: 'propVal' }).toQuery().text, 'INSERT INTO "roundtrip" ("column_name") VALUES ($1)'); + }); + it('maps to column name in update', function() { + equal(table.update({ propertyName: 'propVal' }).toQuery().text, 'UPDATE "roundtrip" SET "column_name" = $1'); + }); + it('explicitly selected by *', function() { + equal( + table + .select(table.star()) + .from(table) + .toQuery().text, + 'SELECT "roundtrip"."column_name" AS "propertyName" FROM "roundtrip"' + ); + }); + }); + + describe('autoGenerate', function() { + const table = sql.define({ + name: 'ag', + columns: { + id: { autoGenerated: true }, + name: {} + } + }); + it('does not include auto generated columns in insert', function() { + equal(table.insert({ id: 0, name: 'name' }).toQuery().text, 'INSERT INTO "ag" ("name") VALUES ($1)'); + }); + it('does not include auto generated columns in update', function() { + equal(table.update({ id: 0, name: 'name' }).toQuery().text, 'UPDATE "ag" SET "name" = $1'); + }); + }); + + describe('white listed', function() { + const table = sql.define({ + name: 'wl', + columnWhiteList: true, + columns: ['id', 'name'] + }); + it('excludes insert properties that are not a column', function() { + equal( + table.insert({ id: 0, _private: '_private', name: 'name' }).toQuery().text, + 'INSERT INTO "wl" ("id", "name") VALUES ($1, $2)' + ); + }); + it('excludes update properties that are not a column', function() { + // for testing purposes ignore the compile-time error + //@ts-ignore + equal(table.update({ id: 0, _private: '_private', name: 'name' }).toQuery().text, 'UPDATE "wl" SET "id" = $1, "name" = $2'); + }); + }); + + describe('not white listed', function() { + const table = sql.define({ + name: 'wl', + columns: ['id', 'name'] + }); + it('throws for insert properties that are not a column', function() { + throws(function() { + table.insert({ id: 0, _private: '_private', name: 'name' }); + }, Error); + }); + it('throws for update properties that are not a column', function() { + throws(function() { + // for testing purposes ignore the compile-time error + //@ts-ignore + table.update({ id: 0, _private: '_private', name: 'name' }); + }, Error); + }); + }); + + describe('snake to camel', function() { + const table = sql.define<{ makeMeCamel: number; not2Cam: string }>({ + name: 'sc', + snakeToCamel: true, + columns: { + make_me_camel: {}, + not_to_camel: { property: 'not2Cam' } + } + }); + it('for snake column names with no explicit property name', function() { + equal(table.makeMeCamel.toQuery().text, '"sc"."make_me_camel" AS "makeMeCamel"'); + }); + it('but not when with explicit property name', function() { + equal(table.not2Cam.toQuery().text, '"sc"."not_to_camel" AS "not2Cam"'); + }); + it('does not use property alias within CASE ... END', function() { + equal( + table.makeMeCamel + .case([table.makeMeCamel.equals(0)], [table.makeMeCamel]) + .as('rename') + .toQuery().text, + '(CASE WHEN ("sc"."make_me_camel" = $1) THEN "sc"."make_me_camel" END) AS "rename"' + ); + }); + it('respects AS rename in RETURNING clause', function() { + equal( + table + .update({ makeMeCamel: 0 }) + .returning(table.makeMeCamel.as('rename')) + .toQuery().text, + 'UPDATE "sc" SET "make_me_camel" = $1 RETURNING "make_me_camel" AS "rename"' + ); + }); + }); + }); +}); diff --git a/test/dialects/aggregate-tests.js b/test/dialects/aggregate-tests.js deleted file mode 100644 index 59d48d57..00000000 --- a/test/dialects/aggregate-tests.js +++ /dev/null @@ -1,477 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var customerAlias = Harness.defineCustomerAliasTable(); - - -Harness.test({ - query: post.select(post.count()), - pg: { - text : 'SELECT COUNT("post".*) AS "post_count" FROM "post"', - string: 'SELECT COUNT("post".*) AS "post_count" FROM "post"' - }, - sqlite: { - text : 'SELECT COUNT("post".*) AS "post_count" FROM "post"', - string: 'SELECT COUNT("post".*) AS "post_count" FROM "post"' - }, - mysql: { - text : 'SELECT COUNT(*) AS `post_count` FROM `post`', - string: 'SELECT COUNT(*) AS `post_count` FROM `post`' - }, - mssql: { - text : 'SELECT COUNT(*) AS [post_count] FROM [post]', - string: 'SELECT COUNT(*) AS [post_count] FROM [post]' - }, - oracle: { - text : 'SELECT COUNT(*) "post_count" FROM "post"', - string: 'SELECT COUNT(*) "post_count" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.count('post_count')), - pg: { - text : 'SELECT COUNT("post".*) AS "post_count" FROM "post"', - string: 'SELECT COUNT("post".*) AS "post_count" FROM "post"' - }, - sqlite: { - text : 'SELECT COUNT("post".*) AS "post_count" FROM "post"', - string: 'SELECT COUNT("post".*) AS "post_count" FROM "post"' - }, - msyql: { - text : 'SELECT COUNT(*) AS `post_count` FROM `post`', - string: 'SELECT COUNT(*) AS `post_count` FROM `post`' - }, - mssql: { - text : 'SELECT COUNT(*) AS [post_count] FROM [post]', - string: 'SELECT COUNT(*) AS [post_count] FROM [post]' - }, - oracle: { - text : 'SELECT COUNT(*) "post_count" FROM "post"', - string: 'SELECT COUNT(*) "post_count" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.count().as('post_amount')), - pg: { - text : 'SELECT COUNT("post".*) AS "post_amount" FROM "post"', - string: 'SELECT COUNT("post".*) AS "post_amount" FROM "post"' - }, - sqlite: { - text : 'SELECT COUNT("post".*) AS "post_amount" FROM "post"', - string: 'SELECT COUNT("post".*) AS "post_amount" FROM "post"' - }, - mysql: { - text : 'SELECT COUNT(*) AS `post_amount` FROM `post`', - string: 'SELECT COUNT(*) AS `post_amount` FROM `post`' - }, - mssql: { - text : 'SELECT COUNT(*) AS [post_amount] FROM [post]', - string: 'SELECT COUNT(*) AS [post_amount] FROM [post]' - }, - oracle: { - text : 'SELECT COUNT(*) "post_amount" FROM "post"', - string: 'SELECT COUNT(*) "post_amount" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content.count()), - pg: { - text : 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', - string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' - }, - sqlite: { - text : 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', - string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' - }, - mysql: { - text : 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`', - string: 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`' - }, - mssql: { - text : 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]', - string: 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]' - }, - oracle: { - text : 'SELECT COUNT("post"."content") "content_count" FROM "post"', - string: 'SELECT COUNT("post"."content") "content_count" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content.count('content_count')), - pg: { - text : 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', - string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' - }, - sqlite: { - text : 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', - string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' - }, - mysql: { - text : 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`', - string: 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`' - }, - mssql: { - text : 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]', - string: 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]' - }, - oracle: { - text : 'SELECT COUNT("post"."content") "content_count" FROM "post"', - string: 'SELECT COUNT("post"."content") "content_count" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content.count().as('content_count')), - pg: { - text : 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', - string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' - }, - sqlite: { - text : 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', - string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' - }, - mysql: { - text : 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`', - string: 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`' - }, - mssql: { - text : 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]', - string: 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]' - }, - oracle: { - text : 'SELECT COUNT("post"."content") "content_count" FROM "post"', - string: 'SELECT COUNT("post"."content") "content_count" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: customerAlias.select(customerAlias.count()), - pg: { - text : 'SELECT COUNT("customer".*) AS "customer_count" FROM "customer"', - string: 'SELECT COUNT("customer".*) AS "customer_count" FROM "customer"' - }, - sqlite: { - text : 'SELECT COUNT("customer".*) AS "customer_count" FROM "customer"', - string: 'SELECT COUNT("customer".*) AS "customer_count" FROM "customer"' - }, - mysql: { - text : 'SELECT COUNT(*) AS `customer_count` FROM `customer`', - string: 'SELECT COUNT(*) AS `customer_count` FROM `customer`' - }, - oracle: { - text : 'SELECT COUNT(*) "customer_count" FROM "customer"', - string: 'SELECT COUNT(*) "customer_count" FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.min()), - pg: { - text : 'SELECT MIN("post"."id") AS "id_min" FROM "post"', - string: 'SELECT MIN("post"."id") AS "id_min" FROM "post"' - }, - sqlite: { - text : 'SELECT MIN("post"."id") AS "id_min" FROM "post"', - string: 'SELECT MIN("post"."id") AS "id_min" FROM "post"' - }, - mysql: { - text : 'SELECT MIN(`post`.`id`) AS `id_min` FROM `post`', - string: 'SELECT MIN(`post`.`id`) AS `id_min` FROM `post`' - }, - mssql: { - text : 'SELECT MIN([post].[id]) AS [id_min] FROM [post]', - string: 'SELECT MIN([post].[id]) AS [id_min] FROM [post]' - }, - oracle: { - text : 'SELECT MIN("post"."id") "id_min" FROM "post"', - string: 'SELECT MIN("post"."id") "id_min" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.min().as('min_id')), - pg: { - text : 'SELECT MIN("post"."id") AS "min_id" FROM "post"', - string: 'SELECT MIN("post"."id") AS "min_id" FROM "post"' - }, - sqlite: { - text : 'SELECT MIN("post"."id") AS "min_id" FROM "post"', - string: 'SELECT MIN("post"."id") AS "min_id" FROM "post"' - }, - mysql: { - text : 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`', - string: 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`' - }, - mssql: { - text : 'SELECT MIN([post].[id]) AS [min_id] FROM [post]', - string: 'SELECT MIN([post].[id]) AS [min_id] FROM [post]' - }, - oracle: { - text : 'SELECT MIN("post"."id") "min_id" FROM "post"', - string: 'SELECT MIN("post"."id") "min_id" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.min('min_id')), - pg: { - text : 'SELECT MIN("post"."id") AS "min_id" FROM "post"', - string: 'SELECT MIN("post"."id") AS "min_id" FROM "post"' - }, - sqlite: { - text : 'SELECT MIN("post"."id") AS "min_id" FROM "post"', - string: 'SELECT MIN("post"."id") AS "min_id" FROM "post"' - }, - mysql: { - text : 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`', - string: 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`' - }, - mssql: { - text : 'SELECT MIN([post].[id]) AS [min_id] FROM [post]', - string: 'SELECT MIN([post].[id]) AS [min_id] FROM [post]' - }, - oracle: { - text : 'SELECT MIN("post"."id") "min_id" FROM "post"', - string: 'SELECT MIN("post"."id") "min_id" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.max()), - pg: { - text : 'SELECT MAX("post"."id") AS "id_max" FROM "post"', - string: 'SELECT MAX("post"."id") AS "id_max" FROM "post"' - }, - sqlite: { - text : 'SELECT MAX("post"."id") AS "id_max" FROM "post"', - string: 'SELECT MAX("post"."id") AS "id_max" FROM "post"' - }, - mysql: { - text : 'SELECT MAX(`post`.`id`) AS `id_max` FROM `post`', - string: 'SELECT MAX(`post`.`id`) AS `id_max` FROM `post`' - }, - mssql: { - text : 'SELECT MAX([post].[id]) AS [id_max] FROM [post]', - string: 'SELECT MAX([post].[id]) AS [id_max] FROM [post]' - }, - oracle: { - text : 'SELECT MAX("post"."id") "id_max" FROM "post"', - string: 'SELECT MAX("post"."id") "id_max" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.max().as('max_id')), - pg: { - text : 'SELECT MAX("post"."id") AS "max_id" FROM "post"', - string: 'SELECT MAX("post"."id") AS "max_id" FROM "post"' - }, - sqlite: { - text : 'SELECT MAX("post"."id") AS "max_id" FROM "post"', - string: 'SELECT MAX("post"."id") AS "max_id" FROM "post"' - }, - mysql: { - text : 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`', - string: 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`' - }, - mssql: { - text : 'SELECT MAX([post].[id]) AS [max_id] FROM [post]', - string: 'SELECT MAX([post].[id]) AS [max_id] FROM [post]' - }, - oracle: { - text : 'SELECT MAX("post"."id") "max_id" FROM "post"', - string: 'SELECT MAX("post"."id") "max_id" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.max('max_id')), - pg: { - text : 'SELECT MAX("post"."id") AS "max_id" FROM "post"', - string: 'SELECT MAX("post"."id") AS "max_id" FROM "post"' - }, - sqlite: { - text : 'SELECT MAX("post"."id") AS "max_id" FROM "post"', - string: 'SELECT MAX("post"."id") AS "max_id" FROM "post"' - }, - mysql: { - text : 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`', - string: 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`' - }, - mssql: { - text : 'SELECT MAX([post].[id]) AS [max_id] FROM [post]', - string: 'SELECT MAX([post].[id]) AS [max_id] FROM [post]' - }, - oracle: { - text : 'SELECT MAX("post"."id") "max_id" FROM "post"', - string: 'SELECT MAX("post"."id") "max_id" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.sum()), - pg: { - text : 'SELECT SUM("post"."id") AS "id_sum" FROM "post"', - string: 'SELECT SUM("post"."id") AS "id_sum" FROM "post"' - }, - sqlite: { - text : 'SELECT SUM("post"."id") AS "id_sum" FROM "post"', - string: 'SELECT SUM("post"."id") AS "id_sum" FROM "post"' - }, - mysql: { - text : 'SELECT SUM(`post`.`id`) AS `id_sum` FROM `post`', - string: 'SELECT SUM(`post`.`id`) AS `id_sum` FROM `post`' - }, - mssql: { - text : 'SELECT SUM([post].[id]) AS [id_sum] FROM [post]', - string: 'SELECT SUM([post].[id]) AS [id_sum] FROM [post]' - }, - oracle: { - text : 'SELECT SUM("post"."id") "id_sum" FROM "post"', - string: 'SELECT SUM("post"."id") "id_sum" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.sum().as('sum_id')), - pg: { - text : 'SELECT SUM("post"."id") AS "sum_id" FROM "post"', - string: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"' - }, - sqlite: { - text : 'SELECT SUM("post"."id") AS "sum_id" FROM "post"', - string: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"' - }, - mysql: { - text : 'SELECT SUM(`post`.`id`) AS `sum_id` FROM `post`', - string: 'SELECT SUM(`post`.`id`) AS `sum_id` FROM `post`' - }, - mssql: { - text : 'SELECT SUM([post].[id]) AS [sum_id] FROM [post]', - string: 'SELECT SUM([post].[id]) AS [sum_id] FROM [post]' - }, - oracle: { - text : 'SELECT SUM("post"."id") "sum_id" FROM "post"', - string: 'SELECT SUM("post"."id") "sum_id" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.sum('sum_id')), - pg: { - text : 'SELECT SUM("post"."id") AS "sum_id" FROM "post"', - string: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"' - }, - sqlite: { - text : 'SELECT SUM("post"."id") AS "sum_id" FROM "post"', - string: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"' - }, - mysql: { - text : 'SELECT SUM(`post`.`id`) AS `sum_id` FROM `post`', - string: 'SELECT SUM(`post`.`id`) AS `sum_id` FROM `post`' - }, - mssql: { - text : 'SELECT SUM([post].[id]) AS [sum_id] FROM [post]', - string: 'SELECT SUM([post].[id]) AS [sum_id] FROM [post]' - }, - oracle: { - text : 'SELECT SUM("post"."id") "sum_id" FROM "post"', - string: 'SELECT SUM("post"."id") "sum_id" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.avg()), - pg: { - text : 'SELECT AVG("post"."id") AS "id_avg" FROM "post"', - string: 'SELECT AVG("post"."id") AS "id_avg" FROM "post"' - }, - sqlite: { - text : 'SELECT AVG("post"."id") AS "id_avg" FROM "post"', - string: 'SELECT AVG("post"."id") AS "id_avg" FROM "post"' - }, - mysql: { - text : 'SELECT AVG(`post`.`id`) AS `id_avg` FROM `post`', - string: 'SELECT AVG(`post`.`id`) AS `id_avg` FROM `post`' - }, - mssql: { - text : 'SELECT AVG([post].[id]) AS [id_avg] FROM [post]', - string: 'SELECT AVG([post].[id]) AS [id_avg] FROM [post]' - }, - oracle: { - text : 'SELECT AVG("post"."id") "id_avg" FROM "post"', - string: 'SELECT AVG("post"."id") "id_avg" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.avg().as('avg_id')), - pg: { - text : 'SELECT AVG("post"."id") AS "avg_id" FROM "post"', - string: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"' - }, - sqlite: { - text : 'SELECT AVG("post"."id") AS "avg_id" FROM "post"', - string: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"' - }, - mysql: { - text : 'SELECT AVG(`post`.`id`) AS `avg_id` FROM `post`', - string: 'SELECT AVG(`post`.`id`) AS `avg_id` FROM `post`' - }, - mssql: { - text : 'SELECT AVG([post].[id]) AS [avg_id] FROM [post]', - string: 'SELECT AVG([post].[id]) AS [avg_id] FROM [post]' - }, - oracle: { - text : 'SELECT AVG("post"."id") "avg_id" FROM "post"', - string: 'SELECT AVG("post"."id") "avg_id" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.avg('avg_id')), - pg: { - text : 'SELECT AVG("post"."id") AS "avg_id" FROM "post"', - string: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"' - }, - sqlite: { - text : 'SELECT AVG("post"."id") AS "avg_id" FROM "post"', - string: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"' - }, - mysql: { - text : 'SELECT AVG(`post`.`id`) AS `avg_id` FROM `post`', - string: 'SELECT AVG(`post`.`id`) AS `avg_id` FROM `post`' - }, - mssql: { - text : 'SELECT AVG([post].[id]) AS [avg_id] FROM [post]', - string: 'SELECT AVG([post].[id]) AS [avg_id] FROM [post]' - }, - oracle: { - text : 'SELECT AVG("post"."id") "avg_id" FROM "post"', - string: 'SELECT AVG("post"."id") "avg_id" FROM "post"' - }, - params: [] -}); diff --git a/test/dialects/aggregate-tests.ts b/test/dialects/aggregate-tests.ts new file mode 100644 index 00000000..5835df1b --- /dev/null +++ b/test/dialects/aggregate-tests.ts @@ -0,0 +1,476 @@ +'use strict'; + +import * as Harness from './support'; +const customerAlias = Harness.defineCustomerAliasTable(); +const post = Harness.definePostTable(); + +Harness.test({ + query: post.select(post.count()), + pg: { + text: 'SELECT COUNT("post".*) AS "post_count" FROM "post"', + string: 'SELECT COUNT("post".*) AS "post_count" FROM "post"' + }, + sqlite: { + text: 'SELECT COUNT("post".*) AS "post_count" FROM "post"', + string: 'SELECT COUNT("post".*) AS "post_count" FROM "post"' + }, + mysql: { + text: 'SELECT COUNT(*) AS `post_count` FROM `post`', + string: 'SELECT COUNT(*) AS `post_count` FROM `post`' + }, + mssql: { + text: 'SELECT COUNT(*) AS [post_count] FROM [post]', + string: 'SELECT COUNT(*) AS [post_count] FROM [post]' + }, + oracle: { + text: 'SELECT COUNT(*) "post_count" FROM "post"', + string: 'SELECT COUNT(*) "post_count" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.count('post_count')), + pg: { + text: 'SELECT COUNT("post".*) AS "post_count" FROM "post"', + string: 'SELECT COUNT("post".*) AS "post_count" FROM "post"' + }, + sqlite: { + text: 'SELECT COUNT("post".*) AS "post_count" FROM "post"', + string: 'SELECT COUNT("post".*) AS "post_count" FROM "post"' + }, + msyql: { + text: 'SELECT COUNT(*) AS `post_count` FROM `post`', + string: 'SELECT COUNT(*) AS `post_count` FROM `post`' + }, + mssql: { + text: 'SELECT COUNT(*) AS [post_count] FROM [post]', + string: 'SELECT COUNT(*) AS [post_count] FROM [post]' + }, + oracle: { + text: 'SELECT COUNT(*) "post_count" FROM "post"', + string: 'SELECT COUNT(*) "post_count" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.count().as('post_amount')), + pg: { + text: 'SELECT COUNT("post".*) AS "post_amount" FROM "post"', + string: 'SELECT COUNT("post".*) AS "post_amount" FROM "post"' + }, + sqlite: { + text: 'SELECT COUNT("post".*) AS "post_amount" FROM "post"', + string: 'SELECT COUNT("post".*) AS "post_amount" FROM "post"' + }, + mysql: { + text: 'SELECT COUNT(*) AS `post_amount` FROM `post`', + string: 'SELECT COUNT(*) AS `post_amount` FROM `post`' + }, + mssql: { + text: 'SELECT COUNT(*) AS [post_amount] FROM [post]', + string: 'SELECT COUNT(*) AS [post_amount] FROM [post]' + }, + oracle: { + text: 'SELECT COUNT(*) "post_amount" FROM "post"', + string: 'SELECT COUNT(*) "post_amount" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content.count()), + pg: { + text: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', + string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' + }, + sqlite: { + text: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', + string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' + }, + mysql: { + text: 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`', + string: 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`' + }, + mssql: { + text: 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]', + string: 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]' + }, + oracle: { + text: 'SELECT COUNT("post"."content") "content_count" FROM "post"', + string: 'SELECT COUNT("post"."content") "content_count" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content.count('content_count')), + pg: { + text: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', + string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' + }, + sqlite: { + text: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', + string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' + }, + mysql: { + text: 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`', + string: 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`' + }, + mssql: { + text: 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]', + string: 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]' + }, + oracle: { + text: 'SELECT COUNT("post"."content") "content_count" FROM "post"', + string: 'SELECT COUNT("post"."content") "content_count" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content.count().as('content_count')), + pg: { + text: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', + string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' + }, + sqlite: { + text: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"', + string: 'SELECT COUNT("post"."content") AS "content_count" FROM "post"' + }, + mysql: { + text: 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`', + string: 'SELECT COUNT(`post`.`content`) AS `content_count` FROM `post`' + }, + mssql: { + text: 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]', + string: 'SELECT COUNT([post].[content]) AS [content_count] FROM [post]' + }, + oracle: { + text: 'SELECT COUNT("post"."content") "content_count" FROM "post"', + string: 'SELECT COUNT("post"."content") "content_count" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: customerAlias.select(customerAlias.count()), + pg: { + text: 'SELECT COUNT("customer".*) AS "customer_count" FROM "customer"', + string: 'SELECT COUNT("customer".*) AS "customer_count" FROM "customer"' + }, + sqlite: { + text: 'SELECT COUNT("customer".*) AS "customer_count" FROM "customer"', + string: 'SELECT COUNT("customer".*) AS "customer_count" FROM "customer"' + }, + mysql: { + text: 'SELECT COUNT(*) AS `customer_count` FROM `customer`', + string: 'SELECT COUNT(*) AS `customer_count` FROM `customer`' + }, + oracle: { + text: 'SELECT COUNT(*) "customer_count" FROM "customer"', + string: 'SELECT COUNT(*) "customer_count" FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.min()), + pg: { + text: 'SELECT MIN("post"."id") AS "id_min" FROM "post"', + string: 'SELECT MIN("post"."id") AS "id_min" FROM "post"' + }, + sqlite: { + text: 'SELECT MIN("post"."id") AS "id_min" FROM "post"', + string: 'SELECT MIN("post"."id") AS "id_min" FROM "post"' + }, + mysql: { + text: 'SELECT MIN(`post`.`id`) AS `id_min` FROM `post`', + string: 'SELECT MIN(`post`.`id`) AS `id_min` FROM `post`' + }, + mssql: { + text: 'SELECT MIN([post].[id]) AS [id_min] FROM [post]', + string: 'SELECT MIN([post].[id]) AS [id_min] FROM [post]' + }, + oracle: { + text: 'SELECT MIN("post"."id") "id_min" FROM "post"', + string: 'SELECT MIN("post"."id") "id_min" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.min().as('min_id')), + pg: { + text: 'SELECT MIN("post"."id") AS "min_id" FROM "post"', + string: 'SELECT MIN("post"."id") AS "min_id" FROM "post"' + }, + sqlite: { + text: 'SELECT MIN("post"."id") AS "min_id" FROM "post"', + string: 'SELECT MIN("post"."id") AS "min_id" FROM "post"' + }, + mysql: { + text: 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`', + string: 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`' + }, + mssql: { + text: 'SELECT MIN([post].[id]) AS [min_id] FROM [post]', + string: 'SELECT MIN([post].[id]) AS [min_id] FROM [post]' + }, + oracle: { + text: 'SELECT MIN("post"."id") "min_id" FROM "post"', + string: 'SELECT MIN("post"."id") "min_id" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.min('min_id')), + pg: { + text: 'SELECT MIN("post"."id") AS "min_id" FROM "post"', + string: 'SELECT MIN("post"."id") AS "min_id" FROM "post"' + }, + sqlite: { + text: 'SELECT MIN("post"."id") AS "min_id" FROM "post"', + string: 'SELECT MIN("post"."id") AS "min_id" FROM "post"' + }, + mysql: { + text: 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`', + string: 'SELECT MIN(`post`.`id`) AS `min_id` FROM `post`' + }, + mssql: { + text: 'SELECT MIN([post].[id]) AS [min_id] FROM [post]', + string: 'SELECT MIN([post].[id]) AS [min_id] FROM [post]' + }, + oracle: { + text: 'SELECT MIN("post"."id") "min_id" FROM "post"', + string: 'SELECT MIN("post"."id") "min_id" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.max()), + pg: { + text: 'SELECT MAX("post"."id") AS "id_max" FROM "post"', + string: 'SELECT MAX("post"."id") AS "id_max" FROM "post"' + }, + sqlite: { + text: 'SELECT MAX("post"."id") AS "id_max" FROM "post"', + string: 'SELECT MAX("post"."id") AS "id_max" FROM "post"' + }, + mysql: { + text: 'SELECT MAX(`post`.`id`) AS `id_max` FROM `post`', + string: 'SELECT MAX(`post`.`id`) AS `id_max` FROM `post`' + }, + mssql: { + text: 'SELECT MAX([post].[id]) AS [id_max] FROM [post]', + string: 'SELECT MAX([post].[id]) AS [id_max] FROM [post]' + }, + oracle: { + text: 'SELECT MAX("post"."id") "id_max" FROM "post"', + string: 'SELECT MAX("post"."id") "id_max" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.max().as('max_id')), + pg: { + text: 'SELECT MAX("post"."id") AS "max_id" FROM "post"', + string: 'SELECT MAX("post"."id") AS "max_id" FROM "post"' + }, + sqlite: { + text: 'SELECT MAX("post"."id") AS "max_id" FROM "post"', + string: 'SELECT MAX("post"."id") AS "max_id" FROM "post"' + }, + mysql: { + text: 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`', + string: 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`' + }, + mssql: { + text: 'SELECT MAX([post].[id]) AS [max_id] FROM [post]', + string: 'SELECT MAX([post].[id]) AS [max_id] FROM [post]' + }, + oracle: { + text: 'SELECT MAX("post"."id") "max_id" FROM "post"', + string: 'SELECT MAX("post"."id") "max_id" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.max('max_id')), + pg: { + text: 'SELECT MAX("post"."id") AS "max_id" FROM "post"', + string: 'SELECT MAX("post"."id") AS "max_id" FROM "post"' + }, + sqlite: { + text: 'SELECT MAX("post"."id") AS "max_id" FROM "post"', + string: 'SELECT MAX("post"."id") AS "max_id" FROM "post"' + }, + mysql: { + text: 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`', + string: 'SELECT MAX(`post`.`id`) AS `max_id` FROM `post`' + }, + mssql: { + text: 'SELECT MAX([post].[id]) AS [max_id] FROM [post]', + string: 'SELECT MAX([post].[id]) AS [max_id] FROM [post]' + }, + oracle: { + text: 'SELECT MAX("post"."id") "max_id" FROM "post"', + string: 'SELECT MAX("post"."id") "max_id" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.sum()), + pg: { + text: 'SELECT SUM("post"."id") AS "id_sum" FROM "post"', + string: 'SELECT SUM("post"."id") AS "id_sum" FROM "post"' + }, + sqlite: { + text: 'SELECT SUM("post"."id") AS "id_sum" FROM "post"', + string: 'SELECT SUM("post"."id") AS "id_sum" FROM "post"' + }, + mysql: { + text: 'SELECT SUM(`post`.`id`) AS `id_sum` FROM `post`', + string: 'SELECT SUM(`post`.`id`) AS `id_sum` FROM `post`' + }, + mssql: { + text: 'SELECT SUM([post].[id]) AS [id_sum] FROM [post]', + string: 'SELECT SUM([post].[id]) AS [id_sum] FROM [post]' + }, + oracle: { + text: 'SELECT SUM("post"."id") "id_sum" FROM "post"', + string: 'SELECT SUM("post"."id") "id_sum" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.sum().as('sum_id')), + pg: { + text: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"', + string: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"' + }, + sqlite: { + text: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"', + string: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"' + }, + mysql: { + text: 'SELECT SUM(`post`.`id`) AS `sum_id` FROM `post`', + string: 'SELECT SUM(`post`.`id`) AS `sum_id` FROM `post`' + }, + mssql: { + text: 'SELECT SUM([post].[id]) AS [sum_id] FROM [post]', + string: 'SELECT SUM([post].[id]) AS [sum_id] FROM [post]' + }, + oracle: { + text: 'SELECT SUM("post"."id") "sum_id" FROM "post"', + string: 'SELECT SUM("post"."id") "sum_id" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.sum('sum_id')), + pg: { + text: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"', + string: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"' + }, + sqlite: { + text: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"', + string: 'SELECT SUM("post"."id") AS "sum_id" FROM "post"' + }, + mysql: { + text: 'SELECT SUM(`post`.`id`) AS `sum_id` FROM `post`', + string: 'SELECT SUM(`post`.`id`) AS `sum_id` FROM `post`' + }, + mssql: { + text: 'SELECT SUM([post].[id]) AS [sum_id] FROM [post]', + string: 'SELECT SUM([post].[id]) AS [sum_id] FROM [post]' + }, + oracle: { + text: 'SELECT SUM("post"."id") "sum_id" FROM "post"', + string: 'SELECT SUM("post"."id") "sum_id" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.avg()), + pg: { + text: 'SELECT AVG("post"."id") AS "id_avg" FROM "post"', + string: 'SELECT AVG("post"."id") AS "id_avg" FROM "post"' + }, + sqlite: { + text: 'SELECT AVG("post"."id") AS "id_avg" FROM "post"', + string: 'SELECT AVG("post"."id") AS "id_avg" FROM "post"' + }, + mysql: { + text: 'SELECT AVG(`post`.`id`) AS `id_avg` FROM `post`', + string: 'SELECT AVG(`post`.`id`) AS `id_avg` FROM `post`' + }, + mssql: { + text: 'SELECT AVG([post].[id]) AS [id_avg] FROM [post]', + string: 'SELECT AVG([post].[id]) AS [id_avg] FROM [post]' + }, + oracle: { + text: 'SELECT AVG("post"."id") "id_avg" FROM "post"', + string: 'SELECT AVG("post"."id") "id_avg" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.avg().as('avg_id')), + pg: { + text: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"', + string: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"' + }, + sqlite: { + text: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"', + string: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"' + }, + mysql: { + text: 'SELECT AVG(`post`.`id`) AS `avg_id` FROM `post`', + string: 'SELECT AVG(`post`.`id`) AS `avg_id` FROM `post`' + }, + mssql: { + text: 'SELECT AVG([post].[id]) AS [avg_id] FROM [post]', + string: 'SELECT AVG([post].[id]) AS [avg_id] FROM [post]' + }, + oracle: { + text: 'SELECT AVG("post"."id") "avg_id" FROM "post"', + string: 'SELECT AVG("post"."id") "avg_id" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.avg('avg_id')), + pg: { + text: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"', + string: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"' + }, + sqlite: { + text: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"', + string: 'SELECT AVG("post"."id") AS "avg_id" FROM "post"' + }, + mysql: { + text: 'SELECT AVG(`post`.`id`) AS `avg_id` FROM `post`', + string: 'SELECT AVG(`post`.`id`) AS `avg_id` FROM `post`' + }, + mssql: { + text: 'SELECT AVG([post].[id]) AS [avg_id] FROM [post]', + string: 'SELECT AVG([post].[id]) AS [avg_id] FROM [post]' + }, + oracle: { + text: 'SELECT AVG("post"."id") "avg_id" FROM "post"', + string: 'SELECT AVG("post"."id") "avg_id" FROM "post"' + }, + params: [] +}); diff --git a/test/dialects/alias-tests.js b/test/dialects/alias-tests.js deleted file mode 100644 index 32db9308..00000000 --- a/test/dialects/alias-tests.js +++ /dev/null @@ -1,122 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var Sql = require('../../lib').setDialect('postgres'); - -Harness.test({ - query: customer.select(customer.name.isNull().as('nameIsNull')), - pg: { - text : 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"', - string: 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"' - }, - sqlite: { - text : 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"', - string: 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"' - }, - mysql: { - text : 'SELECT (`customer`.`name` IS NULL) AS `nameIsNull` FROM `customer`', - string: 'SELECT (`customer`.`name` IS NULL) AS `nameIsNull` FROM `customer`' - }, - mssql: { - text : 'SELECT ([customer].[name] IS NULL) AS [nameIsNull] FROM [customer]', - string: 'SELECT ([customer].[name] IS NULL) AS [nameIsNull] FROM [customer]' - }, - oracle: { - text : 'SELECT ("customer"."name" IS NULL) "nameIsNull" FROM "customer"', - string: 'SELECT ("customer"."name" IS NULL) "nameIsNull" FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: customer.select(customer.name.plus(customer.age).as('nameAndAge')).where(customer.age.gt(10).and(customer.age.lt(20))), - pg: { - text : 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > $1) AND ("customer"."age" < $2))', - string: 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > 10) AND ("customer"."age" < 20))' - }, - sqlite: { - text : 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > $1) AND ("customer"."age" < $2))', - string: 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > 10) AND ("customer"."age" < 20))' - }, - mysql: { - text : 'SELECT (`customer`.`name` + `customer`.`age`) AS `nameAndAge` FROM `customer` WHERE ((`customer`.`age` > ?) AND (`customer`.`age` < ?))', - string: 'SELECT (`customer`.`name` + `customer`.`age`) AS `nameAndAge` FROM `customer` WHERE ((`customer`.`age` > 10) AND (`customer`.`age` < 20))' - }, - mssql: { - text : 'SELECT ([customer].[name] + [customer].[age]) AS [nameAndAge] FROM [customer] WHERE (([customer].[age] > @1) AND ([customer].[age] < @2))', - string: 'SELECT ([customer].[name] + [customer].[age]) AS [nameAndAge] FROM [customer] WHERE (([customer].[age] > 10) AND ([customer].[age] < 20))' - }, - oracle: { - text : 'SELECT ("customer"."name" + "customer"."age") "nameAndAge" FROM "customer" WHERE (("customer"."age" > :1) AND ("customer"."age" < :2))', - string: 'SELECT ("customer"."name" + "customer"."age") "nameAndAge" FROM "customer" WHERE (("customer"."age" > 10) AND ("customer"."age" < 20))' - }, - params: [10, 20] -}); - -Harness.test({ - query: customer.select(customer.age.between(10, 20).as('ageBetween')), - pg: { - text : 'SELECT ("customer"."age" BETWEEN $1 AND $2) AS "ageBetween" FROM "customer"', - string: 'SELECT ("customer"."age" BETWEEN 10 AND 20) AS "ageBetween" FROM "customer"' - }, - sqlite: { - text : 'SELECT ("customer"."age" BETWEEN $1 AND $2) AS "ageBetween" FROM "customer"', - string: 'SELECT ("customer"."age" BETWEEN 10 AND 20) AS "ageBetween" FROM "customer"' - }, - mysql: { - text : 'SELECT (`customer`.`age` BETWEEN ? AND ?) AS `ageBetween` FROM `customer`', - string: 'SELECT (`customer`.`age` BETWEEN 10 AND 20) AS `ageBetween` FROM `customer`' - }, - mssql: { - text : 'SELECT ([customer].[age] BETWEEN @1 AND @2) AS [ageBetween] FROM [customer]', - string: 'SELECT ([customer].[age] BETWEEN 10 AND 20) AS [ageBetween] FROM [customer]' - }, - oracle: { - text : 'SELECT ("customer"."age" BETWEEN :1 AND :2) "ageBetween" FROM "customer"', - string: 'SELECT ("customer"."age" BETWEEN 10 AND 20) "ageBetween" FROM "customer"' - }, - params: [10, 20] -}); - -Harness.test({ - query: customer.select(Sql.functions.ROUND(customer.age.as('ageBetween'), 2)), - pg: { - text : 'SELECT ROUND("customer"."age", $1) FROM "customer"', - string: 'SELECT ROUND("customer"."age", 2) FROM "customer"' - }, - sqlite: { - text : 'SELECT ROUND("customer"."age", $1) FROM "customer"', - string: 'SELECT ROUND("customer"."age", 2) FROM "customer"' - }, - mysql: { - text : 'SELECT ROUND(`customer`.`age`, ?) FROM `customer`', - string: 'SELECT ROUND(`customer`.`age`, 2) FROM `customer`' - }, - mssql: { - text : 'SELECT ROUND([customer].[age], @1) FROM [customer]', - string: 'SELECT ROUND([customer].[age], 2) FROM [customer]' - }, - oracle: { - text : 'SELECT ROUND("customer"."age", :1) FROM "customer"', - string: 'SELECT ROUND("customer"."age", 2) FROM "customer"' - }, - params: [2] -}); - -Harness.test({ - query: customer.select(customer.age.notBetween(10, 20).as('ageNotBetween')), - pg: { - text : 'SELECT ("customer"."age" NOT BETWEEN $1 AND $2) AS "ageNotBetween" FROM "customer"', - string: 'SELECT ("customer"."age" NOT BETWEEN 10 AND 20) AS "ageNotBetween" FROM "customer"' - }, - sqlite: { - text : 'SELECT ("customer"."age" NOT BETWEEN $1 AND $2) AS "ageNotBetween" FROM "customer"', - string: 'SELECT ("customer"."age" NOT BETWEEN 10 AND 20) AS "ageNotBetween" FROM "customer"' - }, - mysql: { - text : 'SELECT (`customer`.`age` NOT BETWEEN ? AND ?) AS `ageNotBetween` FROM `customer`', - string: 'SELECT (`customer`.`age` NOT BETWEEN 10 AND 20) AS `ageNotBetween` FROM `customer`' - }, - params: [10, 20] -}); diff --git a/test/dialects/alias-tests.ts b/test/dialects/alias-tests.ts new file mode 100644 index 00000000..3dec1125 --- /dev/null +++ b/test/dialects/alias-tests.ts @@ -0,0 +1,133 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const customer = Harness.defineCustomerTable(); +const instance = new Sql('postgres'); + +Harness.test({ + query: customer.select(customer.name.isNull().as('nameIsNull')), + pg: { + text: 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"', + string: 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"' + }, + sqlite: { + text: 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"', + string: 'SELECT ("customer"."name" IS NULL) AS "nameIsNull" FROM "customer"' + }, + mysql: { + text: 'SELECT (`customer`.`name` IS NULL) AS `nameIsNull` FROM `customer`', + string: 'SELECT (`customer`.`name` IS NULL) AS `nameIsNull` FROM `customer`' + }, + mssql: { + text: 'SELECT ([customer].[name] IS NULL) AS [nameIsNull] FROM [customer]', + string: 'SELECT ([customer].[name] IS NULL) AS [nameIsNull] FROM [customer]' + }, + oracle: { + text: 'SELECT ("customer"."name" IS NULL) "nameIsNull" FROM "customer"', + string: 'SELECT ("customer"."name" IS NULL) "nameIsNull" FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customer.select(customer.name.plus(customer.age).as('nameAndAge')).where(customer.age.gt(10).and(customer.age.lt(20))), + pg: { + text: + 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > $1) AND ("customer"."age" < $2))', + string: + 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > 10) AND ("customer"."age" < 20))' + }, + sqlite: { + text: + 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > $1) AND ("customer"."age" < $2))', + string: + 'SELECT ("customer"."name" + "customer"."age") AS "nameAndAge" FROM "customer" WHERE (("customer"."age" > 10) AND ("customer"."age" < 20))' + }, + mysql: { + text: + 'SELECT (`customer`.`name` + `customer`.`age`) AS `nameAndAge` FROM `customer` WHERE ((`customer`.`age` > ?) AND (`customer`.`age` < ?))', + string: + 'SELECT (`customer`.`name` + `customer`.`age`) AS `nameAndAge` FROM `customer` WHERE ((`customer`.`age` > 10) AND (`customer`.`age` < 20))' + }, + mssql: { + text: + 'SELECT ([customer].[name] + [customer].[age]) AS [nameAndAge] FROM [customer] WHERE (([customer].[age] > @1) AND ([customer].[age] < @2))', + string: + 'SELECT ([customer].[name] + [customer].[age]) AS [nameAndAge] FROM [customer] WHERE (([customer].[age] > 10) AND ([customer].[age] < 20))' + }, + oracle: { + text: + 'SELECT ("customer"."name" + "customer"."age") "nameAndAge" FROM "customer" WHERE (("customer"."age" > :1) AND ("customer"."age" < :2))', + string: + 'SELECT ("customer"."name" + "customer"."age") "nameAndAge" FROM "customer" WHERE (("customer"."age" > 10) AND ("customer"."age" < 20))' + }, + params: [10, 20] +}); + +Harness.test({ + query: customer.select(customer.age.between(10, 20).as('ageBetween')), + pg: { + text: 'SELECT ("customer"."age" BETWEEN $1 AND $2) AS "ageBetween" FROM "customer"', + string: 'SELECT ("customer"."age" BETWEEN 10 AND 20) AS "ageBetween" FROM "customer"' + }, + sqlite: { + text: 'SELECT ("customer"."age" BETWEEN $1 AND $2) AS "ageBetween" FROM "customer"', + string: 'SELECT ("customer"."age" BETWEEN 10 AND 20) AS "ageBetween" FROM "customer"' + }, + mysql: { + text: 'SELECT (`customer`.`age` BETWEEN ? AND ?) AS `ageBetween` FROM `customer`', + string: 'SELECT (`customer`.`age` BETWEEN 10 AND 20) AS `ageBetween` FROM `customer`' + }, + mssql: { + text: 'SELECT ([customer].[age] BETWEEN @1 AND @2) AS [ageBetween] FROM [customer]', + string: 'SELECT ([customer].[age] BETWEEN 10 AND 20) AS [ageBetween] FROM [customer]' + }, + oracle: { + text: 'SELECT ("customer"."age" BETWEEN :1 AND :2) "ageBetween" FROM "customer"', + string: 'SELECT ("customer"."age" BETWEEN 10 AND 20) "ageBetween" FROM "customer"' + }, + params: [10, 20] +}); + +Harness.test({ + query: customer.select(instance.functions.ROUND(customer.age.as('ageBetween'), 2)), + pg: { + text: 'SELECT ROUND("customer"."age", $1) FROM "customer"', + string: 'SELECT ROUND("customer"."age", 2) FROM "customer"' + }, + sqlite: { + text: 'SELECT ROUND("customer"."age", $1) FROM "customer"', + string: 'SELECT ROUND("customer"."age", 2) FROM "customer"' + }, + mysql: { + text: 'SELECT ROUND(`customer`.`age`, ?) FROM `customer`', + string: 'SELECT ROUND(`customer`.`age`, 2) FROM `customer`' + }, + mssql: { + text: 'SELECT ROUND([customer].[age], @1) FROM [customer]', + string: 'SELECT ROUND([customer].[age], 2) FROM [customer]' + }, + oracle: { + text: 'SELECT ROUND("customer"."age", :1) FROM "customer"', + string: 'SELECT ROUND("customer"."age", 2) FROM "customer"' + }, + params: [2] +}); + +Harness.test({ + query: customer.select(customer.age.notBetween(10, 20).as('ageNotBetween')), + pg: { + text: 'SELECT ("customer"."age" NOT BETWEEN $1 AND $2) AS "ageNotBetween" FROM "customer"', + string: 'SELECT ("customer"."age" NOT BETWEEN 10 AND 20) AS "ageNotBetween" FROM "customer"' + }, + sqlite: { + text: 'SELECT ("customer"."age" NOT BETWEEN $1 AND $2) AS "ageNotBetween" FROM "customer"', + string: 'SELECT ("customer"."age" NOT BETWEEN 10 AND 20) AS "ageNotBetween" FROM "customer"' + }, + mysql: { + text: 'SELECT (`customer`.`age` NOT BETWEEN ? AND ?) AS `ageNotBetween` FROM `customer`', + string: 'SELECT (`customer`.`age` NOT BETWEEN 10 AND 20) AS `ageNotBetween` FROM `customer`' + }, + params: [10, 20] +}); diff --git a/test/dialects/alter-table-tests.js b/test/dialects/alter-table-tests.js deleted file mode 100644 index d050da3d..00000000 --- a/test/dialects/alter-table-tests.js +++ /dev/null @@ -1,338 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var Table = require(__dirname + '/../../lib/table'); - -Harness.test({ - query: post.alter().dropColumn(post.content), - pg: { - text : 'ALTER TABLE "post" DROP COLUMN "content"', - string: 'ALTER TABLE "post" DROP COLUMN "content"' - }, - sqlite: { - text : 'Sqlite cannot drop columns', - throws: true - }, - mysql: { - text : 'ALTER TABLE `post` DROP COLUMN `content`', - string: 'ALTER TABLE `post` DROP COLUMN `content`' - }, - mssql: { - text : 'ALTER TABLE [post] DROP COLUMN [content]', - string: 'ALTER TABLE [post] DROP COLUMN [content]' - }, - oracle: { - text : 'ALTER TABLE "post" DROP ("content")', - string: 'ALTER TABLE "post" DROP ("content")' - }, - params: [] -}); - -Harness.test({ - query: post.alter().dropColumn(post.content).dropColumn(post.userId), - pg: { - text : 'ALTER TABLE "post" DROP COLUMN "content", DROP COLUMN "userId"', - string: 'ALTER TABLE "post" DROP COLUMN "content", DROP COLUMN "userId"' - }, - sqlite: { - text : 'Sqlite cannot drop columns', - throws: true - }, - mysql: { - text : 'ALTER TABLE `post` DROP COLUMN `content`, DROP COLUMN `userId`', - string: 'ALTER TABLE `post` DROP COLUMN `content`, DROP COLUMN `userId`' - }, - mssql: { - text : 'ALTER TABLE [post] DROP COLUMN [content], [userId]', - string: 'ALTER TABLE [post] DROP COLUMN [content], [userId]' - }, - oracle: { - text : 'ALTER TABLE "post" DROP ("content", "userId")', - string: 'ALTER TABLE "post" DROP ("content", "userId")' - }, - params: [] -}); - -Harness.test({ - query: post.alter().dropColumn('content').dropColumn('userId'), - pg: { - text : 'ALTER TABLE "post" DROP COLUMN "content", DROP COLUMN "userId"', - string: 'ALTER TABLE "post" DROP COLUMN "content", DROP COLUMN "userId"' - }, - sqlite: { - text : 'Sqlite cannot drop columns', - throws: true - }, - mysql: { - text : 'ALTER TABLE `post` DROP COLUMN `content`, DROP COLUMN `userId`', - string: 'ALTER TABLE `post` DROP COLUMN `content`, DROP COLUMN `userId`' - }, - mssql: { - text : 'ALTER TABLE [post] DROP COLUMN [content], [userId]', - string: 'ALTER TABLE [post] DROP COLUMN [content], [userId]' - }, - oracle: { - text : 'ALTER TABLE "post" DROP ("content", "userId")', - string: 'ALTER TABLE "post" DROP ("content", "userId")' - }, - params: [] -}); - -Harness.test({ - query: post.alter().rename('posts'), - pg: { - text : 'ALTER TABLE "post" RENAME TO "posts"', - string: 'ALTER TABLE "post" RENAME TO "posts"' - }, - sqlite: { - text : 'ALTER TABLE "post" RENAME TO "posts"', - string: 'ALTER TABLE "post" RENAME TO "posts"' - }, - mysql: { - text : 'ALTER TABLE `post` RENAME TO `posts`', - string: 'ALTER TABLE `post` RENAME TO `posts`' - }, - mssql: { - text : 'EXEC sp_rename [post], [posts]', - string: 'EXEC sp_rename [post], [posts]' - }, - params: [] -}); - -var group = Table.define({ - name: 'group', - columns: [{ - name: 'id', - dataType: 'varchar(100)' - }, { - name: 'userId', - dataType: 'varchar(100)' - } - ] -}); - -Harness.test({ - query: group.alter().addColumn(group.id), - pg: { - text : 'ALTER TABLE "group" ADD COLUMN "id" varchar(100)', - string: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100)' - }, - sqlite: { - text : 'ALTER TABLE "group" ADD COLUMN "id" varchar(100)', - string: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100)' - }, - mysql: { - text : 'ALTER TABLE `group` ADD COLUMN `id` varchar(100)', - string: 'ALTER TABLE `group` ADD COLUMN `id` varchar(100)' - }, - mssql: { - text : 'ALTER TABLE [group] ADD [id] varchar(100)', - string: 'ALTER TABLE [group] ADD [id] varchar(100)' - }, - oracle: { - text : 'ALTER TABLE "group" ADD ("id" varchar(100))', - string: 'ALTER TABLE "group" ADD ("id" varchar(100))' - }, - params: [] -}); - -Harness.test({ - query: group.alter().addColumn(group.id).addColumn(group.userId), - pg: { - text : 'ALTER TABLE "group" ADD COLUMN "id" varchar(100), ADD COLUMN "userId" varchar(100)', - string: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100), ADD COLUMN "userId" varchar(100)' - }, - sqlite: { - text : 'Sqlite cannot add more than one column at a time', - throws: true - }, - mysql: { - text : 'ALTER TABLE `group` ADD COLUMN `id` varchar(100), ADD COLUMN `userId` varchar(100)', - string: 'ALTER TABLE `group` ADD COLUMN `id` varchar(100), ADD COLUMN `userId` varchar(100)' - }, - mssql: { - text : 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)', - string: 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)' - }, - oracle: { - text : 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))', - string: 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))' - }, - params: [] -}); - -Harness.test({ - query: group.alter().addColumn('id', 'varchar(100)').addColumn('userId', 'varchar(100)'), - pg: { - text : 'ALTER TABLE "group" ADD COLUMN "id" varchar(100), ADD COLUMN "userId" varchar(100)', - string: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100), ADD COLUMN "userId" varchar(100)' - }, - sqlite: { - text : 'Sqlite cannot add more than one column at a time', - throws: true - }, - mysql: { - text : 'ALTER TABLE `group` ADD COLUMN `id` varchar(100), ADD COLUMN `userId` varchar(100)', - string: 'ALTER TABLE `group` ADD COLUMN `id` varchar(100), ADD COLUMN `userId` varchar(100)' - }, - mssql: { - text : 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)', - string: 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)' - }, - oracle: { - text : 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))', - string: 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))' - }, - params: [] -}); - -Harness.test({ - query: group.alter().renameColumn('userId', 'newUserId'), - pg: { - text : 'ALTER TABLE "group" RENAME COLUMN "userId" TO "newUserId"', - string: 'ALTER TABLE "group" RENAME COLUMN "userId" TO "newUserId"' - }, - mysql: { - text : 'Mysql requires data type for renaming a column', - throws: true - }, - sqlite: { - text : 'Sqlite cannot rename columns', - throws: true - }, - mssql: { - text : 'EXEC sp_rename \'[group].[userId]\', [newUserId], \'COLUMN\'', - string: 'EXEC sp_rename \'[group].[userId]\', [newUserId], \'COLUMN\'' - }, - params: [] -}); - -Harness.test({ - query: group.alter().renameColumn(group.userId, 'newUserId'), - pg: { - text : 'ALTER TABLE "group" RENAME COLUMN "userId" TO "newUserId"', - string: 'ALTER TABLE "group" RENAME COLUMN "userId" TO "newUserId"' - }, - sqlite: { - text : 'Sqlite cannot rename columns', - throws: true - }, - mysql: { - text : 'ALTER TABLE `group` CHANGE COLUMN `userId` `newUserId` varchar(100)', - string: 'ALTER TABLE `group` CHANGE COLUMN `userId` `newUserId` varchar(100)' - }, - mssql: { - text : 'EXEC sp_rename \'[group].[userId]\', [newUserId], \'COLUMN\'', - string: 'EXEC sp_rename \'[group].[userId]\', [newUserId], \'COLUMN\'' - }, - params: [] -}); - -Harness.test({ - query: group.alter().renameColumn('userId', group.id), - pg: { - text : 'ALTER TABLE "group" RENAME COLUMN "userId" TO "id"', - string: 'ALTER TABLE "group" RENAME COLUMN "userId" TO "id"' - }, - sqlite: { - text : 'Sqlite cannot rename columns', - throws: true - }, - mysql: { - text : 'ALTER TABLE `group` CHANGE COLUMN `userId` `id` varchar(100)', - string: 'ALTER TABLE `group` CHANGE COLUMN `userId` `id` varchar(100)' - }, - mssql: { - text : 'EXEC sp_rename \'[group].[userId]\', [id], \'COLUMN\'', - string: 'EXEC sp_rename \'[group].[userId]\', [id], \'COLUMN\'' - }, - params: [] -}); - -var UserWithSignature = Table.define({ - name: 'UserWithSignature', - columns: [{ - name: 'Signature', - dataType: "VARCHAR(255) NOT NULL DEFAULT 'Signature'" - } - ] -}); - -Harness.test({ - query: UserWithSignature.alter().renameColumn(UserWithSignature.get('Signature'), 'sig'), - pg: { - text : 'ALTER TABLE "UserWithSignature" RENAME COLUMN "Signature" TO "sig"', - string: 'ALTER TABLE "UserWithSignature" RENAME COLUMN "Signature" TO "sig"' - }, - mysql: { - text : 'ALTER TABLE `UserWithSignature` CHANGE COLUMN `Signature` `sig` VARCHAR(255) NOT NULL DEFAULT \'Signature\'', - string: 'ALTER TABLE `UserWithSignature` CHANGE COLUMN `Signature` `sig` VARCHAR(255) NOT NULL DEFAULT \'Signature\'' - }, - sqlite: { - text : 'Sqlite cannot rename columns', - throws: true - }, - mssql: { - text : 'EXEC sp_rename \'[UserWithSignature].[Signature]\', [sig], \'COLUMN\'', - string: 'EXEC sp_rename \'[UserWithSignature].[Signature]\', [sig], \'COLUMN\'' - } -}); - -var post = Table.define({ - name: 'post', - columns: [{ - name: 'userId', - dataType: 'int', - references: { - table: 'user', - column: 'id' - } - }, { - name: 'picture', - dataType: 'varchar(100)', - references: {} - }] -}); - -Harness.test({ - query: post.alter().addColumn(post.userId), - pg: { - text : 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")', - string: 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")' - }, - sqlite: { - text : 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")', - string: 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")' - }, - mysql: { - text : 'ALTER TABLE `post` ADD COLUMN `userId` int REFERENCES `user`(`id`)', - string: 'ALTER TABLE `post` ADD COLUMN `userId` int REFERENCES `user`(`id`)' - }, - oracle: { - text : 'ALTER TABLE "post" ADD ("userId" int REFERENCES "user"("id"))', - string: 'ALTER TABLE "post" ADD ("userId" int REFERENCES "user"("id"))' - }, - params: [] -}); - -Harness.test({ - query: post.alter().addColumn(post.picture), - pg: { - text : 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)', - string: 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)' - }, - sqlite: { - text : 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)', - string: 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)' - }, - mysql: { - text : 'ALTER TABLE `post` ADD COLUMN `picture` varchar(100)', - string: 'ALTER TABLE `post` ADD COLUMN `picture` varchar(100)' - }, - oracle: { - text : 'ALTER TABLE "post" ADD ("picture" varchar(100))', - string: 'ALTER TABLE "post" ADD ("picture" varchar(100))' - }, - params: [] -}); diff --git a/test/dialects/alter-table-tests.ts b/test/dialects/alter-table-tests.ts new file mode 100644 index 00000000..a5ada55b --- /dev/null +++ b/test/dialects/alter-table-tests.ts @@ -0,0 +1,356 @@ +'use strict'; + +import * as Harness from './support'; +import { Table } from '../../lib/table'; +const post = Harness.definePostTable(); + +Harness.test({ + query: post.alter().dropColumn(post.content), + pg: { + text: 'ALTER TABLE "post" DROP COLUMN "content"', + string: 'ALTER TABLE "post" DROP COLUMN "content"' + }, + sqlite: { + text: 'Sqlite cannot drop columns', + throws: true + }, + mysql: { + text: 'ALTER TABLE `post` DROP COLUMN `content`', + string: 'ALTER TABLE `post` DROP COLUMN `content`' + }, + mssql: { + text: 'ALTER TABLE [post] DROP COLUMN [content]', + string: 'ALTER TABLE [post] DROP COLUMN [content]' + }, + oracle: { + text: 'ALTER TABLE "post" DROP ("content")', + string: 'ALTER TABLE "post" DROP ("content")' + }, + params: [] +}); + +Harness.test({ + query: post + .alter() + .dropColumn(post.content) + .dropColumn(post.userId), + pg: { + text: 'ALTER TABLE "post" DROP COLUMN "content", DROP COLUMN "userId"', + string: 'ALTER TABLE "post" DROP COLUMN "content", DROP COLUMN "userId"' + }, + sqlite: { + text: 'Sqlite cannot drop columns', + throws: true + }, + mysql: { + text: 'ALTER TABLE `post` DROP COLUMN `content`, DROP COLUMN `userId`', + string: 'ALTER TABLE `post` DROP COLUMN `content`, DROP COLUMN `userId`' + }, + mssql: { + text: 'ALTER TABLE [post] DROP COLUMN [content], [userId]', + string: 'ALTER TABLE [post] DROP COLUMN [content], [userId]' + }, + oracle: { + text: 'ALTER TABLE "post" DROP ("content", "userId")', + string: 'ALTER TABLE "post" DROP ("content", "userId")' + }, + params: [] +}); + +Harness.test({ + query: post + .alter() + .dropColumn('content') + .dropColumn('userId'), + pg: { + text: 'ALTER TABLE "post" DROP COLUMN "content", DROP COLUMN "userId"', + string: 'ALTER TABLE "post" DROP COLUMN "content", DROP COLUMN "userId"' + }, + sqlite: { + text: 'Sqlite cannot drop columns', + throws: true + }, + mysql: { + text: 'ALTER TABLE `post` DROP COLUMN `content`, DROP COLUMN `userId`', + string: 'ALTER TABLE `post` DROP COLUMN `content`, DROP COLUMN `userId`' + }, + mssql: { + text: 'ALTER TABLE [post] DROP COLUMN [content], [userId]', + string: 'ALTER TABLE [post] DROP COLUMN [content], [userId]' + }, + oracle: { + text: 'ALTER TABLE "post" DROP ("content", "userId")', + string: 'ALTER TABLE "post" DROP ("content", "userId")' + }, + params: [] +}); + +Harness.test({ + query: post.alter().rename('posts'), + pg: { + text: 'ALTER TABLE "post" RENAME TO "posts"', + string: 'ALTER TABLE "post" RENAME TO "posts"' + }, + sqlite: { + text: 'ALTER TABLE "post" RENAME TO "posts"', + string: 'ALTER TABLE "post" RENAME TO "posts"' + }, + mysql: { + text: 'ALTER TABLE `post` RENAME TO `posts`', + string: 'ALTER TABLE `post` RENAME TO `posts`' + }, + mssql: { + text: 'EXEC sp_rename [post], [posts]', + string: 'EXEC sp_rename [post], [posts]' + }, + params: [] +}); + +var group = Table.define<{ id: string; userId: string }>({ + name: 'group', + columns: [ + { + name: 'id', + dataType: 'varchar(100)' + }, + { + name: 'userId', + dataType: 'varchar(100)' + } + ] +}); + +Harness.test({ + query: group.alter().addColumn(group.id), + pg: { + text: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100)', + string: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100)' + }, + sqlite: { + text: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100)', + string: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100)' + }, + mysql: { + text: 'ALTER TABLE `group` ADD COLUMN `id` varchar(100)', + string: 'ALTER TABLE `group` ADD COLUMN `id` varchar(100)' + }, + mssql: { + text: 'ALTER TABLE [group] ADD [id] varchar(100)', + string: 'ALTER TABLE [group] ADD [id] varchar(100)' + }, + oracle: { + text: 'ALTER TABLE "group" ADD ("id" varchar(100))', + string: 'ALTER TABLE "group" ADD ("id" varchar(100))' + }, + params: [] +}); + +Harness.test({ + query: group + .alter() + .addColumn(group.id) + .addColumn(group.userId), + pg: { + text: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100), ADD COLUMN "userId" varchar(100)', + string: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100), ADD COLUMN "userId" varchar(100)' + }, + sqlite: { + text: 'Sqlite cannot add more than one column at a time', + throws: true + }, + mysql: { + text: 'ALTER TABLE `group` ADD COLUMN `id` varchar(100), ADD COLUMN `userId` varchar(100)', + string: 'ALTER TABLE `group` ADD COLUMN `id` varchar(100), ADD COLUMN `userId` varchar(100)' + }, + mssql: { + text: 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)', + string: 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)' + }, + oracle: { + text: 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))', + string: 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))' + }, + params: [] +}); + +Harness.test({ + query: group + .alter() + .addColumn('id', 'varchar(100)') + .addColumn('userId', 'varchar(100)'), + pg: { + text: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100), ADD COLUMN "userId" varchar(100)', + string: 'ALTER TABLE "group" ADD COLUMN "id" varchar(100), ADD COLUMN "userId" varchar(100)' + }, + sqlite: { + text: 'Sqlite cannot add more than one column at a time', + throws: true + }, + mysql: { + text: 'ALTER TABLE `group` ADD COLUMN `id` varchar(100), ADD COLUMN `userId` varchar(100)', + string: 'ALTER TABLE `group` ADD COLUMN `id` varchar(100), ADD COLUMN `userId` varchar(100)' + }, + mssql: { + text: 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)', + string: 'ALTER TABLE [group] ADD [id] varchar(100), [userId] varchar(100)' + }, + oracle: { + text: 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))', + string: 'ALTER TABLE "group" ADD ("id" varchar(100), "userId" varchar(100))' + }, + params: [] +}); + +Harness.test({ + query: group.alter().renameColumn('userId', 'newUserId'), + pg: { + text: 'ALTER TABLE "group" RENAME COLUMN "userId" TO "newUserId"', + string: 'ALTER TABLE "group" RENAME COLUMN "userId" TO "newUserId"' + }, + mysql: { + text: 'Mysql requires data type for renaming a column', + throws: true + }, + sqlite: { + text: 'Sqlite cannot rename columns', + throws: true + }, + mssql: { + text: "EXEC sp_rename '[group].[userId]', [newUserId], 'COLUMN'", + string: "EXEC sp_rename '[group].[userId]', [newUserId], 'COLUMN'" + }, + params: [] +}); + +Harness.test({ + query: group.alter().renameColumn(group.userId, 'newUserId'), + pg: { + text: 'ALTER TABLE "group" RENAME COLUMN "userId" TO "newUserId"', + string: 'ALTER TABLE "group" RENAME COLUMN "userId" TO "newUserId"' + }, + sqlite: { + text: 'Sqlite cannot rename columns', + throws: true + }, + mysql: { + text: 'ALTER TABLE `group` CHANGE COLUMN `userId` `newUserId` varchar(100)', + string: 'ALTER TABLE `group` CHANGE COLUMN `userId` `newUserId` varchar(100)' + }, + mssql: { + text: "EXEC sp_rename '[group].[userId]', [newUserId], 'COLUMN'", + string: "EXEC sp_rename '[group].[userId]', [newUserId], 'COLUMN'" + }, + params: [] +}); + +Harness.test({ + query: group.alter().renameColumn('userId', group.id), + pg: { + text: 'ALTER TABLE "group" RENAME COLUMN "userId" TO "id"', + string: 'ALTER TABLE "group" RENAME COLUMN "userId" TO "id"' + }, + sqlite: { + text: 'Sqlite cannot rename columns', + throws: true + }, + mysql: { + text: 'ALTER TABLE `group` CHANGE COLUMN `userId` `id` varchar(100)', + string: 'ALTER TABLE `group` CHANGE COLUMN `userId` `id` varchar(100)' + }, + mssql: { + text: "EXEC sp_rename '[group].[userId]', [id], 'COLUMN'", + string: "EXEC sp_rename '[group].[userId]', [id], 'COLUMN'" + }, + params: [] +}); + +var UserWithSignature = Table.define<{ Signature: string }>({ + name: 'UserWithSignature', + columns: [ + { + name: 'Signature', + dataType: "VARCHAR(255) NOT NULL DEFAULT 'Signature'" + } + ] +}); + +Harness.test({ + query: UserWithSignature.alter().renameColumn(UserWithSignature.get('Signature')!, 'sig'), + pg: { + text: 'ALTER TABLE "UserWithSignature" RENAME COLUMN "Signature" TO "sig"', + string: 'ALTER TABLE "UserWithSignature" RENAME COLUMN "Signature" TO "sig"' + }, + mysql: { + text: "ALTER TABLE `UserWithSignature` CHANGE COLUMN `Signature` `sig` VARCHAR(255) NOT NULL DEFAULT 'Signature'", + string: "ALTER TABLE `UserWithSignature` CHANGE COLUMN `Signature` `sig` VARCHAR(255) NOT NULL DEFAULT 'Signature'" + }, + sqlite: { + text: 'Sqlite cannot rename columns', + throws: true + }, + mssql: { + text: "EXEC sp_rename '[UserWithSignature].[Signature]', [sig], 'COLUMN'", + string: "EXEC sp_rename '[UserWithSignature].[Signature]', [sig], 'COLUMN'" + } +}); + +const post2 = Table.define<{ userId: number; picture: string }>({ + name: 'post', + columns: [ + { + name: 'userId', + dataType: 'int', + references: { + table: 'user', + column: 'id' + } + }, + { + name: 'picture', + dataType: 'varchar(100)', + references: {} + } + ] +}); + +Harness.test({ + query: post2.alter().addColumn(post2.userId), + pg: { + text: 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")', + string: 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")' + }, + sqlite: { + text: 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")', + string: 'ALTER TABLE "post" ADD COLUMN "userId" int REFERENCES "user"("id")' + }, + mysql: { + text: 'ALTER TABLE `post` ADD COLUMN `userId` int REFERENCES `user`(`id`)', + string: 'ALTER TABLE `post` ADD COLUMN `userId` int REFERENCES `user`(`id`)' + }, + oracle: { + text: 'ALTER TABLE "post" ADD ("userId" int REFERENCES "user"("id"))', + string: 'ALTER TABLE "post" ADD ("userId" int REFERENCES "user"("id"))' + }, + params: [] +}); + +Harness.test({ + query: post2.alter().addColumn(post2.picture), + pg: { + text: 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)', + string: 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)' + }, + sqlite: { + text: 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)', + string: 'ALTER TABLE "post" ADD COLUMN "picture" varchar(100)' + }, + mysql: { + text: 'ALTER TABLE `post` ADD COLUMN `picture` varchar(100)', + string: 'ALTER TABLE `post` ADD COLUMN `picture` varchar(100)' + }, + oracle: { + text: 'ALTER TABLE "post" ADD ("picture" varchar(100))', + string: 'ALTER TABLE "post" ADD ("picture" varchar(100))' + }, + params: [] +}); diff --git a/test/dialects/array-tests.js b/test/dialects/array-tests.js deleted file mode 100644 index f4191400..00000000 --- a/test/dialects/array-tests.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var Sql = require('../../lib'); - -// Array columns -Harness.test({ - query: post.update({ - tags: post.tags.concat(Sql.array('nodejs')) - }), - pg: { - text : 'UPDATE "post" SET "tags" = ("post"."tags" || ARRAY[$1])', - string: 'UPDATE "post" SET "tags" = ("post"."tags" || ARRAY[\'nodejs\'])' - }, - params: ['nodejs'] -}); - -Harness.test({ - query: post.select( - post.tags.contains(Sql.array('nodejs', 'js')) - ), - pg: { - text : 'SELECT ("post"."tags" @> ARRAY[$1, $2]) FROM "post"', - string: 'SELECT ("post"."tags" @> ARRAY[\'nodejs\', \'js\']) FROM "post"' - }, - params: ['nodejs', 'js'] -}); - -Harness.test({ - query: post.select( - post.tags.containedBy(Sql.array('nodejs', 'js')) - ), - pg: { - text : 'SELECT ("post"."tags" <@ ARRAY[$1, $2]) FROM "post"', - string: 'SELECT ("post"."tags" <@ ARRAY[\'nodejs\', \'js\']) FROM "post"' - }, - params: ['nodejs', 'js'] -}); - -Harness.test({ - query: post.select( - post.tags.overlap(Sql.array('nodejs', 'js')) - ), - pg: { - text : 'SELECT ("post"."tags" && ARRAY[$1, $2]) FROM "post"', - string: 'SELECT ("post"."tags" && ARRAY[\'nodejs\', \'js\']) FROM "post"' - }, - params: ['nodejs', 'js'] -}); - -Harness.test({ - query: post.select(post.tags.slice(2,3)), - pg: { - text : 'SELECT ("post"."tags")[$1:$2] FROM "post"', - string: 'SELECT ("post"."tags")[2:3] FROM "post"' - }, - params: [2, 3] -}); - -Harness.test({ - query: post.select(post.tags.at(2)), - pg: { - text : 'SELECT ("post"."tags")[$1] FROM "post"', - string: 'SELECT ("post"."tags")[2] FROM "post"' - }, - params: [2] -}); - -// Array literals -Harness.test({ - query: post.select(Sql.array(1,2,3)), - pg: { - text : 'SELECT ARRAY[$1, $2, $3] FROM "post"', - string: 'SELECT ARRAY[1, 2, 3] FROM "post"' - }, - params: [1, 2, 3] -}); - -Harness.test({ - query: post.select(Sql.array(1,2,3).slice(2,3)), - pg: { - text : 'SELECT (ARRAY[$1, $2, $3])[$4:$5] FROM "post"', - string: 'SELECT (ARRAY[1, 2, 3])[2:3] FROM "post"' - }, - params: [1,2,3,2,3] -}); - -Harness.test({ - query: post.select(Sql.array(1,2,3).at(2)), - pg: { - text : 'SELECT (ARRAY[$1, $2, $3])[$4] FROM "post"', - string: 'SELECT (ARRAY[1, 2, 3])[2] FROM "post"' - }, - params: [1,2,3,2] -}); diff --git a/test/dialects/array-tests.ts b/test/dialects/array-tests.ts new file mode 100644 index 00000000..cd1d9699 --- /dev/null +++ b/test/dialects/array-tests.ts @@ -0,0 +1,91 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const post = Harness.definePostTable(); +const instance = new Sql('postgres'); + +// Array columns +Harness.test({ + query: post.update({ + tags: post.tags.concat(instance.array('nodejs')) + }), + pg: { + text: 'UPDATE "post" SET "tags" = ("post"."tags" || ARRAY[$1])', + string: 'UPDATE "post" SET "tags" = ("post"."tags" || ARRAY[\'nodejs\'])' + }, + params: ['nodejs'] +}); + +Harness.test({ + query: post.select(post.tags.contains(instance.array('nodejs', 'js'))), + pg: { + text: 'SELECT ("post"."tags" @> ARRAY[$1, $2]) FROM "post"', + string: 'SELECT ("post"."tags" @> ARRAY[\'nodejs\', \'js\']) FROM "post"' + }, + params: ['nodejs', 'js'] +}); + +Harness.test({ + query: post.select(post.tags.containedBy(instance.array('nodejs', 'js'))), + pg: { + text: 'SELECT ("post"."tags" <@ ARRAY[$1, $2]) FROM "post"', + string: 'SELECT ("post"."tags" <@ ARRAY[\'nodejs\', \'js\']) FROM "post"' + }, + params: ['nodejs', 'js'] +}); + +Harness.test({ + query: post.select(post.tags.overlap(instance.array('nodejs', 'js'))), + pg: { + text: 'SELECT ("post"."tags" && ARRAY[$1, $2]) FROM "post"', + string: 'SELECT ("post"."tags" && ARRAY[\'nodejs\', \'js\']) FROM "post"' + }, + params: ['nodejs', 'js'] +}); + +Harness.test({ + query: post.select(post.tags.slice(2, 3)), + pg: { + text: 'SELECT ("post"."tags")[$1:$2] FROM "post"', + string: 'SELECT ("post"."tags")[2:3] FROM "post"' + }, + params: [2, 3] +}); + +Harness.test({ + query: post.select(post.tags.at(2)), + pg: { + text: 'SELECT ("post"."tags")[$1] FROM "post"', + string: 'SELECT ("post"."tags")[2] FROM "post"' + }, + params: [2] +}); + +// Array literals +Harness.test({ + query: post.select(instance.array(1, 2, 3)), + pg: { + text: 'SELECT ARRAY[$1, $2, $3] FROM "post"', + string: 'SELECT ARRAY[1, 2, 3] FROM "post"' + }, + params: [1, 2, 3] +}); + +Harness.test({ + query: post.select(instance.array(1, 2, 3).slice(2, 3)), + pg: { + text: 'SELECT (ARRAY[$1, $2, $3])[$4:$5] FROM "post"', + string: 'SELECT (ARRAY[1, 2, 3])[2:3] FROM "post"' + }, + params: [1, 2, 3, 2, 3] +}); + +Harness.test({ + query: post.select(instance.array(1, 2, 3).at(2)), + pg: { + text: 'SELECT (ARRAY[$1, $2, $3])[$4] FROM "post"', + string: 'SELECT (ARRAY[1, 2, 3])[2] FROM "post"' + }, + params: [1, 2, 3, 2] +}); diff --git a/test/dialects/binary-clause-tests.js b/test/dialects/binary-clause-tests.js deleted file mode 100644 index 69c355fe..00000000 --- a/test/dialects/binary-clause-tests.js +++ /dev/null @@ -1,103 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var customerAlias = Harness.defineCustomerAliasTable(); -var post = Harness.definePostTable(); - - -Harness.test({ - query: customer.select(customer.name.plus(customer.age)), - pg: { - text : 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', - string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' - }, - sqlite: { - text : 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', - string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' - }, - mysql: { - text : 'SELECT (`customer`.`name` + `customer`.`age`) FROM `customer`', - string: 'SELECT (`customer`.`name` + `customer`.`age`) FROM `customer`' - }, - mssql: { - text : 'SELECT ([customer].[name] + [customer].[age]) FROM [customer]', - string: 'SELECT ([customer].[name] + [customer].[age]) FROM [customer]' - }, - oracle: { - text : 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', - string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: customerAlias.select(customerAlias.name_alias.plus(customerAlias.age_alias)), - pg: { - text : 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', - string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' - }, - sqlite: { - text : 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', - string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' - }, - mysql: { - text : 'SELECT (`customer`.`name` + `customer`.`age`) FROM `customer`', - string: 'SELECT (`customer`.`name` + `customer`.`age`) FROM `customer`' - }, - mssql: { - text : 'SELECT ([customer].[name] + [customer].[age]) FROM [customer]', - string: 'SELECT ([customer].[name] + [customer].[age]) FROM [customer]' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content.plus('!')).where(post.userId. in (customer.subQuery().select(customer.id))), - pg: { - text : 'SELECT ("post"."content" + $1) FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))', - string: 'SELECT ("post"."content" + \'!\') FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))' - }, - sqlite: { - text : 'SELECT ("post"."content" + $1) FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))', - string: 'SELECT ("post"."content" + \'!\') FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))' - }, - mysql: { - text : 'SELECT (`post`.`content` + ?) FROM `post` WHERE (`post`.`userId` IN (SELECT `customer`.`id` FROM `customer`))', - string: 'SELECT (`post`.`content` + \'!\') FROM `post` WHERE (`post`.`userId` IN (SELECT `customer`.`id` FROM `customer`))' - }, - mssql: { - text : 'SELECT ([post].[content] + @1) FROM [post] WHERE ([post].[userId] IN (SELECT [customer].[id] FROM [customer]))', - string: 'SELECT ([post].[content] + \'!\') FROM [post] WHERE ([post].[userId] IN (SELECT [customer].[id] FROM [customer]))' - }, - oracle: { - text : 'SELECT ("post"."content" + :1) FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))', - string: 'SELECT ("post"."content" + \'!\') FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))' - }, - params: ['!'] -}); - -Harness.test({ - query: post.select(post.id.plus(': ').plus(post.content)).where(post.userId.notIn(customer.subQuery().select(customer.id))), - pg: { - text : 'SELECT (("post"."id" + $1) + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))', - string: 'SELECT (("post"."id" + \': \') + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))' - }, - sqlite: { - text : 'SELECT (("post"."id" + $1) + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))', - string: 'SELECT (("post"."id" + \': \') + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))' - }, - mysql: { - text : 'SELECT ((`post`.`id` + ?) + `post`.`content`) FROM `post` WHERE (`post`.`userId` NOT IN (SELECT `customer`.`id` FROM `customer`))', - string: 'SELECT ((`post`.`id` + \': \') + `post`.`content`) FROM `post` WHERE (`post`.`userId` NOT IN (SELECT `customer`.`id` FROM `customer`))' - }, - mssql: { - text : 'SELECT (([post].[id] + @1) + [post].[content]) FROM [post] WHERE ([post].[userId] NOT IN (SELECT [customer].[id] FROM [customer]))', - string: 'SELECT (([post].[id] + \': \') + [post].[content]) FROM [post] WHERE ([post].[userId] NOT IN (SELECT [customer].[id] FROM [customer]))' - }, - oracle: { - text : 'SELECT (("post"."id" + :1) + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))', - string: 'SELECT (("post"."id" + \': \') + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))' - }, - params: [': '] -}); diff --git a/test/dialects/binary-clause-tests.ts b/test/dialects/binary-clause-tests.ts new file mode 100644 index 00000000..5105b474 --- /dev/null +++ b/test/dialects/binary-clause-tests.ts @@ -0,0 +1,112 @@ +'use strict'; + +import * as Harness from './support'; +const customer = Harness.defineCustomerTable(); +const customerAlias = Harness.defineCustomerAliasTable(); +const post = Harness.definePostTable(); + +Harness.test({ + query: customer.select(customer.name.plus(customer.age)), + pg: { + text: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', + string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' + }, + sqlite: { + text: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', + string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' + }, + mysql: { + text: 'SELECT (`customer`.`name` + `customer`.`age`) FROM `customer`', + string: 'SELECT (`customer`.`name` + `customer`.`age`) FROM `customer`' + }, + mssql: { + text: 'SELECT ([customer].[name] + [customer].[age]) FROM [customer]', + string: 'SELECT ([customer].[name] + [customer].[age]) FROM [customer]' + }, + oracle: { + text: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', + string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customerAlias.select(customerAlias.name_alias.plus(customerAlias.age_alias)), + pg: { + text: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', + string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' + }, + sqlite: { + text: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"', + string: 'SELECT ("customer"."name" + "customer"."age") FROM "customer"' + }, + mysql: { + text: 'SELECT (`customer`.`name` + `customer`.`age`) FROM `customer`', + string: 'SELECT (`customer`.`name` + `customer`.`age`) FROM `customer`' + }, + mssql: { + text: 'SELECT ([customer].[name] + [customer].[age]) FROM [customer]', + string: 'SELECT ([customer].[name] + [customer].[age]) FROM [customer]' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content.plus('!')).where(post.userId.in(customer.subQuery().select(customer.id))), + pg: { + text: 'SELECT ("post"."content" + $1) FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))', + string: 'SELECT ("post"."content" + \'!\') FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))' + }, + sqlite: { + text: 'SELECT ("post"."content" + $1) FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))', + string: 'SELECT ("post"."content" + \'!\') FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))' + }, + mysql: { + text: 'SELECT (`post`.`content` + ?) FROM `post` WHERE (`post`.`userId` IN (SELECT `customer`.`id` FROM `customer`))', + string: "SELECT (`post`.`content` + '!') FROM `post` WHERE (`post`.`userId` IN (SELECT `customer`.`id` FROM `customer`))" + }, + mssql: { + text: 'SELECT ([post].[content] + @1) FROM [post] WHERE ([post].[userId] IN (SELECT [customer].[id] FROM [customer]))', + string: "SELECT ([post].[content] + '!') FROM [post] WHERE ([post].[userId] IN (SELECT [customer].[id] FROM [customer]))" + }, + oracle: { + text: 'SELECT ("post"."content" + :1) FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))', + string: 'SELECT ("post"."content" + \'!\') FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer"))' + }, + params: ['!'] +}); + +Harness.test({ + query: post.select(post.id.plus(': ').plus(post.content)).where(post.userId.notIn(customer.subQuery().select(customer.id))), + pg: { + text: + 'SELECT (("post"."id" + $1) + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))', + string: + 'SELECT (("post"."id" + \': \') + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))' + }, + sqlite: { + text: + 'SELECT (("post"."id" + $1) + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))', + string: + 'SELECT (("post"."id" + \': \') + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))' + }, + mysql: { + text: + 'SELECT ((`post`.`id` + ?) + `post`.`content`) FROM `post` WHERE (`post`.`userId` NOT IN (SELECT `customer`.`id` FROM `customer`))', + string: + "SELECT ((`post`.`id` + ': ') + `post`.`content`) FROM `post` WHERE (`post`.`userId` NOT IN (SELECT `customer`.`id` FROM `customer`))" + }, + mssql: { + text: + 'SELECT (([post].[id] + @1) + [post].[content]) FROM [post] WHERE ([post].[userId] NOT IN (SELECT [customer].[id] FROM [customer]))', + string: + "SELECT (([post].[id] + ': ') + [post].[content]) FROM [post] WHERE ([post].[userId] NOT IN (SELECT [customer].[id] FROM [customer]))" + }, + oracle: { + text: + 'SELECT (("post"."id" + :1) + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))', + string: + 'SELECT (("post"."id" + \': \') + "post"."content") FROM "post" WHERE ("post"."userId" NOT IN (SELECT "customer"."id" FROM "customer"))' + }, + params: [': '] +}); diff --git a/test/dialects/case-tests.js b/test/dialects/case-tests.js deleted file mode 100644 index f492a4f5..00000000 --- a/test/dialects/case-tests.js +++ /dev/null @@ -1,222 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); - -// Check case expression with primary when expressions and else branch. -Harness.test({ - query: customer.select(customer.age.case([true, false], [0, 1], 2)), - pg: { - text : 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END) FROM "customer"', - string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END) FROM "customer"' - }, - sqlite: { - text : 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END) FROM "customer"', - string: 'SELECT (CASE WHEN 1 THEN 0 WHEN 0 THEN 1 ELSE 2 END) FROM "customer"' - }, - mysql: { - text : 'SELECT (CASE WHEN ? THEN ? WHEN ? THEN ? ELSE ? END) FROM `customer`', - string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END) FROM `customer`' - }, - mssql: { - text : 'SELECT (CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 ELSE @3 END) FROM [customer]', - string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END) FROM [customer]', - params: [0, 1, 2] - }, - oracle: { - text : 'SELECT (CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 ELSE :3 END) FROM "customer"', - string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END) FROM "customer"', - params: [0, 1, 2] - }, - params: [true, 0, false, 1, 2] -}); - -// Check case expression as a subexpression. -Harness.test({ - query: customer.select(customer.age.plus(customer.age.case([true, false], [0, 1], 2))), - pg: { - text : 'SELECT ("customer"."age" + (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END)) FROM "customer"', - string: 'SELECT ("customer"."age" + (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END)) FROM "customer"' - }, - sqlite: { - text : 'SELECT ("customer"."age" + (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END)) FROM "customer"', - string: 'SELECT ("customer"."age" + (CASE WHEN 1 THEN 0 WHEN 0 THEN 1 ELSE 2 END)) FROM "customer"' - }, - mysql: { - text : 'SELECT (`customer`.`age` + (CASE WHEN ? THEN ? WHEN ? THEN ? ELSE ? END)) FROM `customer`', - string: 'SELECT (`customer`.`age` + (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END)) FROM `customer`' - }, - mssql: { - text : 'SELECT ([customer].[age] + (CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 ELSE @3 END)) FROM [customer]', - string: 'SELECT ([customer].[age] + (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END)) FROM [customer]', - params: [0, 1, 2] - }, - oracle: { - text : 'SELECT ("customer"."age" + (CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 ELSE :3 END)) FROM "customer"', - string: 'SELECT ("customer"."age" + (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END)) FROM "customer"', - params: [0, 1, 2] - }, - params: [true, 0, false, 1, 2] -}); - -// Check case expression as subexpression on the left. -Harness.test({ - query: customer.select(customer.age.case([true, false], [0, 1], 2).plus(3)), - pg: { - text : 'SELECT ((CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END) + $6) FROM "customer"', - string: 'SELECT ((CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END) + 3) FROM "customer"', - }, - sqlite: { - text : 'SELECT ((CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END) + $6) FROM "customer"', - string: 'SELECT ((CASE WHEN 1 THEN 0 WHEN 0 THEN 1 ELSE 2 END) + 3) FROM "customer"' - }, - mysql: { - text : 'SELECT ((CASE WHEN ? THEN ? WHEN ? THEN ? ELSE ? END) + ?) FROM `customer`', - string: 'SELECT ((CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END) + 3) FROM `customer`' - }, - mssql: { - text : 'SELECT ((CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 ELSE @3 END) + @4) FROM [customer]', - string: 'SELECT ((CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END) + 3) FROM [customer]', - params: [0, 1, 2, 3] - }, - oracle: { - text : 'SELECT ((CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 ELSE :3 END) + :4) FROM "customer"', - string: 'SELECT ((CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END) + 3) FROM "customer"', - params: [0, 1, 2, 3] - }, - params: [true, 0, false, 1, 2, 3] -}); - -// Check case expression with primary when expressions and compound else expression. -Harness.test({ - query: customer.select(customer.age.case([true, false], [0, 1], customer.age.between(10, 20))), - pg: { - text : 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE ("customer"."age" BETWEEN $5 AND $6) END) FROM "customer"', - string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE ("customer"."age" BETWEEN 10 AND 20) END) FROM "customer"', - }, - sqlite: { - text : 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE ("customer"."age" BETWEEN $5 AND $6) END) FROM "customer"', - string: 'SELECT (CASE WHEN 1 THEN 0 WHEN 0 THEN 1 ELSE ("customer"."age" BETWEEN 10 AND 20) END) FROM "customer"' - }, - mysql: { - text : 'SELECT (CASE WHEN ? THEN ? WHEN ? THEN ? ELSE (`customer`.`age` BETWEEN ? AND ?) END) FROM `customer`', - string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE (`customer`.`age` BETWEEN 10 AND 20) END) FROM `customer`' - }, - mssql: { - text : 'SELECT (CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 ELSE ([customer].[age] BETWEEN @3 AND @4) END) FROM [customer]', - string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE ([customer].[age] BETWEEN 10 AND 20) END) FROM [customer]', - params: [0, 1, 10, 20] - }, - oracle: { - text : 'SELECT (CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 ELSE ("customer"."age" BETWEEN :3 AND :4) END) FROM "customer"', - string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE ("customer"."age" BETWEEN 10 AND 20) END) FROM "customer"', - params: [0, 1, 10, 20] - }, - params: [true, 0, false, 1, 10, 20] -}); - -// Check case expression with primary when expressions without else branch. -Harness.test({ - query: customer.select(customer.age.case([true, false], [0, 1])), - pg: { - text : 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 END) FROM "customer"', - string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 END) FROM "customer"', - }, - sqlite: { - text : 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 END) FROM "customer"', - string: 'SELECT (CASE WHEN 1 THEN 0 WHEN 0 THEN 1 END) FROM "customer"' - }, - mysql: { - text : 'SELECT (CASE WHEN ? THEN ? WHEN ? THEN ? END) FROM `customer`', - string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 END) FROM `customer`' - }, - mssql: { - text : 'SELECT (CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 END) FROM [customer]', - string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 END) FROM [customer]', - params: [0, 1] - }, - oracle: { - text : 'SELECT (CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 END) FROM "customer"', - string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 END) FROM "customer"', - params: [0, 1] - }, - params: [true, 0, false, 1] -}); - -// Check case expression with compound when expressions and else branch. -Harness.test({ - query: customer.select(customer.age.case([customer.age.in([10, 20, 30]), customer.age.lte(60)], [0, 1], 2)), - pg: { - text : 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN $4 WHEN ("customer"."age" <= $5) THEN $6 ELSE $7 END) FROM "customer"', - string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 ELSE 2 END) FROM "customer"' - }, - sqlite: { - text : 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN $4 WHEN ("customer"."age" <= $5) THEN $6 ELSE $7 END) FROM "customer"', - string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 ELSE 2 END) FROM "customer"' - }, - mysql: { - text : 'SELECT (CASE WHEN (`customer`.`age` IN (?, ?, ?)) THEN ? WHEN (`customer`.`age` <= ?) THEN ? ELSE ? END) FROM `customer`', - string: 'SELECT (CASE WHEN (`customer`.`age` IN (10, 20, 30)) THEN 0 WHEN (`customer`.`age` <= 60) THEN 1 ELSE 2 END) FROM `customer`' - }, - mssql: { - text : 'SELECT (CASE WHEN ([customer].[age] IN (@1, @2, @3)) THEN @4 WHEN ([customer].[age] <= @5) THEN @6 ELSE @7 END) FROM [customer]', - string: 'SELECT (CASE WHEN ([customer].[age] IN (10, 20, 30)) THEN 0 WHEN ([customer].[age] <= 60) THEN 1 ELSE 2 END) FROM [customer]' - }, - oracle: { - text : 'SELECT (CASE WHEN ("customer"."age" IN (:1, :2, :3)) THEN :4 WHEN ("customer"."age" <= :5) THEN :6 ELSE :7 END) FROM "customer"', - string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 ELSE 2 END) FROM "customer"' - }, - params: [10, 20, 30, 0, 60, 1, 2] -}); - -// Check case expression without else branch. -Harness.test({ - query: customer.select(customer.age.case([customer.age.in([10, 20, 30]), customer.age.lte(60)], [0, 1])), - pg: { - text : 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN $4 WHEN ("customer"."age" <= $5) THEN $6 END) FROM "customer"', - string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 END) FROM "customer"' - }, - sqlite: { - text : 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN $4 WHEN ("customer"."age" <= $5) THEN $6 END) FROM "customer"', - string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 END) FROM "customer"' - }, - mysql: { - text : 'SELECT (CASE WHEN (`customer`.`age` IN (?, ?, ?)) THEN ? WHEN (`customer`.`age` <= ?) THEN ? END) FROM `customer`', - string: 'SELECT (CASE WHEN (`customer`.`age` IN (10, 20, 30)) THEN 0 WHEN (`customer`.`age` <= 60) THEN 1 END) FROM `customer`' - }, - mssql: { - text : 'SELECT (CASE WHEN ([customer].[age] IN (@1, @2, @3)) THEN @4 WHEN ([customer].[age] <= @5) THEN @6 END) FROM [customer]', - string: 'SELECT (CASE WHEN ([customer].[age] IN (10, 20, 30)) THEN 0 WHEN ([customer].[age] <= 60) THEN 1 END) FROM [customer]' - }, - oracle: { - text : 'SELECT (CASE WHEN ("customer"."age" IN (:1, :2, :3)) THEN :4 WHEN ("customer"."age" <= :5) THEN :6 END) FROM "customer"', - string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 END) FROM "customer"' - }, - params: [10, 20, 30, 0, 60, 1] -}); - -// Check case expression with compound then expressions. -Harness.test({ - query: customer.select(customer.age.case([customer.age.in([10, 20, 30]), customer.age.lte(60)], [customer.age.plus(5), customer.age.minus(1)])), - pg: { - text : 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN ("customer"."age" + $4) WHEN ("customer"."age" <= $5) THEN ("customer"."age" - $6) END) FROM "customer"', - string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN ("customer"."age" + 5) WHEN ("customer"."age" <= 60) THEN ("customer"."age" - 1) END) FROM "customer"' - }, - sqlite: { - text : 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN ("customer"."age" + $4) WHEN ("customer"."age" <= $5) THEN ("customer"."age" - $6) END) FROM "customer"', - string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN ("customer"."age" + 5) WHEN ("customer"."age" <= 60) THEN ("customer"."age" - 1) END) FROM "customer"' - }, - mysql: { - text : 'SELECT (CASE WHEN (`customer`.`age` IN (?, ?, ?)) THEN (`customer`.`age` + ?) WHEN (`customer`.`age` <= ?) THEN (`customer`.`age` - ?) END) FROM `customer`', - string: 'SELECT (CASE WHEN (`customer`.`age` IN (10, 20, 30)) THEN (`customer`.`age` + 5) WHEN (`customer`.`age` <= 60) THEN (`customer`.`age` - 1) END) FROM `customer`' - }, - mssql: { - text : 'SELECT (CASE WHEN ([customer].[age] IN (@1, @2, @3)) THEN ([customer].[age] + @4) WHEN ([customer].[age] <= @5) THEN ([customer].[age] - @6) END) FROM [customer]', - string: 'SELECT (CASE WHEN ([customer].[age] IN (10, 20, 30)) THEN ([customer].[age] + 5) WHEN ([customer].[age] <= 60) THEN ([customer].[age] - 1) END) FROM [customer]' - }, - oracle: { - text : 'SELECT (CASE WHEN ("customer"."age" IN (:1, :2, :3)) THEN ("customer"."age" + :4) WHEN ("customer"."age" <= :5) THEN ("customer"."age" - :6) END) FROM "customer"', - string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN ("customer"."age" + 5) WHEN ("customer"."age" <= 60) THEN ("customer"."age" - 1) END) FROM "customer"' - }, - params: [10, 20, 30, 5, 60, 1] -}); diff --git a/test/dialects/case-tests.ts b/test/dialects/case-tests.ts new file mode 100644 index 00000000..b5ecb568 --- /dev/null +++ b/test/dialects/case-tests.ts @@ -0,0 +1,243 @@ +'use strict'; + +import * as Harness from './support'; +const customer = Harness.defineCustomerTable(); + +// Check case expression with primary when expressions and else branch. +Harness.test({ + query: customer.select(customer.age.case([true, false], [0, 1], 2)), + pg: { + text: 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END) FROM "customer"', + string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END) FROM "customer"' + }, + sqlite: { + text: 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END) FROM "customer"', + string: 'SELECT (CASE WHEN 1 THEN 0 WHEN 0 THEN 1 ELSE 2 END) FROM "customer"' + }, + mysql: { + text: 'SELECT (CASE WHEN ? THEN ? WHEN ? THEN ? ELSE ? END) FROM `customer`', + string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END) FROM `customer`' + }, + mssql: { + text: 'SELECT (CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 ELSE @3 END) FROM [customer]', + string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END) FROM [customer]', + params: [0, 1, 2] + }, + oracle: { + text: 'SELECT (CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 ELSE :3 END) FROM "customer"', + string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END) FROM "customer"', + params: [0, 1, 2] + }, + params: [true, 0, false, 1, 2] +}); + +// Check case expression as a subexpression. +Harness.test({ + query: customer.select(customer.age.plus(customer.age.case([true, false], [0, 1], 2))), + pg: { + text: 'SELECT ("customer"."age" + (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END)) FROM "customer"', + string: 'SELECT ("customer"."age" + (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END)) FROM "customer"' + }, + sqlite: { + text: 'SELECT ("customer"."age" + (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END)) FROM "customer"', + string: 'SELECT ("customer"."age" + (CASE WHEN 1 THEN 0 WHEN 0 THEN 1 ELSE 2 END)) FROM "customer"' + }, + mysql: { + text: 'SELECT (`customer`.`age` + (CASE WHEN ? THEN ? WHEN ? THEN ? ELSE ? END)) FROM `customer`', + string: 'SELECT (`customer`.`age` + (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END)) FROM `customer`' + }, + mssql: { + text: 'SELECT ([customer].[age] + (CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 ELSE @3 END)) FROM [customer]', + string: 'SELECT ([customer].[age] + (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END)) FROM [customer]', + params: [0, 1, 2] + }, + oracle: { + text: 'SELECT ("customer"."age" + (CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 ELSE :3 END)) FROM "customer"', + string: 'SELECT ("customer"."age" + (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END)) FROM "customer"', + params: [0, 1, 2] + }, + params: [true, 0, false, 1, 2] +}); + +// Check case expression as subexpression on the left. +Harness.test({ + query: customer.select(customer.age.case([true, false], [0, 1], 2).plus(3)), + pg: { + text: 'SELECT ((CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END) + $6) FROM "customer"', + string: 'SELECT ((CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END) + 3) FROM "customer"' + }, + sqlite: { + text: 'SELECT ((CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE $5 END) + $6) FROM "customer"', + string: 'SELECT ((CASE WHEN 1 THEN 0 WHEN 0 THEN 1 ELSE 2 END) + 3) FROM "customer"' + }, + mysql: { + text: 'SELECT ((CASE WHEN ? THEN ? WHEN ? THEN ? ELSE ? END) + ?) FROM `customer`', + string: 'SELECT ((CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE 2 END) + 3) FROM `customer`' + }, + mssql: { + text: 'SELECT ((CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 ELSE @3 END) + @4) FROM [customer]', + string: 'SELECT ((CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END) + 3) FROM [customer]', + params: [0, 1, 2, 3] + }, + oracle: { + text: 'SELECT ((CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 ELSE :3 END) + :4) FROM "customer"', + string: 'SELECT ((CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE 2 END) + 3) FROM "customer"', + params: [0, 1, 2, 3] + }, + params: [true, 0, false, 1, 2, 3] +}); + +// Check case expression with primary when expressions and compound else expression. +Harness.test({ + query: customer.select(customer.age.case([true, false], [0, 1], customer.age.between(10, 20))), + pg: { + text: 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE ("customer"."age" BETWEEN $5 AND $6) END) FROM "customer"', + string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE ("customer"."age" BETWEEN 10 AND 20) END) FROM "customer"' + }, + sqlite: { + text: 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 ELSE ("customer"."age" BETWEEN $5 AND $6) END) FROM "customer"', + string: 'SELECT (CASE WHEN 1 THEN 0 WHEN 0 THEN 1 ELSE ("customer"."age" BETWEEN 10 AND 20) END) FROM "customer"' + }, + mysql: { + text: 'SELECT (CASE WHEN ? THEN ? WHEN ? THEN ? ELSE (`customer`.`age` BETWEEN ? AND ?) END) FROM `customer`', + string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 ELSE (`customer`.`age` BETWEEN 10 AND 20) END) FROM `customer`' + }, + mssql: { + text: 'SELECT (CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 ELSE ([customer].[age] BETWEEN @3 AND @4) END) FROM [customer]', + string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE ([customer].[age] BETWEEN 10 AND 20) END) FROM [customer]', + params: [0, 1, 10, 20] + }, + oracle: { + text: 'SELECT (CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 ELSE ("customer"."age" BETWEEN :3 AND :4) END) FROM "customer"', + string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 ELSE ("customer"."age" BETWEEN 10 AND 20) END) FROM "customer"', + params: [0, 1, 10, 20] + }, + params: [true, 0, false, 1, 10, 20] +}); + +// Check case expression with primary when expressions without else branch. +Harness.test({ + query: customer.select(customer.age.case([true, false], [0, 1])), + pg: { + text: 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 END) FROM "customer"', + string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 END) FROM "customer"' + }, + sqlite: { + text: 'SELECT (CASE WHEN $1 THEN $2 WHEN $3 THEN $4 END) FROM "customer"', + string: 'SELECT (CASE WHEN 1 THEN 0 WHEN 0 THEN 1 END) FROM "customer"' + }, + mysql: { + text: 'SELECT (CASE WHEN ? THEN ? WHEN ? THEN ? END) FROM `customer`', + string: 'SELECT (CASE WHEN TRUE THEN 0 WHEN FALSE THEN 1 END) FROM `customer`' + }, + mssql: { + text: 'SELECT (CASE WHEN 1=1 THEN @1 WHEN 0=1 THEN @2 END) FROM [customer]', + string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 END) FROM [customer]', + params: [0, 1] + }, + oracle: { + text: 'SELECT (CASE WHEN 1=1 THEN :1 WHEN 0=1 THEN :2 END) FROM "customer"', + string: 'SELECT (CASE WHEN 1=1 THEN 0 WHEN 0=1 THEN 1 END) FROM "customer"', + params: [0, 1] + }, + params: [true, 0, false, 1] +}); + +// Check case expression with compound when expressions and else branch. +Harness.test({ + query: customer.select(customer.age.case([customer.age.in([10, 20, 30]), customer.age.lte(60)], [0, 1], 2)), + pg: { + text: + 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN $4 WHEN ("customer"."age" <= $5) THEN $6 ELSE $7 END) FROM "customer"', + string: + 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 ELSE 2 END) FROM "customer"' + }, + sqlite: { + text: + 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN $4 WHEN ("customer"."age" <= $5) THEN $6 ELSE $7 END) FROM "customer"', + string: + 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 ELSE 2 END) FROM "customer"' + }, + mysql: { + text: 'SELECT (CASE WHEN (`customer`.`age` IN (?, ?, ?)) THEN ? WHEN (`customer`.`age` <= ?) THEN ? ELSE ? END) FROM `customer`', + string: + 'SELECT (CASE WHEN (`customer`.`age` IN (10, 20, 30)) THEN 0 WHEN (`customer`.`age` <= 60) THEN 1 ELSE 2 END) FROM `customer`' + }, + mssql: { + text: + 'SELECT (CASE WHEN ([customer].[age] IN (@1, @2, @3)) THEN @4 WHEN ([customer].[age] <= @5) THEN @6 ELSE @7 END) FROM [customer]', + string: + 'SELECT (CASE WHEN ([customer].[age] IN (10, 20, 30)) THEN 0 WHEN ([customer].[age] <= 60) THEN 1 ELSE 2 END) FROM [customer]' + }, + oracle: { + text: + 'SELECT (CASE WHEN ("customer"."age" IN (:1, :2, :3)) THEN :4 WHEN ("customer"."age" <= :5) THEN :6 ELSE :7 END) FROM "customer"', + string: + 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 ELSE 2 END) FROM "customer"' + }, + params: [10, 20, 30, 0, 60, 1, 2] +}); + +// Check case expression without else branch. +Harness.test({ + query: customer.select(customer.age.case([customer.age.in([10, 20, 30]), customer.age.lte(60)], [0, 1])), + pg: { + text: 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN $4 WHEN ("customer"."age" <= $5) THEN $6 END) FROM "customer"', + string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 END) FROM "customer"' + }, + sqlite: { + text: 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN $4 WHEN ("customer"."age" <= $5) THEN $6 END) FROM "customer"', + string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 END) FROM "customer"' + }, + mysql: { + text: 'SELECT (CASE WHEN (`customer`.`age` IN (?, ?, ?)) THEN ? WHEN (`customer`.`age` <= ?) THEN ? END) FROM `customer`', + string: 'SELECT (CASE WHEN (`customer`.`age` IN (10, 20, 30)) THEN 0 WHEN (`customer`.`age` <= 60) THEN 1 END) FROM `customer`' + }, + mssql: { + text: 'SELECT (CASE WHEN ([customer].[age] IN (@1, @2, @3)) THEN @4 WHEN ([customer].[age] <= @5) THEN @6 END) FROM [customer]', + string: 'SELECT (CASE WHEN ([customer].[age] IN (10, 20, 30)) THEN 0 WHEN ([customer].[age] <= 60) THEN 1 END) FROM [customer]' + }, + oracle: { + text: 'SELECT (CASE WHEN ("customer"."age" IN (:1, :2, :3)) THEN :4 WHEN ("customer"."age" <= :5) THEN :6 END) FROM "customer"', + string: 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN 0 WHEN ("customer"."age" <= 60) THEN 1 END) FROM "customer"' + }, + params: [10, 20, 30, 0, 60, 1] +}); + +// Check case expression with compound then expressions. +Harness.test({ + query: customer.select( + customer.age.case([customer.age.in([10, 20, 30]), customer.age.lte(60)], [customer.age.plus(5), customer.age.minus(1)]) + ), + pg: { + text: + 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN ("customer"."age" + $4) WHEN ("customer"."age" <= $5) THEN ("customer"."age" - $6) END) FROM "customer"', + string: + 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN ("customer"."age" + 5) WHEN ("customer"."age" <= 60) THEN ("customer"."age" - 1) END) FROM "customer"' + }, + sqlite: { + text: + 'SELECT (CASE WHEN ("customer"."age" IN ($1, $2, $3)) THEN ("customer"."age" + $4) WHEN ("customer"."age" <= $5) THEN ("customer"."age" - $6) END) FROM "customer"', + string: + 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN ("customer"."age" + 5) WHEN ("customer"."age" <= 60) THEN ("customer"."age" - 1) END) FROM "customer"' + }, + mysql: { + text: + 'SELECT (CASE WHEN (`customer`.`age` IN (?, ?, ?)) THEN (`customer`.`age` + ?) WHEN (`customer`.`age` <= ?) THEN (`customer`.`age` - ?) END) FROM `customer`', + string: + 'SELECT (CASE WHEN (`customer`.`age` IN (10, 20, 30)) THEN (`customer`.`age` + 5) WHEN (`customer`.`age` <= 60) THEN (`customer`.`age` - 1) END) FROM `customer`' + }, + mssql: { + text: + 'SELECT (CASE WHEN ([customer].[age] IN (@1, @2, @3)) THEN ([customer].[age] + @4) WHEN ([customer].[age] <= @5) THEN ([customer].[age] - @6) END) FROM [customer]', + string: + 'SELECT (CASE WHEN ([customer].[age] IN (10, 20, 30)) THEN ([customer].[age] + 5) WHEN ([customer].[age] <= 60) THEN ([customer].[age] - 1) END) FROM [customer]' + }, + oracle: { + text: + 'SELECT (CASE WHEN ("customer"."age" IN (:1, :2, :3)) THEN ("customer"."age" + :4) WHEN ("customer"."age" <= :5) THEN ("customer"."age" - :6) END) FROM "customer"', + string: + 'SELECT (CASE WHEN ("customer"."age" IN (10, 20, 30)) THEN ("customer"."age" + 5) WHEN ("customer"."age" <= 60) THEN ("customer"."age" - 1) END) FROM "customer"' + }, + params: [10, 20, 30, 5, 60, 1] +}); diff --git a/test/dialects/cast-tests.js b/test/dialects/cast-tests.js deleted file mode 100644 index 2295d720..00000000 --- a/test/dialects/cast-tests.js +++ /dev/null @@ -1,314 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var customerAlias = Harness.defineCustomerAliasTable(); - -// Cast columns. -Harness.test({ - query: customer.select(customer.age.cast('int')), - pg: { - text : 'SELECT CAST("customer"."age" AS int) FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST("customer"."age" AS int) FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' - }, - mysql: { - text : 'SELECT CAST(`customer`.`age` AS int) FROM `customer`', - string: 'SELECT CAST(`customer`.`age` AS int) FROM `customer`' - }, - mssql: { - text : 'SELECT CAST([customer].[age] AS int) FROM [customer]', - string: 'SELECT CAST([customer].[age] AS int) FROM [customer]' - }, - oracle: { - text : 'SELECT CAST("customer"."age" AS int) FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: customer.select(customer.name.cast('varchar(10)')), - pg: { - text : 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', - string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', - string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' - }, - mysql: { - text : 'SELECT CAST(`customer`.`name` AS varchar(10)) FROM `customer`', - string: 'SELECT CAST(`customer`.`name` AS varchar(10)) FROM `customer`' - }, - mssql: { - text : 'SELECT CAST([customer].[name] AS varchar(10)) FROM [customer]', - string: 'SELECT CAST([customer].[name] AS varchar(10)) FROM [customer]' - }, - oracle: { - text : 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', - string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' - }, - params: [] -}); - -// Cast binary expressions. -Harness.test({ - query: customer.select(customer.name.plus(customer.age).cast('varchar(15)')), - pg: { - text : 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', - string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', - string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' - }, - mysql: { - text : 'SELECT CAST((`customer`.`name` + `customer`.`age`) AS varchar(15)) FROM `customer`', - string: 'SELECT CAST((`customer`.`name` + `customer`.`age`) AS varchar(15)) FROM `customer`' - }, - mssql: { - text : 'SELECT CAST(([customer].[name] + [customer].[age]) AS varchar(15)) FROM [customer]', - string: 'SELECT CAST(([customer].[name] + [customer].[age]) AS varchar(15)) FROM [customer]' - }, - oracle: { - text : 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', - string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' - }, - params: [] -}); - -// Cast cast expressions. -Harness.test({ - query: customer.select(customer.name.cast('varchar(15)').cast('varchar(10)')), - pg: { - text : 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', - string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', - string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' - }, - mysql: { - text : 'SELECT CAST(CAST(`customer`.`name` AS varchar(15)) AS varchar(10)) FROM `customer`', - string: 'SELECT CAST(CAST(`customer`.`name` AS varchar(15)) AS varchar(10)) FROM `customer`' - }, - mssql: { - text : 'SELECT CAST(CAST([customer].[name] AS varchar(15)) AS varchar(10)) FROM [customer]', - string: 'SELECT CAST(CAST([customer].[name] AS varchar(15)) AS varchar(10)) FROM [customer]' - }, - oracle: { - text : 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', - string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' - }, - params: [] -}); - -// Cast in WHERE. -Harness.test({ - query: customer.select(customer.name).where(customer.age.cast('int').plus(100).equals(150)), - pg: { - text : 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + $1) = $2)', - string: 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' - }, - sqlite: { - text : 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + $1) = $2)', - string: 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' - }, - mysql: { - text : 'SELECT `customer`.`name` FROM `customer` WHERE ((CAST(`customer`.`age` AS int) + ?) = ?)', - string: 'SELECT `customer`.`name` FROM `customer` WHERE ((CAST(`customer`.`age` AS int) + 100) = 150)' - }, - mssql: { - text : 'SELECT [customer].[name] FROM [customer] WHERE ((CAST([customer].[age] AS int) + @1) = @2)', - string: 'SELECT [customer].[name] FROM [customer] WHERE ((CAST([customer].[age] AS int) + 100) = 150)' - }, - oracle: { - text : 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + :1) = :2)', - string: 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' - }, - params: [100, 150] -}); - -// Alias cast. -Harness.test({ - query: customer.select(customer.age.cast('int').as('age_int')), - pg: { - text : 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"' - }, - mysql: { - text : 'SELECT CAST(`customer`.`age` AS int) AS `age_int` FROM `customer`', - string: 'SELECT CAST(`customer`.`age` AS int) AS `age_int` FROM `customer`' - }, - mssql: { - text : 'SELECT CAST([customer].[age] AS int) AS [age_int] FROM [customer]', - string: 'SELECT CAST([customer].[age] AS int) AS [age_int] FROM [customer]' - }, - oracle: { - text : 'SELECT CAST("customer"."age" AS int) "age_int" FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) "age_int" FROM "customer"' - }, - params: [] -}); - -// Cast Aliased columns. -Harness.test({ - query: customerAlias.select(customerAlias.age_alias.cast('int')), - pg: { - text : 'SELECT CAST("customer"."age" AS int) FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST("customer"."age" AS int) FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' - }, - mysql: { - text : 'SELECT CAST(`customer`.`age` AS int) FROM `customer`', - string: 'SELECT CAST(`customer`.`age` AS int) FROM `customer`' - }, - mssql: { - text : 'SELECT CAST([customer].[age] AS int) FROM [customer]', - string: 'SELECT CAST([customer].[age] AS int) FROM [customer]' - }, - oracle: { - text : 'SELECT CAST("customer"."age" AS int) FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: customerAlias.select(customerAlias.name_alias.cast('varchar(10)')), - pg: { - text : 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', - string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', - string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' - }, - mysql: { - text : 'SELECT CAST(`customer`.`name` AS varchar(10)) FROM `customer`', - string: 'SELECT CAST(`customer`.`name` AS varchar(10)) FROM `customer`' - }, - mssql: { - text : 'SELECT CAST([customer].[name] AS varchar(10)) FROM [customer]', - string: 'SELECT CAST([customer].[name] AS varchar(10)) FROM [customer]' - }, - oracle: { - text : 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', - string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' - }, - params: [] -}); -// Cast binary expressions for Aliased Column. -Harness.test({ - query: customerAlias.select(customerAlias.name_alias.plus(customerAlias.age_alias).cast('varchar(15)')), - pg: { - text : 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', - string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', - string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' - }, - mysql: { - text : 'SELECT CAST((`customer`.`name` + `customer`.`age`) AS varchar(15)) FROM `customer`', - string: 'SELECT CAST((`customer`.`name` + `customer`.`age`) AS varchar(15)) FROM `customer`' - }, - mssql: { - text : 'SELECT CAST(([customer].[name] + [customer].[age]) AS varchar(15)) FROM [customer]', - string: 'SELECT CAST(([customer].[name] + [customer].[age]) AS varchar(15)) FROM [customer]' - }, - oracle: { - text : 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', - string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' - }, - params: [] -}); - -// Cast cast expressions for aliased columns. -Harness.test({ - query: customerAlias.select(customerAlias.name_alias.cast('varchar(15)').cast('varchar(10)')), - pg: { - text : 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', - string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', - string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' - }, - mysql: { - text : 'SELECT CAST(CAST(`customer`.`name` AS varchar(15)) AS varchar(10)) FROM `customer`', - string: 'SELECT CAST(CAST(`customer`.`name` AS varchar(15)) AS varchar(10)) FROM `customer`' - }, - mssql: { - text : 'SELECT CAST(CAST([customer].[name] AS varchar(15)) AS varchar(10)) FROM [customer]', - string: 'SELECT CAST(CAST([customer].[name] AS varchar(15)) AS varchar(10)) FROM [customer]' - }, - oracle: { - text : 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', - string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' - }, - params: [] -}); - -// Cast in WHERE for aliased columns. -Harness.test({ - query: customerAlias.select(customerAlias.name_alias).where(customerAlias.age_alias.cast('int').plus(100).equals(150)), - pg: { - text : 'SELECT "customer"."name" AS "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + $1) = $2)', - string: 'SELECT "customer"."name" AS "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' - }, - sqlite: { - text : 'SELECT "customer"."name" AS "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + $1) = $2)', - string: 'SELECT "customer"."name" AS "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' - }, - mysql: { - text : 'SELECT `customer`.`name` AS `name_alias` FROM `customer` WHERE ((CAST(`customer`.`age` AS int) + ?) = ?)', - string: 'SELECT `customer`.`name` AS `name_alias` FROM `customer` WHERE ((CAST(`customer`.`age` AS int) + 100) = 150)' - }, - mssql: { - text : 'SELECT [customer].[name] AS [name_alias] FROM [customer] WHERE ((CAST([customer].[age] AS int) + @1) = @2)', - string: 'SELECT [customer].[name] AS [name_alias] FROM [customer] WHERE ((CAST([customer].[age] AS int) + 100) = 150)' - }, - oracle: { - text : 'SELECT "customer"."name" "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + :1) = :2)', - string: 'SELECT "customer"."name" "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' - }, - params: [100, 150] -}); - -// Alias cast. -Harness.test({ - query: customerAlias.select(customerAlias.age_alias.cast('int').as('age_int')), - pg: { - text : 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"' - }, - sqlite: { - text : 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"' - }, - mysql: { - text : 'SELECT CAST(`customer`.`age` AS int) AS `age_int` FROM `customer`', - string: 'SELECT CAST(`customer`.`age` AS int) AS `age_int` FROM `customer`' - }, - mssql: { - text : 'SELECT CAST([customer].[age] AS int) AS [age_int] FROM [customer]', - string: 'SELECT CAST([customer].[age] AS int) AS [age_int] FROM [customer]' - }, - oracle: { - text : 'SELECT CAST("customer"."age" AS int) "age_int" FROM "customer"', - string: 'SELECT CAST("customer"."age" AS int) "age_int" FROM "customer"' - }, - params: [] -}); diff --git a/test/dialects/cast-tests.ts b/test/dialects/cast-tests.ts new file mode 100644 index 00000000..27447f84 --- /dev/null +++ b/test/dialects/cast-tests.ts @@ -0,0 +1,323 @@ +'use strict'; +import * as Harness from './support'; +const customer = Harness.defineCustomerTable(); +const customerAlias = Harness.defineCustomerAliasTable(); + +// Cast columns. +Harness.test({ + query: customer.select(customer.age.cast('int')), + pg: { + text: 'SELECT CAST("customer"."age" AS int) FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST("customer"."age" AS int) FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' + }, + mysql: { + text: 'SELECT CAST(`customer`.`age` AS int) FROM `customer`', + string: 'SELECT CAST(`customer`.`age` AS int) FROM `customer`' + }, + mssql: { + text: 'SELECT CAST([customer].[age] AS int) FROM [customer]', + string: 'SELECT CAST([customer].[age] AS int) FROM [customer]' + }, + oracle: { + text: 'SELECT CAST("customer"."age" AS int) FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customer.select(customer.name.cast('varchar(10)')), + pg: { + text: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', + string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', + string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' + }, + mysql: { + text: 'SELECT CAST(`customer`.`name` AS varchar(10)) FROM `customer`', + string: 'SELECT CAST(`customer`.`name` AS varchar(10)) FROM `customer`' + }, + mssql: { + text: 'SELECT CAST([customer].[name] AS varchar(10)) FROM [customer]', + string: 'SELECT CAST([customer].[name] AS varchar(10)) FROM [customer]' + }, + oracle: { + text: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', + string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' + }, + params: [] +}); + +// Cast binary expressions. +Harness.test({ + query: customer.select(customer.name.plus(customer.age).cast('varchar(15)')), + pg: { + text: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', + string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', + string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' + }, + mysql: { + text: 'SELECT CAST((`customer`.`name` + `customer`.`age`) AS varchar(15)) FROM `customer`', + string: 'SELECT CAST((`customer`.`name` + `customer`.`age`) AS varchar(15)) FROM `customer`' + }, + mssql: { + text: 'SELECT CAST(([customer].[name] + [customer].[age]) AS varchar(15)) FROM [customer]', + string: 'SELECT CAST(([customer].[name] + [customer].[age]) AS varchar(15)) FROM [customer]' + }, + oracle: { + text: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', + string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' + }, + params: [] +}); + +// Cast cast expressions. +Harness.test({ + query: customer.select(customer.name.cast('varchar(15)').cast('varchar(10)')), + pg: { + text: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', + string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', + string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' + }, + mysql: { + text: 'SELECT CAST(CAST(`customer`.`name` AS varchar(15)) AS varchar(10)) FROM `customer`', + string: 'SELECT CAST(CAST(`customer`.`name` AS varchar(15)) AS varchar(10)) FROM `customer`' + }, + mssql: { + text: 'SELECT CAST(CAST([customer].[name] AS varchar(15)) AS varchar(10)) FROM [customer]', + string: 'SELECT CAST(CAST([customer].[name] AS varchar(15)) AS varchar(10)) FROM [customer]' + }, + oracle: { + text: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', + string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' + }, + params: [] +}); + +// Cast in WHERE. +Harness.test({ + query: customer.select(customer.name).where( + customer.age + .cast('int') + .plus(100) + .equals(150) + ), + pg: { + text: 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + $1) = $2)', + string: 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' + }, + sqlite: { + text: 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + $1) = $2)', + string: 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' + }, + mysql: { + text: 'SELECT `customer`.`name` FROM `customer` WHERE ((CAST(`customer`.`age` AS int) + ?) = ?)', + string: 'SELECT `customer`.`name` FROM `customer` WHERE ((CAST(`customer`.`age` AS int) + 100) = 150)' + }, + mssql: { + text: 'SELECT [customer].[name] FROM [customer] WHERE ((CAST([customer].[age] AS int) + @1) = @2)', + string: 'SELECT [customer].[name] FROM [customer] WHERE ((CAST([customer].[age] AS int) + 100) = 150)' + }, + oracle: { + text: 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + :1) = :2)', + string: 'SELECT "customer"."name" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' + }, + params: [100, 150] +}); + +// Alias cast. +Harness.test({ + query: customer.select(customer.age.cast('int').as('age_int')), + pg: { + text: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"' + }, + mysql: { + text: 'SELECT CAST(`customer`.`age` AS int) AS `age_int` FROM `customer`', + string: 'SELECT CAST(`customer`.`age` AS int) AS `age_int` FROM `customer`' + }, + mssql: { + text: 'SELECT CAST([customer].[age] AS int) AS [age_int] FROM [customer]', + string: 'SELECT CAST([customer].[age] AS int) AS [age_int] FROM [customer]' + }, + oracle: { + text: 'SELECT CAST("customer"."age" AS int) "age_int" FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) "age_int" FROM "customer"' + }, + params: [] +}); + +// Cast Aliased columns. +Harness.test({ + query: customerAlias.select(customerAlias.age_alias.cast('int')), + pg: { + text: 'SELECT CAST("customer"."age" AS int) FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST("customer"."age" AS int) FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' + }, + mysql: { + text: 'SELECT CAST(`customer`.`age` AS int) FROM `customer`', + string: 'SELECT CAST(`customer`.`age` AS int) FROM `customer`' + }, + mssql: { + text: 'SELECT CAST([customer].[age] AS int) FROM [customer]', + string: 'SELECT CAST([customer].[age] AS int) FROM [customer]' + }, + oracle: { + text: 'SELECT CAST("customer"."age" AS int) FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customerAlias.select(customerAlias.name_alias.cast('varchar(10)')), + pg: { + text: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', + string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', + string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' + }, + mysql: { + text: 'SELECT CAST(`customer`.`name` AS varchar(10)) FROM `customer`', + string: 'SELECT CAST(`customer`.`name` AS varchar(10)) FROM `customer`' + }, + mssql: { + text: 'SELECT CAST([customer].[name] AS varchar(10)) FROM [customer]', + string: 'SELECT CAST([customer].[name] AS varchar(10)) FROM [customer]' + }, + oracle: { + text: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"', + string: 'SELECT CAST("customer"."name" AS varchar(10)) FROM "customer"' + }, + params: [] +}); +// Cast binary expressions for Aliased Column. +Harness.test({ + query: customerAlias.select(customerAlias.name_alias.plus(customerAlias.age_alias).cast('varchar(15)')), + pg: { + text: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', + string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', + string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' + }, + mysql: { + text: 'SELECT CAST((`customer`.`name` + `customer`.`age`) AS varchar(15)) FROM `customer`', + string: 'SELECT CAST((`customer`.`name` + `customer`.`age`) AS varchar(15)) FROM `customer`' + }, + mssql: { + text: 'SELECT CAST(([customer].[name] + [customer].[age]) AS varchar(15)) FROM [customer]', + string: 'SELECT CAST(([customer].[name] + [customer].[age]) AS varchar(15)) FROM [customer]' + }, + oracle: { + text: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"', + string: 'SELECT CAST(("customer"."name" + "customer"."age") AS varchar(15)) FROM "customer"' + }, + params: [] +}); + +// Cast cast expressions for aliased columns. +Harness.test({ + query: customerAlias.select(customerAlias.name_alias.cast('varchar(15)').cast('varchar(10)')), + pg: { + text: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', + string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', + string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' + }, + mysql: { + text: 'SELECT CAST(CAST(`customer`.`name` AS varchar(15)) AS varchar(10)) FROM `customer`', + string: 'SELECT CAST(CAST(`customer`.`name` AS varchar(15)) AS varchar(10)) FROM `customer`' + }, + mssql: { + text: 'SELECT CAST(CAST([customer].[name] AS varchar(15)) AS varchar(10)) FROM [customer]', + string: 'SELECT CAST(CAST([customer].[name] AS varchar(15)) AS varchar(10)) FROM [customer]' + }, + oracle: { + text: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"', + string: 'SELECT CAST(CAST("customer"."name" AS varchar(15)) AS varchar(10)) FROM "customer"' + }, + params: [] +}); + +// Cast in WHERE for aliased columns. +Harness.test({ + query: customerAlias.select(customerAlias.name_alias).where( + customerAlias.age_alias + .cast('int') + .plus(100) + .equals(150) + ), + pg: { + text: 'SELECT "customer"."name" AS "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + $1) = $2)', + string: 'SELECT "customer"."name" AS "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' + }, + sqlite: { + text: 'SELECT "customer"."name" AS "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + $1) = $2)', + string: 'SELECT "customer"."name" AS "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' + }, + mysql: { + text: 'SELECT `customer`.`name` AS `name_alias` FROM `customer` WHERE ((CAST(`customer`.`age` AS int) + ?) = ?)', + string: 'SELECT `customer`.`name` AS `name_alias` FROM `customer` WHERE ((CAST(`customer`.`age` AS int) + 100) = 150)' + }, + mssql: { + text: 'SELECT [customer].[name] AS [name_alias] FROM [customer] WHERE ((CAST([customer].[age] AS int) + @1) = @2)', + string: 'SELECT [customer].[name] AS [name_alias] FROM [customer] WHERE ((CAST([customer].[age] AS int) + 100) = 150)' + }, + oracle: { + text: 'SELECT "customer"."name" "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + :1) = :2)', + string: 'SELECT "customer"."name" "name_alias" FROM "customer" WHERE ((CAST("customer"."age" AS int) + 100) = 150)' + }, + params: [100, 150] +}); + +// Alias cast. +Harness.test({ + query: customerAlias.select(customerAlias.age_alias.cast('int').as('age_int')), + pg: { + text: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"' + }, + sqlite: { + text: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) AS "age_int" FROM "customer"' + }, + mysql: { + text: 'SELECT CAST(`customer`.`age` AS int) AS `age_int` FROM `customer`', + string: 'SELECT CAST(`customer`.`age` AS int) AS `age_int` FROM `customer`' + }, + mssql: { + text: 'SELECT CAST([customer].[age] AS int) AS [age_int] FROM [customer]', + string: 'SELECT CAST([customer].[age] AS int) AS [age_int] FROM [customer]' + }, + oracle: { + text: 'SELECT CAST("customer"."age" AS int) "age_int" FROM "customer"', + string: 'SELECT CAST("customer"."age" AS int) "age_int" FROM "customer"' + }, + params: [] +}); diff --git a/test/dialects/clause-ordering-tests.js b/test/dialects/clause-ordering-tests.js deleted file mode 100644 index 83d2d28e..00000000 --- a/test/dialects/clause-ordering-tests.js +++ /dev/null @@ -1,118 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); -var post = Harness.definePostTable(); - -// FROM - SELECT -Harness.test({ - query: user.from(user.join(post).on(user.id.equals(post.userId))).select(user.name, post.content), - pg: { - text : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' - }, - sqlite: { - text : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' - }, - mysql: { - text : 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)', - string: 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)' - }, - mssql: { - text : 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId])', - string: 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId])' - }, - oracle: { - text : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' - }, - params: [] -}); - -// WHERE - FROM - SELECT -Harness.test({ - query: user.where({ - name: '' - }).from(user).select(user.id), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = ?)', - string: 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = \'\')' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE ([user].[name] = @1)', - string: 'SELECT [user].[id] FROM [user] WHERE ([user].[name] = \'\')' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = :1)', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' - }, - params: [''] -}); - -// SELECT - FROM - WHERE -Harness.test({ - query: user - .select(user.name, post.content) - .from(user.join(post).on(user.id.equals(post.userId))) - .where({ - name: '' - }), - pg: { - text : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = $1)', - string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = \'\')' - }, - sqlite: { - text : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = $1)', - string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = \'\')' - }, - mysql: { - text : 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`user`.`name` = ?)', - string: 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`user`.`name` = \'\')' - }, - mssql: { - text : 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) WHERE ([user].[name] = @1)', - string: 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) WHERE ([user].[name] = \'\')' - }, - oracle: { - text : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = :1)', - string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = \'\')' - }, - params: [''] -}); - -// SELECT - FROM - WHERE -Harness.test({ - query: user.select(user.id).from(user).where({ - name: '' - }), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = ?)', - string: 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = \'\')' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE ([user].[name] = @1)', - string: 'SELECT [user].[id] FROM [user] WHERE ([user].[name] = \'\')' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = :1)', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' - }, - params: [''] -}); diff --git a/test/dialects/clause-ordering-tests.ts b/test/dialects/clause-ordering-tests.ts new file mode 100644 index 00000000..68872328 --- /dev/null +++ b/test/dialects/clause-ordering-tests.ts @@ -0,0 +1,134 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); + +// FROM - SELECT +Harness.test({ + query: user.from(user.join(post).on(user.id.equals(post.userId))).select(user.name, post.content), + pg: { + text: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', + string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' + }, + sqlite: { + text: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', + string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' + }, + mysql: { + text: 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)', + string: 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)' + }, + mssql: { + text: 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId])', + string: 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId])' + }, + oracle: { + text: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', + string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' + }, + params: [] +}); + +// WHERE - FROM - SELECT +Harness.test({ + query: user + .where({ + name: '' + }) + .from(user) + .select(user.id), + pg: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = ?)', + string: "SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = '')" + }, + mssql: { + text: 'SELECT [user].[id] FROM [user] WHERE ([user].[name] = @1)', + string: "SELECT [user].[id] FROM [user] WHERE ([user].[name] = '')" + }, + oracle: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = :1)', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' + }, + params: [''] +}); + +// SELECT - FROM - WHERE +Harness.test({ + query: user + .select(user.name, post.content) + .from(user.join(post).on(user.id.equals(post.userId))) + .where({ + name: '' + }), + pg: { + text: + 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = $1)', + string: + 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = \'\')' + }, + sqlite: { + text: + 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = $1)', + string: + 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = \'\')' + }, + mysql: { + text: + 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`user`.`name` = ?)', + string: + "SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`user`.`name` = '')" + }, + mssql: { + text: + 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) WHERE ([user].[name] = @1)', + string: + "SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) WHERE ([user].[name] = '')" + }, + oracle: { + text: + 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = :1)', + string: + 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("user"."name" = \'\')' + }, + params: [''] +}); + +// SELECT - FROM - WHERE +Harness.test({ + query: user + .select(user.id) + .from(user) + .where({ + name: '' + }), + pg: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = ?)', + string: "SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = '')" + }, + mssql: { + text: 'SELECT [user].[id] FROM [user] WHERE ([user].[name] = @1)', + string: "SELECT [user].[id] FROM [user] WHERE ([user].[name] = '')" + }, + oracle: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = :1)', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'\')' + }, + params: [''] +}); diff --git a/test/dialects/create-table-tests.js b/test/dialects/create-table-tests.js deleted file mode 100644 index b1150617..00000000 --- a/test/dialects/create-table-tests.js +++ /dev/null @@ -1,761 +0,0 @@ -'use strict'; - -var Table = require(__dirname + '/../../lib/table'); -var Harness = require('./support'); - -var group = Table.define({ - name: 'group', - columns: [{ - name: 'id', - dataType: 'varchar(100)' - }, { - name: 'user_id', - dataType: 'varchar(100)' - } - ] -}); - -Harness.test({ - query: group.create(), - pg: { - text : 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))', - string: 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))' - }, - sqlite: { - text : 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))', - string: 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))' - }, - mysql: { - text : 'CREATE TABLE `group` (`id` varchar(100), `user_id` varchar(100))', - string: 'CREATE TABLE `group` (`id` varchar(100), `user_id` varchar(100))' - }, - mssql: { - text : 'CREATE TABLE [group] ([id] varchar(100), [user_id] varchar(100))', - string: 'CREATE TABLE [group] ([id] varchar(100), [user_id] varchar(100))' - }, - oracle: { - text : 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))', - string: 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))' - }, - params: [] -}); - -Harness.test({ - query: group.create().ifNotExists(), - pg: { - text : 'CREATE TABLE IF NOT EXISTS "group" ("id" varchar(100), "user_id" varchar(100))', - string: 'CREATE TABLE IF NOT EXISTS "group" ("id" varchar(100), "user_id" varchar(100))' - }, - sqlite: { - text : 'CREATE TABLE IF NOT EXISTS "group" ("id" varchar(100), "user_id" varchar(100))', - string: 'CREATE TABLE IF NOT EXISTS "group" ("id" varchar(100), "user_id" varchar(100))' - }, - mysql: { - text : 'CREATE TABLE IF NOT EXISTS `group` (`id` varchar(100), `user_id` varchar(100))', - string: 'CREATE TABLE IF NOT EXISTS `group` (`id` varchar(100), `user_id` varchar(100))' - }, - mssql: { - text : 'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = \'group\') BEGIN CREATE TABLE [group] ([id] varchar(100), [user_id] varchar(100)) END', - string: 'IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = \'group\') BEGIN CREATE TABLE [group] ([id] varchar(100), [user_id] varchar(100)) END' - }, - oracle: { - text : 'BEGIN EXECUTE IMMEDIATE \'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))\'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -955 THEN RAISE; END IF; END;', - string: 'BEGIN EXECUTE IMMEDIATE \'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))\'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -955 THEN RAISE; END IF; END;' - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'user', - columns: [{ - name: 'id', - dataType: 'varchar(100)' - } - ], - engine: 'InnoDB' - }).create(), - pg: { - text : 'CREATE TABLE "user" ("id" varchar(100))', - string: 'CREATE TABLE "user" ("id" varchar(100))' - }, - sqlite: { - text : 'CREATE TABLE "user" ("id" varchar(100))', - string: 'CREATE TABLE "user" ("id" varchar(100))' - }, - mysql: { - text : 'CREATE TABLE `user` (`id` varchar(100)) ENGINE=InnoDB', - string: 'CREATE TABLE `user` (`id` varchar(100)) ENGINE=InnoDB' - }, - mssql: { - text : 'CREATE TABLE [user] ([id] varchar(100))', - string: 'CREATE TABLE [user] ([id] varchar(100))' - }, - oracle: { - text : 'CREATE TABLE "user" ("id" varchar(100))', - string: 'CREATE TABLE "user" ("id" varchar(100))' - } -}); - -Harness.test({ - query: Table.define({ - name: 'user', - columns: [{ - name: 'id', - dataType: 'varchar(100)' - } - ], - charset: 'latin1' - }).create(), - pg: { - text : 'CREATE TABLE "user" ("id" varchar(100))', - string: 'CREATE TABLE "user" ("id" varchar(100))' - }, - sqlite: { - text : 'CREATE TABLE "user" ("id" varchar(100))', - string: 'CREATE TABLE "user" ("id" varchar(100))' - }, - mysql: { - text : 'CREATE TABLE `user` (`id` varchar(100)) DEFAULT CHARSET=latin1', - string: 'CREATE TABLE `user` (`id` varchar(100)) DEFAULT CHARSET=latin1' - }, - mssql: { - text : 'CREATE TABLE [user] ([id] varchar(100))', - string: 'CREATE TABLE [user] ([id] varchar(100))' - }, - oracle: { - text : 'CREATE TABLE "user" ("id" varchar(100))', - string: 'CREATE TABLE "user" ("id" varchar(100))' - } -}); - -Harness.test({ - query: Table.define({ - name: 'user', - columns: [{ - name: 'id', - dataType: 'varchar(100)' - } - ], - engine: 'MyISAM', - charset: 'latin1' - }).create(), - pg: { - text : 'CREATE TABLE "user" ("id" varchar(100))', - string: 'CREATE TABLE "user" ("id" varchar(100))' - }, - sqlite: { - text : 'CREATE TABLE "user" ("id" varchar(100))', - string: 'CREATE TABLE "user" ("id" varchar(100))' - }, - mysql: { - text : 'CREATE TABLE `user` (`id` varchar(100)) ENGINE=MyISAM DEFAULT CHARSET=latin1', - string: 'CREATE TABLE `user` (`id` varchar(100)) ENGINE=MyISAM DEFAULT CHARSET=latin1' - }, - mssql: { - text : 'CREATE TABLE [user] ([id] varchar(100))', - string: 'CREATE TABLE [user] ([id] varchar(100))' - }, - oracle: { - text : 'CREATE TABLE "user" ("id" varchar(100))', - string: 'CREATE TABLE "user" ("id" varchar(100))' - } -}); - -Harness.test({ - query: Table.define({ - name: 'user', - columns: [{ - name: 'id', - dataType: 'int', - primaryKey: true - }] - }).create(), - pg: { - text : 'CREATE TABLE "user" ("id" int PRIMARY KEY)', - string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' - }, - sqlite: { - text : 'CREATE TABLE "user" ("id" int PRIMARY KEY)', - string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' - }, - mysql: { - text : 'CREATE TABLE `user` (`id` int PRIMARY KEY)', - string: 'CREATE TABLE `user` (`id` int PRIMARY KEY)' - }, - mssql: { - text : 'CREATE TABLE [user] ([id] int PRIMARY KEY)', - string: 'CREATE TABLE [user] ([id] int PRIMARY KEY)' - }, - oracle: { - text : 'CREATE TABLE "user" ("id" int PRIMARY KEY)', - string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' - } -}); - -Harness.test({ - query: Table.define({ - name: 'user', - columns: [{ - name: 'id', - dataType: 'int', - notNull: true - }] - }).create(), - pg: { - text : 'CREATE TABLE "user" ("id" int NOT NULL)', - string: 'CREATE TABLE "user" ("id" int NOT NULL)' - }, - sqlite: { - text : 'CREATE TABLE "user" ("id" int NOT NULL)', - string: 'CREATE TABLE "user" ("id" int NOT NULL)' - }, - mysql: { - text : 'CREATE TABLE `user` (`id` int NOT NULL)', - string: 'CREATE TABLE `user` (`id` int NOT NULL)' - }, - oracle: { - text : 'CREATE TABLE "user" ("id" int NOT NULL)', - string: 'CREATE TABLE "user" ("id" int NOT NULL)' - } -}); - -Harness.test({ - query: Table.define({ - name: 'user', - columns: [{ - name: 'id', - dataType: 'int', - primaryKey: true, - notNull: true - }] - }).create(), - pg: { - text : 'CREATE TABLE "user" ("id" int PRIMARY KEY)', - string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' - }, - sqlite: { - text : 'CREATE TABLE "user" ("id" int PRIMARY KEY)', - string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' - }, - mysql: { - text : 'CREATE TABLE `user` (`id` int PRIMARY KEY)', - string: 'CREATE TABLE `user` (`id` int PRIMARY KEY)' - }, - oracle: { - text : 'CREATE TABLE "user" ("id" int PRIMARY KEY)', - string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' - } -}); - -Harness.test({ - query: Table.define({ - name: 'user', - columns: [{ - name: 'id', - dataType: 'int', - primaryKey: true, - notNull: true - }, { - name: 'posts', - dataType: 'int', - notNull: true, - defaultValue: 0 - }] - }).create(), - pg: { - text : 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)', - string: 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)' - }, - sqlite: { - text : 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)', - string: 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)' - }, - mysql: { - text : 'CREATE TABLE `user` (`id` int PRIMARY KEY, `posts` int NOT NULL DEFAULT 0)', - string: 'CREATE TABLE `user` (`id` int PRIMARY KEY, `posts` int NOT NULL DEFAULT 0)' - }, - oracle: { - text : 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)', - string: 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)' - } -}); - -Harness.test({ - query: Table.define({ - name: 'post', - columns: [{ - name: 'userId', - dataType: 'int', - references: { - table: 'user', - column: 'id', - onDelete: 'restrict', - onUpdate: 'set null' - } - }] - }).create(), - pg: { - text : 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)', - string: 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)' - }, - sqlite: { - text : 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)', - string: 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)' - }, - mysql: { - text : 'CREATE TABLE `post` (`userId` int REFERENCES `user`(`id`) ON DELETE RESTRICT ON UPDATE SET NULL)', - string: 'CREATE TABLE `post` (`userId` int REFERENCES `user`(`id`) ON DELETE RESTRICT ON UPDATE SET NULL)' - }, - oracle: { - text : 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)', - string: 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)' - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'picture', - columns: [{ - name: 'userId', - dataType: 'int', - references: { - table: 'user', - column: 'id' - } - }, { - name: 'caption', - dataType: 'varchar(100)', - references: {} - }] - }).create(), - pg: { - text : 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))', - string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))' - }, - sqlite: { - text : 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))', - string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))' - }, - mysql: { - text : 'CREATE TABLE `picture` (`userId` int REFERENCES `user`(`id`), `caption` varchar(100))', - string: 'CREATE TABLE `picture` (`userId` int REFERENCES `user`(`id`), `caption` varchar(100))' - }, - oracle: { - text : 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))', - string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))' - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'picture', - columns: [{ - name: 'userId', - dataType: 'int', - references: { - table: 'user', - column: 'id', - onDelete: 'cascade' - } - }] - }).create(), - pg: { - text : 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)', - string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)' - }, - sqlite: { - text : 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)', - string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)' - }, - mysql: { - text : 'CREATE TABLE `picture` (`userId` int REFERENCES `user`(`id`) ON DELETE CASCADE)', - string: 'CREATE TABLE `picture` (`userId` int REFERENCES `user`(`id`) ON DELETE CASCADE)' - }, - oracle: { - text : 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)', - string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)' - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'post', - columns: [{ - name: 'userId', - dataType: 'int', - references: 'user' - }] - }).create(), - pg: { - text : 'references is not a object for column userId (REFERENCES statements within CREATE TABLE and ADD COLUMN statements require refrences to be expressed as an object)', - throws: true - }, - sqlite: { - text : 'references is not a object for column userId (REFERENCES statements within CREATE TABLE and ADD COLUMN statements require refrences to be expressed as an object)', - throws: true - }, - mysql: { - text : 'references is not a object for column userId (REFERENCES statements within CREATE TABLE and ADD COLUMN statements require refrences to be expressed as an object)', - throws: true - }, - oracle: { - text : 'references is not a object for column userId (REFERENCES statements within CREATE TABLE and ADD COLUMN statements require refrences to be expressed as an object)', - throws: true - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'membership', - columns: { - group_id: { dataType: 'int', primaryKey: true}, - user_id: { dataType: 'int', primaryKey: true}, - desc: { dataType: 'varchar'} - } - }).create(), - pg: { - text : 'CREATE TABLE "membership" ("group_id" int, "user_id" int, "desc" varchar, PRIMARY KEY ("group_id", "user_id"))', - string: 'CREATE TABLE "membership" ("group_id" int, "user_id" int, "desc" varchar, PRIMARY KEY ("group_id", "user_id"))', - }, - sqlite: { - text : 'CREATE TABLE "membership" ("group_id" int, "user_id" int, "desc" varchar, PRIMARY KEY ("group_id", "user_id"))', - string: 'CREATE TABLE "membership" ("group_id" int, "user_id" int, "desc" varchar, PRIMARY KEY ("group_id", "user_id"))', - }, - mysql: { - text : 'CREATE TABLE `membership` (`group_id` int, `user_id` int, `desc` varchar, PRIMARY KEY (`group_id`, `user_id`))', - string: 'CREATE TABLE `membership` (`group_id` int, `user_id` int, `desc` varchar, PRIMARY KEY (`group_id`, `user_id`))', - } -}); - -// TEMPORARY TABLE TESTS - -// This tests explicitly setting the isTemporary flag to false, as opposed to all the test above here which have it -// as undefined. -Harness.test({ - query: Table.define({ - name: 'post', - columns: [{ - name: 'id', - dataType: 'int' - }], - isTemporary:false - }).create(), - pg: { - text : 'CREATE TABLE "post" ("id" int)', - string: 'CREATE TABLE "post" ("id" int)' - }, - sqlite: { - text : 'CREATE TABLE "post" ("id" int)', - string: 'CREATE TABLE "post" ("id" int)' - }, - mysql: { - text : 'CREATE TABLE `post` (`id` int)', - string: 'CREATE TABLE `post` (`id` int)' - }, - mssql: { - text : 'CREATE TABLE [post] ([id] int)', - string: 'CREATE TABLE [post] ([id] int)' - }, - oracle: { - text : 'CREATE TABLE "post" ("id" int)', - string: 'CREATE TABLE "post" ("id" int)' - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'post', - columns: [{ - name: 'id', - dataType: 'int' - }], - isTemporary:true - }).create(), - pg: { - text : 'CREATE TEMPORARY TABLE "post" ("id" int)', - string: 'CREATE TEMPORARY TABLE "post" ("id" int)' - }, - sqlite: { - text : 'CREATE TEMPORARY TABLE "post" ("id" int)', - string: 'CREATE TEMPORARY TABLE "post" ("id" int)' - }, - mysql: { - text : 'CREATE TEMPORARY TABLE `post` (`id` int)', - string: 'CREATE TEMPORARY TABLE `post` (`id` int)' - }, - //mssql: { - // text : 'CREATE TABLE [#post] ([id] int)', - // string: 'CREATE TABLE [#post] ([id] int)' - //}, - params: [] -}); - -var users = Table.define({ - name: 'users', - columns: { - id: { - primaryKey: true, - dataType: 'int', - references: { - table: "entity", - column: "id", - constraint: "DEFERRABLE INITIALLY DEFERRED" - } - } - } -}); - -Harness.test({ - query: users.create(), - pg: { - text: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)', - string: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)' - }, - sqlite: { - text: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)', - string: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)' - }, - mysql: { - text: 'CREATE TABLE `users` (`id` int PRIMARY KEY REFERENCES `entity`(`id`) DEFERRABLE INITIALLY DEFERRED)', - string: 'CREATE TABLE `users` (`id` int PRIMARY KEY REFERENCES `entity`(`id`) DEFERRABLE INITIALLY DEFERRED)' - }, - mssql: { - text: 'CREATE TABLE [users] ([id] int PRIMARY KEY REFERENCES [entity]([id]) DEFERRABLE INITIALLY DEFERRED)', - string: 'CREATE TABLE [users] ([id] int PRIMARY KEY REFERENCES [entity]([id]) DEFERRABLE INITIALLY DEFERRED)' - }, - oracle: { - text: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)', - string: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)' - }, - params: [] -}); - -// UNIQUE COLUMN TESTS -Harness.test({ - query: Table.define({ - name: 'post', - columns: [{ - name: 'id', - dataType: 'int', - //primaryKey: true, - //notNull: true, - unique: true - }] - }).create(), - pg: { - text : 'CREATE TABLE "post" ("id" int UNIQUE)', - string: 'CREATE TABLE "post" ("id" int UNIQUE)' - }, - sqlite: { - text : 'CREATE TABLE "post" ("id" int UNIQUE)', - string: 'CREATE TABLE "post" ("id" int UNIQUE)' - }, - mysql: { - text : 'CREATE TABLE `post` (`id` int UNIQUE)', - string: 'CREATE TABLE `post` (`id` int UNIQUE)' - }, - mssql: { - text : 'CREATE TABLE [post] ([id] int UNIQUE)', - string: 'CREATE TABLE [post] ([id] int UNIQUE)' - }, - oracle: { - text : 'CREATE TABLE "post" ("id" int UNIQUE)', - string: 'CREATE TABLE "post" ("id" int UNIQUE)' - }, - params: [] -}); - - -var noUsers = Table.define({ - name: 'no_users', - columns: { - id: { - primaryKey: true, - dataType: 'int', - references: { - table: "entity", - column: "id", - constraint: "" - } - } - } -}); - -Harness.test({ - query: noUsers.create(), - pg: { - text : 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))', - string: 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))' - }, - sqlite: { - text : 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))', - string: 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))' - }, - mysql: { - text : 'CREATE TABLE `no_users` (`id` int PRIMARY KEY REFERENCES `entity`(`id`))', - string: 'CREATE TABLE `no_users` (`id` int PRIMARY KEY REFERENCES `entity`(`id`))' - }, - mssql: { - text : 'CREATE TABLE [no_users] ([id] int PRIMARY KEY REFERENCES [entity]([id]))', - string: 'CREATE TABLE [no_users] ([id] int PRIMARY KEY REFERENCES [entity]([id]))' - }, - oracle: { - text : 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))', - string: 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))' - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'post', - columns: [{ - name: 'id', - dataType: 'int', - //primaryKey: true, - notNull: true, - unique: true - }] - }).create(), - pg: { - text : 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)', - string: 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)' - }, - sqlite: { - text : 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)', - string: 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)' - }, - mysql: { - text : 'CREATE TABLE `post` (`id` int NOT NULL UNIQUE)', - string: 'CREATE TABLE `post` (`id` int NOT NULL UNIQUE)' - }, - mssql: { - text : 'CREATE TABLE [post] ([id] int NOT NULL UNIQUE)', - string: 'CREATE TABLE [post] ([id] int NOT NULL UNIQUE)' - }, - oracle: { - text : 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)', - string: 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)' - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'post', - columns: [{ - name: 'id', - dataType: 'int', - primaryKey: true, - //notNull: true, - unique: true - }] - }).create(), - pg: { - text : 'CREATE TABLE "post" ("id" int PRIMARY KEY)', - string: 'CREATE TABLE "post" ("id" int PRIMARY KEY)' - }, - sqlite: { - text : 'CREATE TABLE "post" ("id" int PRIMARY KEY)', - string: 'CREATE TABLE "post" ("id" int PRIMARY KEY)' - }, - mysql: { - text : 'CREATE TABLE `post` (`id` int PRIMARY KEY)', - string: 'CREATE TABLE `post` (`id` int PRIMARY KEY)' - }, - mssql: { - text : 'CREATE TABLE [post] ([id] int PRIMARY KEY)', - string: 'CREATE TABLE [post] ([id] int PRIMARY KEY)' - }, - oracle: { - text : 'CREATE TABLE "post" ("id" int PRIMARY KEY)', - string: 'CREATE TABLE "post" ("id" int PRIMARY KEY)' - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'post', - columns: [{ - name: 'id', - dataType: 'int', - primaryKey: true - }, { - name: 'blog_id', - dataType: 'int' - }, { - name: 'user_id', - dataType: 'int' - }], - foreignKeys: { - table: 'users', - columns: [ 'blog_id', 'user_id' ], - refColumns: [ 'id', 'user_id' ] - } - }).create(), - pg: { - text : 'CREATE TABLE "post" ("id" int PRIMARY KEY, "blog_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ( "id", "user_id" ))', - string: 'CREATE TABLE "post" ("id" int PRIMARY KEY, "blog_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ( "id", "user_id" ))' - }, - sqlite: { - text : 'CREATE TABLE "post" ("id" int PRIMARY KEY, "blog_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ( "id", "user_id" ))', - string: 'CREATE TABLE "post" ("id" int PRIMARY KEY, "blog_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ( "id", "user_id" ))' - }, - mysql: { - text : 'CREATE TABLE `post` (`id` int PRIMARY KEY, `blog_id` int, `user_id` int, FOREIGN KEY ( `blog_id`, `user_id` ) REFERENCES `users` ( `id`, `user_id` ))', - string: 'CREATE TABLE `post` (`id` int PRIMARY KEY, `blog_id` int, `user_id` int, FOREIGN KEY ( `blog_id`, `user_id` ) REFERENCES `users` ( `id`, `user_id` ))' - }, - params: [] -}); - -Harness.test({ - query: Table.define({ - name: 'replies', - columns: [{ - name: 'id', - dataType: 'int', - primaryKey: true - }, { - name: 'blog_id', - dataType: 'int' - }, { - name: 'post_id', - dataType: 'int' - }, { - name: 'user_id', - dataType: 'int' - }], - foreignKeys: [{ - table: 'users', - columns: [ 'blog_id', 'user_id' ], - onDelete: 'no action' - }, { - name: 'posts_idx', - table: 'posts', - columns: [ 'blog_id', 'post_id' ], - refColumns: [ 'blog_id', 'id' ], - onDelete: 'cascade', - onUpdate: 'set default' - }] - }).create(), - pg: { - text : 'CREATE TABLE "replies" ("id" int PRIMARY KEY, "blog_id" int, "post_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ON DELETE NO ACTION, CONSTRAINT "posts_idx" FOREIGN KEY ( "blog_id", "post_id" ) REFERENCES "posts" ( "blog_id", "id" ) ON DELETE CASCADE ON UPDATE SET DEFAULT)', - string: 'CREATE TABLE "replies" ("id" int PRIMARY KEY, "blog_id" int, "post_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ON DELETE NO ACTION, CONSTRAINT "posts_idx" FOREIGN KEY ( "blog_id", "post_id" ) REFERENCES "posts" ( "blog_id", "id" ) ON DELETE CASCADE ON UPDATE SET DEFAULT)' - }, - sqlite: { - text : 'CREATE TABLE "replies" ("id" int PRIMARY KEY, "blog_id" int, "post_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ON DELETE NO ACTION, CONSTRAINT "posts_idx" FOREIGN KEY ( "blog_id", "post_id" ) REFERENCES "posts" ( "blog_id", "id" ) ON DELETE CASCADE ON UPDATE SET DEFAULT)', - string: 'CREATE TABLE "replies" ("id" int PRIMARY KEY, "blog_id" int, "post_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ON DELETE NO ACTION, CONSTRAINT "posts_idx" FOREIGN KEY ( "blog_id", "post_id" ) REFERENCES "posts" ( "blog_id", "id" ) ON DELETE CASCADE ON UPDATE SET DEFAULT)' - }, - mysql: { - text : 'CREATE TABLE `replies` (`id` int PRIMARY KEY, `blog_id` int, `post_id` int, `user_id` int, FOREIGN KEY ( `blog_id`, `user_id` ) REFERENCES `users` ON DELETE NO ACTION, CONSTRAINT `posts_idx` FOREIGN KEY ( `blog_id`, `post_id` ) REFERENCES `posts` ( `blog_id`, `id` ) ON DELETE CASCADE ON UPDATE SET DEFAULT)', - string: 'CREATE TABLE `replies` (`id` int PRIMARY KEY, `blog_id` int, `post_id` int, `user_id` int, FOREIGN KEY ( `blog_id`, `user_id` ) REFERENCES `users` ON DELETE NO ACTION, CONSTRAINT `posts_idx` FOREIGN KEY ( `blog_id`, `post_id` ) REFERENCES `posts` ( `blog_id`, `id` ) ON DELETE CASCADE ON UPDATE SET DEFAULT)' - }, - params: [] -}); diff --git a/test/dialects/create-table-tests.ts b/test/dialects/create-table-tests.ts new file mode 100644 index 00000000..64587c6a --- /dev/null +++ b/test/dialects/create-table-tests.ts @@ -0,0 +1,825 @@ +'use strict'; + +import * as Harness from './support'; +import { Table } from '../../lib/table'; + +const group = Table.define({ + name: 'group', + columns: [ + { + name: 'id', + dataType: 'varchar(100)' + }, + { + name: 'user_id', + dataType: 'varchar(100)' + } + ] +}); + +Harness.test({ + query: group.create(), + pg: { + text: 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))', + string: 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))' + }, + sqlite: { + text: 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))', + string: 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))' + }, + mysql: { + text: 'CREATE TABLE `group` (`id` varchar(100), `user_id` varchar(100))', + string: 'CREATE TABLE `group` (`id` varchar(100), `user_id` varchar(100))' + }, + mssql: { + text: 'CREATE TABLE [group] ([id] varchar(100), [user_id] varchar(100))', + string: 'CREATE TABLE [group] ([id] varchar(100), [user_id] varchar(100))' + }, + oracle: { + text: 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))', + string: 'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))' + }, + params: [] +}); + +Harness.test({ + query: group.create().ifNotExists(), + pg: { + text: 'CREATE TABLE IF NOT EXISTS "group" ("id" varchar(100), "user_id" varchar(100))', + string: 'CREATE TABLE IF NOT EXISTS "group" ("id" varchar(100), "user_id" varchar(100))' + }, + sqlite: { + text: 'CREATE TABLE IF NOT EXISTS "group" ("id" varchar(100), "user_id" varchar(100))', + string: 'CREATE TABLE IF NOT EXISTS "group" ("id" varchar(100), "user_id" varchar(100))' + }, + mysql: { + text: 'CREATE TABLE IF NOT EXISTS `group` (`id` varchar(100), `user_id` varchar(100))', + string: 'CREATE TABLE IF NOT EXISTS `group` (`id` varchar(100), `user_id` varchar(100))' + }, + mssql: { + text: + "IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'group') BEGIN CREATE TABLE [group] ([id] varchar(100), [user_id] varchar(100)) END", + string: + "IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'group') BEGIN CREATE TABLE [group] ([id] varchar(100), [user_id] varchar(100)) END" + }, + oracle: { + text: + 'BEGIN EXECUTE IMMEDIATE \'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))\'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -955 THEN RAISE; END IF; END;', + string: + 'BEGIN EXECUTE IMMEDIATE \'CREATE TABLE "group" ("id" varchar(100), "user_id" varchar(100))\'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -955 THEN RAISE; END IF; END;' + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'user', + columns: [ + { + name: 'id', + dataType: 'varchar(100)' + } + ], + engine: 'InnoDB' + }).create(), + pg: { + text: 'CREATE TABLE "user" ("id" varchar(100))', + string: 'CREATE TABLE "user" ("id" varchar(100))' + }, + sqlite: { + text: 'CREATE TABLE "user" ("id" varchar(100))', + string: 'CREATE TABLE "user" ("id" varchar(100))' + }, + mysql: { + text: 'CREATE TABLE `user` (`id` varchar(100)) ENGINE=InnoDB', + string: 'CREATE TABLE `user` (`id` varchar(100)) ENGINE=InnoDB' + }, + mssql: { + text: 'CREATE TABLE [user] ([id] varchar(100))', + string: 'CREATE TABLE [user] ([id] varchar(100))' + }, + oracle: { + text: 'CREATE TABLE "user" ("id" varchar(100))', + string: 'CREATE TABLE "user" ("id" varchar(100))' + } +}); + +Harness.test({ + query: Table.define({ + name: 'user', + columns: [ + { + name: 'id', + dataType: 'varchar(100)' + } + ], + charset: 'latin1' + }).create(), + pg: { + text: 'CREATE TABLE "user" ("id" varchar(100))', + string: 'CREATE TABLE "user" ("id" varchar(100))' + }, + sqlite: { + text: 'CREATE TABLE "user" ("id" varchar(100))', + string: 'CREATE TABLE "user" ("id" varchar(100))' + }, + mysql: { + text: 'CREATE TABLE `user` (`id` varchar(100)) DEFAULT CHARSET=latin1', + string: 'CREATE TABLE `user` (`id` varchar(100)) DEFAULT CHARSET=latin1' + }, + mssql: { + text: 'CREATE TABLE [user] ([id] varchar(100))', + string: 'CREATE TABLE [user] ([id] varchar(100))' + }, + oracle: { + text: 'CREATE TABLE "user" ("id" varchar(100))', + string: 'CREATE TABLE "user" ("id" varchar(100))' + } +}); + +Harness.test({ + query: Table.define({ + name: 'user', + columns: [ + { + name: 'id', + dataType: 'varchar(100)' + } + ], + engine: 'MyISAM', + charset: 'latin1' + }).create(), + pg: { + text: 'CREATE TABLE "user" ("id" varchar(100))', + string: 'CREATE TABLE "user" ("id" varchar(100))' + }, + sqlite: { + text: 'CREATE TABLE "user" ("id" varchar(100))', + string: 'CREATE TABLE "user" ("id" varchar(100))' + }, + mysql: { + text: 'CREATE TABLE `user` (`id` varchar(100)) ENGINE=MyISAM DEFAULT CHARSET=latin1', + string: 'CREATE TABLE `user` (`id` varchar(100)) ENGINE=MyISAM DEFAULT CHARSET=latin1' + }, + mssql: { + text: 'CREATE TABLE [user] ([id] varchar(100))', + string: 'CREATE TABLE [user] ([id] varchar(100))' + }, + oracle: { + text: 'CREATE TABLE "user" ("id" varchar(100))', + string: 'CREATE TABLE "user" ("id" varchar(100))' + } +}); + +Harness.test({ + query: Table.define({ + name: 'user', + columns: [ + { + name: 'id', + dataType: 'int', + primaryKey: true + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "user" ("id" int PRIMARY KEY)', + string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' + }, + sqlite: { + text: 'CREATE TABLE "user" ("id" int PRIMARY KEY)', + string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' + }, + mysql: { + text: 'CREATE TABLE `user` (`id` int PRIMARY KEY)', + string: 'CREATE TABLE `user` (`id` int PRIMARY KEY)' + }, + mssql: { + text: 'CREATE TABLE [user] ([id] int PRIMARY KEY)', + string: 'CREATE TABLE [user] ([id] int PRIMARY KEY)' + }, + oracle: { + text: 'CREATE TABLE "user" ("id" int PRIMARY KEY)', + string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' + } +}); + +Harness.test({ + query: Table.define({ + name: 'user', + columns: [ + { + name: 'id', + dataType: 'int', + notNull: true + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "user" ("id" int NOT NULL)', + string: 'CREATE TABLE "user" ("id" int NOT NULL)' + }, + sqlite: { + text: 'CREATE TABLE "user" ("id" int NOT NULL)', + string: 'CREATE TABLE "user" ("id" int NOT NULL)' + }, + mysql: { + text: 'CREATE TABLE `user` (`id` int NOT NULL)', + string: 'CREATE TABLE `user` (`id` int NOT NULL)' + }, + oracle: { + text: 'CREATE TABLE "user" ("id" int NOT NULL)', + string: 'CREATE TABLE "user" ("id" int NOT NULL)' + } +}); + +Harness.test({ + query: Table.define({ + name: 'user', + columns: [ + { + name: 'id', + dataType: 'int', + primaryKey: true, + notNull: true + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "user" ("id" int PRIMARY KEY)', + string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' + }, + sqlite: { + text: 'CREATE TABLE "user" ("id" int PRIMARY KEY)', + string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' + }, + mysql: { + text: 'CREATE TABLE `user` (`id` int PRIMARY KEY)', + string: 'CREATE TABLE `user` (`id` int PRIMARY KEY)' + }, + oracle: { + text: 'CREATE TABLE "user" ("id" int PRIMARY KEY)', + string: 'CREATE TABLE "user" ("id" int PRIMARY KEY)' + } +}); + +Harness.test({ + query: Table.define({ + name: 'user', + columns: [ + { + name: 'id', + dataType: 'int', + primaryKey: true, + notNull: true + }, + { + name: 'posts', + dataType: 'int', + notNull: true, + defaultValue: 0 + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)', + string: 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)' + }, + sqlite: { + text: 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)', + string: 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)' + }, + mysql: { + text: 'CREATE TABLE `user` (`id` int PRIMARY KEY, `posts` int NOT NULL DEFAULT 0)', + string: 'CREATE TABLE `user` (`id` int PRIMARY KEY, `posts` int NOT NULL DEFAULT 0)' + }, + oracle: { + text: 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)', + string: 'CREATE TABLE "user" ("id" int PRIMARY KEY, "posts" int NOT NULL DEFAULT 0)' + } +}); + +Harness.test({ + query: Table.define({ + name: 'post', + columns: [ + { + name: 'userId', + dataType: 'int', + references: { + table: 'user', + column: 'id', + onDelete: 'restrict', + onUpdate: 'set null' + } + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)', + string: 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)' + }, + sqlite: { + text: 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)', + string: 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)' + }, + mysql: { + text: 'CREATE TABLE `post` (`userId` int REFERENCES `user`(`id`) ON DELETE RESTRICT ON UPDATE SET NULL)', + string: 'CREATE TABLE `post` (`userId` int REFERENCES `user`(`id`) ON DELETE RESTRICT ON UPDATE SET NULL)' + }, + oracle: { + text: 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)', + string: 'CREATE TABLE "post" ("userId" int REFERENCES "user"("id") ON DELETE RESTRICT ON UPDATE SET NULL)' + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'picture', + columns: [ + { + name: 'userId', + dataType: 'int', + references: { + table: 'user', + column: 'id' + } + }, + { + name: 'caption', + dataType: 'varchar(100)', + references: {} + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))', + string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))' + }, + sqlite: { + text: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))', + string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))' + }, + mysql: { + text: 'CREATE TABLE `picture` (`userId` int REFERENCES `user`(`id`), `caption` varchar(100))', + string: 'CREATE TABLE `picture` (`userId` int REFERENCES `user`(`id`), `caption` varchar(100))' + }, + oracle: { + text: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))', + string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id"), "caption" varchar(100))' + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'picture', + columns: [ + { + name: 'userId', + dataType: 'int', + references: { + table: 'user', + column: 'id', + onDelete: 'cascade' + } + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)', + string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)' + }, + sqlite: { + text: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)', + string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)' + }, + mysql: { + text: 'CREATE TABLE `picture` (`userId` int REFERENCES `user`(`id`) ON DELETE CASCADE)', + string: 'CREATE TABLE `picture` (`userId` int REFERENCES `user`(`id`) ON DELETE CASCADE)' + }, + oracle: { + text: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)', + string: 'CREATE TABLE "picture" ("userId" int REFERENCES "user"("id") ON DELETE CASCADE)' + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'post', + columns: [ + { + name: 'userId', + dataType: 'int', + references: 'user' + } + ] + }).create(), + pg: { + text: + 'references is not a object for column userId (REFERENCES statements within CREATE TABLE and ADD COLUMN statements require refrences to be expressed as an object)', + throws: true + }, + sqlite: { + text: + 'references is not a object for column userId (REFERENCES statements within CREATE TABLE and ADD COLUMN statements require refrences to be expressed as an object)', + throws: true + }, + mysql: { + text: + 'references is not a object for column userId (REFERENCES statements within CREATE TABLE and ADD COLUMN statements require refrences to be expressed as an object)', + throws: true + }, + oracle: { + text: + 'references is not a object for column userId (REFERENCES statements within CREATE TABLE and ADD COLUMN statements require refrences to be expressed as an object)', + throws: true + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'membership', + columns: { + group_id: { dataType: 'int', primaryKey: true }, + user_id: { dataType: 'int', primaryKey: true }, + desc: { dataType: 'varchar' } + } + }).create(), + pg: { + text: 'CREATE TABLE "membership" ("group_id" int, "user_id" int, "desc" varchar, PRIMARY KEY ("group_id", "user_id"))', + string: 'CREATE TABLE "membership" ("group_id" int, "user_id" int, "desc" varchar, PRIMARY KEY ("group_id", "user_id"))' + }, + sqlite: { + text: 'CREATE TABLE "membership" ("group_id" int, "user_id" int, "desc" varchar, PRIMARY KEY ("group_id", "user_id"))', + string: 'CREATE TABLE "membership" ("group_id" int, "user_id" int, "desc" varchar, PRIMARY KEY ("group_id", "user_id"))' + }, + mysql: { + text: 'CREATE TABLE `membership` (`group_id` int, `user_id` int, `desc` varchar, PRIMARY KEY (`group_id`, `user_id`))', + string: 'CREATE TABLE `membership` (`group_id` int, `user_id` int, `desc` varchar, PRIMARY KEY (`group_id`, `user_id`))' + } +}); + +// TEMPORARY TABLE TESTS + +// This tests explicitly setting the isTemporary flag to false, as opposed to all the test above here which have it +// as undefined. +Harness.test({ + query: Table.define({ + name: 'post', + columns: [ + { + name: 'id', + dataType: 'int' + } + ], + isTemporary: false + }).create(), + pg: { + text: 'CREATE TABLE "post" ("id" int)', + string: 'CREATE TABLE "post" ("id" int)' + }, + sqlite: { + text: 'CREATE TABLE "post" ("id" int)', + string: 'CREATE TABLE "post" ("id" int)' + }, + mysql: { + text: 'CREATE TABLE `post` (`id` int)', + string: 'CREATE TABLE `post` (`id` int)' + }, + mssql: { + text: 'CREATE TABLE [post] ([id] int)', + string: 'CREATE TABLE [post] ([id] int)' + }, + oracle: { + text: 'CREATE TABLE "post" ("id" int)', + string: 'CREATE TABLE "post" ("id" int)' + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'post', + columns: [ + { + name: 'id', + dataType: 'int' + } + ], + isTemporary: true + }).create(), + pg: { + text: 'CREATE TEMPORARY TABLE "post" ("id" int)', + string: 'CREATE TEMPORARY TABLE "post" ("id" int)' + }, + sqlite: { + text: 'CREATE TEMPORARY TABLE "post" ("id" int)', + string: 'CREATE TEMPORARY TABLE "post" ("id" int)' + }, + mysql: { + text: 'CREATE TEMPORARY TABLE `post` (`id` int)', + string: 'CREATE TEMPORARY TABLE `post` (`id` int)' + }, + //mssql: { + // text : 'CREATE TABLE [#post] ([id] int)', + // string: 'CREATE TABLE [#post] ([id] int)' + //}, + params: [] +}); + +var users = Table.define({ + name: 'users', + columns: { + id: { + primaryKey: true, + dataType: 'int', + references: { + table: 'entity', + column: 'id', + constraint: 'DEFERRABLE INITIALLY DEFERRED' + } + } + } +}); + +Harness.test({ + query: users.create(), + pg: { + text: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)', + string: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)' + }, + sqlite: { + text: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)', + string: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)' + }, + mysql: { + text: 'CREATE TABLE `users` (`id` int PRIMARY KEY REFERENCES `entity`(`id`) DEFERRABLE INITIALLY DEFERRED)', + string: 'CREATE TABLE `users` (`id` int PRIMARY KEY REFERENCES `entity`(`id`) DEFERRABLE INITIALLY DEFERRED)' + }, + mssql: { + text: 'CREATE TABLE [users] ([id] int PRIMARY KEY REFERENCES [entity]([id]) DEFERRABLE INITIALLY DEFERRED)', + string: 'CREATE TABLE [users] ([id] int PRIMARY KEY REFERENCES [entity]([id]) DEFERRABLE INITIALLY DEFERRED)' + }, + oracle: { + text: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)', + string: 'CREATE TABLE "users" ("id" int PRIMARY KEY REFERENCES "entity"("id") DEFERRABLE INITIALLY DEFERRED)' + }, + params: [] +}); + +// UNIQUE COLUMN TESTS +Harness.test({ + query: Table.define({ + name: 'post', + columns: [ + { + name: 'id', + dataType: 'int', + //primaryKey: true, + //notNull: true, + unique: true + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "post" ("id" int UNIQUE)', + string: 'CREATE TABLE "post" ("id" int UNIQUE)' + }, + sqlite: { + text: 'CREATE TABLE "post" ("id" int UNIQUE)', + string: 'CREATE TABLE "post" ("id" int UNIQUE)' + }, + mysql: { + text: 'CREATE TABLE `post` (`id` int UNIQUE)', + string: 'CREATE TABLE `post` (`id` int UNIQUE)' + }, + mssql: { + text: 'CREATE TABLE [post] ([id] int UNIQUE)', + string: 'CREATE TABLE [post] ([id] int UNIQUE)' + }, + oracle: { + text: 'CREATE TABLE "post" ("id" int UNIQUE)', + string: 'CREATE TABLE "post" ("id" int UNIQUE)' + }, + params: [] +}); + +var noUsers = Table.define({ + name: 'no_users', + columns: { + id: { + primaryKey: true, + dataType: 'int', + references: { + table: 'entity', + column: 'id', + constraint: '' + } + } + } +}); + +Harness.test({ + query: noUsers.create(), + pg: { + text: 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))', + string: 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))' + }, + sqlite: { + text: 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))', + string: 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))' + }, + mysql: { + text: 'CREATE TABLE `no_users` (`id` int PRIMARY KEY REFERENCES `entity`(`id`))', + string: 'CREATE TABLE `no_users` (`id` int PRIMARY KEY REFERENCES `entity`(`id`))' + }, + mssql: { + text: 'CREATE TABLE [no_users] ([id] int PRIMARY KEY REFERENCES [entity]([id]))', + string: 'CREATE TABLE [no_users] ([id] int PRIMARY KEY REFERENCES [entity]([id]))' + }, + oracle: { + text: 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))', + string: 'CREATE TABLE "no_users" ("id" int PRIMARY KEY REFERENCES "entity"("id"))' + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'post', + columns: [ + { + name: 'id', + dataType: 'int', + //primaryKey: true, + notNull: true, + unique: true + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)', + string: 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)' + }, + sqlite: { + text: 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)', + string: 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)' + }, + mysql: { + text: 'CREATE TABLE `post` (`id` int NOT NULL UNIQUE)', + string: 'CREATE TABLE `post` (`id` int NOT NULL UNIQUE)' + }, + mssql: { + text: 'CREATE TABLE [post] ([id] int NOT NULL UNIQUE)', + string: 'CREATE TABLE [post] ([id] int NOT NULL UNIQUE)' + }, + oracle: { + text: 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)', + string: 'CREATE TABLE "post" ("id" int NOT NULL UNIQUE)' + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'post', + columns: [ + { + name: 'id', + dataType: 'int', + primaryKey: true, + //notNull: true, + unique: true + } + ] + }).create(), + pg: { + text: 'CREATE TABLE "post" ("id" int PRIMARY KEY)', + string: 'CREATE TABLE "post" ("id" int PRIMARY KEY)' + }, + sqlite: { + text: 'CREATE TABLE "post" ("id" int PRIMARY KEY)', + string: 'CREATE TABLE "post" ("id" int PRIMARY KEY)' + }, + mysql: { + text: 'CREATE TABLE `post` (`id` int PRIMARY KEY)', + string: 'CREATE TABLE `post` (`id` int PRIMARY KEY)' + }, + mssql: { + text: 'CREATE TABLE [post] ([id] int PRIMARY KEY)', + string: 'CREATE TABLE [post] ([id] int PRIMARY KEY)' + }, + oracle: { + text: 'CREATE TABLE "post" ("id" int PRIMARY KEY)', + string: 'CREATE TABLE "post" ("id" int PRIMARY KEY)' + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'post', + columns: [ + { + name: 'id', + dataType: 'int', + primaryKey: true + }, + { + name: 'blog_id', + dataType: 'int' + }, + { + name: 'user_id', + dataType: 'int' + } + ], + foreignKeys: { + table: 'users', + columns: ['blog_id', 'user_id'], + refColumns: ['id', 'user_id'] + } + }).create(), + pg: { + text: + 'CREATE TABLE "post" ("id" int PRIMARY KEY, "blog_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ( "id", "user_id" ))', + string: + 'CREATE TABLE "post" ("id" int PRIMARY KEY, "blog_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ( "id", "user_id" ))' + }, + sqlite: { + text: + 'CREATE TABLE "post" ("id" int PRIMARY KEY, "blog_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ( "id", "user_id" ))', + string: + 'CREATE TABLE "post" ("id" int PRIMARY KEY, "blog_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ( "id", "user_id" ))' + }, + mysql: { + text: + 'CREATE TABLE `post` (`id` int PRIMARY KEY, `blog_id` int, `user_id` int, FOREIGN KEY ( `blog_id`, `user_id` ) REFERENCES `users` ( `id`, `user_id` ))', + string: + 'CREATE TABLE `post` (`id` int PRIMARY KEY, `blog_id` int, `user_id` int, FOREIGN KEY ( `blog_id`, `user_id` ) REFERENCES `users` ( `id`, `user_id` ))' + }, + params: [] +}); + +Harness.test({ + query: Table.define({ + name: 'replies', + columns: [ + { + name: 'id', + dataType: 'int', + primaryKey: true + }, + { + name: 'blog_id', + dataType: 'int' + }, + { + name: 'post_id', + dataType: 'int' + }, + { + name: 'user_id', + dataType: 'int' + } + ], + foreignKeys: [ + { + table: 'users', + columns: ['blog_id', 'user_id'], + onDelete: 'no action' + }, + { + name: 'posts_idx', + table: 'posts', + columns: ['blog_id', 'post_id'], + refColumns: ['blog_id', 'id'], + onDelete: 'cascade', + onUpdate: 'set default' + } + ] + }).create(), + pg: { + text: + 'CREATE TABLE "replies" ("id" int PRIMARY KEY, "blog_id" int, "post_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ON DELETE NO ACTION, CONSTRAINT "posts_idx" FOREIGN KEY ( "blog_id", "post_id" ) REFERENCES "posts" ( "blog_id", "id" ) ON DELETE CASCADE ON UPDATE SET DEFAULT)', + string: + 'CREATE TABLE "replies" ("id" int PRIMARY KEY, "blog_id" int, "post_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ON DELETE NO ACTION, CONSTRAINT "posts_idx" FOREIGN KEY ( "blog_id", "post_id" ) REFERENCES "posts" ( "blog_id", "id" ) ON DELETE CASCADE ON UPDATE SET DEFAULT)' + }, + sqlite: { + text: + 'CREATE TABLE "replies" ("id" int PRIMARY KEY, "blog_id" int, "post_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ON DELETE NO ACTION, CONSTRAINT "posts_idx" FOREIGN KEY ( "blog_id", "post_id" ) REFERENCES "posts" ( "blog_id", "id" ) ON DELETE CASCADE ON UPDATE SET DEFAULT)', + string: + 'CREATE TABLE "replies" ("id" int PRIMARY KEY, "blog_id" int, "post_id" int, "user_id" int, FOREIGN KEY ( "blog_id", "user_id" ) REFERENCES "users" ON DELETE NO ACTION, CONSTRAINT "posts_idx" FOREIGN KEY ( "blog_id", "post_id" ) REFERENCES "posts" ( "blog_id", "id" ) ON DELETE CASCADE ON UPDATE SET DEFAULT)' + }, + mysql: { + text: + 'CREATE TABLE `replies` (`id` int PRIMARY KEY, `blog_id` int, `post_id` int, `user_id` int, FOREIGN KEY ( `blog_id`, `user_id` ) REFERENCES `users` ON DELETE NO ACTION, CONSTRAINT `posts_idx` FOREIGN KEY ( `blog_id`, `post_id` ) REFERENCES `posts` ( `blog_id`, `id` ) ON DELETE CASCADE ON UPDATE SET DEFAULT)', + string: + 'CREATE TABLE `replies` (`id` int PRIMARY KEY, `blog_id` int, `post_id` int, `user_id` int, FOREIGN KEY ( `blog_id`, `user_id` ) REFERENCES `users` ON DELETE NO ACTION, CONSTRAINT `posts_idx` FOREIGN KEY ( `blog_id`, `post_id` ) REFERENCES `posts` ( `blog_id`, `id` ) ON DELETE CASCADE ON UPDATE SET DEFAULT)' + }, + params: [] +}); diff --git a/test/dialects/create-view-tests.js b/test/dialects/create-view-tests.js deleted file mode 100644 index 977f540a..00000000 --- a/test/dialects/create-view-tests.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); - -//simple view create -Harness.test({ - query: user.select(user.star()).createView('allUsersView'), - pg: { - text : '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")', - string: '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")' - }, - sqlite: { - text : '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")', - string: '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")' - }, - mysql: { - text : '(CREATE VIEW `allUsersView` AS SELECT `user`.* FROM `user`)', - string: '(CREATE VIEW `allUsersView` AS SELECT `user`.* FROM `user`)' - }, - mssql: { - text : '(CREATE VIEW [allUsersView] AS SELECT [user].* FROM [user])', - string: '(CREATE VIEW [allUsersView] AS SELECT [user].* FROM [user])' - }, - oracle: { - text : '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")', - string: '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")' - } -}); - -//create view with parameters -Harness.test({ - query: user.select(user.star()).where(user.id.equals(1)).createView('oneUserView'), - pg: { - text : '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))', - string: '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))' - }, - sqlite: { - text : '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))', - string: '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))' - }, - mysql: { - text : '(CREATE VIEW `oneUserView` AS SELECT `user`.* FROM `user` WHERE (`user`.`id` = 1))', - string: '(CREATE VIEW `oneUserView` AS SELECT `user`.* FROM `user` WHERE (`user`.`id` = 1))' - }, - mssql: { - text : '(CREATE VIEW [oneUserView] AS SELECT [user].* FROM [user] WHERE ([user].[id] = 1))', - string: '(CREATE VIEW [oneUserView] AS SELECT [user].* FROM [user] WHERE ([user].[id] = 1))' - }, - oracle: { - text : '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))', - string: '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))' - } -}); - -//Tests error raised for non-SELECT create view attempts -Harness.test({ - query: user.delete().where(user.id.equals(1)).createView('oneUserView'), - pg: { - text : 'Create View requires a Select.', - throws: true - }, - sqlite: { - text : 'Create View requires a Select.', - throws: true - }, - mysql: { - text : 'Create View requires a Select.', - throws: true - }, - mssql: { - text : 'Create View requires a Select.', - throws: true - }, - oracle: { - text : 'Create View requires a Select.', - throws: true - }, - params: [] -}); diff --git a/test/dialects/create-view-tests.ts b/test/dialects/create-view-tests.ts new file mode 100644 index 00000000..dc62f533 --- /dev/null +++ b/test/dialects/create-view-tests.ts @@ -0,0 +1,86 @@ +'use strict'; + +import * as Harness from './support'; +const user = Harness.defineUserTable(); + +//simple view create +Harness.test({ + query: user.select(user.star()).createView('allUsersView'), + pg: { + text: '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")', + string: '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")' + }, + sqlite: { + text: '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")', + string: '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")' + }, + mysql: { + text: '(CREATE VIEW `allUsersView` AS SELECT `user`.* FROM `user`)', + string: '(CREATE VIEW `allUsersView` AS SELECT `user`.* FROM `user`)' + }, + mssql: { + text: '(CREATE VIEW [allUsersView] AS SELECT [user].* FROM [user])', + string: '(CREATE VIEW [allUsersView] AS SELECT [user].* FROM [user])' + }, + oracle: { + text: '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")', + string: '(CREATE VIEW "allUsersView" AS SELECT "user".* FROM "user")' + } +}); + +//create view with parameters +Harness.test({ + query: user + .select(user.star()) + .where(user.id.equals(1)) + .createView('oneUserView'), + pg: { + text: '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))', + string: '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))' + }, + sqlite: { + text: '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))', + string: '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))' + }, + mysql: { + text: '(CREATE VIEW `oneUserView` AS SELECT `user`.* FROM `user` WHERE (`user`.`id` = 1))', + string: '(CREATE VIEW `oneUserView` AS SELECT `user`.* FROM `user` WHERE (`user`.`id` = 1))' + }, + mssql: { + text: '(CREATE VIEW [oneUserView] AS SELECT [user].* FROM [user] WHERE ([user].[id] = 1))', + string: '(CREATE VIEW [oneUserView] AS SELECT [user].* FROM [user] WHERE ([user].[id] = 1))' + }, + oracle: { + text: '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))', + string: '(CREATE VIEW "oneUserView" AS SELECT "user".* FROM "user" WHERE ("user"."id" = 1))' + } +}); + +//Tests error raised for non-SELECT create view attempts +Harness.test({ + query: user + .delete() + .where(user.id.equals(1)) + .createView('oneUserView'), + pg: { + text: 'Create View requires a Select.', + throws: true + }, + sqlite: { + text: 'Create View requires a Select.', + throws: true + }, + mysql: { + text: 'Create View requires a Select.', + throws: true + }, + mssql: { + text: 'Create View requires a Select.', + throws: true + }, + oracle: { + text: 'Create View requires a Select.', + throws: true + }, + params: [] +}); diff --git a/test/dialects/date-tests.js b/test/dialects/date-tests.js deleted file mode 100644 index dd2c4d64..00000000 --- a/test/dialects/date-tests.js +++ /dev/null @@ -1,228 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var Sql = require('../../lib'); - -Harness.test({ - query: customer.select(Sql.functions.YEAR(customer.metadata)), - pg: { - text : 'SELECT EXTRACT(YEAR FROM "customer"."metadata") FROM "customer"', - string: 'SELECT EXTRACT(YEAR FROM "customer"."metadata") FROM "customer"' - }, - sqlite: { - text : 'SELECT strftime(\'%Y\', "customer"."metadata") FROM "customer"', - string: 'SELECT strftime(\'%Y\', "customer"."metadata") FROM "customer"' - }, - mysql: { - text : 'SELECT YEAR(`customer`.`metadata`) FROM `customer`', - string: 'SELECT YEAR(`customer`.`metadata`) FROM `customer`' - }, - mssql: { - text : 'SELECT DATEPART(year, [customer].[metadata]) FROM [customer]', - string: 'SELECT DATEPART(year, [customer].[metadata]) FROM [customer]' - }, - oracle: { - text : 'SELECT EXTRACT(YEAR FROM "customer"."metadata") FROM "customer"', - string: 'SELECT EXTRACT(YEAR FROM "customer"."metadata") FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: customer.select(Sql.functions.MONTH(customer.metadata)), - pg: { - text : 'SELECT EXTRACT(MONTH FROM "customer"."metadata") FROM "customer"', - string: 'SELECT EXTRACT(MONTH FROM "customer"."metadata") FROM "customer"' - }, - sqlite: { - text: 'SELECT strftime(\'%m\', datetime("customer"."metadata"/1000, "unixepoch")) FROM "customer"', - string: 'SELECT strftime(\'%m\', datetime("customer"."metadata"/1000, "unixepoch")) FROM "customer"', - config: { - dateTimeMillis: true - } - }, - mysql: { - text : 'SELECT MONTH(`customer`.`metadata`) FROM `customer`', - string: 'SELECT MONTH(`customer`.`metadata`) FROM `customer`' - }, - mssql: { - text : 'SELECT DATEPART(month, [customer].[metadata]) FROM [customer]', - string: 'SELECT DATEPART(month, [customer].[metadata]) FROM [customer]' - }, - oracle: { - text : 'SELECT EXTRACT(MONTH FROM "customer"."metadata") FROM "customer"', - string: 'SELECT EXTRACT(MONTH FROM "customer"."metadata") FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: customer.select(Sql.functions.DAY(customer.metadata)), - pg: { - text : 'SELECT EXTRACT(DAY FROM "customer"."metadata") FROM "customer"', - string: 'SELECT EXTRACT(DAY FROM "customer"."metadata") FROM "customer"' - }, - sqlite: { - text : 'SELECT strftime(\'%d\', "customer"."metadata") FROM "customer"', - string: 'SELECT strftime(\'%d\', "customer"."metadata") FROM "customer"' - }, - mysql: { - text : 'SELECT DAY(`customer`.`metadata`) FROM `customer`', - string: 'SELECT DAY(`customer`.`metadata`) FROM `customer`' - }, - mssql: { - text : 'SELECT DATEPART(day, [customer].[metadata]) FROM [customer]', - string: 'SELECT DATEPART(day, [customer].[metadata]) FROM [customer]' - }, - oracle: { - text : 'SELECT EXTRACT(DAY FROM "customer"."metadata") FROM "customer"', - string: 'SELECT EXTRACT(DAY FROM "customer"."metadata") FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: customer.select(Sql.functions.HOUR(customer.metadata)), - pg: { - text : 'SELECT EXTRACT(HOUR FROM "customer"."metadata") FROM "customer"', - string: 'SELECT EXTRACT(HOUR FROM "customer"."metadata") FROM "customer"' - }, - sqlite: { - text: 'SELECT strftime(\'%H\', datetime("customer"."metadata"/1000, "unixepoch")) FROM "customer"', - string: 'SELECT strftime(\'%H\', datetime("customer"."metadata"/1000, "unixepoch")) FROM "customer"', - config: { - dateTimeMillis: true - } - }, - mysql: { - text : 'SELECT HOUR(`customer`.`metadata`) FROM `customer`', - string: 'SELECT HOUR(`customer`.`metadata`) FROM `customer`' - }, - mssql: { - text : 'SELECT DATEPART(hour, [customer].[metadata]) FROM [customer]', - string: 'SELECT DATEPART(hour, [customer].[metadata]) FROM [customer]' - }, - oracle: { - text : 'SELECT EXTRACT(HOUR FROM "customer"."metadata") FROM "customer"', - string: 'SELECT EXTRACT(HOUR FROM "customer"."metadata") FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: customer.select(Sql.functions.CURRENT_TIMESTAMP()), - pg: { - text : 'SELECT CURRENT_TIMESTAMP FROM "customer"', - string: 'SELECT CURRENT_TIMESTAMP FROM "customer"' - }, - sqlite: { - text : 'SELECT CURRENT_TIMESTAMP FROM "customer"', - string: 'SELECT CURRENT_TIMESTAMP FROM "customer"' - }, - mysql: { - text : 'SELECT CURRENT_TIMESTAMP FROM `customer`', - string: 'SELECT CURRENT_TIMESTAMP FROM `customer`' - }, - mssql: { - text : 'SELECT CURRENT_TIMESTAMP FROM [customer]', - string: 'SELECT CURRENT_TIMESTAMP FROM [customer]' - }, - oracle: { - text : 'SELECT CURRENT_TIMESTAMP FROM "customer"', - string: 'SELECT CURRENT_TIMESTAMP FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(Sql.functions.CURRENT_TIMESTAMP().plus(Sql.interval({hours:1}))), - pg: { - text : 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'1 HOUR\')', - string: 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'1 HOUR\')' - }, - mysql: { - text : 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'1:0:0\' HOUR_SECOND)', - string: 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'1:0:0\' HOUR_SECOND)' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(Sql.functions.CURRENT_TIMESTAMP().minus(Sql.interval({years:3}))), - pg: { - text : 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'3 YEAR\')', - string: 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'3 YEAR\')' - }, - mysql: { - text : 'SELECT (CURRENT_TIMESTAMP - INTERVAL 3 YEAR)', - string: 'SELECT (CURRENT_TIMESTAMP - INTERVAL 3 YEAR)' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(Sql.functions.CURRENT_TIMESTAMP().minus(Sql.interval({years:3, months:2}))), - pg: { - text : 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'3 YEAR 2 MONTH\')', - string: 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'3 YEAR 2 MONTH\')' - }, - mysql: { - text : 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'3-2\' YEAR_MONTH)', - string: 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'3-2\' YEAR_MONTH)' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(Sql.functions.CURRENT_TIMESTAMP().plus(Sql.interval({hours:1, minutes:20}))), - pg: { - text : 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'1 HOUR 20 MINUTE\')', - string: 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'1 HOUR 20 MINUTE\')' - }, - mysql: { - text : 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'1:20:0\' HOUR_SECOND)', - string: 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'1:20:0\' HOUR_SECOND)' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(Sql.functions.CURRENT_TIMESTAMP().plus(Sql.interval({hours:'sql\'injection', minutes:20}))), - pg: { - text : 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'20 MINUTE\')', - string: 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'20 MINUTE\')' - }, - mysql: { - text : 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'0:20:0\' HOUR_SECOND)', - string: 'SELECT (CURRENT_TIMESTAMP + INTERVAL \'0:20:0\' HOUR_SECOND)' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(Sql.functions.CURRENT_TIMESTAMP().minus(Sql.interval({days: 1, hours:5, minutes: 'sql\'injection'}))), - pg: { - text : 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'1 DAY 5 HOUR\')', - string: 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'1 DAY 5 HOUR\')' - }, - mysql: { - text : 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'1 5:0:0\' DAY_SECOND)', - string: 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'1 5:0:0\' DAY_SECOND)' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(Sql.functions.CURRENT_TIMESTAMP().minus(Sql.interval({years: 2, months: 5}))), - pg: { - text : 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'2 YEAR 5 MONTH\')', - string: 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'2 YEAR 5 MONTH\')' - }, - mysql: { - text : 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'2-5\' YEAR_MONTH)', - string: 'SELECT (CURRENT_TIMESTAMP - INTERVAL \'2-5\' YEAR_MONTH)' - }, - params: [] -}); - diff --git a/test/dialects/date-tests.ts b/test/dialects/date-tests.ts new file mode 100644 index 00000000..716c41a0 --- /dev/null +++ b/test/dialects/date-tests.ts @@ -0,0 +1,230 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const customer = Harness.defineCustomerTable(); +const instance = new Sql('postgres'); + +Harness.test({ + query: customer.select(instance.functions.YEAR(customer.metadata)), + pg: { + text: 'SELECT EXTRACT(YEAR FROM "customer"."metadata") FROM "customer"', + string: 'SELECT EXTRACT(YEAR FROM "customer"."metadata") FROM "customer"' + }, + sqlite: { + text: 'SELECT strftime(\'%Y\', "customer"."metadata") FROM "customer"', + string: 'SELECT strftime(\'%Y\', "customer"."metadata") FROM "customer"' + }, + mysql: { + text: 'SELECT YEAR(`customer`.`metadata`) FROM `customer`', + string: 'SELECT YEAR(`customer`.`metadata`) FROM `customer`' + }, + mssql: { + text: 'SELECT DATEPART(year, [customer].[metadata]) FROM [customer]', + string: 'SELECT DATEPART(year, [customer].[metadata]) FROM [customer]' + }, + oracle: { + text: 'SELECT EXTRACT(YEAR FROM "customer"."metadata") FROM "customer"', + string: 'SELECT EXTRACT(YEAR FROM "customer"."metadata") FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customer.select(instance.functions.MONTH(customer.metadata)), + pg: { + text: 'SELECT EXTRACT(MONTH FROM "customer"."metadata") FROM "customer"', + string: 'SELECT EXTRACT(MONTH FROM "customer"."metadata") FROM "customer"' + }, + sqlite: { + text: 'SELECT strftime(\'%m\', datetime("customer"."metadata"/1000, "unixepoch")) FROM "customer"', + string: 'SELECT strftime(\'%m\', datetime("customer"."metadata"/1000, "unixepoch")) FROM "customer"', + config: { + dateTimeMillis: true + } + }, + mysql: { + text: 'SELECT MONTH(`customer`.`metadata`) FROM `customer`', + string: 'SELECT MONTH(`customer`.`metadata`) FROM `customer`' + }, + mssql: { + text: 'SELECT DATEPART(month, [customer].[metadata]) FROM [customer]', + string: 'SELECT DATEPART(month, [customer].[metadata]) FROM [customer]' + }, + oracle: { + text: 'SELECT EXTRACT(MONTH FROM "customer"."metadata") FROM "customer"', + string: 'SELECT EXTRACT(MONTH FROM "customer"."metadata") FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customer.select(instance.functions.DAY(customer.metadata)), + pg: { + text: 'SELECT EXTRACT(DAY FROM "customer"."metadata") FROM "customer"', + string: 'SELECT EXTRACT(DAY FROM "customer"."metadata") FROM "customer"' + }, + sqlite: { + text: 'SELECT strftime(\'%d\', "customer"."metadata") FROM "customer"', + string: 'SELECT strftime(\'%d\', "customer"."metadata") FROM "customer"' + }, + mysql: { + text: 'SELECT DAY(`customer`.`metadata`) FROM `customer`', + string: 'SELECT DAY(`customer`.`metadata`) FROM `customer`' + }, + mssql: { + text: 'SELECT DATEPART(day, [customer].[metadata]) FROM [customer]', + string: 'SELECT DATEPART(day, [customer].[metadata]) FROM [customer]' + }, + oracle: { + text: 'SELECT EXTRACT(DAY FROM "customer"."metadata") FROM "customer"', + string: 'SELECT EXTRACT(DAY FROM "customer"."metadata") FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customer.select(instance.functions.HOUR(customer.metadata)), + pg: { + text: 'SELECT EXTRACT(HOUR FROM "customer"."metadata") FROM "customer"', + string: 'SELECT EXTRACT(HOUR FROM "customer"."metadata") FROM "customer"' + }, + sqlite: { + text: 'SELECT strftime(\'%H\', datetime("customer"."metadata"/1000, "unixepoch")) FROM "customer"', + string: 'SELECT strftime(\'%H\', datetime("customer"."metadata"/1000, "unixepoch")) FROM "customer"', + config: { + dateTimeMillis: true + } + }, + mysql: { + text: 'SELECT HOUR(`customer`.`metadata`) FROM `customer`', + string: 'SELECT HOUR(`customer`.`metadata`) FROM `customer`' + }, + mssql: { + text: 'SELECT DATEPART(hour, [customer].[metadata]) FROM [customer]', + string: 'SELECT DATEPART(hour, [customer].[metadata]) FROM [customer]' + }, + oracle: { + text: 'SELECT EXTRACT(HOUR FROM "customer"."metadata") FROM "customer"', + string: 'SELECT EXTRACT(HOUR FROM "customer"."metadata") FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customer.select(instance.functions.CURRENT_TIMESTAMP()), + pg: { + text: 'SELECT CURRENT_TIMESTAMP FROM "customer"', + string: 'SELECT CURRENT_TIMESTAMP FROM "customer"' + }, + sqlite: { + text: 'SELECT CURRENT_TIMESTAMP FROM "customer"', + string: 'SELECT CURRENT_TIMESTAMP FROM "customer"' + }, + mysql: { + text: 'SELECT CURRENT_TIMESTAMP FROM `customer`', + string: 'SELECT CURRENT_TIMESTAMP FROM `customer`' + }, + mssql: { + text: 'SELECT CURRENT_TIMESTAMP FROM [customer]', + string: 'SELECT CURRENT_TIMESTAMP FROM [customer]' + }, + oracle: { + text: 'SELECT CURRENT_TIMESTAMP FROM "customer"', + string: 'SELECT CURRENT_TIMESTAMP FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: instance.select(instance.functions.CURRENT_TIMESTAMP().plus(instance.interval({ hours: 1 }))), + pg: { + text: "SELECT (CURRENT_TIMESTAMP + INTERVAL '1 HOUR')", + string: "SELECT (CURRENT_TIMESTAMP + INTERVAL '1 HOUR')" + }, + mysql: { + text: "SELECT (CURRENT_TIMESTAMP + INTERVAL '1:0:0' HOUR_SECOND)", + string: "SELECT (CURRENT_TIMESTAMP + INTERVAL '1:0:0' HOUR_SECOND)" + }, + params: [] +}); + +Harness.test({ + query: instance.select(instance.functions.CURRENT_TIMESTAMP().minus(instance.interval({ years: 3 }))), + pg: { + text: "SELECT (CURRENT_TIMESTAMP - INTERVAL '3 YEAR')", + string: "SELECT (CURRENT_TIMESTAMP - INTERVAL '3 YEAR')" + }, + mysql: { + text: 'SELECT (CURRENT_TIMESTAMP - INTERVAL 3 YEAR)', + string: 'SELECT (CURRENT_TIMESTAMP - INTERVAL 3 YEAR)' + }, + params: [] +}); + +Harness.test({ + query: instance.select(instance.functions.CURRENT_TIMESTAMP().minus(instance.interval({ years: 3, months: 2 }))), + pg: { + text: "SELECT (CURRENT_TIMESTAMP - INTERVAL '3 YEAR 2 MONTH')", + string: "SELECT (CURRENT_TIMESTAMP - INTERVAL '3 YEAR 2 MONTH')" + }, + mysql: { + text: "SELECT (CURRENT_TIMESTAMP - INTERVAL '3-2' YEAR_MONTH)", + string: "SELECT (CURRENT_TIMESTAMP - INTERVAL '3-2' YEAR_MONTH)" + }, + params: [] +}); + +Harness.test({ + query: instance.select(instance.functions.CURRENT_TIMESTAMP().plus(instance.interval({ hours: 1, minutes: 20 }))), + pg: { + text: "SELECT (CURRENT_TIMESTAMP + INTERVAL '1 HOUR 20 MINUTE')", + string: "SELECT (CURRENT_TIMESTAMP + INTERVAL '1 HOUR 20 MINUTE')" + }, + mysql: { + text: "SELECT (CURRENT_TIMESTAMP + INTERVAL '1:20:0' HOUR_SECOND)", + string: "SELECT (CURRENT_TIMESTAMP + INTERVAL '1:20:0' HOUR_SECOND)" + }, + params: [] +}); + +Harness.test({ + query: instance.select(instance.functions.CURRENT_TIMESTAMP().plus(instance.interval({ hours: "sql'injection", minutes: 20 }))), + pg: { + text: "SELECT (CURRENT_TIMESTAMP + INTERVAL '20 MINUTE')", + string: "SELECT (CURRENT_TIMESTAMP + INTERVAL '20 MINUTE')" + }, + mysql: { + text: "SELECT (CURRENT_TIMESTAMP + INTERVAL '0:20:0' HOUR_SECOND)", + string: "SELECT (CURRENT_TIMESTAMP + INTERVAL '0:20:0' HOUR_SECOND)" + }, + params: [] +}); + +Harness.test({ + query: instance.select( + instance.functions.CURRENT_TIMESTAMP().minus(instance.interval({ days: 1, hours: 5, minutes: "sql'injection" })) + ), + pg: { + text: "SELECT (CURRENT_TIMESTAMP - INTERVAL '1 DAY 5 HOUR')", + string: "SELECT (CURRENT_TIMESTAMP - INTERVAL '1 DAY 5 HOUR')" + }, + mysql: { + text: "SELECT (CURRENT_TIMESTAMP - INTERVAL '1 5:0:0' DAY_SECOND)", + string: "SELECT (CURRENT_TIMESTAMP - INTERVAL '1 5:0:0' DAY_SECOND)" + }, + params: [] +}); + +Harness.test({ + query: instance.select(instance.functions.CURRENT_TIMESTAMP().minus(instance.interval({ years: 2, months: 5 }))), + pg: { + text: "SELECT (CURRENT_TIMESTAMP - INTERVAL '2 YEAR 5 MONTH')", + string: "SELECT (CURRENT_TIMESTAMP - INTERVAL '2 YEAR 5 MONTH')" + }, + mysql: { + text: "SELECT (CURRENT_TIMESTAMP - INTERVAL '2-5' YEAR_MONTH)", + string: "SELECT (CURRENT_TIMESTAMP - INTERVAL '2-5' YEAR_MONTH)" + }, + params: [] +}); diff --git a/test/dialects/delete-tests.js b/test/dialects/delete-tests.js deleted file mode 100644 index 51fe3026..00000000 --- a/test/dialects/delete-tests.js +++ /dev/null @@ -1,169 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var user = Harness.defineUserTable(); - -Harness.test({ - query: post.delete().where(post.content.equals("hello's world")), - pg: { - text : 'DELETE FROM "post" WHERE ("post"."content" = $1)', - string: 'DELETE FROM "post" WHERE ("post"."content" = \'hello\'\'s world\')' - }, - sqlite: { - text : 'DELETE FROM "post" WHERE ("post"."content" = $1)', - string: 'DELETE FROM "post" WHERE ("post"."content" = \'hello\'\'s world\')' - }, - mysql: { - text : 'DELETE FROM `post` WHERE (`post`.`content` = ?)', - string: 'DELETE FROM `post` WHERE (`post`.`content` = \'hello\'\'s world\')' - }, - mssql: { - text : 'DELETE FROM [post] WHERE ([post].[content] = @1)', - string: "DELETE FROM [post] WHERE ([post].[content] = 'hello''s world')" - }, - oracle: { - text : 'DELETE FROM "post" WHERE ("post"."content" = :1)', - string: 'DELETE FROM "post" WHERE ("post"."content" = \'hello\'\'s world\')' - }, - params: ["hello's world"] -}); - -Harness.test({ - query: post.delete(post).from(post), - pg: { - text: 'DELETE "post" FROM "post"', - string: 'DELETE "post" FROM "post"' - }, - sqlite: { - text: 'DELETE "post" FROM "post"', - string: 'DELETE "post" FROM "post"' - }, - mysql: { - text: 'DELETE `post` FROM `post`', - string: 'DELETE `post` FROM `post`' - }, - params: [] -}); - -Harness.test({ - query: post.delete([post, post]).from(post), - pg: { - text: 'DELETE "post", "post" FROM "post"', - string: 'DELETE "post", "post" FROM "post"' - }, - sqlite: { - text: 'DELETE "post", "post" FROM "post"', - string: 'DELETE "post", "post" FROM "post"' - }, - mysql: { - text: 'DELETE `post`, `post` FROM `post`', - string: 'DELETE `post`, `post` FROM `post`' - }, - params: [] -}); - -Harness.test({ - query: user - .delete(user) - .from(user.join(post).on(post.userId.equals(user.id))) - .where(post.content.equals('foo')), - pg: { - text: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = $1)', - string: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = \'foo\')' - }, - sqlite: { - text: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = $1)', - string: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = \'foo\')' - }, - mysql: { - text: 'DELETE `user` FROM `user` INNER JOIN `post` ON (`post`.`userId` = `user`.`id`) WHERE (`post`.`content` = ?)', - string: 'DELETE `user` FROM `user` INNER JOIN `post` ON (`post`.`userId` = `user`.`id`) WHERE (`post`.`content` = \'foo\')' - }, - oracle: { - text: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = :1)', - string: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = \'foo\')' - }, - params: [ 'foo' ] -}); - -Harness.test({ - query: post.delete().where({ - content: '' - }), - pg: { - text : 'DELETE FROM "post" WHERE ("post"."content" = $1)', - string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' - }, - sqlite: { - text : 'DELETE FROM "post" WHERE ("post"."content" = $1)', - string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' - }, - mysql: { - text : 'DELETE FROM `post` WHERE (`post`.`content` = ?)', - string: 'DELETE FROM `post` WHERE (`post`.`content` = \'\')' - }, - mssql: { - text : 'DELETE FROM [post] WHERE ([post].[content] = @1)', - string: "DELETE FROM [post] WHERE ([post].[content] = '')" - }, - oracle: { - text : 'DELETE FROM "post" WHERE ("post"."content" = :1)', - string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' - }, - params: [''] -}); - -Harness.test({ - query: post.delete({ - content: '' - }), - pg: { - text : 'DELETE FROM "post" WHERE ("post"."content" = $1)', - string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' - }, - sqlite: { - text : 'DELETE FROM "post" WHERE ("post"."content" = $1)', - string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' - }, - mysql: { - text : 'DELETE FROM `post` WHERE (`post`.`content` = ?)', - string: 'DELETE FROM `post` WHERE (`post`.`content` = \'\')' - }, - mssql: { - text : 'DELETE FROM [post] WHERE ([post].[content] = @1)', - string: "DELETE FROM [post] WHERE ([post].[content] = '')" - }, - oracle: { - text : 'DELETE FROM "post" WHERE ("post"."content" = :1)', - string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' - }, - params: [''] -}); - -Harness.test({ - query: post.delete({ - content: '' - }).or(post.content.isNull()), - pg: { - text : 'DELETE FROM "post" WHERE (("post"."content" = $1) OR ("post"."content" IS NULL))', - string: 'DELETE FROM "post" WHERE (("post"."content" = \'\') OR ("post"."content" IS NULL))' - }, - sqlite: { - text : 'DELETE FROM "post" WHERE (("post"."content" = $1) OR ("post"."content" IS NULL))', - string: 'DELETE FROM "post" WHERE (("post"."content" = \'\') OR ("post"."content" IS NULL))' - }, - mysql: { - text : 'DELETE FROM `post` WHERE ((`post`.`content` = ?) OR (`post`.`content` IS NULL))', - string: 'DELETE FROM `post` WHERE ((`post`.`content` = \'\') OR (`post`.`content` IS NULL))' - }, - mssql: { - text : 'DELETE FROM [post] WHERE (([post].[content] = @1) OR ([post].[content] IS NULL))', - string: "DELETE FROM [post] WHERE (([post].[content] = '') OR ([post].[content] IS NULL))" - }, - oracle: { - text : 'DELETE FROM "post" WHERE (("post"."content" = :1) OR ("post"."content" IS NULL))', - string: 'DELETE FROM "post" WHERE (("post"."content" = \'\') OR ("post"."content" IS NULL))' - }, - params: [''] -}); diff --git a/test/dialects/delete-tests.ts b/test/dialects/delete-tests.ts new file mode 100644 index 00000000..386d6527 --- /dev/null +++ b/test/dialects/delete-tests.ts @@ -0,0 +1,171 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); + +Harness.test({ + query: post.delete().where(post.content.equals("hello's world")), + pg: { + text: 'DELETE FROM "post" WHERE ("post"."content" = $1)', + string: 'DELETE FROM "post" WHERE ("post"."content" = \'hello\'\'s world\')' + }, + sqlite: { + text: 'DELETE FROM "post" WHERE ("post"."content" = $1)', + string: 'DELETE FROM "post" WHERE ("post"."content" = \'hello\'\'s world\')' + }, + mysql: { + text: 'DELETE FROM `post` WHERE (`post`.`content` = ?)', + string: "DELETE FROM `post` WHERE (`post`.`content` = 'hello''s world')" + }, + mssql: { + text: 'DELETE FROM [post] WHERE ([post].[content] = @1)', + string: "DELETE FROM [post] WHERE ([post].[content] = 'hello''s world')" + }, + oracle: { + text: 'DELETE FROM "post" WHERE ("post"."content" = :1)', + string: 'DELETE FROM "post" WHERE ("post"."content" = \'hello\'\'s world\')' + }, + params: ["hello's world"] +}); + +Harness.test({ + query: post.delete(post).from(post), + pg: { + text: 'DELETE "post" FROM "post"', + string: 'DELETE "post" FROM "post"' + }, + sqlite: { + text: 'DELETE "post" FROM "post"', + string: 'DELETE "post" FROM "post"' + }, + mysql: { + text: 'DELETE `post` FROM `post`', + string: 'DELETE `post` FROM `post`' + }, + params: [] +}); + +Harness.test({ + query: post.delete([post, post]).from(post), + pg: { + text: 'DELETE "post", "post" FROM "post"', + string: 'DELETE "post", "post" FROM "post"' + }, + sqlite: { + text: 'DELETE "post", "post" FROM "post"', + string: 'DELETE "post", "post" FROM "post"' + }, + mysql: { + text: 'DELETE `post`, `post` FROM `post`', + string: 'DELETE `post`, `post` FROM `post`' + }, + params: [] +}); + +Harness.test({ + query: user + .delete(user) + .from(user.join(post).on(post.userId.equals(user.id))) + .where(post.content.equals('foo')), + pg: { + text: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = $1)', + string: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = \'foo\')' + }, + sqlite: { + text: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = $1)', + string: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = \'foo\')' + }, + mysql: { + text: 'DELETE `user` FROM `user` INNER JOIN `post` ON (`post`.`userId` = `user`.`id`) WHERE (`post`.`content` = ?)', + string: "DELETE `user` FROM `user` INNER JOIN `post` ON (`post`.`userId` = `user`.`id`) WHERE (`post`.`content` = 'foo')" + }, + oracle: { + text: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = :1)', + string: 'DELETE "user" FROM "user" INNER JOIN "post" ON ("post"."userId" = "user"."id") WHERE ("post"."content" = \'foo\')' + }, + params: ['foo'] +}); + +Harness.test({ + query: post.delete().where({ + content: '' + }), + pg: { + text: 'DELETE FROM "post" WHERE ("post"."content" = $1)', + string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' + }, + sqlite: { + text: 'DELETE FROM "post" WHERE ("post"."content" = $1)', + string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' + }, + mysql: { + text: 'DELETE FROM `post` WHERE (`post`.`content` = ?)', + string: "DELETE FROM `post` WHERE (`post`.`content` = '')" + }, + mssql: { + text: 'DELETE FROM [post] WHERE ([post].[content] = @1)', + string: "DELETE FROM [post] WHERE ([post].[content] = '')" + }, + oracle: { + text: 'DELETE FROM "post" WHERE ("post"."content" = :1)', + string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' + }, + params: [''] +}); + +Harness.test({ + query: post.delete({ + content: '' + }), + pg: { + text: 'DELETE FROM "post" WHERE ("post"."content" = $1)', + string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' + }, + sqlite: { + text: 'DELETE FROM "post" WHERE ("post"."content" = $1)', + string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' + }, + mysql: { + text: 'DELETE FROM `post` WHERE (`post`.`content` = ?)', + string: "DELETE FROM `post` WHERE (`post`.`content` = '')" + }, + mssql: { + text: 'DELETE FROM [post] WHERE ([post].[content] = @1)', + string: "DELETE FROM [post] WHERE ([post].[content] = '')" + }, + oracle: { + text: 'DELETE FROM "post" WHERE ("post"."content" = :1)', + string: 'DELETE FROM "post" WHERE ("post"."content" = \'\')' + }, + params: [''] +}); + +Harness.test({ + query: post + .delete({ + content: '' + }) + .or(post.content.isNull()), + pg: { + text: 'DELETE FROM "post" WHERE (("post"."content" = $1) OR ("post"."content" IS NULL))', + string: 'DELETE FROM "post" WHERE (("post"."content" = \'\') OR ("post"."content" IS NULL))' + }, + sqlite: { + text: 'DELETE FROM "post" WHERE (("post"."content" = $1) OR ("post"."content" IS NULL))', + string: 'DELETE FROM "post" WHERE (("post"."content" = \'\') OR ("post"."content" IS NULL))' + }, + mysql: { + text: 'DELETE FROM `post` WHERE ((`post`.`content` = ?) OR (`post`.`content` IS NULL))', + string: "DELETE FROM `post` WHERE ((`post`.`content` = '') OR (`post`.`content` IS NULL))" + }, + mssql: { + text: 'DELETE FROM [post] WHERE (([post].[content] = @1) OR ([post].[content] IS NULL))', + string: "DELETE FROM [post] WHERE (([post].[content] = '') OR ([post].[content] IS NULL))" + }, + oracle: { + text: 'DELETE FROM "post" WHERE (("post"."content" = :1) OR ("post"."content" IS NULL))', + string: 'DELETE FROM "post" WHERE (("post"."content" = \'\') OR ("post"."content" IS NULL))' + }, + params: [''] +}); diff --git a/test/dialects/distinct-on-tests.js b/test/dialects/distinct-on-tests.js deleted file mode 100644 index d238f928..00000000 --- a/test/dialects/distinct-on-tests.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); -var Sql = require('../../lib').setDialect('postgres'); - -Harness.test({ - query: user.select().distinctOn(user.id), - pg: { - text : 'SELECT DISTINCT ON("user"."id") "user".* FROM "user"', - string: 'SELECT DISTINCT ON("user"."id") "user".* FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.id,user.name).distinctOn(user.id), - pg: { - text : 'SELECT DISTINCT ON("user"."id") "user"."id", "user"."name" FROM "user"', - string: 'SELECT DISTINCT ON("user"."id") "user"."id", "user"."name" FROM "user"' - }, - params: [] -}); - diff --git a/test/dialects/distinct-on-tests.ts b/test/dialects/distinct-on-tests.ts new file mode 100644 index 00000000..d72d0b8d --- /dev/null +++ b/test/dialects/distinct-on-tests.ts @@ -0,0 +1,22 @@ +'use strict'; + +import * as Harness from './support'; +const user = Harness.defineUserTable(); + +Harness.test({ + query: user.select().distinctOn(user.id), + pg: { + text: 'SELECT DISTINCT ON("user"."id") "user".* FROM "user"', + string: 'SELECT DISTINCT ON("user"."id") "user".* FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.id, user.name).distinctOn(user.id), + pg: { + text: 'SELECT DISTINCT ON("user"."id") "user"."id", "user"."name" FROM "user"', + string: 'SELECT DISTINCT ON("user"."id") "user"."id", "user"."name" FROM "user"' + }, + params: [] +}); diff --git a/test/dialects/distinct-tests.js b/test/dialects/distinct-tests.js deleted file mode 100644 index 9f922bff..00000000 --- a/test/dialects/distinct-tests.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); - -Harness.test({ - query: user.select(user.id.distinct()), - pg: { - text : 'SELECT DISTINCT("user"."id") FROM "user"', - string: 'SELECT DISTINCT("user"."id") FROM "user"' - }, - sqlite: { - text : 'SELECT DISTINCT("user"."id") FROM "user"', - string: 'SELECT DISTINCT("user"."id") FROM "user"' - }, - mysql: { - text : 'SELECT DISTINCT(`user`.`id`) FROM `user`', - string: 'SELECT DISTINCT(`user`.`id`) FROM `user`' - }, - mssql: { - text : 'SELECT DISTINCT([user].[id]) FROM [user]', - string: 'SELECT DISTINCT([user].[id]) FROM [user]' - }, - oracle: { - text : 'SELECT DISTINCT("user"."id") FROM "user"', - string: 'SELECT DISTINCT("user"."id") FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.id.count().distinct().as('count')), - pg: { - text : 'SELECT COUNT(DISTINCT("user"."id")) AS "count" FROM "user"', - string: 'SELECT COUNT(DISTINCT("user"."id")) AS "count" FROM "user"' - }, - sqlite: { - text : 'SELECT COUNT(DISTINCT("user"."id")) AS "count" FROM "user"', - string: 'SELECT COUNT(DISTINCT("user"."id")) AS "count" FROM "user"' - }, - mysql: { - text : 'SELECT COUNT(DISTINCT(`user`.`id`)) AS `count` FROM `user`', - string: 'SELECT COUNT(DISTINCT(`user`.`id`)) AS `count` FROM `user`' - }, - mssql: { - text : 'SELECT COUNT(DISTINCT([user].[id])) AS [count] FROM [user]', - string: 'SELECT COUNT(DISTINCT([user].[id])) AS [count] FROM [user]' - }, - oracle: { - text : 'SELECT COUNT(DISTINCT("user"."id")) "count" FROM "user"', - string: 'SELECT COUNT(DISTINCT("user"."id")) "count" FROM "user"' - }, - params: [] -}); - -// BELOW HERE TEST DISTINCT ON THE ENTIRE RESULTS SET, NOT JUST ONE COLUMN - -Harness.test({ - query: user.select().distinct(), - pg: { - text : 'SELECT DISTINCT "user".* FROM "user"', - string: 'SELECT DISTINCT "user".* FROM "user"' - }, - sqlite: { - text : 'SELECT DISTINCT "user".* FROM "user"', - string: 'SELECT DISTINCT "user".* FROM "user"' - }, - mysql: { - text : 'SELECT DISTINCT `user`.* FROM `user`', - string: 'SELECT DISTINCT `user`.* FROM `user`' - }, - mssql: { - text : 'SELECT DISTINCT [user].* FROM [user]', - string: 'SELECT DISTINCT [user].* FROM [user]' - }, - oracle: { - text : 'SELECT DISTINCT "user".* FROM "user"', - string: 'SELECT DISTINCT "user".* FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.id).distinct(), - pg: { - text : 'SELECT DISTINCT "user"."id" FROM "user"', - string: 'SELECT DISTINCT "user"."id" FROM "user"' - }, - sqlite: { - text : 'SELECT DISTINCT "user"."id" FROM "user"', - string: 'SELECT DISTINCT "user"."id" FROM "user"' - }, - mysql: { - text : 'SELECT DISTINCT `user`.`id` FROM `user`', - string: 'SELECT DISTINCT `user`.`id` FROM `user`' - }, - mssql: { - text : 'SELECT DISTINCT [user].[id] FROM [user]', - string: 'SELECT DISTINCT [user].[id] FROM [user]' - }, - oracle: { - text : 'SELECT DISTINCT "user"."id" FROM "user"', - string: 'SELECT DISTINCT "user"."id" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.id,user.name).distinct(), - pg: { - text : 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"', - string: 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"' - }, - sqlite: { - text : 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"', - string: 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"' - }, - mysql: { - text : 'SELECT DISTINCT `user`.`id`, `user`.`name` FROM `user`', - string: 'SELECT DISTINCT `user`.`id`, `user`.`name` FROM `user`' - }, - mssql: { - text : 'SELECT DISTINCT [user].[id], [user].[name] FROM [user]', - string: 'SELECT DISTINCT [user].[id], [user].[name] FROM [user]' - }, - oracle: { - text : 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"', - string: 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"' - }, - params: [] -}); - diff --git a/test/dialects/distinct-tests.ts b/test/dialects/distinct-tests.ts new file mode 100644 index 00000000..4210fbf7 --- /dev/null +++ b/test/dialects/distinct-tests.ts @@ -0,0 +1,136 @@ +'use strict'; + +import * as Harness from './support'; +const user = Harness.defineUserTable(); + +Harness.test({ + query: user.select(user.id.distinct()), + pg: { + text: 'SELECT DISTINCT("user"."id") FROM "user"', + string: 'SELECT DISTINCT("user"."id") FROM "user"' + }, + sqlite: { + text: 'SELECT DISTINCT("user"."id") FROM "user"', + string: 'SELECT DISTINCT("user"."id") FROM "user"' + }, + mysql: { + text: 'SELECT DISTINCT(`user`.`id`) FROM `user`', + string: 'SELECT DISTINCT(`user`.`id`) FROM `user`' + }, + mssql: { + text: 'SELECT DISTINCT([user].[id]) FROM [user]', + string: 'SELECT DISTINCT([user].[id]) FROM [user]' + }, + oracle: { + text: 'SELECT DISTINCT("user"."id") FROM "user"', + string: 'SELECT DISTINCT("user"."id") FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select( + user.id + .count() + .distinct() + .as('count') + ), + pg: { + text: 'SELECT COUNT(DISTINCT("user"."id")) AS "count" FROM "user"', + string: 'SELECT COUNT(DISTINCT("user"."id")) AS "count" FROM "user"' + }, + sqlite: { + text: 'SELECT COUNT(DISTINCT("user"."id")) AS "count" FROM "user"', + string: 'SELECT COUNT(DISTINCT("user"."id")) AS "count" FROM "user"' + }, + mysql: { + text: 'SELECT COUNT(DISTINCT(`user`.`id`)) AS `count` FROM `user`', + string: 'SELECT COUNT(DISTINCT(`user`.`id`)) AS `count` FROM `user`' + }, + mssql: { + text: 'SELECT COUNT(DISTINCT([user].[id])) AS [count] FROM [user]', + string: 'SELECT COUNT(DISTINCT([user].[id])) AS [count] FROM [user]' + }, + oracle: { + text: 'SELECT COUNT(DISTINCT("user"."id")) "count" FROM "user"', + string: 'SELECT COUNT(DISTINCT("user"."id")) "count" FROM "user"' + }, + params: [] +}); + +// BELOW HERE TEST DISTINCT ON THE ENTIRE RESULTS SET, NOT JUST ONE COLUMN + +Harness.test({ + query: user.select().distinct(), + pg: { + text: 'SELECT DISTINCT "user".* FROM "user"', + string: 'SELECT DISTINCT "user".* FROM "user"' + }, + sqlite: { + text: 'SELECT DISTINCT "user".* FROM "user"', + string: 'SELECT DISTINCT "user".* FROM "user"' + }, + mysql: { + text: 'SELECT DISTINCT `user`.* FROM `user`', + string: 'SELECT DISTINCT `user`.* FROM `user`' + }, + mssql: { + text: 'SELECT DISTINCT [user].* FROM [user]', + string: 'SELECT DISTINCT [user].* FROM [user]' + }, + oracle: { + text: 'SELECT DISTINCT "user".* FROM "user"', + string: 'SELECT DISTINCT "user".* FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.id).distinct(), + pg: { + text: 'SELECT DISTINCT "user"."id" FROM "user"', + string: 'SELECT DISTINCT "user"."id" FROM "user"' + }, + sqlite: { + text: 'SELECT DISTINCT "user"."id" FROM "user"', + string: 'SELECT DISTINCT "user"."id" FROM "user"' + }, + mysql: { + text: 'SELECT DISTINCT `user`.`id` FROM `user`', + string: 'SELECT DISTINCT `user`.`id` FROM `user`' + }, + mssql: { + text: 'SELECT DISTINCT [user].[id] FROM [user]', + string: 'SELECT DISTINCT [user].[id] FROM [user]' + }, + oracle: { + text: 'SELECT DISTINCT "user"."id" FROM "user"', + string: 'SELECT DISTINCT "user"."id" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.id, user.name).distinct(), + pg: { + text: 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"', + string: 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"' + }, + sqlite: { + text: 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"', + string: 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"' + }, + mysql: { + text: 'SELECT DISTINCT `user`.`id`, `user`.`name` FROM `user`', + string: 'SELECT DISTINCT `user`.`id`, `user`.`name` FROM `user`' + }, + mssql: { + text: 'SELECT DISTINCT [user].[id], [user].[name] FROM [user]', + string: 'SELECT DISTINCT [user].[id], [user].[name] FROM [user]' + }, + oracle: { + text: 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"', + string: 'SELECT DISTINCT "user"."id", "user"."name" FROM "user"' + }, + params: [] +}); diff --git a/test/dialects/drop-table-tests.js b/test/dialects/drop-table-tests.js deleted file mode 100644 index eb183e64..00000000 --- a/test/dialects/drop-table-tests.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); - -Harness.test({ - query: post.drop(), - pg: { - text : 'DROP TABLE "post"', - string: 'DROP TABLE "post"' - }, - sqlite: { - text : 'DROP TABLE "post"', - string: 'DROP TABLE "post"' - }, - mysql: { - text : 'DROP TABLE `post`', - string: 'DROP TABLE `post`' - }, - mssql: { - text : 'DROP TABLE [post]', - string: 'DROP TABLE [post]' - }, - oracle: { - text : 'DROP TABLE "post"', - string: 'DROP TABLE "post"' - }, - params: [] -}); - -Harness.test({ - query: post.drop().ifExists(), - pg: { - text : 'DROP TABLE IF EXISTS "post"', - string: 'DROP TABLE IF EXISTS "post"' - }, - sqlite: { - text : 'DROP TABLE IF EXISTS "post"', - string: 'DROP TABLE IF EXISTS "post"' - }, - mysql: { - text : 'DROP TABLE IF EXISTS `post`', - string: 'DROP TABLE IF EXISTS `post`' - }, - mssql: { - text : 'IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = [post]) BEGIN DROP TABLE [post] END', - string: 'IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = [post]) BEGIN DROP TABLE [post] END' - }, - oracle: { - text : 'BEGIN EXECUTE IMMEDIATE \'DROP TABLE "post"\'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;', - string: 'BEGIN EXECUTE IMMEDIATE \'DROP TABLE "post"\'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;' - }, - params: [] -}); - -Harness.test({ - query: post.drop().cascade(), - pg: { - text : 'DROP TABLE "post" CASCADE', - string: 'DROP TABLE "post" CASCADE' - }, - sqlite: { - text : 'Sqlite do not support CASCADE in DROP TABLE', - throws: true - }, - mysql: { - text : 'DROP TABLE `post` CASCADE', - string: 'DROP TABLE `post` CASCADE' - }, - oracle: { - text : 'DROP TABLE "post" CASCADE CONSTRAINTS', - string: 'DROP TABLE "post" CASCADE CONSTRAINTS' - }, - params: [] -}); - -Harness.test({ - query: post.drop().restrict(), - pg: { - text : 'DROP TABLE "post" RESTRICT', - string: 'DROP TABLE "post" RESTRICT' - }, - sqlite: { - text : 'Sqlite do not support RESTRICT in DROP TABLE', - throws: true - }, - mysql: { - text : 'DROP TABLE `post` RESTRICT', - string: 'DROP TABLE `post` RESTRICT' - }, - oracle: { - text : 'Oracle do not support RESTRICT in DROP TABLE', - throws: true - }, - params: [] -}); diff --git a/test/dialects/drop-table-tests.ts b/test/dialects/drop-table-tests.ts new file mode 100644 index 00000000..f2bdb142 --- /dev/null +++ b/test/dialects/drop-table-tests.ts @@ -0,0 +1,96 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); + +Harness.test({ + query: post.drop(), + pg: { + text: 'DROP TABLE "post"', + string: 'DROP TABLE "post"' + }, + sqlite: { + text: 'DROP TABLE "post"', + string: 'DROP TABLE "post"' + }, + mysql: { + text: 'DROP TABLE `post`', + string: 'DROP TABLE `post`' + }, + mssql: { + text: 'DROP TABLE [post]', + string: 'DROP TABLE [post]' + }, + oracle: { + text: 'DROP TABLE "post"', + string: 'DROP TABLE "post"' + }, + params: [] +}); + +Harness.test({ + query: post.drop().ifExists(), + pg: { + text: 'DROP TABLE IF EXISTS "post"', + string: 'DROP TABLE IF EXISTS "post"' + }, + sqlite: { + text: 'DROP TABLE IF EXISTS "post"', + string: 'DROP TABLE IF EXISTS "post"' + }, + mysql: { + text: 'DROP TABLE IF EXISTS `post`', + string: 'DROP TABLE IF EXISTS `post`' + }, + mssql: { + text: 'IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = [post]) BEGIN DROP TABLE [post] END', + string: 'IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = [post]) BEGIN DROP TABLE [post] END' + }, + oracle: { + text: 'BEGIN EXECUTE IMMEDIATE \'DROP TABLE "post"\'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;', + string: 'BEGIN EXECUTE IMMEDIATE \'DROP TABLE "post"\'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;' + }, + params: [] +}); + +Harness.test({ + query: post.drop().cascade(), + pg: { + text: 'DROP TABLE "post" CASCADE', + string: 'DROP TABLE "post" CASCADE' + }, + sqlite: { + text: 'Sqlite do not support CASCADE in DROP TABLE', + throws: true + }, + mysql: { + text: 'DROP TABLE `post` CASCADE', + string: 'DROP TABLE `post` CASCADE' + }, + oracle: { + text: 'DROP TABLE "post" CASCADE CONSTRAINTS', + string: 'DROP TABLE "post" CASCADE CONSTRAINTS' + }, + params: [] +}); + +Harness.test({ + query: post.drop().restrict(), + pg: { + text: 'DROP TABLE "post" RESTRICT', + string: 'DROP TABLE "post" RESTRICT' + }, + sqlite: { + text: 'Sqlite do not support RESTRICT in DROP TABLE', + throws: true + }, + mysql: { + text: 'DROP TABLE `post` RESTRICT', + string: 'DROP TABLE `post` RESTRICT' + }, + oracle: { + text: 'Oracle do not support RESTRICT in DROP TABLE', + throws: true + }, + params: [] +}); diff --git a/test/dialects/for-share-tests.js b/test/dialects/for-share-tests.js deleted file mode 100644 index 4b9627fa..00000000 --- a/test/dialects/for-share-tests.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var user = Harness.defineUserTable(); - -Harness.test({ - query: post.select(post.star()).forShare(), - pg: { - text : 'SELECT "post".* FROM "post" FOR SHARE', - string: 'SELECT "post".* FROM "post" FOR SHARE' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.star()).from(post.join(user).on(user.id.equals(post.userId))).where(post.content.equals('foo')).forShare(), - pg: { - text : 'SELECT "post".* FROM "post" INNER JOIN "user" ON ("user"."id" = "post"."userId") WHERE ("post"."content" = $1) FOR SHARE', - string: 'SELECT "post".* FROM "post" INNER JOIN "user" ON ("user"."id" = "post"."userId") WHERE ("post"."content" = \'foo\') FOR SHARE' - }, - params: ["foo"] -}); diff --git a/test/dialects/for-share-tests.ts b/test/dialects/for-share-tests.ts new file mode 100644 index 00000000..2ebba21c --- /dev/null +++ b/test/dialects/for-share-tests.ts @@ -0,0 +1,28 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); + +Harness.test({ + query: post.select(post.star()).forShare(), + pg: { + text: 'SELECT "post".* FROM "post" FOR SHARE', + string: 'SELECT "post".* FROM "post" FOR SHARE' + }, + params: [] +}); + +Harness.test({ + query: post + .select(post.star()) + .from(post.join(user).on(user.id.equals(post.userId))) + .where(post.content.equals('foo')) + .forShare(), + pg: { + text: 'SELECT "post".* FROM "post" INNER JOIN "user" ON ("user"."id" = "post"."userId") WHERE ("post"."content" = $1) FOR SHARE', + string: + 'SELECT "post".* FROM "post" INNER JOIN "user" ON ("user"."id" = "post"."userId") WHERE ("post"."content" = \'foo\') FOR SHARE' + }, + params: ['foo'] +}); diff --git a/test/dialects/for-update-tests.js b/test/dialects/for-update-tests.js deleted file mode 100644 index 19a01e20..00000000 --- a/test/dialects/for-update-tests.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var user = Harness.defineUserTable(); - -Harness.test({ - query: post.select(post.star()).forUpdate(), - pg: { - text : 'SELECT "post".* FROM "post" FOR UPDATE', - string: 'SELECT "post".* FROM "post" FOR UPDATE' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` FOR UPDATE', - string: 'SELECT `post`.* FROM `post` FOR UPDATE' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.star()).from(post.join(user).on(user.id.equals(post.userId))).where(post.content.equals('foo')).forUpdate(), - pg: { - text : 'SELECT "post".* FROM "post" INNER JOIN "user" ON ("user"."id" = "post"."userId") WHERE ("post"."content" = $1) FOR UPDATE', - string: 'SELECT "post".* FROM "post" INNER JOIN "user" ON ("user"."id" = "post"."userId") WHERE ("post"."content" = \'foo\') FOR UPDATE' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` INNER JOIN `user` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`content` = ?) FOR UPDATE', - string: 'SELECT `post`.* FROM `post` INNER JOIN `user` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`content` = \'foo\') FOR UPDATE' - }, - params: ["foo"] -}); diff --git a/test/dialects/for-update-tests.ts b/test/dialects/for-update-tests.ts new file mode 100644 index 00000000..9377e439 --- /dev/null +++ b/test/dialects/for-update-tests.ts @@ -0,0 +1,37 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); + +Harness.test({ + query: post.select(post.star()).forUpdate(), + pg: { + text: 'SELECT "post".* FROM "post" FOR UPDATE', + string: 'SELECT "post".* FROM "post" FOR UPDATE' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` FOR UPDATE', + string: 'SELECT `post`.* FROM `post` FOR UPDATE' + }, + params: [] +}); + +Harness.test({ + query: post + .select(post.star()) + .from(post.join(user).on(user.id.equals(post.userId))) + .where(post.content.equals('foo')) + .forUpdate(), + pg: { + text: 'SELECT "post".* FROM "post" INNER JOIN "user" ON ("user"."id" = "post"."userId") WHERE ("post"."content" = $1) FOR UPDATE', + string: + 'SELECT "post".* FROM "post" INNER JOIN "user" ON ("user"."id" = "post"."userId") WHERE ("post"."content" = \'foo\') FOR UPDATE' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` INNER JOIN `user` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`content` = ?) FOR UPDATE', + string: + "SELECT `post`.* FROM `post` INNER JOIN `user` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`content` = 'foo') FOR UPDATE" + }, + params: ['foo'] +}); diff --git a/test/dialects/from-clause-tests.js b/test/dialects/from-clause-tests.js deleted file mode 100644 index 673087db..00000000 --- a/test/dialects/from-clause-tests.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); -var post = Harness.definePostTable(); - -Harness.test({ - query: user.select(user.star()).from(user).from(post), - pg: { - text : 'SELECT "user".* FROM "user" , "post"', - string: 'SELECT "user".* FROM "user" , "post"' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" , "post"', - string: 'SELECT "user".* FROM "user" , "post"' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` , `post`', - string: 'SELECT `user`.* FROM `user` , `post`' - }, - mssql: { - text : 'SELECT [user].* FROM [user] , [post]', - string: 'SELECT [user].* FROM [user] , [post]' - }, - oracle: { - text : 'SELECT "user".* FROM "user" , "post"', - string: 'SELECT "user".* FROM "user" , "post"' - } -}); - -Harness.test({ - query: user.select(user.star(), post.star()).from(user).from(post), - pg: { - text : 'SELECT "user".*, "post".* FROM "user" , "post"', - string: 'SELECT "user".*, "post".* FROM "user" , "post"' - }, - sqlite: { - text : 'SELECT "user".*, "post".* FROM "user" , "post"', - string: 'SELECT "user".*, "post".* FROM "user" , "post"' - }, - mysql: { - text : 'SELECT `user`.*, `post`.* FROM `user` , `post`', - string: 'SELECT `user`.*, `post`.* FROM `user` , `post`' - }, - mssql: { - text : 'SELECT [user].*, [post].* FROM [user] , [post]', - string: 'SELECT [user].*, [post].* FROM [user] , [post]' - }, - oracle: { - text : 'SELECT "user".*, "post".* FROM "user" , "post"', - string: 'SELECT "user".*, "post".* FROM "user" , "post"' - } -}); - -Harness.test({ - query: user.select(user.star()).from(user, post), - pg: { - text : 'SELECT "user".* FROM "user" , "post"', - string: 'SELECT "user".* FROM "user" , "post"' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" , "post"', - string: 'SELECT "user".* FROM "user" , "post"' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` , `post`', - string: 'SELECT `user`.* FROM `user` , `post`' - }, - oracle: { - text : 'SELECT "user".* FROM "user" , "post"', - string: 'SELECT "user".* FROM "user" , "post"' - } -}); - -Harness.test({ - query: user.select(user.star()).from([user, post]), - pg: { - text : 'SELECT "user".* FROM "user" , "post"', - string: 'SELECT "user".* FROM "user" , "post"' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" , "post"', - string: 'SELECT "user".* FROM "user" , "post"' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` , `post`', - string: 'SELECT `user`.* FROM `user` , `post`' - }, - oracle: { - text : 'SELECT "user".* FROM "user" , "post"', - string: 'SELECT "user".* FROM "user" , "post"' - } -}); \ No newline at end of file diff --git a/test/dialects/from-clause-tests.ts b/test/dialects/from-clause-tests.ts new file mode 100644 index 00000000..12d93e18 --- /dev/null +++ b/test/dialects/from-clause-tests.ts @@ -0,0 +1,99 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); + +Harness.test({ + query: user + .select(user.star()) + .from(user) + .from(post), + pg: { + text: 'SELECT "user".* FROM "user" , "post"', + string: 'SELECT "user".* FROM "user" , "post"' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" , "post"', + string: 'SELECT "user".* FROM "user" , "post"' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` , `post`', + string: 'SELECT `user`.* FROM `user` , `post`' + }, + mssql: { + text: 'SELECT [user].* FROM [user] , [post]', + string: 'SELECT [user].* FROM [user] , [post]' + }, + oracle: { + text: 'SELECT "user".* FROM "user" , "post"', + string: 'SELECT "user".* FROM "user" , "post"' + } +}); + +Harness.test({ + query: user + .select(user.star(), post.star()) + .from(user) + .from(post), + pg: { + text: 'SELECT "user".*, "post".* FROM "user" , "post"', + string: 'SELECT "user".*, "post".* FROM "user" , "post"' + }, + sqlite: { + text: 'SELECT "user".*, "post".* FROM "user" , "post"', + string: 'SELECT "user".*, "post".* FROM "user" , "post"' + }, + mysql: { + text: 'SELECT `user`.*, `post`.* FROM `user` , `post`', + string: 'SELECT `user`.*, `post`.* FROM `user` , `post`' + }, + mssql: { + text: 'SELECT [user].*, [post].* FROM [user] , [post]', + string: 'SELECT [user].*, [post].* FROM [user] , [post]' + }, + oracle: { + text: 'SELECT "user".*, "post".* FROM "user" , "post"', + string: 'SELECT "user".*, "post".* FROM "user" , "post"' + } +}); + +Harness.test({ + query: user.select(user.star()).from(user, post), + pg: { + text: 'SELECT "user".* FROM "user" , "post"', + string: 'SELECT "user".* FROM "user" , "post"' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" , "post"', + string: 'SELECT "user".* FROM "user" , "post"' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` , `post`', + string: 'SELECT `user`.* FROM `user` , `post`' + }, + oracle: { + text: 'SELECT "user".* FROM "user" , "post"', + string: 'SELECT "user".* FROM "user" , "post"' + } +}); + +Harness.test({ + query: user.select(user.star()).from([user, post]), + pg: { + text: 'SELECT "user".* FROM "user" , "post"', + string: 'SELECT "user".* FROM "user" , "post"' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" , "post"', + string: 'SELECT "user".* FROM "user" , "post"' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` , `post`', + string: 'SELECT `user`.* FROM `user` , `post`' + }, + oracle: { + text: 'SELECT "user".* FROM "user" , "post"', + string: 'SELECT "user".* FROM "user" , "post"' + } +}); diff --git a/test/dialects/function-tests.js b/test/dialects/function-tests.js deleted file mode 100644 index 702d8c63..00000000 --- a/test/dialects/function-tests.js +++ /dev/null @@ -1,82 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var Sql = require('../../lib'); - -var post = Harness.definePostTable(); - -Harness.test({ - query: post.select(Sql.functions.LENGTH(post.content)), - pg: { - text : 'SELECT LENGTH("post"."content") FROM "post"', - string: 'SELECT LENGTH("post"."content") FROM "post"' - }, - sqlite: { - text : 'SELECT LENGTH("post"."content") FROM "post"', - string: 'SELECT LENGTH("post"."content") FROM "post"' - }, - mysql: { - text : 'SELECT LENGTH(`post`.`content`) FROM `post`', - string: 'SELECT LENGTH(`post`.`content`) FROM `post`' - }, - mssql: { - text : 'SELECT LEN([post].[content]) FROM [post]', - string: 'SELECT LEN([post].[content]) FROM [post]' - }, - oracle: { - text : 'SELECT LENGTH("post"."content") FROM "post"', - string: 'SELECT LENGTH("post"."content") FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(Sql.functions.LEFT(post.content,4)), - pg: { - text : 'SELECT LEFT("post"."content", $1) FROM "post"', - string: 'SELECT LEFT("post"."content", 4) FROM "post"' - }, - sqlite: { - text : 'SELECT SUBSTR("post"."content", 1, $1) FROM "post"', - string: 'SELECT SUBSTR("post"."content", 1, 4) FROM "post"' - }, - mysql: { - text : 'SELECT LEFT(`post`.`content`, ?) FROM `post`', - string: 'SELECT LEFT(`post`.`content`, 4) FROM `post`' - }, - mssql: { - text : 'SELECT LEFT([post].[content], @1) FROM [post]', - string: 'SELECT LEFT([post].[content], 4) FROM [post]' - }, - oracle: { - text : 'SELECT LEFT("post"."content", :1) FROM "post"', - string: 'SELECT LEFT("post"."content", 4) FROM "post"' - }, - params: [4] -}); - -Harness.test({ - query: post.select(Sql.functions.RIGHT(post.content,4)), - pg: { - text : 'SELECT RIGHT("post"."content", $1) FROM "post"', - string: 'SELECT RIGHT("post"."content", 4) FROM "post"' - }, - sqlite: { - text : 'SELECT SUBSTR("post"."content", -$1) FROM "post"', - string: 'SELECT SUBSTR("post"."content", -4) FROM "post"' - }, - mysql: { - text : 'SELECT RIGHT(`post`.`content`, ?) FROM `post`', - string: 'SELECT RIGHT(`post`.`content`, 4) FROM `post`' - }, - mssql: { - text : 'SELECT RIGHT([post].[content], @1) FROM [post]', - string: 'SELECT RIGHT([post].[content], 4) FROM [post]' - }, - oracle: { - text : 'SELECT RIGHT("post"."content", :1) FROM "post"', - string: 'SELECT RIGHT("post"."content", 4) FROM "post"' - }, - params: [4] -}); - diff --git a/test/dialects/function-tests.ts b/test/dialects/function-tests.ts new file mode 100644 index 00000000..15cff372 --- /dev/null +++ b/test/dialects/function-tests.ts @@ -0,0 +1,81 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const post = Harness.definePostTable(); +const instance = new Sql('postgres'); + +Harness.test({ + query: post.select(instance.functions.LENGTH(post.content)), + pg: { + text: 'SELECT LENGTH("post"."content") FROM "post"', + string: 'SELECT LENGTH("post"."content") FROM "post"' + }, + sqlite: { + text: 'SELECT LENGTH("post"."content") FROM "post"', + string: 'SELECT LENGTH("post"."content") FROM "post"' + }, + mysql: { + text: 'SELECT LENGTH(`post`.`content`) FROM `post`', + string: 'SELECT LENGTH(`post`.`content`) FROM `post`' + }, + mssql: { + text: 'SELECT LEN([post].[content]) FROM [post]', + string: 'SELECT LEN([post].[content]) FROM [post]' + }, + oracle: { + text: 'SELECT LENGTH("post"."content") FROM "post"', + string: 'SELECT LENGTH("post"."content") FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(instance.functions.LEFT(post.content, 4)), + pg: { + text: 'SELECT LEFT("post"."content", $1) FROM "post"', + string: 'SELECT LEFT("post"."content", 4) FROM "post"' + }, + sqlite: { + text: 'SELECT SUBSTR("post"."content", 1, $1) FROM "post"', + string: 'SELECT SUBSTR("post"."content", 1, 4) FROM "post"' + }, + mysql: { + text: 'SELECT LEFT(`post`.`content`, ?) FROM `post`', + string: 'SELECT LEFT(`post`.`content`, 4) FROM `post`' + }, + mssql: { + text: 'SELECT LEFT([post].[content], @1) FROM [post]', + string: 'SELECT LEFT([post].[content], 4) FROM [post]' + }, + oracle: { + text: 'SELECT LEFT("post"."content", :1) FROM "post"', + string: 'SELECT LEFT("post"."content", 4) FROM "post"' + }, + params: [4] +}); + +Harness.test({ + query: post.select(instance.functions.RIGHT(post.content, 4)), + pg: { + text: 'SELECT RIGHT("post"."content", $1) FROM "post"', + string: 'SELECT RIGHT("post"."content", 4) FROM "post"' + }, + sqlite: { + text: 'SELECT SUBSTR("post"."content", -$1) FROM "post"', + string: 'SELECT SUBSTR("post"."content", -4) FROM "post"' + }, + mysql: { + text: 'SELECT RIGHT(`post`.`content`, ?) FROM `post`', + string: 'SELECT RIGHT(`post`.`content`, 4) FROM `post`' + }, + mssql: { + text: 'SELECT RIGHT([post].[content], @1) FROM [post]', + string: 'SELECT RIGHT([post].[content], 4) FROM [post]' + }, + oracle: { + text: 'SELECT RIGHT("post"."content", :1) FROM "post"', + string: 'SELECT RIGHT("post"."content", 4) FROM "post"' + }, + params: [4] +}); diff --git a/test/dialects/group-by-tests.js b/test/dialects/group-by-tests.js deleted file mode 100644 index 673b5639..00000000 --- a/test/dialects/group-by-tests.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); - -Harness.test({ - query: post.select(post.content).group(post.userId), - pg: { - text : 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"', - string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"', - string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`', - string: 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId]', - string: 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId]' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"', - string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).group(post.userId, post.id), - pg: { - text : 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', - string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', - string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`, `post`.`id`', - string: 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`, `post`.`id`' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId], [post].[id]', - string: 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId], [post].[id]' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', - string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content.arrayAgg()).group(post.userId), - pg: { - text : 'SELECT array_agg("post"."content") AS "contents" FROM "post" GROUP BY "post"."userId"', - string: 'SELECT array_agg("post"."content") AS "contents" FROM "post" GROUP BY "post"."userId"' - }, - sqlite: { - text : 'SELECT GROUP_CONCAT("post"."content") AS "contents" FROM "post" GROUP BY "post"."userId"', - string: 'SELECT GROUP_CONCAT("post"."content") AS "contents" FROM "post" GROUP BY "post"."userId"' - }, - mysql: { - text : 'SELECT GROUP_CONCAT(`post`.`content`) AS `contents` FROM `post` GROUP BY `post`.`userId`', - string: 'SELECT GROUP_CONCAT(`post`.`content`) AS `contents` FROM `post` GROUP BY `post`.`userId`' - }, - mssql: { - text : 'SQL Server does not support array_agg.', - throws: true - }, - oracle: { - text : 'Oracle does not support array_agg.', - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content.arrayAgg('post contents')).group(post.userId), - pg: { - text : 'SELECT array_agg("post"."content") AS "post contents" FROM "post" GROUP BY "post"."userId"', - string: 'SELECT array_agg("post"."content") AS "post contents" FROM "post" GROUP BY "post"."userId"' - }, - sqlite: { - text : 'SELECT GROUP_CONCAT("post"."content") AS "post contents" FROM "post" GROUP BY "post"."userId"', - string: 'SELECT GROUP_CONCAT("post"."content") AS "post contents" FROM "post" GROUP BY "post"."userId"' - }, - mysql: { - text : 'SELECT GROUP_CONCAT(`post`.`content`) AS `post contents` FROM `post` GROUP BY `post`.`userId`', - string: 'SELECT GROUP_CONCAT(`post`.`content`) AS `post contents` FROM `post` GROUP BY `post`.`userId`' - }, - mssql: { - text : 'SQL Server does not support array_agg.', - throws: true - }, - oracle: { - text : 'Oracle does not support array_agg.', - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).group([post.userId, post.id]), - pg: { - text : 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', - string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', - string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`, `post`.`id`', - string: 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`, `post`.`id`' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId], [post].[id]', - string: 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId], [post].[id]' - }, - oracel: { - text : 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', - string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' - }, - params: [] -}); diff --git a/test/dialects/group-by-tests.ts b/test/dialects/group-by-tests.ts new file mode 100644 index 00000000..8234f62d --- /dev/null +++ b/test/dialects/group-by-tests.ts @@ -0,0 +1,129 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); + +Harness.test({ + query: post.select(post.content).group(post.userId), + pg: { + text: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"', + string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"', + string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`', + string: 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId]', + string: 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId]' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"', + string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).group(post.userId, post.id), + pg: { + text: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', + string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', + string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`, `post`.`id`', + string: 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`, `post`.`id`' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId], [post].[id]', + string: 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId], [post].[id]' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', + string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content.arrayAgg()).group(post.userId), + pg: { + text: 'SELECT array_agg("post"."content") AS "contents" FROM "post" GROUP BY "post"."userId"', + string: 'SELECT array_agg("post"."content") AS "contents" FROM "post" GROUP BY "post"."userId"' + }, + sqlite: { + text: 'SELECT GROUP_CONCAT("post"."content") AS "contents" FROM "post" GROUP BY "post"."userId"', + string: 'SELECT GROUP_CONCAT("post"."content") AS "contents" FROM "post" GROUP BY "post"."userId"' + }, + mysql: { + text: 'SELECT GROUP_CONCAT(`post`.`content`) AS `contents` FROM `post` GROUP BY `post`.`userId`', + string: 'SELECT GROUP_CONCAT(`post`.`content`) AS `contents` FROM `post` GROUP BY `post`.`userId`' + }, + mssql: { + text: 'SQL Server does not support array_agg.', + throws: true + }, + oracle: { + text: 'Oracle does not support array_agg.', + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content.arrayAgg('post contents')).group(post.userId), + pg: { + text: 'SELECT array_agg("post"."content") AS "post contents" FROM "post" GROUP BY "post"."userId"', + string: 'SELECT array_agg("post"."content") AS "post contents" FROM "post" GROUP BY "post"."userId"' + }, + sqlite: { + text: 'SELECT GROUP_CONCAT("post"."content") AS "post contents" FROM "post" GROUP BY "post"."userId"', + string: 'SELECT GROUP_CONCAT("post"."content") AS "post contents" FROM "post" GROUP BY "post"."userId"' + }, + mysql: { + text: 'SELECT GROUP_CONCAT(`post`.`content`) AS `post contents` FROM `post` GROUP BY `post`.`userId`', + string: 'SELECT GROUP_CONCAT(`post`.`content`) AS `post contents` FROM `post` GROUP BY `post`.`userId`' + }, + mssql: { + text: 'SQL Server does not support array_agg.', + throws: true + }, + oracle: { + text: 'Oracle does not support array_agg.', + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).group([post.userId, post.id]), + pg: { + text: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', + string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', + string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`, `post`.`id`', + string: 'SELECT `post`.`content` FROM `post` GROUP BY `post`.`userId`, `post`.`id`' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId], [post].[id]', + string: 'SELECT [post].[content] FROM [post] GROUP BY [post].[userId], [post].[id]' + }, + oracel: { + text: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"', + string: 'SELECT "post"."content" FROM "post" GROUP BY "post"."userId", "post"."id"' + }, + params: [] +}); diff --git a/test/dialects/having-tests.js b/test/dialects/having-tests.js deleted file mode 100644 index 5f8f9cc7..00000000 --- a/test/dialects/having-tests.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); - -Harness.test({ - query : post.select(post.userId, post.content.count()).group(post.userId).having(post.userId.gt(10)), - pg : { - text : 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1)', - string: 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10)' - }, - sqlite: { - text : 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1)', - string: 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10)' - }, - mysql : { - text : 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > ?)', - string: 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > 10)' - }, - mssql : { - text : 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > @1)', - string: 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > 10)' - }, - oracle: { - text : 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > :1)', - string: 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10)' - }, - params: [10] -}); - -Harness.test({ - query : post.select(post.userId, post.content.count()).group(post.userId).having(post.userId.gt(10), post.userId.lt(100)), - pg : { - text : 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)', - string: 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' - }, - sqlite: { - text : 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)', - string: 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' - }, - mysql : { - text : 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > ?) AND (`post`.`userId` < ?)', - string: 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > 10) AND (`post`.`userId` < 100)' - }, - mssql : { - text : 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > @1) AND ([post].[userId] < @2)', - string: 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > 10) AND ([post].[userId] < 100)' - }, - oracle: { - text : 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > :1) AND ("post"."userId" < :2)', - string: 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' - }, - params: [10, 100] -}); - -Harness.test({ - query : post.select(post.userId, post.content.count()).group(post.userId).having([post.userId.gt(10), post.userId.lt(100)]), - pg : { - text : 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)', - string: 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' - }, - sqlite: { - text : 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)', - string: 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' - }, - mysql : { - text : 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > ?) AND (`post`.`userId` < ?)', - string: 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > 10) AND (`post`.`userId` < 100)' - }, - mssql : { - text : 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > @1) AND ([post].[userId] < @2)', - string: 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > 10) AND ([post].[userId] < 100)' - }, - oracle: { - text : 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > :1) AND ("post"."userId" < :2)', - string: 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' - }, - params: [10, 100] -}); diff --git a/test/dialects/having-tests.ts b/test/dialects/having-tests.ts new file mode 100644 index 00000000..80558f21 --- /dev/null +++ b/test/dialects/having-tests.ts @@ -0,0 +1,118 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); + +Harness.test({ + query: post + .select(post.userId, post.content.count()) + .group(post.userId) + .having(post.userId.gt(10)), + pg: { + text: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1)', + string: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10)' + }, + sqlite: { + text: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1)', + string: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10)' + }, + mysql: { + text: + 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > ?)', + string: + 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > 10)' + }, + mssql: { + text: + 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > @1)', + string: + 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > 10)' + }, + oracle: { + text: + 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > :1)', + string: + 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10)' + }, + params: [10] +}); + +Harness.test({ + query: post + .select(post.userId, post.content.count()) + .group(post.userId) + .having(post.userId.gt(10), post.userId.lt(100)), + pg: { + text: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)', + string: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' + }, + sqlite: { + text: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)', + string: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' + }, + mysql: { + text: + 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > ?) AND (`post`.`userId` < ?)', + string: + 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > 10) AND (`post`.`userId` < 100)' + }, + mssql: { + text: + 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > @1) AND ([post].[userId] < @2)', + string: + 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > 10) AND ([post].[userId] < 100)' + }, + oracle: { + text: + 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > :1) AND ("post"."userId" < :2)', + string: + 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' + }, + params: [10, 100] +}); + +Harness.test({ + query: post + .select(post.userId, post.content.count()) + .group(post.userId) + .having([post.userId.gt(10), post.userId.lt(100)]), + pg: { + text: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)', + string: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' + }, + sqlite: { + text: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > $1) AND ("post"."userId" < $2)', + string: + 'SELECT "post"."userId", COUNT("post"."content") AS "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' + }, + mysql: { + text: + 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > ?) AND (`post`.`userId` < ?)', + string: + 'SELECT `post`.`userId`, COUNT(`post`.`content`) AS `content_count` FROM `post` GROUP BY `post`.`userId` HAVING (`post`.`userId` > 10) AND (`post`.`userId` < 100)' + }, + mssql: { + text: + 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > @1) AND ([post].[userId] < @2)', + string: + 'SELECT [post].[userId], COUNT([post].[content]) AS [content_count] FROM [post] GROUP BY [post].[userId] HAVING ([post].[userId] > 10) AND ([post].[userId] < 100)' + }, + oracle: { + text: + 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > :1) AND ("post"."userId" < :2)', + string: + 'SELECT "post"."userId", COUNT("post"."content") "content_count" FROM "post" GROUP BY "post"."userId" HAVING ("post"."userId" > 10) AND ("post"."userId" < 100)' + }, + params: [10, 100] +}); diff --git a/test/dialects/hstore-tests.js b/test/dialects/hstore-tests.js deleted file mode 100644 index 54ba2d22..00000000 --- a/test/dialects/hstore-tests.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var Sql = require('../../lib').setDialect('postgres'); - -Harness.test({ - query: customer.update({ - metadata: customer.metadata.concat(Sql.functions.HSTORE('age', 20)) - }), - pg: { - text : 'UPDATE "customer" SET "metadata" = ("customer"."metadata" || HSTORE($1, $2))', - string: 'UPDATE "customer" SET "metadata" = ("customer"."metadata" || HSTORE(\'age\', 20))' - }, - params: ['age', 20] -}); - -Harness.test({ - query: customer.select(customer.metadata.key('age')), - pg: { - text : 'SELECT ("customer"."metadata" -> $1) FROM "customer"', - string: 'SELECT ("customer"."metadata" -> \'age\') FROM "customer"' - }, - params: ['age'] -}); diff --git a/test/dialects/hstore-tests.ts b/test/dialects/hstore-tests.ts new file mode 100644 index 00000000..52a3815c --- /dev/null +++ b/test/dialects/hstore-tests.ts @@ -0,0 +1,26 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const customer = Harness.defineCustomerTable(); +const instance = new Sql('postgres'); + +Harness.test({ + query: customer.update({ + metadata: customer.metadata.concat(instance.functions.HSTORE('age', 20)) + }), + pg: { + text: 'UPDATE "customer" SET "metadata" = ("customer"."metadata" || HSTORE($1, $2))', + string: 'UPDATE "customer" SET "metadata" = ("customer"."metadata" || HSTORE(\'age\', 20))' + }, + params: ['age', 20] +}); + +Harness.test({ + query: customer.select(customer.metadata.key('age')), + pg: { + text: 'SELECT ("customer"."metadata" -> $1) FROM "customer"', + string: 'SELECT ("customer"."metadata" -> \'age\') FROM "customer"' + }, + params: ['age'] +}); diff --git a/test/dialects/ilike-tests.js b/test/dialects/ilike-tests.js deleted file mode 100644 index aba487ee..00000000 --- a/test/dialects/ilike-tests.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var user = Harness.defineUserTable(); -var Sql = require('../../lib').setDialect('postgres'); - -Harness.test({ - query: post.select(post.content, post.userId).where(post.content.ilike('A%')), - pg: { - text : 'SELECT "post"."content", "post"."userId" FROM "post" WHERE ("post"."content" ILIKE $1)', - string: 'SELECT "post"."content", "post"."userId" FROM "post" WHERE ("post"."content" ILIKE \'A%\')' - }, - params: ['A%'] -}); - -Harness.test({ - query: post.insert(post.content, post.userId) - .select('\'test\'', user.id).from(user).where(user.name.ilike('A%')), - pg: { - text : 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" ILIKE $1)', - string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" ILIKE \'A%\')' - }, - params: ['A%'] -}); - -Harness.test({ - query: post.insert([post.content, post.userId]) - .select('\'test\'', user.id).from(user).where(user.name.ilike('A%')), - pg: { - text : 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" ILIKE $1)', - string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" ILIKE \'A%\')' - }, - params: ['A%'] -}); - -Harness.test({ - query: post.insert(post.userId) - .select(user.id).from(user).where(user.name.ilike('A%')), - pg: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" ILIKE $1)', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" ILIKE \'A%\')' - }, - params: ['A%'] -}); diff --git a/test/dialects/ilike-tests.ts b/test/dialects/ilike-tests.ts new file mode 100644 index 00000000..e558c394 --- /dev/null +++ b/test/dialects/ilike-tests.ts @@ -0,0 +1,53 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); + +Harness.test({ + query: post.select(post.content, post.userId).where(post.content.ilike('A%')), + pg: { + text: 'SELECT "post"."content", "post"."userId" FROM "post" WHERE ("post"."content" ILIKE $1)', + string: 'SELECT "post"."content", "post"."userId" FROM "post" WHERE ("post"."content" ILIKE \'A%\')' + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .insert(post.content, post.userId) + .select("'test'", user.id) + .from(user) + .where(user.name.ilike('A%')), + pg: { + text: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" ILIKE $1)', + string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" ILIKE \'A%\')' + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .insert([post.content, post.userId]) + .select("'test'", user.id) + .from(user) + .where(user.name.ilike('A%')), + pg: { + text: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" ILIKE $1)', + string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" ILIKE \'A%\')' + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .insert(post.userId) + .select(user.id) + .from(user) + .where(user.name.ilike('A%')), + pg: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" ILIKE $1)', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" ILIKE \'A%\')' + }, + params: ['A%'] +}); diff --git a/test/dialects/in-clause-tests.js b/test/dialects/in-clause-tests.js deleted file mode 100644 index 513c7243..00000000 --- a/test/dialects/in-clause-tests.js +++ /dev/null @@ -1,179 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); - -Harness.test({ - query: post.select(post.star()).where(post.id.in([])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE (1=0)', - string: 'SELECT "post".* FROM "post" WHERE (1=0)' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE (1=0)', - string: 'SELECT "post".* FROM "post" WHERE (1=0)' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (1=0)', - string: 'SELECT `post`.* FROM `post` WHERE (1=0)' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE (1=0)', - string: 'SELECT [post].* FROM [post] WHERE (1=0)' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE (1=0)', - string: 'SELECT "post".* FROM "post" WHERE (1=0)' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.in([1])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1))' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1))' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (?))', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (1))' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (@1))', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (1))' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (:1))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1))' - }, - params: [1] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.in([null])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NULL)', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NULL)' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NULL)', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NULL)' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.in([1, 2])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2))' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2))' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (?, ?))', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (1, 2))' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (@1, @2))', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (1, 2))' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (:1, :2))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2))' - }, - params: [1, 2] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.in([null, null])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NULL)', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NULL)' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NULL)', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NULL)' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.in([1, null, 2])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2) OR "post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2) OR "post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (?, ?) OR `post`.`id` IS NULL)', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (1, 2) OR `post`.`id` IS NULL)' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (@1, @2) OR [post].[id] IS NULL)', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (1, 2) OR [post].[id] IS NULL)' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (:1, :2) OR "post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' - }, - params: [1, 2] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.in([1, null, 2, null])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2) OR "post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2) OR "post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (?, ?) OR `post`.`id` IS NULL)', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (1, 2) OR `post`.`id` IS NULL)' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (@1, @2) OR [post].[id] IS NULL)', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (1, 2) OR [post].[id] IS NULL)' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (:1, :2) OR "post"."id" IS NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' - }, - params: [1, 2] -}); diff --git a/test/dialects/in-clause-tests.ts b/test/dialects/in-clause-tests.ts new file mode 100644 index 00000000..d51a5dfc --- /dev/null +++ b/test/dialects/in-clause-tests.ts @@ -0,0 +1,179 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); + +Harness.test({ + query: post.select(post.star()).where(post.id.in([])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE (1=0)', + string: 'SELECT "post".* FROM "post" WHERE (1=0)' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE (1=0)', + string: 'SELECT "post".* FROM "post" WHERE (1=0)' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (1=0)', + string: 'SELECT `post`.* FROM `post` WHERE (1=0)' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE (1=0)', + string: 'SELECT [post].* FROM [post] WHERE (1=0)' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE (1=0)', + string: 'SELECT "post".* FROM "post" WHERE (1=0)' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.in([1])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1))' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1))' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (?))', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (1))' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (@1))', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (1))' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (:1))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1))' + }, + params: [1] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.in([null])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NULL)', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NULL)' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NULL)', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NULL)' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.in([1, 2])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2))' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2))' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (?, ?))', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (1, 2))' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (@1, @2))', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (1, 2))' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (:1, :2))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2))' + }, + params: [1, 2] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.in([null, null])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NULL)', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NULL)' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NULL)', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NULL)' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NULL)' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.in([1, null, 2])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2) OR "post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2) OR "post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (?, ?) OR `post`.`id` IS NULL)', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (1, 2) OR `post`.`id` IS NULL)' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (@1, @2) OR [post].[id] IS NULL)', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (1, 2) OR [post].[id] IS NULL)' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (:1, :2) OR "post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' + }, + params: [1, 2] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.in([1, null, 2, null])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2) OR "post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN ($1, $2) OR "post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (?, ?) OR `post`.`id` IS NULL)', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IN (1, 2) OR `post`.`id` IS NULL)' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (@1, @2) OR [post].[id] IS NULL)', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IN (1, 2) OR [post].[id] IS NULL)' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (:1, :2) OR "post"."id" IS NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IN (1, 2) OR "post"."id" IS NULL)' + }, + params: [1, 2] +}); diff --git a/test/dialects/index.js b/test/dialects/index.ts similarity index 100% rename from test/dialects/index.js rename to test/dialects/index.ts diff --git a/test/dialects/indexes-tests.js b/test/dialects/indexes-tests.js deleted file mode 100644 index 86b50449..00000000 --- a/test/dialects/indexes-tests.js +++ /dev/null @@ -1,235 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); - -Harness.test({ - query: post.indexes(), - pg: { - text : 'SELECT relname FROM pg_class WHERE oid IN ( SELECT indexrelid FROM pg_index, pg_class WHERE pg_class.relname=\'post\' AND pg_class.relnamespace IN (SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = \'public\') AND pg_class.oid=pg_index.indrelid)', - string: 'SELECT relname FROM pg_class WHERE oid IN ( SELECT indexrelid FROM pg_index, pg_class WHERE pg_class.relname=\'post\' AND pg_class.relnamespace IN (SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = \'public\') AND pg_class.oid=pg_index.indrelid)' - }, - mysql: { - text : 'SHOW INDEX FROM `post`', - string: 'SHOW INDEX FROM `post`' - }, - sqlite: { - text : 'PRAGMA INDEX_LIST("post")', - string: 'PRAGMA INDEX_LIST("post")' - }, - oracle: { - text : 'SELECT * FROM USER_INDEXES WHERE TABLE_NAME = \'post\'', - string: 'SELECT * FROM USER_INDEXES WHERE TABLE_NAME = \'post\'' - }, - params: [] -}); - -Harness.test({ - query: post.indexes().create('index_name').unique().using('btree').on(post.id, post.userId).withParser('foo'), - pg: { - text : 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo', - string: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo' - }, - mysql: { - text : 'CREATE UNIQUE INDEX `index_name` USING BTREE ON `post` (`id`,`userId`) WITH PARSER foo', - string: 'CREATE UNIQUE INDEX `index_name` USING BTREE ON `post` (`id`,`userId`) WITH PARSER foo' - }, - sqlite: { - text : 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo', - string: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo' - }, - oracle: { - text : 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo', - string: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo' - }, - params: [] -}); - -Harness.test({ - query: post.indexes().create().fulltext().on(post.id), - pg: { - text : 'CREATE FULLTEXT INDEX "post_id" ON "post" ("id")', - string: 'CREATE FULLTEXT INDEX "post_id" ON "post" ("id")' - }, - mysql: { - text : 'CREATE FULLTEXT INDEX `post_id` ON `post` (`id`)', - string: 'CREATE FULLTEXT INDEX `post_id` ON `post` (`id`)' - }, - sqlite: { - text : 'CREATE FULLTEXT INDEX "post_id" ON "post" ("id")', - string: 'CREATE FULLTEXT INDEX "post_id" ON "post" ("id")' - }, - params: [] -}); - -Harness.test({ - query: post.indexes().create().spatial().on(post.id), - pg: { - text : 'CREATE SPATIAL INDEX "post_id" ON "post" ("id")', - string: 'CREATE SPATIAL INDEX "post_id" ON "post" ("id")' - }, - mysql: { - text : 'CREATE SPATIAL INDEX `post_id` ON `post` (`id`)', - string: 'CREATE SPATIAL INDEX `post_id` ON `post` (`id`)' - }, - sqlite: { - text : 'CREATE SPATIAL INDEX "post_id" ON "post" ("id")', - string: 'CREATE SPATIAL INDEX "post_id" ON "post" ("id")' - }, - params: [] -}); - -Harness.test({ - query: post.indexes().create().on(post.userId, post.id), - pg: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' - }, - mysql: { - text : 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id`)', - string: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id`)' - }, - sqlite: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' - }, - oracle: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' - }, - params: [] -}); - -Harness.test({ - query: post.indexes().create().on(post.userId).on(post.id), - pg: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' - }, - mysql: { - text : 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id`)', - string: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id`)' - }, - sqlite: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' - }, - oracle: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' - }, - params: [] -}); - -Harness.test({ - query: post.indexes().create().on(post.userId, post.id.desc), - pg: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' - }, - mysql: { - text : 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id` DESC)', - string: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id` DESC)' - }, - sqlite: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' - }, - mssql: { - text : 'CREATE INDEX [post_id_userId] ON [post] ([userId],[id] DESC)', - string: 'CREATE INDEX [post_id_userId] ON [post] ([userId],[id] DESC)' - }, - oracle: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' - }, - params: [] -}); - -Harness.test({ - query: post.indexes().create().on(post.userId).on(post.id.descending), - pg: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' - }, - mysql: { - text : 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id` DESC)', - string: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id` DESC)' - }, - sqlite: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' - }, - mssql: { - text : 'CREATE INDEX [post_id_userId] ON [post] ([userId],[id] DESC)', - string: 'CREATE INDEX [post_id_userId] ON [post] ([userId],[id] DESC)' - }, - oracle: { - text : 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', - string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' - }, - params: [] -}); - - -Harness.test({ - query: post.indexes().create(), - pg: { - text : 'No columns defined!', - throws: true - }, - mysql: { - text : 'No columns defined!', - throws: true - }, - sqlite: { - text : 'No columns defined!', - throws: true - }, - oracle: { - text : 'No columns defined!', - throws: true - } -}); - -Harness.test({ - query: post.indexes().drop('index_name'), - pg: { - text : 'DROP INDEX "public"."index_name"', - string: 'DROP INDEX "public"."index_name"' - }, - mysql: { - text : 'DROP INDEX `public`.`index_name`', - string: 'DROP INDEX `public`.`index_name`' - }, - sqlite: { - text : 'DROP INDEX "public"."index_name"', - string: 'DROP INDEX "public"."index_name"' - }, - oracle: { - text : 'DROP INDEX "index_name"', - string: 'DROP INDEX "index_name"' - }, - params: [] -}); - -Harness.test({ - query: post.indexes().drop(post.userId, post.id), - pg: { - text : 'DROP INDEX "public"."post_id_userId"', - string: 'DROP INDEX "public"."post_id_userId"' - }, - mysql: { - text : 'DROP INDEX `public`.`post_id_userId`', - string: 'DROP INDEX `public`.`post_id_userId`' - }, - sqlite: { - text : 'DROP INDEX "public"."post_id_userId"', - string: 'DROP INDEX "public"."post_id_userId"' - }, - oracle: { - text : 'DROP INDEX "post_id_userId"', - string: 'DROP INDEX "post_id_userId"' - }, - params: [] -}); diff --git a/test/dialects/indexes-tests.ts b/test/dialects/indexes-tests.ts new file mode 100644 index 00000000..bfba637c --- /dev/null +++ b/test/dialects/indexes-tests.ts @@ -0,0 +1,235 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); + +Harness.test({ + query: post.indexes(), + pg: { + text: + "SELECT relname FROM pg_class WHERE oid IN ( SELECT indexrelid FROM pg_index, pg_class WHERE pg_class.relname='post' AND pg_class.relnamespace IN (SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = 'public') AND pg_class.oid=pg_index.indrelid)", + string: + "SELECT relname FROM pg_class WHERE oid IN ( SELECT indexrelid FROM pg_index, pg_class WHERE pg_class.relname='post' AND pg_class.relnamespace IN (SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = 'public') AND pg_class.oid=pg_index.indrelid)" + }, + mysql: { + text: 'SHOW INDEX FROM `post`', + string: 'SHOW INDEX FROM `post`' + }, + sqlite: { + text: 'PRAGMA INDEX_LIST("post")', + string: 'PRAGMA INDEX_LIST("post")' + }, + oracle: { + text: "SELECT * FROM USER_INDEXES WHERE TABLE_NAME = 'post'", + string: "SELECT * FROM USER_INDEXES WHERE TABLE_NAME = 'post'" + }, + params: [] +}); + +Harness.test({ + query: post + .indexes() + .create('index_name') + .unique() + .using('btree') + .on(post.id, post.userId) + .withParser('foo'), + pg: { + text: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo', + string: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo' + }, + mysql: { + text: 'CREATE UNIQUE INDEX `index_name` USING BTREE ON `post` (`id`,`userId`) WITH PARSER foo', + string: 'CREATE UNIQUE INDEX `index_name` USING BTREE ON `post` (`id`,`userId`) WITH PARSER foo' + }, + sqlite: { + text: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo', + string: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo' + }, + oracle: { + text: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo', + string: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo' + }, + params: [] +}); + +Harness.test({ + query: post + .indexes() + .create() + .fulltext() + .on(post.id), + pg: { + text: 'CREATE FULLTEXT INDEX "post_id" ON "post" ("id")', + string: 'CREATE FULLTEXT INDEX "post_id" ON "post" ("id")' + }, + mysql: { + text: 'CREATE FULLTEXT INDEX `post_id` ON `post` (`id`)', + string: 'CREATE FULLTEXT INDEX `post_id` ON `post` (`id`)' + }, + sqlite: { + text: 'CREATE FULLTEXT INDEX "post_id" ON "post" ("id")', + string: 'CREATE FULLTEXT INDEX "post_id" ON "post" ("id")' + }, + params: [] +}); + +Harness.test({ + query: post + .indexes() + .create() + .spatial() + .on(post.id), + pg: { + text: 'CREATE SPATIAL INDEX "post_id" ON "post" ("id")', + string: 'CREATE SPATIAL INDEX "post_id" ON "post" ("id")' + }, + mysql: { + text: 'CREATE SPATIAL INDEX `post_id` ON `post` (`id`)', + string: 'CREATE SPATIAL INDEX `post_id` ON `post` (`id`)' + }, + sqlite: { + text: 'CREATE SPATIAL INDEX "post_id" ON "post" ("id")', + string: 'CREATE SPATIAL INDEX "post_id" ON "post" ("id")' + }, + params: [] +}); + +Harness.test({ + query: post + .indexes() + .create() + .on(post.userId, post.id), + pg: { + text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', + string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' + }, + mysql: { + text: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id`)', + string: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id`)' + }, + sqlite: { + text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', + string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' + }, + oracle: { + text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', + string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' + }, + params: [] +}); + +Harness.test({ + query: post + .indexes() + .create() + .on(post.userId) + .on(post.id), + pg: { + text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', + string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' + }, + mysql: { + text: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id`)', + string: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id`)' + }, + sqlite: { + text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', + string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' + }, + oracle: { + text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")', + string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id")' + }, + params: [] +}); + +Harness.test({ + query: post + .indexes() + .create() + .on(post.userId, post.id.desc), + pg: { + text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', + string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' + }, + mysql: { + text: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id` DESC)', + string: 'CREATE INDEX `post_id_userId` ON `post` (`userId`,`id` DESC)' + }, + sqlite: { + text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', + string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' + }, + mssql: { + text: 'CREATE INDEX [post_id_userId] ON [post] ([userId],[id] DESC)', + string: 'CREATE INDEX [post_id_userId] ON [post] ([userId],[id] DESC)' + }, + oracle: { + text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', + string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' + }, + params: [] +}); + +Harness.test({ + query: post.indexes().create(), + pg: { + text: 'No columns defined!', + throws: true + }, + mysql: { + text: 'No columns defined!', + throws: true + }, + sqlite: { + text: 'No columns defined!', + throws: true + }, + oracle: { + text: 'No columns defined!', + throws: true + } +}); + +Harness.test({ + query: post.indexes().drop('index_name'), + pg: { + text: 'DROP INDEX "public"."index_name"', + string: 'DROP INDEX "public"."index_name"' + }, + mysql: { + text: 'DROP INDEX `public`.`index_name`', + string: 'DROP INDEX `public`.`index_name`' + }, + sqlite: { + text: 'DROP INDEX "public"."index_name"', + string: 'DROP INDEX "public"."index_name"' + }, + oracle: { + text: 'DROP INDEX "index_name"', + string: 'DROP INDEX "index_name"' + }, + params: [] +}); + +Harness.test({ + query: post.indexes().drop(post.userId, post.id), + pg: { + text: 'DROP INDEX "public"."post_id_userId"', + string: 'DROP INDEX "public"."post_id_userId"' + }, + mysql: { + text: 'DROP INDEX `public`.`post_id_userId`', + string: 'DROP INDEX `public`.`post_id_userId`' + }, + sqlite: { + text: 'DROP INDEX "public"."post_id_userId"', + string: 'DROP INDEX "public"."post_id_userId"' + }, + oracle: { + text: 'DROP INDEX "post_id_userId"', + string: 'DROP INDEX "post_id_userId"' + }, + params: [] +}); diff --git a/test/dialects/insert-tests.js b/test/dialects/insert-tests.js deleted file mode 100644 index 60ba6a62..00000000 --- a/test/dialects/insert-tests.js +++ /dev/null @@ -1,1094 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var user = Harness.defineUserTable(); -var contentTable = Harness.defineContentTable(); -var customerAliasTable = Harness.defineCustomerAliasTable(); - -var arrayTable = require('../../lib/table').define({ - name: 'arraytest', - columns: ['id', 'numbers'] -}); - -Harness.test({ - query: post.insert(post.content.value('test'), post.userId.value(1)), - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 1)' - }, - sqlite: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 1)' - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?)', - string: 'INSERT INTO `post` (`content`, `userId`) VALUES (\'test\', 1)' - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 1)' - }, - params: ['test', 1] -}); - -Harness.test({ - query: post.insert(post.content.value('whoah')), - pg: { - text : 'INSERT INTO "post" ("content") VALUES ($1)', - string: 'INSERT INTO "post" ("content") VALUES (\'whoah\')' - }, - sqlite: { - text : 'INSERT INTO "post" ("content") VALUES ($1)', - string: 'INSERT INTO "post" ("content") VALUES (\'whoah\')' - }, - mysql: { - text : 'INSERT INTO `post` (`content`) VALUES (?)', - string: 'INSERT INTO `post` (`content`) VALUES (\'whoah\')' - }, - mssql: { - text : 'INSERT INTO [post] ([content]) VALUES (@1)', - string: 'INSERT INTO [post] ([content]) VALUES (\'whoah\')' - }, - oracle: { - text : 'INSERT INTO "post" ("content") VALUES (:1)', - string: 'INSERT INTO "post" ("content") VALUES (\'whoah\')' - }, - params: ['whoah'] -}); - -Harness.test({ - query: post.insert({length: 0}), - pg: { - text : 'INSERT INTO "post" ("length") VALUES ($1)', - string: 'INSERT INTO "post" ("length") VALUES (0)' - }, - sqlite: { - text : 'INSERT INTO "post" ("length") VALUES ($1)', - string: 'INSERT INTO "post" ("length") VALUES (0)' - }, - mysql: { - text : 'INSERT INTO `post` (`length`) VALUES (?)', - string: 'INSERT INTO `post` (`length`) VALUES (0)' - }, - mssql: { - text : 'INSERT INTO [post] ([length]) VALUES (@1)', - string: 'INSERT INTO [post] ([length]) VALUES (0)' - }, - oracle: { - text : 'INSERT INTO "post" ("length") VALUES (:1)', - string: 'INSERT INTO "post" ("length") VALUES (0)' - }, - params: [0] -}); - -Harness.test({ - query: post.insert({ - content: 'test', - userId: 2 - }), - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2)' - }, - sqlite: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2)' - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?)', - string: 'INSERT INTO `post` (`content`, `userId`) VALUES (\'test\', 2)' - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2)' - }, - params: ['test', 2] -}); - -Harness.test({ - query: post.insert({ - content: post.sql.functions.LOWER('TEST'), - userId: 2 - }), - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (LOWER($1), $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (LOWER(\'TEST\'), 2)' - }, - sqlite: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (LOWER($1), $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (LOWER(\'TEST\'), 2)' - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) VALUES (LOWER(?), ?)', - string: 'INSERT INTO `post` (`content`, `userId`) VALUES (LOWER(\'TEST\'), 2)' - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (LOWER(:1), :2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (LOWER(\'TEST\'), 2)' - }, - params: ['TEST', 2] -}); - -// allow bulk insert -Harness.test({ - query: post.insert([{ - content: 'whoah' - }, { - content: 'hey' - } - ]), - pg: { - text : 'INSERT INTO "post" ("content") VALUES ($1), ($2)', - string: 'INSERT INTO "post" ("content") VALUES (\'whoah\'), (\'hey\')' - }, - sqlite: { - text : 'INSERT INTO "post" ("content") VALUES ($1), ($2)', - string: 'INSERT INTO "post" ("content") VALUES (\'whoah\'), (\'hey\')' - }, - mysql: { - text : 'INSERT INTO `post` (`content`) VALUES (?), (?)', - string: 'INSERT INTO `post` (`content`) VALUES (\'whoah\'), (\'hey\')' - }, - oracle: { - text : 'INSERT INTO "post" ("content") VALUES (:1), (:2)', - string: 'INSERT INTO "post" ("content") VALUES (\'whoah\'), (\'hey\')' - }, - params: ['whoah', 'hey'] -}); - -Harness.test({ - query: post.insert([{ - content: 'whoah', - userId: 1 - }, { - content: 'hey', - userId: 2 - } - ]), - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - sqlite: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?), (?, ?)', - string: 'INSERT INTO `post` (`content`, `userId`) VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2), (:3, :4)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - params: ['whoah', 1, 'hey', 2] -}); - -// consistent order -Harness.test({ - query: post.insert([{ - content: 'whoah', - userId: 1 - }, { - userId: 2, - content: 'hey' - } - ]), - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - sqlite: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?), (?, ?)', - string: 'INSERT INTO `post` (`content`, `userId`) VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - mssql: { - text : 'INSERT INTO [post] ([content], [userId]) VALUES (@1, @2), (@3, @4)', - string: 'INSERT INTO [post] ([content], [userId]) VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2), (:3, :4)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - params: ['whoah', 1, 'hey', 2] -}); - -Harness.test({ - query: post.insert({}), - pg: { - text : 'INSERT INTO "post" DEFAULT VALUES', - string: 'INSERT INTO "post" DEFAULT VALUES' - }, - sqlite: { - text : 'INSERT INTO "post" DEFAULT VALUES', - string: 'INSERT INTO "post" DEFAULT VALUES' - }, - mysql: { - text : 'INSERT INTO `post` () VALUES ()', - string: 'INSERT INTO `post` () VALUES ()' - }, - mssql: { - text : 'INSERT INTO [post] DEFAULT VALUES', - string: 'INSERT INTO [post] DEFAULT VALUES' - }, - oracle: { - text : 'INSERT INTO "post" DEFAULT VALUES', - string: 'INSERT INTO "post" DEFAULT VALUES' - }, - params: [] -}); - -Harness.test({ - query: post.insert({}).returning('*'), - pg: { - text : 'INSERT INTO "post" DEFAULT VALUES RETURNING *', - string: 'INSERT INTO "post" DEFAULT VALUES RETURNING *' - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.insert({}).returning(post.star()), - pg: { - text : 'INSERT INTO "post" DEFAULT VALUES RETURNING *', - string: 'INSERT INTO "post" DEFAULT VALUES RETURNING *' - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.insert({}).returning(post.id), - pg: { - text : 'INSERT INTO "post" DEFAULT VALUES RETURNING "id"', - string: 'INSERT INTO "post" DEFAULT VALUES RETURNING "id"' - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.insert({}).returning(post.id, post.content), - pg: { - text : 'INSERT INTO "post" DEFAULT VALUES RETURNING "id", "content"', - string: 'INSERT INTO "post" DEFAULT VALUES RETURNING "id", "content"' - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.insert({}).returning([post.id, post.content]), - pg: { - text : 'INSERT INTO "post" DEFAULT VALUES RETURNING "id", "content"', - string: 'INSERT INTO "post" DEFAULT VALUES RETURNING "id", "content"' - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -// handle missing columns -Harness.test({ - query: post.insert([{ - content: 'whoah', - userId: 1 - }, { - content: 'hey' - } - ]), - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, DEFAULT)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', DEFAULT)', - params: ['whoah', 1, 'hey'] - }, - sqlite: { - text : 'Sqlite requires the same number of columns in each insert row', - throws: true - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?), (?, DEFAULT)', - string: 'INSERT INTO `post` (`content`, `userId`) VALUES (\'whoah\', 1), (\'hey\', DEFAULT)', - params: ['whoah', 1, 'hey'] - }, - mssql: { - text : 'INSERT INTO [post] ([content], [userId]) VALUES (@1, @2), (@3, DEFAULT)', - string: 'INSERT INTO [post] ([content], [userId]) VALUES (\'whoah\', 1), (\'hey\', DEFAULT)', - params: ['whoah', 1, 'hey'] - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2), (:3, DEFAULT)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', DEFAULT)', - params: ['whoah', 1, 'hey'] - }, -}); - -Harness.test({ - query: post.insert([{ - userId: 1 - }, { - content: 'hey', - userId: 2 - } - ]), - pg: { - text : 'INSERT INTO "post" ("userId", "content") VALUES ($1, DEFAULT), ($2, $3)', - string: 'INSERT INTO "post" ("userId", "content") VALUES (1, DEFAULT), (2, \'hey\')', - params: [1, 2, 'hey'] - }, - sqlite: { - text : 'Sqlite requires the same number of columns in each insert row', - throws: true - }, - mysql: { - text : 'INSERT INTO `post` (`userId`, `content`) VALUES (?, DEFAULT), (?, ?)', - string: 'INSERT INTO `post` (`userId`, `content`) VALUES (1, DEFAULT), (2, \'hey\')', - params: [1, 2, 'hey'] - }, - mssql: { - text : 'INSERT INTO [post] ([userId], [content]) VALUES (@1, DEFAULT), (@2, @3)', - string: 'INSERT INTO [post] ([userId], [content]) VALUES (1, DEFAULT), (2, \'hey\')', - params: [1, 2, 'hey'] - }, - oracle: { - text : 'INSERT INTO "post" ("userId", "content") VALUES (:1, DEFAULT), (:2, :3)', - string: 'INSERT INTO "post" ("userId", "content") VALUES (1, DEFAULT), (2, \'hey\')', - params: [1, 2, 'hey'] - } -}); - -Harness.test({ - query: post.insert(post.content, post.userId) - .select('\'test\'', user.id).from(user).where(user.name.like('A%')), - pg: { - text : 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', - string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - sqlite: { - text : 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', - string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) SELECT \'test\', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)', - string: 'INSERT INTO `post` (`content`, `userId`) SELECT \'test\', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE \'A%\')' - }, - mssql: { - text : 'INSERT INTO [post] ([content], [userId]) SELECT \'test\', [user].[id] FROM [user] WHERE ([user].[name] LIKE @1)', - string: 'INSERT INTO [post] ([content], [userId]) SELECT \'test\', [user].[id] FROM [user] WHERE ([user].[name] LIKE \'A%\')' - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE :1)', - string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - params: ['A%'] -}); - -Harness.test({ - query: post.insert([post.content, post.userId]) - .select('\'test\'', user.id).from(user).where(user.name.like('A%')), - pg: { - text : 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', - string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - sqlite: { - text : 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', - string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) SELECT \'test\', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)', - string: 'INSERT INTO `post` (`content`, `userId`) SELECT \'test\', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE \'A%\')' - }, - mssql: { - text : 'INSERT INTO [post] ([content], [userId]) SELECT \'test\', [user].[id] FROM [user] WHERE ([user].[name] LIKE @1)', - string: 'INSERT INTO [post] ([content], [userId]) SELECT \'test\', [user].[id] FROM [user] WHERE ([user].[name] LIKE \'A%\')' - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE :1)', - string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - params: ['A%'] -}); - -Harness.test({ - query: post.insert(post.userId) - .select(user.id).from(user).where(user.name.like('A%')), - pg: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - sqlite: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - mysql: { - text : 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)', - string: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user` WHERE (`user`.`name` LIKE \'A%\')' - }, - oracle: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE :1)', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - params: ['A%'] -}); - -Harness.test({ - query: post.insert(post.userId) - .select(post.userId).from(user.join(post).on(user.id.equals(post.userId))).where(post.tags.like('A%')), - pg: { - text : 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE $1)', - string: 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE \'A%\')' - }, - sqlite: { - text : 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE $1)', - string: 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE \'A%\')' - }, - mysql: { - text : 'INSERT INTO `post` (`userId`) SELECT `post`.`userId` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`tags` LIKE ?)', - string: 'INSERT INTO `post` (`userId`) SELECT `post`.`userId` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`tags` LIKE \'A%\')' - }, - mssql: { - text : 'INSERT INTO [post] ([userId]) SELECT [post].[userId] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) WHERE ([post].[tags] LIKE @1)', - string: 'INSERT INTO [post] ([userId]) SELECT [post].[userId] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) WHERE ([post].[tags] LIKE \'A%\')' - }, - oracle: { - text : 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE :1)', - string: 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE \'A%\')' - }, - params: ['A%'] -}); - -Harness.test({ - query: post.insert(post.userId).select(user.id).distinct().from(user), - pg: { - text : 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"' - }, - sqlite: { - text : 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"' - }, - mysql: { - text : 'INSERT INTO `post` (`userId`) SELECT DISTINCT `user`.`id` FROM `user`', - string: 'INSERT INTO `post` (`userId`) SELECT DISTINCT `user`.`id` FROM `user`' - }, - mssql: { - text : 'INSERT INTO [post] ([userId]) SELECT DISTINCT [user].[id] FROM [user]', - string: 'INSERT INTO [post] ([userId]) SELECT DISTINCT [user].[id] FROM [user]' - }, - oracle: { - text : 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"' - }, - params: [] -}); - -// Binary inserts -Harness.test({ - query: post.insert(post.content.value(new Buffer('test')), post.userId.value(2)), - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'\\x74657374\', 2)' - }, - sqlite: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (x\'74657374\', 2)' - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?)', - string: 'INSERT INTO `post` (`content`, `userId`) VALUES (x\'74657374\', 2)' - }, - mssql: { - text : 'INSERT INTO [post] ([content], [userId]) VALUES (@1, @2)', - string: 'INSERT INTO [post] ([content], [userId]) VALUES (\'\\x74657374\', 2)' - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (utl_raw.cast_to_varchar2(hextoraw(\'74657374\')), 2)' - }, - params: [new Buffer('test'), 2] -}); - -Harness.test({ - query: post.insert({ - content: new Buffer('test'), - userId: 2 - }), - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'\\x74657374\', 2)' - }, - sqlite: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (x\'74657374\', 2)' - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?)', - string: 'INSERT INTO `post` (`content`, `userId`) VALUES (x\'74657374\', 2)' - }, - mssql: { - text : 'INSERT INTO [post] ([content], [userId]) VALUES (@1, @2)', - string: 'INSERT INTO [post] ([content], [userId]) VALUES (\'\\x74657374\', 2)' - }, - oracle: { - text : 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (utl_raw.cast_to_varchar2(hextoraw(\'74657374\')), 2)' - }, - params: [new Buffer('test'), 2] -}); - -Harness.test({ - query: post.insert([{ - content: new Buffer('whoah') - }, { - content: new Buffer('hey') - } - ]), - pg: { - text : 'INSERT INTO "post" ("content") VALUES ($1), ($2)', - string: 'INSERT INTO "post" ("content") ' + - 'VALUES (\'\\x77686f6168\'), (\'\\x686579\')' - }, - sqlite: { - text : 'INSERT INTO "post" ("content") VALUES ($1), ($2)', - string: 'INSERT INTO "post" ("content") VALUES (x\'77686f6168\'), (x\'686579\')' - }, - mysql: { - text : 'INSERT INTO `post` (`content`) VALUES (?), (?)', - string: 'INSERT INTO `post` (`content`) VALUES (x\'77686f6168\'), (x\'686579\')' - }, - mssql: { - text : 'INSERT INTO [post] ([content]) VALUES (@1), (@2)', - string: 'INSERT INTO [post] ([content]) VALUES (\'\\x77686f6168\'), (\'\\x686579\')' - }, - oracle: { - text : 'INSERT INTO "post" ("content") VALUES (:1), (:2)', - string: 'INSERT INTO "post" ("content") VALUES (utl_raw.cast_to_varchar2(hextoraw(\'77686f6168\'))), (utl_raw.cast_to_varchar2(hextoraw(\'686579\')))' - }, - params: [new Buffer('whoah'), new Buffer('hey')] -}); - -Harness.test({ - query: post.insert({ - content: 'test', - userId: 2 - }).onDuplicate({ - content: 'testupdate', - }), - pg: { - throws: true - }, - sqlite: { - throws: true - }, - mysql: { - text : 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `post`.`content` = ?', - string: 'INSERT INTO `post` (`content`, `userId`) VALUES (\'test\', 2) ON DUPLICATE KEY UPDATE `post`.`content` = \'testupdate\'' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2, 'testupdate'] -}); - -Harness.test({ - query: customerAliasTable.insert({ - id : 2, - name : 'test' - }).onConflict({ - columns: ['id'], - update: ['name'] - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - text : 'INSERT INTO "customer" ("id", "name") VALUES ($1, $2) ON CONFLICT ("id") DO UPDATE SET "name" = EXCLUDED."name"', - string: 'INSERT INTO "customer" ("id", "name") VALUES (2, \'test\') ON CONFLICT ("id") DO UPDATE SET "name" = EXCLUDED."name"' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [2, 'test'] -}); - -Harness.test({ - query: customerAliasTable.insert({ - id : 2, - name : 'test' - }).orIgnore(), - mysql: { - throws: true - }, - sqlite: { - text : 'INSERT OR IGNORE INTO "customer" ("id", "name") VALUES ($1, $2)', - string: 'INSERT OR IGNORE INTO "customer" ("id", "name") VALUES (2, \'test\')' - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [2, 'test'] -}); - -Harness.test({ - query: post.insert({ - content: 'test', - userId: 2 - }).onConflict({ - columns: ['userId'], - update: ['content'] - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content"', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content"' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2] -}); - -Harness.test({ - query: post.insert({ - content: 'test', - userId: 2 - }).onConflict({ - columns: ['userId','content'], - update: ['content','userId'] - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ("userId", "content") DO UPDATE SET "content" = EXCLUDED."content", "userId" = EXCLUDED."userId"', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ("userId", "content") DO UPDATE SET "content" = EXCLUDED."content", "userId" = EXCLUDED."userId"' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2] -}); - -Harness.test({ - query: post.insert({ - content: 'test', - userId: 2 - }).onConflict({ - columns: ['userId'], - update: ['content'] - }).where(post.userId.equals(2)), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content" WHERE ("post"."userId" = $3)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content" WHERE ("post"."userId" = 2)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2, 2] -}); - -Harness.test({ - query: post.insert({ - content: 'test', - userId: 2 - }).onConflict({ - constraint: 'conc_userId', - update: ['content'] - }).where(post.userId.equals(2)), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ON CONSTRAINT "conc_userId" DO UPDATE SET "content" = EXCLUDED."content" WHERE ("post"."userId" = $3)', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ON CONSTRAINT "conc_userId" DO UPDATE SET "content" = EXCLUDED."content" WHERE ("post"."userId" = 2)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2, 2] -}); - -Harness.test({ - query: post.insert({ - content: 'test', - userId: 2 - }).onConflict({ - columns: ['userId'], - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ("userId") DO NOTHING', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ("userId") DO NOTHING' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2] -}); - -Harness.test({ - query: post.insert({ - content: 'test', - userId: 2 - }).onConflict({ - constraint: 'conc_userId', - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - text : 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ON CONSTRAINT "conc_userId" DO NOTHING', - string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ON CONSTRAINT "conc_userId" DO NOTHING' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2] -}); - -Harness.test({ - query: contentTable.insert({ - contentId: 20, - text : "something" - }).onConflict({ - columns: ['contentId'], - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - text : 'INSERT INTO "content" ("content_id", "text") VALUES ($1, $2) ON CONFLICT ("content_id") DO NOTHING', - string: 'INSERT INTO "content" ("content_id", "text") VALUES (20, \'something\') ON CONFLICT ("content_id") DO NOTHING' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [20, "something"] -}); - -Harness.test({ - query: contentTable.insert({ - contentId: 20, - text : "something", - contentPosts : "another thing", - }).onConflict({ - columns: ['contentId'], - update: ['contentPosts'] - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - text : 'INSERT INTO "content" ("content_id", "text", "content_posts") VALUES ($1, $2, $3) ON CONFLICT ("content_id") DO UPDATE SET "content_posts" = EXCLUDED."content_posts"', - string: 'INSERT INTO "content" ("content_id", "text", "content_posts") VALUES (20, \'something\', \'another thing\') ON CONFLICT ("content_id") DO UPDATE SET "content_posts" = EXCLUDED."content_posts"' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [20, "something", "another thing"] -}); - -Harness.test({ - query: post.insert([]), - - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (1=2)', - string: 'SELECT `post`.* FROM `post` WHERE (1=2)' - }, - params: [] -}); - -Harness.test({ - query: arrayTable.insert(arrayTable.id.value(1), arrayTable.numbers.value([2, 3, 4])), - pg: { - text : 'INSERT INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', - string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, \'{2,3,4}\')' - }, - sqlite: { - text : 'INSERT INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', - string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, \'[2,3,4]\')' - }, - mysql: { - text : 'INSERT INTO `arraytest` (`id`, `numbers`) VALUES (?, ?)', - string: 'INSERT INTO `arraytest` (`id`, `numbers`) VALUES (1, (2, 3, 4))' - }, - oracle: { - text : 'INSERT INTO "arraytest" ("id", "numbers") VALUES (:1, :2)', - string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, (2, 3, 4))' - } -}); - -Harness.test({ - query: arrayTable.insert(arrayTable.id.value(1), arrayTable.numbers.value(["one", "two", "three"])), - pg: { - text : 'INSERT INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', - string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, \'{"one","two","three"}\')' - }, - sqlite: { - text : 'INSERT INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', - string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, \'["one","two","three"]\')' - }, - mysql: { - text : 'INSERT INTO `arraytest` (`id`, `numbers`) VALUES (?, ?)', - string: 'INSERT INTO `arraytest` (`id`, `numbers`) VALUES (1, (\'one\', \'two\', \'three\'))' - }, - oracle: { - text : 'INSERT INTO "arraytest" ("id", "numbers") VALUES (:1, :2)', - string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, (\'one\', \'two\', \'three\'))' - } -}); - -Harness.test({ - query: post.insert(post.userId).select(user.id).from(user), - pg: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - sqlite: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - mysql: { - text : 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', - string: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' - }, - mssql: { - text : 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]', - string: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]' - }, - oracle: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: post.insert(post.userId).select(user.id).from(user).onConflict({ - columns: ['userId'], - update: ['content'] - }), - pg: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content"' - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.insert(post.userId).add(user.select(user.id)), - pg: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - sqlite: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - mysql: { - text : 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', - string: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' - }, - mssql: { - text : 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]', - string: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]' - }, - oracle: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: post.insert(post.userId).add(user.select(user.id).from(user)), - pg: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - sqlite: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - mysql: { - text : 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', - string: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' - }, - mssql: { - text : 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]', - string: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]' - }, - oracle: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: post.insert(post.userId).add(user.select(user.id).order(user.id)), - pg: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"' - }, - sqlite: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"' - }, - mysql: { - text : 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user` ORDER BY `user`.`id`', - string: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user` ORDER BY `user`.`id`' - }, - mssql: { - text : 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user] ORDER BY [user].[id]', - string: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user] ORDER BY [user].[id]' - }, - oracle: { - text : 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"', - string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"' - }, - params: [] -}); - diff --git a/test/dialects/insert-tests.ts b/test/dialects/insert-tests.ts new file mode 100644 index 00000000..f6aab57d --- /dev/null +++ b/test/dialects/insert-tests.ts @@ -0,0 +1,1175 @@ +'use strict'; + +import * as Harness from './support'; +import { Table } from '../../lib/table'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); +const contentTable = Harness.defineContentTable(); +const customerAliasTable = Harness.defineCustomerAliasTable(); + +const arrayTable = Table.define<{ id: number; numbers: any[] }>({ + name: 'arraytest', + columns: ['id', 'numbers'] +}); + +Harness.test({ + query: post.insert(post.content.value('test'), post.userId.value(1)), + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 1)' + }, + sqlite: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 1)' + }, + mysql: { + text: 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?)', + string: "INSERT INTO `post` (`content`, `userId`) VALUES ('test', 1)" + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 1)' + }, + params: ['test', 1] +}); + +Harness.test({ + query: post.insert(post.content.value('whoah')), + pg: { + text: 'INSERT INTO "post" ("content") VALUES ($1)', + string: 'INSERT INTO "post" ("content") VALUES (\'whoah\')' + }, + sqlite: { + text: 'INSERT INTO "post" ("content") VALUES ($1)', + string: 'INSERT INTO "post" ("content") VALUES (\'whoah\')' + }, + mysql: { + text: 'INSERT INTO `post` (`content`) VALUES (?)', + string: "INSERT INTO `post` (`content`) VALUES ('whoah')" + }, + mssql: { + text: 'INSERT INTO [post] ([content]) VALUES (@1)', + string: "INSERT INTO [post] ([content]) VALUES ('whoah')" + }, + oracle: { + text: 'INSERT INTO "post" ("content") VALUES (:1)', + string: 'INSERT INTO "post" ("content") VALUES (\'whoah\')' + }, + params: ['whoah'] +}); + +Harness.test({ + query: post.insert({ length: 0 }), + pg: { + text: 'INSERT INTO "post" ("length") VALUES ($1)', + string: 'INSERT INTO "post" ("length") VALUES (0)' + }, + sqlite: { + text: 'INSERT INTO "post" ("length") VALUES ($1)', + string: 'INSERT INTO "post" ("length") VALUES (0)' + }, + mysql: { + text: 'INSERT INTO `post` (`length`) VALUES (?)', + string: 'INSERT INTO `post` (`length`) VALUES (0)' + }, + mssql: { + text: 'INSERT INTO [post] ([length]) VALUES (@1)', + string: 'INSERT INTO [post] ([length]) VALUES (0)' + }, + oracle: { + text: 'INSERT INTO "post" ("length") VALUES (:1)', + string: 'INSERT INTO "post" ("length") VALUES (0)' + }, + params: [0] +}); + +Harness.test({ + query: post.insert({ + content: 'test', + userId: 2 + }), + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2)' + }, + sqlite: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2)' + }, + mysql: { + text: 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?)', + string: "INSERT INTO `post` (`content`, `userId`) VALUES ('test', 2)" + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2)' + }, + params: ['test', 2] +}); + +Harness.test({ + query: post.insert({ + content: post.sql.functions.LOWER('TEST'), + userId: 2 + }), + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (LOWER($1), $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (LOWER(\'TEST\'), 2)' + }, + sqlite: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (LOWER($1), $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (LOWER(\'TEST\'), 2)' + }, + mysql: { + text: 'INSERT INTO `post` (`content`, `userId`) VALUES (LOWER(?), ?)', + string: "INSERT INTO `post` (`content`, `userId`) VALUES (LOWER('TEST'), 2)" + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (LOWER(:1), :2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (LOWER(\'TEST\'), 2)' + }, + params: ['TEST', 2] +}); + +// allow bulk insert +Harness.test({ + query: post.insert([ + { + content: 'whoah' + }, + { + content: 'hey' + } + ]), + pg: { + text: 'INSERT INTO "post" ("content") VALUES ($1), ($2)', + string: 'INSERT INTO "post" ("content") VALUES (\'whoah\'), (\'hey\')' + }, + sqlite: { + text: 'INSERT INTO "post" ("content") VALUES ($1), ($2)', + string: 'INSERT INTO "post" ("content") VALUES (\'whoah\'), (\'hey\')' + }, + mysql: { + text: 'INSERT INTO `post` (`content`) VALUES (?), (?)', + string: "INSERT INTO `post` (`content`) VALUES ('whoah'), ('hey')" + }, + oracle: { + text: 'INSERT INTO "post" ("content") VALUES (:1), (:2)', + string: 'INSERT INTO "post" ("content") VALUES (\'whoah\'), (\'hey\')' + }, + params: ['whoah', 'hey'] +}); + +Harness.test({ + query: post.insert([ + { + content: 'whoah', + userId: 1 + }, + { + content: 'hey', + userId: 2 + } + ]), + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' + }, + sqlite: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' + }, + mysql: { + text: 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?), (?, ?)', + string: "INSERT INTO `post` (`content`, `userId`) VALUES ('whoah', 1), ('hey', 2)" + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2), (:3, :4)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' + }, + params: ['whoah', 1, 'hey', 2] +}); + +// consistent order +Harness.test({ + query: post.insert([ + { + content: 'whoah', + userId: 1 + }, + { + userId: 2, + content: 'hey' + } + ]), + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' + }, + sqlite: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' + }, + mysql: { + text: 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?), (?, ?)', + string: "INSERT INTO `post` (`content`, `userId`) VALUES ('whoah', 1), ('hey', 2)" + }, + mssql: { + text: 'INSERT INTO [post] ([content], [userId]) VALUES (@1, @2), (@3, @4)', + string: "INSERT INTO [post] ([content], [userId]) VALUES ('whoah', 1), ('hey', 2)" + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2), (:3, :4)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' + }, + params: ['whoah', 1, 'hey', 2] +}); + +Harness.test({ + query: post.insert({}), + pg: { + text: 'INSERT INTO "post" DEFAULT VALUES', + string: 'INSERT INTO "post" DEFAULT VALUES' + }, + sqlite: { + text: 'INSERT INTO "post" DEFAULT VALUES', + string: 'INSERT INTO "post" DEFAULT VALUES' + }, + mysql: { + text: 'INSERT INTO `post` () VALUES ()', + string: 'INSERT INTO `post` () VALUES ()' + }, + mssql: { + text: 'INSERT INTO [post] DEFAULT VALUES', + string: 'INSERT INTO [post] DEFAULT VALUES' + }, + oracle: { + text: 'INSERT INTO "post" DEFAULT VALUES', + string: 'INSERT INTO "post" DEFAULT VALUES' + }, + params: [] +}); + +Harness.test({ + query: post.insert({}).returning('*'), + pg: { + text: 'INSERT INTO "post" DEFAULT VALUES RETURNING *', + string: 'INSERT INTO "post" DEFAULT VALUES RETURNING *' + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.insert({}).returning(post.star()), + pg: { + text: 'INSERT INTO "post" DEFAULT VALUES RETURNING *', + string: 'INSERT INTO "post" DEFAULT VALUES RETURNING *' + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.insert({}).returning(post.id), + pg: { + text: 'INSERT INTO "post" DEFAULT VALUES RETURNING "id"', + string: 'INSERT INTO "post" DEFAULT VALUES RETURNING "id"' + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.insert({}).returning(post.id, post.content), + pg: { + text: 'INSERT INTO "post" DEFAULT VALUES RETURNING "id", "content"', + string: 'INSERT INTO "post" DEFAULT VALUES RETURNING "id", "content"' + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.insert({}).returning([post.id, post.content]), + pg: { + text: 'INSERT INTO "post" DEFAULT VALUES RETURNING "id", "content"', + string: 'INSERT INTO "post" DEFAULT VALUES RETURNING "id", "content"' + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +// handle missing columns +Harness.test({ + query: post.insert([ + { + content: 'whoah', + userId: 1 + }, + { + content: 'hey' + } + ]), + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2), ($3, DEFAULT)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', DEFAULT)', + params: ['whoah', 1, 'hey'] + }, + sqlite: { + text: 'Sqlite requires the same number of columns in each insert row', + throws: true + }, + mysql: { + text: 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?), (?, DEFAULT)', + string: "INSERT INTO `post` (`content`, `userId`) VALUES ('whoah', 1), ('hey', DEFAULT)", + params: ['whoah', 1, 'hey'] + }, + mssql: { + text: 'INSERT INTO [post] ([content], [userId]) VALUES (@1, @2), (@3, DEFAULT)', + string: "INSERT INTO [post] ([content], [userId]) VALUES ('whoah', 1), ('hey', DEFAULT)", + params: ['whoah', 1, 'hey'] + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2), (:3, DEFAULT)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', DEFAULT)', + params: ['whoah', 1, 'hey'] + } +}); + +Harness.test({ + query: post.insert([ + { + userId: 1 + }, + { + content: 'hey', + userId: 2 + } + ]), + pg: { + text: 'INSERT INTO "post" ("userId", "content") VALUES ($1, DEFAULT), ($2, $3)', + string: 'INSERT INTO "post" ("userId", "content") VALUES (1, DEFAULT), (2, \'hey\')', + params: [1, 2, 'hey'] + }, + sqlite: { + text: 'Sqlite requires the same number of columns in each insert row', + throws: true + }, + mysql: { + text: 'INSERT INTO `post` (`userId`, `content`) VALUES (?, DEFAULT), (?, ?)', + string: "INSERT INTO `post` (`userId`, `content`) VALUES (1, DEFAULT), (2, 'hey')", + params: [1, 2, 'hey'] + }, + mssql: { + text: 'INSERT INTO [post] ([userId], [content]) VALUES (@1, DEFAULT), (@2, @3)', + string: "INSERT INTO [post] ([userId], [content]) VALUES (1, DEFAULT), (2, 'hey')", + params: [1, 2, 'hey'] + }, + oracle: { + text: 'INSERT INTO "post" ("userId", "content") VALUES (:1, DEFAULT), (:2, :3)', + string: 'INSERT INTO "post" ("userId", "content") VALUES (1, DEFAULT), (2, \'hey\')', + params: [1, 2, 'hey'] + } +}); + +Harness.test({ + query: post + .insert(post.content, post.userId) + .select("'test'", user.id) + .from(user) + .where(user.name.like('A%')), + pg: { + text: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', + string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + sqlite: { + text: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', + string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + mysql: { + text: "INSERT INTO `post` (`content`, `userId`) SELECT 'test', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)", + string: "INSERT INTO `post` (`content`, `userId`) SELECT 'test', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE 'A%')" + }, + mssql: { + text: "INSERT INTO [post] ([content], [userId]) SELECT 'test', [user].[id] FROM [user] WHERE ([user].[name] LIKE @1)", + string: "INSERT INTO [post] ([content], [userId]) SELECT 'test', [user].[id] FROM [user] WHERE ([user].[name] LIKE 'A%')" + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE :1)', + string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .insert([post.content, post.userId]) + .select("'test'", user.id) + .from(user) + .where(user.name.like('A%')), + pg: { + text: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', + string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + sqlite: { + text: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', + string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + mysql: { + text: "INSERT INTO `post` (`content`, `userId`) SELECT 'test', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)", + string: "INSERT INTO `post` (`content`, `userId`) SELECT 'test', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE 'A%')" + }, + mssql: { + text: "INSERT INTO [post] ([content], [userId]) SELECT 'test', [user].[id] FROM [user] WHERE ([user].[name] LIKE @1)", + string: "INSERT INTO [post] ([content], [userId]) SELECT 'test', [user].[id] FROM [user] WHERE ([user].[name] LIKE 'A%')" + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE :1)', + string: 'INSERT INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .insert(post.userId) + .select(user.id) + .from(user) + .where(user.name.like('A%')), + pg: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + sqlite: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + mysql: { + text: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)', + string: "INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user` WHERE (`user`.`name` LIKE 'A%')" + }, + oracle: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE :1)', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .insert(post.userId) + .select(post.userId) + .from(user.join(post).on(user.id.equals(post.userId))) + .where(post.tags.like('A%')), + pg: { + text: + 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE $1)', + string: + 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE \'A%\')' + }, + sqlite: { + text: + 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE $1)', + string: + 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE \'A%\')' + }, + mysql: { + text: + 'INSERT INTO `post` (`userId`) SELECT `post`.`userId` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`tags` LIKE ?)', + string: + "INSERT INTO `post` (`userId`) SELECT `post`.`userId` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`tags` LIKE 'A%')" + }, + mssql: { + text: + 'INSERT INTO [post] ([userId]) SELECT [post].[userId] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) WHERE ([post].[tags] LIKE @1)', + string: + "INSERT INTO [post] ([userId]) SELECT [post].[userId] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) WHERE ([post].[tags] LIKE 'A%')" + }, + oracle: { + text: + 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE :1)', + string: + 'INSERT INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE \'A%\')' + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .insert(post.userId) + .select(user.id) + .distinct() + .from(user), + pg: { + text: 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"' + }, + sqlite: { + text: 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"' + }, + mysql: { + text: 'INSERT INTO `post` (`userId`) SELECT DISTINCT `user`.`id` FROM `user`', + string: 'INSERT INTO `post` (`userId`) SELECT DISTINCT `user`.`id` FROM `user`' + }, + mssql: { + text: 'INSERT INTO [post] ([userId]) SELECT DISTINCT [user].[id] FROM [user]', + string: 'INSERT INTO [post] ([userId]) SELECT DISTINCT [user].[id] FROM [user]' + }, + oracle: { + text: 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"' + }, + params: [] +}); + +// Binary inserts +Harness.test({ + query: post.insert(post.content.value(new Buffer('test')), post.userId.value(2)), + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'\\x74657374\', 2)' + }, + sqlite: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (x\'74657374\', 2)' + }, + mysql: { + text: 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?)', + string: "INSERT INTO `post` (`content`, `userId`) VALUES (x'74657374', 2)" + }, + mssql: { + text: 'INSERT INTO [post] ([content], [userId]) VALUES (@1, @2)', + string: "INSERT INTO [post] ([content], [userId]) VALUES ('\\x74657374', 2)" + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (utl_raw.cast_to_varchar2(hextoraw(\'74657374\')), 2)' + }, + params: [new Buffer('test'), 2] +}); + +Harness.test({ + query: post.insert({ + content: new Buffer('test'), + userId: 2 + }), + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'\\x74657374\', 2)' + }, + sqlite: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (x\'74657374\', 2)' + }, + mysql: { + text: 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?)', + string: "INSERT INTO `post` (`content`, `userId`) VALUES (x'74657374', 2)" + }, + mssql: { + text: 'INSERT INTO [post] ([content], [userId]) VALUES (@1, @2)', + string: "INSERT INTO [post] ([content], [userId]) VALUES ('\\x74657374', 2)" + }, + oracle: { + text: 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', + string: 'INSERT INTO "post" ("content", "userId") VALUES (utl_raw.cast_to_varchar2(hextoraw(\'74657374\')), 2)' + }, + params: [new Buffer('test'), 2] +}); + +Harness.test({ + query: post.insert([ + { + content: new Buffer('whoah') + }, + { + content: new Buffer('hey') + } + ]), + pg: { + text: 'INSERT INTO "post" ("content") VALUES ($1), ($2)', + string: 'INSERT INTO "post" ("content") ' + "VALUES ('\\x77686f6168'), ('\\x686579')" + }, + sqlite: { + text: 'INSERT INTO "post" ("content") VALUES ($1), ($2)', + string: 'INSERT INTO "post" ("content") VALUES (x\'77686f6168\'), (x\'686579\')' + }, + mysql: { + text: 'INSERT INTO `post` (`content`) VALUES (?), (?)', + string: "INSERT INTO `post` (`content`) VALUES (x'77686f6168'), (x'686579')" + }, + mssql: { + text: 'INSERT INTO [post] ([content]) VALUES (@1), (@2)', + string: "INSERT INTO [post] ([content]) VALUES ('\\x77686f6168'), ('\\x686579')" + }, + oracle: { + text: 'INSERT INTO "post" ("content") VALUES (:1), (:2)', + string: + 'INSERT INTO "post" ("content") VALUES (utl_raw.cast_to_varchar2(hextoraw(\'77686f6168\'))), (utl_raw.cast_to_varchar2(hextoraw(\'686579\')))' + }, + params: [new Buffer('whoah'), new Buffer('hey')] +}); + +Harness.test({ + query: post + .insert({ + content: 'test', + userId: 2 + }) + .onDuplicate({ + content: 'testupdate' + }), + pg: { + throws: true + }, + sqlite: { + throws: true + }, + mysql: { + text: 'INSERT INTO `post` (`content`, `userId`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `post`.`content` = ?', + string: "INSERT INTO `post` (`content`, `userId`) VALUES ('test', 2) ON DUPLICATE KEY UPDATE `post`.`content` = 'testupdate'" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2, 'testupdate'] +}); + +Harness.test({ + query: customerAliasTable + .insert({ + id: 2, + name: 'test' + }) + .onConflict({ + columns: ['id'], + update: ['name'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: 'INSERT INTO "customer" ("id", "name") VALUES ($1, $2) ON CONFLICT ("id") DO UPDATE SET "name" = EXCLUDED."name"', + string: 'INSERT INTO "customer" ("id", "name") VALUES (2, \'test\') ON CONFLICT ("id") DO UPDATE SET "name" = EXCLUDED."name"' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [2, 'test'] +}); + +Harness.test({ + query: customerAliasTable + .insert({ + id: 2, + name: 'test' + }) + .orIgnore(), + mysql: { + throws: true + }, + sqlite: { + text: 'INSERT OR IGNORE INTO "customer" ("id", "name") VALUES ($1, $2)', + string: 'INSERT OR IGNORE INTO "customer" ("id", "name") VALUES (2, \'test\')' + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [2, 'test'] +}); + +Harness.test({ + query: post + .insert({ + content: 'test', + userId: 2 + }) + .onConflict({ + columns: ['userId'], + update: ['content'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: + 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content"', + string: + 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content"' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + +Harness.test({ + query: post + .insert({ + content: 'test', + userId: 2 + }) + .onConflict({ + columns: ['userId', 'content'], + update: ['content', 'userId'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: + 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ("userId", "content") DO UPDATE SET "content" = EXCLUDED."content", "userId" = EXCLUDED."userId"', + string: + 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ("userId", "content") DO UPDATE SET "content" = EXCLUDED."content", "userId" = EXCLUDED."userId"' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + +Harness.test({ + query: post + .insert({ + content: 'test', + userId: 2 + }) + .onConflict({ + columns: ['userId'], + update: ['content'] + }) + .where(post.userId.equals(2)), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: + 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content" WHERE ("post"."userId" = $3)', + string: + 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content" WHERE ("post"."userId" = 2)' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2, 2] +}); + +Harness.test({ + query: post + .insert({ + content: 'test', + userId: 2 + }) + .onConflict({ + constraint: 'conc_userId', + update: ['content'] + }) + .where(post.userId.equals(2)), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: + 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ON CONSTRAINT "conc_userId" DO UPDATE SET "content" = EXCLUDED."content" WHERE ("post"."userId" = $3)', + string: + 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ON CONSTRAINT "conc_userId" DO UPDATE SET "content" = EXCLUDED."content" WHERE ("post"."userId" = 2)' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2, 2] +}); + +Harness.test({ + query: post + .insert({ + content: 'test', + userId: 2 + }) + .onConflict({ + columns: ['userId'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ("userId") DO NOTHING', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ("userId") DO NOTHING' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + +Harness.test({ + query: post + .insert({ + content: 'test', + userId: 2 + }) + .onConflict({ + constraint: 'conc_userId' + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ON CONSTRAINT "conc_userId" DO NOTHING', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ON CONSTRAINT "conc_userId" DO NOTHING' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + +Harness.test({ + query: contentTable + .insert({ + contentId: 20, + text: 'something' + }) + .onConflict({ + columns: ['contentId'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: 'INSERT INTO "content" ("content_id", "text") VALUES ($1, $2) ON CONFLICT ("content_id") DO NOTHING', + string: 'INSERT INTO "content" ("content_id", "text") VALUES (20, \'something\') ON CONFLICT ("content_id") DO NOTHING' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [20, 'something'] +}); + +Harness.test({ + query: contentTable + .insert({ + contentId: 20, + text: 'something', + contentPosts: 'another thing' + }) + .onConflict({ + columns: ['contentId'], + update: ['contentPosts'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: + 'INSERT INTO "content" ("content_id", "text", "content_posts") VALUES ($1, $2, $3) ON CONFLICT ("content_id") DO UPDATE SET "content_posts" = EXCLUDED."content_posts"', + string: + 'INSERT INTO "content" ("content_id", "text", "content_posts") VALUES (20, \'something\', \'another thing\') ON CONFLICT ("content_id") DO UPDATE SET "content_posts" = EXCLUDED."content_posts"' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [20, 'something', 'another thing'] +}); + +Harness.test({ + query: post.insert([]), + + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (1=2)', + string: 'SELECT `post`.* FROM `post` WHERE (1=2)' + }, + params: [] +}); + +Harness.test({ + query: arrayTable.insert(arrayTable.id.value(1), arrayTable.numbers.value([2, 3, 4])), + pg: { + text: 'INSERT INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', + string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, \'{2,3,4}\')' + }, + sqlite: { + text: 'INSERT INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', + string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, \'[2,3,4]\')' + }, + mysql: { + text: 'INSERT INTO `arraytest` (`id`, `numbers`) VALUES (?, ?)', + string: 'INSERT INTO `arraytest` (`id`, `numbers`) VALUES (1, (2, 3, 4))' + }, + oracle: { + text: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (:1, :2)', + string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, (2, 3, 4))' + } +}); + +Harness.test({ + query: arrayTable.insert(arrayTable.id.value(1), arrayTable.numbers.value(['one', 'two', 'three'])), + pg: { + text: 'INSERT INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', + string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, \'{"one","two","three"}\')' + }, + sqlite: { + text: 'INSERT INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', + string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, \'["one","two","three"]\')' + }, + mysql: { + text: 'INSERT INTO `arraytest` (`id`, `numbers`) VALUES (?, ?)', + string: "INSERT INTO `arraytest` (`id`, `numbers`) VALUES (1, ('one', 'two', 'three'))" + }, + oracle: { + text: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (:1, :2)', + string: 'INSERT INTO "arraytest" ("id", "numbers") VALUES (1, (\'one\', \'two\', \'three\'))' + } +}); + +Harness.test({ + query: post + .insert(post.userId) + .select(user.id) + .from(user), + pg: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + sqlite: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + mysql: { + text: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', + string: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' + }, + mssql: { + text: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]', + string: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]' + }, + oracle: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: post + .insert(post.userId) + .select(user.id) + .from(user) + .onConflict({ + columns: ['userId'], + update: ['content'] + }), + pg: { + text: + 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content"', + string: + 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ON CONFLICT ("userId") DO UPDATE SET "content" = EXCLUDED."content"' + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.insert(post.userId).add(user.select(user.id)), + pg: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + sqlite: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + mysql: { + text: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', + string: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' + }, + mssql: { + text: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]', + string: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]' + }, + oracle: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: post.insert(post.userId).add(user.select(user.id).from(user)), + pg: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + sqlite: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + mysql: { + text: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', + string: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' + }, + mssql: { + text: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]', + string: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user]' + }, + oracle: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: post.insert(post.userId).add(user.select(user.id).order(user.id)), + pg: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"' + }, + sqlite: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"' + }, + mysql: { + text: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user` ORDER BY `user`.`id`', + string: 'INSERT INTO `post` (`userId`) SELECT `user`.`id` FROM `user` ORDER BY `user`.`id`' + }, + mssql: { + text: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user] ORDER BY [user].[id]', + string: 'INSERT INTO [post] ([userId]) SELECT [user].[id] FROM [user] ORDER BY [user].[id]' + }, + oracle: { + text: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"', + string: 'INSERT INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"' + }, + params: [] +}); diff --git a/test/dialects/join-tests.js b/test/dialects/join-tests.js deleted file mode 100644 index abebdb01..00000000 --- a/test/dialects/join-tests.js +++ /dev/null @@ -1,176 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); -var post = Harness.definePostTable(); -var comment = Harness.defineCommentTable(); - -Harness.test({ - query: user.select(user.name, post.content).from(user.join(post).on(user.id.equals(post.userId))), - pg: { - text : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' - }, - sqlite: { - text : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' - }, - mysql: { - text : 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)', - string: 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)' - }, - mssql: { - text : 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId])', - string: 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId])' - }, - oracle: { - text : 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' - }, - params: [] -}); - -Harness.test({ - query: user.join(post).on(user.id.equals(post.userId)), - pg: { - text : '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', - string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' - }, - sqlite: { - text : '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', - string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' - }, - mysql: { - text : '`user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)', - string: '`user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)' - }, - mssql: { - text : '[user] INNER JOIN [post] ON ([user].[id] = [post].[userId])', - string: '[user] INNER JOIN [post] ON ([user].[id] = [post].[userId])' - }, - oracle: { - text : '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', - string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' - }, - params: [] -}); - -Harness.test({ - query: user - .select(user.name, post.content, comment.text) - .from( - user - .join(post).on(user.id.equals(post.userId)) - .join(comment).on(post.id.equals(comment.postId))), - pg: { - text : 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")', - string: 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")' - }, - sqlite: { - text : 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")', - string: 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")' - }, - mysql: { - text : 'SELECT `user`.`name`, `post`.`content`, `comment`.`text` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) INNER JOIN `comment` ON (`post`.`id` = `comment`.`postId`)', - string: 'SELECT `user`.`name`, `post`.`content`, `comment`.`text` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) INNER JOIN `comment` ON (`post`.`id` = `comment`.`postId`)' - }, - mssql: { - text : 'SELECT [user].[name], [post].[content], [comment].[text] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) INNER JOIN [comment] ON ([post].[id] = [comment].[postId])', - string: 'SELECT [user].[name], [post].[content], [comment].[text] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) INNER JOIN [comment] ON ([post].[id] = [comment].[postId])' - }, - oracle: { - text : 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")', - string: 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.name, post.content).from(user.leftJoin(post).on(user.id.equals(post.userId))), - pg: { - text : 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")' - }, - sqlite: { - text : 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")' - }, - mysql: { - text : 'SELECT `user`.`name`, `post`.`content` FROM `user` LEFT JOIN `post` ON (`user`.`id` = `post`.`userId`)', - string: 'SELECT `user`.`name`, `post`.`content` FROM `user` LEFT JOIN `post` ON (`user`.`id` = `post`.`userId`)' - }, - mssql: { - text : 'SELECT [user].[name], [post].[content] FROM [user] LEFT JOIN [post] ON ([user].[id] = [post].[userId])', - string: 'SELECT [user].[name], [post].[content] FROM [user] LEFT JOIN [post] ON ([user].[id] = [post].[userId])' - }, - oracle: { - text : 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")' - }, - params: [] -}); - -Harness.test({ - query: user - .select(user.name, post.content) - .from( - user - .leftJoin(post).on(user.id.equals(post.userId)) - .leftJoin(comment).on(post.id.equals(comment.postId))), - pg: { - text : 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")' - }, - sqlite: { - text : 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")' - }, - mysql: { - text : 'SELECT `user`.`name`, `post`.`content` FROM `user` LEFT JOIN `post` ON (`user`.`id` = `post`.`userId`) LEFT JOIN `comment` ON (`post`.`id` = `comment`.`postId`)', - string: 'SELECT `user`.`name`, `post`.`content` FROM `user` LEFT JOIN `post` ON (`user`.`id` = `post`.`userId`) LEFT JOIN `comment` ON (`post`.`id` = `comment`.`postId`)' - }, - mssql: { - text : 'SELECT [user].[name], [post].[content] FROM [user] LEFT JOIN [post] ON ([user].[id] = [post].[userId]) LEFT JOIN [comment] ON ([post].[id] = [comment].[postId])', - string: 'SELECT [user].[name], [post].[content] FROM [user] LEFT JOIN [post] ON ([user].[id] = [post].[userId]) LEFT JOIN [comment] ON ([post].[id] = [comment].[postId])' - }, - oracle: { - text : 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")', - string: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")' - }, - params: [] -}); - -var subposts = post - .subQuery('subposts') - .select( - post.content, - post.userId.as('subpostUserId')) - .from(post); - -Harness.test({ - query: user - .select(user.name, subposts.content) - .from(user.join(subposts) - .on(user.id.equals(subposts.subpostUserId))), - pg: { - text : 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" AS "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")', - string: 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" AS "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")' - }, - sqlite: { - text : 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" AS "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")', - string: 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" AS "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")' - }, - mysql: { - text : 'SELECT `user`.`name`, `subposts`.`content` FROM `user` INNER JOIN (SELECT `post`.`content`, `post`.`userId` AS `subpostUserId` FROM `post`) `subposts` ON (`user`.`id` = `subposts`.`subpostUserId`)', - string: 'SELECT `user`.`name`, `subposts`.`content` FROM `user` INNER JOIN (SELECT `post`.`content`, `post`.`userId` AS `subpostUserId` FROM `post`) `subposts` ON (`user`.`id` = `subposts`.`subpostUserId`)' - }, - mssql: { - text : 'SELECT [user].[name], [subposts].[content] FROM [user] INNER JOIN (SELECT [post].[content], [post].[userId] AS [subpostUserId] FROM [post]) [subposts] ON ([user].[id] = [subposts].[subpostUserId])', - string: 'SELECT [user].[name], [subposts].[content] FROM [user] INNER JOIN (SELECT [post].[content], [post].[userId] AS [subpostUserId] FROM [post]) [subposts] ON ([user].[id] = [subposts].[subpostUserId])' - }, - oracle: { - text : 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")', - string: 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")' - }, - params: [] -}); diff --git a/test/dialects/join-tests.ts b/test/dialects/join-tests.ts new file mode 100644 index 00000000..f5e0f8ed --- /dev/null +++ b/test/dialects/join-tests.ts @@ -0,0 +1,203 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); +const comment = Harness.defineCommentTable(); + +Harness.test({ + query: user.select(user.name, post.content).from(user.join(post).on(user.id.equals(post.userId))), + pg: { + text: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', + string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' + }, + sqlite: { + text: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', + string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' + }, + mysql: { + text: 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)', + string: 'SELECT `user`.`name`, `post`.`content` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)' + }, + mssql: { + text: 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId])', + string: 'SELECT [user].[name], [post].[content] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId])' + }, + oracle: { + text: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', + string: 'SELECT "user"."name", "post"."content" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' + }, + params: [] +}); + +Harness.test({ + query: user.join(post).on(user.id.equals(post.userId)), + pg: { + text: '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', + string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' + }, + sqlite: { + text: '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', + string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' + }, + mysql: { + text: '`user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)', + string: '`user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`)' + }, + mssql: { + text: '[user] INNER JOIN [post] ON ([user].[id] = [post].[userId])', + string: '[user] INNER JOIN [post] ON ([user].[id] = [post].[userId])' + }, + oracle: { + text: '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")', + string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.name, post.content, comment.text).from( + user + .join(post) + .on(user.id.equals(post.userId)) + .join(comment) + .on(post.id.equals(comment.postId)) + ), + pg: { + text: + 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")', + string: + 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")' + }, + sqlite: { + text: + 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")', + string: + 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")' + }, + mysql: { + text: + 'SELECT `user`.`name`, `post`.`content`, `comment`.`text` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) INNER JOIN `comment` ON (`post`.`id` = `comment`.`postId`)', + string: + 'SELECT `user`.`name`, `post`.`content`, `comment`.`text` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) INNER JOIN `comment` ON (`post`.`id` = `comment`.`postId`)' + }, + mssql: { + text: + 'SELECT [user].[name], [post].[content], [comment].[text] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) INNER JOIN [comment] ON ([post].[id] = [comment].[postId])', + string: + 'SELECT [user].[name], [post].[content], [comment].[text] FROM [user] INNER JOIN [post] ON ([user].[id] = [post].[userId]) INNER JOIN [comment] ON ([post].[id] = [comment].[postId])' + }, + oracle: { + text: + 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")', + string: + 'SELECT "user"."name", "post"."content", "comment"."text" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") INNER JOIN "comment" ON ("post"."id" = "comment"."postId")' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.name, post.content).from(user.leftJoin(post).on(user.id.equals(post.userId))), + pg: { + text: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")', + string: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")' + }, + sqlite: { + text: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")', + string: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")' + }, + mysql: { + text: 'SELECT `user`.`name`, `post`.`content` FROM `user` LEFT JOIN `post` ON (`user`.`id` = `post`.`userId`)', + string: 'SELECT `user`.`name`, `post`.`content` FROM `user` LEFT JOIN `post` ON (`user`.`id` = `post`.`userId`)' + }, + mssql: { + text: 'SELECT [user].[name], [post].[content] FROM [user] LEFT JOIN [post] ON ([user].[id] = [post].[userId])', + string: 'SELECT [user].[name], [post].[content] FROM [user] LEFT JOIN [post] ON ([user].[id] = [post].[userId])' + }, + oracle: { + text: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")', + string: 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId")' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.name, post.content).from( + user + .leftJoin(post) + .on(user.id.equals(post.userId)) + .leftJoin(comment) + .on(post.id.equals(comment.postId)) + ), + pg: { + text: + 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")', + string: + 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")' + }, + sqlite: { + text: + 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")', + string: + 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")' + }, + mysql: { + text: + 'SELECT `user`.`name`, `post`.`content` FROM `user` LEFT JOIN `post` ON (`user`.`id` = `post`.`userId`) LEFT JOIN `comment` ON (`post`.`id` = `comment`.`postId`)', + string: + 'SELECT `user`.`name`, `post`.`content` FROM `user` LEFT JOIN `post` ON (`user`.`id` = `post`.`userId`) LEFT JOIN `comment` ON (`post`.`id` = `comment`.`postId`)' + }, + mssql: { + text: + 'SELECT [user].[name], [post].[content] FROM [user] LEFT JOIN [post] ON ([user].[id] = [post].[userId]) LEFT JOIN [comment] ON ([post].[id] = [comment].[postId])', + string: + 'SELECT [user].[name], [post].[content] FROM [user] LEFT JOIN [post] ON ([user].[id] = [post].[userId]) LEFT JOIN [comment] ON ([post].[id] = [comment].[postId])' + }, + oracle: { + text: + 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")', + string: + 'SELECT "user"."name", "post"."content" FROM "user" LEFT JOIN "post" ON ("user"."id" = "post"."userId") LEFT JOIN "comment" ON ("post"."id" = "comment"."postId")' + }, + params: [] +}); + +var subposts = post + .subQuery('subposts') + .select(post.content, post.userId.as('subpostUserId')) + .from(post); + +Harness.test({ + query: user.select(user.name, subposts.content).from(user.join(subposts).on(user.id.equals(subposts.subpostUserId))), + pg: { + text: + 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" AS "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")', + string: + 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" AS "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")' + }, + sqlite: { + text: + 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" AS "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")', + string: + 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" AS "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")' + }, + mysql: { + text: + 'SELECT `user`.`name`, `subposts`.`content` FROM `user` INNER JOIN (SELECT `post`.`content`, `post`.`userId` AS `subpostUserId` FROM `post`) `subposts` ON (`user`.`id` = `subposts`.`subpostUserId`)', + string: + 'SELECT `user`.`name`, `subposts`.`content` FROM `user` INNER JOIN (SELECT `post`.`content`, `post`.`userId` AS `subpostUserId` FROM `post`) `subposts` ON (`user`.`id` = `subposts`.`subpostUserId`)' + }, + mssql: { + text: + 'SELECT [user].[name], [subposts].[content] FROM [user] INNER JOIN (SELECT [post].[content], [post].[userId] AS [subpostUserId] FROM [post]) [subposts] ON ([user].[id] = [subposts].[subpostUserId])', + string: + 'SELECT [user].[name], [subposts].[content] FROM [user] INNER JOIN (SELECT [post].[content], [post].[userId] AS [subpostUserId] FROM [post]) [subposts] ON ([user].[id] = [subposts].[subpostUserId])' + }, + oracle: { + text: + 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")', + string: + 'SELECT "user"."name", "subposts"."content" FROM "user" INNER JOIN (SELECT "post"."content", "post"."userId" "subpostUserId" FROM "post") "subposts" ON ("user"."id" = "subposts"."subpostUserId")' + }, + params: [] +}); diff --git a/test/dialects/join-to-tests.js b/test/dialects/join-to-tests.js deleted file mode 100644 index d50f8817..00000000 --- a/test/dialects/join-to-tests.js +++ /dev/null @@ -1,112 +0,0 @@ -'use strict'; -var sql = require(__dirname + '/../../lib'); - -var Harness = require('./support'); - -var user = sql.define({ - name: 'user', - columns: { - id: { - primaryKey: true - } - } -}); - -var photo = sql.define({ - name: 'photo', - columns: { - ownerId: { - references: 'user' - } - } -}); - -var post = sql.define({ - name: 'post', - columns: { - id: { - primaryKey: true - }, - ownerId: { - references: { - table: 'user', - column: 'id' - } - } - } -}); - -Harness.test({ - query: user.joinTo(post), - pg: { - text : '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")', - string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")' - }, - sqlite: { - text : '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")', - string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")' - }, - mysql: { - text : '`user` INNER JOIN `post` ON (`user`.`id` = `post`.`ownerId`)', - string: '`user` INNER JOIN `post` ON (`user`.`id` = `post`.`ownerId`)' - }, - mssql: { - text : '[user] INNER JOIN [post] ON ([user].[id] = [post].[ownerId])', - string: '[user] INNER JOIN [post] ON ([user].[id] = [post].[ownerId])' - }, - oracle: { - text : '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")', - string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")' - }, - params: [] -}); - -Harness.test({ - query: post.joinTo(user), - pg: { - text : '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")', - string: '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")' - }, - sqlite: { - text : '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")', - string: '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")' - }, - mysql: { - text : '`post` INNER JOIN `user` ON (`user`.`id` = `post`.`ownerId`)', - string: '`post` INNER JOIN `user` ON (`user`.`id` = `post`.`ownerId`)' - }, - mssql: { - text : '[post] INNER JOIN [user] ON ([user].[id] = [post].[ownerId])', - string: '[post] INNER JOIN [user] ON ([user].[id] = [post].[ownerId])' - }, - oracle: { - text : '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")', - string: '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")' - }, - params: [] -}); - -Harness.test({ - query: user.joinTo(photo), - pg: { - text : '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")', - string: '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")' - }, - sqlite: { - text : '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")', - string: '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")' - }, - mysql: { - text : '`user` INNER JOIN `photo` ON (`user`.`id` = `photo`.`ownerId`)', - string: '`user` INNER JOIN `photo` ON (`user`.`id` = `photo`.`ownerId`)' - }, - mssql: { - text : '[user] INNER JOIN [photo] ON ([user].[id] = [photo].[ownerId])', - string: '[user] INNER JOIN [photo] ON ([user].[id] = [photo].[ownerId])' - }, - oracle: { - text : '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")', - string: '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")' - }, - params: [] -}); diff --git a/test/dialects/join-to-tests.ts b/test/dialects/join-to-tests.ts new file mode 100644 index 00000000..9f14bf85 --- /dev/null +++ b/test/dialects/join-to-tests.ts @@ -0,0 +1,113 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const instance = new Sql('postgres'); + +var user = instance.define({ + name: 'user', + columns: { + id: { + primaryKey: true + } + } +}); + +var photo = instance.define({ + name: 'photo', + columns: { + ownerId: { + references: 'user' + } + } +}); + +var post = instance.define({ + name: 'post', + columns: { + id: { + primaryKey: true + }, + ownerId: { + references: { + table: 'user', + column: 'id' + } + } + } +}); + +Harness.test({ + query: user.joinTo(post), + pg: { + text: '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")', + string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")' + }, + sqlite: { + text: '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")', + string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")' + }, + mysql: { + text: '`user` INNER JOIN `post` ON (`user`.`id` = `post`.`ownerId`)', + string: '`user` INNER JOIN `post` ON (`user`.`id` = `post`.`ownerId`)' + }, + mssql: { + text: '[user] INNER JOIN [post] ON ([user].[id] = [post].[ownerId])', + string: '[user] INNER JOIN [post] ON ([user].[id] = [post].[ownerId])' + }, + oracle: { + text: '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")', + string: '"user" INNER JOIN "post" ON ("user"."id" = "post"."ownerId")' + }, + params: [] +}); + +Harness.test({ + query: post.joinTo(user), + pg: { + text: '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")', + string: '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")' + }, + sqlite: { + text: '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")', + string: '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")' + }, + mysql: { + text: '`post` INNER JOIN `user` ON (`user`.`id` = `post`.`ownerId`)', + string: '`post` INNER JOIN `user` ON (`user`.`id` = `post`.`ownerId`)' + }, + mssql: { + text: '[post] INNER JOIN [user] ON ([user].[id] = [post].[ownerId])', + string: '[post] INNER JOIN [user] ON ([user].[id] = [post].[ownerId])' + }, + oracle: { + text: '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")', + string: '"post" INNER JOIN "user" ON ("user"."id" = "post"."ownerId")' + }, + params: [] +}); + +Harness.test({ + query: user.joinTo(photo), + pg: { + text: '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")', + string: '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")' + }, + sqlite: { + text: '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")', + string: '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")' + }, + mysql: { + text: '`user` INNER JOIN `photo` ON (`user`.`id` = `photo`.`ownerId`)', + string: '`user` INNER JOIN `photo` ON (`user`.`id` = `photo`.`ownerId`)' + }, + mssql: { + text: '[user] INNER JOIN [photo] ON ([user].[id] = [photo].[ownerId])', + string: '[user] INNER JOIN [photo] ON ([user].[id] = [photo].[ownerId])' + }, + oracle: { + text: '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")', + string: '"user" INNER JOIN "photo" ON ("user"."id" = "photo"."ownerId")' + }, + params: [] +}); diff --git a/test/dialects/json-tests.js b/test/dialects/json-tests.js deleted file mode 100644 index b610b96f..00000000 --- a/test/dialects/json-tests.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var Sql = require('../../lib').setDialect('postgres'); - -Harness.test({ - query: customer.select(customer.metadata.key('age')), - pg: { - text : 'SELECT ("customer"."metadata" -> $1) FROM "customer"', - string: 'SELECT ("customer"."metadata" -> \'age\') FROM "customer"' - }, - params: ['age'] -}); - -Harness.test({ - query: customer.select(customer.metadata.keyText('age')), - pg: { - text : 'SELECT ("customer"."metadata" ->> $1) FROM "customer"', - string: 'SELECT ("customer"."metadata" ->> \'age\') FROM "customer"' - }, - params: ['age'] -}); - -Harness.test({ - query: customer.select(customer.metadata.path('{address,city}')), - pg: { - text : 'SELECT ("customer"."metadata" #> $1) FROM "customer"', - string: 'SELECT ("customer"."metadata" #> \'{address,city}\') FROM "customer"' - }, - params: ['{address,city}'] -}); - -Harness.test({ - query: customer.select(customer.metadata.pathText('{address,city}')), - pg: { - text : 'SELECT ("customer"."metadata" #>> $1) FROM "customer"', - string: 'SELECT ("customer"."metadata" #>> \'{address,city}\') FROM "customer"' - }, - params: ['{address,city}'] -}); diff --git a/test/dialects/json-tests.ts b/test/dialects/json-tests.ts new file mode 100644 index 00000000..8346ca6b --- /dev/null +++ b/test/dialects/json-tests.ts @@ -0,0 +1,40 @@ +'use strict'; + +import * as Harness from './support'; +const customer = Harness.defineCustomerTable(); + +Harness.test({ + query: customer.select(customer.metadata.key('age')), + pg: { + text: 'SELECT ("customer"."metadata" -> $1) FROM "customer"', + string: 'SELECT ("customer"."metadata" -> \'age\') FROM "customer"' + }, + params: ['age'] +}); + +Harness.test({ + query: customer.select(customer.metadata.keyText('age')), + pg: { + text: 'SELECT ("customer"."metadata" ->> $1) FROM "customer"', + string: 'SELECT ("customer"."metadata" ->> \'age\') FROM "customer"' + }, + params: ['age'] +}); + +Harness.test({ + query: customer.select(customer.metadata.path('{address,city}')), + pg: { + text: 'SELECT ("customer"."metadata" #> $1) FROM "customer"', + string: 'SELECT ("customer"."metadata" #> \'{address,city}\') FROM "customer"' + }, + params: ['{address,city}'] +}); + +Harness.test({ + query: customer.select(customer.metadata.pathText('{address,city}')), + pg: { + text: 'SELECT ("customer"."metadata" #>> $1) FROM "customer"', + string: 'SELECT ("customer"."metadata" #>> \'{address,city}\') FROM "customer"' + }, + params: ['{address,city}'] +}); diff --git a/test/dialects/limit-and-offset-tests.js b/test/dialects/limit-and-offset-tests.js deleted file mode 100644 index 6561c14b..00000000 --- a/test/dialects/limit-and-offset-tests.js +++ /dev/null @@ -1,105 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); - -// For compatibility with PostgreSQL, MySQL also supports the LIMIT row_count OFFSET offset syntax. -// http://dev.mysql.com/doc/refman/5.0/en/select.html - -Harness.test({ - query: user.select(user.star()).from(user).order(user.name.asc).limit(1), - pg: { - text : 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 1', - string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 1' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 1', - string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 1' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` LIMIT 1', - string: 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` LIMIT 1' - }, - mssql: { - text : 'SELECT TOP(1) [user].* FROM [user] ORDER BY [user].[name]', - string: 'SELECT TOP(1) [user].* FROM [user] ORDER BY [user].[name]' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.star()).from(user).order(user.name.asc).limit(3).offset(6), - pg: { - text : 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 3 OFFSET 6', - string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 3 OFFSET 6' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 3 OFFSET 6', - string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 3 OFFSET 6' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` LIMIT 3 OFFSET 6', - string: 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` LIMIT 3 OFFSET 6' - }, - mssql: { - text : 'SELECT [user].* FROM [user] ORDER BY [user].[name] OFFSET 6 ROWS FETCH NEXT 3 ROWS ONLY', - string: 'SELECT [user].* FROM [user] ORDER BY [user].[name] OFFSET 6 ROWS FETCH NEXT 3 ROWS ONLY' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.star()).from(user).order(user.name.asc).offset(10), - pg: { - text : 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET 10', - string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET 10' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET 10', - string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET 10' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` OFFSET 10', - string: 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` OFFSET 10' - }, - mssql: { - text : 'SELECT [user].* FROM [user] ORDER BY [user].[name] OFFSET 10 ROWS', - string: 'SELECT [user].* FROM [user] ORDER BY [user].[name] OFFSET 10 ROWS' - }, - oracle: { - text : 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET 10 ROWS', - string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET 10 ROWS' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.star()).where({ - name: 'John' - }).offset(user.subQuery().select('FLOOR(RANDOM() * COUNT(*))').where({ - name: 'John' - })).limit(1), - pg: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."name" = $1) OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = $2)) LIMIT 1', - string: 'SELECT "user".* FROM "user" WHERE ("user"."name" = \'John\') OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = \'John\')) LIMIT 1' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."name" = $1) OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = $2)) LIMIT 1', - string: 'SELECT "user".* FROM "user" WHERE ("user"."name" = \'John\') OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = \'John\')) LIMIT 1' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` WHERE (`user`.`name` = ?) OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM `user` WHERE (`user`.`name` = ?)) LIMIT 1', - string: 'SELECT `user`.* FROM `user` WHERE (`user`.`name` = \'John\') OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM `user` WHERE (`user`.`name` = \'John\')) LIMIT 1' - }, - mssql: { - text : 'Microsoft SQL Server does not support OFFSET without and ORDER BY.', - throws: true - }, - oracle: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."name" = :1) OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = :2)) ROWS FETCH NEXT 1 ROWS ONLY', - string: 'SELECT "user".* FROM "user" WHERE ("user"."name" = \'John\') OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = \'John\')) ROWS FETCH NEXT 1 ROWS ONLY' - }, - values: ['John', 'John'] -}); - -// TODO: Should probably have a test case like the one above but including an ORDER BY clause so the mssql case can be tested \ No newline at end of file diff --git a/test/dialects/limit-and-offset-tests.ts b/test/dialects/limit-and-offset-tests.ts new file mode 100644 index 00000000..23fe8012 --- /dev/null +++ b/test/dialects/limit-and-offset-tests.ts @@ -0,0 +1,145 @@ +'use strict'; + +import * as Harness from './support'; +const user = Harness.defineUserTable(); + +// For compatibility with PostgreSQL, MySQL also supports the LIMIT row_count OFFSET offset syntax. +// http://dev.mysql.com/doc/refman/5.0/en/select.html + +Harness.test({ + query: user + .select(user.star()) + .from(user) + .order(user.name.asc) + .limit(1), + pg: { + text: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT $1', + string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 1' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT $1', + string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 1' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` LIMIT ?', + string: 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` LIMIT 1' + }, + mssql: { + text: 'SELECT TOP(@1) [user].* FROM [user] ORDER BY [user].[name]', + string: 'SELECT TOP(1) [user].* FROM [user] ORDER BY [user].[name]' + }, + params: [1] +}); + +Harness.test({ + query: user + .select(user.star()) + .from(user) + .order(user.name.asc) + .limit(3) + .offset(6), + pg: { + text: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT $1 OFFSET $2', + string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 3 OFFSET 6' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT $1 OFFSET $2', + string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT 3 OFFSET 6' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` LIMIT ? OFFSET ?', + string: 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` LIMIT 3 OFFSET 6' + }, + params: [3, 6] +}); + +Harness.test({ + query: user + .select(user.star()) + .from(user) + .order(user.name.asc) + .limit(3) + .offset(6), + mssql: { + text: 'SELECT [user].* FROM [user] ORDER BY [user].[name] OFFSET @1 ROWS FETCH NEXT @2 ROWS ONLY', + string: 'SELECT [user].* FROM [user] ORDER BY [user].[name] OFFSET 6 ROWS FETCH NEXT 3 ROWS ONLY' + }, + params: [6, 3] +}); + +Harness.test({ + query: user + .select(user.star()) + .from(user) + .order(user.name.asc) + .offset(10), + pg: { + text: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET $1', + string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET 10' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET $1', + string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET 10' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` OFFSET ?', + string: 'SELECT `user`.* FROM `user` ORDER BY `user`.`name` OFFSET 10' + }, + mssql: { + text: 'SELECT [user].* FROM [user] ORDER BY [user].[name] OFFSET @1 ROWS', + string: 'SELECT [user].* FROM [user] ORDER BY [user].[name] OFFSET 10 ROWS' + }, + oracle: { + text: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET :1 ROWS', + string: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET 10 ROWS' + }, + params: [10] +}); + +Harness.test({ + query: user + .select(user.star()) + .where({ + name: 'John' + }) + .offset( + user + .subQuery() + .select('FLOOR(RANDOM() * COUNT(*))') + .where({ + name: 'John' + }) + ) + .limit(1), + pg: { + text: + 'SELECT "user".* FROM "user" WHERE ("user"."name" = $1) OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = $2)) LIMIT $3', + string: + 'SELECT "user".* FROM "user" WHERE ("user"."name" = \'John\') OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = \'John\')) LIMIT 1' + }, + sqlite: { + text: + 'SELECT "user".* FROM "user" WHERE ("user"."name" = $1) OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = $2)) LIMIT $3', + string: + 'SELECT "user".* FROM "user" WHERE ("user"."name" = \'John\') OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = \'John\')) LIMIT 1' + }, + mysql: { + text: + 'SELECT `user`.* FROM `user` WHERE (`user`.`name` = ?) OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM `user` WHERE (`user`.`name` = ?)) LIMIT ?', + string: + "SELECT `user`.* FROM `user` WHERE (`user`.`name` = 'John') OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM `user` WHERE (`user`.`name` = 'John')) LIMIT 1" + }, + mssql: { + text: 'Microsoft SQL Server does not support OFFSET without and ORDER BY.', + throws: true + }, + oracle: { + text: + 'SELECT "user".* FROM "user" WHERE ("user"."name" = :1) OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = :2)) ROWS FETCH NEXT :3 ROWS ONLY', + string: + 'SELECT "user".* FROM "user" WHERE ("user"."name" = \'John\') OFFSET (SELECT FLOOR(RANDOM() * COUNT(*)) FROM "user" WHERE ("user"."name" = \'John\')) ROWS FETCH NEXT 1 ROWS ONLY' + }, + values: ['John', 'John', 1] +}); + +// TODO: Should probably have a test case like the one above but including an ORDER BY clause so the mssql case can be tested diff --git a/test/dialects/literal-tests.js b/test/dialects/literal-tests.js deleted file mode 100644 index c31d4271..00000000 --- a/test/dialects/literal-tests.js +++ /dev/null @@ -1,72 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); - -Harness.test({ - query: user.select(user.literal('foo'), user.name, user.literal('123').as('onetwothree')), - pg: { - text : 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"', - string: 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"' - }, - sqlite: { - text : 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"', - string: 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"' - }, - mysql: { - text : 'SELECT foo, `user`.`name`, 123 AS `onetwothree` FROM `user`', - string: 'SELECT foo, `user`.`name`, 123 AS `onetwothree` FROM `user`' - }, - oracle: { - text : 'SELECT foo, "user"."name", 123 "onetwothree" FROM "user"', - string: 'SELECT foo, "user"."name", 123 "onetwothree" FROM "user"' - }, - params: [] -}); - - -Harness.test({ - query: user.select().where(user.literal('foo = bar')), - pg: { - text : 'SELECT "user".* FROM "user" WHERE foo = bar', - string: 'SELECT "user".* FROM "user" WHERE foo = bar' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" WHERE foo = bar', - string: 'SELECT "user".* FROM "user" WHERE foo = bar' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` WHERE foo = bar', - string: 'SELECT `user`.* FROM `user` WHERE foo = bar' - }, - oracle: { - text : 'SELECT "user".* FROM "user" WHERE foo = bar', - string: 'SELECT "user".* FROM "user" WHERE foo = bar' - }, - params: [] -}); - -// A real world example: "How many records does page 3 have?" -// This could be less than 10 (the limit) if we are on the last page. -var subquery = user.subQuery('subquery_for_count').select(user.literal(1).as('count_column')).limit(10).offset(20); - -Harness.test({ - query: user.select(subquery.count_column.count()).from(subquery), - pg: { - text : 'SELECT COUNT("subquery_for_count"."count_column") AS "count_column_count" FROM (SELECT 1 AS "count_column" FROM "user" LIMIT 10 OFFSET 20) "subquery_for_count"', - string: 'SELECT COUNT("subquery_for_count"."count_column") AS "count_column_count" FROM (SELECT 1 AS "count_column" FROM "user" LIMIT 10 OFFSET 20) "subquery_for_count"' - }, - sqlite: { - text : 'SELECT COUNT("subquery_for_count"."count_column") AS "count_column_count" FROM (SELECT 1 AS "count_column" FROM "user" LIMIT 10 OFFSET 20) "subquery_for_count"', - string: 'SELECT COUNT("subquery_for_count"."count_column") AS "count_column_count" FROM (SELECT 1 AS "count_column" FROM "user" LIMIT 10 OFFSET 20) "subquery_for_count"' - }, - mysql: { - text : 'SELECT COUNT(`subquery_for_count`.`count_column`) AS `count_column_count` FROM (SELECT 1 AS `count_column` FROM `user` LIMIT 10 OFFSET 20) `subquery_for_count`', - string: 'SELECT COUNT(`subquery_for_count`.`count_column`) AS `count_column_count` FROM (SELECT 1 AS `count_column` FROM `user` LIMIT 10 OFFSET 20) `subquery_for_count`' - }, - oracle: { - text : 'SELECT COUNT("subquery_for_count"."count_column") "count_column_count" FROM (SELECT 1 "count_column" FROM "user" OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY) "subquery_for_count"', - string: 'SELECT COUNT("subquery_for_count"."count_column") "count_column_count" FROM (SELECT 1 "count_column" FROM "user" OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY) "subquery_for_count"' - }, - params: [] -}); diff --git a/test/dialects/literal-tests.ts b/test/dialects/literal-tests.ts new file mode 100644 index 00000000..4f529ec1 --- /dev/null +++ b/test/dialects/literal-tests.ts @@ -0,0 +1,83 @@ +'use strict'; + +import * as Harness from './support'; +const user = Harness.defineUserTable(); + +Harness.test({ + query: user.select(user.literal('foo'), user.name, user.literal('123').as('onetwothree')), + pg: { + text: 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"', + string: 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"' + }, + sqlite: { + text: 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"', + string: 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"' + }, + mysql: { + text: 'SELECT foo, `user`.`name`, 123 AS `onetwothree` FROM `user`', + string: 'SELECT foo, `user`.`name`, 123 AS `onetwothree` FROM `user`' + }, + oracle: { + text: 'SELECT foo, "user"."name", 123 "onetwothree" FROM "user"', + string: 'SELECT foo, "user"."name", 123 "onetwothree" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select().where(user.literal('foo = bar')), + pg: { + text: 'SELECT "user".* FROM "user" WHERE foo = bar', + string: 'SELECT "user".* FROM "user" WHERE foo = bar' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" WHERE foo = bar', + string: 'SELECT "user".* FROM "user" WHERE foo = bar' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` WHERE foo = bar', + string: 'SELECT `user`.* FROM `user` WHERE foo = bar' + }, + oracle: { + text: 'SELECT "user".* FROM "user" WHERE foo = bar', + string: 'SELECT "user".* FROM "user" WHERE foo = bar' + }, + params: [] +}); + +// A real world example: "How many records does page 3 have?" +// This could be less than 10 (the limit) if we are on the last page. +var subquery = user + .subQuery('subquery_for_count') + .select(user.literal(1).as('count_column')) + .limit(10) + .offset(20); + +Harness.test({ + query: user.select(subquery.count_column.count()).from(subquery), + pg: { + text: + 'SELECT COUNT("subquery_for_count"."count_column") AS "count_column_count" FROM (SELECT 1 AS "count_column" FROM "user" LIMIT $1 OFFSET $2) "subquery_for_count"', + string: + 'SELECT COUNT("subquery_for_count"."count_column") AS "count_column_count" FROM (SELECT 1 AS "count_column" FROM "user" LIMIT 10 OFFSET 20) "subquery_for_count"' + }, + sqlite: { + text: + 'SELECT COUNT("subquery_for_count"."count_column") AS "count_column_count" FROM (SELECT 1 AS "count_column" FROM "user" LIMIT $1 OFFSET $2) "subquery_for_count"', + string: + 'SELECT COUNT("subquery_for_count"."count_column") AS "count_column_count" FROM (SELECT 1 AS "count_column" FROM "user" LIMIT 10 OFFSET 20) "subquery_for_count"' + }, + mysql: { + text: + 'SELECT COUNT(`subquery_for_count`.`count_column`) AS `count_column_count` FROM (SELECT 1 AS `count_column` FROM `user` LIMIT ? OFFSET ?) `subquery_for_count`', + string: + 'SELECT COUNT(`subquery_for_count`.`count_column`) AS `count_column_count` FROM (SELECT 1 AS `count_column` FROM `user` LIMIT 10 OFFSET 20) `subquery_for_count`' + }, + oracle: { + text: + 'SELECT COUNT("subquery_for_count"."count_column") "count_column_count" FROM (SELECT 1 "count_column" FROM "user" OFFSET :2 ROWS FETCH NEXT :1 ROWS ONLY) "subquery_for_count"', + string: + 'SELECT COUNT("subquery_for_count"."count_column") "count_column_count" FROM (SELECT 1 "count_column" FROM "user" OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY) "subquery_for_count"' + }, + params: [10, 20] +}); diff --git a/test/dialects/matches-test.js b/test/dialects/matches-test.js deleted file mode 100644 index c385641c..00000000 --- a/test/dialects/matches-test.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var customerAlias = Harness.defineCustomerAliasTable(); -var sql = require(__dirname + '/../../lib').setDialect('postgres'); - -//Postgres needs the to_tsquery function to use with @@ operator -Harness.test({ - query: post.select(post.star()).where(post.content.match(sql.functions.TO_TSQUERY('hello'))), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."content" @@ TO_TSQUERY($1))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."content" @@ TO_TSQUERY(\'hello\'))' - }, - params: ['hello'] -}); - - -Harness.test({ - query: post.select(post.star()).where(post.content.match('hello')), - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."content" MATCH $1)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."content" MATCH \'hello\')' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (MATCH `post`.`content` AGAINST ?)', - string: 'SELECT `post`.* FROM `post` WHERE (MATCH `post`.`content` AGAINST \'hello\')' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE (CONTAINS ([post].[content], @1))', - string: 'SELECT [post].* FROM [post] WHERE (CONTAINS ([post].[content], \'hello\'))' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE (INSTR ("post"."content", :1) > 0)', - string: 'SELECT "post".* FROM "post" WHERE (INSTR ("post"."content", \'hello\') > 0)' - }, - params: ['hello'] -}); - -//matches, ordered by best rank first -Harness.test({ - query: post.select(post.id, sql.functions.TS_RANK_CD(post.content, sql.functions.TO_TSQUERY('hello')).as('rank')). - where(post.content.match(sql.functions.TO_TSQUERY('hello'))).order(sql.functions.TS_RANK_CD(post.content, sql.functions.TO_TSQUERY('hello')).descending()), - pg: { - text : 'SELECT "post"."id", TS_RANK_CD("post"."content", TO_TSQUERY($1)) AS "rank" FROM "post" WHERE ("post"."content" @@ TO_TSQUERY($2)) ORDER BY TS_RANK_CD("post"."content", TO_TSQUERY($3)) DESC', - string: 'SELECT "post"."id", TS_RANK_CD("post"."content", TO_TSQUERY(\'hello\')) AS "rank" FROM "post" WHERE ("post"."content" @@ TO_TSQUERY(\'hello\')) ORDER BY TS_RANK_CD("post"."content", TO_TSQUERY(\'hello\')) DESC' - }, - params: ['hello','hello','hello'] -}); diff --git a/test/dialects/matches-test.ts b/test/dialects/matches-test.ts new file mode 100644 index 00000000..5a3a1d83 --- /dev/null +++ b/test/dialects/matches-test.ts @@ -0,0 +1,52 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const post = Harness.definePostTable(); +const instance = new Sql('postgres'); + +//Postgres needs the to_tsquery function to use with @@ operator +Harness.test({ + query: post.select(post.star()).where(post.content.match(instance.functions.TO_TSQUERY('hello'))), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."content" @@ TO_TSQUERY($1))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."content" @@ TO_TSQUERY(\'hello\'))' + }, + params: ['hello'] +}); + +Harness.test({ + query: post.select(post.star()).where(post.content.match('hello')), + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."content" MATCH $1)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."content" MATCH \'hello\')' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (MATCH `post`.`content` AGAINST ?)', + string: "SELECT `post`.* FROM `post` WHERE (MATCH `post`.`content` AGAINST 'hello')" + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE (CONTAINS ([post].[content], @1))', + string: "SELECT [post].* FROM [post] WHERE (CONTAINS ([post].[content], 'hello'))" + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE (INSTR ("post"."content", :1) > 0)', + string: 'SELECT "post".* FROM "post" WHERE (INSTR ("post"."content", \'hello\') > 0)' + }, + params: ['hello'] +}); + +//matches, ordered by best rank first +Harness.test({ + query: post + .select(post.id, instance.functions.TS_RANK_CD(post.content, instance.functions.TO_TSQUERY('hello')).as('rank')) + .where(post.content.match(instance.functions.TO_TSQUERY('hello'))) + .order(instance.functions.TS_RANK_CD(post.content, instance.functions.TO_TSQUERY('hello')).descending()), + pg: { + text: + 'SELECT "post"."id", TS_RANK_CD("post"."content", TO_TSQUERY($1)) AS "rank" FROM "post" WHERE ("post"."content" @@ TO_TSQUERY($2)) ORDER BY TS_RANK_CD("post"."content", TO_TSQUERY($3)) DESC', + string: + 'SELECT "post"."id", TS_RANK_CD("post"."content", TO_TSQUERY(\'hello\')) AS "rank" FROM "post" WHERE ("post"."content" @@ TO_TSQUERY(\'hello\')) ORDER BY TS_RANK_CD("post"."content", TO_TSQUERY(\'hello\')) DESC' + }, + params: ['hello', 'hello', 'hello'] +}); diff --git a/test/dialects/namespace-tests.js b/test/dialects/namespace-tests.js deleted file mode 100644 index 5f6b4a56..00000000 --- a/test/dialects/namespace-tests.js +++ /dev/null @@ -1,146 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var Table = require('../../lib/table'); -var user = Harness.defineUserTable(); -var post = Harness.definePostTable(); - -var u = user.as('u'); -Harness.test({ - query: u.select(u.name).from(u), - pg: { - text : 'SELECT "u"."name" FROM "user" AS "u"', - string: 'SELECT "u"."name" FROM "user" AS "u"' - }, - sqlite: { - text : 'SELECT "u"."name" FROM "user" AS "u"', - string: 'SELECT "u"."name" FROM "user" AS "u"' - }, - mysql: { - text : 'SELECT `u`.`name` FROM `user` AS `u`', - string: 'SELECT `u`.`name` FROM `user` AS `u`' - }, - mssql: { - text : 'SELECT [u].[name] FROM [user] AS [u]', - string: 'SELECT [u].[name] FROM [user] AS [u]' - }, - oracle: { - text : 'SELECT "u"."name" FROM "user" "u"', - string: 'SELECT "u"."name" FROM "user" "u"' - }, - params: [] -}); - -Harness.test({ - query: u.select(u.star()).from(u), - pg: { - text : 'SELECT "u".* FROM "user" AS "u"', - string: 'SELECT "u".* FROM "user" AS "u"' - }, - sqlite: { - text : 'SELECT "u".* FROM "user" AS "u"', - string: 'SELECT "u".* FROM "user" AS "u"' - }, - mysql: { - text : 'SELECT `u`.* FROM `user` AS `u`', - string: 'SELECT `u`.* FROM `user` AS `u`' - }, - mssql: { - text : 'SELECT [u].* FROM [user] AS [u]', - string: 'SELECT [u].* FROM [user] AS [u]' - }, - oracle: { - text : 'SELECT "u".* FROM "user" "u"', - string: 'SELECT "u".* FROM "user" "u"' - }, - params: [] -}); - -var p = post.as('p'); -Harness.test({ - query: u.select(u.name).from(u.join(p).on(u.id.equals(p.userId).and(p.id.equals(3)))), - pg: { - text : 'SELECT "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = $1))', - string: 'SELECT "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = 3))' - }, - sqlite: { - text : 'SELECT "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = $1))', - string: 'SELECT "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = 3))' - }, - mysql: { - text : 'SELECT `u`.`name` FROM `user` AS `u` INNER JOIN `post` AS `p` ON ((`u`.`id` = `p`.`userId`) AND (`p`.`id` = ?))', - string: 'SELECT `u`.`name` FROM `user` AS `u` INNER JOIN `post` AS `p` ON ((`u`.`id` = `p`.`userId`) AND (`p`.`id` = 3))' - }, - mssql: { - text : 'SELECT [u].[name] FROM [user] AS [u] INNER JOIN [post] AS [p] ON (([u].[id] = [p].[userId]) AND ([p].[id] = @1))', - string: 'SELECT [u].[name] FROM [user] AS [u] INNER JOIN [post] AS [p] ON (([u].[id] = [p].[userId]) AND ([p].[id] = 3))' - }, - oracle: { - text : 'SELECT "u"."name" FROM "user" "u" INNER JOIN "post" "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = :1))', - string: 'SELECT "u"."name" FROM "user" "u" INNER JOIN "post" "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = 3))' - }, - params: [3] -}); - -Harness.test({ - query: u.select(p.content, u.name).from(u.join(p).on(u.id.equals(p.userId).and(p.content.isNotNull()))), - pg: { - text : 'SELECT "p"."content", "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))', - string: 'SELECT "p"."content", "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))' - }, - sqlite: { - text : 'SELECT "p"."content", "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))', - string: 'SELECT "p"."content", "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))' - }, - mysql: { - text : 'SELECT `p`.`content`, `u`.`name` FROM `user` AS `u` INNER JOIN `post` AS `p` ON ((`u`.`id` = `p`.`userId`) AND (`p`.`content` IS NOT NULL))', - string: 'SELECT `p`.`content`, `u`.`name` FROM `user` AS `u` INNER JOIN `post` AS `p` ON ((`u`.`id` = `p`.`userId`) AND (`p`.`content` IS NOT NULL))' - }, - mssql: { - text : 'SELECT [p].[content], [u].[name] FROM [user] AS [u] INNER JOIN [post] AS [p] ON (([u].[id] = [p].[userId]) AND ([p].[content] IS NOT NULL))', - string: 'SELECT [p].[content], [u].[name] FROM [user] AS [u] INNER JOIN [post] AS [p] ON (([u].[id] = [p].[userId]) AND ([p].[content] IS NOT NULL))' - }, - oracle: { - text : 'SELECT "p"."content", "u"."name" FROM "user" "u" INNER JOIN "post" "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))', - string: 'SELECT "p"."content", "u"."name" FROM "user" "u" INNER JOIN "post" "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))' - }, - params: [] -}); - -// the quote property isn't implemented for columns, so all columns are quoted in generated queries -var comment = Table.define({ - name: 'comment', - columns: [{ - name: 'text', - quote: true - }, { - name: 'userId', - quote: false - } - ] -}); - -Harness.test({ - query: comment.select(comment.text, comment.userId), - pg: { - text : 'SELECT "comment"."text", "comment"."userId" FROM "comment"', - string: 'SELECT "comment"."text", "comment"."userId" FROM "comment"' - }, - sqlite: { - text : 'SELECT "comment"."text", "comment"."userId" FROM "comment"', - string: 'SELECT "comment"."text", "comment"."userId" FROM "comment"' - }, - mysql: { - text : 'SELECT `comment`.`text`, `comment`.`userId` FROM `comment`', - string: 'SELECT `comment`.`text`, `comment`.`userId` FROM `comment`' - }, - mssql: { - text : 'SELECT [comment].[text], [comment].[userId] FROM [comment]', - string: 'SELECT [comment].[text], [comment].[userId] FROM [comment]' - }, - orcle: { - text : 'SELECT "comment"."text", "comment"."userId" FROM "comment"', - string: 'SELECT "comment"."text", "comment"."userId" FROM "comment"' - }, - params: [] -}); diff --git a/test/dialects/namespace-tests.ts b/test/dialects/namespace-tests.ts new file mode 100644 index 00000000..8e6afae6 --- /dev/null +++ b/test/dialects/namespace-tests.ts @@ -0,0 +1,156 @@ +'use strict'; + +import * as Harness from './support'; +import { Table } from '../../lib/table'; +const user = Harness.defineUserTable(); +const post = Harness.definePostTable(); + +const u = user.as('u'); +Harness.test({ + query: u.select(u.name).from(u), + pg: { + text: 'SELECT "u"."name" FROM "user" AS "u"', + string: 'SELECT "u"."name" FROM "user" AS "u"' + }, + sqlite: { + text: 'SELECT "u"."name" FROM "user" AS "u"', + string: 'SELECT "u"."name" FROM "user" AS "u"' + }, + mysql: { + text: 'SELECT `u`.`name` FROM `user` AS `u`', + string: 'SELECT `u`.`name` FROM `user` AS `u`' + }, + mssql: { + text: 'SELECT [u].[name] FROM [user] AS [u]', + string: 'SELECT [u].[name] FROM [user] AS [u]' + }, + oracle: { + text: 'SELECT "u"."name" FROM "user" "u"', + string: 'SELECT "u"."name" FROM "user" "u"' + }, + params: [] +}); + +Harness.test({ + query: u.select(u.star()).from(u), + pg: { + text: 'SELECT "u".* FROM "user" AS "u"', + string: 'SELECT "u".* FROM "user" AS "u"' + }, + sqlite: { + text: 'SELECT "u".* FROM "user" AS "u"', + string: 'SELECT "u".* FROM "user" AS "u"' + }, + mysql: { + text: 'SELECT `u`.* FROM `user` AS `u`', + string: 'SELECT `u`.* FROM `user` AS `u`' + }, + mssql: { + text: 'SELECT [u].* FROM [user] AS [u]', + string: 'SELECT [u].* FROM [user] AS [u]' + }, + oracle: { + text: 'SELECT "u".* FROM "user" "u"', + string: 'SELECT "u".* FROM "user" "u"' + }, + params: [] +}); + +const p = post.as('p'); +Harness.test({ + query: u.select(u.name).from(u.join(p).on(u.id.equals(p.userId).and(p.id.equals(3)))), + pg: { + text: 'SELECT "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = $1))', + string: 'SELECT "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = 3))' + }, + sqlite: { + text: 'SELECT "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = $1))', + string: 'SELECT "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = 3))' + }, + mysql: { + text: 'SELECT `u`.`name` FROM `user` AS `u` INNER JOIN `post` AS `p` ON ((`u`.`id` = `p`.`userId`) AND (`p`.`id` = ?))', + string: 'SELECT `u`.`name` FROM `user` AS `u` INNER JOIN `post` AS `p` ON ((`u`.`id` = `p`.`userId`) AND (`p`.`id` = 3))' + }, + mssql: { + text: 'SELECT [u].[name] FROM [user] AS [u] INNER JOIN [post] AS [p] ON (([u].[id] = [p].[userId]) AND ([p].[id] = @1))', + string: 'SELECT [u].[name] FROM [user] AS [u] INNER JOIN [post] AS [p] ON (([u].[id] = [p].[userId]) AND ([p].[id] = 3))' + }, + oracle: { + text: 'SELECT "u"."name" FROM "user" "u" INNER JOIN "post" "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = :1))', + string: 'SELECT "u"."name" FROM "user" "u" INNER JOIN "post" "p" ON (("u"."id" = "p"."userId") AND ("p"."id" = 3))' + }, + params: [3] +}); + +Harness.test({ + query: u.select(p.content, u.name).from(u.join(p).on(u.id.equals(p.userId).and(p.content.isNotNull()))), + pg: { + text: + 'SELECT "p"."content", "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))', + string: + 'SELECT "p"."content", "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))' + }, + sqlite: { + text: + 'SELECT "p"."content", "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))', + string: + 'SELECT "p"."content", "u"."name" FROM "user" AS "u" INNER JOIN "post" AS "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))' + }, + mysql: { + text: + 'SELECT `p`.`content`, `u`.`name` FROM `user` AS `u` INNER JOIN `post` AS `p` ON ((`u`.`id` = `p`.`userId`) AND (`p`.`content` IS NOT NULL))', + string: + 'SELECT `p`.`content`, `u`.`name` FROM `user` AS `u` INNER JOIN `post` AS `p` ON ((`u`.`id` = `p`.`userId`) AND (`p`.`content` IS NOT NULL))' + }, + mssql: { + text: + 'SELECT [p].[content], [u].[name] FROM [user] AS [u] INNER JOIN [post] AS [p] ON (([u].[id] = [p].[userId]) AND ([p].[content] IS NOT NULL))', + string: + 'SELECT [p].[content], [u].[name] FROM [user] AS [u] INNER JOIN [post] AS [p] ON (([u].[id] = [p].[userId]) AND ([p].[content] IS NOT NULL))' + }, + oracle: { + text: + 'SELECT "p"."content", "u"."name" FROM "user" "u" INNER JOIN "post" "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))', + string: + 'SELECT "p"."content", "u"."name" FROM "user" "u" INNER JOIN "post" "p" ON (("u"."id" = "p"."userId") AND ("p"."content" IS NOT NULL))' + }, + params: [] +}); + +// the quote property isn't implemented for columns, so all columns are quoted in generated queries +const comment = Table.define<{ text: string; userId: number }>({ + name: 'comment', + columns: [ + { + name: 'text' + }, + { + name: 'userId' + } + ] +}); + +Harness.test({ + query: comment.select(comment.text, comment.userId), + pg: { + text: 'SELECT "comment"."text", "comment"."userId" FROM "comment"', + string: 'SELECT "comment"."text", "comment"."userId" FROM "comment"' + }, + sqlite: { + text: 'SELECT "comment"."text", "comment"."userId" FROM "comment"', + string: 'SELECT "comment"."text", "comment"."userId" FROM "comment"' + }, + mysql: { + text: 'SELECT `comment`.`text`, `comment`.`userId` FROM `comment`', + string: 'SELECT `comment`.`text`, `comment`.`userId` FROM `comment`' + }, + mssql: { + text: 'SELECT [comment].[text], [comment].[userId] FROM [comment]', + string: 'SELECT [comment].[text], [comment].[userId] FROM [comment]' + }, + orcle: { + text: 'SELECT "comment"."text", "comment"."userId" FROM "comment"', + string: 'SELECT "comment"."text", "comment"."userId" FROM "comment"' + }, + params: [] +}); diff --git a/test/dialects/not-in-clause-tests.js b/test/dialects/not-in-clause-tests.js deleted file mode 100644 index 11647fee..00000000 --- a/test/dialects/not-in-clause-tests.js +++ /dev/null @@ -1,179 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); - -Harness.test({ - query: post.select(post.star()).where(post.id.notIn([])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE (1=1)', - string: 'SELECT "post".* FROM "post" WHERE (1=1)' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE (1=1)', - string: 'SELECT "post".* FROM "post" WHERE (1=1)' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (1=1)', - string: 'SELECT `post`.* FROM `post` WHERE (1=1)' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE (1=1)', - string: 'SELECT [post].* FROM [post] WHERE (1=1)' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE (1=1)', - string: 'SELECT "post".* FROM "post" WHERE (1=1)' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.notIn([1])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN ($1))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1))' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN ($1))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1))' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` NOT IN (?))', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` NOT IN (1))' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] NOT IN (@1))', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] NOT IN (1))' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (:1))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1))' - }, - params: [1] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.notIn([null])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NOT NULL)', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NOT NULL)' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NOT NULL)', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NOT NULL)' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.notIn([1, 2])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN ($1, $2))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1, 2))' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN ($1, $2))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1, 2))' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` NOT IN (?, ?))', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` NOT IN (1, 2))' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] NOT IN (@1, @2))', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] NOT IN (1, 2))' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (:1, :2))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1, 2))' - }, - params: [1, 2] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.notIn([null, null])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NOT NULL)', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NOT NULL)' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NOT NULL)', - string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NOT NULL)' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', - string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.notIn([1, null, 2])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN ($1, $2) OR "post"."id" IS NULL))', - string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN ($1, $2) OR "post"."id" IS NULL))', - string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (NOT (`post`.`id` IN (?, ?) OR `post`.`id` IS NULL))', - string: 'SELECT `post`.* FROM `post` WHERE (NOT (`post`.`id` IN (1, 2) OR `post`.`id` IS NULL))' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE (NOT ([post].[id] IN (@1, @2) OR [post].[id] IS NULL))', - string: 'SELECT [post].* FROM [post] WHERE (NOT ([post].[id] IN (1, 2) OR [post].[id] IS NULL))' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (:1, :2) OR "post"."id" IS NULL))', - string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' - }, - params: [1, 2] -}); - -Harness.test({ - query: post.select(post.star()).where(post.id.notIn([1, null, 2, null])), - pg: { - text : 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN ($1, $2) OR "post"."id" IS NULL))', - string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN ($1, $2) OR "post"."id" IS NULL))', - string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (NOT (`post`.`id` IN (?, ?) OR `post`.`id` IS NULL))', - string: 'SELECT `post`.* FROM `post` WHERE (NOT (`post`.`id` IN (1, 2) OR `post`.`id` IS NULL))' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE (NOT ([post].[id] IN (@1, @2) OR [post].[id] IS NULL))', - string: 'SELECT [post].* FROM [post] WHERE (NOT ([post].[id] IN (1, 2) OR [post].[id] IS NULL))' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (:1, :2) OR "post"."id" IS NULL))', - string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' - }, - params: [1, 2] -}); diff --git a/test/dialects/not-in-clause-tests.ts b/test/dialects/not-in-clause-tests.ts new file mode 100644 index 00000000..9133d690 --- /dev/null +++ b/test/dialects/not-in-clause-tests.ts @@ -0,0 +1,179 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); + +Harness.test({ + query: post.select(post.star()).where(post.id.notIn([])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE (1=1)', + string: 'SELECT "post".* FROM "post" WHERE (1=1)' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE (1=1)', + string: 'SELECT "post".* FROM "post" WHERE (1=1)' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (1=1)', + string: 'SELECT `post`.* FROM `post` WHERE (1=1)' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE (1=1)', + string: 'SELECT [post].* FROM [post] WHERE (1=1)' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE (1=1)', + string: 'SELECT "post".* FROM "post" WHERE (1=1)' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.notIn([1])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN ($1))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1))' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN ($1))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1))' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` NOT IN (?))', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` NOT IN (1))' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] NOT IN (@1))', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] NOT IN (1))' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (:1))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1))' + }, + params: [1] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.notIn([null])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NOT NULL)', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NOT NULL)' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NOT NULL)', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NOT NULL)' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.notIn([1, 2])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN ($1, $2))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1, 2))' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN ($1, $2))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1, 2))' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` NOT IN (?, ?))', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` NOT IN (1, 2))' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] NOT IN (@1, @2))', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] NOT IN (1, 2))' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (:1, :2))', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" NOT IN (1, 2))' + }, + params: [1, 2] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.notIn([null, null])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NOT NULL)', + string: 'SELECT `post`.* FROM `post` WHERE (`post`.`id` IS NOT NULL)' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NOT NULL)', + string: 'SELECT [post].* FROM [post] WHERE ([post].[id] IS NOT NULL)' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)', + string: 'SELECT "post".* FROM "post" WHERE ("post"."id" IS NOT NULL)' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.notIn([1, null, 2])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN ($1, $2) OR "post"."id" IS NULL))', + string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN ($1, $2) OR "post"."id" IS NULL))', + string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (NOT (`post`.`id` IN (?, ?) OR `post`.`id` IS NULL))', + string: 'SELECT `post`.* FROM `post` WHERE (NOT (`post`.`id` IN (1, 2) OR `post`.`id` IS NULL))' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE (NOT ([post].[id] IN (@1, @2) OR [post].[id] IS NULL))', + string: 'SELECT [post].* FROM [post] WHERE (NOT ([post].[id] IN (1, 2) OR [post].[id] IS NULL))' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (:1, :2) OR "post"."id" IS NULL))', + string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' + }, + params: [1, 2] +}); + +Harness.test({ + query: post.select(post.star()).where(post.id.notIn([1, null, 2, null])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN ($1, $2) OR "post"."id" IS NULL))', + string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' + }, + sqlite: { + text: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN ($1, $2) OR "post"."id" IS NULL))', + string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' + }, + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (NOT (`post`.`id` IN (?, ?) OR `post`.`id` IS NULL))', + string: 'SELECT `post`.* FROM `post` WHERE (NOT (`post`.`id` IN (1, 2) OR `post`.`id` IS NULL))' + }, + mssql: { + text: 'SELECT [post].* FROM [post] WHERE (NOT ([post].[id] IN (@1, @2) OR [post].[id] IS NULL))', + string: 'SELECT [post].* FROM [post] WHERE (NOT ([post].[id] IN (1, 2) OR [post].[id] IS NULL))' + }, + oracle: { + text: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (:1, :2) OR "post"."id" IS NULL))', + string: 'SELECT "post".* FROM "post" WHERE (NOT ("post"."id" IN (1, 2) OR "post"."id" IS NULL))' + }, + params: [1, 2] +}); diff --git a/test/dialects/order-tests.js b/test/dialects/order-tests.js deleted file mode 100644 index a0813d8e..00000000 --- a/test/dialects/order-tests.js +++ /dev/null @@ -1,365 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var sql = require('../../lib'); - -Harness.test({ - query: post.select(post.content).order(post.content), - pg: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`', - string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]', - string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).order(post.content, post.userId.descending), - pg: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC', - string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC', - string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).order(post.content.asc, post.userId.desc), - pg: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC', - string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC', - string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).order([post.content, post.userId.descending]), - pg: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC', - string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC', - string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).order(post.content).order(post.userId.descending), - pg: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC', - string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC', - string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content.isNull()).order(post.content.isNull()), - pg: { - text : 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', - string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' - }, - sqlite: { - text : 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', - string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' - }, - mysql: { - text : 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL)', - string: 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL)' - }, - mssql: { - text : 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL)', - string: 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL)' - }, - oracle: { - text : 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', - string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content.isNull()).order(post.content.isNull().descending()), - pg: { - text : 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC', - string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC' - }, - sqlite: { - text : 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC', - string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC' - }, - mysql: { - text : 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL) DESC', - string: 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL) DESC' - }, - mssql: { - text : 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL) DESC', - string: 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL) DESC' - }, - oracle: { - text : 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC', - string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content.isNull()).order(post.content.isNull()), - pg: { - text : 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', - string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' - }, - sqlite: { - text : 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', - string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' - }, - mysql: { - text : 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL)', - string: 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL)' - }, - mssql: { - text : 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL)', - string: 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL)' - }, - oracle: { - text : 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', - string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' - }, - params: [] -}); - -Harness.test({ - query: post.select(sql.functions.RTRIM(post.content)).order(sql.functions.RTRIM(post.content)), - pg: { - text : 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")', - string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")' - }, - sqlite: { - text : 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")', - string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")' - }, - mysql: { - text : 'SELECT RTRIM(`post`.`content`) FROM `post` ORDER BY RTRIM(`post`.`content`)', - string: 'SELECT RTRIM(`post`.`content`) FROM `post` ORDER BY RTRIM(`post`.`content`)' - }, - mssql: { - text : 'SELECT RTRIM([post].[content]) FROM [post] ORDER BY RTRIM([post].[content])', - string: 'SELECT RTRIM([post].[content]) FROM [post] ORDER BY RTRIM([post].[content])' - }, - oracle: { - text : 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")', - string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")' - }, - params: [] -}); - -Harness.test({ - query: post.select(sql.functions.RTRIM(post.content)).order(sql.functions.RTRIM(post.content).descending()), - pg: { - text : 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC', - string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC' - }, - sqlite: { - text : 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC', - string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC' - }, - mysql: { - text : 'SELECT RTRIM(`post`.`content`) FROM `post` ORDER BY RTRIM(`post`.`content`) DESC', - string: 'SELECT RTRIM(`post`.`content`) FROM `post` ORDER BY RTRIM(`post`.`content`) DESC' - }, - mssql: { - text : 'SELECT RTRIM([post].[content]) FROM [post] ORDER BY RTRIM([post].[content]) DESC', - string: 'SELECT RTRIM([post].[content]) FROM [post] ORDER BY RTRIM([post].[content]) DESC' - }, - oracle: { - text : 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC', - string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).order(post.content.descending), - pg: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC NULLS LAST', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC NULLS LAST', - config: { - nullOrder: "last" - } - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content` DESC', - string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content` DESC' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] ORDER BY [post].[content] DESC', - string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content] DESC' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).order(post.content), - pg: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS LAST', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS LAST', - config: { - nullOrder: "last" - } - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`', - string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]', - string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).order(post.content.asc), - pg: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS FIRST', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS FIRST', - config: { - nullOrder: "first" - } - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`', - string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]', - string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', - string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).order([]), - pg: { - text : 'SELECT "post"."content" FROM "post"', - string: 'SELECT "post"."content" FROM "post"' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post"', - string: 'SELECT "post"."content" FROM "post"' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post`', - string: 'SELECT `post`.`content` FROM `post`' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post]', - string: 'SELECT [post].[content] FROM [post]' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post"', - string: 'SELECT "post"."content" FROM "post"' - }, - params: [] -}); - diff --git a/test/dialects/order-tests.ts b/test/dialects/order-tests.ts new file mode 100644 index 00000000..8db1fedb --- /dev/null +++ b/test/dialects/order-tests.ts @@ -0,0 +1,368 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const post = Harness.definePostTable(); +const instance = new Sql('postgres'); + +Harness.test({ + query: post.select(post.content).order(post.content), + pg: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`', + string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]', + string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).order(post.content, post.userId.desc), + pg: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC', + string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC', + string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).order(post.content.asc, post.userId.desc), + pg: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC', + string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC', + string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).order([post.content, post.userId.desc]), + pg: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC', + string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC', + string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + params: [] +}); + +Harness.test({ + query: post + .select(post.content) + .order(post.content) + .order(post.userId.desc), + pg: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC', + string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`, `post`.`userId` DESC' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC', + string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content], [post].[userId] DESC' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content.isNull()).order(post.content.isNull()), + pg: { + text: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', + string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' + }, + sqlite: { + text: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', + string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' + }, + mysql: { + text: 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL)', + string: 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL)' + }, + mssql: { + text: 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL)', + string: 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL)' + }, + oracle: { + text: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', + string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content.isNull()).order(post.content.isNull().descending()), + pg: { + text: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC', + string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC' + }, + sqlite: { + text: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC', + string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC' + }, + mysql: { + text: 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL) DESC', + string: 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL) DESC' + }, + mssql: { + text: 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL) DESC', + string: 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL) DESC' + }, + oracle: { + text: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC', + string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL) DESC' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content.isNull()).order(post.content.isNull()), + pg: { + text: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', + string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' + }, + sqlite: { + text: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', + string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' + }, + mysql: { + text: 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL)', + string: 'SELECT (`post`.`content` IS NULL) FROM `post` ORDER BY (`post`.`content` IS NULL)' + }, + mssql: { + text: 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL)', + string: 'SELECT ([post].[content] IS NULL) FROM [post] ORDER BY ([post].[content] IS NULL)' + }, + oracle: { + text: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)', + string: 'SELECT ("post"."content" IS NULL) FROM "post" ORDER BY ("post"."content" IS NULL)' + }, + params: [] +}); + +Harness.test({ + query: post.select(instance.functions.RTRIM(post.content)).order(instance.functions.RTRIM(post.content)), + pg: { + text: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")', + string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")' + }, + sqlite: { + text: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")', + string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")' + }, + mysql: { + text: 'SELECT RTRIM(`post`.`content`) FROM `post` ORDER BY RTRIM(`post`.`content`)', + string: 'SELECT RTRIM(`post`.`content`) FROM `post` ORDER BY RTRIM(`post`.`content`)' + }, + mssql: { + text: 'SELECT RTRIM([post].[content]) FROM [post] ORDER BY RTRIM([post].[content])', + string: 'SELECT RTRIM([post].[content]) FROM [post] ORDER BY RTRIM([post].[content])' + }, + oracle: { + text: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")', + string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content")' + }, + params: [] +}); + +Harness.test({ + query: post.select(instance.functions.RTRIM(post.content)).order(instance.functions.RTRIM(post.content).descending()), + pg: { + text: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC', + string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC' + }, + sqlite: { + text: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC', + string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC' + }, + mysql: { + text: 'SELECT RTRIM(`post`.`content`) FROM `post` ORDER BY RTRIM(`post`.`content`) DESC', + string: 'SELECT RTRIM(`post`.`content`) FROM `post` ORDER BY RTRIM(`post`.`content`) DESC' + }, + mssql: { + text: 'SELECT RTRIM([post].[content]) FROM [post] ORDER BY RTRIM([post].[content]) DESC', + string: 'SELECT RTRIM([post].[content]) FROM [post] ORDER BY RTRIM([post].[content]) DESC' + }, + oracle: { + text: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC', + string: 'SELECT RTRIM("post"."content") FROM "post" ORDER BY RTRIM("post"."content") DESC' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).order(post.content.desc), + pg: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC NULLS LAST', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC NULLS LAST', + config: { + nullOrder: 'last' + } + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content` DESC', + string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content` DESC' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content] DESC', + string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content] DESC' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).order(post.content), + pg: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS LAST', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS LAST', + config: { + nullOrder: 'last' + } + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`', + string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]', + string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).order(post.content.asc), + pg: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS FIRST', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS FIRST', + config: { + nullOrder: 'first' + } + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`', + string: 'SELECT `post`.`content` FROM `post` ORDER BY `post`.`content`' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]', + string: 'SELECT [post].[content] FROM [post] ORDER BY [post].[content]' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"', + string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).order([]), + pg: { + text: 'SELECT "post"."content" FROM "post"', + string: 'SELECT "post"."content" FROM "post"' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post"', + string: 'SELECT "post"."content" FROM "post"' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post`', + string: 'SELECT `post`.`content` FROM `post`' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post]', + string: 'SELECT [post].[content] FROM [post]' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post"', + string: 'SELECT "post"."content" FROM "post"' + }, + params: [] +}); diff --git a/test/dialects/regex-tests.js b/test/dialects/regex-tests.js deleted file mode 100644 index 40dde618..00000000 --- a/test/dialects/regex-tests.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var Sql = require('../../lib').setDialect('postgres'); - -Harness.test({ - query: customer.select(customer.metadata.regex('age')), - pg: { - text : 'SELECT ("customer"."metadata" ~ $1) FROM "customer"', - string: 'SELECT ("customer"."metadata" ~ \'age\') FROM "customer"' - }, - params: ['age'] -}); - -Harness.test({ - query: customer.select(customer.metadata.iregex('age')), - pg: { - text : 'SELECT ("customer"."metadata" ~* $1) FROM "customer"', - string: 'SELECT ("customer"."metadata" ~* \'age\') FROM "customer"' - }, - params: ['age'] -}); - -Harness.test({ - query: customer.select(customer.metadata.notRegex('age')), - pg: { - text : 'SELECT ("customer"."metadata" !~ $1) FROM "customer"', - string: 'SELECT ("customer"."metadata" !~ \'age\') FROM "customer"' - }, - params: ['age'] -}); - -Harness.test({ - query: customer.select(customer.metadata.notIregex('age')), - pg: { - text : 'SELECT ("customer"."metadata" !~* $1) FROM "customer"', - string: 'SELECT ("customer"."metadata" !~* \'age\') FROM "customer"' - }, - params: ['age'] -}); diff --git a/test/dialects/regex-tests.ts b/test/dialects/regex-tests.ts new file mode 100644 index 00000000..b6553037 --- /dev/null +++ b/test/dialects/regex-tests.ts @@ -0,0 +1,40 @@ +'use strict'; + +import * as Harness from './support'; +const customer = Harness.defineCustomerTable(); + +Harness.test({ + query: customer.select(customer.metadata.regex('age')), + pg: { + text: 'SELECT ("customer"."metadata" ~ $1) FROM "customer"', + string: 'SELECT ("customer"."metadata" ~ \'age\') FROM "customer"' + }, + params: ['age'] +}); + +Harness.test({ + query: customer.select(customer.metadata.iregex('age')), + pg: { + text: 'SELECT ("customer"."metadata" ~* $1) FROM "customer"', + string: 'SELECT ("customer"."metadata" ~* \'age\') FROM "customer"' + }, + params: ['age'] +}); + +Harness.test({ + query: customer.select(customer.metadata.notRegex('age')), + pg: { + text: 'SELECT ("customer"."metadata" !~ $1) FROM "customer"', + string: 'SELECT ("customer"."metadata" !~ \'age\') FROM "customer"' + }, + params: ['age'] +}); + +Harness.test({ + query: customer.select(customer.metadata.notIregex('age')), + pg: { + text: 'SELECT ("customer"."metadata" !~* $1) FROM "customer"', + string: 'SELECT ("customer"."metadata" !~* \'age\') FROM "customer"' + }, + params: ['age'] +}); diff --git a/test/dialects/replace-tests.js b/test/dialects/replace-tests.js deleted file mode 100644 index 72af0e4b..00000000 --- a/test/dialects/replace-tests.js +++ /dev/null @@ -1,1000 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var user = Harness.defineUserTable(); -var contentTable = Harness.defineContentTable(); -var customerAliasTable = Harness.defineCustomerAliasTable(); - -var arrayTable = require('../../lib/table').define({ - name: 'arraytest', - columns: ['id', 'numbers'] -}); - -Harness.test({ - query: post.replace(post.content.value('test'), post.userId.value(1)), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'REPLACE INTO "post" ("content", "userId") VALUES (\'test\', 1)' - }, - mysql: { - text : 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?)', - string: 'REPLACE INTO `post` (`content`, `userId`) VALUES (\'test\', 1)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 1] -}); - -Harness.test({ - query: post.replace(post.content.value('whoah')), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content") VALUES ($1)', - string: 'REPLACE INTO "post" ("content") VALUES (\'whoah\')' - }, - mysql: { - text : 'REPLACE INTO `post` (`content`) VALUES (?)', - string: 'REPLACE INTO `post` (`content`) VALUES (\'whoah\')' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['whoah'] -}); - -Harness.test({ - query: post.replace({length: 0}), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("length") VALUES ($1)', - string: 'REPLACE INTO "post" ("length") VALUES (0)' - }, - mysql: { - text : 'REPLACE INTO `post` (`length`) VALUES (?)', - string: 'REPLACE INTO `post` (`length`) VALUES (0)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [0] -}); - -Harness.test({ - query: post.replace({ - content: 'test', - userId: 2 - }), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'REPLACE INTO "post" ("content", "userId") VALUES (\'test\', 2)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2] -}); - -Harness.test({ - query: post.replace({ - content: post.sql.functions.LOWER('TEST'), - userId: 2 - }), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content", "userId") VALUES (LOWER($1), $2)', - string: 'REPLACE INTO "post" ("content", "userId") VALUES (LOWER(\'TEST\'), 2)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['TEST', 2] -}); - -// allow bulk replace -Harness.test({ - query: post.replace([{ - content: 'whoah' - }, { - content: 'hey' - } - ]), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content") VALUES ($1), ($2)', - string: 'REPLACE INTO "post" ("content") VALUES (\'whoah\'), (\'hey\')' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['whoah', 'hey'] -}); - -Harness.test({ - query: post.replace([{ - content: 'whoah', - userId: 1 - }, { - content: 'hey', - userId: 2 - } - ]), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', - string: 'REPLACE INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['whoah', 1, 'hey', 2] -}); - -// consistent order -Harness.test({ - query: post.replace([{ - content: 'whoah', - userId: 1 - }, { - userId: 2, - content: 'hey' - } - ]), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', - string: 'REPLACE INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - mysql: { - text : 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?), (?, ?)', - string: 'REPLACE INTO `post` (`content`, `userId`) VALUES (\'whoah\', 1), (\'hey\', 2)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['whoah', 1, 'hey', 2] -}); - -Harness.test({ - query: post.replace({}), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" DEFAULT VALUES', - string: 'REPLACE INTO "post" DEFAULT VALUES' - }, - mysql: { - text : 'REPLACE INTO `post` () VALUES ()', - string: 'REPLACE INTO `post` () VALUES ()' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.replace({}).returning('*'), - pg: { - throws: true - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.replace({}).returning(post.star()), - pg: { - throws: true - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.replace({}).returning(post.id), - pg: { - throws: true - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.replace({}).returning(post.id, post.content), - pg: { - throws: true - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.replace({}).returning([post.id, post.content]), - pg: { - throws: true - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -// handle missing columns -Harness.test({ - query: post.replace([{ - content: 'whoah', - userId: 1 - }, { - content: 'hey' - } - ]), - pg: { - throws: true - }, - sqlite: { - text : 'Sqlite requires the same number of columns in each replace row', - throws: true - }, - mysql: { - text : 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?), (?, DEFAULT)', - string: 'REPLACE INTO `post` (`content`, `userId`) VALUES (\'whoah\', 1), (\'hey\', DEFAULT)', - params: ['whoah', 1, 'hey'] - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, -}); - -Harness.test({ - query: post.replace([{ - userId: 1 - }, { - content: 'hey', - userId: 2 - } - ]), - pg: { - throws: true - }, - sqlite: { - text : 'Sqlite requires the same number of columns in each replace row', - throws: true - }, - mysql: { - text : 'REPLACE INTO `post` (`userId`, `content`) VALUES (?, DEFAULT), (?, ?)', - string: 'REPLACE INTO `post` (`userId`, `content`) VALUES (1, DEFAULT), (2, \'hey\')', - params: [1, 2, 'hey'] - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, -}); - -Harness.test({ - query: post.replace(post.content, post.userId) - .select('\'test\'', user.id).from(user).where(user.name.like('A%')), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', - string: 'REPLACE INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - mysql: { - text : 'REPLACE INTO `post` (`content`, `userId`) SELECT \'test\', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)', - string: 'REPLACE INTO `post` (`content`, `userId`) SELECT \'test\', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE \'A%\')' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['A%'] -}); - -Harness.test({ - query: post.replace([post.content, post.userId]) - .select('\'test\'', user.id).from(user).where(user.name.like('A%')), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', - string: 'REPLACE INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - mysql: { - text : 'REPLACE INTO `post` (`content`, `userId`) SELECT \'test\', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)', - string: 'REPLACE INTO `post` (`content`, `userId`) SELECT \'test\', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE \'A%\')' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['A%'] -}); - -Harness.test({ - query: post.replace(post.userId) - .select(user.id).from(user).where(user.name.like('A%')), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', - string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['A%'] -}); - -Harness.test({ - query: post.replace(post.userId) - .select(post.userId).from(user.join(post).on(user.id.equals(post.userId))).where(post.tags.like('A%')), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE $1)', - string: 'REPLACE INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE \'A%\')' - }, - mysql: { - text : 'REPLACE INTO `post` (`userId`) SELECT `post`.`userId` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`tags` LIKE ?)', - string: 'REPLACE INTO `post` (`userId`) SELECT `post`.`userId` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`tags` LIKE \'A%\')' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['A%'] -}); - -Harness.test({ - query: post.replace(post.userId).select(user.id).distinct().from(user), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"', - string: 'REPLACE INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"' - }, - mysql: { - text : 'REPLACE INTO `post` (`userId`) SELECT DISTINCT `user`.`id` FROM `user`', - string: 'REPLACE INTO `post` (`userId`) SELECT DISTINCT `user`.`id` FROM `user`' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -// Binary replaces -Harness.test({ - query: post.replace(post.content.value(new Buffer('test')), post.userId.value(2)), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'REPLACE INTO "post" ("content", "userId") VALUES (x\'74657374\', 2)' - }, - mysql: { - text : 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?)', - string: 'REPLACE INTO `post` (`content`, `userId`) VALUES (x\'74657374\', 2)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [new Buffer('test'), 2] -}); - -Harness.test({ - query: post.replace({ - content: new Buffer('test'), - userId: 2 - }), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2)', - string: 'REPLACE INTO "post" ("content", "userId") VALUES (x\'74657374\', 2)' - }, - mysql: { - text : 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?)', - string: 'REPLACE INTO `post` (`content`, `userId`) VALUES (x\'74657374\', 2)' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [new Buffer('test'), 2] -}); - -Harness.test({ - query: post.replace([{ - content: new Buffer('whoah') - }, { - content: new Buffer('hey') - } - ]), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("content") VALUES ($1), ($2)', - string: 'REPLACE INTO "post" ("content") VALUES (x\'77686f6168\'), (x\'686579\')' - }, - mysql: { - text : 'REPLACE INTO `post` (`content`) VALUES (?), (?)', - string: 'REPLACE INTO `post` (`content`) VALUES (x\'77686f6168\'), (x\'686579\')' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [new Buffer('whoah'), new Buffer('hey')] -}); - -Harness.test({ - query: post.replace({ - content: 'test', - userId: 2 - }).onDuplicate({ - content: 'testupdate', - }), - pg: { - throws: true - }, - sqlite: { - throws: true - }, - mysql: { - text : 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `post`.`content` = ?', - string: 'REPLACE INTO `post` (`content`, `userId`) VALUES (\'test\', 2) ON DUPLICATE KEY UPDATE `post`.`content` = \'testupdate\'' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2, 'testupdate'] -}); - -Harness.test({ - query: customerAliasTable.replace({ - id : 2, - name : 'test' - }).onConflict({ - columns: ['id'], - update: ['name'] - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [2, 'test'] -}); - -Harness.test({ - query: customerAliasTable.replace({ - id : 2, - name : 'test' - }).orIgnore(), - mysql: { - throws: true - }, - sqlite: { - text : 'REPLACE OR IGNORE INTO "customer" ("id", "name") VALUES ($1, $2)', - string: 'REPLACE OR IGNORE INTO "customer" ("id", "name") VALUES (2, \'test\')' - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [2, 'test'] -}); - -Harness.test({ - query: post.replace({ - content: 'test', - userId: 2 - }).onConflict({ - columns: ['userId'], - update: ['content'] - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2] -}); - -Harness.test({ - query: post.replace({ - content: 'test', - userId: 2 - }).onConflict({ - columns: ['userId','content'], - update: ['content','userId'] - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2] -}); - -Harness.test({ - query: post.replace({ - content: 'test', - userId: 2 - }).onConflict({ - columns: ['userId'], - update: ['content'] - }).where(post.userId.equals(2)), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2, 2] -}); - -Harness.test({ - query: post.replace({ - content: 'test', - userId: 2 - }).onConflict({ - constraint: 'conc_userId', - update: ['content'] - }).where(post.userId.equals(2)), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2, 2] -}); - -Harness.test({ - query: post.replace({ - content: 'test', - userId: 2 - }).onConflict({ - columns: ['userId'], - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2] -}); - -Harness.test({ - query: post.replace({ - content: 'test', - userId: 2 - }).onConflict({ - constraint: 'conc_userId', - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: ['test', 2] -}); - -Harness.test({ - query: contentTable.replace({ - contentId: 20, - text : "something" - }).onConflict({ - columns: ['contentId'], - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [20, "something"] -}); - -Harness.test({ - query: contentTable.replace({ - contentId: 20, - text : "something", - contentPosts : "another thing", - }).onConflict({ - columns: ['contentId'], - update: ['contentPosts'] - }), - mysql: { - throws: true - }, - sqlite: { - throws: true - }, - pg: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [20, "something", "another thing"] -}); - -Harness.test({ - query: post.replace([]), - - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (1=2)', - string: 'SELECT `post`.* FROM `post` WHERE (1=2)' - }, - params: [] -}); - -Harness.test({ - query: arrayTable.replace(arrayTable.id.value(1), arrayTable.numbers.value([2, 3, 4])), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', - string: 'REPLACE INTO "arraytest" ("id", "numbers") VALUES (1, \'[2,3,4]\')' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - } -}); - -Harness.test({ - query: arrayTable.replace(arrayTable.id.value(1), arrayTable.numbers.value(["one", "two", "three"])), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', - string: 'REPLACE INTO "arraytest" ("id", "numbers") VALUES (1, \'["one","two","three"]\')' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - } -}); - -Harness.test({ - query: post.replace(post.userId).select(user.id).from(user), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - mysql: { - text : 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', - string: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.replace(post.userId).select(user.id).from(user).onConflict({ - columns: ['userId'], - update: ['content'] - }), - pg: { - throws: true - }, - sqlite: { - throws: true - }, - mysql: { - throws: true - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.replace(post.userId).add(user.select(user.id)), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - mysql: { - text : 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', - string: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.replace(post.userId).add(user.select(user.id).from(user)), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"', - string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"' - }, - mysql: { - text : 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', - string: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); - -Harness.test({ - query: post.replace(post.userId).add(user.select(user.id).order(user.id)), - pg: { - throws: true - }, - sqlite: { - text : 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"', - string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"' - }, - mysql: { - text : 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user` ORDER BY `user`.`id`', - string: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user` ORDER BY `user`.`id`' - }, - mssql: { - throws: true - }, - oracle: { - throws: true - }, - params: [] -}); diff --git a/test/dialects/replace-tests.ts b/test/dialects/replace-tests.ts new file mode 100644 index 00000000..1f4af895 --- /dev/null +++ b/test/dialects/replace-tests.ts @@ -0,0 +1,1064 @@ +'use strict'; + +import * as Harness from './support'; +import { Table } from '../../lib/table'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); +const contentTable = Harness.defineContentTable(); +const customerAliasTable = Harness.defineCustomerAliasTable(); + +const arrayTable = Table.define<{ id: number; numbers: any[] }>({ + name: 'arraytest', + columns: ['id', 'numbers'] +}); + +Harness.test({ + query: post.replace(post.content.value('test'), post.userId.value(1)), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'REPLACE INTO "post" ("content", "userId") VALUES (\'test\', 1)' + }, + mysql: { + text: 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?)', + string: "REPLACE INTO `post` (`content`, `userId`) VALUES ('test', 1)" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 1] +}); + +Harness.test({ + query: post.replace(post.content.value('whoah')), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content") VALUES ($1)', + string: 'REPLACE INTO "post" ("content") VALUES (\'whoah\')' + }, + mysql: { + text: 'REPLACE INTO `post` (`content`) VALUES (?)', + string: "REPLACE INTO `post` (`content`) VALUES ('whoah')" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['whoah'] +}); + +Harness.test({ + query: post.replace({ length: 0 }), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("length") VALUES ($1)', + string: 'REPLACE INTO "post" ("length") VALUES (0)' + }, + mysql: { + text: 'REPLACE INTO `post` (`length`) VALUES (?)', + string: 'REPLACE INTO `post` (`length`) VALUES (0)' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [0] +}); + +Harness.test({ + query: post.replace({ + content: 'test', + userId: 2 + }), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'REPLACE INTO "post" ("content", "userId") VALUES (\'test\', 2)' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + +Harness.test({ + query: post.replace({ + content: post.sql.functions.LOWER('TEST'), + userId: 2 + }), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content", "userId") VALUES (LOWER($1), $2)', + string: 'REPLACE INTO "post" ("content", "userId") VALUES (LOWER(\'TEST\'), 2)' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['TEST', 2] +}); + +// allow bulk replace +Harness.test({ + query: post.replace([ + { + content: 'whoah' + }, + { + content: 'hey' + } + ]), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content") VALUES ($1), ($2)', + string: 'REPLACE INTO "post" ("content") VALUES (\'whoah\'), (\'hey\')' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['whoah', 'hey'] +}); + +Harness.test({ + query: post.replace([ + { + content: 'whoah', + userId: 1 + }, + { + content: 'hey', + userId: 2 + } + ]), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', + string: 'REPLACE INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['whoah', 1, 'hey', 2] +}); + +// consistent order +Harness.test({ + query: post.replace([ + { + content: 'whoah', + userId: 1 + }, + { + userId: 2, + content: 'hey' + } + ]), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2), ($3, $4)', + string: 'REPLACE INTO "post" ("content", "userId") VALUES (\'whoah\', 1), (\'hey\', 2)' + }, + mysql: { + text: 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?), (?, ?)', + string: "REPLACE INTO `post` (`content`, `userId`) VALUES ('whoah', 1), ('hey', 2)" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['whoah', 1, 'hey', 2] +}); + +Harness.test({ + query: post.replace({}), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" DEFAULT VALUES', + string: 'REPLACE INTO "post" DEFAULT VALUES' + }, + mysql: { + text: 'REPLACE INTO `post` () VALUES ()', + string: 'REPLACE INTO `post` () VALUES ()' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.replace({}).returning('*'), + pg: { + throws: true + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.replace({}).returning(post.star()), + pg: { + throws: true + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.replace({}).returning(post.id), + pg: { + throws: true + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.replace({}).returning(post.id, post.content), + pg: { + throws: true + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.replace({}).returning([post.id, post.content]), + pg: { + throws: true + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +// handle missing columns +Harness.test({ + query: post.replace([ + { + content: 'whoah', + userId: 1 + }, + { + content: 'hey' + } + ]), + pg: { + throws: true + }, + sqlite: { + text: 'Sqlite requires the same number of columns in each replace row', + throws: true + }, + mysql: { + text: 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?), (?, DEFAULT)', + string: "REPLACE INTO `post` (`content`, `userId`) VALUES ('whoah', 1), ('hey', DEFAULT)", + params: ['whoah', 1, 'hey'] + }, + mssql: { + throws: true + }, + oracle: { + throws: true + } +}); + +Harness.test({ + query: post.replace([ + { + userId: 1 + }, + { + content: 'hey', + userId: 2 + } + ]), + pg: { + throws: true + }, + sqlite: { + text: 'Sqlite requires the same number of columns in each replace row', + throws: true + }, + mysql: { + text: 'REPLACE INTO `post` (`userId`, `content`) VALUES (?, DEFAULT), (?, ?)', + string: "REPLACE INTO `post` (`userId`, `content`) VALUES (1, DEFAULT), (2, 'hey')", + params: [1, 2, 'hey'] + }, + mssql: { + throws: true + }, + oracle: { + throws: true + } +}); + +Harness.test({ + query: post + .replace(post.content, post.userId) + .select("'test'", user.id) + .from(user) + .where(user.name.like('A%')), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', + string: 'REPLACE INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + mysql: { + text: "REPLACE INTO `post` (`content`, `userId`) SELECT 'test', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)", + string: "REPLACE INTO `post` (`content`, `userId`) SELECT 'test', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE 'A%')" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .replace([post.content, post.userId]) + .select("'test'", user.id) + .from(user) + .where(user.name.like('A%')), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', + string: 'REPLACE INTO "post" ("content", "userId") SELECT \'test\', "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + mysql: { + text: "REPLACE INTO `post` (`content`, `userId`) SELECT 'test', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE ?)", + string: "REPLACE INTO `post` (`content`, `userId`) SELECT 'test', `user`.`id` FROM `user` WHERE (`user`.`name` LIKE 'A%')" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .replace(post.userId) + .select(user.id) + .from(user) + .where(user.name.like('A%')), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE $1)', + string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user" WHERE ("user"."name" LIKE \'A%\')' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .replace(post.userId) + .select(post.userId) + .from(user.join(post).on(user.id.equals(post.userId))) + .where(post.tags.like('A%')), + pg: { + throws: true + }, + sqlite: { + text: + 'REPLACE INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE $1)', + string: + 'REPLACE INTO "post" ("userId") SELECT "post"."userId" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId") WHERE ("post"."tags" LIKE \'A%\')' + }, + mysql: { + text: + 'REPLACE INTO `post` (`userId`) SELECT `post`.`userId` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`tags` LIKE ?)', + string: + "REPLACE INTO `post` (`userId`) SELECT `post`.`userId` FROM `user` INNER JOIN `post` ON (`user`.`id` = `post`.`userId`) WHERE (`post`.`tags` LIKE 'A%')" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['A%'] +}); + +Harness.test({ + query: post + .replace(post.userId) + .select(user.id) + .distinct() + .from(user), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"', + string: 'REPLACE INTO "post" ("userId") SELECT DISTINCT "user"."id" FROM "user"' + }, + mysql: { + text: 'REPLACE INTO `post` (`userId`) SELECT DISTINCT `user`.`id` FROM `user`', + string: 'REPLACE INTO `post` (`userId`) SELECT DISTINCT `user`.`id` FROM `user`' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +// Binary replaces +Harness.test({ + query: post.replace(post.content.value(new Buffer('test')), post.userId.value(2)), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'REPLACE INTO "post" ("content", "userId") VALUES (x\'74657374\', 2)' + }, + mysql: { + text: 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?)', + string: "REPLACE INTO `post` (`content`, `userId`) VALUES (x'74657374', 2)" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [new Buffer('test'), 2] +}); + +Harness.test({ + query: post.replace({ + content: new Buffer('test'), + userId: 2 + }), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content", "userId") VALUES ($1, $2)', + string: 'REPLACE INTO "post" ("content", "userId") VALUES (x\'74657374\', 2)' + }, + mysql: { + text: 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?)', + string: "REPLACE INTO `post` (`content`, `userId`) VALUES (x'74657374', 2)" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [new Buffer('test'), 2] +}); + +Harness.test({ + query: post.replace([ + { + content: new Buffer('whoah') + }, + { + content: new Buffer('hey') + } + ]), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("content") VALUES ($1), ($2)', + string: 'REPLACE INTO "post" ("content") VALUES (x\'77686f6168\'), (x\'686579\')' + }, + mysql: { + text: 'REPLACE INTO `post` (`content`) VALUES (?), (?)', + string: "REPLACE INTO `post` (`content`) VALUES (x'77686f6168'), (x'686579')" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [new Buffer('whoah'), new Buffer('hey')] +}); + +Harness.test({ + query: post + .replace({ + content: 'test', + userId: 2 + }) + .onDuplicate({ + content: 'testupdate' + }), + pg: { + throws: true + }, + sqlite: { + throws: true + }, + mysql: { + text: 'REPLACE INTO `post` (`content`, `userId`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `post`.`content` = ?', + string: "REPLACE INTO `post` (`content`, `userId`) VALUES ('test', 2) ON DUPLICATE KEY UPDATE `post`.`content` = 'testupdate'" + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2, 'testupdate'] +}); + +Harness.test({ + query: customerAliasTable + .replace({ + id: 2, + name: 'test' + }) + .onConflict({ + columns: ['id'], + update: ['name'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [2, 'test'] +}); + +Harness.test({ + query: customerAliasTable + .replace({ + id: 2, + name: 'test' + }) + .orIgnore(), + mysql: { + throws: true + }, + sqlite: { + text: 'REPLACE OR IGNORE INTO "customer" ("id", "name") VALUES ($1, $2)', + string: 'REPLACE OR IGNORE INTO "customer" ("id", "name") VALUES (2, \'test\')' + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [2, 'test'] +}); + +Harness.test({ + query: post + .replace({ + content: 'test', + userId: 2 + }) + .onConflict({ + columns: ['userId'], + update: ['content'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + +Harness.test({ + query: post + .replace({ + content: 'test', + userId: 2 + }) + .onConflict({ + columns: ['userId', 'content'], + update: ['content', 'userId'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + +Harness.test({ + query: post + .replace({ + content: 'test', + userId: 2 + }) + .onConflict({ + columns: ['userId'], + update: ['content'] + }) + .where(post.userId.equals(2)), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2, 2] +}); + +Harness.test({ + query: post + .replace({ + content: 'test', + userId: 2 + }) + .onConflict({ + constraint: 'conc_userId', + update: ['content'] + }) + .where(post.userId.equals(2)), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2, 2] +}); + +Harness.test({ + query: post + .replace({ + content: 'test', + userId: 2 + }) + .onConflict({ + columns: ['userId'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + +Harness.test({ + query: post + .replace({ + content: 'test', + userId: 2 + }) + .onConflict({ + constraint: 'conc_userId' + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + +Harness.test({ + query: contentTable + .replace({ + contentId: 20, + text: 'something' + }) + .onConflict({ + columns: ['contentId'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [20, 'something'] +}); + +Harness.test({ + query: contentTable + .replace({ + contentId: 20, + text: 'something', + contentPosts: 'another thing' + }) + .onConflict({ + columns: ['contentId'], + update: ['contentPosts'] + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [20, 'something', 'another thing'] +}); + +Harness.test({ + query: post.replace([]), + + mysql: { + text: 'SELECT `post`.* FROM `post` WHERE (1=2)', + string: 'SELECT `post`.* FROM `post` WHERE (1=2)' + }, + params: [] +}); + +Harness.test({ + query: arrayTable.replace(arrayTable.id.value(1), arrayTable.numbers.value([2, 3, 4])), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', + string: 'REPLACE INTO "arraytest" ("id", "numbers") VALUES (1, \'[2,3,4]\')' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + } +}); + +Harness.test({ + query: arrayTable.replace(arrayTable.id.value(1), arrayTable.numbers.value(['one', 'two', 'three'])), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "arraytest" ("id", "numbers") VALUES ($1, $2)', + string: 'REPLACE INTO "arraytest" ("id", "numbers") VALUES (1, \'["one","two","three"]\')' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + } +}); + +Harness.test({ + query: post + .replace(post.userId) + .select(user.id) + .from(user), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + mysql: { + text: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', + string: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post + .replace(post.userId) + .select(user.id) + .from(user) + .onConflict({ + columns: ['userId'], + update: ['content'] + }), + pg: { + throws: true + }, + sqlite: { + throws: true + }, + mysql: { + throws: true + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.replace(post.userId).add(user.select(user.id)), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + mysql: { + text: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', + string: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.replace(post.userId).add(user.select(user.id).from(user)), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"', + string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user"' + }, + mysql: { + text: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`', + string: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user`' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); + +Harness.test({ + query: post.replace(post.userId).add(user.select(user.id).order(user.id)), + pg: { + throws: true + }, + sqlite: { + text: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"', + string: 'REPLACE INTO "post" ("userId") SELECT "user"."id" FROM "user" ORDER BY "user"."id"' + }, + mysql: { + text: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user` ORDER BY `user`.`id`', + string: 'REPLACE INTO `post` (`userId`) SELECT `user`.`id` FROM `user` ORDER BY `user`.`id`' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: [] +}); diff --git a/test/dialects/returning-tests.js b/test/dialects/returning-tests.js deleted file mode 100644 index ebbb0b2e..00000000 --- a/test/dialects/returning-tests.js +++ /dev/null @@ -1,20 +0,0 @@ -var Harness = require('./support'); -var user = Harness.defineUserTable(); - -Harness.test({ - query: user.insert({name: 'joe'}).returning(), - pg: { - text : 'INSERT INTO "user" ("name") VALUES ($1) RETURNING *', - string: 'INSERT INTO "user" ("name") VALUES (\'joe\') RETURNING *' - }, - params: ['joe'] -}); - -Harness.test({ - query: user.insert({name: 'joe'}).returning('id'), - pg: { - text : 'INSERT INTO "user" ("name") VALUES ($1) RETURNING id', - string: 'INSERT INTO "user" ("name") VALUES (\'joe\') RETURNING id' - }, - params: ['joe'] -}); diff --git a/test/dialects/returning-tests.ts b/test/dialects/returning-tests.ts new file mode 100644 index 00000000..c22bbb64 --- /dev/null +++ b/test/dialects/returning-tests.ts @@ -0,0 +1,22 @@ +'use strict'; + +import * as Harness from './support'; +const user = Harness.defineUserTable(); + +Harness.test({ + query: user.insert({ name: 'joe' }).returning(), + pg: { + text: 'INSERT INTO "user" ("name") VALUES ($1) RETURNING *', + string: 'INSERT INTO "user" ("name") VALUES (\'joe\') RETURNING *' + }, + params: ['joe'] +}); + +Harness.test({ + query: user.insert({ name: 'joe' }).returning('id'), + pg: { + text: 'INSERT INTO "user" ("name") VALUES ($1) RETURNING id', + string: 'INSERT INTO "user" ("name") VALUES (\'joe\') RETURNING id' + }, + params: ['joe'] +}); diff --git a/test/dialects/schema-tests.js b/test/dialects/schema-tests.js deleted file mode 100644 index 11e330da..00000000 --- a/test/dialects/schema-tests.js +++ /dev/null @@ -1,168 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var Table = require(__dirname + '/../../lib/table'); - -var userWithSchema = Table.define({ - schema: 'staging', - name: 'user', - quote: true, - columns: ['id', 'name'] -}); - -Harness.test({ - query: userWithSchema.select(userWithSchema.id).from(userWithSchema), - pg: { - text : 'SELECT "staging"."user"."id" FROM "staging"."user"', - string: 'SELECT "staging"."user"."id" FROM "staging"."user"' - }, - sqlite: { - text : 'SELECT "staging"."user"."id" FROM "staging"."user"', - string: 'SELECT "staging"."user"."id" FROM "staging"."user"' - }, - mysql: { - text : 'SELECT `staging`.`user`.`id` FROM `staging`.`user`', - string: 'SELECT `staging`.`user`.`id` FROM `staging`.`user`' - }, - mssql: { - text : 'SELECT [staging].[user].[id] FROM [staging].[user]', - string: 'SELECT [staging].[user].[id] FROM [staging].[user]' - }, - oracle: { - text : 'SELECT "staging"."user"."id" FROM "staging"."user"', - string: 'SELECT "staging"."user"."id" FROM "staging"."user"' - }, - params: [] -}); - -Harness.test({ - query: userWithSchema.select(userWithSchema.id.count()).from(userWithSchema), - pg: { - text : 'SELECT COUNT("staging"."user"."id") AS "id_count" FROM "staging"."user"', - string: 'SELECT COUNT("staging"."user"."id") AS "id_count" FROM "staging"."user"' - }, - sqlite: { - text : 'SELECT COUNT("staging"."user"."id") AS "id_count" FROM "staging"."user"', - string: 'SELECT COUNT("staging"."user"."id") AS "id_count" FROM "staging"."user"' - }, - mysql: { - text : 'SELECT COUNT(`staging`.`user`.`id`) AS `id_count` FROM `staging`.`user`', - string: 'SELECT COUNT(`staging`.`user`.`id`) AS `id_count` FROM `staging`.`user`' - }, - mssql: { - text : 'SELECT COUNT([staging].[user].[id]) AS [id_count] FROM [staging].[user]', - string: 'SELECT COUNT([staging].[user].[id]) AS [id_count] FROM [staging].[user]' - }, - oracle: { - text : 'SELECT COUNT("staging"."user"."id") "id_count" FROM "staging"."user"', - string: 'SELECT COUNT("staging"."user"."id") "id_count" FROM "staging"."user"' - }, - params: [] -}); - -Harness.test({ - query: userWithSchema.select(userWithSchema.id, userWithSchema.name).from(userWithSchema), - pg: { - text : 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"', - string: 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"' - }, - sqlite: { - text : 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"', - string: 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"' - }, - mysql: { - text : 'SELECT `staging`.`user`.`id`, `staging`.`user`.`name` FROM `staging`.`user`', - string: 'SELECT `staging`.`user`.`id`, `staging`.`user`.`name` FROM `staging`.`user`' - }, - mssql: { - text : 'SELECT [staging].[user].[id], [staging].[user].[name] FROM [staging].[user]', - string: 'SELECT [staging].[user].[id], [staging].[user].[name] FROM [staging].[user]' - }, - oracle: { - text : 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"', - string: 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"' - }, - params: [] -}); - -var uws = userWithSchema.as('uws'); -Harness.test({ - query: uws.select(uws.name).from(uws), - pg: { - text : 'SELECT "uws"."name" FROM "staging"."user" AS "uws"', - string: 'SELECT "uws"."name" FROM "staging"."user" AS "uws"' - }, - sqlite: { - text : 'SELECT "uws"."name" FROM "staging"."user" AS "uws"', - string: 'SELECT "uws"."name" FROM "staging"."user" AS "uws"' - }, - mysql: { - text : 'SELECT `uws`.`name` FROM `staging`.`user` AS `uws`', - string: 'SELECT `uws`.`name` FROM `staging`.`user` AS `uws`' - }, - mssql: { - text : 'SELECT [uws].[name] FROM [staging].[user] AS [uws]', - string: 'SELECT [uws].[name] FROM [staging].[user] AS [uws]' - }, - oracle: { - text : 'SELECT "uws"."name" FROM "staging"."user" "uws"', - string: 'SELECT "uws"."name" FROM "staging"."user" "uws"' - }, - params: [] -}); - -var postWithSchema = Table.define({ - schema: 'dev', - name: 'post', - columns: ['id', 'userId', 'content'] -}); - -Harness.test({ - query: userWithSchema.select(userWithSchema.name, postWithSchema.content).from(userWithSchema.join(postWithSchema).on(userWithSchema.id.equals(postWithSchema.userId))), - pg: { - text : 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")', - string: 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")' - }, - sqlite: { - text : 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")', - string: 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")' - }, - mysql: { - text : 'SELECT `staging`.`user`.`name`, `dev`.`post`.`content` FROM `staging`.`user` INNER JOIN `dev`.`post` ON (`staging`.`user`.`id` = `dev`.`post`.`userId`)', - string: 'SELECT `staging`.`user`.`name`, `dev`.`post`.`content` FROM `staging`.`user` INNER JOIN `dev`.`post` ON (`staging`.`user`.`id` = `dev`.`post`.`userId`)' - }, - mssql: { - text : 'SELECT [staging].[user].[name], [dev].[post].[content] FROM [staging].[user] INNER JOIN [dev].[post] ON ([staging].[user].[id] = [dev].[post].[userId])', - string: 'SELECT [staging].[user].[name], [dev].[post].[content] FROM [staging].[user] INNER JOIN [dev].[post] ON ([staging].[user].[id] = [dev].[post].[userId])' - }, - oracle: { - text : 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")', - string: 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")' - }, - params: [] -}); - -Harness.test({ - query: uws.select(uws.name, postWithSchema.content).from(uws.join(postWithSchema).on(uws.id.equals(postWithSchema.userId))), - pg: { - text : 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" AS "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")', - string: 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" AS "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")' - }, - sqlite: { - text : 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" AS "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")', - string: 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" AS "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")' - }, - mysql: { - text : 'SELECT `uws`.`name`, `dev`.`post`.`content` FROM `staging`.`user` AS `uws` INNER JOIN `dev`.`post` ON (`uws`.`id` = `dev`.`post`.`userId`)', - string: 'SELECT `uws`.`name`, `dev`.`post`.`content` FROM `staging`.`user` AS `uws` INNER JOIN `dev`.`post` ON (`uws`.`id` = `dev`.`post`.`userId`)' - }, - mssql: { - text : 'SELECT [uws].[name], [dev].[post].[content] FROM [staging].[user] AS [uws] INNER JOIN [dev].[post] ON ([uws].[id] = [dev].[post].[userId])', - string: 'SELECT [uws].[name], [dev].[post].[content] FROM [staging].[user] AS [uws] INNER JOIN [dev].[post] ON ([uws].[id] = [dev].[post].[userId])' - }, - oracle: { - text : 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")', - string: 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")' - }, - params: [] -}); diff --git a/test/dialects/schema-tests.ts b/test/dialects/schema-tests.ts new file mode 100644 index 00000000..928a339d --- /dev/null +++ b/test/dialects/schema-tests.ts @@ -0,0 +1,189 @@ +'use strict'; + +import * as Harness from './support'; +import { Table } from '../../lib/table'; + +const userWithSchema = Table.define<{ id: number; name: string }>({ + schema: 'staging', + name: 'user', + columns: ['id', 'name'] +}); + +Harness.test({ + query: userWithSchema.select(userWithSchema.id).from(userWithSchema), + pg: { + text: 'SELECT "staging"."user"."id" FROM "staging"."user"', + string: 'SELECT "staging"."user"."id" FROM "staging"."user"' + }, + sqlite: { + text: 'SELECT "staging"."user"."id" FROM "staging"."user"', + string: 'SELECT "staging"."user"."id" FROM "staging"."user"' + }, + mysql: { + text: 'SELECT `staging`.`user`.`id` FROM `staging`.`user`', + string: 'SELECT `staging`.`user`.`id` FROM `staging`.`user`' + }, + mssql: { + text: 'SELECT [staging].[user].[id] FROM [staging].[user]', + string: 'SELECT [staging].[user].[id] FROM [staging].[user]' + }, + oracle: { + text: 'SELECT "staging"."user"."id" FROM "staging"."user"', + string: 'SELECT "staging"."user"."id" FROM "staging"."user"' + }, + params: [] +}); + +Harness.test({ + query: userWithSchema.select(userWithSchema.id.count()).from(userWithSchema), + pg: { + text: 'SELECT COUNT("staging"."user"."id") AS "id_count" FROM "staging"."user"', + string: 'SELECT COUNT("staging"."user"."id") AS "id_count" FROM "staging"."user"' + }, + sqlite: { + text: 'SELECT COUNT("staging"."user"."id") AS "id_count" FROM "staging"."user"', + string: 'SELECT COUNT("staging"."user"."id") AS "id_count" FROM "staging"."user"' + }, + mysql: { + text: 'SELECT COUNT(`staging`.`user`.`id`) AS `id_count` FROM `staging`.`user`', + string: 'SELECT COUNT(`staging`.`user`.`id`) AS `id_count` FROM `staging`.`user`' + }, + mssql: { + text: 'SELECT COUNT([staging].[user].[id]) AS [id_count] FROM [staging].[user]', + string: 'SELECT COUNT([staging].[user].[id]) AS [id_count] FROM [staging].[user]' + }, + oracle: { + text: 'SELECT COUNT("staging"."user"."id") "id_count" FROM "staging"."user"', + string: 'SELECT COUNT("staging"."user"."id") "id_count" FROM "staging"."user"' + }, + params: [] +}); + +Harness.test({ + query: userWithSchema.select(userWithSchema.id, userWithSchema.name).from(userWithSchema), + pg: { + text: 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"', + string: 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"' + }, + sqlite: { + text: 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"', + string: 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"' + }, + mysql: { + text: 'SELECT `staging`.`user`.`id`, `staging`.`user`.`name` FROM `staging`.`user`', + string: 'SELECT `staging`.`user`.`id`, `staging`.`user`.`name` FROM `staging`.`user`' + }, + mssql: { + text: 'SELECT [staging].[user].[id], [staging].[user].[name] FROM [staging].[user]', + string: 'SELECT [staging].[user].[id], [staging].[user].[name] FROM [staging].[user]' + }, + oracle: { + text: 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"', + string: 'SELECT "staging"."user"."id", "staging"."user"."name" FROM "staging"."user"' + }, + params: [] +}); + +const uws = userWithSchema.as('uws'); +Harness.test({ + query: uws.select(uws.name).from(uws), + pg: { + text: 'SELECT "uws"."name" FROM "staging"."user" AS "uws"', + string: 'SELECT "uws"."name" FROM "staging"."user" AS "uws"' + }, + sqlite: { + text: 'SELECT "uws"."name" FROM "staging"."user" AS "uws"', + string: 'SELECT "uws"."name" FROM "staging"."user" AS "uws"' + }, + mysql: { + text: 'SELECT `uws`.`name` FROM `staging`.`user` AS `uws`', + string: 'SELECT `uws`.`name` FROM `staging`.`user` AS `uws`' + }, + mssql: { + text: 'SELECT [uws].[name] FROM [staging].[user] AS [uws]', + string: 'SELECT [uws].[name] FROM [staging].[user] AS [uws]' + }, + oracle: { + text: 'SELECT "uws"."name" FROM "staging"."user" "uws"', + string: 'SELECT "uws"."name" FROM "staging"."user" "uws"' + }, + params: [] +}); + +const postWithSchema = Table.define<{ id: number; userId: number; content: string }>({ + schema: 'dev', + name: 'post', + columns: ['id', 'userId', 'content'] +}); + +Harness.test({ + query: userWithSchema + .select(userWithSchema.name, postWithSchema.content) + .from(userWithSchema.join(postWithSchema).on(userWithSchema.id.equals(postWithSchema.userId))), + pg: { + text: + 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")', + string: + 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")' + }, + sqlite: { + text: + 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")', + string: + 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")' + }, + mysql: { + text: + 'SELECT `staging`.`user`.`name`, `dev`.`post`.`content` FROM `staging`.`user` INNER JOIN `dev`.`post` ON (`staging`.`user`.`id` = `dev`.`post`.`userId`)', + string: + 'SELECT `staging`.`user`.`name`, `dev`.`post`.`content` FROM `staging`.`user` INNER JOIN `dev`.`post` ON (`staging`.`user`.`id` = `dev`.`post`.`userId`)' + }, + mssql: { + text: + 'SELECT [staging].[user].[name], [dev].[post].[content] FROM [staging].[user] INNER JOIN [dev].[post] ON ([staging].[user].[id] = [dev].[post].[userId])', + string: + 'SELECT [staging].[user].[name], [dev].[post].[content] FROM [staging].[user] INNER JOIN [dev].[post] ON ([staging].[user].[id] = [dev].[post].[userId])' + }, + oracle: { + text: + 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")', + string: + 'SELECT "staging"."user"."name", "dev"."post"."content" FROM "staging"."user" INNER JOIN "dev"."post" ON ("staging"."user"."id" = "dev"."post"."userId")' + }, + params: [] +}); + +Harness.test({ + query: uws.select(uws.name, postWithSchema.content).from(uws.join(postWithSchema).on(uws.id.equals(postWithSchema.userId))), + pg: { + text: + 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" AS "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")', + string: + 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" AS "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")' + }, + sqlite: { + text: + 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" AS "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")', + string: + 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" AS "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")' + }, + mysql: { + text: + 'SELECT `uws`.`name`, `dev`.`post`.`content` FROM `staging`.`user` AS `uws` INNER JOIN `dev`.`post` ON (`uws`.`id` = `dev`.`post`.`userId`)', + string: + 'SELECT `uws`.`name`, `dev`.`post`.`content` FROM `staging`.`user` AS `uws` INNER JOIN `dev`.`post` ON (`uws`.`id` = `dev`.`post`.`userId`)' + }, + mssql: { + text: + 'SELECT [uws].[name], [dev].[post].[content] FROM [staging].[user] AS [uws] INNER JOIN [dev].[post] ON ([uws].[id] = [dev].[post].[userId])', + string: + 'SELECT [uws].[name], [dev].[post].[content] FROM [staging].[user] AS [uws] INNER JOIN [dev].[post] ON ([uws].[id] = [dev].[post].[userId])' + }, + oracle: { + text: + 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")', + string: + 'SELECT "uws"."name", "dev"."post"."content" FROM "staging"."user" "uws" INNER JOIN "dev"."post" ON ("uws"."id" = "dev"."post"."userId")' + }, + params: [] +}); diff --git a/test/dialects/select-tests.js b/test/dialects/select-tests.js deleted file mode 100644 index 2892c8ae..00000000 --- a/test/dialects/select-tests.js +++ /dev/null @@ -1,461 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var user = Harness.defineUserTable(); -var customerAlias = Harness.defineCustomerAliasTable(); -var Sql = require('../../lib'); - -Harness.test({ - query: post.select(post.id).select(post.content), - pg: { - text : 'SELECT "post"."id", "post"."content" FROM "post"', - string: 'SELECT "post"."id", "post"."content" FROM "post"' - }, - sqlite: { - text : 'SELECT "post"."id", "post"."content" FROM "post"', - string: 'SELECT "post"."id", "post"."content" FROM "post"' - }, - mysql: { - text : 'SELECT `post`.`id`, `post`.`content` FROM `post`', - string: 'SELECT `post`.`id`, `post`.`content` FROM `post`' - }, - mssql: { - text : 'SELECT [post].[id], [post].[content] FROM [post]', - string: 'SELECT [post].[id], [post].[content] FROM [post]' - }, - oracle: { - text : 'SELECT "post"."id", "post"."content" FROM "post"', - string: 'SELECT "post"."id", "post"."content" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: customerAlias.select(customerAlias.star()), - pg: { - text : 'SELECT "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"', - string: 'SELECT "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"' - }, - sqlite: { - text : 'SELECT "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"', - string: 'SELECT "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"' - }, - mysql: { - text : 'SELECT `customer`.`id` AS `id_alias`, `customer`.`name` AS `name_alias`, `customer`.`age` AS `age_alias`, `customer`.`income` AS `income_alias`, `customer`.`metadata` AS `metadata_alias` FROM `customer`', - string: 'SELECT `customer`.`id` AS `id_alias`, `customer`.`name` AS `name_alias`, `customer`.`age` AS `age_alias`, `customer`.`income` AS `income_alias`, `customer`.`metadata` AS `metadata_alias` FROM `customer`' - }, - mssql: { - text : 'SELECT [customer].[id] AS [id_alias], [customer].[name] AS [name_alias], [customer].[age] AS [age_alias], [customer].[income] AS [income_alias], [customer].[metadata] AS [metadata_alias] FROM [customer]', - string: 'SELECT [customer].[id] AS [id_alias], [customer].[name] AS [name_alias], [customer].[age] AS [age_alias], [customer].[income] AS [income_alias], [customer].[metadata] AS [metadata_alias] FROM [customer]' - }, - oracle: { - text : 'SELECT "customer"."id" "id_alias", "customer"."name" "name_alias", "customer"."age" "age_alias", "customer"."income" "income_alias", "customer"."metadata" "metadata_alias" FROM "customer"', - string: 'SELECT "customer"."id" "id_alias", "customer"."name" "name_alias", "customer"."age" "age_alias", "customer"."income" "income_alias", "customer"."metadata" "metadata_alias" FROM "customer"' - }, - params: [] -}); - -// Test that we can generate a SELECT claus without a FROM clause -Harness.test({ - query: Sql.select(), - pg: { - text : 'SELECT ', - string: 'SELECT ' - }, - sqlite: { - text : 'SELECT ', - string: 'SELECT ' - }, - mysql: { - text : 'SELECT ', - string: 'SELECT ' - }, - mssql: { - text : 'SELECT ', - string: 'SELECT ' - }, - oracle: { - text : 'SELECT ', - string: 'SELECT ' - }, - params: [] -}); - -// Test that we can generate a SELECT claus without a FROM clause -Harness.test({ - query: Sql.select("1"), - pg: { - text : 'SELECT 1', - string: 'SELECT 1' - }, - sqlite: { - text : 'SELECT 1', - string: 'SELECT 1' - }, - mysql: { - text : 'SELECT 1', - string: 'SELECT 1' - }, - mssql: { - text : 'SELECT 1', - string: 'SELECT 1' - }, - oracle: { - text : 'SELECT 1', - string: 'SELECT 1' - }, - params: [] -}); - -Harness.test({ - query: Sql.select("1").where("1=1"), - pg: { - text : 'SELECT 1 WHERE (1=1)', - string: 'SELECT 1 WHERE (1=1)' - }, - sqlite: { - text : 'SELECT 1 WHERE (1=1)', - string: 'SELECT 1 WHERE (1=1)' - }, - mysql: { - text : 'SELECT 1 WHERE (1=1)', - string: 'SELECT 1 WHERE (1=1)' - }, - mssql: { - text : 'SELECT 1 WHERE (1=1)', - string: 'SELECT 1 WHERE (1=1)' - }, - oracle: { - text : 'SELECT 1 WHERE (1=1)', - string: 'SELECT 1 WHERE (1=1)' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(post.select(post.id)), - pg: { - text : 'SELECT (SELECT "post"."id" FROM "post")', - string: 'SELECT (SELECT "post"."id" FROM "post")' - }, - sqlite: { - text : 'SELECT (SELECT "post"."id" FROM "post")', - string: 'SELECT (SELECT "post"."id" FROM "post")' - }, - mysql: { - text : 'SELECT (SELECT `post`.`id` FROM `post`)', - string: 'SELECT (SELECT `post`.`id` FROM `post`)' - }, - mssql: { - text : 'SELECT (SELECT [post].[id] FROM [post])', - string: 'SELECT (SELECT [post].[id] FROM [post])' - }, - oracle: { - text : 'SELECT (SELECT "post"."id" FROM "post")', - string: 'SELECT (SELECT "post"."id" FROM "post")' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(post.select(post.content).plus(post.select(post.content))), - pg: { - text : 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))', - string: 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))' - }, - sqlite: { - text : 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))', - string: 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))' - }, - mysql: { - text : 'SELECT ((SELECT `post`.`content` FROM `post`) + (SELECT `post`.`content` FROM `post`))', - string: 'SELECT ((SELECT `post`.`content` FROM `post`) + (SELECT `post`.`content` FROM `post`))' - }, - mssql: { - text : 'SELECT ((SELECT [post].[content] FROM [post]) + (SELECT [post].[content] FROM [post]))', - string: 'SELECT ((SELECT [post].[content] FROM [post]) + (SELECT [post].[content] FROM [post]))' - }, - oracle: { - text : 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))', - string: 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id.as('col1')), - pg: { - text : 'SELECT "post"."id" AS "col1" FROM "post"', - string: 'SELECT "post"."id" AS "col1" FROM "post"' - }, - sqlite: { - text : 'SELECT "post"."id" AS "col1" FROM "post"', - string: 'SELECT "post"."id" AS "col1" FROM "post"' - }, - mysql: { - text : 'SELECT `post`.`id` AS `col1` FROM `post`', - string: 'SELECT `post`.`id` AS `col1` FROM `post`' - }, - mssql: { - text : 'SELECT [post].[id] AS [col1] FROM [post]', - string: 'SELECT [post].[id] AS [col1] FROM [post]' - }, - oracle: { - text : 'SELECT "post"."id" "col1" FROM "post"', - string: 'SELECT "post"."id" "col1" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(Sql.constant(4)), - pg: { - text : 'SELECT $1 FROM "post"', - string: 'SELECT 4 FROM "post"' - }, - sqlite: { - text : 'SELECT $1 FROM "post"', - string: 'SELECT 4 FROM "post"' - }, - mysql: { - text : 'SELECT ? FROM `post`', - string: 'SELECT 4 FROM `post`' - }, - mssql: { - text : 'SELECT @1 FROM [post]', - string: 'SELECT 4 FROM [post]' - }, - oracle: { - text : 'SELECT :1 FROM "post"', - string: 'SELECT 4 FROM "post"' - }, - params: [4] -}); - -Harness.test({ - query: post.select(post.id,Sql.constant(4)), - pg: { - text : 'SELECT "post"."id", $1 FROM "post"', - string: 'SELECT "post"."id", 4 FROM "post"' - }, - sqlite: { - text : 'SELECT "post"."id", $1 FROM "post"', - string: 'SELECT "post"."id", 4 FROM "post"' - }, - mysql: { - text : 'SELECT `post`.`id`, ? FROM `post`', - string: 'SELECT `post`.`id`, 4 FROM `post`' - }, - mssql: { - text : 'SELECT [post].[id], @1 FROM [post]', - string: 'SELECT [post].[id], 4 FROM [post]' - }, - oracle: { - text : 'SELECT "post"."id", :1 FROM "post"', - string: 'SELECT "post"."id", 4 FROM "post"' - }, - params: [4] -}); - -Harness.test({ - query: post.select(Sql.constant(4).as('col1')), - pg: { - text : 'SELECT $1 AS "col1" FROM "post"', - string: 'SELECT 4 AS "col1" FROM "post"' - }, - sqlite: { - text : 'SELECT $1 AS "col1" FROM "post"', - string: 'SELECT 4 AS "col1" FROM "post"' - }, - mysql: { - text : 'SELECT ? AS `col1` FROM `post`', - string: 'SELECT 4 AS `col1` FROM `post`' - }, - mssql: { - text : 'SELECT @1 AS [col1] FROM [post]', - string: 'SELECT 4 AS [col1] FROM [post]' - }, - oracle: { - text : 'SELECT :1 "col1" FROM "post"', - string: 'SELECT 4 "col1" FROM "post"' - }, - params: [4] -}); - -Harness.test({ - query: post.select(Sql.constant(4).plus(5)), - pg: { - text : 'SELECT ($1 + $2) FROM "post"', - string: 'SELECT (4 + 5) FROM "post"' - }, - sqlite: { - text : 'SELECT ($1 + $2) FROM "post"', - string: 'SELECT (4 + 5) FROM "post"' - }, - mysql: { - text : 'SELECT (? + ?) FROM `post`', - string: 'SELECT (4 + 5) FROM `post`' - }, - mssql: { - text : 'SELECT (@1 + @2) FROM [post]', - string: 'SELECT (4 + 5) FROM [post]' - }, - oracle: { - text : 'SELECT (:1 + :2) FROM "post"', - string: 'SELECT (4 + 5) FROM "post"' - }, - params: [4,5] -}); - -Harness.test({ - query: post.select(Sql.constant(4).plus(5).as('col1')), - pg: { - text : 'SELECT ($1 + $2) AS "col1" FROM "post"', - string: 'SELECT (4 + 5) AS "col1" FROM "post"' - }, - sqlite: { - text : 'SELECT ($1 + $2) AS "col1" FROM "post"', - string: 'SELECT (4 + 5) AS "col1" FROM "post"' - }, - mysql: { - text : 'SELECT (? + ?) AS `col1` FROM `post`', - string: 'SELECT (4 + 5) AS `col1` FROM `post`' - }, - mssql: { - text : 'SELECT (@1 + @2) AS [col1] FROM [post]', - string: 'SELECT (4 + 5) AS [col1] FROM [post]' - }, - oracle: { - text : 'SELECT (:1 + :2) "col1" FROM "post"', - string: 'SELECT (4 + 5) "col1" FROM "post"' - }, - params: [4,5] -}); - -Harness.test({ - query: post.select(Sql.constant(4),Sql.constant("abc"),Sql.constant(true)), - pg: { - text : 'SELECT $1, $2, $3 FROM "post"', - string: 'SELECT 4, \'abc\', TRUE FROM "post"' - }, - sqlite: { - text : 'SELECT $1, $2, $3 FROM "post"', - string: 'SELECT 4, \'abc\', 1 FROM "post"' - }, - mysql: { - text : 'SELECT ?, ?, ? FROM `post`', - string: 'SELECT 4, \'abc\', TRUE FROM `post`' - }, - mssql: { - text : 'SELECT @1, @2, @3 FROM [post]', - string: 'SELECT 4, \'abc\', TRUE FROM [post]' - }, - oracle: { - text : 'SELECT :1, :2, :3 FROM "post"', - string: 'SELECT 4, \'abc\', TRUE FROM "post"' - }, - params: [4,'abc',true] -}); - -Harness.test({ - query: post.select(Sql.constant(1).sum()), - pg: { - text : 'SELECT SUM($1) AS "constant_sum" FROM "post"', - string: 'SELECT SUM(1) AS "constant_sum" FROM "post"' - }, - sqlite: { - text : 'SELECT SUM($1) AS "constant_sum" FROM "post"', - string: 'SELECT SUM(1) AS "constant_sum" FROM "post"' - }, - mysql: { - text : 'SELECT SUM(?) AS `constant_sum` FROM `post`', - string: 'SELECT SUM(1) AS `constant_sum` FROM `post`' - }, - mssql: { - text : 'SELECT SUM(@1) AS [constant_sum] FROM [post]', - string: 'SELECT SUM(1) AS [constant_sum] FROM [post]' - }, - oracle: { - text : 'SELECT SUM(:1) "constant_sum" FROM "post"', - string: 'SELECT SUM(1) "constant_sum" FROM "post"' - }, - params: [1] -}); - -Harness.test({ - query: Sql.select(post.select(post.id).as("column1")), - pg: { - text : 'SELECT (SELECT "post"."id" FROM "post") AS "column1"', - string: 'SELECT (SELECT "post"."id" FROM "post") AS "column1"' - }, - sqlite: { - text : 'SELECT (SELECT "post"."id" FROM "post") AS "column1"', - string: 'SELECT (SELECT "post"."id" FROM "post") AS "column1"' - }, - mysql: { - text : 'SELECT (SELECT `post`.`id` FROM `post`) AS `column1`', - string: 'SELECT (SELECT `post`.`id` FROM `post`) AS `column1`' - }, - mssql: { - text : 'SELECT (SELECT [post].[id] FROM [post]) AS [column1]', - string: 'SELECT (SELECT [post].[id] FROM [post]) AS [column1]' - }, - oracle: { - text : 'SELECT (SELECT "post"."id" FROM "post") "column1"', - string: 'SELECT (SELECT "post"."id" FROM "post") "column1"' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(post.select(post.count()).as("column1")), - pg: { - text : 'SELECT (SELECT COUNT("post".*) AS "post_count" FROM "post") AS "column1"', - string: 'SELECT (SELECT COUNT("post".*) AS "post_count" FROM "post") AS "column1"' - }, - sqlite: { - text : 'SELECT (SELECT COUNT("post".*) AS "post_count" FROM "post") AS "column1"', - string: 'SELECT (SELECT COUNT("post".*) AS "post_count" FROM "post") AS "column1"' - }, - mysql: { - text : 'SELECT (SELECT COUNT(*) AS `post_count` FROM `post`) AS `column1`', - string: 'SELECT (SELECT COUNT(*) AS `post_count` FROM `post`) AS `column1`' - }, - mssql: { - text : 'SELECT (SELECT COUNT(*) AS [post_count] FROM [post]) AS [column1]', - string: 'SELECT (SELECT COUNT(*) AS [post_count] FROM [post]) AS [column1]' - }, - oracle: { - text : 'SELECT (SELECT COUNT(*) "post_count" FROM "post") "column1"', - string: 'SELECT (SELECT COUNT(*) "post_count" FROM "post") "column1"' - }, - params: [] -}); - -Harness.test({ - query: Sql.select(post.select(post.id).as("column1"),user.select(user.id).as("column2")), - pg: { - text : 'SELECT (SELECT "post"."id" FROM "post") AS "column1", (SELECT "user"."id" FROM "user") AS "column2"', - string: 'SELECT (SELECT "post"."id" FROM "post") AS "column1", (SELECT "user"."id" FROM "user") AS "column2"' - }, - sqlite: { - text : 'SELECT (SELECT "post"."id" FROM "post") AS "column1", (SELECT "user"."id" FROM "user") AS "column2"', - string: 'SELECT (SELECT "post"."id" FROM "post") AS "column1", (SELECT "user"."id" FROM "user") AS "column2"' - }, - mysql: { - text : 'SELECT (SELECT `post`.`id` FROM `post`) AS `column1`, (SELECT `user`.`id` FROM `user`) AS `column2`', - string: 'SELECT (SELECT `post`.`id` FROM `post`) AS `column1`, (SELECT `user`.`id` FROM `user`) AS `column2`' - }, - mssql: { - text : 'SELECT (SELECT [post].[id] FROM [post]) AS [column1], (SELECT [user].[id] FROM [user]) AS [column2]', - string: 'SELECT (SELECT [post].[id] FROM [post]) AS [column1], (SELECT [user].[id] FROM [user]) AS [column2]' - }, - oracle: { - text : 'SELECT (SELECT "post"."id" FROM "post") "column1", (SELECT "user"."id" FROM "user") "column2"', - string: 'SELECT (SELECT "post"."id" FROM "post") "column1", (SELECT "user"."id" FROM "user") "column2"' - }, - params: [] -}); - - diff --git a/test/dialects/select-tests.ts b/test/dialects/select-tests.ts new file mode 100644 index 00000000..632b427c --- /dev/null +++ b/test/dialects/select-tests.ts @@ -0,0 +1,475 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); +const customerAlias = Harness.defineCustomerAliasTable(); +const instance = new Sql('postgres'); + +Harness.test({ + query: post.select(post.id).select(post.content), + pg: { + text: 'SELECT "post"."id", "post"."content" FROM "post"', + string: 'SELECT "post"."id", "post"."content" FROM "post"' + }, + sqlite: { + text: 'SELECT "post"."id", "post"."content" FROM "post"', + string: 'SELECT "post"."id", "post"."content" FROM "post"' + }, + mysql: { + text: 'SELECT `post`.`id`, `post`.`content` FROM `post`', + string: 'SELECT `post`.`id`, `post`.`content` FROM `post`' + }, + mssql: { + text: 'SELECT [post].[id], [post].[content] FROM [post]', + string: 'SELECT [post].[id], [post].[content] FROM [post]' + }, + oracle: { + text: 'SELECT "post"."id", "post"."content" FROM "post"', + string: 'SELECT "post"."id", "post"."content" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: customerAlias.select(customerAlias.star()), + pg: { + text: + 'SELECT "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"', + string: + 'SELECT "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"' + }, + sqlite: { + text: + 'SELECT "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"', + string: + 'SELECT "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"' + }, + mysql: { + text: + 'SELECT `customer`.`id` AS `id_alias`, `customer`.`name` AS `name_alias`, `customer`.`age` AS `age_alias`, `customer`.`income` AS `income_alias`, `customer`.`metadata` AS `metadata_alias` FROM `customer`', + string: + 'SELECT `customer`.`id` AS `id_alias`, `customer`.`name` AS `name_alias`, `customer`.`age` AS `age_alias`, `customer`.`income` AS `income_alias`, `customer`.`metadata` AS `metadata_alias` FROM `customer`' + }, + mssql: { + text: + 'SELECT [customer].[id] AS [id_alias], [customer].[name] AS [name_alias], [customer].[age] AS [age_alias], [customer].[income] AS [income_alias], [customer].[metadata] AS [metadata_alias] FROM [customer]', + string: + 'SELECT [customer].[id] AS [id_alias], [customer].[name] AS [name_alias], [customer].[age] AS [age_alias], [customer].[income] AS [income_alias], [customer].[metadata] AS [metadata_alias] FROM [customer]' + }, + oracle: { + text: + 'SELECT "customer"."id" "id_alias", "customer"."name" "name_alias", "customer"."age" "age_alias", "customer"."income" "income_alias", "customer"."metadata" "metadata_alias" FROM "customer"', + string: + 'SELECT "customer"."id" "id_alias", "customer"."name" "name_alias", "customer"."age" "age_alias", "customer"."income" "income_alias", "customer"."metadata" "metadata_alias" FROM "customer"' + }, + params: [] +}); + +// Test that we can generate a SELECT claus without a FROM clause +Harness.test({ + query: instance.select(), + pg: { + text: 'SELECT ', + string: 'SELECT ' + }, + sqlite: { + text: 'SELECT ', + string: 'SELECT ' + }, + mysql: { + text: 'SELECT ', + string: 'SELECT ' + }, + mssql: { + text: 'SELECT ', + string: 'SELECT ' + }, + oracle: { + text: 'SELECT ', + string: 'SELECT ' + }, + params: [] +}); + +// Test that we can generate a SELECT claus without a FROM clause +Harness.test({ + query: instance.select('1'), + pg: { + text: 'SELECT 1', + string: 'SELECT 1' + }, + sqlite: { + text: 'SELECT 1', + string: 'SELECT 1' + }, + mysql: { + text: 'SELECT 1', + string: 'SELECT 1' + }, + mssql: { + text: 'SELECT 1', + string: 'SELECT 1' + }, + oracle: { + text: 'SELECT 1', + string: 'SELECT 1' + }, + params: [] +}); + +Harness.test({ + query: instance.select('1').where('1=1'), + pg: { + text: 'SELECT 1 WHERE (1=1)', + string: 'SELECT 1 WHERE (1=1)' + }, + sqlite: { + text: 'SELECT 1 WHERE (1=1)', + string: 'SELECT 1 WHERE (1=1)' + }, + mysql: { + text: 'SELECT 1 WHERE (1=1)', + string: 'SELECT 1 WHERE (1=1)' + }, + mssql: { + text: 'SELECT 1 WHERE (1=1)', + string: 'SELECT 1 WHERE (1=1)' + }, + oracle: { + text: 'SELECT 1 WHERE (1=1)', + string: 'SELECT 1 WHERE (1=1)' + }, + params: [] +}); + +Harness.test({ + query: instance.select(post.select(post.id)), + pg: { + text: 'SELECT (SELECT "post"."id" FROM "post")', + string: 'SELECT (SELECT "post"."id" FROM "post")' + }, + sqlite: { + text: 'SELECT (SELECT "post"."id" FROM "post")', + string: 'SELECT (SELECT "post"."id" FROM "post")' + }, + mysql: { + text: 'SELECT (SELECT `post`.`id` FROM `post`)', + string: 'SELECT (SELECT `post`.`id` FROM `post`)' + }, + mssql: { + text: 'SELECT (SELECT [post].[id] FROM [post])', + string: 'SELECT (SELECT [post].[id] FROM [post])' + }, + oracle: { + text: 'SELECT (SELECT "post"."id" FROM "post")', + string: 'SELECT (SELECT "post"."id" FROM "post")' + }, + params: [] +}); + +Harness.test({ + query: instance.select(post.select(post.content).plus(post.select(post.content))), + pg: { + text: 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))', + string: 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))' + }, + sqlite: { + text: 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))', + string: 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))' + }, + mysql: { + text: 'SELECT ((SELECT `post`.`content` FROM `post`) + (SELECT `post`.`content` FROM `post`))', + string: 'SELECT ((SELECT `post`.`content` FROM `post`) + (SELECT `post`.`content` FROM `post`))' + }, + mssql: { + text: 'SELECT ((SELECT [post].[content] FROM [post]) + (SELECT [post].[content] FROM [post]))', + string: 'SELECT ((SELECT [post].[content] FROM [post]) + (SELECT [post].[content] FROM [post]))' + }, + oracle: { + text: 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))', + string: 'SELECT ((SELECT "post"."content" FROM "post") + (SELECT "post"."content" FROM "post"))' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id.as('col1')), + pg: { + text: 'SELECT "post"."id" AS "col1" FROM "post"', + string: 'SELECT "post"."id" AS "col1" FROM "post"' + }, + sqlite: { + text: 'SELECT "post"."id" AS "col1" FROM "post"', + string: 'SELECT "post"."id" AS "col1" FROM "post"' + }, + mysql: { + text: 'SELECT `post`.`id` AS `col1` FROM `post`', + string: 'SELECT `post`.`id` AS `col1` FROM `post`' + }, + mssql: { + text: 'SELECT [post].[id] AS [col1] FROM [post]', + string: 'SELECT [post].[id] AS [col1] FROM [post]' + }, + oracle: { + text: 'SELECT "post"."id" "col1" FROM "post"', + string: 'SELECT "post"."id" "col1" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(instance.constant(4)), + pg: { + text: 'SELECT $1 FROM "post"', + string: 'SELECT 4 FROM "post"' + }, + sqlite: { + text: 'SELECT $1 FROM "post"', + string: 'SELECT 4 FROM "post"' + }, + mysql: { + text: 'SELECT ? FROM `post`', + string: 'SELECT 4 FROM `post`' + }, + mssql: { + text: 'SELECT @1 FROM [post]', + string: 'SELECT 4 FROM [post]' + }, + oracle: { + text: 'SELECT :1 FROM "post"', + string: 'SELECT 4 FROM "post"' + }, + params: [4] +}); + +Harness.test({ + query: post.select(post.id, instance.constant(4)), + pg: { + text: 'SELECT "post"."id", $1 FROM "post"', + string: 'SELECT "post"."id", 4 FROM "post"' + }, + sqlite: { + text: 'SELECT "post"."id", $1 FROM "post"', + string: 'SELECT "post"."id", 4 FROM "post"' + }, + mysql: { + text: 'SELECT `post`.`id`, ? FROM `post`', + string: 'SELECT `post`.`id`, 4 FROM `post`' + }, + mssql: { + text: 'SELECT [post].[id], @1 FROM [post]', + string: 'SELECT [post].[id], 4 FROM [post]' + }, + oracle: { + text: 'SELECT "post"."id", :1 FROM "post"', + string: 'SELECT "post"."id", 4 FROM "post"' + }, + params: [4] +}); + +Harness.test({ + query: post.select(instance.constant(4).as('col1')), + pg: { + text: 'SELECT $1 AS "col1" FROM "post"', + string: 'SELECT 4 AS "col1" FROM "post"' + }, + sqlite: { + text: 'SELECT $1 AS "col1" FROM "post"', + string: 'SELECT 4 AS "col1" FROM "post"' + }, + mysql: { + text: 'SELECT ? AS `col1` FROM `post`', + string: 'SELECT 4 AS `col1` FROM `post`' + }, + mssql: { + text: 'SELECT @1 AS [col1] FROM [post]', + string: 'SELECT 4 AS [col1] FROM [post]' + }, + oracle: { + text: 'SELECT :1 "col1" FROM "post"', + string: 'SELECT 4 "col1" FROM "post"' + }, + params: [4] +}); + +Harness.test({ + query: post.select(instance.constant(4).plus(5)), + pg: { + text: 'SELECT ($1 + $2) FROM "post"', + string: 'SELECT (4 + 5) FROM "post"' + }, + sqlite: { + text: 'SELECT ($1 + $2) FROM "post"', + string: 'SELECT (4 + 5) FROM "post"' + }, + mysql: { + text: 'SELECT (? + ?) FROM `post`', + string: 'SELECT (4 + 5) FROM `post`' + }, + mssql: { + text: 'SELECT (@1 + @2) FROM [post]', + string: 'SELECT (4 + 5) FROM [post]' + }, + oracle: { + text: 'SELECT (:1 + :2) FROM "post"', + string: 'SELECT (4 + 5) FROM "post"' + }, + params: [4, 5] +}); + +Harness.test({ + query: post.select( + instance + .constant(4) + .plus(5) + .as('col1') + ), + pg: { + text: 'SELECT ($1 + $2) AS "col1" FROM "post"', + string: 'SELECT (4 + 5) AS "col1" FROM "post"' + }, + sqlite: { + text: 'SELECT ($1 + $2) AS "col1" FROM "post"', + string: 'SELECT (4 + 5) AS "col1" FROM "post"' + }, + mysql: { + text: 'SELECT (? + ?) AS `col1` FROM `post`', + string: 'SELECT (4 + 5) AS `col1` FROM `post`' + }, + mssql: { + text: 'SELECT (@1 + @2) AS [col1] FROM [post]', + string: 'SELECT (4 + 5) AS [col1] FROM [post]' + }, + oracle: { + text: 'SELECT (:1 + :2) "col1" FROM "post"', + string: 'SELECT (4 + 5) "col1" FROM "post"' + }, + params: [4, 5] +}); + +Harness.test({ + query: post.select(instance.constant(4), instance.constant('abc'), instance.constant(true)), + pg: { + text: 'SELECT $1, $2, $3 FROM "post"', + string: 'SELECT 4, \'abc\', TRUE FROM "post"' + }, + sqlite: { + text: 'SELECT $1, $2, $3 FROM "post"', + string: 'SELECT 4, \'abc\', 1 FROM "post"' + }, + mysql: { + text: 'SELECT ?, ?, ? FROM `post`', + string: "SELECT 4, 'abc', TRUE FROM `post`" + }, + mssql: { + text: 'SELECT @1, @2, @3 FROM [post]', + string: "SELECT 4, 'abc', TRUE FROM [post]" + }, + oracle: { + text: 'SELECT :1, :2, :3 FROM "post"', + string: 'SELECT 4, \'abc\', TRUE FROM "post"' + }, + params: [4, 'abc', true] +}); + +Harness.test({ + query: post.select(instance.constant(1).sum()), + pg: { + text: 'SELECT SUM($1) AS "constant_sum" FROM "post"', + string: 'SELECT SUM(1) AS "constant_sum" FROM "post"' + }, + sqlite: { + text: 'SELECT SUM($1) AS "constant_sum" FROM "post"', + string: 'SELECT SUM(1) AS "constant_sum" FROM "post"' + }, + mysql: { + text: 'SELECT SUM(?) AS `constant_sum` FROM `post`', + string: 'SELECT SUM(1) AS `constant_sum` FROM `post`' + }, + mssql: { + text: 'SELECT SUM(@1) AS [constant_sum] FROM [post]', + string: 'SELECT SUM(1) AS [constant_sum] FROM [post]' + }, + oracle: { + text: 'SELECT SUM(:1) "constant_sum" FROM "post"', + string: 'SELECT SUM(1) "constant_sum" FROM "post"' + }, + params: [1] +}); + +Harness.test({ + query: instance.select(post.select(post.id).as('column1')), + pg: { + text: 'SELECT (SELECT "post"."id" FROM "post") AS "column1"', + string: 'SELECT (SELECT "post"."id" FROM "post") AS "column1"' + }, + sqlite: { + text: 'SELECT (SELECT "post"."id" FROM "post") AS "column1"', + string: 'SELECT (SELECT "post"."id" FROM "post") AS "column1"' + }, + mysql: { + text: 'SELECT (SELECT `post`.`id` FROM `post`) AS `column1`', + string: 'SELECT (SELECT `post`.`id` FROM `post`) AS `column1`' + }, + mssql: { + text: 'SELECT (SELECT [post].[id] FROM [post]) AS [column1]', + string: 'SELECT (SELECT [post].[id] FROM [post]) AS [column1]' + }, + oracle: { + text: 'SELECT (SELECT "post"."id" FROM "post") "column1"', + string: 'SELECT (SELECT "post"."id" FROM "post") "column1"' + }, + params: [] +}); + +Harness.test({ + query: instance.select(post.select(post.count()).as('column1')), + pg: { + text: 'SELECT (SELECT COUNT("post".*) AS "post_count" FROM "post") AS "column1"', + string: 'SELECT (SELECT COUNT("post".*) AS "post_count" FROM "post") AS "column1"' + }, + sqlite: { + text: 'SELECT (SELECT COUNT("post".*) AS "post_count" FROM "post") AS "column1"', + string: 'SELECT (SELECT COUNT("post".*) AS "post_count" FROM "post") AS "column1"' + }, + mysql: { + text: 'SELECT (SELECT COUNT(*) AS `post_count` FROM `post`) AS `column1`', + string: 'SELECT (SELECT COUNT(*) AS `post_count` FROM `post`) AS `column1`' + }, + mssql: { + text: 'SELECT (SELECT COUNT(*) AS [post_count] FROM [post]) AS [column1]', + string: 'SELECT (SELECT COUNT(*) AS [post_count] FROM [post]) AS [column1]' + }, + oracle: { + text: 'SELECT (SELECT COUNT(*) "post_count" FROM "post") "column1"', + string: 'SELECT (SELECT COUNT(*) "post_count" FROM "post") "column1"' + }, + params: [] +}); + +Harness.test({ + query: instance.select(post.select(post.id).as('column1'), user.select(user.id).as('column2')), + pg: { + text: 'SELECT (SELECT "post"."id" FROM "post") AS "column1", (SELECT "user"."id" FROM "user") AS "column2"', + string: 'SELECT (SELECT "post"."id" FROM "post") AS "column1", (SELECT "user"."id" FROM "user") AS "column2"' + }, + sqlite: { + text: 'SELECT (SELECT "post"."id" FROM "post") AS "column1", (SELECT "user"."id" FROM "user") AS "column2"', + string: 'SELECT (SELECT "post"."id" FROM "post") AS "column1", (SELECT "user"."id" FROM "user") AS "column2"' + }, + mysql: { + text: 'SELECT (SELECT `post`.`id` FROM `post`) AS `column1`, (SELECT `user`.`id` FROM `user`) AS `column2`', + string: 'SELECT (SELECT `post`.`id` FROM `post`) AS `column1`, (SELECT `user`.`id` FROM `user`) AS `column2`' + }, + mssql: { + text: 'SELECT (SELECT [post].[id] FROM [post]) AS [column1], (SELECT [user].[id] FROM [user]) AS [column2]', + string: 'SELECT (SELECT [post].[id] FROM [post]) AS [column1], (SELECT [user].[id] FROM [user]) AS [column2]' + }, + oracle: { + text: 'SELECT (SELECT "post"."id" FROM "post") "column1", (SELECT "user"."id" FROM "user") "column2"', + string: 'SELECT (SELECT "post"."id" FROM "post") "column1", (SELECT "user"."id" FROM "user") "column2"' + }, + params: [] +}); diff --git a/test/dialects/shortcut-tests.js b/test/dialects/shortcut-tests.js deleted file mode 100644 index 35c9a90b..00000000 --- a/test/dialects/shortcut-tests.js +++ /dev/null @@ -1,161 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); -var post = Harness.definePostTable(); - -// shortcut: 'select * from ' -Harness.test({ - query: user, - pg: { - text : 'SELECT "user".* FROM "user"', - string: 'SELECT "user".* FROM "user"' - }, - sqlite: { - text : 'SELECT "user".* FROM "user"', - string: 'SELECT "user".* FROM "user"' - }, - mysql: { - text : 'SELECT `user`.* FROM `user`', - string: 'SELECT `user`.* FROM `user`' - }, - mssql: { - text : 'SELECT [user].* FROM [user]', - string: 'SELECT [user].* FROM [user]' - }, - oracle: { - text : 'SELECT "user".* FROM "user"', - string: 'SELECT "user".* FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.where(user.name.equals(3)), - pg: { - text : 'SELECT * FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT * FROM "user" WHERE ("user"."name" = 3)' - }, - sqlite: { - text : 'SELECT * FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT * FROM "user" WHERE ("user"."name" = 3)' - }, - mysql: { - text : 'SELECT * FROM `user` WHERE (`user`.`name` = ?)', - string: 'SELECT * FROM `user` WHERE (`user`.`name` = 3)' - }, - mssql: { - text : 'SELECT * FROM [user] WHERE ([user].[name] = @1)', - string: 'SELECT * FROM [user] WHERE ([user].[name] = 3)' - }, - oracle: { - text : 'SELECT * FROM "user" WHERE ("user"."name" = :1)', - string: 'SELECT * FROM "user" WHERE ("user"."name" = 3)' - }, - params: [3] -}); - -Harness.test({ - query: user.where(user.name.equals(3)).where(user.id.equals(1)), - pg: { - text : 'SELECT * FROM "user" WHERE (("user"."name" = $1) AND ("user"."id" = $2))', - string: 'SELECT * FROM "user" WHERE (("user"."name" = 3) AND ("user"."id" = 1))' - }, - sqlite: { - text : 'SELECT * FROM "user" WHERE (("user"."name" = $1) AND ("user"."id" = $2))', - string: 'SELECT * FROM "user" WHERE (("user"."name" = 3) AND ("user"."id" = 1))' - }, - mysql: { - text : 'SELECT * FROM `user` WHERE ((`user`.`name` = ?) AND (`user`.`id` = ?))', - string: 'SELECT * FROM `user` WHERE ((`user`.`name` = 3) AND (`user`.`id` = 1))' - }, - mssql: { - text : 'SELECT * FROM [user] WHERE (([user].[name] = @1) AND ([user].[id] = @2))', - string: 'SELECT * FROM [user] WHERE (([user].[name] = 3) AND ([user].[id] = 1))' - }, - oracle: { - text : 'SELECT * FROM "user" WHERE (("user"."name" = :1) AND ("user"."id" = :2))', - string: 'SELECT * FROM "user" WHERE (("user"."name" = 3) AND ("user"."id" = 1))' - }, - params: [3, 1] -}); - -// shortcut: no 'from' -Harness.test({ - query: post.select(post.content), - pg: { - text : 'SELECT "post"."content" FROM "post"', - string: 'SELECT "post"."content" FROM "post"' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post"', - string: 'SELECT "post"."content" FROM "post"' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post`', - string: 'SELECT `post`.`content` FROM `post`' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post]', - string: 'SELECT [post].[content] FROM [post]' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post"', - string: 'SELECT "post"."content" FROM "post"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.content).where(post.userId.equals(1)), - pg: { - text : 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = $1)', - string: 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = 1)' - }, - sqlite: { - text : 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = $1)', - string: 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = 1)' - }, - mysql: { - text : 'SELECT `post`.`content` FROM `post` WHERE (`post`.`userId` = ?)', - string: 'SELECT `post`.`content` FROM `post` WHERE (`post`.`userId` = 1)' - }, - mssql: { - text : 'SELECT [post].[content] FROM [post] WHERE ([post].[userId] = @1)', - string: 'SELECT [post].[content] FROM [post] WHERE ([post].[userId] = 1)' - }, - oracle: { - text : 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = :1)', - string: 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = 1)' - }, - params: [1] -}); - -Harness.test({ - query: post.where(post.content.isNull()).or({ - content: '' - }).and({ - userId: 1 - }), - pg: { - text : 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = $1)) AND ("post"."userId" = $2))', - string: 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = \'\')) AND ("post"."userId" = 1))' - }, - sqlite: { - text : 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = $1)) AND ("post"."userId" = $2))', - string: 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = \'\')) AND ("post"."userId" = 1))' - }, - mysql: { - text : 'SELECT * FROM `post` WHERE (((`post`.`content` IS NULL) OR (`post`.`content` = ?)) AND (`post`.`userId` = ?))', - string: 'SELECT * FROM `post` WHERE (((`post`.`content` IS NULL) OR (`post`.`content` = \'\')) AND (`post`.`userId` = 1))' - }, - mssql: { - text : 'SELECT * FROM [post] WHERE ((([post].[content] IS NULL) OR ([post].[content] = @1)) AND ([post].[userId] = @2))', - string: 'SELECT * FROM [post] WHERE ((([post].[content] IS NULL) OR ([post].[content] = \'\')) AND ([post].[userId] = 1))' - }, - oracle: { - text : 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = :1)) AND ("post"."userId" = :2))', - string: 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = \'\')) AND ("post"."userId" = 1))' - }, - params: ['', 1] -}); diff --git a/test/dialects/shortcut-tests.ts b/test/dialects/shortcut-tests.ts new file mode 100644 index 00000000..cca655cb --- /dev/null +++ b/test/dialects/shortcut-tests.ts @@ -0,0 +1,164 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); + +// shortcut: 'select * from
' +Harness.test({ + query: user, + pg: { + text: 'SELECT "user".* FROM "user"', + string: 'SELECT "user".* FROM "user"' + }, + sqlite: { + text: 'SELECT "user".* FROM "user"', + string: 'SELECT "user".* FROM "user"' + }, + mysql: { + text: 'SELECT `user`.* FROM `user`', + string: 'SELECT `user`.* FROM `user`' + }, + mssql: { + text: 'SELECT [user].* FROM [user]', + string: 'SELECT [user].* FROM [user]' + }, + oracle: { + text: 'SELECT "user".* FROM "user"', + string: 'SELECT "user".* FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.where(user.name.equals(3)), + pg: { + text: 'SELECT * FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT * FROM "user" WHERE ("user"."name" = 3)' + }, + sqlite: { + text: 'SELECT * FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT * FROM "user" WHERE ("user"."name" = 3)' + }, + mysql: { + text: 'SELECT * FROM `user` WHERE (`user`.`name` = ?)', + string: 'SELECT * FROM `user` WHERE (`user`.`name` = 3)' + }, + mssql: { + text: 'SELECT * FROM [user] WHERE ([user].[name] = @1)', + string: 'SELECT * FROM [user] WHERE ([user].[name] = 3)' + }, + oracle: { + text: 'SELECT * FROM "user" WHERE ("user"."name" = :1)', + string: 'SELECT * FROM "user" WHERE ("user"."name" = 3)' + }, + params: [3] +}); + +Harness.test({ + query: user.where(user.name.equals(3)).where(user.id.equals(1)), + pg: { + text: 'SELECT * FROM "user" WHERE (("user"."name" = $1) AND ("user"."id" = $2))', + string: 'SELECT * FROM "user" WHERE (("user"."name" = 3) AND ("user"."id" = 1))' + }, + sqlite: { + text: 'SELECT * FROM "user" WHERE (("user"."name" = $1) AND ("user"."id" = $2))', + string: 'SELECT * FROM "user" WHERE (("user"."name" = 3) AND ("user"."id" = 1))' + }, + mysql: { + text: 'SELECT * FROM `user` WHERE ((`user`.`name` = ?) AND (`user`.`id` = ?))', + string: 'SELECT * FROM `user` WHERE ((`user`.`name` = 3) AND (`user`.`id` = 1))' + }, + mssql: { + text: 'SELECT * FROM [user] WHERE (([user].[name] = @1) AND ([user].[id] = @2))', + string: 'SELECT * FROM [user] WHERE (([user].[name] = 3) AND ([user].[id] = 1))' + }, + oracle: { + text: 'SELECT * FROM "user" WHERE (("user"."name" = :1) AND ("user"."id" = :2))', + string: 'SELECT * FROM "user" WHERE (("user"."name" = 3) AND ("user"."id" = 1))' + }, + params: [3, 1] +}); + +// shortcut: no 'from' +Harness.test({ + query: post.select(post.content), + pg: { + text: 'SELECT "post"."content" FROM "post"', + string: 'SELECT "post"."content" FROM "post"' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post"', + string: 'SELECT "post"."content" FROM "post"' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post`', + string: 'SELECT `post`.`content` FROM `post`' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post]', + string: 'SELECT [post].[content] FROM [post]' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post"', + string: 'SELECT "post"."content" FROM "post"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.content).where(post.userId.equals(1)), + pg: { + text: 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = $1)', + string: 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = 1)' + }, + sqlite: { + text: 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = $1)', + string: 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = 1)' + }, + mysql: { + text: 'SELECT `post`.`content` FROM `post` WHERE (`post`.`userId` = ?)', + string: 'SELECT `post`.`content` FROM `post` WHERE (`post`.`userId` = 1)' + }, + mssql: { + text: 'SELECT [post].[content] FROM [post] WHERE ([post].[userId] = @1)', + string: 'SELECT [post].[content] FROM [post] WHERE ([post].[userId] = 1)' + }, + oracle: { + text: 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = :1)', + string: 'SELECT "post"."content" FROM "post" WHERE ("post"."userId" = 1)' + }, + params: [1] +}); + +Harness.test({ + query: post + .where(post.content.isNull()) + .or({ + content: '' + }) + .and({ + userId: 1 + }), + pg: { + text: 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = $1)) AND ("post"."userId" = $2))', + string: 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = \'\')) AND ("post"."userId" = 1))' + }, + sqlite: { + text: 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = $1)) AND ("post"."userId" = $2))', + string: 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = \'\')) AND ("post"."userId" = 1))' + }, + mysql: { + text: 'SELECT * FROM `post` WHERE (((`post`.`content` IS NULL) OR (`post`.`content` = ?)) AND (`post`.`userId` = ?))', + string: "SELECT * FROM `post` WHERE (((`post`.`content` IS NULL) OR (`post`.`content` = '')) AND (`post`.`userId` = 1))" + }, + mssql: { + text: 'SELECT * FROM [post] WHERE ((([post].[content] IS NULL) OR ([post].[content] = @1)) AND ([post].[userId] = @2))', + string: "SELECT * FROM [post] WHERE ((([post].[content] IS NULL) OR ([post].[content] = '')) AND ([post].[userId] = 1))" + }, + oracle: { + text: 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = :1)) AND ("post"."userId" = :2))', + string: 'SELECT * FROM "post" WHERE ((("post"."content" IS NULL) OR ("post"."content" = \'\')) AND ("post"."userId" = 1))' + }, + params: ['', 1] +}); diff --git a/test/dialects/subfield-tests.js b/test/dialects/subfield-tests.js deleted file mode 100644 index aeaab51d..00000000 --- a/test/dialects/subfield-tests.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerCompositeTable(); -var Sql = require('../../lib').setDialect('postgres'); - -Harness.test({ - query: customer.select(customer.info.subfields.age), - pg: { - text : 'SELECT ("customer"."info")."age" FROM "customer"', - string: 'SELECT ("customer"."info")."age" FROM "customer"' - }, - params: [] -}); - - -Harness.test({ - query: customer.select(customer.info.subfields.age.as('years')), - pg: { - text : 'SELECT ("customer"."info")."age" AS "years" FROM "customer"', - string: 'SELECT ("customer"."info")."age" AS "years" FROM "customer"' - }, - params: [] -}); - -Harness.test({ - query: customer.select(customer.id).where(customer.info.subfields.salary.equals(10)), - pg: { - text : 'SELECT "customer"."id" FROM "customer" WHERE (("customer"."info")."salary" = $1)', - string: 'SELECT "customer"."id" FROM "customer" WHERE (("customer"."info")."salary" = 10)' - }, - params: [10] -}); - -Harness.test({ - query: customer.select(customer.info.subfields.name.distinct()), - pg: { - text : 'SELECT DISTINCT(("customer"."info")."name") FROM "customer"', - string: 'SELECT DISTINCT(("customer"."info")."name") FROM "customer"' - }, - params: [] -}); diff --git a/test/dialects/subfield-tests.ts b/test/dialects/subfield-tests.ts new file mode 100644 index 00000000..9f9a6f8a --- /dev/null +++ b/test/dialects/subfield-tests.ts @@ -0,0 +1,40 @@ +'use strict'; + +import * as Harness from './support'; +const customerComposite = Harness.defineCustomerCompositeTable(); + +Harness.test({ + query: customerComposite.select(customerComposite.info.subfields.age), + pg: { + text: 'SELECT ("customer"."info")."age" FROM "customer"', + string: 'SELECT ("customer"."info")."age" FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customerComposite.select(customerComposite.info.subfields.age.as('years')), + pg: { + text: 'SELECT ("customer"."info")."age" AS "years" FROM "customer"', + string: 'SELECT ("customer"."info")."age" AS "years" FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customerComposite.select(customerComposite.id).where(customerComposite.info.subfields.salary.equals(10)), + pg: { + text: 'SELECT "customer"."id" FROM "customer" WHERE (("customer"."info")."salary" = $1)', + string: 'SELECT "customer"."id" FROM "customer" WHERE (("customer"."info")."salary" = 10)' + }, + params: [10] +}); + +Harness.test({ + query: customerComposite.select(customerComposite.info.subfields.name.distinct()), + pg: { + text: 'SELECT DISTINCT(("customer"."info")."name") FROM "customer"', + string: 'SELECT DISTINCT(("customer"."info")."name") FROM "customer"' + }, + params: [] +}); diff --git a/test/dialects/subquery-tests.js b/test/dialects/subquery-tests.js deleted file mode 100644 index fe5b2aad..00000000 --- a/test/dialects/subquery-tests.js +++ /dev/null @@ -1,221 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var user = Harness.defineUserTable(); -var post = Harness.definePostTable(); -var Sql = require('../../lib'); - -Harness.test({ - query: user.select(user.name).where(user.id.in(post.select(post.userId))), - pg: { - text: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))', - string: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))' - }, - sqlite: { - text: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))', - string: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))' - }, - mysql: { - text: 'SELECT `user`.`name` FROM `user` WHERE (`user`.`id` IN (SELECT `post`.`userId` FROM `post`))', - string: 'SELECT `user`.`name` FROM `user` WHERE (`user`.`id` IN (SELECT `post`.`userId` FROM `post`))' - }, - mssql: { - text: 'SELECT [user].[name] FROM [user] WHERE ([user].[id] IN (SELECT [post].[userId] FROM [post]))', - string: 'SELECT [user].[name] FROM [user] WHERE ([user].[id] IN (SELECT [post].[userId] FROM [post]))', - }, - oracle: { - text: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))', - string: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))' - }, - params: [] -}); - -Harness.test({ - query: user.name.in( - customer.subQuery().select(customer.name).where( - user.name.in( - customer.subQuery().select(customer.name).where( - user.name.like('%HELLO%'))))), - pg: { - text : '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE $1)))))', - string: '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE \'%HELLO%\')))))' - }, - sqlite: { - text : '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE $1)))))', - string: '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE \'%HELLO%\')))))' - }, - mysql: { - text : '(`user`.`name` IN (SELECT `customer`.`name` FROM `customer` WHERE (`user`.`name` IN (SELECT `customer`.`name` FROM `customer` WHERE (`user`.`name` LIKE ?)))))', - string: '(`user`.`name` IN (SELECT `customer`.`name` FROM `customer` WHERE (`user`.`name` IN (SELECT `customer`.`name` FROM `customer` WHERE (`user`.`name` LIKE \'%HELLO%\')))))' - }, - mssql: { - text : '([user].[name] IN (SELECT [customer].[name] FROM [customer] WHERE ([user].[name] IN (SELECT [customer].[name] FROM [customer] WHERE ([user].[name] LIKE @1)))))', - string: '([user].[name] IN (SELECT [customer].[name] FROM [customer] WHERE ([user].[name] IN (SELECT [customer].[name] FROM [customer] WHERE ([user].[name] LIKE \'%HELLO%\')))))' - }, - oracle: { - text : '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE :1)))))', - string: '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE \'%HELLO%\')))))' - }, - params: ['%HELLO%'] -}); - -Harness.test({ - query: Sql.select('*').from(user.subQuery()), - pg: { - text : 'SELECT * FROM (SELECT * FROM "user")', - string: 'SELECT * FROM (SELECT * FROM "user")' - }, - sqlite: { - text : 'SELECT * FROM (SELECT * FROM "user")', - string: 'SELECT * FROM (SELECT * FROM "user")' - }, - mysql: { - text : 'SELECT * FROM (SELECT * FROM `user`)', - string: 'SELECT * FROM (SELECT * FROM `user`)' - }, - mssql: { - text : 'SELECT * FROM (SELECT * FROM [user])', - string: 'SELECT * FROM (SELECT * FROM [user])' - }, - oracle: { - text : 'SELECT * FROM (SELECT * FROM "user")', - string: 'SELECT * FROM (SELECT * FROM "user")' - }, - params: [] -}); - -// Subquery with a date -Harness.test({ - query: Sql.select('*').from(post.subQuery().where(post.content.equals(new Date('Sat, 01 Jan 2000 00:00:00 GMT')))), - pg: { - text : 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = $1))', - string: 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = \'2000-01-01T00:00:00.000Z\'))' - }, - sqlite: { - text : 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = $1))', - string: 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = 946684800000))', - config: { - dateTimeMillis: true - } - }, - mysql: { - text : 'SELECT * FROM (SELECT * FROM `post` WHERE (`post`.`content` = ?))', - string: 'SELECT * FROM (SELECT * FROM `post` WHERE (`post`.`content` = \'2000-01-01T00:00:00.000Z\'))' - }, - mssql: { - text : 'SELECT * FROM (SELECT * FROM [post] WHERE ([post].[content] = @1))', - string: 'SELECT * FROM (SELECT * FROM [post] WHERE ([post].[content] = \'2000-01-01T00:00:00.000Z\'))' - }, - oracle: { - text : 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = :1))', - string: 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = \'2000-01-01T00:00:00.000Z\'))' - }, - params: [new Date('Sat, 01 Jan 2000 00:00:00 GMT')] -}); - - -Harness.test({ - query: Sql.select('*').from(customer.subQuery('T1')).from(user.subQuery('T2')), - pg: { - text : 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"', - string: 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"' - }, - sqlite: { - text : 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"', - string: 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"' - }, - mysql: { - text : 'SELECT * FROM (SELECT * FROM `customer`) `T1` , (SELECT * FROM `user`) `T2`', - string: 'SELECT * FROM (SELECT * FROM `customer`) `T1` , (SELECT * FROM `user`) `T2`' - }, - mssql: { - text : 'SELECT * FROM (SELECT * FROM [customer]) [T1] , (SELECT * FROM [user]) [T2]', - string: 'SELECT * FROM (SELECT * FROM [customer]) [T1] , (SELECT * FROM [user]) [T2]' - }, - oracle: { - text : 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"', - string: 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"' - }, - params: [] -}); - -Harness.test({ - query: customer.name.between( - customer.subQuery().select(Sql.functions.MIN(customer.name)), - customer.subQuery().select(Sql.functions.MAX(customer.name)) - ), - pg: { - text : '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))', - string: '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))' - }, - sqlite: { - text : '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))', - string: '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))' - }, - mysql: { - text : '(`customer`.`name` BETWEEN (SELECT MIN(`customer`.`name`) FROM `customer`) AND (SELECT MAX(`customer`.`name`) FROM `customer`))', - string: '(`customer`.`name` BETWEEN (SELECT MIN(`customer`.`name`) FROM `customer`) AND (SELECT MAX(`customer`.`name`) FROM `customer`))' - }, - mssql: { - text : '([customer].[name] BETWEEN (SELECT MIN([customer].[name]) FROM [customer]) AND (SELECT MAX([customer].[name]) FROM [customer]))', - string: '([customer].[name] BETWEEN (SELECT MIN([customer].[name]) FROM [customer]) AND (SELECT MAX([customer].[name]) FROM [customer]))' - }, - oracle: { - text : '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))', - string: '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))' - }, - params: [] -}); - -Harness.test({ - query: user.subQuery().where(user.name.equals(customer.name)).exists(), - pg: { - text : '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))', - string: '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))' - }, - sqlite: { - text : '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))', - string: '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))' - }, - mysql: { - text : '(EXISTS (SELECT * FROM `user` WHERE (`user`.`name` = `customer`.`name`)))', - string: '(EXISTS (SELECT * FROM `user` WHERE (`user`.`name` = `customer`.`name`)))' - }, - mssql: { - text : '(EXISTS (SELECT * FROM [user] WHERE ([user].[name] = [customer].[name])))', - string: '(EXISTS (SELECT * FROM [user] WHERE ([user].[name] = [customer].[name])))' - }, - oracle: { - text : '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))', - string: '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))' - }, - params: [] -}); - -var limitUsers = user.subQuery('limit-users').select(user.id, user.name).from(user).order(user.name).limit(10).offset(10); -Harness.test({ - query: Sql.select(limitUsers.name, post.tags).from(limitUsers.leftJoin(post).on(post.userId.equals(limitUsers.id))), - pg: { - text : 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT 10 OFFSET 10) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")', - string: 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT 10 OFFSET 10) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")' - }, - sqlite: { - text : 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT 10 OFFSET 10) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")', - string: 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT 10 OFFSET 10) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")' - }, - mysql: { - text : 'SELECT `limit-users`.`name`, `post`.`tags` FROM (SELECT `user`.`id`, `user`.`name` FROM `user` ORDER BY `user`.`name` LIMIT 10 OFFSET 10) `limit-users` LEFT JOIN `post` ON (`post`.`userId` = `limit-users`.`id`)', - string: 'SELECT `limit-users`.`name`, `post`.`tags` FROM (SELECT `user`.`id`, `user`.`name` FROM `user` ORDER BY `user`.`name` LIMIT 10 OFFSET 10) `limit-users` LEFT JOIN `post` ON (`post`.`userId` = `limit-users`.`id`)' - }, - mssql: { - text : 'SELECT [limit-users].[name], [post].[tags] FROM (SELECT [user].[id], [user].[name] FROM [user] ORDER BY [user].[name] OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY) [limit-users] LEFT JOIN [post] ON ([post].[userId] = [limit-users].[id])', - string: 'SELECT [limit-users].[name], [post].[tags] FROM (SELECT [user].[id], [user].[name] FROM [user] ORDER BY [user].[name] OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY) [limit-users] LEFT JOIN [post] ON ([post].[userId] = [limit-users].[id])' - }, - oracle: { - text : 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")', - string: 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")' - }, - params: [] -}); - diff --git a/test/dialects/subquery-tests.ts b/test/dialects/subquery-tests.ts new file mode 100644 index 00000000..03924df2 --- /dev/null +++ b/test/dialects/subquery-tests.ts @@ -0,0 +1,270 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const customer = Harness.defineCustomerTable(); +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); +const instance = new Sql('postgres'); + +Harness.test({ + query: user.select(user.name).where(user.id.in(post.select(post.userId))), + pg: { + text: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))', + string: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))' + }, + sqlite: { + text: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))', + string: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))' + }, + mysql: { + text: 'SELECT `user`.`name` FROM `user` WHERE (`user`.`id` IN (SELECT `post`.`userId` FROM `post`))', + string: 'SELECT `user`.`name` FROM `user` WHERE (`user`.`id` IN (SELECT `post`.`userId` FROM `post`))' + }, + mssql: { + text: 'SELECT [user].[name] FROM [user] WHERE ([user].[id] IN (SELECT [post].[userId] FROM [post]))', + string: 'SELECT [user].[name] FROM [user] WHERE ([user].[id] IN (SELECT [post].[userId] FROM [post]))' + }, + oracle: { + text: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))', + string: 'SELECT "user"."name" FROM "user" WHERE ("user"."id" IN (SELECT "post"."userId" FROM "post"))' + }, + params: [] +}); + +Harness.test({ + query: user.name.in( + customer + .subQuery() + .select(customer.name) + .where( + user.name.in( + customer + .subQuery() + .select(customer.name) + .where(user.name.like('%HELLO%')) + ) + ) + ), + pg: { + text: + '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE $1)))))', + string: + '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE \'%HELLO%\')))))' + }, + sqlite: { + text: + '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE $1)))))', + string: + '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE \'%HELLO%\')))))' + }, + mysql: { + text: + '(`user`.`name` IN (SELECT `customer`.`name` FROM `customer` WHERE (`user`.`name` IN (SELECT `customer`.`name` FROM `customer` WHERE (`user`.`name` LIKE ?)))))', + string: + "(`user`.`name` IN (SELECT `customer`.`name` FROM `customer` WHERE (`user`.`name` IN (SELECT `customer`.`name` FROM `customer` WHERE (`user`.`name` LIKE '%HELLO%')))))" + }, + mssql: { + text: + '([user].[name] IN (SELECT [customer].[name] FROM [customer] WHERE ([user].[name] IN (SELECT [customer].[name] FROM [customer] WHERE ([user].[name] LIKE @1)))))', + string: + "([user].[name] IN (SELECT [customer].[name] FROM [customer] WHERE ([user].[name] IN (SELECT [customer].[name] FROM [customer] WHERE ([user].[name] LIKE '%HELLO%')))))" + }, + oracle: { + text: + '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE :1)))))', + string: + '("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" IN (SELECT "customer"."name" FROM "customer" WHERE ("user"."name" LIKE \'%HELLO%\')))))' + }, + params: ['%HELLO%'] +}); + +Harness.test({ + query: instance.select('*').from(user.subQuery()), + pg: { + text: 'SELECT * FROM (SELECT * FROM "user")', + string: 'SELECT * FROM (SELECT * FROM "user")' + }, + sqlite: { + text: 'SELECT * FROM (SELECT * FROM "user")', + string: 'SELECT * FROM (SELECT * FROM "user")' + }, + mysql: { + text: 'SELECT * FROM (SELECT * FROM `user`)', + string: 'SELECT * FROM (SELECT * FROM `user`)' + }, + mssql: { + text: 'SELECT * FROM (SELECT * FROM [user])', + string: 'SELECT * FROM (SELECT * FROM [user])' + }, + oracle: { + text: 'SELECT * FROM (SELECT * FROM "user")', + string: 'SELECT * FROM (SELECT * FROM "user")' + }, + params: [] +}); + +// Subquery with a date +Harness.test({ + query: instance.select('*').from(post.subQuery().where(post.content.equals(new Date('Sat, 01 Jan 2000 00:00:00 GMT')))), + pg: { + text: 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = $1))', + string: 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = \'2000-01-01T00:00:00.000Z\'))' + }, + sqlite: { + text: 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = $1))', + string: 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = 946684800000))', + config: { + dateTimeMillis: true + } + }, + mysql: { + text: 'SELECT * FROM (SELECT * FROM `post` WHERE (`post`.`content` = ?))', + string: "SELECT * FROM (SELECT * FROM `post` WHERE (`post`.`content` = '2000-01-01T00:00:00.000Z'))" + }, + mssql: { + text: 'SELECT * FROM (SELECT * FROM [post] WHERE ([post].[content] = @1))', + string: "SELECT * FROM (SELECT * FROM [post] WHERE ([post].[content] = '2000-01-01T00:00:00.000Z'))" + }, + oracle: { + text: 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = :1))', + string: 'SELECT * FROM (SELECT * FROM "post" WHERE ("post"."content" = \'2000-01-01T00:00:00.000Z\'))' + }, + params: [new Date('Sat, 01 Jan 2000 00:00:00 GMT')] +}); + +Harness.test({ + query: instance + .select('*') + .from(customer.subQuery('T1')) + .from(user.subQuery('T2')), + pg: { + text: 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"', + string: 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"' + }, + sqlite: { + text: 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"', + string: 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"' + }, + mysql: { + text: 'SELECT * FROM (SELECT * FROM `customer`) `T1` , (SELECT * FROM `user`) `T2`', + string: 'SELECT * FROM (SELECT * FROM `customer`) `T1` , (SELECT * FROM `user`) `T2`' + }, + mssql: { + text: 'SELECT * FROM (SELECT * FROM [customer]) [T1] , (SELECT * FROM [user]) [T2]', + string: 'SELECT * FROM (SELECT * FROM [customer]) [T1] , (SELECT * FROM [user]) [T2]' + }, + oracle: { + text: 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"', + string: 'SELECT * FROM (SELECT * FROM "customer") "T1" , (SELECT * FROM "user") "T2"' + }, + params: [] +}); + +Harness.test({ + query: customer.name.between( + customer.subQuery().select(instance.functions.MIN(customer.name)), + customer.subQuery().select(instance.functions.MAX(customer.name)) + ), + pg: { + text: + '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))', + string: + '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))' + }, + sqlite: { + text: + '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))', + string: + '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))' + }, + mysql: { + text: + '(`customer`.`name` BETWEEN (SELECT MIN(`customer`.`name`) FROM `customer`) AND (SELECT MAX(`customer`.`name`) FROM `customer`))', + string: + '(`customer`.`name` BETWEEN (SELECT MIN(`customer`.`name`) FROM `customer`) AND (SELECT MAX(`customer`.`name`) FROM `customer`))' + }, + mssql: { + text: + '([customer].[name] BETWEEN (SELECT MIN([customer].[name]) FROM [customer]) AND (SELECT MAX([customer].[name]) FROM [customer]))', + string: + '([customer].[name] BETWEEN (SELECT MIN([customer].[name]) FROM [customer]) AND (SELECT MAX([customer].[name]) FROM [customer]))' + }, + oracle: { + text: + '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))', + string: + '("customer"."name" BETWEEN (SELECT MIN("customer"."name") FROM "customer") AND (SELECT MAX("customer"."name") FROM "customer"))' + }, + params: [] +}); + +Harness.test({ + query: user + .subQuery() + .where(user.name.equals(customer.name)) + .exists(), + pg: { + text: '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))', + string: '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))' + }, + sqlite: { + text: '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))', + string: '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))' + }, + mysql: { + text: '(EXISTS (SELECT * FROM `user` WHERE (`user`.`name` = `customer`.`name`)))', + string: '(EXISTS (SELECT * FROM `user` WHERE (`user`.`name` = `customer`.`name`)))' + }, + mssql: { + text: '(EXISTS (SELECT * FROM [user] WHERE ([user].[name] = [customer].[name])))', + string: '(EXISTS (SELECT * FROM [user] WHERE ([user].[name] = [customer].[name])))' + }, + oracle: { + text: '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))', + string: '(EXISTS (SELECT * FROM "user" WHERE ("user"."name" = "customer"."name")))' + }, + params: [] +}); + +var limitUsers = user + .subQuery('limit-users') + .select(user.id, user.name) + .from(user) + .order(user.name) + .limit(10) + .offset(10); +Harness.test({ + query: instance.select(limitUsers.name, post.tags).from(limitUsers.leftJoin(post).on(post.userId.equals(limitUsers.id))), + pg: { + text: + 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT $1 OFFSET $2) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")', + string: + 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT 10 OFFSET 10) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")' + }, + sqlite: { + text: + 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT $1 OFFSET $2) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")', + string: + 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT 10 OFFSET 10) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")' + }, + mysql: { + text: + 'SELECT `limit-users`.`name`, `post`.`tags` FROM (SELECT `user`.`id`, `user`.`name` FROM `user` ORDER BY `user`.`name` LIMIT ? OFFSET ?) `limit-users` LEFT JOIN `post` ON (`post`.`userId` = `limit-users`.`id`)', + string: + 'SELECT `limit-users`.`name`, `post`.`tags` FROM (SELECT `user`.`id`, `user`.`name` FROM `user` ORDER BY `user`.`name` LIMIT 10 OFFSET 10) `limit-users` LEFT JOIN `post` ON (`post`.`userId` = `limit-users`.`id`)' + }, + mssql: { + text: + 'SELECT [limit-users].[name], [post].[tags] FROM (SELECT [user].[id], [user].[name] FROM [user] ORDER BY [user].[name] OFFSET @1 ROWS FETCH NEXT @2 ROWS ONLY) [limit-users] LEFT JOIN [post] ON ([post].[userId] = [limit-users].[id])', + string: + 'SELECT [limit-users].[name], [post].[tags] FROM (SELECT [user].[id], [user].[name] FROM [user] ORDER BY [user].[name] OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY) [limit-users] LEFT JOIN [post] ON ([post].[userId] = [limit-users].[id])' + }, + oracle: { + text: + 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" OFFSET :2 ROWS FETCH NEXT :1 ROWS ONLY) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")', + string: + 'SELECT "limit-users"."name", "post"."tags" FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY) "limit-users" LEFT JOIN "post" ON ("post"."userId" = "limit-users"."id")' + }, + params: [10, 10] +}); diff --git a/test/dialects/support.js b/test/dialects/support.js deleted file mode 100644 index 4a9fa427..00000000 --- a/test/dialects/support.js +++ /dev/null @@ -1,137 +0,0 @@ -'use strict'; -var assert = require('assert'); - -var Table = require('../../lib/table'); - -// specify dialect classes -var dialects = { - pg : require('../../lib/dialect/postgres'), - sqlite : require('../../lib/dialect/sqlite'), - mysql : require('../../lib/dialect/mysql'), - mssql : require('../../lib/dialect/mssql'), - oracle : require('../../lib/dialect/oracle') -}; - -module.exports = { - test: function(expected) { - // for each dialect - Object.keys(dialects).forEach(function(dialect) { - var expectedObject = expected[dialect]; - if (undefined !== expectedObject) { - - var DialectClass = dialects[dialect]; - - var title = dialect + ': ' + (expected.title || expectedObject.text || expectedObject); - test(title, function() { - - // check if this query is expected to throw - if (expectedObject.throws) { - assert.throws(function() { - new DialectClass(expectedObject.config).getQuery(expected.query); - }); - } else { - // build query for dialect - var compiledQuery = new DialectClass(expectedObject.config).getQuery(expected.query); - - // test result is correct - var expectedText = expectedObject.text || expectedObject; - assert.equal(compiledQuery.text, expectedText); - - // if params are specified then test these are correct - var expectedParams = expectedObject.params || expected.params; - if (undefined !== expectedParams) { - assert.equal(expectedParams.length, compiledQuery.values.length, 'params length'); - for (var i = 0; i < expectedParams.length; i++) { - assert.deepEqual(expectedParams[i], compiledQuery.values[i], 'param ' + (i + 1)); - } - } - } - - if (undefined !== expectedObject.string) { - // test the toString - if (expectedObject.throws) { - assert.throws(function() { - new DialectClass(expectedObject.config).getString(expected.query); - }); - } else { - var compiledString = new DialectClass(expectedObject.config).getString(expected.query); - - // test result is correct - assert.equal(compiledString, expectedObject.string); - } - } - }); - } // if - }); // forEach - }, - - defineUserTable: function() { - return Table.define({ - name: 'user', - quote: true, - columns: ['id', 'name'] - }); - }, - - definePostTable: function() { - return Table.define({ - name: 'post', - columns: ['id', 'userId', 'content', 'tags', 'length'] - }); - }, - - defineCommentTable: function() { - return Table.define({ - name: 'comment', - columns: ['postId', 'text'] - }); - }, - - defineCustomerTable: function() { - return Table.define({ - name: 'customer', - columns: ['id', 'name', 'age', 'income', 'metadata'] - }); - }, - - // This table defines the customer attributes as a composite field - defineCustomerCompositeTable: function() { - return Table.define({ - name: 'customer', - columns: { - id: {}, - info: {subfields: ['name', 'age', 'salary']} - } - }); - }, - - defineCustomerAliasTable: function() { - return Table.define({ - name: 'customer', - columns: { - id: {property: 'id_alias'}, - name: {property: 'name_alias'}, - age: {property: 'age_alias'}, - income: {property: 'income_alias'}, - metadata: {property: 'metadata_alias'} - } - }); - }, - - // This table contains column names that correspond to popularly used variables in formulas. - defineVariableTable: function() { - return Table.define({ - name: 'variable', - columns: ['a', 'b', 'c', 'd', 't', 'u', 'v', 'x', 'y', 'z'] - }); - }, - -// this table is for testing snakeName related stuff - defineContentTable: function() { - return Table.define({ - name: 'content', - columns: ['content_id', 'text', 'content_posts'], - snakeToCamel: true - }); - } -}; diff --git a/test/dialects/support.ts b/test/dialects/support.ts new file mode 100644 index 00000000..bb6b3d0b --- /dev/null +++ b/test/dialects/support.ts @@ -0,0 +1,197 @@ +'use strict'; +import assert = require('assert'); + +import { Table } from '../../lib/table'; +import { Postgres } from '../../lib/dialect/postgres'; +import { Sqlite } from '../../lib/dialect/sqlite'; +import { Mysql } from '../../lib/dialect/mysql'; +import { Mssql } from '../../lib/dialect/mssql'; +import { Oracle } from '../../lib/dialect/oracle'; + +// specify dialect classes +const dialects = { + pg: Postgres, + sqlite: Sqlite, + mysql: Mysql, + mssql: Mssql, + oracle: Oracle +}; + +function customTest(expected: any) { + // for each dialect + Object.keys(dialects).forEach(function(dialect) { + var expectedObject = expected[dialect]; + if (undefined !== expectedObject) { + var DialectClass = (dialects as any)[dialect]; + + var title = dialect + ': ' + (expected.title || expectedObject.text || expectedObject); + test(title, function() { + // check if this query is expected to throw + if (expectedObject.throws) { + assert.throws(function() { + new DialectClass(expectedObject.config || {}).getQuery(expected.query); + }); + } else { + // build query for dialect + var compiledQuery = new DialectClass(expectedObject.config || {}).getQuery(expected.query); + + // test result is correct + var expectedText = expectedObject.text || expectedObject; + assert.equal(compiledQuery.text, expectedText); + + // if params are specified then test these are correct + var expectedParams = expectedObject.params || expected.params; + if (undefined !== expectedParams) { + assert.equal(expectedParams.length, compiledQuery.values.length, 'params length'); + for (var i = 0; i < expectedParams.length; i++) { + assert.deepEqual(expectedParams[i], compiledQuery.values[i], 'param ' + (i + 1)); + } + } + } + + if (undefined !== expectedObject.string) { + // test the toString + if (expectedObject.throws) { + assert.throws(function() { + new DialectClass(expectedObject.config || {}).getString(expected.query); + }); + } else { + var compiledString = new DialectClass(expectedObject.config || {}).getString(expected.query); + + // test result is correct + assert.equal(compiledString, expectedObject.string); + } + } + }); + } // if + }); // forEach +} + +export interface UserTable { + id: number; + name: string; +} + +export function defineUserTable() { + return Table.define({ + name: 'user', + columns: ['id', 'name'] + }); +} + +export interface PostTable { + id: number; + userId: number; + content: string | null; + tags: string; + length: number; +} + +export function definePostTable() { + return Table.define({ + name: 'post', + columns: ['id', 'userId', 'content', 'tags', 'length'] + }); +} + +export interface CommentTable { + postId: number; + text: string; +} + +export function defineCommentTable() { + return Table.define({ + name: 'comment', + columns: ['postId', 'text'] + }); +} + +export interface CustomerTable { + id: number; + name: string; + age: number; + income: number; + metadata: object; +} + +export function defineCustomerTable() { + return Table.define({ + name: 'customer', + columns: ['id', 'name', 'age', 'income', 'metadata'] + }); +} + +export interface CustomerCompositeTable { + id: number; + info: object; +} + +// This table defines the customer attributes as a composite field +export function defineCustomerCompositeTable() { + return Table.define({ + name: 'customer', + columns: { + id: {}, + info: { subfields: ['name', 'age', 'salary'] } + } + }); +} + +export interface CustomerAliasTable { + id_alias: number; + name_alias: string; + age_alias: number; + income_alias: number; + metadata_alias: object; +} + +export function defineCustomerAliasTable() { + return Table.define({ + name: 'customer', + columns: { + id: { property: 'id_alias' }, + name: { property: 'name_alias' }, + age: { property: 'age_alias' }, + income: { property: 'income_alias' }, + metadata: { property: 'metadata_alias' } + } + }); +} + +export interface VariableTable { + a: any; + b: any; + c: any; + d: any; + t: any; + u: any; + v: any; + x: any; + y: any; + z: any; +} + +// This table contains column names that correspond to popularly used variables in formulas. +export function defineVariableTable() { + return Table.define({ + name: 'variable', + columns: ['a', 'b', 'c', 'd', 't', 'u', 'v', 'x', 'y', 'z'] + }); +} + +export interface ContentTable { + content_id: number; + text: string; + content_posts: string; +} + +// this table is for testing snakeName related stuff +export function defineContentTable() { + return Table.define({ + name: 'content', + columns: ['content_id', 'text', 'content_posts'], + snakeToCamel: true + }); +} + +export { customTest as test }; diff --git a/test/dialects/table-tests.js b/test/dialects/table-tests.js deleted file mode 100644 index 6740a7c8..00000000 --- a/test/dialects/table-tests.js +++ /dev/null @@ -1,675 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); - -Harness.test({ - query: user.select(user.id).from(user), - pg: { - text : 'SELECT "user"."id" FROM "user"', - string: 'SELECT "user"."id" FROM "user"' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user"', - string: 'SELECT "user"."id" FROM "user"' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user`', - string: 'SELECT `user`.`id` FROM `user`' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user]', - string: 'SELECT [user].[id] FROM [user]' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user"', - string: 'SELECT "user"."id" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.id, user.name).from(user), - pg: { - text : 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - sqlite: { - text : 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - mysql: { - text : 'SELECT `user`.`id`, `user`.`name` FROM `user`', - string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' - }, - mssql: { - text : 'SELECT [user].[id], [user].[name] FROM [user]', - string: 'SELECT [user].[id], [user].[name] FROM [user]' - }, - oracle: { - text : 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.star()).from(user), - pg: { - text : 'SELECT "user".* FROM "user"', - string: 'SELECT "user".* FROM "user"' - }, - sqlite: { - text : 'SELECT "user".* FROM "user"', - string: 'SELECT "user".* FROM "user"' - }, - mysql: { - text : 'SELECT `user`.* FROM `user`', - string: 'SELECT `user`.* FROM `user`' - }, - mssql: { - text : 'SELECT [user].* FROM [user]', - string: 'SELECT [user].* FROM [user]' - }, - oracle: { - text : 'SELECT "user".* FROM "user"', - string: 'SELECT "user".* FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.id, [ user.name ]).from(user), - pg: { - text: 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - sqlite: { - text: 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - mysql: { - text: 'SELECT `user`.`id`, `user`.`name` FROM `user`', - string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' - }, - oracle: { - text: 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select([ user.id ], user.name).from(user), - pg: { - text: 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - sqlite: { - text: 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - mysql: { - text: 'SELECT `user`.`id`, `user`.`name` FROM `user`', - string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' - }, - oracle: { - text: 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select([ user.id , user.name ]).from(user), - pg: { - text: 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - sqlite: { - text: 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - mysql: { - text: 'SELECT `user`.`id`, `user`.`name` FROM `user`', - string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' - }, - oracle: { - text: 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.star(), user.star({ prefix: 'foo_' }), user.star({ prefix: 'bar_' })).from(user), - pg: { - text: 'SELECT "user".*, "user"."id" AS "foo_id", "user"."name" AS "foo_name", "user"."id" AS "bar_id", "user"."name" AS "bar_name" FROM "user"', - string: 'SELECT "user".*, "user"."id" AS "foo_id", "user"."name" AS "foo_name", "user"."id" AS "bar_id", "user"."name" AS "bar_name" FROM "user"' - }, - sqlite: { - text: 'SELECT "user".*, "user"."id" AS "foo_id", "user"."name" AS "foo_name", "user"."id" AS "bar_id", "user"."name" AS "bar_name" FROM "user"', - string: 'SELECT "user".*, "user"."id" AS "foo_id", "user"."name" AS "foo_name", "user"."id" AS "bar_id", "user"."name" AS "bar_name" FROM "user"' - }, - mysql: { - text: 'SELECT `user`.*, `user`.`id` AS `foo_id`, `user`.`name` AS `foo_name`, `user`.`id` AS `bar_id`, `user`.`name` AS `bar_name` FROM `user`', - string: 'SELECT `user`.*, `user`.`id` AS `foo_id`, `user`.`name` AS `foo_name`, `user`.`id` AS `bar_id`, `user`.`name` AS `bar_name` FROM `user`' - }, - oracle: { - text: 'SELECT "user".*, "user"."id" "foo_id", "user"."name" "foo_name", "user"."id" "bar_id", "user"."name" "bar_name" FROM "user"', - string: 'SELECT "user".*, "user"."id" "foo_id", "user"."name" "foo_name", "user"."id" "bar_id", "user"."name" "bar_name" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.id).from(user).where(user.name.equals('foo')), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'foo\')' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'foo\')' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = ?)', - string: 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = \'foo\')' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE ([user].[name] = @1)', - string: 'SELECT [user].[id] FROM [user] WHERE ([user].[name] = \'foo\')' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = :1)', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'foo\')' - }, - params: ['foo'] -}); - -Harness.test({ - query: user.select(user.id).from(user).where(user.name.equals('foo').or(user.name.equals('bar'))), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) OR ("user"."name" = $2))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) OR ("user"."name" = $2))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = ?) OR (`user`.`name` = ?))', - string: 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = \'foo\') OR (`user`.`name` = \'bar\'))' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE (([user].[name] = @1) OR ([user].[name] = @2))', - string: 'SELECT [user].[id] FROM [user] WHERE (([user].[name] = \'foo\') OR ([user].[name] = \'bar\'))' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = :1) OR ("user"."name" = :2))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' - }, - params: ['foo', 'bar'] -}); - -Harness.test({ - query: user.select(user.id).from(user).where(user.name.equals('foo').and(user.name.equals('bar'))), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) AND ("user"."name" = $2))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') AND ("user"."name" = \'bar\'))' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) AND ("user"."name" = $2))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') AND ("user"."name" = \'bar\'))' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = ?) AND (`user`.`name` = ?))', - string: 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = \'foo\') AND (`user`.`name` = \'bar\'))' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE (([user].[name] = @1) AND ([user].[name] = @2))', - string: 'SELECT [user].[id] FROM [user] WHERE (([user].[name] = \'foo\') AND ([user].[name] = \'bar\'))' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = :1) AND ("user"."name" = :2))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') AND ("user"."name" = \'bar\'))' - }, - params: ['foo', 'bar'] -}); - -Harness.test({ - query: user.select(user.id).from(user).where(user.name.equals('foo')).or(user.name.equals('bar')), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) OR ("user"."name" = $2))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) OR ("user"."name" = $2))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = ?) OR (`user`.`name` = ?))', - string: 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = \'foo\') OR (`user`.`name` = \'bar\'))' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE (([user].[name] = @1) OR ([user].[name] = @2))', - string: 'SELECT [user].[id] FROM [user] WHERE (([user].[name] = \'foo\') OR ([user].[name] = \'bar\'))' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = :1) OR ("user"."name" = :2))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' - }, - params: ['foo', 'bar'] -}); - -Harness.test({ - query: user.select(user.id).from(user).where(user.name.equals('foo')).or(user.name.equals('baz')).and(user.name.equals('bar')), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) OR ("user"."name" = $2)) AND ("user"."name" = $3))', - string: 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'foo\') OR ("user"."name" = \'baz\')) AND ("user"."name" = \'bar\'))' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) OR ("user"."name" = $2)) AND ("user"."name" = $3))', - string: 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'foo\') OR ("user"."name" = \'baz\')) AND ("user"."name" = \'bar\'))' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE (((`user`.`name` = ?) OR (`user`.`name` = ?)) AND (`user`.`name` = ?))', - string: 'SELECT `user`.`id` FROM `user` WHERE (((`user`.`name` = \'foo\') OR (`user`.`name` = \'baz\')) AND (`user`.`name` = \'bar\'))' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE ((([user].[name] = @1) OR ([user].[name] = @2)) AND ([user].[name] = @3))', - string: 'SELECT [user].[id] FROM [user] WHERE ((([user].[name] = \'foo\') OR ([user].[name] = \'baz\')) AND ([user].[name] = \'bar\'))' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = :1) OR ("user"."name" = :2)) AND ("user"."name" = :3))', - string: 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'foo\') OR ("user"."name" = \'baz\')) AND ("user"."name" = \'bar\'))' - }, - params: ['foo', 'baz', 'bar'] -}); - -Harness.test({ - query: user.select(user.id).from(user).where(user.name.in(['foo', 'bar'])), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN ($1, $2))', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN (\'foo\', \'bar\'))' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN ($1, $2))', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN (\'foo\', \'bar\'))' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` IN (?, ?))', - string: 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` IN (\'foo\', \'bar\'))' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE ([user].[name] IN (@1, @2))', - string: 'SELECT [user].[id] FROM [user] WHERE ([user].[name] IN (\'foo\', \'bar\'))' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN (:1, :2))', - string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN (\'foo\', \'bar\'))' - }, - params: ['foo', 'bar'] -}); - -Harness.test({ - query: user.select(user.id).from(user).where(user.name.in(['foo', 'bar']).and(user.id.equals(1))), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN ($1, $2)) AND ("user"."id" = $3))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN (\'foo\', \'bar\')) AND ("user"."id" = 1))' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN ($1, $2)) AND ("user"."id" = $3))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN (\'foo\', \'bar\')) AND ("user"."id" = 1))' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` IN (?, ?)) AND (`user`.`id` = ?))', - string: 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` IN (\'foo\', \'bar\')) AND (`user`.`id` = 1))' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE (([user].[name] IN (@1, @2)) AND ([user].[id] = @3))', - string: 'SELECT [user].[id] FROM [user] WHERE (([user].[name] IN (\'foo\', \'bar\')) AND ([user].[id] = 1))' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN (:1, :2)) AND ("user"."id" = :3))', - string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN (\'foo\', \'bar\')) AND ("user"."id" = 1))' - }, - params: ['foo', 'bar', 1] -}); - -Harness.test({ - query: user.select(user.columns), - pg: { - text : 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - sqlite: { - text : 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - mysql: { - text : 'SELECT `user`.`id`, `user`.`name` FROM `user`', - string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' - }, - mssql: { - text : 'SELECT [user].[id], [user].[name] FROM [user]', - string: 'SELECT [user].[id], [user].[name] FROM [user]' - }, - oracle: { - text : 'SELECT "user"."id", "user"."name" FROM "user"', - string: 'SELECT "user"."id", "user"."name" FROM "user"' - }, - params: [] -}); - - -Harness.test({ - query: user - .select(user.id) - .from(user) - .where( - user.name.equals('boom') - .and(user.id.equals(1))).or( - user.name.equals('bang').and(user.id.equals(2))), - pg: { - text : 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) AND ("user"."id" = $2)) OR (("user"."name" = $3) AND ("user"."id" = $4)))', - string: 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'boom\') AND ("user"."id" = 1)) OR (("user"."name" = \'bang\') AND ("user"."id" = 2)))' - }, - sqlite: { - text : 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) AND ("user"."id" = $2)) OR (("user"."name" = $3) AND ("user"."id" = $4)))', - string: 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'boom\') AND ("user"."id" = 1)) OR (("user"."name" = \'bang\') AND ("user"."id" = 2)))' - }, - mysql: { - text : 'SELECT `user`.`id` FROM `user` WHERE (((`user`.`name` = ?) AND (`user`.`id` = ?)) OR ((`user`.`name` = ?) AND (`user`.`id` = ?)))', - string: 'SELECT `user`.`id` FROM `user` WHERE (((`user`.`name` = \'boom\') AND (`user`.`id` = 1)) OR ((`user`.`name` = \'bang\') AND (`user`.`id` = 2)))' - }, - mssql: { - text : 'SELECT [user].[id] FROM [user] WHERE ((([user].[name] = @1) AND ([user].[id] = @2)) OR (([user].[name] = @3) AND ([user].[id] = @4)))', - string: 'SELECT [user].[id] FROM [user] WHERE ((([user].[name] = \'boom\') AND ([user].[id] = 1)) OR (([user].[name] = \'bang\') AND ([user].[id] = 2)))' - }, - oracle: { - text : 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = :1) AND ("user"."id" = :2)) OR (("user"."name" = :3) AND ("user"."id" = :4)))', - string: 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'boom\') AND ("user"."id" = 1)) OR (("user"."name" = \'bang\') AND ("user"."id" = 2)))' - }, - params: ['boom', 1, 'bang', 2] -}); - -Harness.test({ - query: user.select(user.name.as('user name'), user.id.as('user id')).from(user), - pg: { - text : 'SELECT "user"."name" AS "user name", "user"."id" AS "user id" FROM "user"', - string: 'SELECT "user"."name" AS "user name", "user"."id" AS "user id" FROM "user"' - }, - sqlite: { - text : 'SELECT "user"."name" AS "user name", "user"."id" AS "user id" FROM "user"', - string: 'SELECT "user"."name" AS "user name", "user"."id" AS "user id" FROM "user"' - }, - mysql: { - text : 'SELECT `user`.`name` AS `user name`, `user`.`id` AS `user id` FROM `user`', - string: 'SELECT `user`.`name` AS `user name`, `user`.`id` AS `user id` FROM `user`' - }, - mssql: { - text : 'SELECT [user].[name] AS [user name], [user].[id] AS [user id] FROM [user]', - string: 'SELECT [user].[name] AS [user name], [user].[id] AS [user id] FROM [user]' - }, - oracle: { - text : 'SELECT "user"."name" "user name", "user"."id" "user id" FROM "user"', - string: 'SELECT "user"."name" "user name", "user"."id" "user id" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.name.as('user name')).from(user).where(user.name.equals('brian')), - pg: { - text : 'SELECT "user"."name" AS "user name" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."name" AS "user name" FROM "user" WHERE ("user"."name" = \'brian\')' - }, - sqlite: { - text : 'SELECT "user"."name" AS "user name" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."name" AS "user name" FROM "user" WHERE ("user"."name" = \'brian\')' - }, - mysql: { - text : 'SELECT `user`.`name` AS `user name` FROM `user` WHERE (`user`.`name` = ?)', - string: 'SELECT `user`.`name` AS `user name` FROM `user` WHERE (`user`.`name` = \'brian\')' - }, - mssql: { - text : 'SELECT [user].[name] AS [user name] FROM [user] WHERE ([user].[name] = @1)', - string: 'SELECT [user].[name] AS [user name] FROM [user] WHERE ([user].[name] = \'brian\')' - }, - oracle: { - text : 'SELECT "user"."name" "user name" FROM "user" WHERE ("user"."name" = :1)', - string: 'SELECT "user"."name" "user name" FROM "user" WHERE ("user"."name" = \'brian\')' - }, - params: ['brian'] -}); - -Harness.test({ - query: user.select(user.name).from(user).where(user.name.equals('brian')), - pg: { - text : 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = \'brian\')' - }, - sqlite: { - text : 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = $1)', - string: 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = \'brian\')' - }, - mysql: { - text : 'SELECT `user`.`name` FROM `user` WHERE (`user`.`name` = ?)', - string: 'SELECT `user`.`name` FROM `user` WHERE (`user`.`name` = \'brian\')' - }, - mssql: { - text : 'SELECT [user].[name] FROM [user] WHERE ([user].[name] = @1)', - string: 'SELECT [user].[name] FROM [user] WHERE ([user].[name] = \'brian\')' - }, - oracle: { - text : 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = :1)', - string: 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = \'brian\')' - }, - params: ['brian'] -}); - -Harness.test({ - query: user.select('name').from('user').where('name <> NULL'), - pg: { - text : 'SELECT name FROM user WHERE (name <> NULL)', - string: 'SELECT name FROM user WHERE (name <> NULL)' - }, - sqlite: { - text : 'SELECT name FROM user WHERE (name <> NULL)', - string: 'SELECT name FROM user WHERE (name <> NULL)' - }, - mysql: { - text : 'SELECT name FROM user WHERE (name <> NULL)', - string: 'SELECT name FROM user WHERE (name <> NULL)' - }, - mssql: { - text : 'SELECT name FROM user WHERE (name <> NULL)', - string: 'SELECT name FROM user WHERE (name <> NULL)' - }, - oracle: { - text : 'SELECT name FROM user WHERE (name <> NULL)', - string: 'SELECT name FROM user WHERE (name <> NULL)' - }, - params: [] -}); - -Harness.test({ - query: user.select('name,id').from('user').where('name <> NULL'), - pg: { - text : 'SELECT name,id FROM user WHERE (name <> NULL)', - string: 'SELECT name,id FROM user WHERE (name <> NULL)' - }, - sqlite: { - text : 'SELECT name,id FROM user WHERE (name <> NULL)', - string: 'SELECT name,id FROM user WHERE (name <> NULL)' - }, - mysql: { - text : 'SELECT name,id FROM user WHERE (name <> NULL)', - string: 'SELECT name,id FROM user WHERE (name <> NULL)' - }, - mssql: { - text : 'SELECT name,id FROM user WHERE (name <> NULL)', - string: 'SELECT name,id FROM user WHERE (name <> NULL)' - }, - oracle: { - text : 'SELECT name,id FROM user WHERE (name <> NULL)', - string: 'SELECT name,id FROM user WHERE (name <> NULL)' - }, - params: [] -}); - -Harness.test({ - query: user.select('name', 'id').from('user').where('name <> NULL'), - pg: { - text : 'SELECT name, id FROM user WHERE (name <> NULL)', - string: 'SELECT name, id FROM user WHERE (name <> NULL)' - }, - sqlite: { - text : 'SELECT name, id FROM user WHERE (name <> NULL)', - string: 'SELECT name, id FROM user WHERE (name <> NULL)' - }, - mysql: { - text : 'SELECT name, id FROM user WHERE (name <> NULL)', - string: 'SELECT name, id FROM user WHERE (name <> NULL)' - }, - mssql: { - text : 'SELECT name, id FROM user WHERE (name <> NULL)', - string: 'SELECT name, id FROM user WHERE (name <> NULL)' - }, - oracle: { - text : 'SELECT name, id FROM user WHERE (name <> NULL)', - string: 'SELECT name, id FROM user WHERE (name <> NULL)' - }, - params: [] -}); - -Harness.test({ - query: user.select('name', 'id').from('user').where('name <> NULL').and('id <> NULL'), - pg: { - text : 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', - string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' - }, - sqlite: { - text : 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', - string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' - }, - mysql: { - text : 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', - string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' - }, - mssql: { - text : 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', - string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' - }, - oracle: { - text : 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', - string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' - }, - params: [] -}); - -Harness.test({ - query: user.select('name').from('user').where({ - name: 'brian' - }), - pg: { - text : 'SELECT name FROM user WHERE ("user"."name" = $1)', - string: 'SELECT name FROM user WHERE ("user"."name" = \'brian\')' - }, - sqlite: { - text : 'SELECT name FROM user WHERE ("user"."name" = $1)', - string: 'SELECT name FROM user WHERE ("user"."name" = \'brian\')' - }, - mysql: { - text : 'SELECT name FROM user WHERE (`user`.`name` = ?)', - string: 'SELECT name FROM user WHERE (`user`.`name` = \'brian\')' - }, - mssql: { - text : 'SELECT name FROM user WHERE ([user].[name] = @1)', - string: 'SELECT name FROM user WHERE ([user].[name] = \'brian\')' - }, - oracle: { - text : 'SELECT name FROM user WHERE ("user"."name" = :1)', - string: 'SELECT name FROM user WHERE ("user"."name" = \'brian\')' - }, - params: ['brian'] -}); - -Harness.test({ - query: user.select('name').from('user').where({ - name: 'brian', - id: 1 - }), - pg: { - text : 'SELECT name FROM user WHERE (("user"."name" = $1) AND ("user"."id" = $2))', - string: 'SELECT name FROM user WHERE (("user"."name" = \'brian\') AND ("user"."id" = 1))' - }, - sqlite: { - text : 'SELECT name FROM user WHERE (("user"."name" = $1) AND ("user"."id" = $2))', - string: 'SELECT name FROM user WHERE (("user"."name" = \'brian\') AND ("user"."id" = 1))' - }, - mysql: { - text : 'SELECT name FROM user WHERE ((`user`.`name` = ?) AND (`user`.`id` = ?))', - string: 'SELECT name FROM user WHERE ((`user`.`name` = \'brian\') AND (`user`.`id` = 1))' - }, - mssql: { - text : 'SELECT name FROM user WHERE (([user].[name] = @1) AND ([user].[id] = @2))', - string: 'SELECT name FROM user WHERE (([user].[name] = \'brian\') AND ([user].[id] = 1))' - }, - oracle: { - text : 'SELECT name FROM user WHERE (("user"."name" = :1) AND ("user"."id" = :2))', - string: 'SELECT name FROM user WHERE (("user"."name" = \'brian\') AND ("user"."id" = 1))' - }, - params: ['brian', 1] -}); - -Harness.test({ - query: user.select(user.name.as('quote"quote"tick`tick`')), - pg: { - text : 'SELECT "user"."name" AS "quote""quote""tick`tick`" FROM "user"', - string: 'SELECT "user"."name" AS "quote""quote""tick`tick`" FROM "user"' - }, - sqlite: { - text : 'SELECT "user"."name" AS "quote""quote""tick`tick`" FROM "user"', - string: 'SELECT "user"."name" AS "quote""quote""tick`tick`" FROM "user"' - }, - mysql: { - text : 'SELECT `user`.`name` AS `quote"quote"tick``tick``` FROM `user`', - string: 'SELECT `user`.`name` AS `quote"quote"tick``tick``` FROM `user`' - }, - mssql: { - text : 'SELECT [user].[name] AS [quote"quote"tick`tick`] FROM [user]', - string: 'SELECT [user].[name] AS [quote"quote"tick`tick`] FROM [user]' - }, - oracle: { - text : 'SELECT "user"."name" "quote""quote""tick`tick`" FROM "user"', - string: 'SELECT "user"."name" "quote""quote""tick`tick`" FROM "user"' - }, - params: [] -}); - -Harness.test({ - query: user.select(user.star()).where(user.id.in(user.subQuery().select(user.id))), - pg: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))', - string: 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))', - string: 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` WHERE (`user`.`id` IN (SELECT `user`.`id` FROM `user`))', - string: 'SELECT `user`.* FROM `user` WHERE (`user`.`id` IN (SELECT `user`.`id` FROM `user`))' - }, - mssql: { - text : 'SELECT [user].* FROM [user] WHERE ([user].[id] IN (SELECT [user].[id] FROM [user]))', - string: 'SELECT [user].* FROM [user] WHERE ([user].[id] IN (SELECT [user].[id] FROM [user]))' - }, - oracle: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))', - string: 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))' - }, - params: [] -}); diff --git a/test/dialects/table-tests.ts b/test/dialects/table-tests.ts new file mode 100644 index 00000000..d6862cb0 --- /dev/null +++ b/test/dialects/table-tests.ts @@ -0,0 +1,741 @@ +'use strict'; + +import * as Harness from './support'; +const user = Harness.defineUserTable(); + +Harness.test({ + query: user.select(user.id).from(user), + pg: { + text: 'SELECT "user"."id" FROM "user"', + string: 'SELECT "user"."id" FROM "user"' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user"', + string: 'SELECT "user"."id" FROM "user"' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user`', + string: 'SELECT `user`.`id` FROM `user`' + }, + mssql: { + text: 'SELECT [user].[id] FROM [user]', + string: 'SELECT [user].[id] FROM [user]' + }, + oracle: { + text: 'SELECT "user"."id" FROM "user"', + string: 'SELECT "user"."id" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.id, user.name).from(user), + pg: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + sqlite: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + mysql: { + text: 'SELECT `user`.`id`, `user`.`name` FROM `user`', + string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' + }, + mssql: { + text: 'SELECT [user].[id], [user].[name] FROM [user]', + string: 'SELECT [user].[id], [user].[name] FROM [user]' + }, + oracle: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.star()).from(user), + pg: { + text: 'SELECT "user".* FROM "user"', + string: 'SELECT "user".* FROM "user"' + }, + sqlite: { + text: 'SELECT "user".* FROM "user"', + string: 'SELECT "user".* FROM "user"' + }, + mysql: { + text: 'SELECT `user`.* FROM `user`', + string: 'SELECT `user`.* FROM `user`' + }, + mssql: { + text: 'SELECT [user].* FROM [user]', + string: 'SELECT [user].* FROM [user]' + }, + oracle: { + text: 'SELECT "user".* FROM "user"', + string: 'SELECT "user".* FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.id, [user.name]).from(user), + pg: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + sqlite: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + mysql: { + text: 'SELECT `user`.`id`, `user`.`name` FROM `user`', + string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' + }, + oracle: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select([user.id], user.name).from(user), + pg: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + sqlite: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + mysql: { + text: 'SELECT `user`.`id`, `user`.`name` FROM `user`', + string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' + }, + oracle: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select([user.id, user.name]).from(user), + pg: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + sqlite: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + mysql: { + text: 'SELECT `user`.`id`, `user`.`name` FROM `user`', + string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' + }, + oracle: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.star(), user.star({ prefix: 'foo_' }), user.star({ prefix: 'bar_' })).from(user), + pg: { + text: + 'SELECT "user".*, "user"."id" AS "foo_id", "user"."name" AS "foo_name", "user"."id" AS "bar_id", "user"."name" AS "bar_name" FROM "user"', + string: + 'SELECT "user".*, "user"."id" AS "foo_id", "user"."name" AS "foo_name", "user"."id" AS "bar_id", "user"."name" AS "bar_name" FROM "user"' + }, + sqlite: { + text: + 'SELECT "user".*, "user"."id" AS "foo_id", "user"."name" AS "foo_name", "user"."id" AS "bar_id", "user"."name" AS "bar_name" FROM "user"', + string: + 'SELECT "user".*, "user"."id" AS "foo_id", "user"."name" AS "foo_name", "user"."id" AS "bar_id", "user"."name" AS "bar_name" FROM "user"' + }, + mysql: { + text: + 'SELECT `user`.*, `user`.`id` AS `foo_id`, `user`.`name` AS `foo_name`, `user`.`id` AS `bar_id`, `user`.`name` AS `bar_name` FROM `user`', + string: + 'SELECT `user`.*, `user`.`id` AS `foo_id`, `user`.`name` AS `foo_name`, `user`.`id` AS `bar_id`, `user`.`name` AS `bar_name` FROM `user`' + }, + oracle: { + text: 'SELECT "user".*, "user"."id" "foo_id", "user"."name" "foo_name", "user"."id" "bar_id", "user"."name" "bar_name" FROM "user"', + string: + 'SELECT "user".*, "user"."id" "foo_id", "user"."name" "foo_name", "user"."id" "bar_id", "user"."name" "bar_name" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user + .select(user.id) + .from(user) + .where(user.name.equals('foo')), + pg: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'foo\')' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'foo\')' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = ?)', + string: "SELECT `user`.`id` FROM `user` WHERE (`user`.`name` = 'foo')" + }, + mssql: { + text: 'SELECT [user].[id] FROM [user] WHERE ([user].[name] = @1)', + string: "SELECT [user].[id] FROM [user] WHERE ([user].[name] = 'foo')" + }, + oracle: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = :1)', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" = \'foo\')' + }, + params: ['foo'] +}); + +Harness.test({ + query: user + .select(user.id) + .from(user) + .where(user.name.equals('foo').or(user.name.equals('bar'))), + pg: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) OR ("user"."name" = $2))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) OR ("user"."name" = $2))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = ?) OR (`user`.`name` = ?))', + string: "SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = 'foo') OR (`user`.`name` = 'bar'))" + }, + mssql: { + text: 'SELECT [user].[id] FROM [user] WHERE (([user].[name] = @1) OR ([user].[name] = @2))', + string: "SELECT [user].[id] FROM [user] WHERE (([user].[name] = 'foo') OR ([user].[name] = 'bar'))" + }, + oracle: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = :1) OR ("user"."name" = :2))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' + }, + params: ['foo', 'bar'] +}); + +Harness.test({ + query: user + .select(user.id) + .from(user) + .where(user.name.equals('foo').and(user.name.equals('bar'))), + pg: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) AND ("user"."name" = $2))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') AND ("user"."name" = \'bar\'))' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) AND ("user"."name" = $2))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') AND ("user"."name" = \'bar\'))' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = ?) AND (`user`.`name` = ?))', + string: "SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = 'foo') AND (`user`.`name` = 'bar'))" + }, + mssql: { + text: 'SELECT [user].[id] FROM [user] WHERE (([user].[name] = @1) AND ([user].[name] = @2))', + string: "SELECT [user].[id] FROM [user] WHERE (([user].[name] = 'foo') AND ([user].[name] = 'bar'))" + }, + oracle: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = :1) AND ("user"."name" = :2))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') AND ("user"."name" = \'bar\'))' + }, + params: ['foo', 'bar'] +}); + +Harness.test({ + query: user + .select(user.id) + .from(user) + .where(user.name.equals('foo')) + .or(user.name.equals('bar')), + pg: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) OR ("user"."name" = $2))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = $1) OR ("user"."name" = $2))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = ?) OR (`user`.`name` = ?))', + string: "SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` = 'foo') OR (`user`.`name` = 'bar'))" + }, + mssql: { + text: 'SELECT [user].[id] FROM [user] WHERE (([user].[name] = @1) OR ([user].[name] = @2))', + string: "SELECT [user].[id] FROM [user] WHERE (([user].[name] = 'foo') OR ([user].[name] = 'bar'))" + }, + oracle: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = :1) OR ("user"."name" = :2))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" = \'foo\') OR ("user"."name" = \'bar\'))' + }, + params: ['foo', 'bar'] +}); + +Harness.test({ + query: user + .select(user.id) + .from(user) + .where(user.name.equals('foo')) + .or(user.name.equals('baz')) + .and(user.name.equals('bar')), + pg: { + text: 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) OR ("user"."name" = $2)) AND ("user"."name" = $3))', + string: + 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'foo\') OR ("user"."name" = \'baz\')) AND ("user"."name" = \'bar\'))' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) OR ("user"."name" = $2)) AND ("user"."name" = $3))', + string: + 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'foo\') OR ("user"."name" = \'baz\')) AND ("user"."name" = \'bar\'))' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user` WHERE (((`user`.`name` = ?) OR (`user`.`name` = ?)) AND (`user`.`name` = ?))', + string: "SELECT `user`.`id` FROM `user` WHERE (((`user`.`name` = 'foo') OR (`user`.`name` = 'baz')) AND (`user`.`name` = 'bar'))" + }, + mssql: { + text: 'SELECT [user].[id] FROM [user] WHERE ((([user].[name] = @1) OR ([user].[name] = @2)) AND ([user].[name] = @3))', + string: "SELECT [user].[id] FROM [user] WHERE ((([user].[name] = 'foo') OR ([user].[name] = 'baz')) AND ([user].[name] = 'bar'))" + }, + oracle: { + text: 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = :1) OR ("user"."name" = :2)) AND ("user"."name" = :3))', + string: + 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'foo\') OR ("user"."name" = \'baz\')) AND ("user"."name" = \'bar\'))' + }, + params: ['foo', 'baz', 'bar'] +}); + +Harness.test({ + query: user + .select(user.id) + .from(user) + .where(user.name.in(['foo', 'bar'])), + pg: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN ($1, $2))', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN (\'foo\', \'bar\'))' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN ($1, $2))', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN (\'foo\', \'bar\'))' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user` WHERE (`user`.`name` IN (?, ?))', + string: "SELECT `user`.`id` FROM `user` WHERE (`user`.`name` IN ('foo', 'bar'))" + }, + mssql: { + text: 'SELECT [user].[id] FROM [user] WHERE ([user].[name] IN (@1, @2))', + string: "SELECT [user].[id] FROM [user] WHERE ([user].[name] IN ('foo', 'bar'))" + }, + oracle: { + text: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN (:1, :2))', + string: 'SELECT "user"."id" FROM "user" WHERE ("user"."name" IN (\'foo\', \'bar\'))' + }, + params: ['foo', 'bar'] +}); + +Harness.test({ + query: user + .select(user.id) + .from(user) + .where(user.name.in(['foo', 'bar']).and(user.id.equals(1))), + pg: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN ($1, $2)) AND ("user"."id" = $3))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN (\'foo\', \'bar\')) AND ("user"."id" = 1))' + }, + sqlite: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN ($1, $2)) AND ("user"."id" = $3))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN (\'foo\', \'bar\')) AND ("user"."id" = 1))' + }, + mysql: { + text: 'SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` IN (?, ?)) AND (`user`.`id` = ?))', + string: "SELECT `user`.`id` FROM `user` WHERE ((`user`.`name` IN ('foo', 'bar')) AND (`user`.`id` = 1))" + }, + mssql: { + text: 'SELECT [user].[id] FROM [user] WHERE (([user].[name] IN (@1, @2)) AND ([user].[id] = @3))', + string: "SELECT [user].[id] FROM [user] WHERE (([user].[name] IN ('foo', 'bar')) AND ([user].[id] = 1))" + }, + oracle: { + text: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN (:1, :2)) AND ("user"."id" = :3))', + string: 'SELECT "user"."id" FROM "user" WHERE (("user"."name" IN (\'foo\', \'bar\')) AND ("user"."id" = 1))' + }, + params: ['foo', 'bar', 1] +}); + +Harness.test({ + query: user.select(user.columns), + pg: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + sqlite: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + mysql: { + text: 'SELECT `user`.`id`, `user`.`name` FROM `user`', + string: 'SELECT `user`.`id`, `user`.`name` FROM `user`' + }, + mssql: { + text: 'SELECT [user].[id], [user].[name] FROM [user]', + string: 'SELECT [user].[id], [user].[name] FROM [user]' + }, + oracle: { + text: 'SELECT "user"."id", "user"."name" FROM "user"', + string: 'SELECT "user"."id", "user"."name" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user + .select(user.id) + .from(user) + .where(user.name.equals('boom').and(user.id.equals(1))) + .or(user.name.equals('bang').and(user.id.equals(2))), + pg: { + text: + 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) AND ("user"."id" = $2)) OR (("user"."name" = $3) AND ("user"."id" = $4)))', + string: + 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'boom\') AND ("user"."id" = 1)) OR (("user"."name" = \'bang\') AND ("user"."id" = 2)))' + }, + sqlite: { + text: + 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) AND ("user"."id" = $2)) OR (("user"."name" = $3) AND ("user"."id" = $4)))', + string: + 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'boom\') AND ("user"."id" = 1)) OR (("user"."name" = \'bang\') AND ("user"."id" = 2)))' + }, + mysql: { + text: + 'SELECT `user`.`id` FROM `user` WHERE (((`user`.`name` = ?) AND (`user`.`id` = ?)) OR ((`user`.`name` = ?) AND (`user`.`id` = ?)))', + string: + "SELECT `user`.`id` FROM `user` WHERE (((`user`.`name` = 'boom') AND (`user`.`id` = 1)) OR ((`user`.`name` = 'bang') AND (`user`.`id` = 2)))" + }, + mssql: { + text: + 'SELECT [user].[id] FROM [user] WHERE ((([user].[name] = @1) AND ([user].[id] = @2)) OR (([user].[name] = @3) AND ([user].[id] = @4)))', + string: + "SELECT [user].[id] FROM [user] WHERE ((([user].[name] = 'boom') AND ([user].[id] = 1)) OR (([user].[name] = 'bang') AND ([user].[id] = 2)))" + }, + oracle: { + text: + 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = :1) AND ("user"."id" = :2)) OR (("user"."name" = :3) AND ("user"."id" = :4)))', + string: + 'SELECT "user"."id" FROM "user" WHERE ((("user"."name" = \'boom\') AND ("user"."id" = 1)) OR (("user"."name" = \'bang\') AND ("user"."id" = 2)))' + }, + params: ['boom', 1, 'bang', 2] +}); + +Harness.test({ + query: user.select(user.name.as('user name'), user.id.as('user id')).from(user), + pg: { + text: 'SELECT "user"."name" AS "user name", "user"."id" AS "user id" FROM "user"', + string: 'SELECT "user"."name" AS "user name", "user"."id" AS "user id" FROM "user"' + }, + sqlite: { + text: 'SELECT "user"."name" AS "user name", "user"."id" AS "user id" FROM "user"', + string: 'SELECT "user"."name" AS "user name", "user"."id" AS "user id" FROM "user"' + }, + mysql: { + text: 'SELECT `user`.`name` AS `user name`, `user`.`id` AS `user id` FROM `user`', + string: 'SELECT `user`.`name` AS `user name`, `user`.`id` AS `user id` FROM `user`' + }, + mssql: { + text: 'SELECT [user].[name] AS [user name], [user].[id] AS [user id] FROM [user]', + string: 'SELECT [user].[name] AS [user name], [user].[id] AS [user id] FROM [user]' + }, + oracle: { + text: 'SELECT "user"."name" "user name", "user"."id" "user id" FROM "user"', + string: 'SELECT "user"."name" "user name", "user"."id" "user id" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user + .select(user.name.as('user name')) + .from(user) + .where(user.name.equals('brian')), + pg: { + text: 'SELECT "user"."name" AS "user name" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."name" AS "user name" FROM "user" WHERE ("user"."name" = \'brian\')' + }, + sqlite: { + text: 'SELECT "user"."name" AS "user name" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."name" AS "user name" FROM "user" WHERE ("user"."name" = \'brian\')' + }, + mysql: { + text: 'SELECT `user`.`name` AS `user name` FROM `user` WHERE (`user`.`name` = ?)', + string: "SELECT `user`.`name` AS `user name` FROM `user` WHERE (`user`.`name` = 'brian')" + }, + mssql: { + text: 'SELECT [user].[name] AS [user name] FROM [user] WHERE ([user].[name] = @1)', + string: "SELECT [user].[name] AS [user name] FROM [user] WHERE ([user].[name] = 'brian')" + }, + oracle: { + text: 'SELECT "user"."name" "user name" FROM "user" WHERE ("user"."name" = :1)', + string: 'SELECT "user"."name" "user name" FROM "user" WHERE ("user"."name" = \'brian\')' + }, + params: ['brian'] +}); + +Harness.test({ + query: user + .select(user.name) + .from(user) + .where(user.name.equals('brian')), + pg: { + text: 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = \'brian\')' + }, + sqlite: { + text: 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = $1)', + string: 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = \'brian\')' + }, + mysql: { + text: 'SELECT `user`.`name` FROM `user` WHERE (`user`.`name` = ?)', + string: "SELECT `user`.`name` FROM `user` WHERE (`user`.`name` = 'brian')" + }, + mssql: { + text: 'SELECT [user].[name] FROM [user] WHERE ([user].[name] = @1)', + string: "SELECT [user].[name] FROM [user] WHERE ([user].[name] = 'brian')" + }, + oracle: { + text: 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = :1)', + string: 'SELECT "user"."name" FROM "user" WHERE ("user"."name" = \'brian\')' + }, + params: ['brian'] +}); + +Harness.test({ + query: user + .select('name') + .from('user') + .where('name <> NULL'), + pg: { + text: 'SELECT name FROM user WHERE (name <> NULL)', + string: 'SELECT name FROM user WHERE (name <> NULL)' + }, + sqlite: { + text: 'SELECT name FROM user WHERE (name <> NULL)', + string: 'SELECT name FROM user WHERE (name <> NULL)' + }, + mysql: { + text: 'SELECT name FROM user WHERE (name <> NULL)', + string: 'SELECT name FROM user WHERE (name <> NULL)' + }, + mssql: { + text: 'SELECT name FROM user WHERE (name <> NULL)', + string: 'SELECT name FROM user WHERE (name <> NULL)' + }, + oracle: { + text: 'SELECT name FROM user WHERE (name <> NULL)', + string: 'SELECT name FROM user WHERE (name <> NULL)' + }, + params: [] +}); + +Harness.test({ + query: user + .select('name,id') + .from('user') + .where('name <> NULL'), + pg: { + text: 'SELECT name,id FROM user WHERE (name <> NULL)', + string: 'SELECT name,id FROM user WHERE (name <> NULL)' + }, + sqlite: { + text: 'SELECT name,id FROM user WHERE (name <> NULL)', + string: 'SELECT name,id FROM user WHERE (name <> NULL)' + }, + mysql: { + text: 'SELECT name,id FROM user WHERE (name <> NULL)', + string: 'SELECT name,id FROM user WHERE (name <> NULL)' + }, + mssql: { + text: 'SELECT name,id FROM user WHERE (name <> NULL)', + string: 'SELECT name,id FROM user WHERE (name <> NULL)' + }, + oracle: { + text: 'SELECT name,id FROM user WHERE (name <> NULL)', + string: 'SELECT name,id FROM user WHERE (name <> NULL)' + }, + params: [] +}); + +Harness.test({ + query: user + .select('name', 'id') + .from('user') + .where('name <> NULL'), + pg: { + text: 'SELECT name, id FROM user WHERE (name <> NULL)', + string: 'SELECT name, id FROM user WHERE (name <> NULL)' + }, + sqlite: { + text: 'SELECT name, id FROM user WHERE (name <> NULL)', + string: 'SELECT name, id FROM user WHERE (name <> NULL)' + }, + mysql: { + text: 'SELECT name, id FROM user WHERE (name <> NULL)', + string: 'SELECT name, id FROM user WHERE (name <> NULL)' + }, + mssql: { + text: 'SELECT name, id FROM user WHERE (name <> NULL)', + string: 'SELECT name, id FROM user WHERE (name <> NULL)' + }, + oracle: { + text: 'SELECT name, id FROM user WHERE (name <> NULL)', + string: 'SELECT name, id FROM user WHERE (name <> NULL)' + }, + params: [] +}); + +Harness.test({ + query: user + .select('name', 'id') + .from('user') + .where('name <> NULL') + .and('id <> NULL'), + pg: { + text: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', + string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' + }, + sqlite: { + text: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', + string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' + }, + mysql: { + text: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', + string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' + }, + mssql: { + text: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', + string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' + }, + oracle: { + text: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))', + string: 'SELECT name, id FROM user WHERE ((name <> NULL) AND (id <> NULL))' + }, + params: [] +}); + +Harness.test({ + query: user + .select('name') + .from('user') + .where({ + name: 'brian' + }), + pg: { + text: 'SELECT name FROM user WHERE ("user"."name" = $1)', + string: 'SELECT name FROM user WHERE ("user"."name" = \'brian\')' + }, + sqlite: { + text: 'SELECT name FROM user WHERE ("user"."name" = $1)', + string: 'SELECT name FROM user WHERE ("user"."name" = \'brian\')' + }, + mysql: { + text: 'SELECT name FROM user WHERE (`user`.`name` = ?)', + string: "SELECT name FROM user WHERE (`user`.`name` = 'brian')" + }, + mssql: { + text: 'SELECT name FROM user WHERE ([user].[name] = @1)', + string: "SELECT name FROM user WHERE ([user].[name] = 'brian')" + }, + oracle: { + text: 'SELECT name FROM user WHERE ("user"."name" = :1)', + string: 'SELECT name FROM user WHERE ("user"."name" = \'brian\')' + }, + params: ['brian'] +}); + +Harness.test({ + query: user + .select('name') + .from('user') + .where({ + name: 'brian', + id: 1 + }), + pg: { + text: 'SELECT name FROM user WHERE (("user"."name" = $1) AND ("user"."id" = $2))', + string: 'SELECT name FROM user WHERE (("user"."name" = \'brian\') AND ("user"."id" = 1))' + }, + sqlite: { + text: 'SELECT name FROM user WHERE (("user"."name" = $1) AND ("user"."id" = $2))', + string: 'SELECT name FROM user WHERE (("user"."name" = \'brian\') AND ("user"."id" = 1))' + }, + mysql: { + text: 'SELECT name FROM user WHERE ((`user`.`name` = ?) AND (`user`.`id` = ?))', + string: "SELECT name FROM user WHERE ((`user`.`name` = 'brian') AND (`user`.`id` = 1))" + }, + mssql: { + text: 'SELECT name FROM user WHERE (([user].[name] = @1) AND ([user].[id] = @2))', + string: "SELECT name FROM user WHERE (([user].[name] = 'brian') AND ([user].[id] = 1))" + }, + oracle: { + text: 'SELECT name FROM user WHERE (("user"."name" = :1) AND ("user"."id" = :2))', + string: 'SELECT name FROM user WHERE (("user"."name" = \'brian\') AND ("user"."id" = 1))' + }, + params: ['brian', 1] +}); + +Harness.test({ + query: user.select(user.name.as('quote"quote"tick`tick`')), + pg: { + text: 'SELECT "user"."name" AS "quote""quote""tick`tick`" FROM "user"', + string: 'SELECT "user"."name" AS "quote""quote""tick`tick`" FROM "user"' + }, + sqlite: { + text: 'SELECT "user"."name" AS "quote""quote""tick`tick`" FROM "user"', + string: 'SELECT "user"."name" AS "quote""quote""tick`tick`" FROM "user"' + }, + mysql: { + text: 'SELECT `user`.`name` AS `quote"quote"tick``tick``` FROM `user`', + string: 'SELECT `user`.`name` AS `quote"quote"tick``tick``` FROM `user`' + }, + mssql: { + text: 'SELECT [user].[name] AS [quote"quote"tick`tick`] FROM [user]', + string: 'SELECT [user].[name] AS [quote"quote"tick`tick`] FROM [user]' + }, + oracle: { + text: 'SELECT "user"."name" "quote""quote""tick`tick`" FROM "user"', + string: 'SELECT "user"."name" "quote""quote""tick`tick`" FROM "user"' + }, + params: [] +}); + +Harness.test({ + query: user.select(user.star()).where(user.id.in(user.subQuery().select(user.id))), + pg: { + text: 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))', + string: 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))', + string: 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` WHERE (`user`.`id` IN (SELECT `user`.`id` FROM `user`))', + string: 'SELECT `user`.* FROM `user` WHERE (`user`.`id` IN (SELECT `user`.`id` FROM `user`))' + }, + mssql: { + text: 'SELECT [user].* FROM [user] WHERE ([user].[id] IN (SELECT [user].[id] FROM [user]))', + string: 'SELECT [user].* FROM [user] WHERE ([user].[id] IN (SELECT [user].[id] FROM [user]))' + }, + oracle: { + text: 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))', + string: 'SELECT "user".* FROM "user" WHERE ("user"."id" IN (SELECT "user"."id" FROM "user"))' + }, + params: [] +}); diff --git a/test/dialects/ternary-clause-tests.js b/test/dialects/ternary-clause-tests.js deleted file mode 100644 index 04832fbc..00000000 --- a/test/dialects/ternary-clause-tests.js +++ /dev/null @@ -1,55 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var post = Harness.definePostTable(); - -Harness.test({ - query: customer.select().where(customer.age.between(18, 25)), - pg: { - text : 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN $1 AND $2)', - string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN 18 AND 25)' - }, - sqlite: { - text : 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN $1 AND $2)', - string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN 18 AND 25)' - }, - mysql: { - text : 'SELECT `customer`.* FROM `customer` WHERE (`customer`.`age` BETWEEN ? AND ?)', - string: 'SELECT `customer`.* FROM `customer` WHERE (`customer`.`age` BETWEEN 18 AND 25)' - }, - mssql: { - text : 'SELECT [customer].* FROM [customer] WHERE ([customer].[age] BETWEEN @1 AND @2)', - string: 'SELECT [customer].* FROM [customer] WHERE ([customer].[age] BETWEEN 18 AND 25)' - }, - oracle: { - text : 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN :1 AND :2)', - string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN 18 AND 25)' - }, - params: [18, 25] -}); - -Harness.test({ - query: post.select().where(post.userId.between(customer.subQuery().select(customer.id.min()), customer.subQuery().select(customer.id.max()))), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`userId` BETWEEN (SELECT MIN(`customer`.`id`) AS `id_min` FROM `customer`) AND (SELECT MAX(`customer`.`id`) AS `id_max` FROM `customer`))', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`userId` BETWEEN (SELECT MIN(`customer`.`id`) AS `id_min` FROM `customer`) AND (SELECT MAX(`customer`.`id`) AS `id_max` FROM `customer`))' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[userId] BETWEEN (SELECT MIN([customer].[id]) AS [id_min] FROM [customer]) AND (SELECT MAX([customer].[id]) AS [id_max] FROM [customer]))', - string: 'SELECT [post].* FROM [post] WHERE ([post].[userId] BETWEEN (SELECT MIN([customer].[id]) AS [id_min] FROM [customer]) AND (SELECT MAX([customer].[id]) AS [id_max] FROM [customer]))' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") "id_min" FROM "customer") AND (SELECT MAX("customer"."id") "id_max" FROM "customer"))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") "id_min" FROM "customer") AND (SELECT MAX("customer"."id") "id_max" FROM "customer"))' - }, - params: [] -}); diff --git a/test/dialects/ternary-clause-tests.ts b/test/dialects/ternary-clause-tests.ts new file mode 100644 index 00000000..89b529da --- /dev/null +++ b/test/dialects/ternary-clause-tests.ts @@ -0,0 +1,67 @@ +'use strict'; + +import * as Harness from './support'; +const customer = Harness.defineCustomerTable(); +const post = Harness.definePostTable(); + +Harness.test({ + query: customer.select().where(customer.age.between(18, 25)), + pg: { + text: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN $1 AND $2)', + string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN 18 AND 25)' + }, + sqlite: { + text: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN $1 AND $2)', + string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN 18 AND 25)' + }, + mysql: { + text: 'SELECT `customer`.* FROM `customer` WHERE (`customer`.`age` BETWEEN ? AND ?)', + string: 'SELECT `customer`.* FROM `customer` WHERE (`customer`.`age` BETWEEN 18 AND 25)' + }, + mssql: { + text: 'SELECT [customer].* FROM [customer] WHERE ([customer].[age] BETWEEN @1 AND @2)', + string: 'SELECT [customer].* FROM [customer] WHERE ([customer].[age] BETWEEN 18 AND 25)' + }, + oracle: { + text: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN :1 AND :2)', + string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" BETWEEN 18 AND 25)' + }, + params: [18, 25] +}); + +Harness.test({ + query: post + .select() + .where(post.userId.between(customer.subQuery().select(customer.id.min()), customer.subQuery().select(customer.id.max()))), + pg: { + text: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))', + string: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))' + }, + sqlite: { + text: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))', + string: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") AS "id_min" FROM "customer") AND (SELECT MAX("customer"."id") AS "id_max" FROM "customer"))' + }, + mysql: { + text: + 'SELECT `post`.* FROM `post` WHERE (`post`.`userId` BETWEEN (SELECT MIN(`customer`.`id`) AS `id_min` FROM `customer`) AND (SELECT MAX(`customer`.`id`) AS `id_max` FROM `customer`))', + string: + 'SELECT `post`.* FROM `post` WHERE (`post`.`userId` BETWEEN (SELECT MIN(`customer`.`id`) AS `id_min` FROM `customer`) AND (SELECT MAX(`customer`.`id`) AS `id_max` FROM `customer`))' + }, + mssql: { + text: + 'SELECT [post].* FROM [post] WHERE ([post].[userId] BETWEEN (SELECT MIN([customer].[id]) AS [id_min] FROM [customer]) AND (SELECT MAX([customer].[id]) AS [id_max] FROM [customer]))', + string: + 'SELECT [post].* FROM [post] WHERE ([post].[userId] BETWEEN (SELECT MIN([customer].[id]) AS [id_min] FROM [customer]) AND (SELECT MAX([customer].[id]) AS [id_max] FROM [customer]))' + }, + oracle: { + text: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") "id_min" FROM "customer") AND (SELECT MAX("customer"."id") "id_max" FROM "customer"))', + string: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" BETWEEN (SELECT MIN("customer"."id") "id_min" FROM "customer") AND (SELECT MAX("customer"."id") "id_max" FROM "customer"))' + }, + params: [] +}); diff --git a/test/dialects/tostring-tests.js b/test/dialects/tostring-tests.js deleted file mode 100644 index 53d413e8..00000000 --- a/test/dialects/tostring-tests.js +++ /dev/null @@ -1,202 +0,0 @@ -'use strict'; - -var assert = require('assert'); -var Harness = require('./support'); -var post = Harness.definePostTable(); - -// Null -Harness.test({ - query: post.content.equals(null), - pg: { - text : '("post"."content" = $1)', - string: '("post"."content" = NULL)' - }, - sqlite: { - text : '("post"."content" = $1)', - string: '("post"."content" = NULL)' - }, - mysql: { - text : '(`post`.`content` = ?)', - string: '(`post`.`content` = NULL)' - }, - mssql: { - text : '([post].[content] = @1)', - string: '([post].[content] = NULL)' - }, - oracle: { - text : '("post"."content" = :1)', - string: '("post"."content" = NULL)' - }, - params: [null] -}); - -// Number -Harness.test({ - query: post.content.equals(3.14), - pg: { - text : '("post"."content" = $1)', - string: '("post"."content" = 3.14)' - }, - sqlite: { - text : '("post"."content" = $1)', - string: '("post"."content" = 3.14)' - }, - mysql: { - text : '(`post`.`content` = ?)', - string: '(`post`.`content` = 3.14)' - }, - mssql: { - text : '([post].[content] = @1)', - string: '([post].[content] = 3.14)' - }, - oracle: { - text : '("post"."content" = :1)', - string: '("post"."content" = 3.14)' - }, - params: [3.14] -}); - -// String -Harness.test({ - query: post.content.equals('hello\''), - pg: { - text : '("post"."content" = $1)', - string: '("post"."content" = \'hello\'\'\')' - }, - sqlite: { - text : '("post"."content" = $1)', - string: '("post"."content" = \'hello\'\'\')' - }, - mysql: { - text : '(`post`.`content` = ?)', - string: '(`post`.`content` = \'hello\'\'\')' - }, - mssql: { - text : '([post].[content] = @1)', - string: '([post].[content] = \'hello\'\'\')' - }, - oracle: { - text : '("post"."content" = :1)', - string: '("post"."content" = \'hello\'\'\')' - }, - params: ['hello\''] -}); - -// Array -Harness.test({ - query: post.content.equals([1, '2', null]), - pg: { - text : '("post"."content" = ($1, $2, $3))', - string: '("post"."content" = (1, \'2\', NULL))' - }, - sqlite: { - text : '("post"."content" = ($1, $2, $3))', - string: '("post"."content" = (1, \'2\', NULL))' - }, - mysql: { - text : '(`post`.`content` = (?, ?, ?))', - string: '(`post`.`content` = (1, \'2\', NULL))' - }, - mssql: { - text : 'SQL Server does not support arrays.', - throws: true - }, - oracle: { - text : 'SQL Server does not support arrays.', - throws: true - }, - params: [1, '2', null] -}); - -// Date -Harness.test({ - query: post.content.equals(new Date('Sat, 01 Jan 2000 00:00:00 GMT')), - pg: { - text : '("post"."content" = $1)', - string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' - }, - sqlite: { - text : '("post"."content" = $1)', - string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' - }, - mysql: { - text : '(`post`.`content` = ?)', - string: '(`post`.`content` = \'2000-01-01T00:00:00.000Z\')' - }, - mssql: { - text : '([post].[content] = @1)', - string: '([post].[content] = \'2000-01-01T00:00:00.000Z\')' - }, - oracle: { - text : '("post"."content" = :1)', - string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' - }, - params: [new Date('Sat, 01 Jan 2000 00:00:00 GMT')] -}); - -// Date to milliseconds -Harness.test({ - query: post.content.equals(new Date('Sat, 01 Jan 2000 00:00:00 GMT')), - pg: { - text : '("post"."content" = $1)', - string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' - }, - sqlite: { - text : '("post"."content" = $1)', - string: '("post"."content" = 946684800000)', - config: { - dateTimeMillis: true - } - }, - mysql: { - text : '(`post`.`content` = ?)', - string: '(`post`.`content` = \'2000-01-01T00:00:00.000Z\')' - }, - mssql: { - text : '([post].[content] = @1)', - string: '([post].[content] = \'2000-01-01T00:00:00.000Z\')' - }, - oracle: { - text : '("post"."content" = :1)', - string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' - }, - params: [new Date('Sat, 01 Jan 2000 00:00:00 GMT')] -}); - -// Object -var customObject = { - toString: function() { - return 'secretMessage'; - } -}; - -Harness.test({ - query: post.content.equals(customObject), - pg: { - text : '("post"."content" = $1)', - string: '("post"."content" = \'secretMessage\')' - }, - sqlite: { - text : '("post"."content" = $1)', - string: '("post"."content" = \'secretMessage\')' - }, - mysql: { - text : '(`post`.`content` = ?)', - string: '(`post`.`content` = \'secretMessage\')' - }, - mssql: { - text : '([post].[content] = @1)', - string: '([post].[content] = \'secretMessage\')' - }, - oracle: { - text : '("post"."content" = :1)', - string: '("post"."content" = \'secretMessage\')' - }, - params: [customObject] -}); - - -// Undefined -assert.throws(function() { - post.content.equals(undefined).toString(); -}); diff --git a/test/dialects/tostring-tests.ts b/test/dialects/tostring-tests.ts new file mode 100644 index 00000000..b16a053e --- /dev/null +++ b/test/dialects/tostring-tests.ts @@ -0,0 +1,201 @@ +'use strict'; + +import assert = require('assert'); +import * as Harness from './support'; +const post = Harness.definePostTable(); + +// Null +Harness.test({ + query: post.content.equals(null), + pg: { + text: '("post"."content" = $1)', + string: '("post"."content" = NULL)' + }, + sqlite: { + text: '("post"."content" = $1)', + string: '("post"."content" = NULL)' + }, + mysql: { + text: '(`post`.`content` = ?)', + string: '(`post`.`content` = NULL)' + }, + mssql: { + text: '([post].[content] = @1)', + string: '([post].[content] = NULL)' + }, + oracle: { + text: '("post"."content" = :1)', + string: '("post"."content" = NULL)' + }, + params: [null] +}); + +// Number +Harness.test({ + query: post.content.equals(3.14), + pg: { + text: '("post"."content" = $1)', + string: '("post"."content" = 3.14)' + }, + sqlite: { + text: '("post"."content" = $1)', + string: '("post"."content" = 3.14)' + }, + mysql: { + text: '(`post`.`content` = ?)', + string: '(`post`.`content` = 3.14)' + }, + mssql: { + text: '([post].[content] = @1)', + string: '([post].[content] = 3.14)' + }, + oracle: { + text: '("post"."content" = :1)', + string: '("post"."content" = 3.14)' + }, + params: [3.14] +}); + +// String +Harness.test({ + query: post.content.equals("hello'"), + pg: { + text: '("post"."content" = $1)', + string: '("post"."content" = \'hello\'\'\')' + }, + sqlite: { + text: '("post"."content" = $1)', + string: '("post"."content" = \'hello\'\'\')' + }, + mysql: { + text: '(`post`.`content` = ?)', + string: "(`post`.`content` = 'hello''')" + }, + mssql: { + text: '([post].[content] = @1)', + string: "([post].[content] = 'hello''')" + }, + oracle: { + text: '("post"."content" = :1)', + string: '("post"."content" = \'hello\'\'\')' + }, + params: ["hello'"] +}); + +// Array +Harness.test({ + query: post.content.equals([1, '2', null]), + pg: { + text: '("post"."content" = ($1, $2, $3))', + string: '("post"."content" = (1, \'2\', NULL))' + }, + sqlite: { + text: '("post"."content" = ($1, $2, $3))', + string: '("post"."content" = (1, \'2\', NULL))' + }, + mysql: { + text: '(`post`.`content` = (?, ?, ?))', + string: "(`post`.`content` = (1, '2', NULL))" + }, + mssql: { + text: 'SQL Server does not support arrays.', + throws: true + }, + oracle: { + text: 'SQL Server does not support arrays.', + throws: true + }, + params: [1, '2', null] +}); + +// Date +Harness.test({ + query: post.content.equals(new Date('Sat, 01 Jan 2000 00:00:00 GMT')), + pg: { + text: '("post"."content" = $1)', + string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' + }, + sqlite: { + text: '("post"."content" = $1)', + string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' + }, + mysql: { + text: '(`post`.`content` = ?)', + string: "(`post`.`content` = '2000-01-01T00:00:00.000Z')" + }, + mssql: { + text: '([post].[content] = @1)', + string: "([post].[content] = '2000-01-01T00:00:00.000Z')" + }, + oracle: { + text: '("post"."content" = :1)', + string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' + }, + params: [new Date('Sat, 01 Jan 2000 00:00:00 GMT')] +}); + +// Date to milliseconds +Harness.test({ + query: post.content.equals(new Date('Sat, 01 Jan 2000 00:00:00 GMT')), + pg: { + text: '("post"."content" = $1)', + string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' + }, + sqlite: { + text: '("post"."content" = $1)', + string: '("post"."content" = 946684800000)', + config: { + dateTimeMillis: true + } + }, + mysql: { + text: '(`post`.`content` = ?)', + string: "(`post`.`content` = '2000-01-01T00:00:00.000Z')" + }, + mssql: { + text: '([post].[content] = @1)', + string: "([post].[content] = '2000-01-01T00:00:00.000Z')" + }, + oracle: { + text: '("post"."content" = :1)', + string: '("post"."content" = \'2000-01-01T00:00:00.000Z\')' + }, + params: [new Date('Sat, 01 Jan 2000 00:00:00 GMT')] +}); + +// Object +const customObject = { + toString() { + return 'secretMessage'; + } +}; + +Harness.test({ + query: post.content.equals(customObject), + pg: { + text: '("post"."content" = $1)', + string: '("post"."content" = \'secretMessage\')' + }, + sqlite: { + text: '("post"."content" = $1)', + string: '("post"."content" = \'secretMessage\')' + }, + mysql: { + text: '(`post`.`content` = ?)', + string: "(`post`.`content` = 'secretMessage')" + }, + mssql: { + text: '([post].[content] = @1)', + string: "([post].[content] = 'secretMessage')" + }, + oracle: { + text: '("post"."content" = :1)', + string: '("post"."content" = \'secretMessage\')' + }, + params: [customObject] +}); + +// Undefined +assert.throws(function() { + post.content.equals(undefined).toString(); +}); diff --git a/test/dialects/truncate-table-tests.js b/test/dialects/truncate-table-tests.js deleted file mode 100644 index cfdb04da..00000000 --- a/test/dialects/truncate-table-tests.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); - -Harness.test({ - query: post.truncate(), - pg: { - text : 'TRUNCATE TABLE "post"', - string: 'TRUNCATE TABLE "post"' - }, - sqlite: { - text : 'DELETE FROM "post"', - string: 'DELETE FROM "post"' - }, - mysql: { - text : 'TRUNCATE TABLE `post`', - string: 'TRUNCATE TABLE `post`' - }, - mssql: { - text : 'TRUNCATE TABLE [post]', - string: 'TRUNCATE TABLE [post]' - }, - oracle: { - text : 'TRUNCATE TABLE "post"', - string: 'TRUNCATE TABLE "post"' - }, - params: [] -}); diff --git a/test/dialects/truncate-table-tests.ts b/test/dialects/truncate-table-tests.ts new file mode 100644 index 00000000..6c8bb7ee --- /dev/null +++ b/test/dialects/truncate-table-tests.ts @@ -0,0 +1,29 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); + +Harness.test({ + query: post.truncate(), + pg: { + text: 'TRUNCATE TABLE "post"', + string: 'TRUNCATE TABLE "post"' + }, + sqlite: { + text: 'DELETE FROM "post"', + string: 'DELETE FROM "post"' + }, + mysql: { + text: 'TRUNCATE TABLE `post`', + string: 'TRUNCATE TABLE `post`' + }, + mssql: { + text: 'TRUNCATE TABLE [post]', + string: 'TRUNCATE TABLE [post]' + }, + oracle: { + text: 'TRUNCATE TABLE "post"', + string: 'TRUNCATE TABLE "post"' + }, + params: [] +}); diff --git a/test/dialects/unary-clause-tests.js b/test/dialects/unary-clause-tests.js deleted file mode 100644 index 875de382..00000000 --- a/test/dialects/unary-clause-tests.js +++ /dev/null @@ -1,55 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var post = Harness.definePostTable(); - -Harness.test({ - query: customer.select().where(customer.age.isNotNull()), - pg: { - text : 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)', - string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)' - }, - sqlite: { - text : 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)', - string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)' - }, - mysql: { - text : 'SELECT `customer`.* FROM `customer` WHERE (`customer`.`age` IS NOT NULL)', - string: 'SELECT `customer`.* FROM `customer` WHERE (`customer`.`age` IS NOT NULL)' - }, - mssql: { - text : 'SELECT [customer].* FROM [customer] WHERE ([customer].[age] IS NOT NULL)', - string: 'SELECT [customer].* FROM [customer] WHERE ([customer].[age] IS NOT NULL)' - }, - oracle: { - text : 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)', - string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)' - }, - params: [] -}); - -Harness.test({ - query: post.select().where(post.userId. in (customer.subQuery().select(customer.id).where(customer.age.isNull()))), - pg: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))' - }, - sqlite: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))' - }, - mysql: { - text : 'SELECT `post`.* FROM `post` WHERE (`post`.`userId` IN (SELECT `customer`.`id` FROM `customer` WHERE (`customer`.`age` IS NULL)))', - string: 'SELECT `post`.* FROM `post` WHERE (`post`.`userId` IN (SELECT `customer`.`id` FROM `customer` WHERE (`customer`.`age` IS NULL)))' - }, - mssql: { - text : 'SELECT [post].* FROM [post] WHERE ([post].[userId] IN (SELECT [customer].[id] FROM [customer] WHERE ([customer].[age] IS NULL)))', - string: 'SELECT [post].* FROM [post] WHERE ([post].[userId] IN (SELECT [customer].[id] FROM [customer] WHERE ([customer].[age] IS NULL)))' - }, - oracle: { - text : 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))', - string: 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))' - }, - params: [] -}); diff --git a/test/dialects/unary-clause-tests.ts b/test/dialects/unary-clause-tests.ts new file mode 100644 index 00000000..407b123f --- /dev/null +++ b/test/dialects/unary-clause-tests.ts @@ -0,0 +1,72 @@ +'use strict'; + +import * as Harness from './support'; +const customer = Harness.defineCustomerTable(); +const post = Harness.definePostTable(); + +Harness.test({ + query: customer.select().where(customer.age.isNotNull()), + pg: { + text: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)', + string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)' + }, + sqlite: { + text: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)', + string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)' + }, + mysql: { + text: 'SELECT `customer`.* FROM `customer` WHERE (`customer`.`age` IS NOT NULL)', + string: 'SELECT `customer`.* FROM `customer` WHERE (`customer`.`age` IS NOT NULL)' + }, + mssql: { + text: 'SELECT [customer].* FROM [customer] WHERE ([customer].[age] IS NOT NULL)', + string: 'SELECT [customer].* FROM [customer] WHERE ([customer].[age] IS NOT NULL)' + }, + oracle: { + text: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)', + string: 'SELECT "customer".* FROM "customer" WHERE ("customer"."age" IS NOT NULL)' + }, + params: [] +}); + +Harness.test({ + query: post.select().where( + post.userId.in( + customer + .subQuery() + .select(customer.id) + .where(customer.age.isNull()) + ) + ), + pg: { + text: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))', + string: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))' + }, + sqlite: { + text: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))', + string: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))' + }, + mysql: { + text: + 'SELECT `post`.* FROM `post` WHERE (`post`.`userId` IN (SELECT `customer`.`id` FROM `customer` WHERE (`customer`.`age` IS NULL)))', + string: + 'SELECT `post`.* FROM `post` WHERE (`post`.`userId` IN (SELECT `customer`.`id` FROM `customer` WHERE (`customer`.`age` IS NULL)))' + }, + mssql: { + text: + 'SELECT [post].* FROM [post] WHERE ([post].[userId] IN (SELECT [customer].[id] FROM [customer] WHERE ([customer].[age] IS NULL)))', + string: + 'SELECT [post].* FROM [post] WHERE ([post].[userId] IN (SELECT [customer].[id] FROM [customer] WHERE ([customer].[age] IS NULL)))' + }, + oracle: { + text: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))', + string: + 'SELECT "post".* FROM "post" WHERE ("post"."userId" IN (SELECT "customer"."id" FROM "customer" WHERE ("customer"."age" IS NULL)))' + }, + params: [] +}); diff --git a/test/dialects/update-tests.js b/test/dialects/update-tests.js deleted file mode 100644 index eb3d0b3e..00000000 --- a/test/dialects/update-tests.js +++ /dev/null @@ -1,246 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var post = Harness.definePostTable(); -var user = Harness.defineUserTable(); -var variable = Harness.defineVariableTable(); - -Harness.test({ - query: post.update({ - content: 'test' - }), - pg: { - text : 'UPDATE "post" SET "content" = $1', - string: 'UPDATE "post" SET "content" = \'test\'' - }, - sqlite: { - text : 'UPDATE "post" SET "content" = $1', - string: 'UPDATE "post" SET "content" = \'test\'' - }, - mysql: { - text : 'UPDATE `post` SET `content` = ?', - string: 'UPDATE `post` SET `content` = \'test\'' - }, - mssql: { - text : 'UPDATE [post] SET [content] = @1', - string: 'UPDATE [post] SET [content] = \'test\'' - }, - oracle: { - text : 'UPDATE "post" SET "content" = :1', - string: 'UPDATE "post" SET "content" = \'test\'' - }, - params: ['test'] -}); - -Harness.test({ - query: post.update({ - content: 'test', - userId: 3 - }), - pg: { - text : 'UPDATE "post" SET "content" = $1, "userId" = $2', - string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3' - }, - sqlite: { - text : 'UPDATE "post" SET "content" = $1, "userId" = $2', - string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3' - }, - mysql: { - text : 'UPDATE `post` SET `content` = ?, `userId` = ?', - string: 'UPDATE `post` SET `content` = \'test\', `userId` = 3' - }, - mssql: { - text : 'UPDATE [post] SET [content] = @1, [userId] = @2', - string: 'UPDATE [post] SET [content] = \'test\', [userId] = 3' - }, - oracle: { - text : 'UPDATE "post" SET "content" = :1, "userId" = :2', - string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3' - }, - params: ['test', 3] -}); - -Harness.test({ - query: post.update({ - content: null, - userId: 3 - }), - pg: { - text : 'UPDATE "post" SET "content" = $1, "userId" = $2', - string: 'UPDATE "post" SET "content" = NULL, "userId" = 3' - }, - sqlite: { - text : 'UPDATE "post" SET "content" = $1, "userId" = $2', - string: 'UPDATE "post" SET "content" = NULL, "userId" = 3' - }, - mysql: { - text : 'UPDATE `post` SET `content` = ?, `userId` = ?', - string: 'UPDATE `post` SET `content` = NULL, `userId` = 3' - }, - mssql: { - text : 'UPDATE [post] SET [content] = @1, [userId] = @2', - string: 'UPDATE [post] SET [content] = NULL, [userId] = 3' - }, - oracle: { - text : 'UPDATE "post" SET "content" = :1, "userId" = :2', - string: 'UPDATE "post" SET "content" = NULL, "userId" = 3' - }, - params: [null, 3] -}); - -Harness.test({ - query: post.update({ - content: 'test', - userId: 3 - }).where(post.content.equals('no')), - pg: { - text : 'UPDATE "post" SET "content" = $1, "userId" = $2 WHERE ("post"."content" = $3)', - string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3 WHERE ("post"."content" = \'no\')' - }, - sqlite: { - text : 'UPDATE "post" SET "content" = $1, "userId" = $2 WHERE ("post"."content" = $3)', - string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3 WHERE ("post"."content" = \'no\')' - }, - mysql: { - text : 'UPDATE `post` SET `content` = ?, `userId` = ? WHERE (`post`.`content` = ?)', - string: 'UPDATE `post` SET `content` = \'test\', `userId` = 3 WHERE (`post`.`content` = \'no\')' - }, - mssql: { - text : 'UPDATE [post] SET [content] = @1, [userId] = @2 WHERE ([post].[content] = @3)', - string: 'UPDATE [post] SET [content] = \'test\', [userId] = 3 WHERE ([post].[content] = \'no\')' - }, - oracle: { - text : 'UPDATE "post" SET "content" = :1, "userId" = :2 WHERE ("post"."content" = :3)', - string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3 WHERE ("post"."content" = \'no\')' - }, - params: ['test', 3, 'no'] -}); - -Harness.test({ - query: post.update({ - content: user.name - }).from(user).where(post.userId.equals(user.id)), - sqlite: { - text : 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")', - string: 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")' - }, - pg: { - text : 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")', - string: 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")' - }, - mysql: { - text : 'UPDATE `post` SET `content` = `user`.`name` FROM `user` WHERE (`post`.`userId` = `user`.`id`)', - string: 'UPDATE `post` SET `content` = `user`.`name` FROM `user` WHERE (`post`.`userId` = `user`.`id`)' - }, - mssql: { - text : 'UPDATE [post] SET [content] = [user].[name] FROM [user] WHERE ([post].[userId] = [user].[id])', - string: 'UPDATE [post] SET [content] = [user].[name] FROM [user] WHERE ([post].[userId] = [user].[id])' - }, - oracle: { - text : 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")', - string: 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")' - }, - params: [] -}); - -// update() needs to prefix ambiguous source columns; prefixing target columns is not allowed -Harness.test({ - query: post.update({ - userId: user.id - }).from(user).where(post.userId.equals(user.id)), - pg: { - text : 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")', - string: 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")' - }, - sqlite: { - text : 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")', - string: 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")' - }, - mysql: { - text : 'UPDATE `post` SET `userId` = `user`.`id` FROM `user` WHERE (`post`.`userId` = `user`.`id`)', - string: 'UPDATE `post` SET `userId` = `user`.`id` FROM `user` WHERE (`post`.`userId` = `user`.`id`)' - }, - mssql: { - text : 'UPDATE [post] SET [userId] = [user].[id] FROM [user] WHERE ([post].[userId] = [user].[id])', - string: 'UPDATE [post] SET [userId] = [user].[id] FROM [user] WHERE ([post].[userId] = [user].[id])' - }, - oracle: { - text : 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")', - string: 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")' - }, - params: [] -}); - -// Binary updates -Harness.test({ - query: post.update({ - content: new Buffer('test') - }), - pg: { - text : 'UPDATE "post" SET "content" = $1', - string: 'UPDATE "post" SET "content" = \'\\x74657374\'' - }, - sqlite: { - text : 'UPDATE "post" SET "content" = $1', - string: 'UPDATE "post" SET "content" = x\'74657374\'' - }, - mysql: { - text : 'UPDATE `post` SET `content` = ?', - string: 'UPDATE `post` SET `content` = x\'74657374\'' - }, - oracle: { - text : 'UPDATE "post" SET "content" = :1', - string: 'UPDATE "post" SET "content" = utl_raw.cast_to_varchar2(hextoraw(\'74657374\'))' - }, - params: [new Buffer('test')] -}); - -// Boolean updates -Harness.test({ - query: variable.update({ - a: true, - b: false - }), - pg: { - text : 'UPDATE "variable" SET "a" = $1, "b" = $2', - string: 'UPDATE "variable" SET "a" = TRUE, "b" = FALSE' - }, - sqlite: { - text : 'UPDATE "variable" SET "a" = $1, "b" = $2', - string: 'UPDATE "variable" SET "a" = 1, "b" = 0' - }, - mysql: { - text : 'UPDATE `variable` SET `a` = ?, `b` = ?', - string: 'UPDATE `variable` SET `a` = TRUE, `b` = FALSE' - }, - oracle: { - text : 'UPDATE "variable" SET "a" = :1, "b" = :2', - string: 'UPDATE "variable" SET "a" = TRUE, "b" = FALSE' - }, - params: [true, false] -}); - -// Object updates -Harness.test({ - query: variable.update({ - a: {"id": 1, "value": 2}, - b: [{"id": 2, "value": 3}, {"id": 3, "value": 4}] - }), - pg: { - text : 'UPDATE "variable" SET "a" = $1, "b" = $2', - string: 'UPDATE "variable" SET "a" = \'{"id":1,"value":2}\', "b" = \'[{"id":2,"value":3},{"id":3,"value":4}]\'' - }, - sqlite: { - text : 'UPDATE "variable" SET "a" = $1, "b" = $2', - string: 'UPDATE "variable" SET "a" = \'{"id":1,"value":2}\', "b" = \'[{"id":2,"value":3},{"id":3,"value":4}]\'' - }, - mysql: { - text : 'UPDATE `variable` SET `a` = ?, `b` = ?', - string: 'UPDATE `variable` SET `a` = \'{"id":1,"value":2}\', `b` = (\'{"id":2,"value":3}\', \'{"id":3,"value":4}\')' - }, - oracle: { - text : 'UPDATE "variable" SET "a" = :1, "b" = :2', - string: 'UPDATE "variable" SET "a" = \'{"id":1,"value":2}\', "b" = (\'{"id":2,"value":3}\', \'{"id":3,"value":4}\')' - }, - params: [{"id": 1, "value": 2}, [{"id": 2, "value": 3}, {"id": 3, "value": 4}]] -}); \ No newline at end of file diff --git a/test/dialects/update-tests.ts b/test/dialects/update-tests.ts new file mode 100644 index 00000000..0ad48cff --- /dev/null +++ b/test/dialects/update-tests.ts @@ -0,0 +1,255 @@ +'use strict'; + +import * as Harness from './support'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); +const variable = Harness.defineVariableTable(); + +Harness.test({ + query: post.update({ + content: 'test' + }), + pg: { + text: 'UPDATE "post" SET "content" = $1', + string: 'UPDATE "post" SET "content" = \'test\'' + }, + sqlite: { + text: 'UPDATE "post" SET "content" = $1', + string: 'UPDATE "post" SET "content" = \'test\'' + }, + mysql: { + text: 'UPDATE `post` SET `content` = ?', + string: "UPDATE `post` SET `content` = 'test'" + }, + mssql: { + text: 'UPDATE [post] SET [content] = @1', + string: "UPDATE [post] SET [content] = 'test'" + }, + oracle: { + text: 'UPDATE "post" SET "content" = :1', + string: 'UPDATE "post" SET "content" = \'test\'' + }, + params: ['test'] +}); + +Harness.test({ + query: post.update({ + content: 'test', + userId: 3 + }), + pg: { + text: 'UPDATE "post" SET "content" = $1, "userId" = $2', + string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3' + }, + sqlite: { + text: 'UPDATE "post" SET "content" = $1, "userId" = $2', + string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3' + }, + mysql: { + text: 'UPDATE `post` SET `content` = ?, `userId` = ?', + string: "UPDATE `post` SET `content` = 'test', `userId` = 3" + }, + mssql: { + text: 'UPDATE [post] SET [content] = @1, [userId] = @2', + string: "UPDATE [post] SET [content] = 'test', [userId] = 3" + }, + oracle: { + text: 'UPDATE "post" SET "content" = :1, "userId" = :2', + string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3' + }, + params: ['test', 3] +}); + +Harness.test({ + query: post.update({ + content: null, + userId: 3 + }), + pg: { + text: 'UPDATE "post" SET "content" = $1, "userId" = $2', + string: 'UPDATE "post" SET "content" = NULL, "userId" = 3' + }, + sqlite: { + text: 'UPDATE "post" SET "content" = $1, "userId" = $2', + string: 'UPDATE "post" SET "content" = NULL, "userId" = 3' + }, + mysql: { + text: 'UPDATE `post` SET `content` = ?, `userId` = ?', + string: 'UPDATE `post` SET `content` = NULL, `userId` = 3' + }, + mssql: { + text: 'UPDATE [post] SET [content] = @1, [userId] = @2', + string: 'UPDATE [post] SET [content] = NULL, [userId] = 3' + }, + oracle: { + text: 'UPDATE "post" SET "content" = :1, "userId" = :2', + string: 'UPDATE "post" SET "content" = NULL, "userId" = 3' + }, + params: [null, 3] +}); + +Harness.test({ + query: post + .update({ + content: 'test', + userId: 3 + }) + .where(post.content.equals('no')), + pg: { + text: 'UPDATE "post" SET "content" = $1, "userId" = $2 WHERE ("post"."content" = $3)', + string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3 WHERE ("post"."content" = \'no\')' + }, + sqlite: { + text: 'UPDATE "post" SET "content" = $1, "userId" = $2 WHERE ("post"."content" = $3)', + string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3 WHERE ("post"."content" = \'no\')' + }, + mysql: { + text: 'UPDATE `post` SET `content` = ?, `userId` = ? WHERE (`post`.`content` = ?)', + string: "UPDATE `post` SET `content` = 'test', `userId` = 3 WHERE (`post`.`content` = 'no')" + }, + mssql: { + text: 'UPDATE [post] SET [content] = @1, [userId] = @2 WHERE ([post].[content] = @3)', + string: "UPDATE [post] SET [content] = 'test', [userId] = 3 WHERE ([post].[content] = 'no')" + }, + oracle: { + text: 'UPDATE "post" SET "content" = :1, "userId" = :2 WHERE ("post"."content" = :3)', + string: 'UPDATE "post" SET "content" = \'test\', "userId" = 3 WHERE ("post"."content" = \'no\')' + }, + params: ['test', 3, 'no'] +}); + +Harness.test({ + query: post + .update({ + content: user.name + }) + .from(user) + .where(post.userId.equals(user.id)), + sqlite: { + text: 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")', + string: 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")' + }, + pg: { + text: 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")', + string: 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")' + }, + mysql: { + text: 'UPDATE `post` SET `content` = `user`.`name` FROM `user` WHERE (`post`.`userId` = `user`.`id`)', + string: 'UPDATE `post` SET `content` = `user`.`name` FROM `user` WHERE (`post`.`userId` = `user`.`id`)' + }, + mssql: { + text: 'UPDATE [post] SET [content] = [user].[name] FROM [user] WHERE ([post].[userId] = [user].[id])', + string: 'UPDATE [post] SET [content] = [user].[name] FROM [user] WHERE ([post].[userId] = [user].[id])' + }, + oracle: { + text: 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")', + string: 'UPDATE "post" SET "content" = "user"."name" FROM "user" WHERE ("post"."userId" = "user"."id")' + }, + params: [] +}); + +// update() needs to prefix ambiguous source columns; prefixing target columns is not allowed +Harness.test({ + query: post + .update({ + userId: user.id + }) + .from(user) + .where(post.userId.equals(user.id)), + pg: { + text: 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")', + string: 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")' + }, + sqlite: { + text: 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")', + string: 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")' + }, + mysql: { + text: 'UPDATE `post` SET `userId` = `user`.`id` FROM `user` WHERE (`post`.`userId` = `user`.`id`)', + string: 'UPDATE `post` SET `userId` = `user`.`id` FROM `user` WHERE (`post`.`userId` = `user`.`id`)' + }, + mssql: { + text: 'UPDATE [post] SET [userId] = [user].[id] FROM [user] WHERE ([post].[userId] = [user].[id])', + string: 'UPDATE [post] SET [userId] = [user].[id] FROM [user] WHERE ([post].[userId] = [user].[id])' + }, + oracle: { + text: 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")', + string: 'UPDATE "post" SET "userId" = "user"."id" FROM "user" WHERE ("post"."userId" = "user"."id")' + }, + params: [] +}); + +// Binary updates +Harness.test({ + query: post.update({ + //@ts-ignore should investigate whether this should be valid for typings + content: new Buffer('test') + }), + pg: { + text: 'UPDATE "post" SET "content" = $1', + string: 'UPDATE "post" SET "content" = \'\\x74657374\'' + }, + sqlite: { + text: 'UPDATE "post" SET "content" = $1', + string: 'UPDATE "post" SET "content" = x\'74657374\'' + }, + mysql: { + text: 'UPDATE `post` SET `content` = ?', + string: "UPDATE `post` SET `content` = x'74657374'" + }, + oracle: { + text: 'UPDATE "post" SET "content" = :1', + string: 'UPDATE "post" SET "content" = utl_raw.cast_to_varchar2(hextoraw(\'74657374\'))' + }, + params: [new Buffer('test')] +}); + +// Boolean updates +Harness.test({ + query: variable.update({ + a: true, + b: false + }), + pg: { + text: 'UPDATE "variable" SET "a" = $1, "b" = $2', + string: 'UPDATE "variable" SET "a" = TRUE, "b" = FALSE' + }, + sqlite: { + text: 'UPDATE "variable" SET "a" = $1, "b" = $2', + string: 'UPDATE "variable" SET "a" = 1, "b" = 0' + }, + mysql: { + text: 'UPDATE `variable` SET `a` = ?, `b` = ?', + string: 'UPDATE `variable` SET `a` = TRUE, `b` = FALSE' + }, + oracle: { + text: 'UPDATE "variable" SET "a" = :1, "b" = :2', + string: 'UPDATE "variable" SET "a" = TRUE, "b" = FALSE' + }, + params: [true, false] +}); + +// Object updates +Harness.test({ + query: variable.update({ + a: { id: 1, value: 2 }, + b: [{ id: 2, value: 3 }, { id: 3, value: 4 }] + }), + pg: { + text: 'UPDATE "variable" SET "a" = $1, "b" = $2', + string: 'UPDATE "variable" SET "a" = \'{"id":1,"value":2}\', "b" = \'[{"id":2,"value":3},{"id":3,"value":4}]\'' + }, + sqlite: { + text: 'UPDATE "variable" SET "a" = $1, "b" = $2', + string: 'UPDATE "variable" SET "a" = \'{"id":1,"value":2}\', "b" = \'[{"id":2,"value":3},{"id":3,"value":4}]\'' + }, + mysql: { + text: 'UPDATE `variable` SET `a` = ?, `b` = ?', + string: 'UPDATE `variable` SET `a` = \'{"id":1,"value":2}\', `b` = (\'{"id":2,"value":3}\', \'{"id":3,"value":4}\')' + }, + oracle: { + text: 'UPDATE "variable" SET "a" = :1, "b" = :2', + string: 'UPDATE "variable" SET "a" = \'{"id":1,"value":2}\', "b" = (\'{"id":2,"value":3}\', \'{"id":3,"value":4}\')' + }, + params: [{ id: 1, value: 2 }, [{ id: 2, value: 3 }, { id: 3, value: 4 }]] +}); diff --git a/test/dialects/value-expression-tests.js b/test/dialects/value-expression-tests.js deleted file mode 100644 index 5eaae5ae..00000000 --- a/test/dialects/value-expression-tests.js +++ /dev/null @@ -1,133 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var customer = Harness.defineCustomerTable(); -var post = Harness.definePostTable(); -var v = Harness.defineVariableTable(); - -// Test composition of binary methods +, *, -, =. -Harness.test({ - query: customer.select(customer.name, customer.income.modulo(100)).where(customer.age.plus(5).multiply(customer.age.minus(2)).equals(10)), - pg: { - text : 'SELECT "customer"."name", ("customer"."income" % $1) FROM "customer" WHERE ((("customer"."age" + $2) * ("customer"."age" - $3)) = $4)', - string: 'SELECT "customer"."name", ("customer"."income" % 100) FROM "customer" WHERE ((("customer"."age" + 5) * ("customer"."age" - 2)) = 10)' - }, - sqlite: { - text : 'SELECT "customer"."name", ("customer"."income" % $1) FROM "customer" WHERE ((("customer"."age" + $2) * ("customer"."age" - $3)) = $4)', - string: 'SELECT "customer"."name", ("customer"."income" % 100) FROM "customer" WHERE ((("customer"."age" + 5) * ("customer"."age" - 2)) = 10)' - }, - mysql: { - text : 'SELECT `customer`.`name`, (`customer`.`income` % ?) FROM `customer` WHERE (((`customer`.`age` + ?) * (`customer`.`age` - ?)) = ?)', - string: 'SELECT `customer`.`name`, (`customer`.`income` % 100) FROM `customer` WHERE (((`customer`.`age` + 5) * (`customer`.`age` - 2)) = 10)' - }, - mssql: { - text : 'SELECT [customer].[name], ([customer].[income] % @1) FROM [customer] WHERE ((([customer].[age] + @2) * ([customer].[age] - @3)) = @4)', - string: 'SELECT [customer].[name], ([customer].[income] % 100) FROM [customer] WHERE ((([customer].[age] + 5) * ([customer].[age] - 2)) = 10)' - }, - oracle: { - text : 'SELECT "customer"."name", ("customer"."income" % :1) FROM "customer" WHERE ((("customer"."age" + :2) * ("customer"."age" - :3)) = :4)', - string: 'SELECT "customer"."name", ("customer"."income" % 100) FROM "customer" WHERE ((("customer"."age" + 5) * ("customer"."age" - 2)) = 10)' - }, - params: [100, 5, 2, 10] -}); - -// Test composition of binary (e.g. +) and unary (e.g. like) methods. -Harness.test({ - query: customer.select(customer.name).where(customer.name.like(customer.id.plus('hello'))), - pg: { - text : 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + $1))', - string: 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + \'hello\'))' - }, - sqlite: { - text : 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + $1))', - string: 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + \'hello\'))' - }, - mysql: { - text : 'SELECT `customer`.`name` FROM `customer` WHERE (`customer`.`name` LIKE (`customer`.`id` + ?))', - string: 'SELECT `customer`.`name` FROM `customer` WHERE (`customer`.`name` LIKE (`customer`.`id` + \'hello\'))' - }, - mssql: { - text : 'SELECT [customer].[name] FROM [customer] WHERE ([customer].[name] LIKE ([customer].[id] + @1))', - string: 'SELECT [customer].[name] FROM [customer] WHERE ([customer].[name] LIKE ([customer].[id] + \'hello\'))' - }, - oracle: { - text : 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + :1))', - string: 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + \'hello\'))' - }, - params: ['hello'] -}); - -// Test implementing simple formulas. -// Acceleration formula. (a * t^2 / 2) + (v * t) = d -Harness.test({ - query: v.select(v.a.multiply(v.a).divide(2).plus(v.v.multiply(v.t)).equals(v.d)), - pg: { - text : 'SELECT (((("variable"."a" * "variable"."a") / $1) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"', - string: 'SELECT (((("variable"."a" * "variable"."a") / 2) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"' - }, - sqlite: { - text : 'SELECT (((("variable"."a" * "variable"."a") / $1) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"', - string: 'SELECT (((("variable"."a" * "variable"."a") / 2) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"' - }, - mysql: { - text : 'SELECT ((((`variable`.`a` * `variable`.`a`) / ?) + (`variable`.`v` * `variable`.`t`)) = `variable`.`d`) FROM `variable`', - string: 'SELECT ((((`variable`.`a` * `variable`.`a`) / 2) + (`variable`.`v` * `variable`.`t`)) = `variable`.`d`) FROM `variable`' - }, - mssql: { - text : 'SELECT (((([variable].[a] * [variable].[a]) / @1) + ([variable].[v] * [variable].[t])) = [variable].[d]) FROM [variable]', - string: 'SELECT (((([variable].[a] * [variable].[a]) / 2) + ([variable].[v] * [variable].[t])) = [variable].[d]) FROM [variable]' - }, - oracle: { - text : 'SELECT (((("variable"."a" * "variable"."a") / :1) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"', - string: 'SELECT (((("variable"."a" * "variable"."a") / 2) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"' - }, - params: [2] -}); - -// Pythagorean theorem. a^2 + b^2 = c^2. -Harness.test({ - query: v.select(v.a.multiply(v.a).plus(v.b.multiply(v.b)).equals(v.c.multiply(v.c))), - pg: { - text : 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"', - string: 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"' - }, - sqlite: { - text : 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"', - string: 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"' - }, - mysql: { - text : 'SELECT (((`variable`.`a` * `variable`.`a`) + (`variable`.`b` * `variable`.`b`)) = (`variable`.`c` * `variable`.`c`)) FROM `variable`', - string: 'SELECT (((`variable`.`a` * `variable`.`a`) + (`variable`.`b` * `variable`.`b`)) = (`variable`.`c` * `variable`.`c`)) FROM `variable`' - }, - mssql: { - text : 'SELECT ((([variable].[a] * [variable].[a]) + ([variable].[b] * [variable].[b])) = ([variable].[c] * [variable].[c])) FROM [variable]', - string: 'SELECT ((([variable].[a] * [variable].[a]) + ([variable].[b] * [variable].[b])) = ([variable].[c] * [variable].[c])) FROM [variable]' - }, - oracle: { - text : 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"', - string: 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"' - }, - params: [] -}); - -Harness.test({ - query: post.select(post.id).where(post.content.equals(new Buffer('test'))), - pg: { - text : 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = $1)', - string: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = \'\\x74657374\')', - }, - sqlite: { - text : 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = $1)', - string: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = x\'74657374\')', - }, - mysql: { - text : 'SELECT `post`.`id` FROM `post` WHERE (`post`.`content` = ?)', - string: 'SELECT `post`.`id` FROM `post` WHERE (`post`.`content` = x\'74657374\')', - }, - oracle: { - text : 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = :1)', - string: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = utl_raw.cast_to_varchar2(hextoraw(\'74657374\')))', - }, - params: [new Buffer('test')] -}); - diff --git a/test/dialects/value-expression-tests.ts b/test/dialects/value-expression-tests.ts new file mode 100644 index 00000000..d42bb1a3 --- /dev/null +++ b/test/dialects/value-expression-tests.ts @@ -0,0 +1,168 @@ +'use strict'; + +import * as Harness from './support'; +const customer = Harness.defineCustomerTable(); +const post = Harness.definePostTable(); +const variable = Harness.defineVariableTable(); + +// Test composition of binary methods +, *, -, =. +Harness.test({ + query: customer.select(customer.name, customer.income.modulo(100)).where( + customer.age + .plus(5) + .multiply(customer.age.minus(2)) + .equals(10) + ), + pg: { + text: + 'SELECT "customer"."name", ("customer"."income" % $1) FROM "customer" WHERE ((("customer"."age" + $2) * ("customer"."age" - $3)) = $4)', + string: + 'SELECT "customer"."name", ("customer"."income" % 100) FROM "customer" WHERE ((("customer"."age" + 5) * ("customer"."age" - 2)) = 10)' + }, + sqlite: { + text: + 'SELECT "customer"."name", ("customer"."income" % $1) FROM "customer" WHERE ((("customer"."age" + $2) * ("customer"."age" - $3)) = $4)', + string: + 'SELECT "customer"."name", ("customer"."income" % 100) FROM "customer" WHERE ((("customer"."age" + 5) * ("customer"."age" - 2)) = 10)' + }, + mysql: { + text: + 'SELECT `customer`.`name`, (`customer`.`income` % ?) FROM `customer` WHERE (((`customer`.`age` + ?) * (`customer`.`age` - ?)) = ?)', + string: + 'SELECT `customer`.`name`, (`customer`.`income` % 100) FROM `customer` WHERE (((`customer`.`age` + 5) * (`customer`.`age` - 2)) = 10)' + }, + mssql: { + text: + 'SELECT [customer].[name], ([customer].[income] % @1) FROM [customer] WHERE ((([customer].[age] + @2) * ([customer].[age] - @3)) = @4)', + string: + 'SELECT [customer].[name], ([customer].[income] % 100) FROM [customer] WHERE ((([customer].[age] + 5) * ([customer].[age] - 2)) = 10)' + }, + oracle: { + text: + 'SELECT "customer"."name", ("customer"."income" % :1) FROM "customer" WHERE ((("customer"."age" + :2) * ("customer"."age" - :3)) = :4)', + string: + 'SELECT "customer"."name", ("customer"."income" % 100) FROM "customer" WHERE ((("customer"."age" + 5) * ("customer"."age" - 2)) = 10)' + }, + params: [100, 5, 2, 10] +}); + +// Test composition of binary (e.g. +) and unary (e.g. like) methods. +Harness.test({ + query: customer.select(customer.name).where(customer.name.like(customer.id.plus('hello'))), + pg: { + text: 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + $1))', + string: 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + \'hello\'))' + }, + sqlite: { + text: 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + $1))', + string: 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + \'hello\'))' + }, + mysql: { + text: 'SELECT `customer`.`name` FROM `customer` WHERE (`customer`.`name` LIKE (`customer`.`id` + ?))', + string: "SELECT `customer`.`name` FROM `customer` WHERE (`customer`.`name` LIKE (`customer`.`id` + 'hello'))" + }, + mssql: { + text: 'SELECT [customer].[name] FROM [customer] WHERE ([customer].[name] LIKE ([customer].[id] + @1))', + string: "SELECT [customer].[name] FROM [customer] WHERE ([customer].[name] LIKE ([customer].[id] + 'hello'))" + }, + oracle: { + text: 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + :1))', + string: 'SELECT "customer"."name" FROM "customer" WHERE ("customer"."name" LIKE ("customer"."id" + \'hello\'))' + }, + params: ['hello'] +}); + +// Test implementing simple formulas. +// Acceleration formula. (a * t^2 / 2) + (v * t) = d +Harness.test({ + query: variable.select( + variable.a + .multiply(variable.a) + .divide(2) + .plus(variable.v.multiply(variable.t)) + .equals(variable.d) + ), + pg: { + text: 'SELECT (((("variable"."a" * "variable"."a") / $1) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"', + string: 'SELECT (((("variable"."a" * "variable"."a") / 2) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"' + }, + sqlite: { + text: 'SELECT (((("variable"."a" * "variable"."a") / $1) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"', + string: 'SELECT (((("variable"."a" * "variable"."a") / 2) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"' + }, + mysql: { + text: 'SELECT ((((`variable`.`a` * `variable`.`a`) / ?) + (`variable`.`v` * `variable`.`t`)) = `variable`.`d`) FROM `variable`', + string: 'SELECT ((((`variable`.`a` * `variable`.`a`) / 2) + (`variable`.`v` * `variable`.`t`)) = `variable`.`d`) FROM `variable`' + }, + mssql: { + text: 'SELECT (((([variable].[a] * [variable].[a]) / @1) + ([variable].[v] * [variable].[t])) = [variable].[d]) FROM [variable]', + string: 'SELECT (((([variable].[a] * [variable].[a]) / 2) + ([variable].[v] * [variable].[t])) = [variable].[d]) FROM [variable]' + }, + oracle: { + text: 'SELECT (((("variable"."a" * "variable"."a") / :1) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"', + string: 'SELECT (((("variable"."a" * "variable"."a") / 2) + ("variable"."v" * "variable"."t")) = "variable"."d") FROM "variable"' + }, + params: [2] +}); + +// Pythagorean theorem. a^2 + b^2 = c^2. +Harness.test({ + query: variable.select( + variable.a + .multiply(variable.a) + .plus(variable.b.multiply(variable.b)) + .equals(variable.c.multiply(variable.c)) + ), + pg: { + text: + 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"', + string: + 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"' + }, + sqlite: { + text: + 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"', + string: + 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"' + }, + mysql: { + text: + 'SELECT (((`variable`.`a` * `variable`.`a`) + (`variable`.`b` * `variable`.`b`)) = (`variable`.`c` * `variable`.`c`)) FROM `variable`', + string: + 'SELECT (((`variable`.`a` * `variable`.`a`) + (`variable`.`b` * `variable`.`b`)) = (`variable`.`c` * `variable`.`c`)) FROM `variable`' + }, + mssql: { + text: + 'SELECT ((([variable].[a] * [variable].[a]) + ([variable].[b] * [variable].[b])) = ([variable].[c] * [variable].[c])) FROM [variable]', + string: + 'SELECT ((([variable].[a] * [variable].[a]) + ([variable].[b] * [variable].[b])) = ([variable].[c] * [variable].[c])) FROM [variable]' + }, + oracle: { + text: + 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"', + string: + 'SELECT ((("variable"."a" * "variable"."a") + ("variable"."b" * "variable"."b")) = ("variable"."c" * "variable"."c")) FROM "variable"' + }, + params: [] +}); + +Harness.test({ + query: post.select(post.id).where(post.content.equals(new Buffer('test'))), + pg: { + text: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = $1)', + string: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = \'\\x74657374\')' + }, + sqlite: { + text: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = $1)', + string: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = x\'74657374\')' + }, + mysql: { + text: 'SELECT `post`.`id` FROM `post` WHERE (`post`.`content` = ?)', + string: "SELECT `post`.`id` FROM `post` WHERE (`post`.`content` = x'74657374')" + }, + oracle: { + text: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = :1)', + string: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = utl_raw.cast_to_varchar2(hextoraw(\'74657374\')))' + }, + params: [new Buffer('test')] +}); diff --git a/test/dialects/where-clause-tests.js b/test/dialects/where-clause-tests.js deleted file mode 100644 index 3282b7d9..00000000 --- a/test/dialects/where-clause-tests.js +++ /dev/null @@ -1,205 +0,0 @@ -'use strict'; - -var Harness = require('./support'); -var user = Harness.defineUserTable(); - -Harness.test({ - query: user.where(user.id.isNotNull(), user.name.isNotNull()), - pg: { - text : 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', - string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' - }, - mysql: { - text : 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))', - string: 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))' - }, - sqlite: { - text : 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', - string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' - }, - mssql: { - text : 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))', - string: 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))' - }, - oracle: { - text : 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', - string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' - }, - params: [] -}); - -Harness.test({ - query: user.and(user.id.isNotNull(), user.name.isNotNull()), - pg: { - text : 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', - string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' - }, - mysql: { - text : 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))', - string: 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))' - }, - sqlite: { - text : 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', - string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' - }, - mssql: { - text : 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))', - string: 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))' - }, - oracle: { - text : 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', - string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' - }, - params: [] -}); - -Harness.test({ - query: user.where([user.id.isNotNull(), user.name.isNotNull()]), - pg: { - text : 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', - string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' - }, - mysql: { - text : 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))', - string: 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))' - }, - sqlite: { - text : 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', - string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' - }, - mssql: { - text : 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))', - string: 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))' - }, - oracle: { - text : 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', - string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' - }, - params: [] -}); - -Harness.test({ - query: user.where([]), - pg: { - text : 'SELECT * FROM "user" WHERE (1 = 1)', - string: 'SELECT * FROM "user" WHERE (1 = 1)' - }, - mysql: { - text : 'SELECT * FROM `user` WHERE (1 = 1)', - string: 'SELECT * FROM `user` WHERE (1 = 1)' - }, - sqlite: { - text : 'SELECT * FROM "user" WHERE (1 = 1)', - string: 'SELECT * FROM "user" WHERE (1 = 1)' - }, - mssql: { - text : 'SELECT * FROM [user] WHERE (1 = 1)', - string: 'SELECT * FROM [user] WHERE (1 = 1)' - }, - oracle: { - text : 'SELECT * FROM "user" WHERE (1 = 1)', - string: 'SELECT * FROM "user" WHERE (1 = 1)' - }, - params: [] -}); - -Harness.test({ - query: user.select().where(user.id.equals(1)).and(user.name.equals('a')), - pg: { - text : 'SELECT "user".* FROM "user" WHERE (("user"."id" = $1) AND ("user"."name" = $2))', - string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) AND ("user"."name" = \'a\'))' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` WHERE ((`user`.`id` = ?) AND (`user`.`name` = ?))', - string: 'SELECT `user`.* FROM `user` WHERE ((`user`.`id` = 1) AND (`user`.`name` = \'a\'))' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" WHERE (("user"."id" = $1) AND ("user"."name" = $2))', - string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) AND ("user"."name" = \'a\'))' - }, - mssql: { - text : 'SELECT [user].* FROM [user] WHERE (([user].[id] = @1) AND ([user].[name] = @2))', - string: 'SELECT [user].* FROM [user] WHERE (([user].[id] = 1) AND ([user].[name] = \'a\'))' - }, - oracle: { - text : 'SELECT "user".* FROM "user" WHERE (("user"."id" = :1) AND ("user"."name" = :2))', - string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) AND ("user"."name" = \'a\'))' - }, - params: [1,'a'] -}); - -Harness.test({ - query: user.select().and(user.id.equals(1)), - pg: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."id" = $1)', - string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` WHERE (`user`.`id` = ?)', - string: 'SELECT `user`.* FROM `user` WHERE (`user`.`id` = 1)' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."id" = $1)', - string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' - }, - mssql: { - text : 'SELECT [user].* FROM [user] WHERE ([user].[id] = @1)', - string: 'SELECT [user].* FROM [user] WHERE ([user].[id] = 1)' - }, - oracle: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."id" = :1)', - string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' - }, - params: [1] -}); - -Harness.test({ - query: user.select().or(user.id.equals(1)), - pg: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."id" = $1)', - string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` WHERE (`user`.`id` = ?)', - string: 'SELECT `user`.* FROM `user` WHERE (`user`.`id` = 1)' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."id" = $1)', - string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' - }, - mssql: { - text : 'SELECT [user].* FROM [user] WHERE ([user].[id] = @1)', - string: 'SELECT [user].* FROM [user] WHERE ([user].[id] = 1)' - }, - oracle: { - text : 'SELECT "user".* FROM "user" WHERE ("user"."id" = :1)', - string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' - }, - params: [1] -}); - -Harness.test({ - query: user.select().and(user.id.equals(1)).or(user.name.equals('a')), - pg: { - text : 'SELECT "user".* FROM "user" WHERE (("user"."id" = $1) OR ("user"."name" = $2))', - string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) OR ("user"."name" = \'a\'))' - }, - mysql: { - text : 'SELECT `user`.* FROM `user` WHERE ((`user`.`id` = ?) OR (`user`.`name` = ?))', - string: 'SELECT `user`.* FROM `user` WHERE ((`user`.`id` = 1) OR (`user`.`name` = \'a\'))' - }, - sqlite: { - text : 'SELECT "user".* FROM "user" WHERE (("user"."id" = $1) OR ("user"."name" = $2))', - string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) OR ("user"."name" = \'a\'))' - }, - mssql: { - text : 'SELECT [user].* FROM [user] WHERE (([user].[id] = @1) OR ([user].[name] = @2))', - string: 'SELECT [user].* FROM [user] WHERE (([user].[id] = 1) OR ([user].[name] = \'a\'))' - }, - oracle: { - text : 'SELECT "user".* FROM "user" WHERE (("user"."id" = :1) OR ("user"."name" = :2))', - string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) OR ("user"."name" = \'a\'))' - }, - params: [1,'a'] -}); - diff --git a/test/dialects/where-clause-tests.ts b/test/dialects/where-clause-tests.ts new file mode 100644 index 00000000..eda0c8d3 --- /dev/null +++ b/test/dialects/where-clause-tests.ts @@ -0,0 +1,210 @@ +'use strict'; + +import * as Harness from './support'; +const user = Harness.defineUserTable(); + +Harness.test({ + query: user.where(user.id.isNotNull(), user.name.isNotNull()), + pg: { + text: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', + string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' + }, + mysql: { + text: 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))', + string: 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))' + }, + sqlite: { + text: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', + string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' + }, + mssql: { + text: 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))', + string: 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))' + }, + oracle: { + text: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', + string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' + }, + params: [] +}); + +Harness.test({ + query: user.and(user.id.isNotNull(), user.name.isNotNull()), + pg: { + text: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', + string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' + }, + mysql: { + text: 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))', + string: 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))' + }, + sqlite: { + text: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', + string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' + }, + mssql: { + text: 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))', + string: 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))' + }, + oracle: { + text: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', + string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' + }, + params: [] +}); + +Harness.test({ + query: user.where([user.id.isNotNull(), user.name.isNotNull()]), + pg: { + text: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', + string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' + }, + mysql: { + text: 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))', + string: 'SELECT * FROM `user` WHERE ((`user`.`id` IS NOT NULL) AND (`user`.`name` IS NOT NULL))' + }, + sqlite: { + text: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', + string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' + }, + mssql: { + text: 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))', + string: 'SELECT * FROM [user] WHERE (([user].[id] IS NOT NULL) AND ([user].[name] IS NOT NULL))' + }, + oracle: { + text: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))', + string: 'SELECT * FROM "user" WHERE (("user"."id" IS NOT NULL) AND ("user"."name" IS NOT NULL))' + }, + params: [] +}); + +Harness.test({ + query: user.where([]), + pg: { + text: 'SELECT * FROM "user" WHERE (1 = 1)', + string: 'SELECT * FROM "user" WHERE (1 = 1)' + }, + mysql: { + text: 'SELECT * FROM `user` WHERE (1 = 1)', + string: 'SELECT * FROM `user` WHERE (1 = 1)' + }, + sqlite: { + text: 'SELECT * FROM "user" WHERE (1 = 1)', + string: 'SELECT * FROM "user" WHERE (1 = 1)' + }, + mssql: { + text: 'SELECT * FROM [user] WHERE (1 = 1)', + string: 'SELECT * FROM [user] WHERE (1 = 1)' + }, + oracle: { + text: 'SELECT * FROM "user" WHERE (1 = 1)', + string: 'SELECT * FROM "user" WHERE (1 = 1)' + }, + params: [] +}); + +Harness.test({ + query: user + .select() + .where(user.id.equals(1)) + .and(user.name.equals('a')), + pg: { + text: 'SELECT "user".* FROM "user" WHERE (("user"."id" = $1) AND ("user"."name" = $2))', + string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) AND ("user"."name" = \'a\'))' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` WHERE ((`user`.`id` = ?) AND (`user`.`name` = ?))', + string: "SELECT `user`.* FROM `user` WHERE ((`user`.`id` = 1) AND (`user`.`name` = 'a'))" + }, + sqlite: { + text: 'SELECT "user".* FROM "user" WHERE (("user"."id" = $1) AND ("user"."name" = $2))', + string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) AND ("user"."name" = \'a\'))' + }, + mssql: { + text: 'SELECT [user].* FROM [user] WHERE (([user].[id] = @1) AND ([user].[name] = @2))', + string: "SELECT [user].* FROM [user] WHERE (([user].[id] = 1) AND ([user].[name] = 'a'))" + }, + oracle: { + text: 'SELECT "user".* FROM "user" WHERE (("user"."id" = :1) AND ("user"."name" = :2))', + string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) AND ("user"."name" = \'a\'))' + }, + params: [1, 'a'] +}); + +Harness.test({ + query: user.select().and(user.id.equals(1)), + pg: { + text: 'SELECT "user".* FROM "user" WHERE ("user"."id" = $1)', + string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` WHERE (`user`.`id` = ?)', + string: 'SELECT `user`.* FROM `user` WHERE (`user`.`id` = 1)' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" WHERE ("user"."id" = $1)', + string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' + }, + mssql: { + text: 'SELECT [user].* FROM [user] WHERE ([user].[id] = @1)', + string: 'SELECT [user].* FROM [user] WHERE ([user].[id] = 1)' + }, + oracle: { + text: 'SELECT "user".* FROM "user" WHERE ("user"."id" = :1)', + string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' + }, + params: [1] +}); + +Harness.test({ + query: user.select().or(user.id.equals(1)), + pg: { + text: 'SELECT "user".* FROM "user" WHERE ("user"."id" = $1)', + string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` WHERE (`user`.`id` = ?)', + string: 'SELECT `user`.* FROM `user` WHERE (`user`.`id` = 1)' + }, + sqlite: { + text: 'SELECT "user".* FROM "user" WHERE ("user"."id" = $1)', + string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' + }, + mssql: { + text: 'SELECT [user].* FROM [user] WHERE ([user].[id] = @1)', + string: 'SELECT [user].* FROM [user] WHERE ([user].[id] = 1)' + }, + oracle: { + text: 'SELECT "user".* FROM "user" WHERE ("user"."id" = :1)', + string: 'SELECT "user".* FROM "user" WHERE ("user"."id" = 1)' + }, + params: [1] +}); + +Harness.test({ + query: user + .select() + .and(user.id.equals(1)) + .or(user.name.equals('a')), + pg: { + text: 'SELECT "user".* FROM "user" WHERE (("user"."id" = $1) OR ("user"."name" = $2))', + string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) OR ("user"."name" = \'a\'))' + }, + mysql: { + text: 'SELECT `user`.* FROM `user` WHERE ((`user`.`id` = ?) OR (`user`.`name` = ?))', + string: "SELECT `user`.* FROM `user` WHERE ((`user`.`id` = 1) OR (`user`.`name` = 'a'))" + }, + sqlite: { + text: 'SELECT "user".* FROM "user" WHERE (("user"."id" = $1) OR ("user"."name" = $2))', + string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) OR ("user"."name" = \'a\'))' + }, + mssql: { + text: 'SELECT [user].* FROM [user] WHERE (([user].[id] = @1) OR ([user].[name] = @2))', + string: "SELECT [user].* FROM [user] WHERE (([user].[id] = 1) OR ([user].[name] = 'a'))" + }, + oracle: { + text: 'SELECT "user".* FROM "user" WHERE (("user"."id" = :1) OR ("user"."name" = :2))', + string: 'SELECT "user".* FROM "user" WHERE (("user"."id" = 1) OR ("user"."name" = \'a\'))' + }, + params: [1, 'a'] +}); diff --git a/test/function-tests.js b/test/function-tests.js deleted file mode 100644 index 6c53072d..00000000 --- a/test/function-tests.js +++ /dev/null @@ -1,93 +0,0 @@ -'use strict'; -var assert = require('assert'); - -var sql = require(__dirname + '/../lib').setDialect('postgres'); - -var user = sql.define({ - name: 'user', - columns: [ - {name: 'id'}, - {name:'email'}, - {name: 'name'}, - {name: 'age', property: 'howOld'} - ] -}); - -suite('function', function() { - test('alias function call', function() { - var upper = sql.functions.UPPER; - var aliasedUpper = upper(user.email).as('upperAlias').toQuery(); - - assert.equal(aliasedUpper.text, 'UPPER("user"."email") AS "upperAlias"'); - }); - - test('function call on aliased column', function() { - var round = sql.functions.ROUND; - var aliasedRound = round(user.howOld, 2).toQuery(); - - assert.equal(aliasedRound.text, 'ROUND("user"."age", $1)'); - assert.equal(aliasedRound.values[0], 2); - }); - - test('creating function call works', function() { - var upper = sql.functionCallCreator('UPPER'); - var functionCall = upper('hello', 'world').toQuery(); - - assert.equal(functionCall.text, 'UPPER($1, $2)'); - assert.equal(functionCall.values[0], 'hello'); - assert.equal(functionCall.values[1], 'world'); - }); - - test('creating function call on columns works', function() { - var upper = sql.functionCallCreator('UPPER'); - var functionCall = upper(user.id, user.email).toQuery(); - - assert.equal(functionCall.text, 'UPPER("user"."id", "user"."email")'); - assert.equal(functionCall.values.length, 0); - }); - - test('function call inside select works', function() { - var upper = sql.functionCallCreator('UPPER'); - var query = sql.select(upper(user.id, user.email)).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toQuery(); - - assert.equal(query.text, 'SELECT UPPER("user"."id", "user"."email") FROM "user" WHERE ("user"."email" = $1)'); - assert.equal(query.values[0], 'brian.m.carlson@gmail.com'); - }); - - test('standard aggregate functions with having clause', function() { - var count = sql.functions.COUNT; - var distinct = sql.functions.DISTINCT; - var distinctEmailCount = count(distinct(user.email)); - - var query = user.select(user.id, distinctEmailCount).group(user.id).having(distinctEmailCount.gt(100)).toQuery(); - - assert.equal(query.text, 'SELECT "user"."id", COUNT(DISTINCT("user"."email")) FROM "user" GROUP BY "user"."id" HAVING (COUNT(DISTINCT("user"."email")) > $1)'); - assert.equal(query.values[0], 100); - }); - - test('custom and standard functions behave the same', function() { - var standardUpper = sql.functions.UPPER; - var customUpper = sql.functionCallCreator('UPPER'); - - var standardQuery = user.select(standardUpper(user.name)).toQuery(); - var customQuery = user.select(customUpper(user.name)).toQuery(); - - var expectedQuery = 'SELECT UPPER("user"."name") FROM "user"'; - assert.equal(standardQuery.text, expectedQuery); - assert.equal(customQuery.text, expectedQuery); - }); - - test('combine function with operations', function() { - var f = sql.functions; - var query = user.select(f.AVG(f.DISTINCT(f.COUNT(user.id).plus(f.MAX(user.id))).minus(f.MIN(user.id))).multiply(100)).toQuery(); - - assert.equal(query.text, 'SELECT (AVG((DISTINCT((COUNT("user"."id") + MAX("user"."id"))) - MIN("user"."id"))) * $1) FROM "user"'); - assert.equal(query.values[0], 100); - }); - - test('use custom function', function() { - var query = user.select(sql.function('PHRASE_TO_TSQUERY')('simple', user.name)).toQuery(); - assert.equal(query.text, 'SELECT PHRASE_TO_TSQUERY($1, "user"."name") FROM "user"'); - assert.equal(query.values[0], 'simple'); - }); -}); diff --git a/test/function-tests.ts b/test/function-tests.ts new file mode 100644 index 00000000..29f9bb33 --- /dev/null +++ b/test/function-tests.ts @@ -0,0 +1,102 @@ +'use strict'; +import { equal } from 'assert'; + +import { Sql } from '../lib'; +const instance = new Sql('postgres'); + +const user = instance.define<{ id: string; email: string; name: string; howOld: number }>({ + name: 'user', + columns: [{ name: 'id' }, { name: 'email' }, { name: 'name' }, { name: 'age', property: 'howOld' }] +}); + +suite('function', function() { + test('alias function call', function() { + const upper = instance.functions.UPPER; + const aliasedUpper = upper(user.email) + .as('upperAlias') + .toQuery(); + + equal(aliasedUpper.text, 'UPPER("user"."email") AS "upperAlias"'); + }); + + test('function call on aliased column', function() { + const round = instance.functions.ROUND; + const aliasedRound = round(user.howOld, 2).toQuery(); + + equal(aliasedRound.text, 'ROUND("user"."age", $1)'); + equal(aliasedRound.values[0], 2); + }); + + test('creating function call works', function() { + const upper = instance.function('UPPER'); + const functionCall = upper('hello', 'world').toQuery(); + + equal(functionCall.text, 'UPPER($1, $2)'); + equal(functionCall.values[0], 'hello'); + equal(functionCall.values[1], 'world'); + }); + + test('creating function call on columns works', function() { + const upper = instance.function('UPPER'); + const functionCall = upper(user.id, user.email).toQuery(); + + equal(functionCall.text, 'UPPER("user"."id", "user"."email")'); + equal(functionCall.values.length, 0); + }); + + test('function call inside select works', function() { + const upper = instance.function('UPPER'); + const query = instance + .select(upper(user.id, user.email)) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toQuery(); + + equal(query.text, 'SELECT UPPER("user"."id", "user"."email") FROM "user" WHERE ("user"."email" = $1)'); + equal(query.values[0], 'brian.m.carlson@gmail.com'); + }); + + test('standard aggregate functions with having clause', function() { + const count = instance.functions.COUNT; + const distinct = instance.functions.DISTINCT; + const distinctEmailCount = count(distinct(user.email)); + + const query = user + .select(user.id, distinctEmailCount) + .group(user.id) + .having(distinctEmailCount.gt(100)) + .toQuery(); + + equal( + query.text, + 'SELECT "user"."id", COUNT(DISTINCT("user"."email")) FROM "user" GROUP BY "user"."id" HAVING (COUNT(DISTINCT("user"."email")) > $1)' + ); + equal(query.values[0], 100); + }); + + test('custom and standard functions behave the same', function() { + const standardUpper = instance.functions.UPPER; + const customUpper = instance.function('UPPER'); + + const standardQuery = user.select(standardUpper(user.name)).toQuery(); + const customQuery = user.select(customUpper(user.name)).toQuery(); + + const expectedQuery = 'SELECT UPPER("user"."name") FROM "user"'; + equal(standardQuery.text, expectedQuery); + equal(customQuery.text, expectedQuery); + }); + + test('combine function with operations', function() { + const f = instance.functions; + const query = user.select(f.AVG(f.DISTINCT(f.COUNT(user.id).plus(f.MAX(user.id))).minus(f.MIN(user.id))).multiply(100)).toQuery(); + + equal(query.text, 'SELECT (AVG((DISTINCT((COUNT("user"."id") + MAX("user"."id"))) - MIN("user"."id"))) * $1) FROM "user"'); + equal(query.values[0], 100); + }); + + test('use custom function', function() { + const query = user.select(instance.function('PHRASE_TO_TSQUERY')('simple', user.name)).toQuery(); + equal(query.text, 'SELECT PHRASE_TO_TSQUERY($1, "user"."name") FROM "user"'); + equal(query.values[0], 'simple'); + }); +}); diff --git a/test/index-tests.js b/test/index-tests.js deleted file mode 100644 index f25839e1..00000000 --- a/test/index-tests.js +++ /dev/null @@ -1,214 +0,0 @@ -'use strict'; -var assert = require('assert'); - -var sql = require('../lib'); - -var user = sql.define({ - name: 'user', - columns: ['id', 'email'] -}); - -suite('index', function() { - test('unknown dialect throws exception', function() { - assert.throws(function() { - sql.setDialect('asdf'); - }); - }); - - test('stores the default dialect\'s name if none has been passed', function() { - assert.equal(sql.create().dialectName, 'postgres'); - }); - - test('stores the sqlite dialect', function() { - assert.equal(sql.create('sqlite').dialectName, 'sqlite'); - }); - - test('stores the mysql dialect', function() { - assert.equal(sql.create('mysql').dialectName, 'mysql'); - }); - - test('stores the mssql dialect', function() { - assert.equal(sql.create('mssql').dialectName, 'mssql'); - }); - - test('stores the oracle dialect', function() { - assert.equal(sql.create('oracle').dialectName, 'oracle'); - }); - - - test('can create a query using the default dialect', function() { - var query = sql.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toQuery(); - assert.equal(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - assert.equal(query.values[0], 'brian.m.carlson@gmail.com'); - }); - - test('setting dialect to postgres works', function() { - sql.setDialect('postgres'); - var query = sql.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toQuery(); - assert.equal(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - assert.equal(query.values[0], 'brian.m.carlson@gmail.com'); - }); - - test('sql.create creates an instance with a new dialect', function() { - var mysql = sql.create('mysql'); - var query = mysql.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toQuery(); - assert.equal(query.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); - assert.equal(query.values[0], 'brian.m.carlson@gmail.com'); - }); - - test('sql.define for parallel dialects work independently', function() { - var mssql = sql.create('mssql'); - var mysql = sql.create('mysql'); - var postgres = sql.create('postgres'); - var sqlite = sql.create('sqlite'); - var oracle = sql.create('oracle'); - - var mssqlTable = mssql.define({name: 'table', columns: ['column']}); - var mysqlTable = mysql.define({name: 'table', columns: ['column']}); - var postgresTable = postgres.define({name: 'table', columns: ['column']}); - var sqliteTable = sqlite.define({name: 'table', columns: ['column']}); - var oracleTable = oracle.define({name: 'table', columns: ['column']}); - - assert.equal(mysqlTable.sql, mysql); - assert.equal(postgresTable.sql, postgres); - assert.equal(sqliteTable.sql, sqlite); - assert.equal(mssqlTable.sql, mssql); - assert.equal(oracleTable.sql, oracle); - }); - - test('using Sql as a class', function() { - var Sql = sql.Sql; - var mssql = new Sql('mssql'); - var mysql = new Sql('mysql'); - var postgres = new Sql('postgres'); - var sqlite = new Sql('sqlite'); - var oracle = new Sql('oracle'); - - assert.equal(mysql.dialect, require(__dirname + '/../lib/dialect/mysql')); - assert.equal(postgres.dialect, require(__dirname + '/../lib/dialect/postgres')); - assert.equal(sqlite.dialect, require(__dirname + '/../lib/dialect/sqlite')); - assert.equal(mssql.dialect, require(__dirname + '/../lib/dialect/mssql')); - assert.equal(oracle.dialect, require(__dirname + '/../lib/dialect/oracle')); - }); - - test('override dialect for toQuery using dialect name', function() { - var Sql = sql.Sql; - var mssql = new Sql('mssql'); - var mysql = new Sql('mysql'); - var postgres = new Sql('postgres'); - var sqlite = new Sql('sqlite'); - var oracle = new Sql('oracle'); - - var sqliteQuery = mysql.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toQuery('sqlite'); - var postgresQuery = sqlite.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toQuery('postgres'); - var mysqlQuery = postgres.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toQuery('mysql'); - var mssqlQuery = mysql.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toQuery('mssql'); - var oracleQuery = oracle.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toQuery('oracle'); - - var values = ['brian.m.carlson@gmail.com']; - assert.equal(sqliteQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - assert.deepEqual(sqliteQuery.values, values); - - assert.equal(postgresQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - assert.deepEqual(postgresQuery.values, values); - - assert.equal(mysqlQuery.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); - assert.deepEqual(mysqlQuery.values, values); - - assert.equal(mssqlQuery.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); - assert.deepEqual(mssqlQuery.values, values); - - assert.equal(oracleQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = :1)'); - assert.deepEqual(oracleQuery.values, values); - }); - - test('override dialect for toQuery using invalid dialect name', function() { - var query = sql.select(user.id).from(user); - assert.throws(function() { - query.toQuery('invalid'); - }); - }); - - test('using named queries with toNamedQuery', function() { - var query = sql.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toNamedQuery('users'); - assert.equal(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - assert.equal(query.values[0], 'brian.m.carlson@gmail.com'); - assert.equal(query.name, 'users'); - }); - - test('provide an empty query name for toNamedQuery', function() { - var query = sql.select(user.id).from(user); - assert.throws(function() { - query.toNamedQuery(''); - }); - }); - - test('provide an undefined query name for toNamedQuery', function() { - var query = sql.select(user.id).from(user); - assert.throws(function() { - query.toNamedQuery(); - }); - }); - - test('override dialect for toNamedQuery using dialect name', function() { - var Sql = sql.Sql; - var mysql = new Sql('mysql'); - var postgres = new Sql('postgres'); - var sqlite = new Sql('sqlite'); - var mssql = new Sql('mssql'); - var oracle = new Sql('oracle'); - - var sqliteQuery = mysql.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toNamedQuery('user.select_brian','sqlite'); - var postgresQuery = sqlite.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toNamedQuery('user.select_brian','postgres'); - var mysqlQuery = postgres.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toNamedQuery('user.select_brian','mysql'); - var oracleQuery = mssql.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toNamedQuery('user.select_brian','oracle'); - var mssqlQuery = oracle.select(user.id).from(user).where(user.email.equals('brian.m.carlson@gmail.com')).toNamedQuery('user.select_brian','mssql'); - - - var values = ['brian.m.carlson@gmail.com']; - assert.equal(sqliteQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - assert.deepEqual(sqliteQuery.values, values); - assert.equal('user.select_brian', sqliteQuery.name); - - assert.equal(postgresQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - assert.deepEqual(postgresQuery.values, values); - assert.equal('user.select_brian', postgresQuery.name); - - assert.equal(mysqlQuery.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); - assert.deepEqual(mysqlQuery.values, values); - assert.equal('user.select_brian', mysqlQuery.name); - - assert.equal(mssqlQuery.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); - assert.deepEqual(mssqlQuery.values, values); - assert.equal('user.select_brian', mssqlQuery.name); - - assert.equal(oracleQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = :1)'); - assert.deepEqual(oracleQuery.values, values); - assert.equal('user.select_brian', oracleQuery.name); - - }); - - test('override dialect for toNamedQuery using invalid dialect name', function() { - var query = sql.select(user.id).from(user); - assert.throws(function() { - query.toNamedQuery('name', 'invalid'); - }); - }); - - test('mssql default parameter place holder is @index', function() { - var Sql = sql.Sql; - var mssql = new Sql('mssql'); - var query = mssql.select(user.id).from(user).where(user.email.equals('x@y.com')).toQuery(); - assert.equal(query.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); - assert.equal(query.values[0], 'x@y.com'); - }); - - test('mssql override default parameter placeholder with ?', function() { - var Sql = sql.Sql; - var mssql = new Sql('mssql',{questionMarkParameterPlaceholder:true}); - var query = mssql.select(user.id).from(user).where(user.email.equals('x@y.com')).toQuery(); - assert.equal(query.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = ?)'); - assert.equal(query.values[0], 'x@y.com'); - }); - -}); diff --git a/test/index-tests.ts b/test/index-tests.ts new file mode 100644 index 00000000..77f26592 --- /dev/null +++ b/test/index-tests.ts @@ -0,0 +1,274 @@ +'use strict'; +import { throws, equal, deepEqual } from 'assert'; + +import { Sql } from '../lib'; + +const instance = new Sql(); +const user = instance.define<{ id: string; email: string }>({ + name: 'user', + columns: ['id', 'email'] +}); + +suite('index', function() { + test('unknown dialect throws exception', function() { + throws(function() { + // for testing purposes ignore the compile-time error + //@ts-ignore + instance.setDialect('asdf'); + }); + }); + + test("stores the default dialect's name if none has been passed", function() { + equal(new Sql().dialectName, 'postgres'); + }); + + test('stores the sqlite dialect', function() { + equal(new Sql('sqlite').dialectName, 'sqlite'); + }); + + test('stores the mysql dialect', function() { + equal(new Sql('mysql').dialectName, 'mysql'); + }); + + test('stores the mssql dialect', function() { + equal(new Sql('mssql').dialectName, 'mssql'); + }); + + test('stores the oracle dialect', function() { + equal(new Sql('oracle').dialectName, 'oracle'); + }); + + test('can create a query using the default dialect', function() { + const query = instance + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toQuery(); + equal(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + equal(query.values[0], 'brian.m.carlson@gmail.com'); + }); + + test('setting dialect to postgres works', function() { + instance.setDialect('postgres'); + const query = instance + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toQuery(); + equal(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + equal(query.values[0], 'brian.m.carlson@gmail.com'); + }); + + test('sql.create creates an instance with a new dialect', function() { + const mysql = new Sql('mysql'); + const query = mysql + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toQuery(); + equal(query.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); + equal(query.values[0], 'brian.m.carlson@gmail.com'); + }); + + test('sql.define for parallel dialects work independently', function() { + const mssql = new Sql('mssql'); + const mysql = new Sql('mysql'); + const postgres = new Sql('postgres'); + const sqlite = new Sql('sqlite'); + const oracle = new Sql('oracle'); + + const mssqlTable = mssql.define({ name: 'table', columns: ['column'] }); + const mysqlTable = mysql.define({ name: 'table', columns: ['column'] }); + const postgresTable = postgres.define({ name: 'table', columns: ['column'] }); + const sqliteTable = sqlite.define({ name: 'table', columns: ['column'] }); + const oracleTable = oracle.define({ name: 'table', columns: ['column'] }); + + equal(mysqlTable.sql, mysql); + equal(postgresTable.sql, postgres); + equal(sqliteTable.sql, sqlite); + equal(mssqlTable.sql, mssql); + equal(oracleTable.sql, oracle); + }); + + test('using Sql as a class', function() { + const mssql = new Sql('mssql'); + const mysql = new Sql('mysql'); + const postgres = new Sql('postgres'); + const sqlite = new Sql('sqlite'); + const oracle = new Sql('oracle'); + + equal(mysql.dialect, require('../lib/dialect/mysql').Mysql); + equal(postgres.dialect, require('../lib/dialect/postgres').Postgres); + equal(sqlite.dialect, require('../lib/dialect/sqlite').Sqlite); + equal(mssql.dialect, require('../lib/dialect/mssql').Mssql); + equal(oracle.dialect, require('../lib/dialect/oracle').Oracle); + }); + + test('override dialect for toQuery using dialect name', function() { + const mssql = new Sql('mssql'); + const mysql = new Sql('mysql'); + const postgres = new Sql('postgres'); + const sqlite = new Sql('sqlite'); + const oracle = new Sql('oracle'); + + const sqliteQuery = mysql + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toQuery('sqlite'); + const postgresQuery = sqlite + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toQuery('postgres'); + const mysqlQuery = postgres + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toQuery('mysql'); + const mssqlQuery = mssql + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toQuery('mssql'); + const oracleQuery = oracle + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toQuery('oracle'); + + const values = ['brian.m.carlson@gmail.com']; + equal(sqliteQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + deepEqual(sqliteQuery.values, values); + + equal(postgresQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + deepEqual(postgresQuery.values, values); + + equal(mysqlQuery.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); + deepEqual(mysqlQuery.values, values); + + equal(mssqlQuery.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); + deepEqual(mssqlQuery.values, values); + + equal(oracleQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = :1)'); + deepEqual(oracleQuery.values, values); + }); + + test('override dialect for toQuery using invalid dialect name', function() { + const query = instance.select(user.id).from(user); + throws(function() { + query.toQuery('invalid'); + }); + }); + + test('using named queries with toNamedQuery', function() { + const query = instance + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toNamedQuery('users'); + equal(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + equal(query.values[0], 'brian.m.carlson@gmail.com'); + equal(query.name, 'users'); + }); + + test('provide an empty query name for toNamedQuery', function() { + const query = instance.select(user.id).from(user); + throws(function() { + query.toNamedQuery(''); + }); + }); + + test('provide an undefined query name for toNamedQuery', function() { + const query = instance.select(user.id).from(user); + throws(function() { + // for testing purposes ignore the compile-time error + //@ts-ignore + query.toNamedQuery(); + }); + }); + + test('override dialect for toNamedQuery using dialect name', function() { + const mysql = new Sql('mysql'); + const postgres = new Sql('postgres'); + const sqlite = new Sql('sqlite'); + const mssql = new Sql('mssql'); + const oracle = new Sql('oracle'); + + const sqliteQuery = mysql + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toNamedQuery('user.select_brian', 'sqlite'); + const postgresQuery = sqlite + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toNamedQuery('user.select_brian', 'postgres'); + const mysqlQuery = postgres + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toNamedQuery('user.select_brian', 'mysql'); + const oracleQuery = mssql + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toNamedQuery('user.select_brian', 'oracle'); + const mssqlQuery = oracle + .select(user.id) + .from(user) + .where(user.email.equals('brian.m.carlson@gmail.com')) + .toNamedQuery('user.select_brian', 'mssql'); + + const values = ['brian.m.carlson@gmail.com']; + equal(sqliteQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + deepEqual(sqliteQuery.values, values); + equal('user.select_brian', sqliteQuery.name); + + equal(postgresQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + deepEqual(postgresQuery.values, values); + equal('user.select_brian', postgresQuery.name); + + equal(mysqlQuery.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); + deepEqual(mysqlQuery.values, values); + equal('user.select_brian', mysqlQuery.name); + + equal(mssqlQuery.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); + deepEqual(mssqlQuery.values, values); + equal('user.select_brian', mssqlQuery.name); + + equal(oracleQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = :1)'); + deepEqual(oracleQuery.values, values); + equal('user.select_brian', oracleQuery.name); + }); + + test('override dialect for toNamedQuery using invalid dialect name', function() { + const query = instance.select(user.id).from(user); + throws(function() { + query.toNamedQuery('name', 'invalid'); + }); + }); + + test('mssql default parameter place holder is @index', function() { + const mssql = new Sql('mssql'); + const query = mssql + .select(user.id) + .from(user) + .where(user.email.equals('x@y.com')) + .toQuery(); + equal(query.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); + equal(query.values[0], 'x@y.com'); + }); + + test('mssql override default parameter placeholder with ?', function() { + const mssql = new Sql('mssql', { questionMarkParameterPlaceholder: true }); + const query = mssql + .select(user.id) + .from(user) + .where(user.email.equals('x@y.com')) + .toQuery(); + equal(query.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = ?)'); + equal(query.values[0], 'x@y.com'); + }); +}); diff --git a/test/index.js b/test/index.js deleted file mode 100644 index eb7a60b0..00000000 --- a/test/index.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -var fs = require('fs'); -var path = require('path'); - -var testDir = __dirname; - -var directories = [ - testDir + '/dialects' -]; - -directories.forEach(function (d) { - var files = fs.readdirSync(d); - /*jshint boss: true */ - for(var i = 0, file; file = files[i]; i++) { - var filePath = path.join(d, file); - if (path.extname(file) === '.js') { - require(filePath); - } - } -}); diff --git a/test/index.ts b/test/index.ts new file mode 100644 index 00000000..46d260fa --- /dev/null +++ b/test/index.ts @@ -0,0 +1,19 @@ +'use strict'; + +import { readdirSync } from 'fs'; +import { join, extname } from 'path'; + +const testDir = __dirname; + +const directories = [testDir + '/dialects']; + +directories.forEach((d) => { + const files = readdirSync(d); + /*jshint boss: true */ + for (let i = 0, file: string; (file = files[i]); i++) { + const filePath = join(d, file); + if (extname(file) === '.ts') { + require(filePath); + } + } +}); diff --git a/test/mocha.opts b/test/mocha.opts index 850a6c2f..3a40897e 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -1,2 +1,5 @@ --reporter dot --ui tdd +--require ts-node/register +--watch-extensions tsx,ts +test/*.ts diff --git a/test/select-tests.js b/test/select-tests.js deleted file mode 100644 index a0befc4c..00000000 --- a/test/select-tests.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -var assert = require('assert'); -var Select = require(__dirname + '/../lib/node/select'); - -var select = new Select({sql: require('../lib/index')}); - -test('has SELECT type', function() { - assert.equal(select.type, 'SELECT'); -}); - - -test('can go toQuery', function() { - assert.equal(select.toQuery().text, 'SELECT '); -}); diff --git a/test/select-tests.ts b/test/select-tests.ts new file mode 100644 index 00000000..db14e32c --- /dev/null +++ b/test/select-tests.ts @@ -0,0 +1,10 @@ +'use strict'; + +import { equal } from 'assert'; +import { SelectNode } from '../lib/node'; + +const select = new SelectNode(); + +test('has SELECT type', function() { + equal(select.type, 'SELECT'); +}); diff --git a/test/table-tests.js b/test/table-tests.js deleted file mode 100644 index 73d43367..00000000 --- a/test/table-tests.js +++ /dev/null @@ -1,273 +0,0 @@ -'use strict'; -var assert = require('assert'); - -var Table = require(__dirname + '/../lib/table'); -var Column = require(__dirname + '/../lib/column'); -var Sql = require('../'); - -suite('table', function() { - var table = new Table({ - name: 'bang' - }); - - test('has name', function() { - assert.equal(table.getName(), 'bang'); - }); - - test('has no columns', function() { - assert.equal(table.columns.length, 0); - }); - - test('can add column', function() { - var col = new Column({ - table: table, - name: 'boom' - }); - - assert.equal(col.name, 'boom'); - assert.equal(col.table.getName(), 'bang'); - - table.addColumn(col); - assert.equal(table.columns.length, 1); - assert.equal(table.boom, col); - }); - - test('creates query node', function() { - var sel = table.select(table.boom); - assert.equal(sel.type, 'QUERY'); - }); - - test('creates *-query if no args is provided to select()', function() { - var sel = table.select(); - assert.ok(sel.nodes[0].nodes[0].star); - }); - - test('can be defined', function() { - var user = Table.define({ - name: 'user', - columns: ['id', 'name'] - }); - assert.equal(user.getName(), 'user'); - assert.equal(user.columns.length, 2); - assert.equal(user.columns[0].name, 'id'); - assert.equal(user.columns[1].name, 'name'); - assert.equal(user.columns[0].name, user.id.name); - assert.equal(user.id.table, user); - assert.equal(user.name.table, user); - }); -}); - -test('table with user-defined column property names', function () { - var table = Table.define({ - name: 'blah', - columns: [{ - name: 'id', - property: 'theId' - }, { - name: 'email', - property: 'uniqueEmail' - }] - }); - var cols = table.columns; - assert.equal(cols.length, 2); - assert.equal(cols[0].name, 'id'); - assert(cols[0] === table.theId, 'Expected table.theId to be the first column'); - assert(table.id === undefined, 'Expected table.id to not exist'); - assert.equal(cols[1].name, 'email'); - assert(cols[1] === table.uniqueEmail, 'Expected table.uniqueEmail to be the second column'); - assert(table.email === undefined, 'Expected table.email to not exist'); -}); - -test('table with fancier column definitions', function() { - var table = Table.define({ - name: 'blah', - columns: [{ - name: 'id', - type: 'serial', - notNull: true, - primaryKey: true - }, { - name: 'email', - type: 'text', - notNull: true, - unique: true, - anythingYouWant: 'awesome' - }] - }); - var cols = table.columns; - assert.equal(cols.length, 2); - var id = cols[0]; - assert.equal(id.name, 'id'); - assert.equal(id.type, 'serial'); - assert.equal(id.notNull, true); - assert.equal(id.primaryKey, true); - var email = cols[1]; - assert.equal(email.name, 'email'); - assert.equal(email.type, 'text'); - assert.equal(email.notNull, true); - assert.equal(email.unique, true); - assert.equal(email.anythingYouWant, 'awesome'); -}); - -test('table with object structured column definitions', function() { - var table = Table.define({ - name: 'blah', - columns: { - id: { - type: 'serial', - notNull: true, - primaryKey: true - }, - email: { - type: 'text', - notNull: true, - unique: true, - anythingYouWant: 'awesome' - } - } - }); - var cols = table.columns; - assert.equal(cols.length, 2); - var id = cols[0]; - assert.equal(id.name, 'id'); - assert.equal(id.type, 'serial'); - assert.equal(id.notNull, true); - assert.equal(id.primaryKey, true); - var email = cols[1]; - assert.equal(email.name, 'email'); - assert.equal(email.type, 'text'); - assert.equal(email.notNull, true); - assert.equal(email.unique, true); - assert.equal(email.anythingYouWant, 'awesome'); -}); - -test('table with dynamic column definition', function() { - var table = Table.define({ name: 'foo', columns: [] }); - assert.equal(table.columns.length, 0); - - table.addColumn('foo'); - assert.equal(table.columns.length, 1); - - assert.throws(function() { - table.addColumn('foo'); - }); - - assert.doesNotThrow(function() { - table.addColumn('foo', { noisy: false }); - }); - - assert.equal(table.columns.length, 1); -}); - -test('hasColumn', function() { - var table = Table.define({ name: 'foo', columns: [] }); - - assert.equal(table.hasColumn('baz'), false); - table.addColumn('baz'); - assert.equal(table.hasColumn('baz'), true); -}); - -test('hasColumn with user-defined column property', function() { - var table = Table.define({ - name: 'blah', - columns: [{ - name: 'id', - property: 'theId' - }, {name: 'foo'}] - }); - - assert.equal(table.hasColumn('id'), true); - assert.equal(table.hasColumn('theId'), true); -}); - -test('the column "from" does not overwrite the from method', function() { - var table = Table.define({ name: 'foo', columns: [] }); - table.addColumn('from'); - assert.equal(typeof table.from, 'function'); -}); - -test('getColumn returns the from column', function() { - var table = Table.define({ name: 'foo', columns: [] }); - table.addColumn('from'); - assert(table.getColumn('from') instanceof Column); - assert(table.get('from') instanceof Column); -}); - -test('set and get schema', function () { - var table = Table.define({ name: 'foo', schema: 'bar', columns: [] }); - assert.equal(table.getSchema(), 'bar'); - table.setSchema('barbarz'); - assert.equal(table.getSchema(), 'barbarz'); -}); - -suite('table.clone', function() { - test('check if it is a copy, not just a reference', function() { - var table = Table.define({ name: 'foo', columns: [] }); - var copy = table.clone(); - assert.notEqual(table, copy); - }); - - test('copy columns', function() { - var table = Table.define({ name: 'foo', columns: ['bar'] }); - var copy = table.clone(); - assert(copy.get('bar') instanceof Column); - }); - - test('overwrite config while copying', function() { - var table = Table.define({ - name: 'foo', - schema: 'foobar', - columns: ['bar'], - snakeToCamel: true, - columnWhiteList: true - }); - - var copy = table.clone({ - schema: 'test', - snakeToCamel: false, - columnWhiteList: false - }); - - assert.equal(copy.getSchema(), 'test'); - assert.equal(copy.snakeToCamel, false); - assert.equal(copy.columnWhiteList, false); - }); -}); - -test('dialects', function () { - var sql = new Sql.Sql('mysql'); - var foo = sql.define({ name: 'foo', columns: [ 'id' ] }), - bar = sql.define({ name: 'bar', columns: [ 'id' ] }); - - var actual = foo.join(bar).on(bar.id.equals(1)).toString(); - assert.equal(actual, '`foo` INNER JOIN `bar` ON (`bar`.`id` = 1)'); - - sql = new Sql.Sql('postgres'); - foo = sql.define({ name: 'foo', columns: [ 'id' ] }); - bar = sql.define({ name: 'bar', columns: [ 'id' ] }); - actual = foo.join(bar).on(bar.id.equals(1)).toString(); - assert.equal(actual, '"foo" INNER JOIN "bar" ON ("bar"."id" = 1)'); -}); - -test('limit', function () { - var user = Table.define({name: 'user', columns: ['id', 'name']}); - var query = user.limit(3); - assert.equal(query.nodes.length, 1); - assert.equal(query.nodes[0].type, 'LIMIT'); - assert.equal(query.nodes[0].count, 3); -}); - -test('offset', function () { - var user = Table.define({name: 'user', columns: ['id', 'name']}); - var query = user.offset(20); - assert.equal(query.nodes.length, 1); - assert.equal(query.nodes[0].type, 'OFFSET'); - assert.equal(query.nodes[0].count, 20); -}); - -test('order', function () { - var user = Table.define({name: 'user', columns: ['id', 'name']}); - var query = user.order(user.name); - assert.equal(query.nodes.length, 1); - assert.equal(query.nodes[0].type, 'ORDER BY'); -}); diff --git a/test/table-tests.ts b/test/table-tests.ts new file mode 100644 index 00000000..efd0ecca --- /dev/null +++ b/test/table-tests.ts @@ -0,0 +1,290 @@ +'use strict'; +import assert = require('assert'); +import { equal, ok, throws, doesNotThrow, notEqual } from 'assert'; + +import { Table } from '../lib/table'; +import { Column } from '../lib/column'; +import { Sql } from '../lib'; +import { ColumnNode, ModifierNode } from '../lib/node'; + +suite('table', function() { + const table = new Table({ + name: 'bang' + } as any); + + test('has name', function() { + equal(table.getName(), 'bang'); + }); + + test('has no columns', function() { + equal(table.columns.length, 0); + }); + + test('can add column', function() { + const col = new Column({ + table: table, + name: 'boom' + }); + + equal(col.name, 'boom'); + equal(col.table!.getName(), 'bang'); + + table.addColumn(col); + equal(table.columns.length, 1); + //@ts-ignore column added after table created + equal(table.boom, col); + }); + + test('creates query node', function() { + //@ts-ignore column added after table created + const sel = table.select(table.boom); + equal(sel.type, 'QUERY'); + }); + + test('creates *-query if no args is provided to select()', function() { + const sel = table.select(); + ok((sel.nodes[0].nodes[0] as ColumnNode).star); + }); + + test('can be defined', function() { + const user = Table.define<{ id: number; name: string }>({ + name: 'user', + columns: ['id', 'name'] + }); + equal(user.getName(), 'user'); + equal(user.columns.length, 2); + equal(user.columns[0].name, 'id'); + equal(user.columns[1].name, 'name'); + equal(user.columns[0].name, user.id.name); + equal(user.id.table, user); + equal(user.name.table, user); + }); +}); + +test('table with user-defined column property names', function() { + const table = Table.define<{ theId: number; uniqueEmail: string }>({ + name: 'blah', + columns: [ + { + name: 'id', + property: 'theId' + }, + { + name: 'email', + property: 'uniqueEmail' + } + ] + }); + const cols = table.columns; + equal(cols.length, 2); + equal(cols[0].name, 'id'); + assert(cols[0] === table.theId, 'Expected table.theId to be the first column'); + //@ts-ignore id doesn't exist + assert(table.id === undefined, 'Expected table.id to not exist'); + equal(cols[1].name, 'email'); + assert(cols[1] === table.uniqueEmail, 'Expected table.uniqueEmail to be the second column'); + //@ts-ignore email doesn't exist + assert(table.email === undefined, 'Expected table.email to not exist'); +}); + +test('table with fancier column definitions', function() { + const table = Table.define({ + name: 'blah', + columns: [ + { + name: 'id', + dataType: 'serial', + notNull: true, + primaryKey: true + }, + { + name: 'email', + dataType: 'text', + notNull: true, + unique: true + } + ] + }); + const cols = table.columns; + equal(cols.length, 2); + const id = cols[0]; + equal(id.name, 'id'); + equal(id.dataType, 'serial'); + equal(id.notNull, true); + equal(id.primaryKey, true); + const email = cols[1]; + equal(email.name, 'email'); + equal(email.dataType, 'text'); + equal(email.notNull, true); + equal(email.unique, true); +}); + +test('table with object structured column definitions', function() { + const table = Table.define({ + name: 'blah', + columns: { + id: { + dataType: 'serial', + notNull: true, + primaryKey: true + }, + email: { + dataType: 'text', + notNull: true, + unique: true + } + } + }); + const cols = table.columns; + equal(cols.length, 2); + const id = cols[0]; + equal(id.name, 'id'); + equal(id.dataType, 'serial'); + equal(id.notNull, true); + equal(id.primaryKey, true); + const email = cols[1]; + equal(email.name, 'email'); + equal(email.dataType, 'text'); + equal(email.notNull, true); + equal(email.unique, true); +}); + +test('table with dynamic column definition', function() { + const table = Table.define({ name: 'foo', columns: [] }); + equal(table.columns.length, 0); + + table.addColumn('foo'); + equal(table.columns.length, 1); + + throws(function() { + table.addColumn('foo'); + }); + + doesNotThrow(function() { + table.addColumn('foo', { noisy: false }); + }); + + equal(table.columns.length, 1); +}); + +test('hasColumn', function() { + const table = Table.define({ name: 'foo', columns: [] }); + + equal(table.hasColumn('baz'), false); + table.addColumn('baz'); + equal(table.hasColumn('baz'), true); +}); + +test('hasColumn with user-defined column property', function() { + const table = Table.define({ + name: 'blah', + columns: [ + { + name: 'id', + property: 'theId' + }, + { name: 'foo' } + ] + }); + + equal(table.hasColumn('id'), true); + equal(table.hasColumn('theId'), true); +}); + +test('the column "from" does not overwrite the from method', function() { + const table = Table.define({ name: 'foo', columns: [] }); + table.addColumn('from'); + equal(typeof table.from, 'function'); +}); + +test('getColumn returns the from column', function() { + const table = Table.define({ name: 'foo', columns: [] }); + table.addColumn('from'); + assert(table.getColumn('from') instanceof Column); + assert(table.get('from') instanceof Column); +}); + +test('set and get schema', function() { + const table = Table.define({ name: 'foo', schema: 'bar', columns: [] }); + equal(table.getSchema(), 'bar'); + table.setSchema('barbarz'); + equal(table.getSchema(), 'barbarz'); +}); + +suite('table.clone', function() { + test('check if it is a copy, not just a reference', function() { + const table = Table.define({ name: 'foo', columns: [] }); + const copy = table.clone(); + notEqual(table, copy); + }); + + test('copy columns', function() { + const table = Table.define({ name: 'foo', columns: ['bar'] }); + const copy = table.clone(); + assert(copy.get('bar') instanceof Column); + }); + + test('overwrite config while copying', function() { + const table = Table.define({ + name: 'foo', + schema: 'foobar', + columns: ['bar'], + snakeToCamel: true, + columnWhiteList: true + }); + + const copy = table.clone({ + schema: 'test', + snakeToCamel: false, + columnWhiteList: false + }); + + equal(copy.getSchema(), 'test'); + equal(copy.snakeToCamel, false); + equal(copy.columnWhiteList, false); + }); +}); + +test('dialects', function() { + const sql1 = new Sql('mysql'); + const foo1 = sql1.define<{ id: number }>({ name: 'foo', columns: ['id'] }), + bar1 = sql1.define<{ id: number }>({ name: 'bar', columns: ['id'] }); + + const actual1 = foo1 + .join(bar1) + .on(bar1.id.equals(1)) + .toString(); + equal(actual1, '`foo` INNER JOIN `bar` ON (`bar`.`id` = 1)'); + + const sql2 = new Sql('postgres'); + const foo2 = sql2.define<{ id: number }>({ name: 'foo', columns: ['id'] }); + const bar2 = sql2.define<{ id: number }>({ name: 'bar', columns: ['id'] }); + const actual2 = foo2 + .join(bar2) + .on(bar2.id.equals(1)) + .toString(); + equal(actual2, '"foo" INNER JOIN "bar" ON ("bar"."id" = 1)'); +}); + +test('limit', function() { + const user = Table.define({ name: 'user', columns: ['id', 'name'] }); + const query = user.limit(3); + equal(query.nodes.length, 1); + equal(query.nodes[0].type, 'LIMIT'); + equal((query.nodes[0] as ModifierNode).count, 3); +}); + +test('offset', function() { + const user = Table.define({ name: 'user', columns: ['id', 'name'] }); + const query = user.offset(20); + equal(query.nodes.length, 1); + equal(query.nodes[0].type, 'OFFSET'); + equal((query.nodes[0] as ModifierNode).count, 20); +}); + +test('order', function() { + const user = Table.define<{ id: number; name: string }>({ name: 'user', columns: ['id', 'name'] }); + const query = user.order(user.name); + equal(query.nodes.length, 1); + equal(query.nodes[0].type, 'ORDER BY'); +}); diff --git a/test/ternary-clause-tests.js b/test/ternary-clause-tests.js deleted file mode 100644 index 1e7c975f..00000000 --- a/test/ternary-clause-tests.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var assert = require('assert'); -var Table = require(__dirname + '/../lib/table'); - -var Foo = Table.define({ - name: 'foo', - columns: ['baz','bar'] -}); - -test('operators', function() { - assert.equal(Foo.bar.between(1, 2).operator, 'BETWEEN'); - assert.equal(Foo.baz.between(1, 2).separator, 'AND'); -}); diff --git a/test/ternary-clause-tests.ts b/test/ternary-clause-tests.ts new file mode 100644 index 00000000..056a80ee --- /dev/null +++ b/test/ternary-clause-tests.ts @@ -0,0 +1,14 @@ +'use strict'; + +import assert = require('assert'); +import { Table } from '../lib/table'; + +const Foo = Table.define<{ baz: string; bar: string }>({ + name: 'foo', + columns: ['baz', 'bar'] +}); + +test('operators', function() { + assert.equal(Foo.bar.between(1, 2).operator, 'BETWEEN'); + assert.equal(Foo.baz.between(1, 2).separator, 'AND'); +}); diff --git a/test/tsconfig.json b/test/tsconfig.json new file mode 100644 index 00000000..a4db623e --- /dev/null +++ b/test/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../tsconfig.json", + "include": ["./**/*.ts", "./**/*.js", "./**/*.d.ts"] +} diff --git a/test/tslint.json b/test/tslint.json new file mode 100644 index 00000000..89b81c92 --- /dev/null +++ b/test/tslint.json @@ -0,0 +1,7 @@ +{ + "extends": ["../tslint.json"], + "rules": { + "only-arrow-functions": false, + "object-literal-sort-keys": false + } +} diff --git a/test/unary-clause-tests.js b/test/unary-clause-tests.js deleted file mode 100644 index f5b36a1b..00000000 --- a/test/unary-clause-tests.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var assert = require('assert'); -var Table = require(__dirname + '/../lib/table'); - -var Foo = Table.define({ - name: 'foo', - columns: ['baz','bar'] -}); - -test('operators', function() { - assert.equal(Foo.bar.isNull().operator, 'IS NULL'); - assert.equal(Foo.baz.isNotNull().operator, 'IS NOT NULL'); -}); diff --git a/test/unary-clause-tests.ts b/test/unary-clause-tests.ts new file mode 100644 index 00000000..98b87214 --- /dev/null +++ b/test/unary-clause-tests.ts @@ -0,0 +1,14 @@ +'use strict'; + +import assert = require('assert'); +import { Table } from '../lib/table'; + +const Foo = Table.define<{ baz: string; bar: string }>({ + name: 'foo', + columns: ['baz', 'bar'] +}); + +test('operators', function() { + assert.equal(Foo.bar.isNull().operator, 'IS NULL'); + assert.equal(Foo.baz.isNotNull().operator, 'IS NOT NULL'); +}); diff --git a/test/value-expression-tests.js b/test/value-expression-tests.js deleted file mode 100644 index ec80415a..00000000 --- a/test/value-expression-tests.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -var assert = require('assert'); -var valueExpressionMixin = require(__dirname + './../lib/node/valueExpression'); -var Node = require(__dirname + './../lib/node'); - -suite('value-expression', function() { - test("value expression mixin should not overwrite Node prototype properties", function() { - var mixin = valueExpressionMixin(); - - // make sure that the node class doesn't have any conflicting properties - for (var key in mixin) { - if (mixin.hasOwnProperty(key)) { - assert.equal(Node.prototype[key], undefined); - } - } - }); -}); diff --git a/test/value-expression-tests.ts b/test/value-expression-tests.ts new file mode 100644 index 00000000..8609a9b3 --- /dev/null +++ b/test/value-expression-tests.ts @@ -0,0 +1,17 @@ +'use strict'; + +import assert = require('assert'); +import { valueExpressionMixin, Node } from '../lib/node/'; + +suite('value-expression', function() { + test('value expression mixin should not overwrite Node prototype properties', function() { + var mixin = valueExpressionMixin(); + + // make sure that the node class doesn't have any conflicting properties + for (var key in mixin) { + if (mixin.hasOwnProperty(key)) { + assert.equal((Node.prototype as any)[key], undefined); + } + } + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..c594dff8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "es2016", + "module": "commonjs", + "moduleResolution": "node", + "outDir": "./dist/", + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": false, + "noEmitHelpers": true, + "importHelpers": true, + "pretty": true, + "sourceMap": true, + "lib": ["es2017", "esnext.asynciterable"], + "strict": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "removeComments": false, + "noImplicitReturns": true, + "declaration": true, + "baseUrl": "./", + "typeRoots": ["@types", "node_modules/@types"] + }, + "include": ["./lib/**/*.ts", "./lib/**/*.js", "./lib/**/*.d.ts"], + "exclude": ["node_modules"], + "compileOnSave": true, + "buildOnSave": true +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 00000000..0d7fe243 --- /dev/null +++ b/tslint.json @@ -0,0 +1,6 @@ +{ + "extends": ["tslint:latest", "tslint-config-prettier"], + "rules": { + "interface-name": false + } +} From 767fd84bb6a6da0498e647033d0e5f5a6a96cc71 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 9 Jan 2019 18:58:05 +1300 Subject: [PATCH 02/74] Fix readme --- README.md | 82 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index a657f852..15d013c4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # node-sql-ts + _sql string builder for node_ - supports PostgreSQL, mysql, Microsoft SQL Server, Oracle and sqlite dialects. Building SQL statements by hand is no fun, especially in a language which has clumsy support for multi-line strings. @@ -7,7 +8,7 @@ So let's build it with TypeScript (JavaScript also supported). Maybe it's still not fun, but at least it's _less not fun_. -[![Build Status](https://secure.travis-ci.org/charsleysa/node-sql-ts.png)](http://travis-ci.org/charsleysa/node-sql-ts) +[![Build Status](https://travis-ci.com/charsleysa/node-sql-ts.svg?branch=master)](https://travis-ci.com/charsleysa/node-sql-ts) ## install @@ -27,28 +28,29 @@ const sql = new Sql('postgres'); //first we define our tables const user = sql.define<{ id: number; name: string; email: string; lastLogin: Date }>({ - name: 'user', - columns: ['id', 'name', 'email', 'lastLogin'] + name: 'user', + columns: ['id', 'name', 'email', 'lastLogin'] }); const post = sql.define<{ id: number; userId: number; date: Date; title: string; body: string }>({ - name: 'post', - columns: ['id', 'userId', 'date', 'title', 'body'] + name: 'post', + columns: ['id', 'userId', 'date', 'title', 'body'] }); //now let's make a simple query -const query = user.select(user.star()).from(user).toQuery(); +const query = user + .select(user.star()) + .from(user) + .toQuery(); console.log(query.text); //SELECT "user".* FROM "user" //something more interesting const query = user .select(user.id) .from(user) - .where( - user.name.equals('boom').and(user.id.equals(1)) - ).or( - user.name.equals('bang').and(user.id.equals(2)) - ).toQuery(); + .where(user.name.equals('boom').and(user.id.equals(1))) + .or(user.name.equals('bang').and(user.id.equals(2))) + .toQuery(); //query is parameterized by default console.log(query.text); //SELECT "user"."id" FROM "user" WHERE ((("user"."name" = $1) AND ("user"."id" = $2)) OR (("user"."name" = $3) AND ("user"."id" = $4))) @@ -56,26 +58,33 @@ console.log(query.text); //SELECT "user"."id" FROM "user" WHERE ((("user"."name" console.log(query.values); //['boom', 1, 'bang', 2] //queries can be named -const query = user.select(user.star()).from(user).toNamedQuery('user.all'); +const query = user + .select(user.star()) + .from(user) + .toNamedQuery('user.all'); console.log(query.name); //'user.all' //how about a join? -const query = user.select(user.name, post.body) - .from(user.join(post).on(user.id.equals(post.userId))).toQuery(); +const query = user + .select(user.name, post.body) + .from(user.join(post).on(user.id.equals(post.userId))) + .toQuery(); console.log(query.text); //'SELECT "user"."name", "post"."body" FROM "user" INNER JOIN "post" ON ("user"."id" = "post"."userId")' //this also makes parts of your queries composable, which is handy const friendship = sql.define<{ userId: number; friendId: number }>({ - name: 'friendship', - columns: ['userId', 'friendId'] + name: 'friendship', + columns: ['userId', 'friendId'] }); const friends = user.as('friends'); const userToFriends = user - .leftJoin(friendship).on(user.id.equals(friendship.userId)) - .leftJoin(friends).on(friendship.friendId.equals(friends.id)); + .leftJoin(friendship) + .on(user.id.equals(friendship.userId)) + .leftJoin(friends) + .on(friendship.friendId.equals(friends.id)); //and now...compose... const friendsWhoHaveLoggedInQuery = user.from(userToFriends).where(friends.lastLogin.isNotNull()); @@ -93,26 +102,33 @@ const friendsWhoUseGmailQuery = user.from(userToFriends).where(friends.email.lik //Using different property names for columns //helpful if your column name is long or not camelCase const user = sql.define<{ id: number; state: string }>({ - name: 'user', - columns: [{ - name: 'id' - }, { - name: 'state_or_province', - property: 'state' - } - ] + name: 'user', + columns: [ + { + name: 'id' + }, + { + name: 'state_or_province', + property: 'state' + } + ] }); //now, instead of user.state_or_province, you can just use user.state -console.log(user.select().where(user.state.equals('WA')).toQuery().text); +console.log( + user + .select() + .where(user.state.equals('WA')) + .toQuery().text +); // "SELECT "user".* FROM "user" WHERE ("user"."state_or_province" = $1)" ``` -There are a __lot__ more examples included in the [test/dialects](https://github.com/charsleysa/node-sql-ts/tree/master/test/dialects) folder. We encourage you to read through them if you have any questions on usage! +There are a **lot** more examples included in the [test/dialects](https://github.com/charsleysa/node-sql-ts/tree/master/test/dialects) folder. We encourage you to read through them if you have any questions on usage! ## contributing -We __love__ contributions. +We **love** contributions. node-sql wouldn't be anything without all the contributors and collaborators who've worked on it. If you'd like to become a collaborator here's how it's done: @@ -123,12 +139,12 @@ If you'd like to become a collaborator here's how it's done: 4. `npm install` 5. `npm test` -At this point the tests should pass for you. If they don't pass please open an issue with the output or you can even send me an email directly. +At this point the tests should pass for you. If they don't pass please open an issue with the output or you can even send me an email directly. My email address is on my github profile and also on every commit I contributed in the repo. -Once the tests are passing, modify as you see fit. _Please_ make sure you write tests to cover your modifications. Once you're ready, commit your changes and submit a pull request. +Once the tests are passing, modify as you see fit. _Please_ make sure you write tests to cover your modifications. Once you're ready, commit your changes and submit a pull request. -__As long as your pull request doesn't have completely off-the-wall changes and it does have tests we will almost always merge it and push it to npm__ +**As long as your pull request doesn't have completely off-the-wall changes and it does have tests we will almost always merge it and push it to npm** If you think your changes are too off-the-wall, open an issue or a pull-request without code so we can discuss them before you begin. @@ -136,6 +152,6 @@ Usually after a few high-quality pull requests and friendly interactions we will After all, open source belongs to everyone. - ## license + MIT From 6c6f3b4011ce5dba774d7a6d7ed1b4e408459047 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 9 Jan 2019 19:00:53 +1300 Subject: [PATCH 03/74] Fix package version for release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d2e1da13..78d4025f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "1.0.0", + "version": "0.78.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From d97eda5cfaaebfced2e47700cc2397290c8e08be Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 9 Jan 2019 19:01:30 +1300 Subject: [PATCH 04/74] Fix scripts in package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 78d4025f..b70262f9 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "test": "node_modules/.bin/mocha --opts ./test/mocha.opts", "lint": "tslint --project .", "release:major": "npm run test && npm version major -m \"Bump version\" && git push origin master --tags && npm publish", - "release:minor": "npm run test && npm version major -m \"Bump version\" && git push origin master --tags && npm publish", - "release:patch": "npm run test && npm version major -m \"Bump version\" && git push origin master --tags && npm publish" + "release:minor": "npm run test && npm version minor -m \"Bump version\" && git push origin master --tags && npm publish", + "release:patch": "npm run test && npm version patch -m \"Bump version\" && git push origin master --tags && npm publish" }, "engines": { "node": "*" From 484a5d5c3b16eb6a29f16ae2ed6275884c69382d Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 9 Jan 2019 19:01:49 +1300 Subject: [PATCH 05/74] Bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b70262f9..760b3f7d 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "0.78.0", + "version": "1.0.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 1d698e9e63c615b48eb071e90e1c6720518081eb Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 16 Jan 2019 21:07:19 +1300 Subject: [PATCH 06/74] Fix tsconfig producing incorrect file paths in resulting type definition Fix classes not being exported Moved Sql class into its own file Removed redundant `equal` and `notEqual` operators --- lib/configTypes.ts | 2 +- lib/index.ts | 77 ++----------------------------------- lib/node/node.ts | 2 +- lib/node/valueExpression.ts | 2 - lib/sql.ts | 74 +++++++++++++++++++++++++++++++++++ lib/table.ts | 2 +- test/binary-clause-tests.ts | 2 - tsconfig.json | 2 +- 8 files changed, 81 insertions(+), 82 deletions(-) create mode 100644 lib/sql.ts diff --git a/lib/configTypes.ts b/lib/configTypes.ts index 2ee07ea8..70ad70b1 100644 --- a/lib/configTypes.ts +++ b/lib/configTypes.ts @@ -1,4 +1,4 @@ -import { Sql } from './'; +import { Sql } from './sql'; export type SQLDialects = 'mssql' | 'mysql' | 'oracle' | 'postgres' | 'sqlite'; diff --git a/lib/index.ts b/lib/index.ts index 39226b55..ff43835b 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,74 +1,3 @@ -'use strict'; - -import _ = require('lodash'); -import sliced = require('sliced'); -import { Column } from './column'; -import { SQLDialects, TableDefinition } from './configTypes'; -import { DEFAULT_DIALECT, getDialect } from './dialect'; -import * as functions from './functions'; -import { ArrayCallNode, FunctionCallNode, IntervalNode, Query } from './node'; -import { Table, TableWithColumns } from './table'; - -class Sql { - public functions: { [key: string]: (...args: any[]) => FunctionCallNode }; - public dialect: any; - public dialectName!: SQLDialects; - public config: any; - // tslint:disable-next-line:variable-name - private _function: any; - constructor(dialect: SQLDialects = DEFAULT_DIALECT, config: any = {}) { - this.setDialect(dialect, config); - // attach the standard SQL functions to this instance - this.functions = functions.getStandardFunctions(); - this._function = functions.getFunctions; - } - // Define a function - public function(functionNames: string[]): { [key: string]: (...args: any[]) => FunctionCallNode }; - public function(functionName: string): (...args: any[]) => FunctionCallNode; - public function(...args: any[]): any { - return this._function(...args); - } - // Define a table - public define(def: TableDefinition): TableWithColumns { - def = _.defaults(def || {}, { - sql: this - }); - return Table.define(def); - } - // Returns a bracketed call creator literal - public array(...args: any[]) { - const arrayCall = new ArrayCallNode(sliced(args)); - return arrayCall; - } - // Returns a select statement - public select(...args: any[]) { - const query = new Query({ sql: this } as any); - query.select(...args); - return query; - } - // Returns an interval clause - public interval(...args: any[]) { - const interval = new IntervalNode(sliced(args)); - return interval; - } - // Set the dialect - public setDialect(dialect: SQLDialects, config: any = {}) { - this.dialect = getDialect(dialect); - this.dialectName = dialect; - this.config = config; - return this; - } - // Create a constant Column (for use in SELECT) - public constant(value: any) { - const config = { - constantValue: value, - isConstant: true, - name: 'constant', - property: 'constant' - }; - const cn = new Column(config); - return cn; - } -} - -export { Sql, Table }; +export * from './node'; +export * from './dialect'; +export * from './sql'; diff --git a/lib/node/node.ts b/lib/node/node.ts index f97c06a2..13cce439 100644 --- a/lib/node/node.ts +++ b/lib/node/node.ts @@ -2,9 +2,9 @@ import assert = require('assert'); import { TextNode } from '.'; -import { Sql } from '..'; import { DEFAULT_DIALECT, getDialect } from '../dialect'; import { INodeable, instanceofINodeable } from '../nodeable'; +import { Sql } from '../sql'; export abstract class Node implements INodeable { public sql?: Sql; diff --git a/lib/node/valueExpression.ts b/lib/node/valueExpression.ts index 54629b33..0d8a48df 100644 --- a/lib/node/valueExpression.ts +++ b/lib/node/valueExpression.ts @@ -122,9 +122,7 @@ export const valueExpressionMixin = () => { or: binaryMethod('OR'), and: binaryMethod('AND'), equals: binaryMethod('='), - equal: binaryMethod('='), notEquals: binaryMethod('<>'), - notEqual: binaryMethod('<>'), gt: binaryMethod('>'), gte: binaryMethod('>='), lt: binaryMethod('<'), diff --git a/lib/sql.ts b/lib/sql.ts new file mode 100644 index 00000000..39226b55 --- /dev/null +++ b/lib/sql.ts @@ -0,0 +1,74 @@ +'use strict'; + +import _ = require('lodash'); +import sliced = require('sliced'); +import { Column } from './column'; +import { SQLDialects, TableDefinition } from './configTypes'; +import { DEFAULT_DIALECT, getDialect } from './dialect'; +import * as functions from './functions'; +import { ArrayCallNode, FunctionCallNode, IntervalNode, Query } from './node'; +import { Table, TableWithColumns } from './table'; + +class Sql { + public functions: { [key: string]: (...args: any[]) => FunctionCallNode }; + public dialect: any; + public dialectName!: SQLDialects; + public config: any; + // tslint:disable-next-line:variable-name + private _function: any; + constructor(dialect: SQLDialects = DEFAULT_DIALECT, config: any = {}) { + this.setDialect(dialect, config); + // attach the standard SQL functions to this instance + this.functions = functions.getStandardFunctions(); + this._function = functions.getFunctions; + } + // Define a function + public function(functionNames: string[]): { [key: string]: (...args: any[]) => FunctionCallNode }; + public function(functionName: string): (...args: any[]) => FunctionCallNode; + public function(...args: any[]): any { + return this._function(...args); + } + // Define a table + public define(def: TableDefinition): TableWithColumns { + def = _.defaults(def || {}, { + sql: this + }); + return Table.define(def); + } + // Returns a bracketed call creator literal + public array(...args: any[]) { + const arrayCall = new ArrayCallNode(sliced(args)); + return arrayCall; + } + // Returns a select statement + public select(...args: any[]) { + const query = new Query({ sql: this } as any); + query.select(...args); + return query; + } + // Returns an interval clause + public interval(...args: any[]) { + const interval = new IntervalNode(sliced(args)); + return interval; + } + // Set the dialect + public setDialect(dialect: SQLDialects, config: any = {}) { + this.dialect = getDialect(dialect); + this.dialectName = dialect; + this.config = config; + return this; + } + // Create a constant Column (for use in SELECT) + public constant(value: any) { + const config = { + constantValue: value, + isConstant: true, + name: 'constant', + property: 'constant' + }; + const cn = new Column(config); + return cn; + } +} + +export { Sql, Table }; diff --git a/lib/table.ts b/lib/table.ts index 42b1bb11..c1532080 100644 --- a/lib/table.ts +++ b/lib/table.ts @@ -2,12 +2,12 @@ import lodash = require('lodash'); -import { Sql } from './'; import { Column } from './column'; import { ColumnDefinition, TableDefinition } from './configTypes'; import { leftJoin } from './joiner'; import { ColumnNode, ForeignKeyNode, JoinNode, LiteralNode, Node, OrderByValueNode, Query, SubQuery, TableNode } from './node'; import { INodeable } from './nodeable'; +import { Sql } from './sql'; export type TableWithColumns = Table & { [Name in NonNullable]: Column }; diff --git a/test/binary-clause-tests.ts b/test/binary-clause-tests.ts index e7ed1857..77614419 100644 --- a/test/binary-clause-tests.ts +++ b/test/binary-clause-tests.ts @@ -10,8 +10,6 @@ const Foo = Table.define<{ baz: string; bar: string }>({ test('operators', function() { equal(Foo.baz.equals(1).operator, '='); - equal(Foo.baz.equal(1).operator, '='); - equal(Foo.baz.notEqual(1).operator, '<>'); equal(Foo.baz.notEquals(1).operator, '<>'); equal(Foo.baz.like('asdf').operator, 'LIKE'); equal(Foo.baz.notLike('asdf').operator, 'NOT LIKE'); diff --git a/tsconfig.json b/tsconfig.json index c594dff8..ed81ab22 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,7 @@ "removeComments": false, "noImplicitReturns": true, "declaration": true, - "baseUrl": "./", + "baseUrl": "./lib", "typeRoots": ["@types", "node_modules/@types"] }, "include": ["./lib/**/*.ts", "./lib/**/*.js", "./lib/**/*.d.ts"], From 45607145ac9e7db2efcc16ffec16eb89699e61a1 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 16 Jan 2019 21:08:28 +1300 Subject: [PATCH 07/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16a743b5..ac78262c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "1.0.0", + "version": "2.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 760b3f7d..e7ac8f9b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "1.0.0", + "version": "2.0.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 607a50d1c5ebbe3eca5b68597e08b31bd798b955 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 16 Jan 2019 21:38:55 +1300 Subject: [PATCH 08/74] Fix interface containing removed functions --- lib/node/valueExpression.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/node/valueExpression.ts b/lib/node/valueExpression.ts index 0d8a48df..7c5260c0 100644 --- a/lib/node/valueExpression.ts +++ b/lib/node/valueExpression.ts @@ -174,9 +174,7 @@ export interface IValueExpressionMixinBase { isNull(): PostfixUnaryNode; isNotNull(): PostfixUnaryNode; equals(val: any): BinaryNode; - equal(val: any): BinaryNode; notEquals(val: any): BinaryNode; - notEqual(val: any): BinaryNode; gt(val: any): BinaryNode; gte(val: any): BinaryNode; lt(val: any): BinaryNode; From 777db959cee541c6966ba1865acf4aba5e8eb36a Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 16 Jan 2019 21:39:50 +1300 Subject: [PATCH 09/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac78262c..9c46b8b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e7ac8f9b..16a62c68 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "2.0.0", + "version": "2.0.1", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From ed4c197102616e0ffa84670495d25332a5456634 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 7 May 2019 16:06:40 +1200 Subject: [PATCH 10/74] Updates - Update packages - Fix typings --- lib/dialect/dialect.ts | 5 + lib/dialect/postgres.ts | 2 +- lib/node/node.ts | 30 ++--- lib/node/query.ts | 12 +- lib/table.ts | 20 +-- package-lock.json | 216 +++++++++++++-------------------- package.json | 14 +-- test/dialects/insert-tests.ts | 8 +- test/dialects/replace-tests.ts | 8 +- test/dialects/support.ts | 28 ++--- 10 files changed, 151 insertions(+), 192 deletions(-) diff --git a/lib/dialect/dialect.ts b/lib/dialect/dialect.ts index b93614ff..fbade80a 100644 --- a/lib/dialect/dialect.ts +++ b/lib/dialect/dialect.ts @@ -1,6 +1,11 @@ +import { Query } from '../node'; +import { Table } from '../table'; + export abstract class Dialect { public config: any; constructor(config: any) { this.config = config; } + public abstract getQuery(queryNode: Query | Table): { text: string, values: string[] }; + public abstract getString(queryNode: Query): string; } diff --git a/lib/dialect/postgres.ts b/lib/dialect/postgres.ts index 7041292e..0c2840f1 100644 --- a/lib/dialect/postgres.ts +++ b/lib/dialect/postgres.ts @@ -164,7 +164,7 @@ export class Postgres extends Dialect { public _getParameterPlaceholder(index: string | number, value: any): string { return '$' + index; } - public getQuery(queryNode: Query | Table) { + public getQuery(queryNode: Query | Table): { text: string, values: string[] } { // passed in a table, not a query if (queryNode instanceof Table) { queryNode = queryNode.select(queryNode.star()); diff --git a/lib/node/node.ts b/lib/node/node.ts index 13cce439..b16167f7 100644 --- a/lib/node/node.ts +++ b/lib/node/node.ts @@ -1,8 +1,9 @@ 'use strict'; import assert = require('assert'); -import { TextNode } from '.'; +import { Query, TextNode } from '.'; import { DEFAULT_DIALECT, getDialect } from '../dialect'; +import { Dialect } from '../dialect/dialect'; import { INodeable, instanceofINodeable } from '../nodeable'; import { Sql } from '../sql'; @@ -36,20 +37,19 @@ export abstract class Node implements INodeable { return this; } public toQuery(dialect?: string) { - const Dialect = determineDialect(this, dialect); - return initializeDialect(Dialect, this).getQuery(this); + const DialectClass = determineDialect(this, dialect); + return initializeDialect(DialectClass, this).getQuery(this as unknown as Query); } public toNamedQuery(name: string, dialect?: string) { if (!name || typeof name !== 'string' || name === '') { throw new Error('A query name has to be a non-empty String.'); } const query = this.toQuery(dialect); - query.name = name; - return query; + return { ...query, name }; } public toString(dialect?: string) { - const Dialect = determineDialect(this, dialect); - return initializeDialect(Dialect, this).getString(this); + const DialectClass = determineDialect(this, dialect); + return initializeDialect(DialectClass, this).getString(this as unknown as Query); } public addAll(nodes: Array) { for (let i = 0, len = nodes.length; i < len; i++) { @@ -62,25 +62,25 @@ export abstract class Node implements INodeable { // Before the change that introduced parallel dialects, every node could be turned // into a query. The parallel dialects change made it impossible to change some nodes // into a query because not all nodes are constructed with the sql instance. -const determineDialect = (query: any, dialect?: string) => { +const determineDialect = (query: any, dialect?: string): typeof Dialect & NewableFunction => { const sql = query.sql || (query.table && query.table.sql); - let Dialect; + let DialectClass; if (dialect) { // dialect is specified - Dialect = getDialect(dialect); + DialectClass = getDialect(dialect); } else if (sql && sql.dialect) { // dialect is not specified, use the dialect from the sql instance - Dialect = sql.dialect; + DialectClass = sql.dialect; } else { // dialect is not specified, use the default dialect - Dialect = getDialect(DEFAULT_DIALECT); + DialectClass = getDialect(DEFAULT_DIALECT); } - return Dialect; + return DialectClass; }; -const initializeDialect = (Dialect: any, query: any) => { +const initializeDialect = (DialectClass: T, query: any): Dialect => { const sql = query.sql || (query.table && query.table.sql); const config = sql ? sql.config : {}; - return new Dialect(config); + return new DialectClass(config); }; diff --git a/lib/node/query.ts b/lib/node/query.ts index 4e87eea2..61898e39 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -56,7 +56,7 @@ import { INodeable, instanceofINodeable } from '../nodeable'; import { Table } from '../table'; // get the first element of an arguments if it is an array, else return arguments as an array -const getArrayOrArgsAsArray = (args: Array): T[] => { +const getArrayOrArgsAsArray = (args: Array): T[] => { const first = args[0]; if (Array.isArray(first)) { return first; @@ -226,7 +226,8 @@ export class Query extends Node { return this.add(having); } - public insert(object: Array> | Partial | Array> | Column): this; + public insert(object: Array> | Column): this; + public insert(object: Array> | Partial): this; public insert(...nodes: Array>): this; public insert(...nodes: Array> | Column | Array> | Partial>): this { let args = sliced(nodes) as Array>; @@ -234,7 +235,7 @@ export class Query extends Node { if (Array.isArray(object)) { for (const col of object) { - this.insert(col); + this.insert(col as any); } return this; } else if (!instanceofINodeable(object) && typeof object === 'object') { @@ -257,7 +258,8 @@ export class Query extends Node { } } - public replace(object: Array> | Partial | Array> | Column): this; + public replace(object: Array> | Column): this; + public replace(object: Array> | Partial): this; public replace(...nodes: Array>): this; public replace(...nodes: Array> | Column | Array> | Partial>): this { let args = sliced(nodes) as Array>; @@ -265,7 +267,7 @@ export class Query extends Node { if (Array.isArray(object)) { for (const col of object) { - this.replace(col); + this.replace(col as any); } return this; } else if (!instanceofINodeable(object) && typeof object === 'object') { diff --git a/lib/table.ts b/lib/table.ts index c1532080..c21a529c 100644 --- a/lib/table.ts +++ b/lib/table.ts @@ -207,23 +207,29 @@ export class Table implements INodeable { }; return query as SubQuery; } - public insert(...args: any[]): Query { + public insert(object: Array> | Column): Query; + public insert(object: Array> | PartialNodeable): Query; + public insert(...nodes: Array>): Query; + public insert(...nodes: Array> | Column | Array> | PartialNodeable>): Query { const query = new Query(this); - if (!args[0] || (Array.isArray(args[0]) && args[0].length === 0)) { + if (!nodes[0] || (Array.isArray(nodes[0]) && (nodes[0] as Array> | Array>).length === 0)) { query.select(this.star()); query.where('1=2'); } else { - query.insert(...args); + query.insert(...nodes as any); } return query; } - public replace(...args: any[]): Query { + public replace(object: Array> | Column): Query; + public replace(object: Array> | PartialNodeable): Query; + public replace(...nodes: Array>): Query; + public replace(...nodes: Array> | Column | Array> | PartialNodeable>): Query { const query = new Query(this); - if (!args[0] || (Array.isArray(args[0]) && args[0].length === 0)) { + if (!nodes[0] || (Array.isArray(nodes[0]) && (nodes[0] as Array> | Array>).length === 0)) { query.select(this.star()); query.where('1=2'); } else { - query.replace(...args); + query.replace(...nodes as any); } return query; } @@ -266,7 +272,7 @@ queryMethods.forEach((method) => { }; }); -type PartialNodeable = { [P in keyof T]?: T[P] | INodeable }; +type PartialNodeable = { [P in keyof T]?: T[P] | INodeable | Buffer }; export interface Table { alter(): Query; diff --git a/package-lock.json b/package-lock.json index 9c46b8b6..da37a8da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,34 +4,57 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, "@types/lodash": { - "version": "4.14.119", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.119.tgz", - "integrity": "sha512-Z3TNyBL8Vd/M9D9Ms2S3LmFq2sSMzahodD6rCS9V2N44HUMINb75jNkSuwAx7eo2ufqTdfOdtGQpNbieUjPQmw==", + "version": "4.14.123", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", + "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==", "dev": true }, "@types/mocha": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.6.tgz", + "integrity": "sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw==", "dev": true }, "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz", + "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", "dev": true }, "argparse": { @@ -43,44 +66,6 @@ "sprintf-js": "~1.0.2" } }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -116,25 +101,14 @@ "dev": true }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } } }, "color-convert": { @@ -223,15 +197,6 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -261,15 +226,15 @@ "dev": true }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -374,18 +339,18 @@ "dev": true }, "resolve": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", - "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", + "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "sliced": { @@ -400,9 +365,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -411,19 +376,10 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -434,27 +390,16 @@ } }, "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", + "integrity": "sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A==", "dev": true, "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", + "arg": "^4.1.0", "diff": "^3.1.0", "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", "source-map-support": "^0.5.6", - "yn": "^2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "yn": "^3.0.0" } }, "tslib": { @@ -464,29 +409,30 @@ "dev": true }, "tslint": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz", - "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", + "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", "diff": "^3.2.0", "glob": "^7.1.1", - "js-yaml": "^3.7.0", + "js-yaml": "^3.13.0", "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.27.2" + "tsutils": "^2.29.0" } }, "tslint-config-prettier": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.17.0.tgz", - "integrity": "sha512-NKWNkThwqE4Snn4Cm6SZB7lV5RMDDFsBwz6fWUkTxOKGjMx8ycOHnjIbhn7dZd5XmssW3CwqUjlANR6EhP9YQw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", + "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", "dev": true }, "tsutils": { @@ -499,9 +445,9 @@ } }, "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", "dev": true }, "wrappy": { @@ -511,9 +457,9 @@ "dev": true }, "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", + "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", "dev": true } } diff --git a/package.json b/package.json index 16a62c68..b4c4ab1f 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,13 @@ "lodash": "~4.17.x" }, "devDependencies": { - "@types/lodash": "^4.14.119", - "@types/mocha": "^5.2.5", - "@types/node": "^10.12.18", + "@types/lodash": "^4.14.123", + "@types/mocha": "^5.2.6", + "@types/node": "^12.0.0", "mocha": "*", - "typescript": "^3.2.2", - "ts-node": "^7.0.1", - "tslint": "^5.12.0", - "tslint-config-prettier": "^1.17.0" + "typescript": "^3.4.5", + "ts-node": "^8.1.0", + "tslint": "^5.16.0", + "tslint-config-prettier": "^1.18.0" } } diff --git a/test/dialects/insert-tests.ts b/test/dialects/insert-tests.ts index f6aab57d..394d76e4 100644 --- a/test/dialects/insert-tests.ts +++ b/test/dialects/insert-tests.ts @@ -697,8 +697,8 @@ Harness.test({ Harness.test({ query: customerAliasTable .insert({ - id: 2, - name: 'test' + id_alias: 2, + name_alias: 'test' }) .onConflict({ columns: ['id'], @@ -726,8 +726,8 @@ Harness.test({ Harness.test({ query: customerAliasTable .insert({ - id: 2, - name: 'test' + id_alias: 2, + name_alias: 'test' }) .orIgnore(), mysql: { diff --git a/test/dialects/replace-tests.ts b/test/dialects/replace-tests.ts index 1f4af895..f453b6da 100644 --- a/test/dialects/replace-tests.ts +++ b/test/dialects/replace-tests.ts @@ -626,8 +626,8 @@ Harness.test({ Harness.test({ query: customerAliasTable .replace({ - id: 2, - name: 'test' + id_alias: 2, + name_alias: 'test' }) .onConflict({ columns: ['id'], @@ -654,8 +654,8 @@ Harness.test({ Harness.test({ query: customerAliasTable .replace({ - id: 2, - name: 'test' + id_alias: 2, + name_alias: 'test' }) .orIgnore(), mysql: { diff --git a/test/dialects/support.ts b/test/dialects/support.ts index bb6b3d0b..8178596c 100644 --- a/test/dialects/support.ts +++ b/test/dialects/support.ts @@ -1,12 +1,12 @@ 'use strict'; import assert = require('assert'); -import { Table } from '../../lib/table'; -import { Postgres } from '../../lib/dialect/postgres'; -import { Sqlite } from '../../lib/dialect/sqlite'; -import { Mysql } from '../../lib/dialect/mysql'; import { Mssql } from '../../lib/dialect/mssql'; +import { Mysql } from '../../lib/dialect/mysql'; import { Oracle } from '../../lib/dialect/oracle'; +import { Postgres } from '../../lib/dialect/postgres'; +import { Sqlite } from '../../lib/dialect/sqlite'; +import { Table } from '../../lib/table'; // specify dialect classes const dialects = { @@ -20,11 +20,11 @@ const dialects = { function customTest(expected: any) { // for each dialect Object.keys(dialects).forEach(function(dialect) { - var expectedObject = expected[dialect]; + const expectedObject = expected[dialect]; if (undefined !== expectedObject) { - var DialectClass = (dialects as any)[dialect]; + const DialectClass = (dialects as any)[dialect]; - var title = dialect + ': ' + (expected.title || expectedObject.text || expectedObject); + const title = dialect + ': ' + (expected.title || expectedObject.text || expectedObject); test(title, function() { // check if this query is expected to throw if (expectedObject.throws) { @@ -33,17 +33,17 @@ function customTest(expected: any) { }); } else { // build query for dialect - var compiledQuery = new DialectClass(expectedObject.config || {}).getQuery(expected.query); + const compiledQuery = new DialectClass(expectedObject.config || {}).getQuery(expected.query); // test result is correct - var expectedText = expectedObject.text || expectedObject; + const expectedText = expectedObject.text || expectedObject; assert.equal(compiledQuery.text, expectedText); // if params are specified then test these are correct - var expectedParams = expectedObject.params || expected.params; + const expectedParams = expectedObject.params || expected.params; if (undefined !== expectedParams) { assert.equal(expectedParams.length, compiledQuery.values.length, 'params length'); - for (var i = 0; i < expectedParams.length; i++) { + for (let i = 0; i < expectedParams.length; i++) { assert.deepEqual(expectedParams[i], compiledQuery.values[i], 'param ' + (i + 1)); } } @@ -56,7 +56,7 @@ function customTest(expected: any) { new DialectClass(expectedObject.config || {}).getString(expected.query); }); } else { - var compiledString = new DialectClass(expectedObject.config || {}).getString(expected.query); + const compiledString = new DialectClass(expectedObject.config || {}).getString(expected.query); // test result is correct assert.equal(compiledString, expectedObject.string); @@ -180,9 +180,9 @@ export function defineVariableTable() { } export interface ContentTable { - content_id: number; + contentId: number; text: string; - content_posts: string; + contentPosts: string; } // this table is for testing snakeName related stuff From b505c029cf7f85eb6ea80e19483c64f5d1ef0800 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 7 May 2019 16:07:25 +1200 Subject: [PATCH 11/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index da37a8da..e6b0ea87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "2.0.1", + "version": "3.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b4c4ab1f..282728fc 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "2.0.1", + "version": "3.0.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 0401278c7e7d2226e3e83b37b51c8dafa5bf68b7 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 7 May 2019 16:14:20 +1200 Subject: [PATCH 12/74] Fix missing compile step in publish --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 282728fc..79295a96 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,9 @@ "pretest": "tslint --project .", "test": "node_modules/.bin/mocha --opts ./test/mocha.opts", "lint": "tslint --project .", - "release:major": "npm run test && npm version major -m \"Bump version\" && git push origin master --tags && npm publish", - "release:minor": "npm run test && npm version minor -m \"Bump version\" && git push origin master --tags && npm publish", - "release:patch": "npm run test && npm version patch -m \"Bump version\" && git push origin master --tags && npm publish" + "release:major": "npm run test && tsc && npm version major -m \"Bump version\" && git push origin master --tags && npm publish", + "release:minor": "npm run test && tsc && npm version minor -m \"Bump version\" && git push origin master --tags && npm publish", + "release:patch": "npm run test && tsc && npm version patch -m \"Bump version\" && git push origin master --tags && npm publish" }, "engines": { "node": "*" From d557d5b483e50c3e93daedb36344e154a9a0a045 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 7 May 2019 16:14:49 +1200 Subject: [PATCH 13/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6b0ea87..2f5c4d47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "3.0.0", + "version": "3.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 79295a96..6cbfcebb 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "3.0.0", + "version": "3.0.1", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From d47c49b599070985e98383b51ef20c3152f241a5 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Fri, 3 Jul 2020 16:16:10 +1200 Subject: [PATCH 14/74] feat: upgrade to TypeScript 3.9 and ES modules --- .travis.yml | 5 +- lib/column.ts | 14 +- lib/configTypes.ts | 2 +- lib/dialect/dialect.ts | 4 +- lib/dialect/mssql.ts | 2 +- lib/dialect/mysql.ts | 24 +- lib/dialect/oracle.ts | 2 +- lib/dialect/postgres.ts | 30 +- lib/dialect/sqlite.ts | 6 +- lib/functions.ts | 7 +- lib/joiner.ts | 6 +- lib/node/alias.ts | 4 +- lib/node/arrayCall.ts | 9 +- lib/node/at.ts | 6 +- lib/node/binary.ts | 6 +- lib/node/case.ts | 6 +- lib/node/cast.ts | 6 +- lib/node/column.ts | 8 +- lib/node/createIndex.ts | 10 +- lib/node/drop.ts | 2 +- lib/node/dropIndex.ts | 6 +- lib/node/functionCall.ts | 6 +- lib/node/in.ts | 6 +- lib/node/indexes.ts | 4 +- lib/node/insert.ts | 4 +- lib/node/modifier.ts | 4 +- lib/node/node.ts | 8 +- lib/node/notIn.ts | 6 +- lib/node/postfixUnary.ts | 6 +- lib/node/prefixUnary.ts | 6 +- lib/node/query.ts | 60 +- lib/node/replace.ts | 4 +- lib/node/slice.ts | 6 +- lib/node/table.ts | 4 +- lib/node/ternary.ts | 6 +- lib/node/truncate.ts | 2 +- lib/node/where.ts | 6 +- lib/sql.ts | 6 +- lib/table.ts | 66 +- lib/tableTracker.ts | 2 +- lib/types.d.ts.old | 221 ----- package-lock.json | 1021 ++++++++++++++++++++--- package.json | 40 +- test/column-tests.ts | 56 +- test/dialects/insert-tests.ts | 14 +- test/dialects/replace-tests.ts | 14 +- test/dialects/support.ts | 2 +- test/dialects/tostring-tests.ts | 2 +- test/dialects/update-tests.ts | 4 +- test/dialects/value-expression-tests.ts | 4 +- test/mocha.opts | 5 - test/table-tests.ts | 2 +- test/ternary-clause-tests.ts | 2 +- test/tsconfig.json | 2 +- test/tslint.json | 3 +- test/unary-clause-tests.ts | 2 +- test/value-expression-tests.ts | 2 +- tsconfig.cjs.json | 8 + tsconfig.json | 5 +- tslint.json | 3 +- 60 files changed, 1186 insertions(+), 603 deletions(-) delete mode 100644 lib/types.d.ts.old delete mode 100644 test/mocha.opts create mode 100644 tsconfig.cjs.json diff --git a/.travis.yml b/.travis.yml index 05845fe2..edffba63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,4 @@ language: node_js node_js: - - '11.6' - - '10.15' - - '8.15' + - '12.18' + - '14.5' diff --git a/lib/column.ts b/lib/column.ts index 569efb05..7dd2e093 100644 --- a/lib/column.ts +++ b/lib/column.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { ColumnNode, IValueExpressionMixin, OrderByValueNode, TextNode, valueExpressionMixin } from './node'; import { INodeable } from './nodeable'; import { Table } from './table'; @@ -25,9 +25,9 @@ interface ColumnConfig { unique?: boolean; defaultValue?: any; subfields?: string[]; - table?: Table; + table?: Table; star?: boolean; - subfieldContainer?: Column; + subfieldContainer?: Column; isConstant?: boolean; constantValue?: any; } @@ -35,7 +35,7 @@ interface ColumnConfig { export class Column implements INodeable { public name: string; public property?: string; - public table?: Table; + public table?: Table; public asc: this; public alias?: string; public desc: OrderByValueNode; @@ -43,7 +43,7 @@ export class Column implements INodeable { // tslint:disable-next-line:variable-name public _value: any; public star?: boolean; - public subfields: { [key: string]: Column } = {}; + public subfields: { [key: string]: Column } = {}; public asArray?: boolean = false; public aggregator?: string; public isConstant?: boolean; @@ -60,7 +60,7 @@ export class Column implements INodeable { onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; }; - public subfieldContainer?: Column; + public subfieldContainer?: Column; public autoGenerated?: boolean; public unique?: boolean; public isDistinct?: boolean; @@ -141,7 +141,7 @@ export class Column implements INodeable { } // mix in value expression -_.extend(Column.prototype, valueExpressionMixin()); +extend(Column.prototype, valueExpressionMixin()); const contextify = (base: Column): Column => { const context = Object.create(Column.prototype); diff --git a/lib/configTypes.ts b/lib/configTypes.ts index 70ad70b1..470f4b87 100644 --- a/lib/configTypes.ts +++ b/lib/configTypes.ts @@ -42,7 +42,7 @@ export interface ForeignKeyDefinition { export interface TableDefinition { name: string; schema?: string; - columns: Array | ColumnDefinitionObject; + columns: (ColumnDefinition | string)[] | ColumnDefinitionObject; isTemporary?: boolean; foreignKeys?: ForeignKeyDefinition | ForeignKeyDefinition[]; sql?: Sql; diff --git a/lib/dialect/dialect.ts b/lib/dialect/dialect.ts index fbade80a..0a4651d2 100644 --- a/lib/dialect/dialect.ts +++ b/lib/dialect/dialect.ts @@ -6,6 +6,6 @@ export abstract class Dialect { constructor(config: any) { this.config = config; } - public abstract getQuery(queryNode: Query | Table): { text: string, values: string[] }; - public abstract getString(queryNode: Query): string; + public abstract getQuery(queryNode: Query | Table): { text: string, values: string[] }; + public abstract getString(queryNode: Query): string; } diff --git a/lib/dialect/mssql.ts b/lib/dialect/mssql.ts index fd60f6e6..710dbfa9 100644 --- a/lib/dialect/mssql.ts +++ b/lib/dialect/mssql.ts @@ -3,7 +3,7 @@ 'use strict'; -import assert = require('assert'); +import assert from 'assert'; import { AlterNode, diff --git a/lib/dialect/mysql.ts b/lib/dialect/mysql.ts index c1a60f3e..1b5e33a1 100644 --- a/lib/dialect/mysql.ts +++ b/lib/dialect/mysql.ts @@ -1,7 +1,7 @@ 'use strict'; -import assert = require('assert'); -import _ = require('lodash'); +import assert from 'assert'; +import isNumber from 'lodash/isNumber'; import { BinaryNode, @@ -179,20 +179,20 @@ export class Mysql extends Postgres { } public visitInterval(intervalNode: IntervalNode): string[] { let parameter; - if (_.isNumber(intervalNode.years)) { - parameter = _.isNumber(intervalNode.months) + if (isNumber(intervalNode.years)) { + parameter = isNumber(intervalNode.months) ? `'${intervalNode.years}-${intervalNode.months}' YEAR_MONTH` : `${intervalNode.years} YEAR`; - } else if (_.isNumber(intervalNode.months)) { + } else if (isNumber(intervalNode.months)) { parameter = `${intervalNode.months} MONTH`; - } else if (_.isNumber(intervalNode.days)) { - parameter = `'${intervalNode.days} ${_.isNumber(intervalNode.hours) ? intervalNode.hours : 0}:${ - _.isNumber(intervalNode.minutes) ? intervalNode.minutes : 0 - }:${_.isNumber(intervalNode.seconds) ? intervalNode.seconds : 0}' DAY_SECOND`; + } else if (isNumber(intervalNode.days)) { + parameter = `'${intervalNode.days} ${isNumber(intervalNode.hours) ? intervalNode.hours : 0}:${ + isNumber(intervalNode.minutes) ? intervalNode.minutes : 0 + }:${isNumber(intervalNode.seconds) ? intervalNode.seconds : 0}' DAY_SECOND`; } else { - parameter = `'${_.isNumber(intervalNode.hours) ? intervalNode.hours : 0}:${ - _.isNumber(intervalNode.minutes) ? intervalNode.minutes : 0 - }:${_.isNumber(intervalNode.seconds) ? intervalNode.seconds : 0}' HOUR_SECOND`; + parameter = `'${isNumber(intervalNode.hours) ? intervalNode.hours : 0}:${ + isNumber(intervalNode.minutes) ? intervalNode.minutes : 0 + }:${isNumber(intervalNode.seconds) ? intervalNode.seconds : 0}' HOUR_SECOND`; } return [`INTERVAL ${parameter}`]; } diff --git a/lib/dialect/oracle.ts b/lib/dialect/oracle.ts index 6da8f106..826df1be 100644 --- a/lib/dialect/oracle.ts +++ b/lib/dialect/oracle.ts @@ -1,6 +1,6 @@ 'use strict'; -import assert = require('assert'); +import assert from 'assert'; import { AliasNode, diff --git a/lib/dialect/postgres.ts b/lib/dialect/postgres.ts index 0c2840f1..1e2ee257 100644 --- a/lib/dialect/postgres.ts +++ b/lib/dialect/postgres.ts @@ -1,7 +1,9 @@ 'use strict'; -import assert = require('assert'); -import _ = require('lodash'); +import assert from 'assert'; +import isFunction from 'lodash/isFunction'; +import isNumber from 'lodash/isNumber'; +import map from 'lodash/map'; import { AddColumnNode, @@ -79,7 +81,7 @@ import { Dialect } from './dialect'; export class Postgres extends Dialect { protected output: string[]; protected params: string[]; - protected queryNode?: Query; + protected queryNode?: Query; protected myClass: typeof Postgres = Postgres; protected arrayAggFunctionName: string = 'array_agg'; protected aliasText: string = ' AS '; @@ -133,7 +135,7 @@ export class Postgres extends Dialect { if (this.myClass === Postgres) { // naive check to see if this is an array of objects, which // is handled differently than an array of primitives - if (value.length && 'object' === typeof value[0] && !_.isFunction(value[0].toISOString) && !Array.isArray(value[0])) { + if (value.length && 'object' === typeof value[0] && !isFunction(value[0].toISOString) && !Array.isArray(value[0])) { value = `'${JSON.stringify(value)}'`; } else { // In a Postgres array, strings must be double-quoted @@ -141,7 +143,7 @@ export class Postgres extends Dialect { value = `'{${(value as any[]).join(',')}}'`; } } else { - value = _.map(value, this._getParameterValue.bind(this)); + value = map(value, this._getParameterValue.bind(this)); value = `(${(value as any[]).join(', ')})`; } } else if (value instanceof Date) { @@ -161,10 +163,10 @@ export class Postgres extends Dialect { // value has been converted at this point return value; } - public _getParameterPlaceholder(index: string | number, value: any): string { + public _getParameterPlaceholder(index: string | number, value: unknown): string { return '$' + index; } - public getQuery(queryNode: Query | Table): { text: string, values: string[] } { + public getQuery(queryNode: Query | Table): { text: string, values: string[] } { // passed in a table, not a query if (queryNode instanceof Table) { queryNode = queryNode.select(queryNode.star()); @@ -186,7 +188,7 @@ export class Postgres extends Dialect { this.params = []; return query; } - public getString(queryNode: Query) { + public getString(queryNode: Query) { // switch off parameter placeholders const previousFlagStatus = this.disableParameterPlaceholders; this.disableParameterPlaceholders = true; @@ -203,9 +205,9 @@ export class Postgres extends Dialect { public visit(node: Node): string[] { switch (node.type) { case 'QUERY': - return this.visitQuery(node as Query); + return this.visitQuery(node as Query); case 'SUBQUERY': - return this.visitSubquery(node as Query); + return this.visitSubquery(node as Query); case 'SELECT': return this.visitSelect(node as SelectNode); case 'INSERT': @@ -611,7 +613,7 @@ export class Postgres extends Dialect { const text = `(${this.visit(sliceNode.value)})[${this.visit(sliceNode.start)}:${this.visit(sliceNode.end)}]`; return [text]; } - public visitQuery(queryNode: Query): string[] { + public visitQuery(queryNode: Query): string[] { if (this.queryNode) { return this.visitSubquery(queryNode, dontParenthesizeSubQuery(this.queryNode)); } @@ -694,7 +696,7 @@ export class Postgres extends Dialect { // implicit 'from' return this.output; } - public visitSubquery(queryNode: Query, dontParenthesize?: boolean): string[] { + public visitSubquery(queryNode: Query, dontParenthesize?: boolean): string[] { // create another query builder of the current class to build the subquery const subQuery = new this.myClass(this.config); // let the subquery modify this instance's params array @@ -1161,7 +1163,7 @@ export class Postgres extends Dialect { public visitInterval(intervalNode: IntervalNode): string[] { let parameter = ''; const add = (n: number, unit: string) => { - if (!_.isNumber(n)) { + if (!isNumber(n)) { return; } if (parameter !== '') { @@ -1227,7 +1229,7 @@ export class Postgres extends Dialect { * @param parentQuery * @returns {boolean} */ -function dontParenthesizeSubQuery(parentQuery: Query) { +function dontParenthesizeSubQuery(parentQuery: Query) { if (!parentQuery) { return false; } diff --git a/lib/dialect/sqlite.ts b/lib/dialect/sqlite.ts index f001d1f1..bc3c4f9b 100644 --- a/lib/dialect/sqlite.ts +++ b/lib/dialect/sqlite.ts @@ -1,7 +1,7 @@ 'use strict'; -import assert = require('assert'); -import _ = require('lodash'); +import assert from 'assert'; +import isArray from 'lodash/isArray'; import { AddColumnNode, @@ -45,7 +45,7 @@ export class Sqlite extends Postgres { value = value.getTime(); } else if ('boolean' === typeof value) { value = value ? 1 : 0; - } else if (_.isArray(value)) { + } else if (isArray(value)) { value = Postgres.prototype._getParameterValue.call(this, JSON.stringify(value)); } else { value = Postgres.prototype._getParameterValue.call(this, value); diff --git a/lib/functions.ts b/lib/functions.ts index 9d5c4b6c..462312da 100644 --- a/lib/functions.ts +++ b/lib/functions.ts @@ -1,6 +1,7 @@ 'use strict'; -import _ = require('lodash'); -import sliced = require('sliced'); + +import reduce from 'lodash/reduce'; +import sliced from 'sliced'; import { FunctionCallNode } from './node'; // create a function that creates a function call of the specific name, using the specified sql instance @@ -15,7 +16,7 @@ const getFunctionCallCreator = (name: string) => { const getFunctions = (functionNames: string | string[]) => { if (typeof functionNames === 'string') { return getFunctionCallCreator(functionNames); } - const functions = _.reduce( + const functions = reduce( functionNames, (reducer, name) => { (reducer as any)[name] = getFunctionCallCreator(name); diff --git a/lib/joiner.ts b/lib/joiner.ts index 6efd1a4c..8b775651 100644 --- a/lib/joiner.ts +++ b/lib/joiner.ts @@ -2,7 +2,7 @@ import { Table } from './table'; -const getPrimaryKeyColumn = (table: Table) => { +const getPrimaryKeyColumn = (table: Table) => { for (const col of table.columns) { if (col.primaryKey) { return col; @@ -11,7 +11,7 @@ const getPrimaryKeyColumn = (table: Table) => { return; }; -const findReference = (left: Table, right: Table) => { +const findReference = (left: Table, right: Table) => { // find reference for (const col of right.columns) { const references = col.references; @@ -39,7 +39,7 @@ const findReference = (left: Table, right: Table) => { // auto-join two tables based on column properties // requires one column to have { references: {table: 'foreignTableName', column: 'foreignColumnName'}} // or to have { references: 'foreignTableName'} -- in which case the foreign table's primary key is assumed -const leftJoin = (left: Table, right: Table) => { +const leftJoin = (left: Table, right: Table) => { let ref = findReference(left, right); if (!ref) { ref = findReference(right, left); diff --git a/lib/node/alias.ts b/lib/node/alias.ts index 2785610f..91397843 100644 --- a/lib/node/alias.ts +++ b/lib/node/alias.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import defaults from 'lodash/defaults'; import { Node } from '.'; export class AliasNode extends Node { @@ -11,7 +11,7 @@ export class AliasNode extends Node { const aliasNode = new AliasNode(this, alias); // defaults the properties of the aliased node - _.defaults(aliasNode, this); + defaults(aliasNode, this); return aliasNode; } diff --git a/lib/node/arrayCall.ts b/lib/node/arrayCall.ts index adf0a006..d95e671d 100644 --- a/lib/node/arrayCall.ts +++ b/lib/node/arrayCall.ts @@ -1,20 +1,21 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; +import flatten from 'lodash/flatten'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, ParameterNode, valueExpressionMixin } from '.'; export class ArrayCallNode extends Node { constructor(args: any[]) { super('ARRAY CALL'); - args = _.flatten(args); + args = flatten(args); this.addAll(args.map(ParameterNode.getNodeOrParameterNode)); } } // mix in value expression -_.extend(ArrayCallNode.prototype, valueExpressionMixin()); +extend(ArrayCallNode.prototype, valueExpressionMixin()); // allow aliasing -_.extend(ArrayCallNode.prototype, AliasNode.AliasMixin); +extend(ArrayCallNode.prototype, AliasNode.AliasMixin); export interface ArrayCallNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/at.ts b/lib/node/at.ts index 92fc6243..76041821 100644 --- a/lib/node/at.ts +++ b/lib/node/at.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -15,11 +15,11 @@ export class AtNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(AtNode.prototype, valueExpressionMixin()); + extend(AtNode.prototype, valueExpressionMixin()); } } } -_.extend(AtNode.prototype, AliasNode.AliasMixin); +extend(AtNode.prototype, AliasNode.AliasMixin); export interface AtNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/binary.ts b/lib/node/binary.ts index 7924191d..d6f57c8c 100644 --- a/lib/node/binary.ts +++ b/lib/node/binary.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -18,11 +18,11 @@ export class BinaryNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(BinaryNode.prototype, valueExpressionMixin()); + extend(BinaryNode.prototype, valueExpressionMixin()); } } } -_.extend(BinaryNode.prototype, AliasNode.AliasMixin); +extend(BinaryNode.prototype, AliasNode.AliasMixin); export interface BinaryNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/case.ts b/lib/node/case.ts index 81da7c66..b440477f 100644 --- a/lib/node/case.ts +++ b/lib/node/case.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -18,11 +18,11 @@ export class CaseNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(CaseNode.prototype, valueExpressionMixin()); + extend(CaseNode.prototype, valueExpressionMixin()); } } } -_.extend(CaseNode.prototype, AliasNode.AliasMixin); +extend(CaseNode.prototype, AliasNode.AliasMixin); export interface CaseNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/cast.ts b/lib/node/cast.ts index 5da364cf..43a93474 100644 --- a/lib/node/cast.ts +++ b/lib/node/cast.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -15,11 +15,11 @@ export class CastNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(CastNode.prototype, valueExpressionMixin()); + extend(CastNode.prototype, valueExpressionMixin()); } } } -_.extend(CastNode.prototype, AliasNode.AliasMixin); +extend(CastNode.prototype, AliasNode.AliasMixin); export interface CastNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/column.ts b/lib/node/column.ts index a9d71ef8..f2a3ac8c 100644 --- a/lib/node/column.ts +++ b/lib/node/column.ts @@ -13,7 +13,7 @@ export class ColumnNode extends Node { public constantValue?: any; public asArray?: boolean; public aggregator?: string; - public table?: Table; + public table?: Table; public value: any; public dataType?: string; public isDistinct?: boolean; @@ -29,11 +29,11 @@ export class ColumnNode extends Node { onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; }; - public subfieldContainer?: Column; - public subfields: { [key: string]: Column }; + public subfieldContainer?: Column; + public subfields: { [key: string]: Column }; public autoGenerated: boolean; public unique: boolean; - constructor(config: Column) { + constructor(config: Column) { super('COLUMN'); this.name = config.name; this.property = config.property || config.name; diff --git a/lib/node/createIndex.ts b/lib/node/createIndex.ts index fdd7381d..ce711c6a 100644 --- a/lib/node/createIndex.ts +++ b/lib/node/createIndex.ts @@ -1,21 +1,21 @@ 'use strict'; -import sliced = require('sliced'); +import sliced from 'sliced'; import { Node } from '.'; import { Column } from '../column'; import { Table } from '../table'; export class CreateIndexNode extends Node { - public table: Table; + public table: Table; public options: { indexName: string; - columns: Array>; + columns: Column[]; type?: string; algorithm?: string; parser?: string; }; - constructor(table: Table, indexName: string) { + constructor(table: Table, indexName: string) { super('CREATE INDEX'); this.table = table; @@ -42,7 +42,7 @@ export class CreateIndexNode extends Node { return this; } - public on(...columns: Array>) { + public on(...columns: Column[]) { const args = sliced(columns); this.options.columns = this.options.columns.concat(args); return this; diff --git a/lib/node/drop.ts b/lib/node/drop.ts index d450872a..414e5f83 100644 --- a/lib/node/drop.ts +++ b/lib/node/drop.ts @@ -4,7 +4,7 @@ import { Node } from '.'; import { Table } from '../table'; export class DropNode extends Node { - constructor(table: Table) { + constructor(table: Table) { super('DROP'); this.add(table); } diff --git a/lib/node/dropIndex.ts b/lib/node/dropIndex.ts index 741787a3..8b820693 100644 --- a/lib/node/dropIndex.ts +++ b/lib/node/dropIndex.ts @@ -5,10 +5,10 @@ import { Column } from '../column'; import { Table } from '../table'; export class DropIndexNode extends Node { - public table: Table; + public table: Table; public options: { indexName: string }; - constructor(table: Table, indexName: string | string[] | Array>) { + constructor(table: Table, indexName: string | string[] | Column[]) { super('DROP INDEX'); if (!indexName) { @@ -16,7 +16,7 @@ export class DropIndexNode extends Node { } else if (Array.isArray(indexName) && typeof indexName[0] === 'string') { indexName = indexName[0] as string; } else if (Array.isArray(indexName)) { - const columns = (indexName as Array>).map((col) => col.name).sort(); + const columns = (indexName as Column[]).map((col) => col.name).sort(); indexName = [table.getName()].concat(columns).join('_'); } diff --git a/lib/node/functionCall.ts b/lib/node/functionCall.ts index 64f81faa..b577e858 100644 --- a/lib/node/functionCall.ts +++ b/lib/node/functionCall.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, ParameterNode, valueExpressionMixin } from '.'; export class FunctionCallNode extends Node { @@ -13,8 +13,8 @@ export class FunctionCallNode extends Node { } // mix in value expression -_.extend(FunctionCallNode.prototype, valueExpressionMixin()); +extend(FunctionCallNode.prototype, valueExpressionMixin()); -_.extend(FunctionCallNode.prototype, AliasNode.AliasMixin); +extend(FunctionCallNode.prototype, AliasNode.AliasMixin); export interface FunctionCallNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/in.ts b/lib/node/in.ts index c126c9de..b7af2c65 100644 --- a/lib/node/in.ts +++ b/lib/node/in.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -16,11 +16,11 @@ export class InNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(InNode.prototype, valueExpressionMixin()); + extend(InNode.prototype, valueExpressionMixin()); } } } -_.extend(InNode.prototype, AliasNode.AliasMixin); +extend(InNode.prototype, AliasNode.AliasMixin); export interface InNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/indexes.ts b/lib/node/indexes.ts index 74334887..32097d0b 100644 --- a/lib/node/indexes.ts +++ b/lib/node/indexes.ts @@ -4,9 +4,9 @@ import { Node } from '.'; import { Table } from '../table'; export class IndexesNode extends Node { - public table: Table; + public table: Table; - constructor(table: Table) { + constructor(table: Table) { super('INDEXES'); this.table = table; diff --git a/lib/node/insert.ts b/lib/node/insert.ts index 52c73151..1f557118 100644 --- a/lib/node/insert.ts +++ b/lib/node/insert.ts @@ -7,7 +7,7 @@ import { INodeable } from '../nodeable'; export class InsertNode extends Node { public names: string[]; public columns: ColumnNode[]; - public valueSets: Array<{ [key: string]: ColumnNode }>; + public valueSets: { [key: string]: ColumnNode }[]; constructor() { super('INSERT'); this.names = []; @@ -15,7 +15,7 @@ export class InsertNode extends Node { this.valueSets = []; } - public add(nodes: Array> | Node | INodeable | string): this { + public add(nodes: Column[] | Node | INodeable | string): this { if (!Array.isArray(nodes)) { throw new Error('Not an array of column instances'); } diff --git a/lib/node/modifier.ts b/lib/node/modifier.ts index a9efcbe7..401944ea 100644 --- a/lib/node/modifier.ts +++ b/lib/node/modifier.ts @@ -1,9 +1,9 @@ import { Node, ParameterNode, Query } from '.'; export class ModifierNode extends Node { - public query: Query; + public query: Query; public count: Node; - constructor(query: Query, type: 'LIMIT' | 'OFFSET', count: any) { + constructor(query: Query, type: 'LIMIT' | 'OFFSET', count: any) { super(type); this.query = query; this.count = ParameterNode.getNodeOrParameterNode(count); diff --git a/lib/node/node.ts b/lib/node/node.ts index b16167f7..8f8d0cf9 100644 --- a/lib/node/node.ts +++ b/lib/node/node.ts @@ -1,6 +1,6 @@ 'use strict'; -import assert = require('assert'); +import assert from 'assert'; import { Query, TextNode } from '.'; import { DEFAULT_DIALECT, getDialect } from '../dialect'; import { Dialect } from '../dialect/dialect'; @@ -38,7 +38,7 @@ export abstract class Node implements INodeable { } public toQuery(dialect?: string) { const DialectClass = determineDialect(this, dialect); - return initializeDialect(DialectClass, this).getQuery(this as unknown as Query); + return initializeDialect(DialectClass, this).getQuery(this as unknown as Query); } public toNamedQuery(name: string, dialect?: string) { if (!name || typeof name !== 'string' || name === '') { @@ -49,9 +49,9 @@ export abstract class Node implements INodeable { } public toString(dialect?: string) { const DialectClass = determineDialect(this, dialect); - return initializeDialect(DialectClass, this).getString(this as unknown as Query); + return initializeDialect(DialectClass, this).getString(this as unknown as Query); } - public addAll(nodes: Array) { + public addAll(nodes: (Node | INodeable | string)[]) { for (let i = 0, len = nodes.length; i < len; i++) { this.add(nodes[i]); } diff --git a/lib/node/notIn.ts b/lib/node/notIn.ts index ec07298a..8e79336a 100644 --- a/lib/node/notIn.ts +++ b/lib/node/notIn.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -16,11 +16,11 @@ export class NotInNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(NotInNode.prototype, valueExpressionMixin()); + extend(NotInNode.prototype, valueExpressionMixin()); } } } -_.extend(NotInNode.prototype, AliasNode.AliasMixin); +extend(NotInNode.prototype, AliasNode.AliasMixin); export interface NotInNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/postfixUnary.ts b/lib/node/postfixUnary.ts index e3f1947f..efe105d4 100644 --- a/lib/node/postfixUnary.ts +++ b/lib/node/postfixUnary.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -16,11 +16,11 @@ export class PostfixUnaryNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(PostfixUnaryNode.prototype, valueExpressionMixin()); + extend(PostfixUnaryNode.prototype, valueExpressionMixin()); } } } -_.extend(PostfixUnaryNode.prototype, AliasNode.AliasMixin); +extend(PostfixUnaryNode.prototype, AliasNode.AliasMixin); export interface PostfixUnaryNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/prefixUnary.ts b/lib/node/prefixUnary.ts index de9bc30f..4b263e7a 100644 --- a/lib/node/prefixUnary.ts +++ b/lib/node/prefixUnary.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -16,11 +16,11 @@ export class PrefixUnaryNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(PrefixUnaryNode.prototype, valueExpressionMixin()); + extend(PrefixUnaryNode.prototype, valueExpressionMixin()); } } } -_.extend(PrefixUnaryNode.prototype, AliasNode.AliasMixin); +extend(PrefixUnaryNode.prototype, AliasNode.AliasMixin); export interface PrefixUnaryNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/query.ts b/lib/node/query.ts index 61898e39..98d887d5 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -1,8 +1,8 @@ 'use strict'; -import assert = require('assert'); -import _ = require('lodash'); -import sliced = require('sliced'); +import assert from 'assert'; +import extend from 'lodash/extend'; +import sliced from 'sliced'; import { AddColumnNode, @@ -56,7 +56,7 @@ import { INodeable, instanceofINodeable } from '../nodeable'; import { Table } from '../table'; // get the first element of an arguments if it is an array, else return arguments as an array -const getArrayOrArgsAsArray = (args: Array): T[] => { +const getArrayOrArgsAsArray = (args: (T | T[])[]): T[] => { const first = args[0]; if (Array.isArray(first)) { return first; @@ -128,7 +128,7 @@ export class Query extends Node { return this; } - public star(): Column { + public star(): Column { assert(this.type === 'SUBQUERY', 'star() can only be used on a subQuery'); return new Column({ star: true, @@ -138,8 +138,8 @@ export class Query extends Node { public from(node: INodeable[] | INodeable | string): this; public from(...nodes: INodeable[]): this; - public from(...nodes: Array): this { - const sourceNodes = Array.isArray(nodes[0]) ? (nodes[0] as Array>) : (nodes as Array>); + public from(...nodes: (string | INodeable | INodeable[])[]): this { + const sourceNodes = Array.isArray(nodes[0]) ? (nodes[0] as Table[]) : (nodes as Table[]); for (const node of sourceNodes) { this.add(new FromNode().add(node)); @@ -155,7 +155,7 @@ export class Query extends Node { public where(object: Partial | Node[] | Node | string): this; public where(...nodes: Node[]): this; - public where(...nodes: Array | string>): this { + public where(...nodes: (Node[] | Node | Partial | string)[]): this { if (nodes.length > 1) { // allow multiple where clause arguments const args = sliced(nodes as Node[]); @@ -194,7 +194,7 @@ export class Query extends Node { public order(node: INodeable[] | INodeable): this; public order(...nodes: INodeable[]): this; - public order(...nodes: Array): this { + public order(...nodes: (INodeable[] | INodeable)[]): this { const args: INodeable[] = getArrayOrArgsAsArray(nodes); let orderBy; if (args.length === 0) { @@ -212,7 +212,7 @@ export class Query extends Node { public group(node: INodeable[] | INodeable): this; public group(...nodes: INodeable[]): this; - public group(...nodes: Array): this { + public group(...nodes: (INodeable[] | INodeable)[]): this { const args: INodeable[] = getArrayOrArgsAsArray(nodes); const groupBy = new GroupByNode().addAll(args); return this.add(groupBy); @@ -220,17 +220,17 @@ export class Query extends Node { public having(node: INodeable[] | INodeable): this; public having(...nodes: INodeable[]): this; - public having(...nodes: Array): this { + public having(...nodes: (INodeable[] | INodeable)[]): this { const args: INodeable[] = getArrayOrArgsAsArray(nodes); const having = new HavingNode().addAll(args); return this.add(having); } - public insert(object: Array> | Column): this; - public insert(object: Array> | Partial): this; - public insert(...nodes: Array>): this; - public insert(...nodes: Array> | Column | Array> | Partial>): this { - let args = sliced(nodes) as Array>; + public insert(object: Column[] | Column): this; + public insert(object: Partial[] | Partial): this; + public insert(...nodes: Column[]): this; + public insert(...nodes: (Column[] | Column | Partial[] | Partial)[]): this { + let args = sliced(nodes) as Column[]; const object = nodes[0]; if (Array.isArray(object)) { @@ -258,11 +258,11 @@ export class Query extends Node { } } - public replace(object: Array> | Column): this; - public replace(object: Array> | Partial): this; - public replace(...nodes: Array>): this; - public replace(...nodes: Array> | Column | Array> | Partial>): this { - let args = sliced(nodes) as Array>; + public replace(object: Column[] | Column): this; + public replace(object: Partial[] | Partial): this; + public replace(...nodes: Column[]): this; + public replace(...nodes: (Column[] | Column | Partial[] | Partial)[]): this { + let args = sliced(nodes) as Column[]; const object = nodes[0]; if (Array.isArray(object)) { @@ -308,9 +308,9 @@ export class Query extends Node { return this.add(param); } - public delete(table: Array> | Table | Partial): this; + public delete(table: Table[] | Table | Partial): this; public delete(): this; - public delete(params?: Table | Array> | Partial): this { + public delete(params?: Table | Table[] | Partial): this { let result; if (params) { if (params instanceof Table || Array.isArray(params)) { @@ -430,7 +430,7 @@ export class Query extends Node { return this.add(new AlterNode()); } - public rename(newName: Column | string): this { + public rename(newName: Column | string): this { const renameClause = new RenameNode(); if (typeof newName === 'string') { newName = new Column({ @@ -443,7 +443,7 @@ export class Query extends Node { return this; } - public addColumn(column: Column | string, dataType?: string): this { + public addColumn(column: Column | string, dataType?: string): this { const addClause = new AddColumnNode(); if (typeof column === 'string') { column = new Column({ @@ -459,7 +459,7 @@ export class Query extends Node { return this; } - public dropColumn(column: Column | string): this { + public dropColumn(column: Column | string): this { const dropClause = new DropColumnNode(); if (typeof column === 'string') { column = new Column({ @@ -472,7 +472,7 @@ export class Query extends Node { return this; } - public renameColumn(oldColumn: Column | string, newColumn: Column | string): this { + public renameColumn(oldColumn: Column | string, newColumn: Column | string): this { const renameClause = new RenameColumnNode(); if (typeof oldColumn === 'string') { oldColumn = new Column({ @@ -562,14 +562,14 @@ export class Query extends Node { const valueExpressions = valueExpressionMixin(); delete valueExpressions.or; delete valueExpressions.and; -_.extend(Query.prototype, valueExpressions); +extend(Query.prototype, valueExpressions); // Extend the query with the aliasMixin so that it's possible to write queries like // const query=sql.select(a.select(a.count()).as("column1")) // which generates: // SELECT (SELECT COUNT(*) FROM a) AS "column1" -_.extend(Query.prototype, AliasNode.AliasMixin); +extend(Query.prototype, AliasNode.AliasMixin); export interface Query extends IValueExpressionMixinBase, IAliasMixin {} -export type SubQuery = Query & { [key: string]: Column }; +export type SubQuery = Query & { [key: string]: Column }; diff --git a/lib/node/replace.ts b/lib/node/replace.ts index 5822c346..85a7fcce 100644 --- a/lib/node/replace.ts +++ b/lib/node/replace.ts @@ -7,7 +7,7 @@ import { INodeable } from '../nodeable'; export class ReplaceNode extends Node { public columns: ColumnNode[]; public names: string[]; - public valueSets: Array<{ [key: string]: ColumnNode }>; + public valueSets: { [key: string]: ColumnNode }[]; constructor() { super('REPLACE'); this.names = []; @@ -15,7 +15,7 @@ export class ReplaceNode extends Node { this.valueSets = []; } - public add(nodes: Array> | Node | INodeable | string): this { + public add(nodes: Column[] | Node | INodeable | string): this { if (!Array.isArray(nodes)) { throw new Error('Not an array of column instances'); } diff --git a/lib/node/slice.ts b/lib/node/slice.ts index f7037606..354aef76 100644 --- a/lib/node/slice.ts +++ b/lib/node/slice.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -17,11 +17,11 @@ export class SliceNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(SliceNode.prototype, valueExpressionMixin()); + extend(SliceNode.prototype, valueExpressionMixin()); } } } -_.extend(SliceNode.prototype, AliasNode.AliasMixin); +extend(SliceNode.prototype, AliasNode.AliasMixin); export interface SliceNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/table.ts b/lib/node/table.ts index dcd73fd8..bc3f7b6b 100644 --- a/lib/node/table.ts +++ b/lib/node/table.ts @@ -4,8 +4,8 @@ import { Node } from '.'; import { Table } from '../table'; export class TableNode extends Node { - public table: Table; - constructor(table: Table) { + public table: Table; + constructor(table: Table) { super('TABLE'); this.table = table; } diff --git a/lib/node/ternary.ts b/lib/node/ternary.ts index 15ad394b..7b63f017 100644 --- a/lib/node/ternary.ts +++ b/lib/node/ternary.ts @@ -1,6 +1,6 @@ 'use strict'; -import _ = require('lodash'); +import extend from 'lodash/extend'; import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; let valueExpressionMixed = false; @@ -22,11 +22,11 @@ export class TernaryNode extends Node { // mixin only once. ValueExpressionMixin has circular dependencies. if (!valueExpressionMixed) { valueExpressionMixed = true; - _.extend(TernaryNode.prototype, valueExpressionMixin()); + extend(TernaryNode.prototype, valueExpressionMixin()); } } } -_.extend(TernaryNode.prototype, AliasNode.AliasMixin); +extend(TernaryNode.prototype, AliasNode.AliasMixin); export interface TernaryNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/node/truncate.ts b/lib/node/truncate.ts index 539fd887..4b51752f 100644 --- a/lib/node/truncate.ts +++ b/lib/node/truncate.ts @@ -4,7 +4,7 @@ import { Node } from '.'; import { Table } from '../table'; export class TruncateNode extends Node { - constructor(table: Table) { + constructor(table: Table) { super('TRUNCATE'); this.add(table); } diff --git a/lib/node/where.ts b/lib/node/where.ts index dc2fcb6a..a66dbbb0 100644 --- a/lib/node/where.ts +++ b/lib/node/where.ts @@ -4,7 +4,7 @@ import { BinaryNode, Node, TextNode } from '.'; import { INodeable, instanceofINodeable } from '../nodeable'; import { Table } from '../table'; -const normalizeNode = (table: Table, node: Node[] | Node | INodeable | object | string): Node => { +const normalizeNode = (table: Table, node: Node[] | Node | INodeable | object | string): Node => { if (typeof node === 'string') { return new TextNode(`(${node})`); } else if (Array.isArray(node)) { @@ -33,8 +33,8 @@ const normalizeNode = (table: Table, node: Node[] | Node | INodeable | obje }; export class WhereNode extends Node { - public table: Table; - constructor(table: Table) { + public table: Table; + constructor(table: Table) { super('WHERE'); this.table = table; } diff --git a/lib/sql.ts b/lib/sql.ts index 39226b55..30f66b73 100644 --- a/lib/sql.ts +++ b/lib/sql.ts @@ -1,7 +1,7 @@ 'use strict'; -import _ = require('lodash'); -import sliced = require('sliced'); +import defaults from 'lodash/defaults'; +import sliced from 'sliced'; import { Column } from './column'; import { SQLDialects, TableDefinition } from './configTypes'; import { DEFAULT_DIALECT, getDialect } from './dialect'; @@ -30,7 +30,7 @@ class Sql { } // Define a table public define(def: TableDefinition): TableWithColumns { - def = _.defaults(def || {}, { + def = defaults(def || {}, { sql: this }); return Table.define(def); diff --git a/lib/table.ts b/lib/table.ts index c21a529c..145fdb26 100644 --- a/lib/table.ts +++ b/lib/table.ts @@ -1,7 +1,7 @@ 'use strict'; -import lodash = require('lodash'); - +import map from 'lodash/map'; +import fromPairs from 'lodash/fromPairs'; import { Column } from './column'; import { ColumnDefinition, TableDefinition } from './configTypes'; import { leftJoin } from './joiner'; @@ -48,7 +48,7 @@ export class Table implements INodeable { public columnWhiteList: boolean; public isTemporary: boolean; public snakeToCamel: boolean; - public columns: Array>; + public columns: Column[]; public foreignKeys: ForeignKeyNode[]; public table: this; public sql!: Sql; @@ -87,18 +87,16 @@ export class Table implements INodeable { ...(config || {}) } as any); } - public createColumn(col: string | ColumnDefinition | Column): Column { + public createColumn(col: string | ColumnDefinition | Column): Column { if (!(col instanceof Column)) { if (typeof col === 'string') { // tslint:disable-next-line:no-object-literal-type-assertion col = { name: col } as ColumnDefinition; } - const column = new Column({ ...col, table: this }); + const column = new Column({ ...col, table: this }); // Load subfields from array into an object of form name: Column if (Array.isArray(col.subfields)) { - column.subfields = lodash - .chain(col.subfields) - .map((subfield) => { + column.subfields = fromPairs(map(col.subfields, (subfield) => { return [ subfield, new Column({ @@ -107,15 +105,13 @@ export class Table implements INodeable { table: this }) ]; - }) - .fromPairs() - .value(); + })); } return column; } return col; } - public addColumn(col: string | ColumnDefinition | Column, options?: any) { + public addColumn(col: string | ColumnDefinition | Column, options?: any) { const column = this.createColumn(col); options = { noisy: true, ...options }; if (this.hasColumn(column)) { @@ -140,7 +136,7 @@ export class Table implements INodeable { (this as any)[property] = (this as any)[property] || column; return this; } - public hasColumn(col: Column | string): boolean { + public hasColumn(col: Column | string): boolean { const columnName = col instanceof Column ? col.name : col; return this.columns.some((column) => column.property === columnName || column.name === columnName); } @@ -170,9 +166,9 @@ export class Table implements INodeable { } return this.tableName; } - public star(): Column; + public star(): Column; public star(options: { prefix: string }): ColumnNode[]; - public star(options?: any): Column | ColumnNode[] { + public star(options?: any): Column | ColumnNode[] { options = options || {}; if ('prefix' in options) { return this.columns.map((column) => column.as(options.prefix + column.name)); @@ -184,7 +180,7 @@ export class Table implements INodeable { } public count(alias?: string): ColumnNode { const name = this.alias || this.tableName; - const col: Column = new Column({ table: this, star: true }); + const col: Column = new Column({ table: this, star: true }); // ColumnNode return col.count(alias || name + '_count'); } @@ -207,12 +203,12 @@ export class Table implements INodeable { }; return query as SubQuery; } - public insert(object: Array> | Column): Query; - public insert(object: Array> | PartialNodeable): Query; - public insert(...nodes: Array>): Query; - public insert(...nodes: Array> | Column | Array> | PartialNodeable>): Query { + public insert(object: Column[] | Column): Query; + public insert(object: PartialNodeable[] | PartialNodeable): Query; + public insert(...nodes: Column[]): Query; + public insert(...nodes: (Column[] | Column | PartialNodeable[] | PartialNodeable)[]): Query { const query = new Query(this); - if (!nodes[0] || (Array.isArray(nodes[0]) && (nodes[0] as Array> | Array>).length === 0)) { + if (!nodes[0] || (Array.isArray(nodes[0]) && (nodes[0] as Column[] | PartialNodeable[]).length === 0)) { query.select(this.star()); query.where('1=2'); } else { @@ -220,12 +216,12 @@ export class Table implements INodeable { } return query; } - public replace(object: Array> | Column): Query; - public replace(object: Array> | PartialNodeable): Query; - public replace(...nodes: Array>): Query; - public replace(...nodes: Array> | Column | Array> | PartialNodeable>): Query { + public replace(object: Column[] | Column): Query; + public replace(object: PartialNodeable[] | PartialNodeable): Query; + public replace(...nodes: Column[]): Query; + public replace(...nodes: (Column[] | Column | PartialNodeable[] | PartialNodeable)[]): Query { const query = new Query(this); - if (!nodes[0] || (Array.isArray(nodes[0]) && (nodes[0] as Array> | Array>).length === 0)) { + if (!nodes[0] || (Array.isArray(nodes[0]) && (nodes[0] as Column[] | PartialNodeable[]).length === 0)) { query.select(this.star()); query.where('1=2'); } else { @@ -243,7 +239,7 @@ export class Table implements INodeable { return new JoinNode('LEFT', this.toNode(), other.toNode()); } // auto-join tables based on column intropsection - public joinTo(other: Table): JoinNode { + public joinTo(other: Table): JoinNode { return leftJoin(this, other); } public as(alias: string): TableWithColumns { @@ -265,7 +261,7 @@ export class Table implements INodeable { const queryMethods = ['alter', 'create', 'delete', 'drop', 'from', 'limit', 'offset', 'or', 'order', 'truncate', 'update', 'where']; queryMethods.forEach((method) => { - (Table.prototype as any)[method] = function(this: Table, ...args: any[]) { + (Table.prototype as any)[method] = function(this: Table, ...args: any[]) { const query = new Query(this); (query as any)[method].apply(query, args); return query; @@ -277,13 +273,13 @@ type PartialNodeable = { [P in keyof T]?: T[P] | INodeable | Buffer }; export interface Table { alter(): Query; create(): Query; - delete(table: Array> | Table | Partial): Query; + delete(table: Table[] | Table | Table | Partial): Query; delete(): Query; drop(): Query; - from(table: Array> | Table | JoinNode): Query; - from(...tables: Array>): Query; - limit(count: any): Query; - offset(count: any): Query; + from(table: Table[] | Table | Table | JoinNode): Query; + from(...tables: Table[]): Query; + limit(count: unknown): Query; + offset(count: unknown): Query; or(object: Partial | Node | string): Query; order(node: INodeable[] | INodeable): Query; order(...nodes: INodeable[]): Query; @@ -296,13 +292,13 @@ export interface Table { interface IndexQuery { create(indexName?: string): IndexCreationQuery; drop(indexName: string): Node; - drop(...columns: Array>): Node; + drop(...columns: Column[]): Node; } interface IndexCreationQuery extends Node { unique(): IndexCreationQuery; using(name: string): IndexCreationQuery; - on(...columns: Array | OrderByValueNode>): IndexCreationQuery; + on(...columns: (Column | OrderByValueNode)[]): IndexCreationQuery; withParser(parserName: string): IndexCreationQuery; fulltext(): IndexCreationQuery; spatial(): IndexCreationQuery; diff --git a/lib/tableTracker.ts b/lib/tableTracker.ts index f6306d6c..348a07e7 100644 --- a/lib/tableTracker.ts +++ b/lib/tableTracker.ts @@ -1,7 +1,7 @@ import { Table } from './table'; export interface ITableTracker { - table?: Table; + table?: Table; } export function hasTable(o: object): o is Required { diff --git a/lib/types.d.ts.old b/lib/types.d.ts.old deleted file mode 100644 index 84fb7ab3..00000000 --- a/lib/types.d.ts.old +++ /dev/null @@ -1,221 +0,0 @@ - -/** - * This is an adaptation of https://github.com/doxout/anydb-sql/blob/4e4c0ff4a7f2efb7f820baaafea1f624f1ae0399/d.ts/anydb-sql.d.ts - * Whole project is MIT licensed, so, we can use it. We also feed back any - * improvements, questions, concerns. - */ -declare module "sql" { - - type SQLDialects = - | "mssql" - | "mysql" - | "oracle" - | "postgres" - | "sqlite" - ; - - interface OrderByValueNode {} - - interface Named { - name?: Name; - } - interface ColumnDefinition extends Named { - jsType?: Type; - dataType: string; - primaryKey?: boolean; - references?: { - table:string; - column: string; - onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; - onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; - }; - notNull?: boolean; - unique?: boolean; - defaultValue?: Type; - } - - interface TableDefinition { - name: Name; - schema: string; - columns: {[CName in keyof Row]: ColumnDefinition}; - dialect?: SQLDialects; - isTemporary?: boolean; - foreignKeys?: { - table: string, - columns: (keyof Row)[], - refColumns: string[], - onDelete?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; - onUpdate?: 'restrict' | 'cascade' | 'no action' | 'set null' | 'set default'; - } - } - - interface QueryLike { - values: any[] - text:string - } - - interface Executable { - toQuery():QueryLike; - } - - interface Queryable extends Executable { - where(...nodes:any[]):Query - delete():ModifyingQuery - select(star: Column): Query; - select(n1: Column):Query<{[N in N1]: T1}>; - select( - n1: Column, - n2: Column):Query<{[N in N1]: T1} & {[N in N2]: T2}> - select( - n1: Column, - n2: Column, - n3: Column):Query<{[N in N1]: T1} & {[N in N2]: T2} & {[N in N3]: T3}> - select(...nodesOrTables:any[]):Query - - } - - interface Query extends Executable, Queryable { - resultType: T; - - from(table:TableNode):Query - from(statement:string):Query - update(o:{[key: string]:any}):ModifyingQuery - update(o:{}):ModifyingQuery - group(...nodes:any[]):Query - order(...criteria:OrderByValueNode[]):Query - limit(l:number):Query - offset(o:number):Query - } - - interface SubQuery { - select(node:Column):SubQuery - select(...nodes: any[]):SubQuery - where(...nodes:any[]):SubQuery - from(table:TableNode):SubQuery - from(statement:string):SubQuery - group(...nodes:any[]):SubQuery - order(criteria:OrderByValueNode):SubQuery - exists():BinaryNode - notExists(): BinaryNode; - notExists(subQuery:SubQuery):BinaryNode - } - - - interface ModifyingQuery extends Executable { - returning(...nodes:any[]):Query - where(...nodes:any[]):ModifyingQuery - } - - interface TableNode { - join(table:TableNode):JoinTableNode - leftJoin(table:TableNode):JoinTableNode - } - - interface JoinTableNode extends TableNode { - on(filter:BinaryNode):TableNode - on(filter:string):TableNode - } - - interface CreateQuery extends Executable { - ifNotExists():Executable - } - interface DropQuery extends Executable { - ifExists():Executable - } - - type Columns = { - [Name in keyof T]: Column - } - type Table = TableNode & Queryable & Named & Columns & { - getName(): string; - getSchema(): string; - - literal(statement: string): any; - - create():CreateQuery - drop():DropQuery - as(name:OtherName):Table - update(o: Partial):ModifyingQuery - insert(row:T):ModifyingQuery - insert(rows:T[]):ModifyingQuery - select():Query - select(...nodes:any[]):Query - from(table:TableNode):Query - from(statement:string):Query - star():Column - subQuery():SubQuery - columns:Column[] - sql: SQL; - alter():AlterQuery; - indexes(): IndexQuery; - } - - interface AlterQuery extends Executable { - addColumn(column:Column): AlterQuery; - addColumn(name: string, options:string): AlterQuery; - dropColumn(column: Column|string): AlterQuery; - renameColumn(column: Column, newColumn: Column):AlterQuery; - renameColumn(column: Column, newName: string):AlterQuery; - renameColumn(name: string, newName: string):AlterQuery; - rename(newName: string): AlterQuery - } - interface IndexQuery { - create(): IndexCreationQuery; - create(indexName: string): IndexCreationQuery; - drop(indexName: string): Executable; - drop(...columns: Column[]): Executable - } - interface IndexCreationQuery extends Executable { - unique(): IndexCreationQuery; - using(name: string): IndexCreationQuery; - on(...columns: (Column|OrderByValueNode)[]): IndexCreationQuery; - withParser(parserName: string): IndexCreationQuery; - fulltext(): IndexCreationQuery; - spatial(): IndexCreationQuery; - } - - interface SQL { - functions: { - LOWER(c:Column):Column - } - } - - interface BinaryNode { - and(node:BinaryNode):BinaryNode - or(node:BinaryNode):BinaryNode - } - - interface Column { - name: Name - in(arr:T[]):BinaryNode - in(subQuery:SubQuery):BinaryNode - notIn(arr:T[]):BinaryNode - equals(node: T|Column):BinaryNode - notEquals(node: T|Column):BinaryNode - gte(node: T|Column):BinaryNode - lte(node: T|Column):BinaryNode - gt(node:T|Column):BinaryNode - lt(node: T|Column):BinaryNode - like(str:string):BinaryNode - multiply:{ - (node:Column):Column - (n:number):Column //todo check column names - } - isNull():BinaryNode - isNotNull():BinaryNode - //todo check column names - sum():Column - count():Column - count(name:string):Column - distinct():Column - as(name:OtherName):Column - ascending:OrderByValueNode - descending:OrderByValueNode - asc:OrderByValueNode - desc:OrderByValueNode - } - - function define(map:TableDefinition): Table; - function setDialect(dialect: SQLDialects): void; - -} diff --git a/package-lock.json b/package-lock.json index 2f5c4d47..7f1cb5d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,35 +5,41 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.10.4" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@types/lodash": { - "version": "4.14.123", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", - "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==", + "version": "4.14.157", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.157.tgz", + "integrity": "sha512-Ft5BNFmv2pHDgxV5JDsndOWTRJ+56zte0ZpYLowp03tW+K+t8u8YMOzAnpuqPgzX6WO1XpDIUm7u04M8vdDiVQ==", "dev": true }, "@types/mocha": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.6.tgz", - "integrity": "sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", "dev": true }, "@types/node": { @@ -42,6 +48,18 @@ "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", "dev": true }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -51,10 +69,20 @@ "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "argparse": { @@ -66,12 +94,30 @@ "sprintf-js": "~1.0.2" } }, + "array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -82,6 +128,15 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -100,6 +155,12 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -111,6 +172,61 @@ "supports-color": "^5.3.0" } }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -139,20 +255,92 @@ "dev": true }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" } }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -165,11 +353,33 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + } }, "fs.realpath": { "version": "1.0.0", @@ -177,10 +387,29 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -191,22 +420,46 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "inflight": { @@ -225,6 +478,130 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "requires": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -232,24 +609,42 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "minimatch": { @@ -261,62 +656,102 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz", + "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==", "dev": true, "requires": { + "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", + "chokidar": "3.3.1", + "debug": "3.2.6", + "diff": "4.0.2", "escape-string-regexp": "1.0.5", - "glob": "7.1.2", + "find-up": "4.1.0", + "glob": "7.1.6", "growl": "1.10.5", - "he": "1.1.1", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" + "ms": "2.1.2", + "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "3.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" }, "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -326,6 +761,36 @@ "wrappy": "1" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -338,19 +803,71 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "dev": true, + "requires": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "resolve": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", - "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "serialize-javascript": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", + "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "sliced": { @@ -365,9 +882,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -376,10 +893,55 @@ }, "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -389,44 +951,89 @@ "has-flag": "^3.0.0" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "ts-node": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", - "integrity": "sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A==", + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", + "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", "dev": true, "requires": { "arg": "^4.1.0", - "diff": "^3.1.0", + "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } } }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" }, "tslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", - "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", + "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", - "diff": "^3.2.0", + "diff": "^4.0.1", "glob": "^7.1.1", - "js-yaml": "^3.13.0", + "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.8.0", + "tslib": "^1.10.0", "tsutils": "^2.29.0" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } } }, "tslint-config-prettier": { @@ -442,24 +1049,208 @@ "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + } } }, "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", + "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", "dev": true }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + }, "yn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", - "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true } } diff --git a/package.json b/package.json index 6cbfcebb..b88388f3 100644 --- a/package.json +++ b/package.json @@ -12,31 +12,41 @@ "type": "git", "url": "git://github.com/charsleysa/node-sql-ts.git" }, - "main": "dist/", - "types": "dist/index.d.ts", + "main": "dist/cjs/", + "module": "dist/esm/", + "types": "dist/esm/index.d.ts", "scripts": { "pretest": "tslint --project .", - "test": "node_modules/.bin/mocha --opts ./test/mocha.opts", + "test": "TS_NODE_PROJECT='test/tsconfig.json' mocha", "lint": "tslint --project .", - "release:major": "npm run test && tsc && npm version major -m \"Bump version\" && git push origin master --tags && npm publish", - "release:minor": "npm run test && tsc && npm version minor -m \"Bump version\" && git push origin master --tags && npm publish", - "release:patch": "npm run test && tsc && npm version patch -m \"Bump version\" && git push origin master --tags && npm publish" + "tsc": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", + "release:major": "npm run test && npm run tsc && npm version major -m \"Bump version\" && git push origin master --tags && npm publish", + "release:minor": "npm run test && npm run tsc && npm version minor -m \"Bump version\" && git push origin master --tags && npm publish", + "release:patch": "npm run test && npm run tsc && npm version patch -m \"Bump version\" && git push origin master --tags && npm publish" }, "engines": { - "node": "*" + "node": "^12.0.0 || >=14.0.0" }, "dependencies": { "sliced": "~1.0.x", - "lodash": "~4.17.x" + "lodash": "~4.17.15", + "tslib": "~2.0.0" }, "devDependencies": { - "@types/lodash": "^4.14.123", - "@types/mocha": "^5.2.6", + "@types/lodash": "^4.14.157", + "@types/mocha": "^7.0.2", "@types/node": "^12.0.0", - "mocha": "*", - "typescript": "^3.4.5", - "ts-node": "^8.1.0", - "tslint": "^5.16.0", - "tslint-config-prettier": "^1.18.0" + "mocha": "^8.0.1", + "ts-node": "^8.10.2", + "tslint": "^6.1.2", + "tslint-config-prettier": "^1.18.0", + "typescript": "^3.9.6" + }, + "mocha": { + "reporter": "dot", + "ui": "tdd", + "require": "ts-node/register", + "watch-extensions": "tsx,ts", + "spec": "test/*.ts" } } diff --git a/test/column-tests.ts b/test/column-tests.ts index 02ac4a73..8a83af89 100644 --- a/test/column-tests.ts +++ b/test/column-tests.ts @@ -5,30 +5,30 @@ import { Sql } from '../lib'; const sql = new Sql(); -describe('column', function() { +suite('column', function() { const table = sql.define<{ id: number; created: boolean; alias: string }>({ name: 'user', columns: ['id', 'created', 'alias'] }); - it('can be accessed by property and array', function() { + test('can be accessed by property and array', function() { equal(table.created, table.columns[1], 'should be able to access created both by array and property'); }); - describe('toQuery()', function() { - it('works', function() { + suite('toQuery()', function() { + test('works', function() { equal(table.id.toQuery().text, '"user"."id"'); }); - it('works with a column name of "alias"', function() { + test('works with a column name of "alias"', function() { equal(table.alias.toQuery().text, '"user"."alias"'); }); - it('respects AS rename', function() { + test('respects AS rename', function() { equal(table.id.as('userId').toQuery().text, '"user"."id" AS "userId"'); }); - it('respects count and distinct', function() { + test('respects count and distinct', function() { equal( table.id .count() @@ -39,32 +39,32 @@ describe('column', function() { ); }); - describe('in subquery with min', function() { + suite('in subquery with min', function() { const subquery = table.subQuery('subTable').select(table.id.min().as('subId')); const col = subquery.subId.toQuery().text; equal(col, '"subTable"."subId"'); }); - describe('property', function() { + suite('property', function() { const table = sql.define<{ propertyName: string }>({ name: 'roundtrip', columns: { column_name: { property: 'propertyName' } } }); - it('used as alias when !== column name', function() { + test('used as alias when !== column name', function() { equal(table.propertyName.toQuery().text, '"roundtrip"."column_name" AS "propertyName"'); }); - it('uses explicit alias when !== column name', function() { + test('uses explicit alias when !== column name', function() { equal(table.propertyName.as('alias').toQuery().text, '"roundtrip"."column_name" AS "alias"'); }); - it('maps to column name in insert', function() { + test('maps to column name in insert', function() { equal(table.insert({ propertyName: 'propVal' }).toQuery().text, 'INSERT INTO "roundtrip" ("column_name") VALUES ($1)'); }); - it('maps to column name in update', function() { + test('maps to column name in update', function() { equal(table.update({ propertyName: 'propVal' }).toQuery().text, 'UPDATE "roundtrip" SET "column_name" = $1'); }); - it('explicitly selected by *', function() { + test('explicitly selected by *', function() { equal( table .select(table.star()) @@ -75,7 +75,7 @@ describe('column', function() { }); }); - describe('autoGenerate', function() { + suite('autoGenerate', function() { const table = sql.define({ name: 'ag', columns: { @@ -83,44 +83,44 @@ describe('column', function() { name: {} } }); - it('does not include auto generated columns in insert', function() { + test('does not include auto generated columns in insert', function() { equal(table.insert({ id: 0, name: 'name' }).toQuery().text, 'INSERT INTO "ag" ("name") VALUES ($1)'); }); - it('does not include auto generated columns in update', function() { + test('does not include auto generated columns in update', function() { equal(table.update({ id: 0, name: 'name' }).toQuery().text, 'UPDATE "ag" SET "name" = $1'); }); }); - describe('white listed', function() { + suite('white listed', function() { const table = sql.define({ name: 'wl', columnWhiteList: true, columns: ['id', 'name'] }); - it('excludes insert properties that are not a column', function() { + test('excludes insert properties that are not a column', function() { equal( table.insert({ id: 0, _private: '_private', name: 'name' }).toQuery().text, 'INSERT INTO "wl" ("id", "name") VALUES ($1, $2)' ); }); - it('excludes update properties that are not a column', function() { + test('excludes update properties that are not a column', function() { // for testing purposes ignore the compile-time error //@ts-ignore equal(table.update({ id: 0, _private: '_private', name: 'name' }).toQuery().text, 'UPDATE "wl" SET "id" = $1, "name" = $2'); }); }); - describe('not white listed', function() { + suite('not white listed', function() { const table = sql.define({ name: 'wl', columns: ['id', 'name'] }); - it('throws for insert properties that are not a column', function() { + test('throws for insert properties that are not a column', function() { throws(function() { table.insert({ id: 0, _private: '_private', name: 'name' }); }, Error); }); - it('throws for update properties that are not a column', function() { + test('throws for update properties that are not a column', function() { throws(function() { // for testing purposes ignore the compile-time error //@ts-ignore @@ -129,7 +129,7 @@ describe('column', function() { }); }); - describe('snake to camel', function() { + suite('snake to camel', function() { const table = sql.define<{ makeMeCamel: number; not2Cam: string }>({ name: 'sc', snakeToCamel: true, @@ -138,13 +138,13 @@ describe('column', function() { not_to_camel: { property: 'not2Cam' } } }); - it('for snake column names with no explicit property name', function() { + test('for snake column names with no explicit property name', function() { equal(table.makeMeCamel.toQuery().text, '"sc"."make_me_camel" AS "makeMeCamel"'); }); - it('but not when with explicit property name', function() { + test('but not when with explicit property name', function() { equal(table.not2Cam.toQuery().text, '"sc"."not_to_camel" AS "not2Cam"'); }); - it('does not use property alias within CASE ... END', function() { + test('does not use property alias within CASE ... END', function() { equal( table.makeMeCamel .case([table.makeMeCamel.equals(0)], [table.makeMeCamel]) @@ -153,7 +153,7 @@ describe('column', function() { '(CASE WHEN ("sc"."make_me_camel" = $1) THEN "sc"."make_me_camel" END) AS "rename"' ); }); - it('respects AS rename in RETURNING clause', function() { + test('respects AS rename in RETURNING clause', function() { equal( table .update({ makeMeCamel: 0 }) diff --git a/test/dialects/insert-tests.ts b/test/dialects/insert-tests.ts index 394d76e4..51ac8ce8 100644 --- a/test/dialects/insert-tests.ts +++ b/test/dialects/insert-tests.ts @@ -581,7 +581,7 @@ Harness.test({ // Binary inserts Harness.test({ - query: post.insert(post.content.value(new Buffer('test')), post.userId.value(2)), + query: post.insert(post.content.value(Buffer.from('test')), post.userId.value(2)), pg: { text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2)', string: 'INSERT INTO "post" ("content", "userId") VALUES (\'\\x74657374\', 2)' @@ -602,12 +602,12 @@ Harness.test({ text: 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', string: 'INSERT INTO "post" ("content", "userId") VALUES (utl_raw.cast_to_varchar2(hextoraw(\'74657374\')), 2)' }, - params: [new Buffer('test'), 2] + params: [Buffer.from('test'), 2] }); Harness.test({ query: post.insert({ - content: new Buffer('test'), + content: Buffer.from('test'), userId: 2 }), pg: { @@ -630,16 +630,16 @@ Harness.test({ text: 'INSERT INTO "post" ("content", "userId") VALUES (:1, :2)', string: 'INSERT INTO "post" ("content", "userId") VALUES (utl_raw.cast_to_varchar2(hextoraw(\'74657374\')), 2)' }, - params: [new Buffer('test'), 2] + params: [Buffer.from('test'), 2] }); Harness.test({ query: post.insert([ { - content: new Buffer('whoah') + content: Buffer.from('whoah') }, { - content: new Buffer('hey') + content: Buffer.from('hey') } ]), pg: { @@ -663,7 +663,7 @@ Harness.test({ string: 'INSERT INTO "post" ("content") VALUES (utl_raw.cast_to_varchar2(hextoraw(\'77686f6168\'))), (utl_raw.cast_to_varchar2(hextoraw(\'686579\')))' }, - params: [new Buffer('whoah'), new Buffer('hey')] + params: [Buffer.from('whoah'), Buffer.from('hey')] }); Harness.test({ diff --git a/test/dialects/replace-tests.ts b/test/dialects/replace-tests.ts index f453b6da..13b5cbaf 100644 --- a/test/dialects/replace-tests.ts +++ b/test/dialects/replace-tests.ts @@ -520,7 +520,7 @@ Harness.test({ // Binary replaces Harness.test({ - query: post.replace(post.content.value(new Buffer('test')), post.userId.value(2)), + query: post.replace(post.content.value(Buffer.from('test')), post.userId.value(2)), pg: { throws: true }, @@ -538,12 +538,12 @@ Harness.test({ oracle: { throws: true }, - params: [new Buffer('test'), 2] + params: [Buffer.from('test'), 2] }); Harness.test({ query: post.replace({ - content: new Buffer('test'), + content: Buffer.from('test'), userId: 2 }), pg: { @@ -563,16 +563,16 @@ Harness.test({ oracle: { throws: true }, - params: [new Buffer('test'), 2] + params: [Buffer.from('test'), 2] }); Harness.test({ query: post.replace([ { - content: new Buffer('whoah') + content: Buffer.from('whoah') }, { - content: new Buffer('hey') + content: Buffer.from('hey') } ]), pg: { @@ -592,7 +592,7 @@ Harness.test({ oracle: { throws: true }, - params: [new Buffer('whoah'), new Buffer('hey')] + params: [Buffer.from('whoah'), Buffer.from('hey')] }); Harness.test({ diff --git a/test/dialects/support.ts b/test/dialects/support.ts index 8178596c..c4eb343d 100644 --- a/test/dialects/support.ts +++ b/test/dialects/support.ts @@ -1,5 +1,5 @@ 'use strict'; -import assert = require('assert'); +import assert from 'assert'; import { Mssql } from '../../lib/dialect/mssql'; import { Mysql } from '../../lib/dialect/mysql'; diff --git a/test/dialects/tostring-tests.ts b/test/dialects/tostring-tests.ts index b16a053e..e311da29 100644 --- a/test/dialects/tostring-tests.ts +++ b/test/dialects/tostring-tests.ts @@ -1,6 +1,6 @@ 'use strict'; -import assert = require('assert'); +import assert from 'assert'; import * as Harness from './support'; const post = Harness.definePostTable(); diff --git a/test/dialects/update-tests.ts b/test/dialects/update-tests.ts index 0ad48cff..51fe3157 100644 --- a/test/dialects/update-tests.ts +++ b/test/dialects/update-tests.ts @@ -183,7 +183,7 @@ Harness.test({ Harness.test({ query: post.update({ //@ts-ignore should investigate whether this should be valid for typings - content: new Buffer('test') + content: Buffer.from('test') }), pg: { text: 'UPDATE "post" SET "content" = $1', @@ -201,7 +201,7 @@ Harness.test({ text: 'UPDATE "post" SET "content" = :1', string: 'UPDATE "post" SET "content" = utl_raw.cast_to_varchar2(hextoraw(\'74657374\'))' }, - params: [new Buffer('test')] + params: [Buffer.from('test')] }); // Boolean updates diff --git a/test/dialects/value-expression-tests.ts b/test/dialects/value-expression-tests.ts index d42bb1a3..2f9c9a15 100644 --- a/test/dialects/value-expression-tests.ts +++ b/test/dialects/value-expression-tests.ts @@ -147,7 +147,7 @@ Harness.test({ }); Harness.test({ - query: post.select(post.id).where(post.content.equals(new Buffer('test'))), + query: post.select(post.id).where(post.content.equals(Buffer.from('test'))), pg: { text: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = $1)', string: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = \'\\x74657374\')' @@ -164,5 +164,5 @@ Harness.test({ text: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = :1)', string: 'SELECT "post"."id" FROM "post" WHERE ("post"."content" = utl_raw.cast_to_varchar2(hextoraw(\'74657374\')))' }, - params: [new Buffer('test')] + params: [Buffer.from('test')] }); diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index 3a40897e..00000000 --- a/test/mocha.opts +++ /dev/null @@ -1,5 +0,0 @@ ---reporter dot ---ui tdd ---require ts-node/register ---watch-extensions tsx,ts -test/*.ts diff --git a/test/table-tests.ts b/test/table-tests.ts index efd0ecca..071caaee 100644 --- a/test/table-tests.ts +++ b/test/table-tests.ts @@ -1,5 +1,5 @@ 'use strict'; -import assert = require('assert'); +import assert from 'assert'; import { equal, ok, throws, doesNotThrow, notEqual } from 'assert'; import { Table } from '../lib/table'; diff --git a/test/ternary-clause-tests.ts b/test/ternary-clause-tests.ts index 056a80ee..fcedcccc 100644 --- a/test/ternary-clause-tests.ts +++ b/test/ternary-clause-tests.ts @@ -1,6 +1,6 @@ 'use strict'; -import assert = require('assert'); +import assert from 'assert'; import { Table } from '../lib/table'; const Foo = Table.define<{ baz: string; bar: string }>({ diff --git a/test/tsconfig.json b/test/tsconfig.json index a4db623e..0533fb61 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,4 +1,4 @@ { - "extends": "../tsconfig.json", + "extends": "../tsconfig.cjs.json", "include": ["./**/*.ts", "./**/*.js", "./**/*.d.ts"] } diff --git a/test/tslint.json b/test/tslint.json index 89b81c92..5fb21e30 100644 --- a/test/tslint.json +++ b/test/tslint.json @@ -2,6 +2,7 @@ "extends": ["../tslint.json"], "rules": { "only-arrow-functions": false, - "object-literal-sort-keys": false + "object-literal-sort-keys": false, + "max-classes-per-file": false } } diff --git a/test/unary-clause-tests.ts b/test/unary-clause-tests.ts index 98b87214..44082f4e 100644 --- a/test/unary-clause-tests.ts +++ b/test/unary-clause-tests.ts @@ -1,6 +1,6 @@ 'use strict'; -import assert = require('assert'); +import assert from 'assert'; import { Table } from '../lib/table'; const Foo = Table.define<{ baz: string; bar: string }>({ diff --git a/test/value-expression-tests.ts b/test/value-expression-tests.ts index 8609a9b3..21b4df71 100644 --- a/test/value-expression-tests.ts +++ b/test/value-expression-tests.ts @@ -1,6 +1,6 @@ 'use strict'; -import assert = require('assert'); +import assert from 'assert'; import { valueExpressionMixin, Node } from '../lib/node/'; suite('value-expression', function() { diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json new file mode 100644 index 00000000..87413745 --- /dev/null +++ b/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "./dist/cjs", + "declaration": false + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index ed81ab22..3fb894d3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,11 @@ { "compilerOptions": { "target": "es2016", - "module": "commonjs", + "module": "es2020", "moduleResolution": "node", - "outDir": "./dist/", + "outDir": "./dist/esm", "resolveJsonModule": true, "esModuleInterop": true, - "allowSyntheticDefaultImports": false, "noEmitHelpers": true, "importHelpers": true, "pretty": true, diff --git a/tslint.json b/tslint.json index 0d7fe243..847b313c 100644 --- a/tslint.json +++ b/tslint.json @@ -1,6 +1,7 @@ { "extends": ["tslint:latest", "tslint-config-prettier"], "rules": { - "interface-name": false + "interface-name": false, + "no-submodule-imports": [true, "lodash"] } } From 6d2ae189cfc35b20dc286fb4804dfa9b44a79483 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Sun, 5 Jul 2020 13:46:24 +1200 Subject: [PATCH 15/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7f1cb5d1..52e0e56b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "3.0.1", + "version": "4.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b88388f3..a6e382d9 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "3.0.1", + "version": "4.0.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 4bfe5b44fce4e8179bb22110787be50805f91fdc Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Thu, 27 Aug 2020 12:23:32 +1200 Subject: [PATCH 16/74] feat: add extra functions and correct typings --- .DS_Store | Bin 0 -> 6148 bytes .npmignore | 1 + .vscode/settings.json | 3 + lib/dialect/postgres.ts | 4 +- lib/functions.ts | 56 +++- lib/node/query.ts | 2 + lib/sql.ts | 13 +- package-lock.json | 415 ++++++++++++++++++++-------- package.json | 18 +- test/binary-clause-tests.ts | 62 ++--- test/clause-definition.ts | 16 +- test/column-tests.ts | 103 +++---- test/dialects/alter-table-tests.ts | 4 +- test/dialects/create-table-tests.ts | 20 +- test/dialects/create-view-tests.ts | 6 +- test/dialects/join-tests.ts | 2 +- test/dialects/join-to-tests.ts | 6 +- test/dialects/literal-tests.ts | 2 +- test/dialects/matches-test.ts | 4 +- test/dialects/subquery-tests.ts | 2 +- test/dialects/support.ts | 8 +- test/dialects/update-tests.ts | 2 +- test/function-tests.ts | 38 +-- test/index-tests.ts | 112 ++++---- test/index.ts | 3 +- test/select-tests.ts | 4 +- test/table-tests.ts | 137 +++++---- test/ternary-clause-tests.ts | 4 +- test/unary-clause-tests.ts | 4 +- test/value-expression-tests.ts | 6 +- 30 files changed, 639 insertions(+), 418 deletions(-) create mode 100644 .DS_Store create mode 100644 .vscode/settings.json diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 { }; // creates a hash of functions for a sql instance -const getFunctions = (functionNames: string | string[]) => { +const getFunctions = (functionNames: string | string[] | readonly string[]) => { if (typeof functionNames === 'string') { return getFunctionCallCreator(functionNames); } const functions = reduce( @@ -28,7 +28,7 @@ const getFunctions = (functionNames: string | string[]) => { }; // aggregate functions available to all databases -const aggregateFunctions = ['AVG', 'COUNT', 'DISTINCT', 'MAX', 'MIN', 'SUM']; +const aggregateFunctions = ['AVG', 'COUNT', 'DISTINCT', 'MAX', 'MIN', 'SUM'] as const; // common scalar functions available to most databases const scalarFunctions = [ @@ -45,25 +45,53 @@ const scalarFunctions = [ 'SUBSTR', 'TRIM', 'UPPER' -]; +] as const; -const dateFunctions = ['YEAR', 'MONTH', 'DAY', 'HOUR', 'CURRENT_TIMESTAMP']; +const dateFunctions = ['YEAR', 'MONTH', 'DAY', 'HOUR', 'CURRENT_TIMESTAMP'] as const; // hstore function available to Postgres -const hstoreFunction = 'HSTORE'; +const hstoreFunctions = ['HSTORE'] as const; // text search functions available to Postgres -const textsearchFunctions = ['TS_RANK', 'TS_RANK_CD', 'PLAINTO_TSQUERY', 'TO_TSQUERY', 'TO_TSVECTOR', 'SETWEIGHT']; +const textsearchFunctions = ['TS_RANK', 'TS_RANK_CD', 'PLAINTO_TSQUERY', 'TO_TSQUERY', 'TO_TSVECTOR', 'SETWEIGHT'] as const; -const standardFunctionNames = aggregateFunctions - .concat(scalarFunctions) - .concat(hstoreFunction) - .concat(textsearchFunctions) - .concat(dateFunctions); +// jsonb functions available to postgres +const jsonbFunctions = [ + 'JSONB_ARRAY_LENGTH', + 'JSONB_BUILD_ARRAY', + 'JSONB_BUILD_OBECT', + 'JSONB_EXTRACT_PATH', + 'JSONB_INSERT', + 'JSONB_OBJECT', + 'JSONB_PRETTY', + 'JSONB_SET', + 'JSONB_STRIP_NULLS', + 'JSONB_TYPEOF', + 'TO_JSONB', + 'JSONB_ARRAY_ELEMENTS', + 'JSONB_ARRAY_ELEMENTS_TEXT', + 'JSONB_EACH', + 'JSONB_EACH_TEXT', + 'JSONB_OBJECT_KEYS', + 'JSONB_AGG' +] as const; + +const standardFunctionNames = [ + ...aggregateFunctions, + ...scalarFunctions, + ...hstoreFunctions, + ...textsearchFunctions, + ...dateFunctions, + ...jsonbFunctions +] as const; + +type StandardFunctions = { + [K in (typeof standardFunctionNames)[number]]: (...args: any[]) => FunctionCallNode; +} // creates a hash of standard functions for a sql instance -const getStandardFunctions = (): { [key: string]: (...args: any[]) => FunctionCallNode } => { - return getFunctions(standardFunctionNames); +const getStandardFunctions = (): StandardFunctions => { + return getFunctions(standardFunctionNames) as StandardFunctions; }; -export { getFunctions, getStandardFunctions }; +export { StandardFunctions, getFunctions, getStandardFunctions }; diff --git a/lib/node/query.ts b/lib/node/query.ts index 98d887d5..312bcad5 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -560,7 +560,9 @@ export class Query extends Node { // to the where clause like so: // const query=a.select().where(a.name.equals("joe")).or(a.name.equals("sam")) const valueExpressions = valueExpressionMixin(); +// @ts-ignore delete valueExpressions.or; +// @ts-ignore delete valueExpressions.and; extend(Query.prototype, valueExpressions); diff --git a/lib/sql.ts b/lib/sql.ts index 30f66b73..e56b72c3 100644 --- a/lib/sql.ts +++ b/lib/sql.ts @@ -3,14 +3,14 @@ import defaults from 'lodash/defaults'; import sliced from 'sliced'; import { Column } from './column'; -import { SQLDialects, TableDefinition } from './configTypes'; +import { ColumnDefinition, SQLDialects, TableDefinition } from './configTypes'; import { DEFAULT_DIALECT, getDialect } from './dialect'; import * as functions from './functions'; -import { ArrayCallNode, FunctionCallNode, IntervalNode, Query } from './node'; +import { ArrayCallNode, FunctionCallNode, IntervalNode, LiteralNode, Query } from './node'; import { Table, TableWithColumns } from './table'; class Sql { - public functions: { [key: string]: (...args: any[]) => FunctionCallNode }; + public functions: functions.StandardFunctions; public dialect: any; public dialectName!: SQLDialects; public config: any; @@ -35,6 +35,9 @@ class Sql { }); return Table.define(def); } + public defineColumn(def: ColumnDefinition): Column { + return new Column(def); + } // Returns a bracketed call creator literal public array(...args: any[]) { const arrayCall = new ArrayCallNode(sliced(args)); @@ -69,6 +72,10 @@ class Sql { const cn = new Column(config); return cn; } + // Create a literal + public literal(literal: any): LiteralNode { + return new LiteralNode(literal); + } } export { Sql, Table }; diff --git a/package-lock.json b/package-lock.json index 52e0e56b..96f67229 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,16 +30,22 @@ "js-tokens": "^4.0.0" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "@types/lodash": { - "version": "4.14.157", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.157.tgz", - "integrity": "sha512-Ft5BNFmv2pHDgxV5JDsndOWTRJ+56zte0ZpYLowp03tW+K+t8u8YMOzAnpuqPgzX6WO1XpDIUm7u04M8vdDiVQ==", + "version": "4.14.160", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.160.tgz", + "integrity": "sha512-aP03BShJoO+WVndoVj/WNcB/YBPt+CIU1mvaao2GRAHy2yg4pT/XS4XnVHEQBjPJGycWf/9seKEO9vopTJGkvA==", "dev": true }, "@types/mocha": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", - "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz", + "integrity": "sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==", "dev": true }, "@types/node": { @@ -173,9 +179,9 @@ } }, "chokidar": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", - "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -185,7 +191,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.3.0" + "readdirp": "~3.4.0" } }, "cliui": { @@ -243,9 +249,9 @@ "dev": true }, "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "concat-map": { @@ -255,9 +261,9 @@ "dev": true }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -363,12 +369,12 @@ } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -544,10 +550,16 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-regex": { + "is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "dev": true, "requires": { "has-symbols": "^1.0.1" @@ -619,26 +631,78 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { - "chalk": "^2.4.2" + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "make-error": { @@ -656,29 +720,44 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "mocha": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz", - "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.2.tgz", + "integrity": "sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==", "dev": true, "requires": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.3.1", - "debug": "3.2.6", + "chokidar": "3.4.2", + "debug": "4.1.1", "diff": "4.0.2", - "escape-string-regexp": "1.0.5", - "find-up": "4.1.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", "glob": "7.1.6", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", "minimatch": "3.0.4", "ms": "2.1.2", "object.assign": "4.1.0", "promise.allsettled": "1.0.2", - "serialize-javascript": "3.0.0", + "serialize-javascript": "4.0.0", "strip-json-comments": "3.0.1", "supports-color": "7.1.0", "which": "2.0.2", @@ -686,25 +765,21 @@ "workerpool": "6.0.0", "yargs": "13.3.2", "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" + "yargs-unparser": "1.6.1" }, "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -762,21 +837,21 @@ } }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-try": { @@ -822,13 +897,22 @@ "iterate-value": "^1.0.0" } }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, "requires": { - "picomatch": "^2.0.7" + "picomatch": "^2.2.1" } }, "require-directory": { @@ -852,6 +936,12 @@ "path-parse": "^1.0.6" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -859,10 +949,13 @@ "dev": true }, "serialize-javascript": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", - "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } }, "set-blocking": { "version": "2.0.0", @@ -943,9 +1036,9 @@ "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -961,9 +1054,9 @@ } }, "ts-node": { - "version": "8.10.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", - "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", + "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", "dev": true, "requires": { "arg": "^4.1.0", @@ -971,25 +1064,17 @@ "make-error": "^1.1.1", "source-map-support": "^0.5.17", "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } } }, "tslib": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", - "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" }, "tslint": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", - "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1003,31 +1088,10 @@ "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.10.0", + "tslib": "^1.13.0", "tsutils": "^2.29.0" }, "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "tslib": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", @@ -1060,9 +1124,9 @@ } }, "typescript": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", - "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", "dev": true }, "which": { @@ -1189,6 +1253,15 @@ "path-exists": "^3.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -1237,14 +1310,116 @@ } }, "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", + "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", "dev": true, "requires": { + "camelcase": "^5.3.1", + "decamelize": "^1.2.0", "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" + "is-plain-obj": "^1.1.0", + "yargs": "^14.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "yn": { diff --git a/package.json b/package.json index a6e382d9..8fb24983 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "module": "dist/esm/", "types": "dist/esm/index.d.ts", "scripts": { - "pretest": "tslint --project .", + "pretest": "tslint --project . && tslint --project ./test", "test": "TS_NODE_PROJECT='test/tsconfig.json' mocha", "lint": "tslint --project .", "tsc": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", @@ -28,19 +28,19 @@ "node": "^12.0.0 || >=14.0.0" }, "dependencies": { + "lodash": "^4.17.20", "sliced": "~1.0.x", - "lodash": "~4.17.15", - "tslib": "~2.0.0" + "tslib": "~2.0.1" }, "devDependencies": { - "@types/lodash": "^4.14.157", - "@types/mocha": "^7.0.2", + "@types/lodash": "^4.14.160", + "@types/mocha": "^8.0.3", "@types/node": "^12.0.0", - "mocha": "^8.0.1", - "ts-node": "^8.10.2", - "tslint": "^6.1.2", + "mocha": "^8.1.2", + "ts-node": "^9.0.0", + "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", - "typescript": "^3.9.6" + "typescript": "^4.0.2" }, "mocha": { "reporter": "dot", diff --git a/test/binary-clause-tests.ts b/test/binary-clause-tests.ts index 77614419..d10dd29d 100644 --- a/test/binary-clause-tests.ts +++ b/test/binary-clause-tests.ts @@ -1,6 +1,6 @@ 'use strict'; -import { equal } from 'assert'; +import { strictEqual } from 'assert'; import { Table } from '../lib/table'; const Foo = Table.define<{ baz: string; bar: string }>({ @@ -9,34 +9,34 @@ const Foo = Table.define<{ baz: string; bar: string }>({ }); test('operators', function() { - equal(Foo.baz.equals(1).operator, '='); - equal(Foo.baz.notEquals(1).operator, '<>'); - equal(Foo.baz.like('asdf').operator, 'LIKE'); - equal(Foo.baz.notLike('asdf').operator, 'NOT LIKE'); - equal(Foo.baz.isNull().operator, 'IS NULL'); - equal(Foo.baz.isNotNull().operator, 'IS NOT NULL'); - equal(Foo.baz.gt(1).operator, '>'); - equal(Foo.baz.gte(1).operator, '>='); - equal(Foo.baz.lt(1).operator, '<'); - equal(Foo.baz.lte(1).operator, '<='); - equal(Foo.baz.plus(1).operator, '+'); - equal(Foo.baz.minus(1).operator, '-'); - equal(Foo.baz.multiply(1).operator, '*'); - equal(Foo.baz.leftShift(1).operator, '<<'); - equal(Foo.baz.rightShift(1).operator, '>>'); - equal(Foo.baz.bitwiseAnd(1).operator, '&'); - equal(Foo.baz.bitwiseNot(1).operator, '~'); - equal(Foo.baz.bitwiseOr(1).operator, '|'); - equal(Foo.baz.bitwiseXor(1).operator, '#'); - equal(Foo.baz.divide(1).operator, '/'); - equal(Foo.baz.modulo(1).operator, '%'); - equal(Foo.baz.regex(1).operator, '~'); - equal(Foo.baz.iregex(1).operator, '~*'); - equal(Foo.baz.notRegex(1).operator, '!~'); - equal(Foo.baz.notIregex(1).operator, '!~*'); - equal(Foo.baz.regexp(1).operator, 'REGEXP'); - equal(Foo.baz.rlike(1).operator, 'RLIKE'); - equal(Foo.baz.ilike('asdf').operator, 'ILIKE'); - equal(Foo.baz.notIlike('asdf').operator, 'NOT ILIKE'); - equal(Foo.baz.match('asdf').operator, '@@'); + strictEqual(Foo.baz.equals(1).operator, '='); + strictEqual(Foo.baz.notEquals(1).operator, '<>'); + strictEqual(Foo.baz.like('asdf').operator, 'LIKE'); + strictEqual(Foo.baz.notLike('asdf').operator, 'NOT LIKE'); + strictEqual(Foo.baz.isNull().operator, 'IS NULL'); + strictEqual(Foo.baz.isNotNull().operator, 'IS NOT NULL'); + strictEqual(Foo.baz.gt(1).operator, '>'); + strictEqual(Foo.baz.gte(1).operator, '>='); + strictEqual(Foo.baz.lt(1).operator, '<'); + strictEqual(Foo.baz.lte(1).operator, '<='); + strictEqual(Foo.baz.plus(1).operator, '+'); + strictEqual(Foo.baz.minus(1).operator, '-'); + strictEqual(Foo.baz.multiply(1).operator, '*'); + strictEqual(Foo.baz.leftShift(1).operator, '<<'); + strictEqual(Foo.baz.rightShift(1).operator, '>>'); + strictEqual(Foo.baz.bitwiseAnd(1).operator, '&'); + strictEqual(Foo.baz.bitwiseNot(1).operator, '~'); + strictEqual(Foo.baz.bitwiseOr(1).operator, '|'); + strictEqual(Foo.baz.bitwiseXor(1).operator, '#'); + strictEqual(Foo.baz.divide(1).operator, '/'); + strictEqual(Foo.baz.modulo(1).operator, '%'); + strictEqual(Foo.baz.regex(1).operator, '~'); + strictEqual(Foo.baz.iregex(1).operator, '~*'); + strictEqual(Foo.baz.notRegex(1).operator, '!~'); + strictEqual(Foo.baz.notIregex(1).operator, '!~*'); + strictEqual(Foo.baz.regexp(1).operator, 'REGEXP'); + strictEqual(Foo.baz.rlike(1).operator, 'RLIKE'); + strictEqual(Foo.baz.ilike('asdf').operator, 'ILIKE'); + strictEqual(Foo.baz.notIlike('asdf').operator, 'NOT ILIKE'); + strictEqual(Foo.baz.match('asdf').operator, '@@'); }); diff --git a/test/clause-definition.ts b/test/clause-definition.ts index aad35261..32632b81 100644 --- a/test/clause-definition.ts +++ b/test/clause-definition.ts @@ -1,6 +1,6 @@ 'use strict'; -import { equal } from 'assert'; +import { strictEqual } from 'assert'; import { Node } from '../lib/node/'; @@ -20,15 +20,15 @@ class Boom extends Node { test('clause definition', function() { const select = new Bang(); - equal(select.type, 'SELECT'); - equal(select.nodes.length, 0); + strictEqual(select.type, 'SELECT'); + strictEqual(select.nodes.length, 0); const q = new Boom('hai'); - equal(q.nodes.length, 0); + strictEqual(q.nodes.length, 0); const q2 = new Boom('bai'); q.nodes.push(select); - equal(q.nodes.length, 1); - equal(q.name, 'hai'); - equal(q2.nodes.length, 0); - equal(q2.name, 'bai'); + strictEqual(q.nodes.length, 1); + strictEqual(q.name, 'hai'); + strictEqual(q2.nodes.length, 0); + strictEqual(q2.name, 'bai'); }); diff --git a/test/column-tests.ts b/test/column-tests.ts index 8a83af89..232a510a 100644 --- a/test/column-tests.ts +++ b/test/column-tests.ts @@ -1,48 +1,55 @@ 'use strict'; -import { equal, throws } from 'assert'; +import { strictEqual, throws } from 'assert'; import { Sql } from '../lib'; const sql = new Sql(); suite('column', function() { - const table = sql.define<{ id: number; created: boolean; alias: string }>({ - name: 'user', - columns: ['id', 'created', 'alias'] - }); - test('can be accessed by property and array', function() { - equal(table.created, table.columns[1], 'should be able to access created both by array and property'); - }); - - suite('toQuery()', function() { - test('works', function() { - equal(table.id.toQuery().text, '"user"."id"'); - }); - - test('works with a column name of "alias"', function() { - equal(table.alias.toQuery().text, '"user"."alias"'); + const table = sql.define<{ id: number; created: boolean; alias: string }>({ + name: 'user', + columns: ['id', 'created', 'alias'] }); - test('respects AS rename', function() { - equal(table.id.as('userId').toQuery().text, '"user"."id" AS "userId"'); - }); + strictEqual(table.created, table.columns[1], 'should be able to access created both by array and property'); + }); - test('respects count and distinct', function() { - equal( - table.id - .count() - .distinct() - .as('userIdCount') - .toQuery().text, - 'COUNT(DISTINCT("user"."id")) AS "userIdCount"' - ); - }); + suite('toQuery()', function() { + suite('basics', function() { + const table = sql.define<{ id: number; created: boolean; alias: string }>({ + name: 'user', + columns: ['id', 'created', 'alias'] + }); + + test('works', function() { + strictEqual(table.id.toQuery().text, '"user"."id"'); + }); + + test('works with a column name of "alias"', function() { + strictEqual(table.alias.toQuery().text, '"user"."alias"'); + }); + + test('respects AS rename', function() { + strictEqual(table.id.as('userId').toQuery().text, '"user"."id" AS "userId"'); + }); + + test('respects count and distinct', function() { + strictEqual( + table.id + .count() + .distinct() + .as('userIdCount') + .toQuery().text, + 'COUNT(DISTINCT("user"."id")) AS "userIdCount"' + ); + }); - suite('in subquery with min', function() { - const subquery = table.subQuery('subTable').select(table.id.min().as('subId')); - const col = subquery.subId.toQuery().text; - equal(col, '"subTable"."subId"'); + test('in subquery with min', function() { + const subquery = table.subQuery('subTable').select(table.id.min().as('subId')); + const col = subquery.subId.toQuery().text; + strictEqual(col, '"subTable"."subId"'); + }); }); suite('property', function() { @@ -53,19 +60,19 @@ suite('column', function() { } }); test('used as alias when !== column name', function() { - equal(table.propertyName.toQuery().text, '"roundtrip"."column_name" AS "propertyName"'); + strictEqual(table.propertyName.toQuery().text, '"roundtrip"."column_name" AS "propertyName"'); }); test('uses explicit alias when !== column name', function() { - equal(table.propertyName.as('alias').toQuery().text, '"roundtrip"."column_name" AS "alias"'); + strictEqual(table.propertyName.as('alias').toQuery().text, '"roundtrip"."column_name" AS "alias"'); }); test('maps to column name in insert', function() { - equal(table.insert({ propertyName: 'propVal' }).toQuery().text, 'INSERT INTO "roundtrip" ("column_name") VALUES ($1)'); + strictEqual(table.insert({ propertyName: 'propVal' }).toQuery().text, 'INSERT INTO "roundtrip" ("column_name") VALUES ($1)'); }); test('maps to column name in update', function() { - equal(table.update({ propertyName: 'propVal' }).toQuery().text, 'UPDATE "roundtrip" SET "column_name" = $1'); + strictEqual(table.update({ propertyName: 'propVal' }).toQuery().text, 'UPDATE "roundtrip" SET "column_name" = $1'); }); test('explicitly selected by *', function() { - equal( + strictEqual( table .select(table.star()) .from(table) @@ -84,10 +91,10 @@ suite('column', function() { } }); test('does not include auto generated columns in insert', function() { - equal(table.insert({ id: 0, name: 'name' }).toQuery().text, 'INSERT INTO "ag" ("name") VALUES ($1)'); + strictEqual(table.insert({ id: 0, name: 'name' }).toQuery().text, 'INSERT INTO "ag" ("name") VALUES ($1)'); }); test('does not include auto generated columns in update', function() { - equal(table.update({ id: 0, name: 'name' }).toQuery().text, 'UPDATE "ag" SET "name" = $1'); + strictEqual(table.update({ id: 0, name: 'name' }).toQuery().text, 'UPDATE "ag" SET "name" = $1'); }); }); @@ -98,15 +105,15 @@ suite('column', function() { columns: ['id', 'name'] }); test('excludes insert properties that are not a column', function() { - equal( + strictEqual( table.insert({ id: 0, _private: '_private', name: 'name' }).toQuery().text, 'INSERT INTO "wl" ("id", "name") VALUES ($1, $2)' ); }); test('excludes update properties that are not a column', function() { // for testing purposes ignore the compile-time error - //@ts-ignore - equal(table.update({ id: 0, _private: '_private', name: 'name' }).toQuery().text, 'UPDATE "wl" SET "id" = $1, "name" = $2'); + // @ts-ignore + strictEqual(table.update({ id: 0, _private: '_private', name: 'name' }).toQuery().text, 'UPDATE "wl" SET "id" = $1, "name" = $2'); }); }); @@ -123,7 +130,7 @@ suite('column', function() { test('throws for update properties that are not a column', function() { throws(function() { // for testing purposes ignore the compile-time error - //@ts-ignore + // @ts-ignore table.update({ id: 0, _private: '_private', name: 'name' }); }, Error); }); @@ -139,13 +146,13 @@ suite('column', function() { } }); test('for snake column names with no explicit property name', function() { - equal(table.makeMeCamel.toQuery().text, '"sc"."make_me_camel" AS "makeMeCamel"'); + strictEqual(table.makeMeCamel.toQuery().text, '"sc"."make_me_camel" AS "makeMeCamel"'); }); test('but not when with explicit property name', function() { - equal(table.not2Cam.toQuery().text, '"sc"."not_to_camel" AS "not2Cam"'); + strictEqual(table.not2Cam.toQuery().text, '"sc"."not_to_camel" AS "not2Cam"'); }); test('does not use property alias within CASE ... END', function() { - equal( + strictEqual( table.makeMeCamel .case([table.makeMeCamel.equals(0)], [table.makeMeCamel]) .as('rename') @@ -154,7 +161,7 @@ suite('column', function() { ); }); test('respects AS rename in RETURNING clause', function() { - equal( + strictEqual( table .update({ makeMeCamel: 0 }) .returning(table.makeMeCamel.as('rename')) diff --git a/test/dialects/alter-table-tests.ts b/test/dialects/alter-table-tests.ts index a5ada55b..660519ba 100644 --- a/test/dialects/alter-table-tests.ts +++ b/test/dialects/alter-table-tests.ts @@ -106,7 +106,7 @@ Harness.test({ params: [] }); -var group = Table.define<{ id: string; userId: string }>({ +const group = Table.define<{ id: string; userId: string }>({ name: 'group', columns: [ { @@ -264,7 +264,7 @@ Harness.test({ params: [] }); -var UserWithSignature = Table.define<{ Signature: string }>({ +const UserWithSignature = Table.define<{ Signature: string }>({ name: 'UserWithSignature', columns: [ { diff --git a/test/dialects/create-table-tests.ts b/test/dialects/create-table-tests.ts index 64587c6a..ff6300a3 100644 --- a/test/dialects/create-table-tests.ts +++ b/test/dialects/create-table-tests.ts @@ -524,14 +524,14 @@ Harness.test({ text: 'CREATE TEMPORARY TABLE `post` (`id` int)', string: 'CREATE TEMPORARY TABLE `post` (`id` int)' }, - //mssql: { - // text : 'CREATE TABLE [#post] ([id] int)', - // string: 'CREATE TABLE [#post] ([id] int)' - //}, + // mssql: { + // text : 'CREATE TABLE [#post] ([id] int)', + // string: 'CREATE TABLE [#post] ([id] int)' + // }, params: [] }); -var users = Table.define({ +const users = Table.define({ name: 'users', columns: { id: { @@ -579,8 +579,8 @@ Harness.test({ { name: 'id', dataType: 'int', - //primaryKey: true, - //notNull: true, + // primaryKey: true, + // notNull: true, unique: true } ] @@ -608,7 +608,7 @@ Harness.test({ params: [] }); -var noUsers = Table.define({ +const noUsers = Table.define({ name: 'no_users', columns: { id: { @@ -655,7 +655,7 @@ Harness.test({ { name: 'id', dataType: 'int', - //primaryKey: true, + // primaryKey: true, notNull: true, unique: true } @@ -692,7 +692,7 @@ Harness.test({ name: 'id', dataType: 'int', primaryKey: true, - //notNull: true, + // notNull: true, unique: true } ] diff --git a/test/dialects/create-view-tests.ts b/test/dialects/create-view-tests.ts index dc62f533..9ea8169a 100644 --- a/test/dialects/create-view-tests.ts +++ b/test/dialects/create-view-tests.ts @@ -3,7 +3,7 @@ import * as Harness from './support'; const user = Harness.defineUserTable(); -//simple view create +// simple view create Harness.test({ query: user.select(user.star()).createView('allUsersView'), pg: { @@ -28,7 +28,7 @@ Harness.test({ } }); -//create view with parameters +// create view with parameters Harness.test({ query: user .select(user.star()) @@ -56,7 +56,7 @@ Harness.test({ } }); -//Tests error raised for non-SELECT create view attempts +// Tests error raised for non-SELECT create view attempts Harness.test({ query: user .delete() diff --git a/test/dialects/join-tests.ts b/test/dialects/join-tests.ts index f5e0f8ed..6611458e 100644 --- a/test/dialects/join-tests.ts +++ b/test/dialects/join-tests.ts @@ -162,7 +162,7 @@ Harness.test({ params: [] }); -var subposts = post +const subposts = post .subQuery('subposts') .select(post.content, post.userId.as('subpostUserId')) .from(post); diff --git a/test/dialects/join-to-tests.ts b/test/dialects/join-to-tests.ts index 9f14bf85..79e14cc5 100644 --- a/test/dialects/join-to-tests.ts +++ b/test/dialects/join-to-tests.ts @@ -4,7 +4,7 @@ import * as Harness from './support'; import { Sql } from '../../lib'; const instance = new Sql('postgres'); -var user = instance.define({ +const user = instance.define({ name: 'user', columns: { id: { @@ -13,7 +13,7 @@ var user = instance.define({ } }); -var photo = instance.define({ +const photo = instance.define({ name: 'photo', columns: { ownerId: { @@ -22,7 +22,7 @@ var photo = instance.define({ } }); -var post = instance.define({ +const post = instance.define({ name: 'post', columns: { id: { diff --git a/test/dialects/literal-tests.ts b/test/dialects/literal-tests.ts index 4f529ec1..8f2c259c 100644 --- a/test/dialects/literal-tests.ts +++ b/test/dialects/literal-tests.ts @@ -47,7 +47,7 @@ Harness.test({ // A real world example: "How many records does page 3 have?" // This could be less than 10 (the limit) if we are on the last page. -var subquery = user +const subquery = user .subQuery('subquery_for_count') .select(user.literal(1).as('count_column')) .limit(10) diff --git a/test/dialects/matches-test.ts b/test/dialects/matches-test.ts index 5a3a1d83..03efa13f 100644 --- a/test/dialects/matches-test.ts +++ b/test/dialects/matches-test.ts @@ -5,7 +5,7 @@ import { Sql } from '../../lib'; const post = Harness.definePostTable(); const instance = new Sql('postgres'); -//Postgres needs the to_tsquery function to use with @@ operator +// Postgres needs the to_tsquery function to use with @@ operator Harness.test({ query: post.select(post.star()).where(post.content.match(instance.functions.TO_TSQUERY('hello'))), pg: { @@ -36,7 +36,7 @@ Harness.test({ params: ['hello'] }); -//matches, ordered by best rank first +// matches, ordered by best rank first Harness.test({ query: post .select(post.id, instance.functions.TS_RANK_CD(post.content, instance.functions.TO_TSQUERY('hello')).as('rank')) diff --git a/test/dialects/subquery-tests.ts b/test/dialects/subquery-tests.ts index 03924df2..56e75d16 100644 --- a/test/dialects/subquery-tests.ts +++ b/test/dialects/subquery-tests.ts @@ -227,7 +227,7 @@ Harness.test({ params: [] }); -var limitUsers = user +const limitUsers = user .subQuery('limit-users') .select(user.id, user.name) .from(user) diff --git a/test/dialects/support.ts b/test/dialects/support.ts index c4eb343d..ba48fa67 100644 --- a/test/dialects/support.ts +++ b/test/dialects/support.ts @@ -37,14 +37,14 @@ function customTest(expected: any) { // test result is correct const expectedText = expectedObject.text || expectedObject; - assert.equal(compiledQuery.text, expectedText); + assert.strictEqual(compiledQuery.text, expectedText); // if params are specified then test these are correct const expectedParams = expectedObject.params || expected.params; if (undefined !== expectedParams) { - assert.equal(expectedParams.length, compiledQuery.values.length, 'params length'); + assert.strictEqual(expectedParams.length, compiledQuery.values.length, 'params length'); for (let i = 0; i < expectedParams.length; i++) { - assert.deepEqual(expectedParams[i], compiledQuery.values[i], 'param ' + (i + 1)); + assert.deepStrictEqual(expectedParams[i], compiledQuery.values[i], 'param ' + (i + 1)); } } } @@ -59,7 +59,7 @@ function customTest(expected: any) { const compiledString = new DialectClass(expectedObject.config || {}).getString(expected.query); // test result is correct - assert.equal(compiledString, expectedObject.string); + assert.strictEqual(compiledString, expectedObject.string); } } }); diff --git a/test/dialects/update-tests.ts b/test/dialects/update-tests.ts index 51fe3157..4673f51b 100644 --- a/test/dialects/update-tests.ts +++ b/test/dialects/update-tests.ts @@ -182,7 +182,7 @@ Harness.test({ // Binary updates Harness.test({ query: post.update({ - //@ts-ignore should investigate whether this should be valid for typings + // @ts-ignore should investigate whether this should be valid for typings content: Buffer.from('test') }), pg: { diff --git a/test/function-tests.ts b/test/function-tests.ts index 29f9bb33..9008368a 100644 --- a/test/function-tests.ts +++ b/test/function-tests.ts @@ -1,5 +1,5 @@ 'use strict'; -import { equal } from 'assert'; +import { strictEqual } from 'assert'; import { Sql } from '../lib'; const instance = new Sql('postgres'); @@ -16,32 +16,32 @@ suite('function', function() { .as('upperAlias') .toQuery(); - equal(aliasedUpper.text, 'UPPER("user"."email") AS "upperAlias"'); + strictEqual(aliasedUpper.text, 'UPPER("user"."email") AS "upperAlias"'); }); test('function call on aliased column', function() { const round = instance.functions.ROUND; const aliasedRound = round(user.howOld, 2).toQuery(); - equal(aliasedRound.text, 'ROUND("user"."age", $1)'); - equal(aliasedRound.values[0], 2); + strictEqual(aliasedRound.text, 'ROUND("user"."age", $1)'); + strictEqual(aliasedRound.values[0], 2); }); test('creating function call works', function() { const upper = instance.function('UPPER'); const functionCall = upper('hello', 'world').toQuery(); - equal(functionCall.text, 'UPPER($1, $2)'); - equal(functionCall.values[0], 'hello'); - equal(functionCall.values[1], 'world'); + strictEqual(functionCall.text, 'UPPER($1, $2)'); + strictEqual(functionCall.values[0], 'hello'); + strictEqual(functionCall.values[1], 'world'); }); test('creating function call on columns works', function() { const upper = instance.function('UPPER'); const functionCall = upper(user.id, user.email).toQuery(); - equal(functionCall.text, 'UPPER("user"."id", "user"."email")'); - equal(functionCall.values.length, 0); + strictEqual(functionCall.text, 'UPPER("user"."id", "user"."email")'); + strictEqual(functionCall.values.length, 0); }); test('function call inside select works', function() { @@ -52,8 +52,8 @@ suite('function', function() { .where(user.email.equals('brian.m.carlson@gmail.com')) .toQuery(); - equal(query.text, 'SELECT UPPER("user"."id", "user"."email") FROM "user" WHERE ("user"."email" = $1)'); - equal(query.values[0], 'brian.m.carlson@gmail.com'); + strictEqual(query.text, 'SELECT UPPER("user"."id", "user"."email") FROM "user" WHERE ("user"."email" = $1)'); + strictEqual(query.values[0], 'brian.m.carlson@gmail.com'); }); test('standard aggregate functions with having clause', function() { @@ -67,11 +67,11 @@ suite('function', function() { .having(distinctEmailCount.gt(100)) .toQuery(); - equal( + strictEqual( query.text, 'SELECT "user"."id", COUNT(DISTINCT("user"."email")) FROM "user" GROUP BY "user"."id" HAVING (COUNT(DISTINCT("user"."email")) > $1)' ); - equal(query.values[0], 100); + strictEqual(query.values[0], 100); }); test('custom and standard functions behave the same', function() { @@ -82,21 +82,21 @@ suite('function', function() { const customQuery = user.select(customUpper(user.name)).toQuery(); const expectedQuery = 'SELECT UPPER("user"."name") FROM "user"'; - equal(standardQuery.text, expectedQuery); - equal(customQuery.text, expectedQuery); + strictEqual(standardQuery.text, expectedQuery); + strictEqual(customQuery.text, expectedQuery); }); test('combine function with operations', function() { const f = instance.functions; const query = user.select(f.AVG(f.DISTINCT(f.COUNT(user.id).plus(f.MAX(user.id))).minus(f.MIN(user.id))).multiply(100)).toQuery(); - equal(query.text, 'SELECT (AVG((DISTINCT((COUNT("user"."id") + MAX("user"."id"))) - MIN("user"."id"))) * $1) FROM "user"'); - equal(query.values[0], 100); + strictEqual(query.text, 'SELECT (AVG((DISTINCT((COUNT("user"."id") + MAX("user"."id"))) - MIN("user"."id"))) * $1) FROM "user"'); + strictEqual(query.values[0], 100); }); test('use custom function', function() { const query = user.select(instance.function('PHRASE_TO_TSQUERY')('simple', user.name)).toQuery(); - equal(query.text, 'SELECT PHRASE_TO_TSQUERY($1, "user"."name") FROM "user"'); - equal(query.values[0], 'simple'); + strictEqual(query.text, 'SELECT PHRASE_TO_TSQUERY($1, "user"."name") FROM "user"'); + strictEqual(query.values[0], 'simple'); }); }); diff --git a/test/index-tests.ts b/test/index-tests.ts index 77f26592..420ef9c0 100644 --- a/test/index-tests.ts +++ b/test/index-tests.ts @@ -1,5 +1,5 @@ 'use strict'; -import { throws, equal, deepEqual } from 'assert'; +import { throws, strictEqual, deepStrictEqual } from 'assert'; import { Sql } from '../lib'; @@ -13,29 +13,29 @@ suite('index', function() { test('unknown dialect throws exception', function() { throws(function() { // for testing purposes ignore the compile-time error - //@ts-ignore + // @ts-ignore instance.setDialect('asdf'); }); }); test("stores the default dialect's name if none has been passed", function() { - equal(new Sql().dialectName, 'postgres'); + strictEqual(new Sql().dialectName, 'postgres'); }); test('stores the sqlite dialect', function() { - equal(new Sql('sqlite').dialectName, 'sqlite'); + strictEqual(new Sql('sqlite').dialectName, 'sqlite'); }); test('stores the mysql dialect', function() { - equal(new Sql('mysql').dialectName, 'mysql'); + strictEqual(new Sql('mysql').dialectName, 'mysql'); }); test('stores the mssql dialect', function() { - equal(new Sql('mssql').dialectName, 'mssql'); + strictEqual(new Sql('mssql').dialectName, 'mssql'); }); test('stores the oracle dialect', function() { - equal(new Sql('oracle').dialectName, 'oracle'); + strictEqual(new Sql('oracle').dialectName, 'oracle'); }); test('can create a query using the default dialect', function() { @@ -44,8 +44,8 @@ suite('index', function() { .from(user) .where(user.email.equals('brian.m.carlson@gmail.com')) .toQuery(); - equal(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - equal(query.values[0], 'brian.m.carlson@gmail.com'); + strictEqual(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + strictEqual(query.values[0], 'brian.m.carlson@gmail.com'); }); test('setting dialect to postgres works', function() { @@ -55,8 +55,8 @@ suite('index', function() { .from(user) .where(user.email.equals('brian.m.carlson@gmail.com')) .toQuery(); - equal(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - equal(query.values[0], 'brian.m.carlson@gmail.com'); + strictEqual(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + strictEqual(query.values[0], 'brian.m.carlson@gmail.com'); }); test('sql.create creates an instance with a new dialect', function() { @@ -66,8 +66,8 @@ suite('index', function() { .from(user) .where(user.email.equals('brian.m.carlson@gmail.com')) .toQuery(); - equal(query.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); - equal(query.values[0], 'brian.m.carlson@gmail.com'); + strictEqual(query.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); + strictEqual(query.values[0], 'brian.m.carlson@gmail.com'); }); test('sql.define for parallel dialects work independently', function() { @@ -83,11 +83,11 @@ suite('index', function() { const sqliteTable = sqlite.define({ name: 'table', columns: ['column'] }); const oracleTable = oracle.define({ name: 'table', columns: ['column'] }); - equal(mysqlTable.sql, mysql); - equal(postgresTable.sql, postgres); - equal(sqliteTable.sql, sqlite); - equal(mssqlTable.sql, mssql); - equal(oracleTable.sql, oracle); + strictEqual(mysqlTable.sql, mysql); + strictEqual(postgresTable.sql, postgres); + strictEqual(sqliteTable.sql, sqlite); + strictEqual(mssqlTable.sql, mssql); + strictEqual(oracleTable.sql, oracle); }); test('using Sql as a class', function() { @@ -97,11 +97,11 @@ suite('index', function() { const sqlite = new Sql('sqlite'); const oracle = new Sql('oracle'); - equal(mysql.dialect, require('../lib/dialect/mysql').Mysql); - equal(postgres.dialect, require('../lib/dialect/postgres').Postgres); - equal(sqlite.dialect, require('../lib/dialect/sqlite').Sqlite); - equal(mssql.dialect, require('../lib/dialect/mssql').Mssql); - equal(oracle.dialect, require('../lib/dialect/oracle').Oracle); + strictEqual(mysql.dialect, require('../lib/dialect/mysql').Mysql); + strictEqual(postgres.dialect, require('../lib/dialect/postgres').Postgres); + strictEqual(sqlite.dialect, require('../lib/dialect/sqlite').Sqlite); + strictEqual(mssql.dialect, require('../lib/dialect/mssql').Mssql); + strictEqual(oracle.dialect, require('../lib/dialect/oracle').Oracle); }); test('override dialect for toQuery using dialect name', function() { @@ -138,20 +138,20 @@ suite('index', function() { .toQuery('oracle'); const values = ['brian.m.carlson@gmail.com']; - equal(sqliteQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - deepEqual(sqliteQuery.values, values); + strictEqual(sqliteQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + deepStrictEqual(sqliteQuery.values, values); - equal(postgresQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - deepEqual(postgresQuery.values, values); + strictEqual(postgresQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + deepStrictEqual(postgresQuery.values, values); - equal(mysqlQuery.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); - deepEqual(mysqlQuery.values, values); + strictEqual(mysqlQuery.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); + deepStrictEqual(mysqlQuery.values, values); - equal(mssqlQuery.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); - deepEqual(mssqlQuery.values, values); + strictEqual(mssqlQuery.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); + deepStrictEqual(mssqlQuery.values, values); - equal(oracleQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = :1)'); - deepEqual(oracleQuery.values, values); + strictEqual(oracleQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = :1)'); + deepStrictEqual(oracleQuery.values, values); }); test('override dialect for toQuery using invalid dialect name', function() { @@ -167,9 +167,9 @@ suite('index', function() { .from(user) .where(user.email.equals('brian.m.carlson@gmail.com')) .toNamedQuery('users'); - equal(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - equal(query.values[0], 'brian.m.carlson@gmail.com'); - equal(query.name, 'users'); + strictEqual(query.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + strictEqual(query.values[0], 'brian.m.carlson@gmail.com'); + strictEqual(query.name, 'users'); }); test('provide an empty query name for toNamedQuery', function() { @@ -183,7 +183,7 @@ suite('index', function() { const query = instance.select(user.id).from(user); throws(function() { // for testing purposes ignore the compile-time error - //@ts-ignore + // @ts-ignore query.toNamedQuery(); }); }); @@ -222,25 +222,25 @@ suite('index', function() { .toNamedQuery('user.select_brian', 'mssql'); const values = ['brian.m.carlson@gmail.com']; - equal(sqliteQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - deepEqual(sqliteQuery.values, values); - equal('user.select_brian', sqliteQuery.name); + strictEqual(sqliteQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + deepStrictEqual(sqliteQuery.values, values); + strictEqual('user.select_brian', sqliteQuery.name); - equal(postgresQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); - deepEqual(postgresQuery.values, values); - equal('user.select_brian', postgresQuery.name); + strictEqual(postgresQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = $1)'); + deepStrictEqual(postgresQuery.values, values); + strictEqual('user.select_brian', postgresQuery.name); - equal(mysqlQuery.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); - deepEqual(mysqlQuery.values, values); - equal('user.select_brian', mysqlQuery.name); + strictEqual(mysqlQuery.text, 'SELECT `user`.`id` FROM `user` WHERE (`user`.`email` = ?)'); + deepStrictEqual(mysqlQuery.values, values); + strictEqual('user.select_brian', mysqlQuery.name); - equal(mssqlQuery.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); - deepEqual(mssqlQuery.values, values); - equal('user.select_brian', mssqlQuery.name); + strictEqual(mssqlQuery.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); + deepStrictEqual(mssqlQuery.values, values); + strictEqual('user.select_brian', mssqlQuery.name); - equal(oracleQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = :1)'); - deepEqual(oracleQuery.values, values); - equal('user.select_brian', oracleQuery.name); + strictEqual(oracleQuery.text, 'SELECT "user"."id" FROM "user" WHERE ("user"."email" = :1)'); + deepStrictEqual(oracleQuery.values, values); + strictEqual('user.select_brian', oracleQuery.name); }); test('override dialect for toNamedQuery using invalid dialect name', function() { @@ -257,8 +257,8 @@ suite('index', function() { .from(user) .where(user.email.equals('x@y.com')) .toQuery(); - equal(query.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); - equal(query.values[0], 'x@y.com'); + strictEqual(query.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = @1)'); + strictEqual(query.values[0], 'x@y.com'); }); test('mssql override default parameter placeholder with ?', function() { @@ -268,7 +268,7 @@ suite('index', function() { .from(user) .where(user.email.equals('x@y.com')) .toQuery(); - equal(query.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = ?)'); - equal(query.values[0], 'x@y.com'); + strictEqual(query.text, 'SELECT [user].[id] FROM [user] WHERE ([user].[email] = ?)'); + strictEqual(query.values[0], 'x@y.com'); }); }); diff --git a/test/index.ts b/test/index.ts index 46d260fa..db82e92d 100644 --- a/test/index.ts +++ b/test/index.ts @@ -9,8 +9,7 @@ const directories = [testDir + '/dialects']; directories.forEach((d) => { const files = readdirSync(d); - /*jshint boss: true */ - for (let i = 0, file: string; (file = files[i]); i++) { + for (const file of files) { const filePath = join(d, file); if (extname(file) === '.ts') { require(filePath); diff --git a/test/select-tests.ts b/test/select-tests.ts index db14e32c..eca53403 100644 --- a/test/select-tests.ts +++ b/test/select-tests.ts @@ -1,10 +1,10 @@ 'use strict'; -import { equal } from 'assert'; +import { strictEqual } from 'assert'; import { SelectNode } from '../lib/node'; const select = new SelectNode(); test('has SELECT type', function() { - equal(select.type, 'SELECT'); + strictEqual(select.type, 'SELECT'); }); diff --git a/test/table-tests.ts b/test/table-tests.ts index 071caaee..86cede8e 100644 --- a/test/table-tests.ts +++ b/test/table-tests.ts @@ -1,11 +1,10 @@ 'use strict'; -import assert from 'assert'; -import { equal, ok, throws, doesNotThrow, notEqual } from 'assert'; +import assert, { strictEqual, ok, throws, doesNotThrow, notStrictEqual } from 'assert'; import { Table } from '../lib/table'; import { Column } from '../lib/column'; import { Sql } from '../lib'; -import { ColumnNode, ModifierNode } from '../lib/node'; +import { ColumnNode, ModifierNode, ParameterNode } from '../lib/node'; suite('table', function() { const table = new Table({ @@ -13,32 +12,32 @@ suite('table', function() { } as any); test('has name', function() { - equal(table.getName(), 'bang'); + strictEqual(table.getName(), 'bang'); }); test('has no columns', function() { - equal(table.columns.length, 0); + strictEqual(table.columns.length, 0); }); test('can add column', function() { const col = new Column({ - table: table, + table, name: 'boom' }); - equal(col.name, 'boom'); - equal(col.table!.getName(), 'bang'); + strictEqual(col.name, 'boom'); + strictEqual(col.table!.getName(), 'bang'); table.addColumn(col); - equal(table.columns.length, 1); - //@ts-ignore column added after table created - equal(table.boom, col); + strictEqual(table.columns.length, 1); + // @ts-ignore column added after table created + strictEqual(table.boom, col); }); test('creates query node', function() { - //@ts-ignore column added after table created + // @ts-ignore column added after table created const sel = table.select(table.boom); - equal(sel.type, 'QUERY'); + strictEqual(sel.type, 'QUERY'); }); test('creates *-query if no args is provided to select()', function() { @@ -51,13 +50,13 @@ suite('table', function() { name: 'user', columns: ['id', 'name'] }); - equal(user.getName(), 'user'); - equal(user.columns.length, 2); - equal(user.columns[0].name, 'id'); - equal(user.columns[1].name, 'name'); - equal(user.columns[0].name, user.id.name); - equal(user.id.table, user); - equal(user.name.table, user); + strictEqual(user.getName(), 'user'); + strictEqual(user.columns.length, 2); + strictEqual(user.columns[0].name, 'id'); + strictEqual(user.columns[1].name, 'name'); + strictEqual(user.columns[0].name, user.id.name); + strictEqual(user.id.table, user); + strictEqual(user.name.table, user); }); }); @@ -76,14 +75,14 @@ test('table with user-defined column property names', function() { ] }); const cols = table.columns; - equal(cols.length, 2); - equal(cols[0].name, 'id'); + strictEqual(cols.length, 2); + strictEqual(cols[0].name, 'id'); assert(cols[0] === table.theId, 'Expected table.theId to be the first column'); - //@ts-ignore id doesn't exist + // @ts-ignore id doesn't exist assert(table.id === undefined, 'Expected table.id to not exist'); - equal(cols[1].name, 'email'); + strictEqual(cols[1].name, 'email'); assert(cols[1] === table.uniqueEmail, 'Expected table.uniqueEmail to be the second column'); - //@ts-ignore email doesn't exist + // @ts-ignore email doesn't exist assert(table.email === undefined, 'Expected table.email to not exist'); }); @@ -106,17 +105,17 @@ test('table with fancier column definitions', function() { ] }); const cols = table.columns; - equal(cols.length, 2); + strictEqual(cols.length, 2); const id = cols[0]; - equal(id.name, 'id'); - equal(id.dataType, 'serial'); - equal(id.notNull, true); - equal(id.primaryKey, true); + strictEqual(id.name, 'id'); + strictEqual(id.dataType, 'serial'); + strictEqual(id.notNull, true); + strictEqual(id.primaryKey, true); const email = cols[1]; - equal(email.name, 'email'); - equal(email.dataType, 'text'); - equal(email.notNull, true); - equal(email.unique, true); + strictEqual(email.name, 'email'); + strictEqual(email.dataType, 'text'); + strictEqual(email.notNull, true); + strictEqual(email.unique, true); }); test('table with object structured column definitions', function() { @@ -136,25 +135,25 @@ test('table with object structured column definitions', function() { } }); const cols = table.columns; - equal(cols.length, 2); + strictEqual(cols.length, 2); const id = cols[0]; - equal(id.name, 'id'); - equal(id.dataType, 'serial'); - equal(id.notNull, true); - equal(id.primaryKey, true); + strictEqual(id.name, 'id'); + strictEqual(id.dataType, 'serial'); + strictEqual(id.notNull, true); + strictEqual(id.primaryKey, true); const email = cols[1]; - equal(email.name, 'email'); - equal(email.dataType, 'text'); - equal(email.notNull, true); - equal(email.unique, true); + strictEqual(email.name, 'email'); + strictEqual(email.dataType, 'text'); + strictEqual(email.notNull, true); + strictEqual(email.unique, true); }); test('table with dynamic column definition', function() { const table = Table.define({ name: 'foo', columns: [] }); - equal(table.columns.length, 0); + strictEqual(table.columns.length, 0); table.addColumn('foo'); - equal(table.columns.length, 1); + strictEqual(table.columns.length, 1); throws(function() { table.addColumn('foo'); @@ -164,15 +163,15 @@ test('table with dynamic column definition', function() { table.addColumn('foo', { noisy: false }); }); - equal(table.columns.length, 1); + strictEqual(table.columns.length, 1); }); test('hasColumn', function() { const table = Table.define({ name: 'foo', columns: [] }); - equal(table.hasColumn('baz'), false); + strictEqual(table.hasColumn('baz'), false); table.addColumn('baz'); - equal(table.hasColumn('baz'), true); + strictEqual(table.hasColumn('baz'), true); }); test('hasColumn with user-defined column property', function() { @@ -187,14 +186,14 @@ test('hasColumn with user-defined column property', function() { ] }); - equal(table.hasColumn('id'), true); - equal(table.hasColumn('theId'), true); + strictEqual(table.hasColumn('id'), true); + strictEqual(table.hasColumn('theId'), true); }); test('the column "from" does not overwrite the from method', function() { const table = Table.define({ name: 'foo', columns: [] }); table.addColumn('from'); - equal(typeof table.from, 'function'); + strictEqual(typeof table.from, 'function'); }); test('getColumn returns the from column', function() { @@ -206,16 +205,16 @@ test('getColumn returns the from column', function() { test('set and get schema', function() { const table = Table.define({ name: 'foo', schema: 'bar', columns: [] }); - equal(table.getSchema(), 'bar'); + strictEqual(table.getSchema(), 'bar'); table.setSchema('barbarz'); - equal(table.getSchema(), 'barbarz'); + strictEqual(table.getSchema(), 'barbarz'); }); suite('table.clone', function() { test('check if it is a copy, not just a reference', function() { const table = Table.define({ name: 'foo', columns: [] }); const copy = table.clone(); - notEqual(table, copy); + notStrictEqual(table, copy); }); test('copy columns', function() { @@ -239,22 +238,22 @@ suite('table.clone', function() { columnWhiteList: false }); - equal(copy.getSchema(), 'test'); - equal(copy.snakeToCamel, false); - equal(copy.columnWhiteList, false); + strictEqual(copy.getSchema(), 'test'); + strictEqual(copy.snakeToCamel, false); + strictEqual(copy.columnWhiteList, false); }); }); test('dialects', function() { const sql1 = new Sql('mysql'); - const foo1 = sql1.define<{ id: number }>({ name: 'foo', columns: ['id'] }), - bar1 = sql1.define<{ id: number }>({ name: 'bar', columns: ['id'] }); + const foo1 = sql1.define<{ id: number }>({ name: 'foo', columns: ['id'] }); + const bar1 = sql1.define<{ id: number }>({ name: 'bar', columns: ['id'] }); const actual1 = foo1 .join(bar1) .on(bar1.id.equals(1)) .toString(); - equal(actual1, '`foo` INNER JOIN `bar` ON (`bar`.`id` = 1)'); + strictEqual(actual1, '`foo` INNER JOIN `bar` ON (`bar`.`id` = 1)'); const sql2 = new Sql('postgres'); const foo2 = sql2.define<{ id: number }>({ name: 'foo', columns: ['id'] }); @@ -263,28 +262,28 @@ test('dialects', function() { .join(bar2) .on(bar2.id.equals(1)) .toString(); - equal(actual2, '"foo" INNER JOIN "bar" ON ("bar"."id" = 1)'); + strictEqual(actual2, '"foo" INNER JOIN "bar" ON ("bar"."id" = 1)'); }); test('limit', function() { const user = Table.define({ name: 'user', columns: ['id', 'name'] }); const query = user.limit(3); - equal(query.nodes.length, 1); - equal(query.nodes[0].type, 'LIMIT'); - equal((query.nodes[0] as ModifierNode).count, 3); + strictEqual(query.nodes.length, 1); + strictEqual(query.nodes[0].type, 'LIMIT'); + strictEqual(((query.nodes[0] as ModifierNode).count as ParameterNode).value(), 3); }); test('offset', function() { const user = Table.define({ name: 'user', columns: ['id', 'name'] }); const query = user.offset(20); - equal(query.nodes.length, 1); - equal(query.nodes[0].type, 'OFFSET'); - equal((query.nodes[0] as ModifierNode).count, 20); + strictEqual(query.nodes.length, 1); + strictEqual(query.nodes[0].type, 'OFFSET'); + strictEqual(((query.nodes[0] as ModifierNode).count as ParameterNode).value(), 20); }); test('order', function() { const user = Table.define<{ id: number; name: string }>({ name: 'user', columns: ['id', 'name'] }); const query = user.order(user.name); - equal(query.nodes.length, 1); - equal(query.nodes[0].type, 'ORDER BY'); + strictEqual(query.nodes.length, 1); + strictEqual(query.nodes[0].type, 'ORDER BY'); }); diff --git a/test/ternary-clause-tests.ts b/test/ternary-clause-tests.ts index fcedcccc..809706d3 100644 --- a/test/ternary-clause-tests.ts +++ b/test/ternary-clause-tests.ts @@ -9,6 +9,6 @@ const Foo = Table.define<{ baz: string; bar: string }>({ }); test('operators', function() { - assert.equal(Foo.bar.between(1, 2).operator, 'BETWEEN'); - assert.equal(Foo.baz.between(1, 2).separator, 'AND'); + assert.strictEqual(Foo.bar.between(1, 2).operator, 'BETWEEN'); + assert.strictEqual(Foo.baz.between(1, 2).separator, 'AND'); }); diff --git a/test/unary-clause-tests.ts b/test/unary-clause-tests.ts index 44082f4e..d5271d78 100644 --- a/test/unary-clause-tests.ts +++ b/test/unary-clause-tests.ts @@ -9,6 +9,6 @@ const Foo = Table.define<{ baz: string; bar: string }>({ }); test('operators', function() { - assert.equal(Foo.bar.isNull().operator, 'IS NULL'); - assert.equal(Foo.baz.isNotNull().operator, 'IS NOT NULL'); + assert.strictEqual(Foo.bar.isNull().operator, 'IS NULL'); + assert.strictEqual(Foo.baz.isNotNull().operator, 'IS NOT NULL'); }); diff --git a/test/value-expression-tests.ts b/test/value-expression-tests.ts index 21b4df71..a40f2f37 100644 --- a/test/value-expression-tests.ts +++ b/test/value-expression-tests.ts @@ -5,12 +5,12 @@ import { valueExpressionMixin, Node } from '../lib/node/'; suite('value-expression', function() { test('value expression mixin should not overwrite Node prototype properties', function() { - var mixin = valueExpressionMixin(); + const mixin = valueExpressionMixin(); // make sure that the node class doesn't have any conflicting properties - for (var key in mixin) { + for (const key in mixin) { if (mixin.hasOwnProperty(key)) { - assert.equal((Node.prototype as any)[key], undefined); + assert.strictEqual((Node.prototype as any)[key], undefined); } } }); From 91f0850ab04d345e2d1e1741335f852bf6b6099a Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Thu, 27 Aug 2020 12:24:21 +1200 Subject: [PATCH 17/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96f67229..bc8f3db1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "4.0.0", + "version": "4.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8fb24983..ab9095fe 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "4.0.0", + "version": "4.1.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 7389ae2cad1c1f2d2379fb303b7651e1e343859b Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Thu, 3 Sep 2020 17:47:49 +1200 Subject: [PATCH 18/74] fix: incorrect output of dates before 0001-01-01 --- lib/dialect/postgres.ts | 32 ++++++++++++++++++++++++++++++-- test/dialects/tostring-tests.ts | 26 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/lib/dialect/postgres.ts b/lib/dialect/postgres.ts index 5f3ce4c9..bae9bbf9 100644 --- a/lib/dialect/postgres.ts +++ b/lib/dialect/postgres.ts @@ -4,6 +4,7 @@ import assert from 'assert'; import isFunction from 'lodash/isFunction'; import isNumber from 'lodash/isNumber'; import map from 'lodash/map'; +import padStart from 'lodash/padStart'; import { AddColumnNode, @@ -70,6 +71,31 @@ import { import { Table } from '../table'; import { Dialect } from './dialect'; +function dateToStringUTC(date: Date) { + let year = date.getUTCFullYear(); + const isBCYear = year < 1; + if (isBCYear) year = Math.abs(year) + 1; // negative years are 1 off their BC representation + + let ret = + padStart(String(year), 4, '0') + + '-' + + padStart(String(date.getUTCMonth() + 1), 2, '0') + + '-' + + padStart(String(date.getUTCDate()), 2, '0') + + 'T' + + padStart(String(date.getUTCHours()), 2, '0') + + ':' + + padStart(String(date.getUTCMinutes()), 2, '0') + + ':' + + padStart(String(date.getUTCSeconds()), 2, '0') + + '.' + + padStart(String(date.getUTCMilliseconds()), 3, '0'); + + ret += 'Z'; + if (isBCYear) ret += ' BC'; + return ret; +} + /** * Config can contain: * @@ -148,8 +174,10 @@ export class Postgres extends Dialect { } } else if (value instanceof Date) { // Date object's default toString format does not get parsed well - // Handle dates using toISOString - value = this._getParameterValue(value.toISOString()); + // Handle dates using custom dateToString method for postgres and toISOString for others + value = (this.myClass === Postgres) + ? this._getParameterValue(dateToStringUTC(value)) + : this._getParameterValue(value.toISOString()); } else if (Buffer.isBuffer(value)) { value = this._getParameterValue('\\x' + value.toString('hex')); } else { diff --git a/test/dialects/tostring-tests.ts b/test/dialects/tostring-tests.ts index e311da29..5426c136 100644 --- a/test/dialects/tostring-tests.ts +++ b/test/dialects/tostring-tests.ts @@ -163,6 +163,32 @@ Harness.test({ params: [new Date('Sat, 01 Jan 2000 00:00:00 GMT')] }); +// Date Year 0 and before +Harness.test({ + query: post.content.equals(new Date('0000-01-01T00:00:00.000Z')), + pg: { + text: '("post"."content" = $1)', + string: '("post"."content" = \'0001-01-01T00:00:00.000Z BC\')' + }, + sqlite: { + text: '("post"."content" = $1)', + string: '("post"."content" = \'0000-01-01T00:00:00.000Z\')' + }, + mysql: { + text: '(`post`.`content` = ?)', + string: "(`post`.`content` = '0000-01-01T00:00:00.000Z')" + }, + mssql: { + text: '([post].[content] = @1)', + string: "([post].[content] = '0000-01-01T00:00:00.000Z')" + }, + oracle: { + text: '("post"."content" = :1)', + string: '("post"."content" = \'0000-01-01T00:00:00.000Z\')' + }, + params: [new Date('0000-01-01T00:00:00.000Z')] +}); + // Object const customObject = { toString() { From 7521ed453704a1b7a3e5d10f89d0df0410a66fd1 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Thu, 3 Sep 2020 17:48:24 +1200 Subject: [PATCH 19/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index bc8f3db1..90a6a183 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "4.1.0", + "version": "4.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ab9095fe..a0b3c8c2 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "4.1.0", + "version": "4.1.1", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 7e43c70e40593e3424819aab56d48c348e2e39d4 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Mon, 19 Oct 2020 17:34:12 +1300 Subject: [PATCH 20/74] feat: better typings & better subquery support --- lib/column.ts | 20 ++-- lib/node/modifier.ts | 2 +- lib/node/parameter.ts | 2 +- lib/node/query.ts | 35 +++++-- lib/nodeable.ts | 4 +- lib/sql.ts | 4 +- lib/table.ts | 119 +++++++++++++++--------- test/column-tests.ts | 2 +- test/dialects/indexes-tests.ts | 2 +- test/dialects/join-tests.ts | 2 +- test/dialects/limit-and-offset-tests.ts | 8 +- test/dialects/literal-tests.ts | 10 +- test/dialects/order-tests.ts | 12 +-- test/dialects/subquery-tests.ts | 78 +++++++++++++++- 14 files changed, 216 insertions(+), 84 deletions(-) diff --git a/lib/column.ts b/lib/column.ts index 7dd2e093..f4944790 100644 --- a/lib/column.ts +++ b/lib/column.ts @@ -36,9 +36,7 @@ export class Column implements INodeable { public name: string; public property?: string; public table?: Table; - public asc: this; public alias?: string; - public desc: OrderByValueNode; public dataType?: string; // tslint:disable-next-line:variable-name public _value: any; @@ -69,12 +67,7 @@ export class Column implements INodeable { this.property = config.property; this.star = config.star; this.table = config.table; - this.asc = this; this.alias = undefined; - this.desc = new OrderByValueNode({ - direction: new TextNode('DESC'), - value: this.toNode() - }); this.isConstant = config.isConstant; this.constantValue = config.constantValue; this.dataType = config.dataType; @@ -103,6 +96,17 @@ export class Column implements INodeable { context.alias = alias; return new ColumnNode(context); } + public asc(): OrderByValueNode { + return new OrderByValueNode({ + value: this.toNode() + }) + } + public desc(): OrderByValueNode { + return new OrderByValueNode({ + direction: new TextNode('DESC'), + value: this.toNode() + }) + } public arrayAgg(alias?: string): ColumnNode { const context = contextify(this); context.asArray = true; @@ -146,7 +150,7 @@ extend(Column.prototype, valueExpressionMixin()); const contextify = (base: Column): Column => { const context = Object.create(Column.prototype); Object.keys(base).forEach((key) => { - context[key] = (base as any)[key]; + context[key] = base[key as keyof Column]; }); return context; }; diff --git a/lib/node/modifier.ts b/lib/node/modifier.ts index 401944ea..0f929589 100644 --- a/lib/node/modifier.ts +++ b/lib/node/modifier.ts @@ -3,7 +3,7 @@ import { Node, ParameterNode, Query } from '.'; export class ModifierNode extends Node { public query: Query; public count: Node; - constructor(query: Query, type: 'LIMIT' | 'OFFSET', count: any) { + constructor(query: Query, type: 'LIMIT' | 'OFFSET', count: unknown) { super(type); this.query = query; this.count = ParameterNode.getNodeOrParameterNode(count); diff --git a/lib/node/parameter.ts b/lib/node/parameter.ts index 08430bf0..a8370810 100644 --- a/lib/node/parameter.ts +++ b/lib/node/parameter.ts @@ -5,7 +5,7 @@ import { INodeable, instanceofINodeable } from '../nodeable'; export class ParameterNode extends Node { // wrap a value as a parameter node if value is not already a node - public static getNodeOrParameterNode(value?: INodeable) { + public static getNodeOrParameterNode(value?: INodeable | unknown) { if (value && instanceofINodeable(value)) { // use toNode return value.toNode(); diff --git a/lib/node/query.ts b/lib/node/query.ts index 312bcad5..a61d3833 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -52,7 +52,7 @@ import { WhereNode } from '.'; import { Column } from '../column'; -import { INodeable, instanceofINodeable } from '../nodeable'; +import { INodeable, instanceofINodeable, PartialNodeable } from '../nodeable'; import { Table } from '../table'; // get the first element of an arguments if it is an array, else return arguments as an array @@ -69,7 +69,6 @@ export class Query extends Node { public table: Table; public nodes: Node[] = []; public alias?: string; - public join?: (other: any) => JoinNode; private whereClause?: WhereNode; private insertClause?: InsertNode; private replaceClause?: ReplaceNode; @@ -120,9 +119,12 @@ export class Query extends Node { col.name = name; col.property = name; col.table = this as any; - if (((this as unknown) as SubQuery)[name] === undefined) { - ((this as unknown) as SubQuery)[name] = col; + col.star = undefined; + const subQuery = (this as unknown as SubQuery); + if (subQuery[name] === undefined) { + subQuery[name] = col; } + subQuery.columns.push(col); } } return this; @@ -290,7 +292,7 @@ export class Query extends Node { } } - public update(object: Partial): this { + public update(object: PartialNodeable): this { const update = new UpdateNode(); Object.keys(object).forEach((key) => { const col = this.table.get(key); @@ -370,9 +372,11 @@ export class Query extends Node { return this.add(new ForShareNode()); } - public create(indexName: string): this | CreateIndexNode { + public create(): this + public create(indexName: string): CreateIndexNode + public create(indexName?: string): this | CreateIndexNode { if (this.indexesClause) { - const createIndex = new CreateIndexNode(this.table, indexName); + const createIndex = new CreateIndexNode(this.table, indexName!); this.add(createIndex); return createIndex; } else { @@ -380,6 +384,9 @@ export class Query extends Node { } } + public drop(): this; + public drop(indexName: string): DropIndexNode; + public drop(...columns: Column[]): DropIndexNode; public drop(): this | DropIndexNode { if (this.indexesClause) { const args = sliced(arguments); @@ -492,11 +499,11 @@ export class Query extends Node { return this; } - public limit(count: any): this { + public limit(count: unknown): this { return this.add(new ModifierNode(this, 'LIMIT', count)); } - public offset(count: any): this { + public offset(count: unknown): this { return this.add(new ModifierNode(this, 'OFFSET', count)); } @@ -574,4 +581,12 @@ extend(Query.prototype, AliasNode.AliasMixin); export interface Query extends IValueExpressionMixinBase, IAliasMixin {} -export type SubQuery = Query & { [key: string]: Column }; +type SubQueryExtensions = { + join: (other: INodeable) => JoinNode; +} & { + columns: Column[] +} & { + [P in keyof C]: Column +}; + +export type SubQuery = Query & SubQueryExtensions; \ No newline at end of file diff --git a/lib/nodeable.ts b/lib/nodeable.ts index 2441d8d9..efabe701 100644 --- a/lib/nodeable.ts +++ b/lib/nodeable.ts @@ -4,6 +4,8 @@ export interface INodeable { toNode(): Node; } -export function instanceofINodeable(o: object): o is INodeable { +export function instanceofINodeable(o: unknown): o is INodeable { return typeof o === 'object' && o !== null && 'toNode' in o; } + +export type PartialNodeable = { [P in keyof T]?: T[P] | INodeable | Buffer }; diff --git a/lib/sql.ts b/lib/sql.ts index e56b72c3..dcf1e092 100644 --- a/lib/sql.ts +++ b/lib/sql.ts @@ -9,7 +9,7 @@ import * as functions from './functions'; import { ArrayCallNode, FunctionCallNode, IntervalNode, LiteralNode, Query } from './node'; import { Table, TableWithColumns } from './table'; -class Sql { +export class Sql { public functions: functions.StandardFunctions; public dialect: any; public dialectName!: SQLDialects; @@ -77,5 +77,3 @@ class Sql { return new LiteralNode(literal); } } - -export { Sql, Table }; diff --git a/lib/table.ts b/lib/table.ts index 145fdb26..f0311a96 100644 --- a/lib/table.ts +++ b/lib/table.ts @@ -5,8 +5,8 @@ import fromPairs from 'lodash/fromPairs'; import { Column } from './column'; import { ColumnDefinition, TableDefinition } from './configTypes'; import { leftJoin } from './joiner'; -import { ColumnNode, ForeignKeyNode, JoinNode, LiteralNode, Node, OrderByValueNode, Query, SubQuery, TableNode } from './node'; -import { INodeable } from './nodeable'; +import { ColumnNode, DropIndexNode, ForeignKeyNode, JoinNode, LiteralNode, Node, OrderByValueNode, Query, SubQuery, TableNode } from './node'; +import { INodeable, PartialNodeable } from './nodeable'; import { Sql } from './sql'; export type TableWithColumns = Table & { [Name in NonNullable]: Column }; @@ -175,9 +175,6 @@ export class Table implements INodeable { } return new Column({ table: this, star: true }); } - public literal(literal: any): LiteralNode { - return new LiteralNode(literal); - } public count(alias?: string): ColumnNode { const name = this.alias || this.tableName; const col: Column = new Column({ table: this, star: true }); @@ -194,14 +191,15 @@ export class Table implements INodeable { } return query; } - public subQuery(alias?: string): SubQuery { + public subQuery(alias?: string): SubQuery { // create the query and pass it off - const query = new Query(this, true); + const query = new Query(this, true) as SubQuery; + query.columns = []; query.alias = alias; - query.join = (other: any) => { + query.join = function(this: SubQuery, other: INodeable) { return new JoinNode('INNER', this.toNode(), other.toNode()); - }; - return query as SubQuery; + } + return query; } public insert(object: Column[] | Column): Query; public insert(object: PartialNodeable[] | PartialNodeable): Query; @@ -254,45 +252,82 @@ export class Table implements INodeable { return query; } public indexes(): IndexQuery { - return (new Query(this).indexes() as unknown) as IndexQuery; + return new Query(this).indexes() as IndexQuery; } -} - -const queryMethods = ['alter', 'create', 'delete', 'drop', 'from', 'limit', 'offset', 'or', 'order', 'truncate', 'update', 'where']; - -queryMethods.forEach((method) => { - (Table.prototype as any)[method] = function(this: Table, ...args: any[]) { + public alter(): Query { const query = new Query(this); - (query as any)[method].apply(query, args); + query.alter(); return query; - }; -}); - -type PartialNodeable = { [P in keyof T]?: T[P] | INodeable | Buffer }; - -export interface Table { - alter(): Query; - create(): Query; - delete(table: Table[] | Table | Table | Partial): Query; - delete(): Query; - drop(): Query; - from(table: Table[] | Table | Table | JoinNode): Query; - from(...tables: Table[]): Query; - limit(count: unknown): Query; - offset(count: unknown): Query; - or(object: Partial | Node | string): Query; - order(node: INodeable[] | INodeable): Query; - order(...nodes: INodeable[]): Query; - truncate(): Query; - update(object: PartialNodeable): Query; - where(object: Partial | Node[] | Node | string): Query; - where(...nodes: Node[]): Query; + } + public create(): Query { + const query = new Query(this); + query.create(); + return query; + } + public delete(table: Table[] | Table | Table | Partial): Query; + public delete(): Query; + public delete(arg?: Table[] | Table | Table | Partial): Query { + const query = new Query(this); + query.delete(arg as any); + return query; + } + public drop(): Query { + const query = new Query(this); + query.drop(); + return query; + } + public from(table: Table[] | Table | Table | JoinNode): Query; + public from(...tables: Table[]): Query; + public from(...args: (Table[] | Table | Table | JoinNode)[]): Query { + const query = new Query(this); + query.from(...args as any); + return query; + } + public limit(count: unknown): Query { + const query = new Query(this); + query.limit(count); + return query; + } + public offset(count: unknown): Query { + const query = new Query(this); + query.offset(count); + return query; + } + public or(object: Partial | Node | string): Query { + const query = new Query(this); + query.or(object); + return query; + } + public order(node: INodeable[] | INodeable): Query; + public order(...nodes: INodeable[]): Query; + public order(...args: (INodeable[] | INodeable)[]): Query { + const query = new Query(this); + query.order(...args as any); + return query; + } + public truncate(): Query { + const query = new Query(this); + query.truncate(); + return query; + } + public update(object: PartialNodeable): Query { + const query = new Query(this); + query.update(object); + return query; + } + public where(object: Partial | Node[] | Node | string): Query; + public where(...nodes: Node[]): Query; + public where(...args: (Partial | Node[] | Node | string)[]): Query { + const query = new Query(this); + query.where(...args as any); + return query; + } } interface IndexQuery { create(indexName?: string): IndexCreationQuery; - drop(indexName: string): Node; - drop(...columns: Column[]): Node; + drop(indexName: string): DropIndexNode; + drop(...columns: Column[]): DropIndexNode; } interface IndexCreationQuery extends Node { diff --git a/test/column-tests.ts b/test/column-tests.ts index 232a510a..c5b11156 100644 --- a/test/column-tests.ts +++ b/test/column-tests.ts @@ -46,7 +46,7 @@ suite('column', function() { }); test('in subquery with min', function() { - const subquery = table.subQuery('subTable').select(table.id.min().as('subId')); + const subquery = table.subQuery<{ subId: number }>('subTable').select(table.id.min().as('subId')); const col = subquery.subId.toQuery().text; strictEqual(col, '"subTable"."subId"'); }); diff --git a/test/dialects/indexes-tests.ts b/test/dialects/indexes-tests.ts index bfba637c..a94974ad 100644 --- a/test/dialects/indexes-tests.ts +++ b/test/dialects/indexes-tests.ts @@ -148,7 +148,7 @@ Harness.test({ query: post .indexes() .create() - .on(post.userId, post.id.desc), + .on(post.userId, post.id.desc()), pg: { text: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)', string: 'CREATE INDEX "post_id_userId" ON "post" ("userId","id" DESC)' diff --git a/test/dialects/join-tests.ts b/test/dialects/join-tests.ts index 6611458e..683d5a13 100644 --- a/test/dialects/join-tests.ts +++ b/test/dialects/join-tests.ts @@ -163,7 +163,7 @@ Harness.test({ }); const subposts = post - .subQuery('subposts') + .subQuery<{ content?: string, subpostUserId: number }>('subposts') .select(post.content, post.userId.as('subpostUserId')) .from(post); diff --git a/test/dialects/limit-and-offset-tests.ts b/test/dialects/limit-and-offset-tests.ts index 23fe8012..48b9a39a 100644 --- a/test/dialects/limit-and-offset-tests.ts +++ b/test/dialects/limit-and-offset-tests.ts @@ -10,7 +10,7 @@ Harness.test({ query: user .select(user.star()) .from(user) - .order(user.name.asc) + .order(user.name.asc()) .limit(1), pg: { text: 'SELECT "user".* FROM "user" ORDER BY "user"."name" LIMIT $1', @@ -35,7 +35,7 @@ Harness.test({ query: user .select(user.star()) .from(user) - .order(user.name.asc) + .order(user.name.asc()) .limit(3) .offset(6), pg: { @@ -57,7 +57,7 @@ Harness.test({ query: user .select(user.star()) .from(user) - .order(user.name.asc) + .order(user.name.asc()) .limit(3) .offset(6), mssql: { @@ -71,7 +71,7 @@ Harness.test({ query: user .select(user.star()) .from(user) - .order(user.name.asc) + .order(user.name.asc()) .offset(10), pg: { text: 'SELECT "user".* FROM "user" ORDER BY "user"."name" OFFSET $1', diff --git a/test/dialects/literal-tests.ts b/test/dialects/literal-tests.ts index 8f2c259c..44acc000 100644 --- a/test/dialects/literal-tests.ts +++ b/test/dialects/literal-tests.ts @@ -1,10 +1,12 @@ 'use strict'; import * as Harness from './support'; +import { Sql } from '../../lib'; const user = Harness.defineUserTable(); +const instance = new Sql('postgres'); Harness.test({ - query: user.select(user.literal('foo'), user.name, user.literal('123').as('onetwothree')), + query: user.select(instance.literal('foo'), user.name, instance.literal('123').as('onetwothree')), pg: { text: 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"', string: 'SELECT foo, "user"."name", 123 AS "onetwothree" FROM "user"' @@ -25,7 +27,7 @@ Harness.test({ }); Harness.test({ - query: user.select().where(user.literal('foo = bar')), + query: user.select().where(instance.literal('foo = bar')), pg: { text: 'SELECT "user".* FROM "user" WHERE foo = bar', string: 'SELECT "user".* FROM "user" WHERE foo = bar' @@ -48,8 +50,8 @@ Harness.test({ // A real world example: "How many records does page 3 have?" // This could be less than 10 (the limit) if we are on the last page. const subquery = user - .subQuery('subquery_for_count') - .select(user.literal(1).as('count_column')) + .subQuery<{ count_column: number }>('subquery_for_count') + .select(instance.literal(1).as('count_column')) .limit(10) .offset(20); diff --git a/test/dialects/order-tests.ts b/test/dialects/order-tests.ts index 8db1fedb..a9426fd7 100644 --- a/test/dialects/order-tests.ts +++ b/test/dialects/order-tests.ts @@ -31,7 +31,7 @@ Harness.test({ }); Harness.test({ - query: post.select(post.content).order(post.content, post.userId.desc), + query: post.select(post.content).order(post.content, post.userId.desc()), pg: { text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' @@ -56,7 +56,7 @@ Harness.test({ }); Harness.test({ - query: post.select(post.content).order(post.content.asc, post.userId.desc), + query: post.select(post.content).order(post.content.asc(), post.userId.desc()), pg: { text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' @@ -81,7 +81,7 @@ Harness.test({ }); Harness.test({ - query: post.select(post.content).order([post.content, post.userId.desc]), + query: post.select(post.content).order([post.content, post.userId.desc()]), pg: { text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' @@ -109,7 +109,7 @@ Harness.test({ query: post .select(post.content) .order(post.content) - .order(post.userId.desc), + .order(post.userId.desc()), pg: { text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC', string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content", "post"."userId" DESC' @@ -259,7 +259,7 @@ Harness.test({ }); Harness.test({ - query: post.select(post.content).order(post.content.desc), + query: post.select(post.content).order(post.content.desc()), pg: { text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC NULLS LAST', string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" DESC NULLS LAST', @@ -315,7 +315,7 @@ Harness.test({ }); Harness.test({ - query: post.select(post.content).order(post.content.asc), + query: post.select(post.content).order(post.content.asc()), pg: { text: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS FIRST', string: 'SELECT "post"."content" FROM "post" ORDER BY "post"."content" NULLS FIRST', diff --git a/test/dialects/subquery-tests.ts b/test/dialects/subquery-tests.ts index 56e75d16..04717769 100644 --- a/test/dialects/subquery-tests.ts +++ b/test/dialects/subquery-tests.ts @@ -228,7 +228,7 @@ Harness.test({ }); const limitUsers = user - .subQuery('limit-users') + .subQuery<{ id: string, name: string }>('limit-users') .select(user.id, user.name) .from(user) .order(user.name) @@ -268,3 +268,79 @@ Harness.test({ }, params: [10, 10] }); + +Harness.test({ + query: instance.select(limitUsers.star()).from(limitUsers.join(post).on(post.userId.equals(limitUsers.id))), + pg: { + text: + 'SELECT "limit-users".* FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT $1 OFFSET $2) "limit-users" INNER JOIN "post" ON ("post"."userId" = "limit-users"."id")', + string: + 'SELECT "limit-users".* FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT 10 OFFSET 10) "limit-users" INNER JOIN "post" ON ("post"."userId" = "limit-users"."id")' + }, + sqlite: { + text: + 'SELECT "limit-users".* FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT $1 OFFSET $2) "limit-users" INNER JOIN "post" ON ("post"."userId" = "limit-users"."id")', + string: + 'SELECT "limit-users".* FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" LIMIT 10 OFFSET 10) "limit-users" INNER JOIN "post" ON ("post"."userId" = "limit-users"."id")' + }, + mysql: { + text: + 'SELECT `limit-users`.* FROM (SELECT `user`.`id`, `user`.`name` FROM `user` ORDER BY `user`.`name` LIMIT ? OFFSET ?) `limit-users` INNER JOIN `post` ON (`post`.`userId` = `limit-users`.`id`)', + string: + 'SELECT `limit-users`.* FROM (SELECT `user`.`id`, `user`.`name` FROM `user` ORDER BY `user`.`name` LIMIT 10 OFFSET 10) `limit-users` INNER JOIN `post` ON (`post`.`userId` = `limit-users`.`id`)' + }, + mssql: { + text: + 'SELECT [limit-users].* FROM (SELECT [user].[id], [user].[name] FROM [user] ORDER BY [user].[name] OFFSET @1 ROWS FETCH NEXT @2 ROWS ONLY) [limit-users] INNER JOIN [post] ON ([post].[userId] = [limit-users].[id])', + string: + 'SELECT [limit-users].* FROM (SELECT [user].[id], [user].[name] FROM [user] ORDER BY [user].[name] OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY) [limit-users] INNER JOIN [post] ON ([post].[userId] = [limit-users].[id])' + }, + oracle: { + text: + 'SELECT "limit-users".* FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" OFFSET :2 ROWS FETCH NEXT :1 ROWS ONLY) "limit-users" INNER JOIN "post" ON ("post"."userId" = "limit-users"."id")', + string: + 'SELECT "limit-users".* FROM (SELECT "user"."id", "user"."name" FROM "user" ORDER BY "user"."name" OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY) "limit-users" INNER JOIN "post" ON ("post"."userId" = "limit-users"."id")' + }, + params: [10, 10] +}); + +const groupedUsersByName = user + .subQuery<{ name: string, countForName: number }>('grouped-users') + .select(user.name, user.count().as('countForName')) + .from(user) + .group(user.name) + .order(user.name); +Harness.test({ + query: instance.select(groupedUsersByName.name, groupedUsersByName.countForName).from(groupedUsersByName), + pg: { + text: + 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT("user".*) AS "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"', + string: + 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT("user".*) AS "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"' + }, + sqlite: { + text: + 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT("user".*) AS "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"', + string: + 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT("user".*) AS "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"' + }, + mysql: { + text: + 'SELECT `grouped-users`.`name`, `grouped-users`.`countForName` FROM (SELECT `user`.`name`, COUNT(*) AS `countForName` FROM `user` GROUP BY `user`.`name` ORDER BY `user`.`name`) `grouped-users`', + string: + 'SELECT `grouped-users`.`name`, `grouped-users`.`countForName` FROM (SELECT `user`.`name`, COUNT(*) AS `countForName` FROM `user` GROUP BY `user`.`name` ORDER BY `user`.`name`) `grouped-users`' + }, + mssql: { + text: + 'SELECT [grouped-users].[name], [grouped-users].[countForName] FROM (SELECT [user].[name], COUNT(*) AS [countForName] FROM [user] GROUP BY [user].[name] ORDER BY [user].[name]) [grouped-users]', + string: + 'SELECT [grouped-users].[name], [grouped-users].[countForName] FROM (SELECT [user].[name], COUNT(*) AS [countForName] FROM [user] GROUP BY [user].[name] ORDER BY [user].[name]) [grouped-users]' + }, + oracle: { + text: + 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT(*) "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"', + string: + 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT(*) "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"' + }, + params: [] +}); From b5be1e170fab18d41e1e2990089b6e917b427664 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Mon, 19 Oct 2020 17:35:07 +1300 Subject: [PATCH 21/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 90a6a183..6fc422f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "4.1.1", + "version": "5.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a0b3c8c2..7a660a8a 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "4.1.1", + "version": "5.0.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From aec9dfdfc75deead75d67c7c3a883569f1ec8cda Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 20 Oct 2020 16:49:29 +1300 Subject: [PATCH 22/74] fix: missing exports --- lib/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/index.ts b/lib/index.ts index ff43835b..4260617c 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,3 +1,5 @@ export * from './node'; export * from './dialect'; export * from './sql'; +export * from './column'; +export * from './table'; From 450e6e4035b267978035d5c62e923856af8c922c Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 20 Oct 2020 16:49:59 +1300 Subject: [PATCH 23/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6fc422f3..9246b4d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "5.0.0", + "version": "5.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7a660a8a..44bb39cf 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.0.0", + "version": "5.0.1", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 440d73f4484a300cea6ee933e11b44acbc502a16 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 21 Oct 2020 13:57:01 +1300 Subject: [PATCH 24/74] fix: subquery not considering property name --- lib/node/query.ts | 2 +- test/dialects/subquery-tests.ts | 35 +++++++++++++++++---------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/lib/node/query.ts b/lib/node/query.ts index a61d3833..d8e17ee7 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -114,7 +114,7 @@ export class Query extends Node { // if this is a subquery then add reference to this column if (this.type === 'SUBQUERY') { for (const node of select.nodes as ColumnNode[]) { - const name = node.alias || node.name; + const name = node.alias || node.property || node.name; const col = new Column(node as any); col.name = name; col.property = name; diff --git a/test/dialects/subquery-tests.ts b/test/dialects/subquery-tests.ts index 04717769..612fedb2 100644 --- a/test/dialects/subquery-tests.ts +++ b/test/dialects/subquery-tests.ts @@ -5,6 +5,7 @@ import { Sql } from '../../lib'; const customer = Harness.defineCustomerTable(); const post = Harness.definePostTable(); const user = Harness.defineUserTable(); +const customerAlias = Harness.defineCustomerAliasTable(); const instance = new Sql('postgres'); Harness.test({ @@ -304,43 +305,43 @@ Harness.test({ params: [10, 10] }); -const groupedUsersByName = user - .subQuery<{ name: string, countForName: number }>('grouped-users') - .select(user.name, user.count().as('countForName')) - .from(user) - .group(user.name) - .order(user.name); +const groupedCustomersByName = customerAlias + .subQuery<{ name_alias: string, countForName: number }>('grouped-customers') + .select(customerAlias.name_alias, customerAlias.count().as('countForName')) + .from(customerAlias) + .group(customerAlias.name_alias) + .order(customerAlias.name_alias); Harness.test({ - query: instance.select(groupedUsersByName.name, groupedUsersByName.countForName).from(groupedUsersByName), + query: instance.select(groupedCustomersByName.name_alias, groupedCustomersByName.countForName).from(groupedCustomersByName), pg: { text: - 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT("user".*) AS "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"', + 'SELECT "grouped-customers"."name_alias", "grouped-customers"."countForName" FROM (SELECT "customer"."name" AS "name_alias", COUNT("customer".*) AS "countForName" FROM "customer" GROUP BY "customer"."name" ORDER BY "customer"."name") "grouped-customers"', string: - 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT("user".*) AS "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"' + 'SELECT "grouped-customers"."name_alias", "grouped-customers"."countForName" FROM (SELECT "customer"."name" AS "name_alias", COUNT("customer".*) AS "countForName" FROM "customer" GROUP BY "customer"."name" ORDER BY "customer"."name") "grouped-customers"' }, sqlite: { text: - 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT("user".*) AS "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"', + 'SELECT "grouped-customers"."name_alias", "grouped-customers"."countForName" FROM (SELECT "customer"."name" AS "name_alias", COUNT("customer".*) AS "countForName" FROM "customer" GROUP BY "customer"."name" ORDER BY "customer"."name") "grouped-customers"', string: - 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT("user".*) AS "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"' + 'SELECT "grouped-customers"."name_alias", "grouped-customers"."countForName" FROM (SELECT "customer"."name" AS "name_alias", COUNT("customer".*) AS "countForName" FROM "customer" GROUP BY "customer"."name" ORDER BY "customer"."name") "grouped-customers"' }, mysql: { text: - 'SELECT `grouped-users`.`name`, `grouped-users`.`countForName` FROM (SELECT `user`.`name`, COUNT(*) AS `countForName` FROM `user` GROUP BY `user`.`name` ORDER BY `user`.`name`) `grouped-users`', + 'SELECT `grouped-customers`.`name_alias`, `grouped-customers`.`countForName` FROM (SELECT `customer`.`name` AS `name_alias`, COUNT(*) AS `countForName` FROM `customer` GROUP BY `customer`.`name` ORDER BY `customer`.`name`) `grouped-customers`', string: - 'SELECT `grouped-users`.`name`, `grouped-users`.`countForName` FROM (SELECT `user`.`name`, COUNT(*) AS `countForName` FROM `user` GROUP BY `user`.`name` ORDER BY `user`.`name`) `grouped-users`' + 'SELECT `grouped-customers`.`name_alias`, `grouped-customers`.`countForName` FROM (SELECT `customer`.`name` AS `name_alias`, COUNT(*) AS `countForName` FROM `customer` GROUP BY `customer`.`name` ORDER BY `customer`.`name`) `grouped-customers`' }, mssql: { text: - 'SELECT [grouped-users].[name], [grouped-users].[countForName] FROM (SELECT [user].[name], COUNT(*) AS [countForName] FROM [user] GROUP BY [user].[name] ORDER BY [user].[name]) [grouped-users]', + 'SELECT [grouped-customers].[name_alias], [grouped-customers].[countForName] FROM (SELECT [customer].[name] AS [name_alias], COUNT(*) AS [countForName] FROM [customer] GROUP BY [customer].[name] ORDER BY [customer].[name]) [grouped-customers]', string: - 'SELECT [grouped-users].[name], [grouped-users].[countForName] FROM (SELECT [user].[name], COUNT(*) AS [countForName] FROM [user] GROUP BY [user].[name] ORDER BY [user].[name]) [grouped-users]' + 'SELECT [grouped-customers].[name_alias], [grouped-customers].[countForName] FROM (SELECT [customer].[name] AS [name_alias], COUNT(*) AS [countForName] FROM [customer] GROUP BY [customer].[name] ORDER BY [customer].[name]) [grouped-customers]' }, oracle: { text: - 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT(*) "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"', + 'SELECT "grouped-customers"."name_alias", "grouped-customers"."countForName" FROM (SELECT "customer"."name" "name_alias", COUNT(*) "countForName" FROM "customer" GROUP BY "customer"."name" ORDER BY "customer"."name") "grouped-customers"', string: - 'SELECT "grouped-users"."name", "grouped-users"."countForName" FROM (SELECT "user"."name", COUNT(*) "countForName" FROM "user" GROUP BY "user"."name" ORDER BY "user"."name") "grouped-users"' + 'SELECT "grouped-customers"."name_alias", "grouped-customers"."countForName" FROM (SELECT "customer"."name" "name_alias", COUNT(*) "countForName" FROM "customer" GROUP BY "customer"."name" ORDER BY "customer"."name") "grouped-customers"' }, params: [] }); From 69845e124090b8fb832dd9e12b9bc4785bd782d0 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 21 Oct 2020 13:57:35 +1300 Subject: [PATCH 25/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9246b4d5..10b81b38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "5.0.1", + "version": "5.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 44bb39cf..b2b1911e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.0.1", + "version": "5.0.2", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From ca1c2aad8649dd35c5e4c5506ea7dddc4f0a3683 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 21 Oct 2020 17:43:05 +1300 Subject: [PATCH 26/74] feat: add row constructor support --- lib/dialect/postgres.ts | 7 +++++++ lib/node/index.ts | 1 + lib/node/rowCall.ts | 21 +++++++++++++++++++++ lib/sql.ts | 7 ++++++- test/dialects/row-tests.ts | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 lib/node/rowCall.ts create mode 100644 test/dialects/row-tests.ts diff --git a/lib/dialect/postgres.ts b/lib/dialect/postgres.ts index bae9bbf9..e4e0b311 100644 --- a/lib/dialect/postgres.ts +++ b/lib/dialect/postgres.ts @@ -59,6 +59,7 @@ import { ReplaceNode, RestrictNode, ReturningNode, + RowCallNode, SelectNode, SliceNode, TableNode, @@ -328,6 +329,8 @@ export class Postgres extends Dialect { return this.visitFunctionCall(node as FunctionCallNode); case 'ARRAY CALL': return this.visitArrayCall(node as ArrayCallNode); + case 'ROW CALL': + return this.visitRowCall(node as RowCallNode); case 'CREATE VIEW': return this.visitCreateView(node as CreateViewNode); case 'INTERVAL': @@ -1030,6 +1033,10 @@ export class Postgres extends Dialect { const txt = `ARRAY[${arrayCallNode.nodes.map(this.visit.bind(this)).join(', ')}]`; return [txt]; } + public visitRowCall(rowCallNode: RowCallNode): string[] { + const txt = `(${rowCallNode.nodes.map(this.visit.bind(this)).join(', ')})`; + return [txt]; + } public visitParameter(parameterNode: ParameterNode): string[] { // save the value into the parameters array const value = parameterNode.value(); diff --git a/lib/node/index.ts b/lib/node/index.ts index 553a35ea..03c02d94 100644 --- a/lib/node/index.ts +++ b/lib/node/index.ts @@ -37,6 +37,7 @@ export * from './column'; export * from './foreignKey'; export * from './functionCall'; export * from './arrayCall'; +export * from './rowCall'; export * from './parameter'; export * from './default'; export * from './addColumn'; diff --git a/lib/node/rowCall.ts b/lib/node/rowCall.ts new file mode 100644 index 00000000..0ad0fc5e --- /dev/null +++ b/lib/node/rowCall.ts @@ -0,0 +1,21 @@ +'use strict'; + +import extend from 'lodash/extend'; +import flatten from 'lodash/flatten'; +import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, ParameterNode, valueExpressionMixin } from '.'; + +export class RowCallNode extends Node { + constructor(args: any[]) { + super('ROW CALL'); + args = flatten(args); + this.addAll(args.map(ParameterNode.getNodeOrParameterNode)); + } +} + +// mix in value expression +extend(RowCallNode.prototype, valueExpressionMixin()); + +// allow aliasing +extend(RowCallNode.prototype, AliasNode.AliasMixin); + +export interface RowCallNode extends IValueExpressionMixin, IAliasMixin {} diff --git a/lib/sql.ts b/lib/sql.ts index dcf1e092..90946215 100644 --- a/lib/sql.ts +++ b/lib/sql.ts @@ -6,7 +6,7 @@ import { Column } from './column'; import { ColumnDefinition, SQLDialects, TableDefinition } from './configTypes'; import { DEFAULT_DIALECT, getDialect } from './dialect'; import * as functions from './functions'; -import { ArrayCallNode, FunctionCallNode, IntervalNode, LiteralNode, Query } from './node'; +import { ArrayCallNode, FunctionCallNode, RowCallNode, IntervalNode, LiteralNode, Query } from './node'; import { Table, TableWithColumns } from './table'; export class Sql { @@ -43,6 +43,11 @@ export class Sql { const arrayCall = new ArrayCallNode(sliced(args)); return arrayCall; } + // Returns a bracketed call creator literal + public row(...args: any[]) { + const rowCall = new RowCallNode(sliced(args)); + return rowCall; + } // Returns a select statement public select(...args: any[]) { const query = new Query({ sql: this } as any); diff --git a/test/dialects/row-tests.ts b/test/dialects/row-tests.ts new file mode 100644 index 00000000..f1735035 --- /dev/null +++ b/test/dialects/row-tests.ts @@ -0,0 +1,34 @@ +'use strict'; + +import * as Harness from './support'; +import { Sql } from '../../lib'; +const post = Harness.definePostTable(); +const instance = new Sql('postgres'); + +// Array columns +Harness.test({ + query: instance.row(post.userId, 'some new content', instance.array('nodejs')), + pg: { + text: '("post"."userId", $1, ARRAY[$2])', + string: '("post"."userId", \'some new content\', ARRAY[\'nodejs\'])' + }, + params: ['some new content', 'nodejs'] +}); + +Harness.test({ + query: post.select(post.star()).where(instance.row(post.userId, post.content).equals(instance.row(1234, 'some new content'))), + pg: { + text: 'SELECT "post".* FROM "post" WHERE (("post"."userId", "post"."content") = ($1, $2))', + string: 'SELECT "post".* FROM "post" WHERE (("post"."userId", "post"."content") = (1234, \'some new content\'))' + }, + params: [1234, 'some new content'] +}); + +Harness.test({ + query: post.select(post.star()).where(instance.row(post.userId, post.content).in([instance.row(1234, 'some new content'), instance.row(5678, 'some other content')])), + pg: { + text: 'SELECT "post".* FROM "post" WHERE (("post"."userId", "post"."content") IN (($1, $2), ($3, $4)))', + string: 'SELECT "post".* FROM "post" WHERE (("post"."userId", "post"."content") IN ((1234, \'some new content\'), (5678, \'some other content\')))' + }, + params: [1234, 'some new content', 5678, 'some other content'] +}); From 2ce20bb37f9bd6f10bea7b6a6af88c4dde314df9 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 21 Oct 2020 17:43:36 +1300 Subject: [PATCH 27/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10b81b38..fab40c3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "5.0.2", + "version": "5.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b2b1911e..9092d2d9 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.0.2", + "version": "5.1.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 319d698374306e65d6a41796ca28f87fad1d7d46 Mon Sep 17 00:00:00 2001 From: Thomas GIOVANNINI <5586669+Giovannini@users.noreply.github.com> Date: Sun, 31 Jan 2021 07:45:41 +0100 Subject: [PATCH 28/74] feat: add support for ifNotExists in createIndex and ifExists in dropIndex (#3) * Add support for ifNotExists in createIndex and ifExists in dropIndex * Make new options optional --- lib/dialect/mssql.ts | 3 ++ lib/dialect/mysql.ts | 6 ++++ lib/dialect/oracle.ts | 6 ++++ lib/dialect/postgres.ts | 57 +++++++++++++++++----------------- lib/node/createIndex.ts | 10 ++++-- lib/node/dropIndex.ts | 7 ++++- lib/table.ts | 3 +- test/dialects/indexes-tests.ts | 50 +++++++++++++++++++++++++++++ 8 files changed, 110 insertions(+), 32 deletions(-) diff --git a/lib/dialect/mssql.ts b/lib/dialect/mssql.ts index 710dbfa9..cf5cfdbd 100644 --- a/lib/dialect/mssql.ts +++ b/lib/dialect/mssql.ts @@ -387,6 +387,9 @@ export class Mssql extends Postgres { // // return "SHOW INDEX FROM " + tableName; // }; + public visitIfNotExistsIndex(): string[] { + throw new Error('MSSQL does not allow ifNotExists clause on indexes.'); + } public visitOnDuplicate(onDuplicateNode: OnDuplicateNode): string[] { throw new Error('MSSQL does not allow onDuplicate clause.'); } diff --git a/lib/dialect/mysql.ts b/lib/dialect/mysql.ts index 1b5e33a1..b27c2cf7 100644 --- a/lib/dialect/mysql.ts +++ b/lib/dialect/mysql.ts @@ -119,6 +119,12 @@ export class Mysql extends Postgres { const tableName = this.visit(this.queryNode!.table.toNode())[0]; return [`SHOW INDEX FROM ${tableName}`]; } + public visitIfNotExistsIndex(): string[] { + throw new Error('MySQL does not allow ifNotExists clause on indexes.'); + } + public visitIfExistsIndex(): string[] { + throw new Error('MySQL does not allow ifExists clause on indexes.'); + } public visitBinary(binaryNode: BinaryNode): string[] { if (binaryNode.operator === '@@') { return [`(MATCH ${this.visit(binaryNode.left)} AGAINST ${this.visit(binaryNode.right)})`]; diff --git a/lib/dialect/oracle.ts b/lib/dialect/oracle.ts index 826df1be..a6022f52 100644 --- a/lib/dialect/oracle.ts +++ b/lib/dialect/oracle.ts @@ -241,6 +241,9 @@ export class Oracle extends Postgres { return [indexes]; } public visitDropIndex(dropIndexNode: DropIndexNode): string[] { + if (dropIndexNode.options.ifExists) { + throw new Error('Oracle does not allow ifExists clause on indexes.'); + } const result = ['DROP INDEX']; const schemaName = dropIndexNode.table.getSchema(); if (schemaName) { @@ -249,6 +252,9 @@ export class Oracle extends Postgres { result.push(this.quote(dropIndexNode.options.indexName)); return result; } + public visitIfNotExistsIndex(): string[] { + throw new Error('Oracle does not allow ifNotExists clause on indexes.'); + } // Need to implement a special version of CASE since Oracle doesn't support // CASE WHEN true THEN xxx END // the "true" has to be a boolean expression like 1=1 diff --git a/lib/dialect/postgres.ts b/lib/dialect/postgres.ts index e4e0b311..f05e07f2 100644 --- a/lib/dialect/postgres.ts +++ b/lib/dialect/postgres.ts @@ -1158,38 +1158,39 @@ export class Postgres extends Dialect { throw new Error('No columns defined!'); } const tableName = this.visit(createIndexNode.table.toNode()); - let result = ['CREATE']; - if (createIndexNode.options.type) { - result.push(createIndexNode.options.type.toUpperCase()); - } - result = result.concat(['INDEX', this.quote(createIndexNode.indexName())]); - if (createIndexNode.options.algorithm) { - result.push('USING ' + createIndexNode.options.algorithm.toUpperCase()); - } - result = result.concat([ + const ifNotExists = createIndexNode.options?.ifNotExists ? this.visitIfNotExistsIndex() : [] + const notEmpty = (t: T | undefined): t is T => t !== undefined + return [ + 'CREATE', + createIndexNode.options?.type?.toUpperCase(), + 'INDEX', + ...ifNotExists, + this.quote(createIndexNode.indexName()), + createIndexNode.options.algorithm ? 'USING ' + createIndexNode.options.algorithm.toUpperCase() : undefined, 'ON', ...tableName, - '(' + - createIndexNode.options.columns.reduce( - (res, col) => { - const column = col.name ? col.name : col.value.name; - const direction = col instanceof OrderByValueNode ? ` ${col.direction!.text}` : ''; - return res.concat(this.quote(column) + direction); - }, - [] as string[] - ) + - ')' - ]); - if (createIndexNode.options.parser) { - result.push('WITH PARSER'); - result.push(createIndexNode.options.parser); - } - return result; + '(' + createIndexNode.options.columns.reduce((res, col) => { + const column = col.name ? col.name : col.value.name; + const direction = col instanceof OrderByValueNode ? ` ${col.direction!.text}` : ''; + return res.concat(this.quote(column) + direction); + }, []) + ')', + createIndexNode.options.parser ? 'WITH PARSER' : undefined, + createIndexNode.options.parser, + ].filter(notEmpty); + } + public visitIfNotExistsIndex(): string[] { + return ['IF NOT EXISTS'] } public visitDropIndex(dropIndexNode: DropIndexNode): string[] { - const result = ['DROP INDEX']; - result.push(this.quote(dropIndexNode.table.getSchema() || 'public') + '.' + this.quote(dropIndexNode.options.indexName)); - return result; + const ifExists = dropIndexNode.options.ifExists ? this.visitIfExistsIndex() : [] + return [ + 'DROP INDEX', + ...ifExists, + this.quote(dropIndexNode.table.getSchema() || 'public') + '.' + this.quote(dropIndexNode.options.indexName), + ] + } + public visitIfExistsIndex(): string[] { + return ['IF EXISTS'] } public visitCreateView(createViewNode: CreateViewNode): string[] { const result = ['CREATE VIEW', this.quote(createViewNode.options.viewName), 'AS']; diff --git a/lib/node/createIndex.ts b/lib/node/createIndex.ts index ce711c6a..5820ec23 100644 --- a/lib/node/createIndex.ts +++ b/lib/node/createIndex.ts @@ -3,9 +3,9 @@ import sliced from 'sliced'; import { Node } from '.'; import { Column } from '../column'; -import { Table } from '../table'; +import { IndexCreationQuery, Table } from '../table'; -export class CreateIndexNode extends Node { +export class CreateIndexNode extends Node implements IndexCreationQuery { public table: Table; public options: { indexName: string; @@ -13,6 +13,7 @@ export class CreateIndexNode extends Node { type?: string; algorithm?: string; parser?: string; + ifNotExists?: boolean; }; constructor(table: Table, indexName: string) { @@ -64,4 +65,9 @@ export class CreateIndexNode extends Node { return result; } + + public ifNotExists() { + this.options.ifNotExists = true; + return this; + } } diff --git a/lib/node/dropIndex.ts b/lib/node/dropIndex.ts index 8b820693..244d5bb0 100644 --- a/lib/node/dropIndex.ts +++ b/lib/node/dropIndex.ts @@ -6,7 +6,7 @@ import { Table } from '../table'; export class DropIndexNode extends Node { public table: Table; - public options: { indexName: string }; + public options: { indexName: string, ifExists?: boolean }; constructor(table: Table, indexName: string | string[] | Column[]) { super('DROP INDEX'); @@ -23,4 +23,9 @@ export class DropIndexNode extends Node { this.table = table; this.options = { indexName }; } + + public ifExists(): DropIndexNode { + this.options.ifExists = true; + return this + } } diff --git a/lib/table.ts b/lib/table.ts index f0311a96..e1094685 100644 --- a/lib/table.ts +++ b/lib/table.ts @@ -330,7 +330,8 @@ interface IndexQuery { drop(...columns: Column[]): DropIndexNode; } -interface IndexCreationQuery extends Node { +export interface IndexCreationQuery extends Node { + ifNotExists(): IndexCreationQuery; unique(): IndexCreationQuery; using(name: string): IndexCreationQuery; on(...columns: (Column | OrderByValueNode)[]): IndexCreationQuery; diff --git a/test/dialects/indexes-tests.ts b/test/dialects/indexes-tests.ts index a94974ad..29994389 100644 --- a/test/dialects/indexes-tests.ts +++ b/test/dialects/indexes-tests.ts @@ -172,6 +172,35 @@ Harness.test({ params: [] }); +Harness.test({ + query: post + .indexes() + .create('mandatory_name') + .ifNotExists() + .on(post.userId, post.id.desc()), + pg: { + text: 'CREATE INDEX IF NOT EXISTS "mandatory_name" ON "post" ("userId","id" DESC)', + string: 'CREATE INDEX IF NOT EXISTS "mandatory_name" ON "post" ("userId","id" DESC)' + }, + mysql: { + text: 'Feature does not exist in MySQL', + throws: true + }, + sqlite: { + text: 'CREATE INDEX IF NOT EXISTS "mandatory_name" ON "post" ("userId","id" DESC)', + string: 'CREATE INDEX IF NOT EXISTS "mandatory_name" ON "post" ("userId","id" DESC)' + }, + mssql: { + text: 'Feature does not exist in MSSQL', + throws: true + }, + oracle: { + text: 'Feature does not exist in Oracle', + throws: true + }, + params: [] +}); + Harness.test({ query: post.indexes().create(), pg: { @@ -233,3 +262,24 @@ Harness.test({ }, params: [] }); + +Harness.test({ + query: post.indexes().drop(post.userId, post.id).ifExists(), + pg: { + text: 'DROP INDEX IF EXISTS "public"."post_id_userId"', + string: 'DROP INDEX IF EXISTS "public"."post_id_userId"' + }, + mysql: { + text: 'Feature does not exist in MySQL', + throws: true + }, + sqlite: { + text: 'DROP INDEX IF EXISTS "public"."post_id_userId"', + string: 'DROP INDEX IF EXISTS "public"."post_id_userId"' + }, + oracle: { + text: 'Feature does not exist in Oracle', + throws: true + }, + params: [] +}); From 27a78d365afd51bfca8dc945a16cdab2f2a260a5 Mon Sep 17 00:00:00 2001 From: ram goli Date: Sat, 30 Jan 2021 22:46:34 -0800 Subject: [PATCH 29/74] fix: update package name in README (#4) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 15d013c4..23033257 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Maybe it's still not fun, but at least it's _less not fun_. ## install ```sh -$ npm install sql +$ npm install sql-ts ``` ## use From 0f9660a3f2ac8f68a4f5866d053a3229b4349670 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Sun, 31 Jan 2021 19:49:17 +1300 Subject: [PATCH 30/74] Bump version --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index fab40c3a..fd88c7a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "5.1.0", + "version": "5.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9092d2d9..511a5a1b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.1.0", + "version": "5.2.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 563e1c3600b6a2bb87479376f85cf112d9bddefd Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Sun, 31 Jan 2021 19:51:54 +1300 Subject: [PATCH 31/74] fix: use coventional commit messages for releases --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 511a5a1b..6fff7dfd 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,9 @@ "test": "TS_NODE_PROJECT='test/tsconfig.json' mocha", "lint": "tslint --project .", "tsc": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", - "release:major": "npm run test && npm run tsc && npm version major -m \"Bump version\" && git push origin master --tags && npm publish", - "release:minor": "npm run test && npm run tsc && npm version minor -m \"Bump version\" && git push origin master --tags && npm publish", - "release:patch": "npm run test && npm run tsc && npm version patch -m \"Bump version\" && git push origin master --tags && npm publish" + "release:major": "npm run test && npm run tsc && npm version major -m \"chore: release\" && git push origin master --tags && npm publish", + "release:minor": "npm run test && npm run tsc && npm version minor -m \"chore: release\" && git push origin master --tags && npm publish", + "release:patch": "npm run test && npm run tsc && npm version patch -m \"chore: release\" && git push origin master --tags && npm publish" }, "engines": { "node": "^12.0.0 || >=14.0.0" From a3c1fc1b49814e0d7158cd54dead9f178b276113 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Sun, 31 Jan 2021 20:01:02 +1300 Subject: [PATCH 32/74] feat: use github actions --- .github/semantic.yml | 1 + .github/workflows/nodejs.yml | 22 ++++++++++++++++++++++ .travis.yml | 4 ---- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 .github/semantic.yml create mode 100644 .github/workflows/nodejs.yml delete mode 100644 .travis.yml diff --git a/.github/semantic.yml b/.github/semantic.yml new file mode 100644 index 00000000..fd160e51 --- /dev/null +++ b/.github/semantic.yml @@ -0,0 +1 @@ +titleOnly: true diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 00000000..d85c9105 --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,22 @@ +name: CI/CD + +on: [push] + +jobs: + build: + name: 'Build & Test' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v1 + with: + node-version: '14' + - name: npm install + run: npm install + env: + CI: true + - name: npm run test && npm run tsc + run: npm run test && npm run tsc + env: + CI: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index edffba63..00000000 --- a/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - '12.18' - - '14.5' From f645d8f8cb2ad6a6aa40ea9dd1dd21a5aff079a0 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Sun, 31 Jan 2021 20:08:19 +1300 Subject: [PATCH 33/74] chore: update docs --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 23033257..0af756b0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ So let's build it with TypeScript (JavaScript also supported). Maybe it's still not fun, but at least it's _less not fun_. -[![Build Status](https://travis-ci.com/charsleysa/node-sql-ts.svg?branch=master)](https://travis-ci.com/charsleysa/node-sql-ts) +![CI/CD](https://github.com/charsleysa/node-sql-ts/workflows/CI/CD/badge.svg) ## install @@ -20,7 +20,7 @@ $ npm install sql-ts ```ts //require the module -import { Sql } from 'sql'; +import { Sql } from 'sql-ts'; //(optionally) set the SQL dialect const sql = new Sql('postgres'); From f9828d76b839ea9373806682aac4ff0ed6bf265a Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 21 Apr 2021 13:04:24 +1200 Subject: [PATCH 34/74] fix: github actions not running on pull requests --- .github/workflows/nodejs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index d85c9105..f492ba99 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -1,6 +1,6 @@ name: CI/CD -on: [push] +on: [push, pull_request] jobs: build: From 56cedde85d12d2261ee420a7cf9c770182644046 Mon Sep 17 00:00:00 2001 From: Christophe Venevongsos Date: Wed, 21 Apr 2021 03:06:27 +0200 Subject: [PATCH 35/74] fix: Index creation in Postgres dialect (#6) * refactor: extract re-usable index creation fragments * refactor: redeclare visitCreateIndex for each dialect * fix: Index creation on Postgres dialect https://www.postgresql.org/docs/9.6/sql-createindex.html Index algorithm (called 'method' in Postgres documentation) comes *after* table name in the Postgres dialect. Co-authored-by: Stefan Andres Charsley --- lib/dialect/mssql.ts | 17 ++++++++++++++ lib/dialect/mysql.ts | 17 ++++++++++++++ lib/dialect/oracle.ts | 17 ++++++++++++++ lib/dialect/postgres.ts | 43 +++++++++++++++++++++++----------- lib/dialect/sqlite.ts | 17 ++++++++++++++ test/dialects/indexes-tests.ts | 4 ++-- 6 files changed, 99 insertions(+), 16 deletions(-) diff --git a/lib/dialect/mssql.ts b/lib/dialect/mssql.ts index cf5cfdbd..f1ed2f95 100644 --- a/lib/dialect/mssql.ts +++ b/lib/dialect/mssql.ts @@ -10,6 +10,7 @@ import { BinaryNode, CaseNode, ColumnNode, + CreateIndexNode, CreateNode, DropNode, FunctionCallNode, @@ -387,6 +388,22 @@ export class Mssql extends Postgres { // // return "SHOW INDEX FROM " + tableName; // }; + public visitCreateIndex(createIndexNode: CreateIndexNode): string[] { + const { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser } = this._visitCreateIndex(createIndexNode); + + return [ + 'CREATE', + indexType, + 'INDEX', + ...ifNotExists, + indexName, + algorithm, + 'ON', + ...tableName, + columns, + parser + ].filter(this.notEmpty); + } public visitIfNotExistsIndex(): string[] { throw new Error('MSSQL does not allow ifNotExists clause on indexes.'); } diff --git a/lib/dialect/mysql.ts b/lib/dialect/mysql.ts index b27c2cf7..c24151e2 100644 --- a/lib/dialect/mysql.ts +++ b/lib/dialect/mysql.ts @@ -6,6 +6,7 @@ import isNumber from 'lodash/isNumber'; import { BinaryNode, ColumnNode, + CreateIndexNode, CreateNode, ForShareNode, FunctionCallNode, @@ -119,6 +120,22 @@ export class Mysql extends Postgres { const tableName = this.visit(this.queryNode!.table.toNode())[0]; return [`SHOW INDEX FROM ${tableName}`]; } + public visitCreateIndex(createIndexNode: CreateIndexNode): string[] { + const { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser } = this._visitCreateIndex(createIndexNode); + + return [ + 'CREATE', + indexType, + 'INDEX', + ...ifNotExists, + indexName, + algorithm, + 'ON', + ...tableName, + columns, + parser + ].filter(this.notEmpty); + } public visitIfNotExistsIndex(): string[] { throw new Error('MySQL does not allow ifNotExists clause on indexes.'); } diff --git a/lib/dialect/oracle.ts b/lib/dialect/oracle.ts index a6022f52..69116b80 100644 --- a/lib/dialect/oracle.ts +++ b/lib/dialect/oracle.ts @@ -9,6 +9,7 @@ import { CascadeNode, CaseNode, ColumnNode, + CreateIndexNode, CreateNode, DropIndexNode, DropNode, @@ -240,6 +241,22 @@ export class Oracle extends Postgres { } return [indexes]; } + public visitCreateIndex(createIndexNode: CreateIndexNode): string[] { + const { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser } = this._visitCreateIndex(createIndexNode); + + return [ + 'CREATE', + indexType, + 'INDEX', + ...ifNotExists, + indexName, + algorithm, + 'ON', + ...tableName, + columns, + parser + ].filter(this.notEmpty); + } public visitDropIndex(dropIndexNode: DropIndexNode): string[] { if (dropIndexNode.options.ifExists) { throw new Error('Oracle does not allow ifExists clause on indexes.'); diff --git a/lib/dialect/postgres.ts b/lib/dialect/postgres.ts index f05e07f2..233baaf2 100644 --- a/lib/dialect/postgres.ts +++ b/lib/dialect/postgres.ts @@ -1153,30 +1153,45 @@ export class Postgres extends Dialect { 'AND pg_class.oid=pg_index.indrelid)' ]; } - public visitCreateIndex(createIndexNode: CreateIndexNode): string[] { + + protected notEmpty(t: T | undefined): t is T { + return t !== undefined + } + + protected _visitCreateIndex(createIndexNode: CreateIndexNode) { if (!createIndexNode.options.columns || createIndexNode.options.columns.length === 0) { throw new Error('No columns defined!'); } const tableName = this.visit(createIndexNode.table.toNode()); - const ifNotExists = createIndexNode.options?.ifNotExists ? this.visitIfNotExistsIndex() : [] - const notEmpty = (t: T | undefined): t is T => t !== undefined + const ifNotExists = createIndexNode.options?.ifNotExists ? this.visitIfNotExistsIndex() : []; + const indexType = createIndexNode.options?.type?.toUpperCase(); + const indexName = this.quote(createIndexNode.indexName()); + const algorithm = createIndexNode.options.algorithm ? 'USING ' + createIndexNode.options.algorithm.toUpperCase() : undefined; + const columns = '(' + createIndexNode.options.columns.reduce((res, col) => { + const column = col.name ? col.name : col.value.name; + const direction = col instanceof OrderByValueNode ? ` ${col.direction!.text}` : ''; + return res.concat(this.quote(column) + direction); + }, []) + ')'; + const parser = createIndexNode.options.parser ? 'WITH PARSER ' + createIndexNode.options.parser : undefined; + + return { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser }; + } + + public visitCreateIndex(createIndexNode: CreateIndexNode): string[] { + const { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser } = this._visitCreateIndex(createIndexNode); + return [ 'CREATE', - createIndexNode.options?.type?.toUpperCase(), + indexType, 'INDEX', ...ifNotExists, - this.quote(createIndexNode.indexName()), - createIndexNode.options.algorithm ? 'USING ' + createIndexNode.options.algorithm.toUpperCase() : undefined, + indexName, 'ON', ...tableName, - '(' + createIndexNode.options.columns.reduce((res, col) => { - const column = col.name ? col.name : col.value.name; - const direction = col instanceof OrderByValueNode ? ` ${col.direction!.text}` : ''; - return res.concat(this.quote(column) + direction); - }, []) + ')', - createIndexNode.options.parser ? 'WITH PARSER' : undefined, - createIndexNode.options.parser, - ].filter(notEmpty); + algorithm, + columns, + parser + ].filter(this.notEmpty); } public visitIfNotExistsIndex(): string[] { return ['IF NOT EXISTS'] diff --git a/lib/dialect/sqlite.ts b/lib/dialect/sqlite.ts index bc3c4f9b..c68ea09f 100644 --- a/lib/dialect/sqlite.ts +++ b/lib/dialect/sqlite.ts @@ -7,6 +7,7 @@ import { AddColumnNode, BinaryNode, CascadeNode, + CreateIndexNode, DefaultNode, DropColumnNode, ForShareNode, @@ -178,6 +179,22 @@ export class Sqlite extends Postgres { const tableName = this.visit(this.queryNode!.table.toNode())[0]; return [`PRAGMA INDEX_LIST(${tableName})`]; } + public visitCreateIndex(createIndexNode: CreateIndexNode): string[] { + const { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser } = this._visitCreateIndex(createIndexNode); + + return [ + 'CREATE', + indexType, + 'INDEX', + ...ifNotExists, + indexName, + algorithm, + 'ON', + ...tableName, + columns, + parser + ].filter(this.notEmpty); + } public visitCascade(cascadeNode: CascadeNode): string[] { throw new Error('Sqlite do not support CASCADE in DROP TABLE'); } diff --git a/test/dialects/indexes-tests.ts b/test/dialects/indexes-tests.ts index 29994389..64e4d0ea 100644 --- a/test/dialects/indexes-tests.ts +++ b/test/dialects/indexes-tests.ts @@ -35,8 +35,8 @@ Harness.test({ .on(post.id, post.userId) .withParser('foo'), pg: { - text: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo', - string: 'CREATE UNIQUE INDEX "index_name" USING BTREE ON "post" ("id","userId") WITH PARSER foo' + text: 'CREATE UNIQUE INDEX "index_name" ON "post" USING BTREE ("id","userId") WITH PARSER foo', + string: 'CREATE UNIQUE INDEX "index_name" ON "post" USING BTREE ("id","userId") WITH PARSER foo' }, mysql: { text: 'CREATE UNIQUE INDEX `index_name` USING BTREE ON `post` (`id`,`userId`) WITH PARSER foo', From edf803bef7aeb639df388224bf07439ed07e80f1 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 21 Apr 2021 13:10:10 +1200 Subject: [PATCH 36/74] chore: release --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index fd88c7a4..840c67b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "5.2.0", + "version": "5.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6fff7dfd..616ae0de 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.2.0", + "version": "5.2.1", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From daa0fe7012c1a4efcdb1f906883f42dd95828c28 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 21 Apr 2021 13:55:33 +1200 Subject: [PATCH 37/74] fix: incorrect typing for insert and update values --- lib/node/query.ts | 4 ++-- lib/nodeable.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/node/query.ts b/lib/node/query.ts index d8e17ee7..f84b2e2b 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -229,9 +229,9 @@ export class Query extends Node { } public insert(object: Column[] | Column): this; - public insert(object: Partial[] | Partial): this; + public insert(object: PartialNodeable[] | PartialNodeable): this; public insert(...nodes: Column[]): this; - public insert(...nodes: (Column[] | Column | Partial[] | Partial)[]): this { + public insert(...nodes: (Column[] | Column | PartialNodeable[] | PartialNodeable)[]): this { let args = sliced(nodes) as Column[]; const object = nodes[0]; diff --git a/lib/nodeable.ts b/lib/nodeable.ts index efabe701..daf45a0d 100644 --- a/lib/nodeable.ts +++ b/lib/nodeable.ts @@ -8,4 +8,4 @@ export function instanceofINodeable(o: unknown): o is INodeable { return typeof o === 'object' && o !== null && 'toNode' in o; } -export type PartialNodeable = { [P in keyof T]?: T[P] | INodeable | Buffer }; +export type PartialNodeable = { [P in keyof T]?: T[P] | INodeable | Buffer | null }; From cce3559baa9c1a455d5811d1db182851aa692e53 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 21 Apr 2021 13:56:15 +1200 Subject: [PATCH 38/74] chore: release --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 840c67b6..4b65a1d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "5.2.1", + "version": "5.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 616ae0de..7322bcb8 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.2.1", + "version": "5.2.2", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 99dbef8960a371539957e85f440c2223f35c0703 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Thu, 20 May 2021 13:48:00 +1200 Subject: [PATCH 39/74] fix: incorrect subquery typing --- lib/node/query.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/node/query.ts b/lib/node/query.ts index f84b2e2b..e17dd468 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -586,7 +586,7 @@ type SubQueryExtensions = { } & { columns: Column[] } & { - [P in keyof C]: Column + [P in NonNullable]: Column }; export type SubQuery = Query & SubQueryExtensions; \ No newline at end of file From 99b91c293c6e1fb300023679d36ca7c9ff86dffd Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Thu, 20 May 2021 13:48:36 +1200 Subject: [PATCH 40/74] chore: release --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b65a1d4..c55b8e54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "5.2.2", + "version": "5.2.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7322bcb8..d41a987c 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.2.2", + "version": "5.2.3", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 320aef34c4e676f5381da2d4feb4c264ae8df693 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 29 Jun 2021 14:15:41 +1200 Subject: [PATCH 41/74] feat: full esm package --- .eslintrc.json | 230 ++ .gitignore | 1 + .npmignore | 6 +- README.md | 7 +- lib/column.ts | 28 +- lib/configTypes.ts | 2 +- lib/dialect/dialect.ts | 1230 +++++++- lib/dialect/index.ts | 24 - lib/dialect/mapper.ts | 20 + lib/dialect/mssql.ts | 90 +- lib/dialect/mysql.ts | 57 +- lib/dialect/oracle.ts | 86 +- lib/dialect/postgres.ts | 1268 +------- lib/dialect/sqlite.ts | 67 +- lib/functions.ts | 6 +- lib/index.ts | 96 +- lib/joiner.ts | 4 +- lib/node/_internal.ts | 11 + lib/node/addColumn.ts | 4 +- lib/node/alias.ts | 32 +- lib/node/alter.ts | 4 +- lib/node/arrayCall.ts | 21 +- lib/node/at.ts | 22 +- lib/node/binary.ts | 27 +- lib/node/cascade.ts | 4 +- lib/node/case.ts | 23 +- lib/node/cast.ts | 22 +- lib/node/column.ts | 8 +- lib/node/create.ts | 4 +- lib/node/createIndex.ts | 8 +- lib/node/createView.ts | 4 +- lib/node/default.ts | 4 +- lib/node/delete.ts | 4 +- lib/node/distinct.ts | 4 +- lib/node/distinctOn.ts | 4 +- lib/node/drop.ts | 6 +- lib/node/dropColumn.ts | 4 +- lib/node/dropIndex.ts | 8 +- lib/node/forShare.ts | 4 +- lib/node/forUpdate.ts | 4 +- lib/node/foreignKey.ts | 4 +- lib/node/from.ts | 4 +- lib/node/functionCall.ts | 18 +- lib/node/groupBy.ts | 4 +- lib/node/having.ts | 4 +- lib/node/ifExists.ts | 4 +- lib/node/ifNotExists.ts | 4 +- lib/node/in.ts | 27 +- lib/node/index.ts | 66 - lib/node/indexes.ts | 6 +- lib/node/insert.ts | 11 +- lib/node/interval.ts | 4 +- lib/node/join.ts | 8 +- lib/node/literal.ts | 4 +- lib/node/modifier.ts | 4 +- lib/node/node.ts | 43 +- lib/node/notIn.ts | 27 +- lib/node/onConflict.ts | 4 +- lib/node/onDuplicate.ts | 4 +- lib/node/orIgnore.ts | 4 +- lib/node/orderBy.ts | 5 +- lib/node/orderByValue.ts | 8 +- lib/node/parameter.ts | 14 +- lib/node/postfixUnary.ts | 23 +- lib/node/prefixUnary.ts | 23 +- lib/node/query.ts | 165 +- lib/node/rename.ts | 4 +- lib/node/renameColumn.ts | 4 +- lib/node/replace.ts | 11 +- lib/node/restrict.ts | 4 +- lib/node/returning.ts | 4 +- lib/node/rowCall.ts | 21 +- lib/node/select.ts | 5 +- lib/node/slice.ts | 22 +- lib/node/table.ts | 6 +- lib/node/ternary.ts | 23 +- lib/node/text.ts | 6 +- lib/node/truncate.ts | 6 +- lib/node/update.ts | 4 +- lib/node/valueExpression.ts | 348 +-- lib/node/where.ts | 18 +- lib/nodeable.ts | 3 +- lib/sql.ts | 22 +- lib/table.ts | 33 +- lib/tableTracker.ts | 5 +- package-lock.json | 3725 ++++++++++++++++++----- package.json | 59 +- rollup.config.js | 49 + runtests.js | 18 - test/.eslintrc.json | 14 + test/binary-clause-tests.ts | 4 +- test/clause-definition.ts | 5 +- test/column-tests.ts | 4 +- test/dialects/aggregate-tests.ts | 4 +- test/dialects/alias-tests.ts | 6 +- test/dialects/alter-table-tests.ts | 6 +- test/dialects/array-tests.ts | 6 +- test/dialects/binary-clause-tests.ts | 4 +- test/dialects/case-tests.ts | 4 +- test/dialects/cast-tests.ts | 3 +- test/dialects/clause-ordering-tests.ts | 4 +- test/dialects/create-table-tests.ts | 6 +- test/dialects/create-view-tests.ts | 4 +- test/dialects/date-tests.ts | 6 +- test/dialects/delete-tests.ts | 4 +- test/dialects/distinct-on-tests.ts | 4 +- test/dialects/distinct-tests.ts | 4 +- test/dialects/drop-table-tests.ts | 4 +- test/dialects/for-share-tests.ts | 4 +- test/dialects/for-update-tests.ts | 4 +- test/dialects/from-clause-tests.ts | 4 +- test/dialects/function-tests.ts | 6 +- test/dialects/group-by-tests.ts | 4 +- test/dialects/having-tests.ts | 4 +- test/dialects/hstore-tests.ts | 6 +- test/dialects/ilike-tests.ts | 4 +- test/dialects/in-clause-tests.ts | 4 +- test/dialects/index.ts | 1 - test/dialects/indexes-tests.ts | 4 +- test/dialects/insert-tests.ts | 6 +- test/dialects/join-tests.ts | 4 +- test/dialects/join-to-tests.ts | 6 +- test/dialects/json-tests.ts | 4 +- test/dialects/limit-and-offset-tests.ts | 4 +- test/dialects/literal-tests.ts | 6 +- test/dialects/matches-test.ts | 6 +- test/dialects/namespace-tests.ts | 6 +- test/dialects/not-in-clause-tests.ts | 4 +- test/dialects/order-tests.ts | 6 +- test/dialects/regex-tests.ts | 4 +- test/dialects/replace-tests.ts | 6 +- test/dialects/returning-tests.ts | 4 +- test/dialects/row-tests.ts | 6 +- test/dialects/schema-tests.ts | 6 +- test/dialects/select-tests.ts | 6 +- test/dialects/shortcut-tests.ts | 4 +- test/dialects/subfield-tests.ts | 4 +- test/dialects/subquery-tests.ts | 6 +- test/dialects/support.ts | 14 +- test/dialects/table-tests.ts | 4 +- test/dialects/ternary-clause-tests.ts | 4 +- test/dialects/tostring-tests.ts | 4 +- test/dialects/truncate-table-tests.ts | 4 +- test/dialects/unary-clause-tests.ts | 4 +- test/dialects/update-tests.ts | 4 +- test/dialects/value-expression-tests.ts | 4 +- test/dialects/where-clause-tests.ts | 4 +- test/function-tests.ts | 3 +- test/index-tests.ts | 13 +- test/index.ts | 18 - test/select-tests.ts | 4 +- test/table-tests.ts | 6 +- test/ternary-clause-tests.ts | 4 +- test/tsconfig.json | 7 +- test/tslint.json | 8 - test/unary-clause-tests.ts | 4 +- test/value-expression-tests.ts | 17 - tsconfig.build.json | 9 + tsconfig.cjs.json | 8 - tsconfig.json | 7 +- tslint.json | 7 - 161 files changed, 5482 insertions(+), 3268 deletions(-) create mode 100644 .eslintrc.json delete mode 100644 lib/dialect/index.ts create mode 100644 lib/dialect/mapper.ts create mode 100644 lib/node/_internal.ts delete mode 100644 lib/node/index.ts create mode 100644 rollup.config.js delete mode 100644 runtests.js create mode 100644 test/.eslintrc.json delete mode 100644 test/dialects/index.ts delete mode 100644 test/index.ts delete mode 100644 test/tslint.json delete mode 100644 test/value-expression-tests.ts create mode 100644 tsconfig.build.json delete mode 100644 tsconfig.cjs.json delete mode 100644 tslint.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000..d1a12fd8 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,230 @@ +{ + "env": { + "es6": true + }, + "extends": [ + "prettier" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": [ + "tsconfig.json" + ], + "sourceType": "module" + }, + "plugins": [ + "eslint-plugin-import", + "eslint-plugin-jsdoc", + "eslint-plugin-prefer-arrow", + "eslint-plugin-unicorn", + "@typescript-eslint" + ], + "rules": { + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/array-type": [ + "error", + { + "default": "array" + } + ], + "@typescript-eslint/ban-types": [ + "error", + { + "types": { + "Object": { + "message": "Avoid using the `Object` type. Did you mean `object`?" + }, + "Function": { + "message": "Avoid using the `Function` type. Prefer a specific function type, like `() => void`." + }, + "Boolean": { + "message": "Avoid using the `Boolean` type. Did you mean `boolean`?" + }, + "Number": { + "message": "Avoid using the `Number` type. Did you mean `number`?" + }, + "String": { + "message": "Avoid using the `String` type. Did you mean `string`?" + }, + "Symbol": { + "message": "Avoid using the `Symbol` type. Did you mean `symbol`?" + } + } + } + ], + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/dot-notation": "error", + "@typescript-eslint/indent": "off", + "@typescript-eslint/member-delimiter-style": [ + "off", + { + "multiline": { + "delimiter": "none", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + ], + "@typescript-eslint/naming-convention": "off", + "@typescript-eslint/no-empty-function": "error", + "@typescript-eslint/no-empty-interface": "error", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/no-shadow": [ + "error", + { + "hoist": "all" + } + ], + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-var-requires": "error", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/quotes": "off", + "@typescript-eslint/semi": [ + "off", + null + ], + "@typescript-eslint/triple-slash-reference": [ + "error", + { + "path": "always", + "types": "prefer-import", + "lib": "always" + } + ], + "@typescript-eslint/type-annotation-spacing": "off", + "@typescript-eslint/unified-signatures": "error", + "arrow-parens": [ + "off", + "always" + ], + "brace-style": [ + "off", + "off" + ], + "comma-dangle": "off", + "complexity": "off", + "constructor-super": "error", + "dot-notation": "error", + "eol-last": "off", + "eqeqeq": [ + "error", + "smart" + ], + "guard-for-in": "error", + "id-blacklist": [ + "error", + "any", + "Number", + "number", + "String", + "string", + "Boolean", + "boolean", + "Undefined", + "undefined" + ], + "id-match": "error", + "import/no-extraneous-dependencies": "error", + "import/no-internal-modules": [ + "error", + { + "allow": [ + "lodash/*" + ] + } + ], + "indent": "off", + "jsdoc/check-alignment": "error", + "jsdoc/check-indentation": "error", + "jsdoc/newline-after-description": "error", + "linebreak-style": "off", + "max-classes-per-file": [ + "error", + 1 + ], + "max-len": "off", + "new-parens": "off", + "newline-per-chained-call": "off", + "no-bitwise": "error", + "no-caller": "error", + "no-cond-assign": "error", + "no-console": "error", + "no-debugger": "error", + "no-duplicate-case": "error", + "no-duplicate-imports": "error", + "no-empty": "error", + "no-empty-function": "error", + "no-eval": "error", + "no-extra-bind": "error", + "no-extra-semi": "off", + "no-fallthrough": "off", + "no-invalid-this": "off", + "no-irregular-whitespace": "off", + "no-multiple-empty-lines": "off", + "no-new-func": "error", + "no-new-wrappers": "error", + "no-redeclare": "error", + "no-return-await": "error", + "no-sequences": "error", + "no-shadow": "error", + "no-sparse-arrays": "error", + "no-template-curly-in-string": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "off", + "no-undef-init": "error", + "no-underscore-dangle": "off", + "no-unsafe-finally": "error", + "no-unused-expressions": "error", + "no-unused-labels": "error", + "no-use-before-define": "off", + "no-var": "error", + "object-shorthand": "error", + "one-var": [ + "error", + "never" + ], + "padded-blocks": [ + "off", + { + "blocks": "never" + }, + { + "allowSingleLineBlocks": true + } + ], + "prefer-arrow/prefer-arrow-functions": "error", + "prefer-const": "error", + "prefer-object-spread": "error", + "quote-props": "off", + "quotes": "off", + "radix": "error", + "semi": "off", + "space-before-function-paren": "off", + "space-in-parens": [ + "off", + "never" + ], + "spaced-comment": [ + "error", + "always", + { + "markers": [ + "/" + ] + } + ], + "unicorn/prefer-ternary": "error", + "use-isnan": "error", + "valid-typeof": "off" + } +} diff --git a/.gitignore b/.gitignore index 3881e74e..bd8b926e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ dist/ +spec/ .idea diff --git a/.npmignore b/.npmignore index f910cf33..9ad0e6f7 100644 --- a/.npmignore +++ b/.npmignore @@ -1,11 +1,11 @@ @types/ lib/ node_modules/ +spec/ test/ +.eslintrc.json .gitignore .prettierrc .travis.yml runtests.js -tsconfig.json -tsconfig.cjs.json -tslint.json \ No newline at end of file +tsconfig.json \ No newline at end of file diff --git a/README.md b/README.md index 0af756b0..9b9c5699 100644 --- a/README.md +++ b/README.md @@ -130,14 +130,15 @@ There are a **lot** more examples included in the [test/dialects](https://github We **love** contributions. -node-sql wouldn't be anything without all the contributors and collaborators who've worked on it. +node-sql-ts wouldn't be anything without all the contributors and collaborators who've worked on it. If you'd like to become a collaborator here's how it's done: 1. fork the repo 2. `git pull https://github.com/(your_username)/node-sql-ts` 3. `cd node-sql-ts` -4. `npm install` -5. `npm test` +4. `npm install --global rollup` +5. `npm install` +6. `npm test` At this point the tests should pass for you. If they don't pass please open an issue with the output or you can even send me an email directly. My email address is on my github profile and also on every commit I contributed in the repo. diff --git a/lib/column.ts b/lib/column.ts index f4944790..69990629 100644 --- a/lib/column.ts +++ b/lib/column.ts @@ -1,9 +1,11 @@ -'use strict'; - -import extend from 'lodash/extend'; -import { ColumnNode, IValueExpressionMixin, OrderByValueNode, TextNode, valueExpressionMixin } from './node'; -import { INodeable } from './nodeable'; -import { Table } from './table'; +/* eslint-disable max-classes-per-file */ +import { ColumnNode } from './node/column.js'; +import { Node } from './node/node.js'; +import { OrderByValueNode } from './node/orderByValue.js'; +import { ValueExpressionMixin } from './node/_internal.js'; +import { TextNode } from './node/text.js'; +import { INodeable } from './nodeable.js'; +import { Table } from './table.js'; interface ColumnConfig { name?: string; @@ -32,13 +34,16 @@ interface ColumnConfig { constantValue?: any; } -export class Column implements INodeable { +abstract class ColumnBase implements INodeable { + public abstract toNode(): Node; +} + +export class Column extends ValueExpressionMixin(ColumnBase) implements INodeable { public name: string; public property?: string; public table?: Table; public alias?: string; public dataType?: string; - // tslint:disable-next-line:variable-name public _value: any; public star?: boolean; public subfields: { [key: string]: Column } = {}; @@ -63,6 +68,7 @@ export class Column implements INodeable { public unique?: boolean; public isDistinct?: boolean; constructor(config: ColumnConfig) { + super(); this.name = config.name as string; this.property = config.property; this.star = config.star; @@ -144,9 +150,6 @@ export class Column implements INodeable { } } -// mix in value expression -extend(Column.prototype, valueExpressionMixin()); - const contextify = (base: Column): Column => { const context = Object.create(Column.prototype); Object.keys(base).forEach((key) => { @@ -154,6 +157,3 @@ const contextify = (base: Column): Column => { }); return context; }; - -// tslint:disable-next-line:no-empty-interface -export interface Column extends IValueExpressionMixin {} diff --git a/lib/configTypes.ts b/lib/configTypes.ts index 470f4b87..ed776d7e 100644 --- a/lib/configTypes.ts +++ b/lib/configTypes.ts @@ -1,4 +1,4 @@ -import { Sql } from './sql'; +import { Sql } from './sql.js'; export type SQLDialects = 'mssql' | 'mysql' | 'oracle' | 'postgres' | 'sqlite'; diff --git a/lib/dialect/dialect.ts b/lib/dialect/dialect.ts index 0a4651d2..a7322643 100644 --- a/lib/dialect/dialect.ts +++ b/lib/dialect/dialect.ts @@ -1,11 +1,1225 @@ -import { Query } from '../node'; -import { Table } from '../table'; +import assert from 'assert'; +import isNumber from 'lodash/isNumber.js'; +import map from 'lodash/map.js'; -export abstract class Dialect { - public config: any; - constructor(config: any) { - this.config = config; +import { AddColumnNode } from '../node/addColumn.js'; +import { AliasNode } from '../node/alias.js'; +import { AlterNode } from '../node/alter.js'; +import { ArrayCallNode } from '../node/arrayCall.js'; +import { AtNode } from '../node/at.js'; +import { BinaryNode } from '../node/binary.js'; +import { CascadeNode } from '../node/cascade.js'; +import { CaseNode } from '../node/case.js'; +import { CastNode } from '../node/cast.js'; +import { ColumnNode } from '../node/column.js'; +import { CreateNode } from '../node/create.js'; +import { CreateIndexNode } from '../node/createIndex.js'; +import { CreateViewNode } from '../node/createView.js'; +import { DefaultNode } from '../node/default.js'; +import { DeleteNode } from '../node/delete.js'; +import { DistinctNode } from '../node/distinct.js'; +import { DistinctOnNode } from '../node/distinctOn.js'; +import { DropNode } from '../node/drop.js'; +import { DropColumnNode } from '../node/dropColumn.js'; +import { DropIndexNode } from '../node/dropIndex.js'; +import { ForeignKeyNode } from '../node/foreignKey.js'; +import { ForShareNode } from '../node/forShare.js'; +import { ForUpdateNode } from '../node/forUpdate.js'; +import { FunctionCallNode } from '../node/functionCall.js'; +import { FromNode } from '../node/from.js'; +import { GroupByNode } from '../node/groupBy.js'; +import { HavingNode } from '../node/having.js'; +import { IfExistsNode } from '../node/ifExists.js'; +import { IfNotExistsNode } from '../node/ifNotExists.js'; +import { InNode } from '../node/in.js'; +import { IndexesNode } from '../node/indexes.js'; +import { InsertNode } from '../node/insert.js'; +import { IntervalNode } from '../node/interval.js'; +import { JoinNode } from '../node/join.js'; +import { LiteralNode } from '../node/literal.js'; +import { ModifierNode } from '../node/modifier.js'; +import { Node } from '../node/node.js'; +import { NotInNode } from '../node/notIn.js'; +import { OnConflictNode } from '../node/onConflict.js'; +import { OnDuplicateNode } from '../node/onDuplicate.js'; +import { OrderByNode } from '../node/orderBy.js'; +import { OrderByValueNode } from '../node/orderByValue.js'; +import { OrIgnoreNode } from '../node/orIgnore.js'; +import { ParameterNode } from '../node/parameter.js'; +import { PrefixUnaryNode } from '../node/prefixUnary.js'; +import { PostfixUnaryNode } from '../node/postfixUnary.js'; +import { Query } from '../node/query.js'; +import { RenameNode } from '../node/rename.js'; +import { RenameColumnNode } from '../node/renameColumn.js'; +import { ReplaceNode } from '../node/replace.js'; +import { RestrictNode } from '../node/restrict.js'; +import { ReturningNode } from '../node/returning.js'; +import { RowCallNode } from '../node/rowCall.js'; +import { SelectNode } from '../node/select.js'; +import { SliceNode } from '../node/slice.js'; +import { TableNode } from '../node/table.js'; +import { TernaryNode } from '../node/ternary.js'; +import { TextNode } from '../node/text.js'; +import { TruncateNode } from '../node/truncate.js'; +import { UpdateNode } from '../node/update.js'; +import { WhereNode } from '../node/where.js'; +import { Table } from '../table.js'; + +export abstract class Dialect { + protected output: string[]; + protected params: string[]; + protected queryNode?: Query; + protected arrayAggFunctionName: string = 'array_agg'; + protected aliasText: string = ' AS '; + protected quoteCharacter: string = '"'; + protected disableParameterPlaceholders: boolean = false; + protected selectOrDeleteEndIndex: number = 0; + protected visitedInsert: boolean = false; + protected visitingUpdateTargetColumn: boolean = false; + protected visitingCreate: boolean = false; + protected visitCreateCompoundPrimaryKey: boolean = false; + protected visitingAlter: boolean = false; + protected visitingCast: boolean = false; + protected visitingWhere: boolean = false; + protected visitingCase: boolean = false; + protected visitedReplace: boolean = false; + protected visitingAddColumn: boolean = false; + protected visitingReturning: boolean = false; + protected visitingJoin: boolean = false; + protected visitingFunctionCall: boolean = false; + constructor(protected config: ConfigType) { + this.output = []; + this.params = []; + } + + protected abstract createSubInstance(): Dialect; + + public _getParameterText(index: number, value: any): string { + return this.disableParameterPlaceholders ? this._getParameterValue(value).toString() : this._getParameterPlaceholder(index, value); + } + + public _getParameterValue( + value: null | boolean | number | string | any[] | Date | Buffer | Record, + quoteChar?: string + ): string | number { + // handle primitives + if (null === value) { + value = 'NULL'; + } else if ('boolean' === typeof value) { + value = value ? 'TRUE' : 'FALSE'; + } else if ('number' === typeof value) { + // number is just number + value = value; + } else if ('string' === typeof value) { + // string uses single quote by default + value = this.quote(value, quoteChar || "'"); + } else if ('object' === typeof value) { + if (Array.isArray(value)) { + value = map(value, (val) => this._getParameterValue(val, quoteChar)); + value = `(${(value as any[]).join(', ')})`; + } else if (value instanceof Date) { + // Date object's default toString format does not get parsed well + // Handle dates using custom dateToString method for postgres and toISOString for others + value = this._getParameterValue(value.toISOString(), quoteChar); + } else if (Buffer.isBuffer(value)) { + value = this._getParameterValue('\\x' + value.toString('hex'), quoteChar); + } else { + // rich object represent with string + const strValue = value.toString(); + value = strValue === '[object Object]' ? this._getParameterValue(JSON.stringify(value), quoteChar) : this._getParameterValue(strValue, quoteChar); + } + } else { + throw new Error(`Unable to use ${value} in query`); + } + // value has been converted at this point + return value; + } + public _getParameterPlaceholder(index: string | number, value: unknown): string { + return '$' + index; + } + public getQuery(queryNode: Query | Table): { text: string, values: string[] } { + // passed in a table, not a query + if (queryNode instanceof Table) { + queryNode = queryNode.select(queryNode.star()); + } + this.output = this.visit(queryNode); + // if is a create view, must replace paramaters with values + if (this.output.indexOf('CREATE VIEW') > -1) { + const previousFlagStatus = this.disableParameterPlaceholders; + this.disableParameterPlaceholders = true; + this.output = []; + this.output = this.visit(queryNode); + this.params = []; + this.disableParameterPlaceholders = previousFlagStatus; + } + // create the query object + const query = { text: this.output.join(' '), values: this.params }; + // reset the internal state of this builder + this.output = []; + this.params = []; + return query; + } + public getString(queryNode: Query) { + // switch off parameter placeholders + const previousFlagStatus = this.disableParameterPlaceholders; + this.disableParameterPlaceholders = true; + let query; + try { + // use the same code path for query building + query = this.getQuery(queryNode); + } finally { + // always restore the flag afterwards + this.disableParameterPlaceholders = previousFlagStatus; + } + return query.text; + } + public visit(node: Node): string[] { + switch (node.type) { + case 'QUERY': + return this.visitQuery(node as Query); + case 'SUBQUERY': + return this.visitSubquery(node as Query); + case 'SELECT': + return this.visitSelect(node as SelectNode); + case 'INSERT': + return this.visitInsert(node as InsertNode); + case 'REPLACE': + return this.visitReplace(node as ReplaceNode); + case 'UPDATE': + return this.visitUpdate(node as UpdateNode); + case 'DELETE': + return this.visitDelete(node as DeleteNode); + case 'CREATE': + return this.visitCreate(node as CreateNode); + case 'DROP': + return this.visitDrop(node as DropNode); + case 'TRUNCATE': + return this.visitTruncate(node as TruncateNode); + case 'DISTINCT': + return this.visitDistinct(node as DistinctNode); + case 'DISTINCT ON': + return this.visitDistinctOn(node as DistinctOnNode); + case 'ALIAS': + return this.visitAlias(node as AliasNode); + case 'ALTER': + return this.visitAlter(node as AlterNode); + case 'CAST': + return this.visitCast(node as CastNode); + case 'FROM': + return this.visitFrom(node as FromNode); + case 'WHERE': + return this.visitWhere(node as WhereNode); + case 'ORDER BY': + return this.visitOrderBy(node as OrderByNode); + case 'ORDER BY VALUE': + return this.visitOrderByValue(node as OrderByValueNode); + case 'GROUP BY': + return this.visitGroupBy(node as GroupByNode); + case 'HAVING': + return this.visitHaving(node as HavingNode); + case 'RETURNING': + return this.visitReturning(node as ReturningNode); + case 'ONDUPLICATE': + return this.visitOnDuplicate(node as OnDuplicateNode); + case 'ONCONFLICT': + return this.visitOnConflict(node as OnConflictNode); + case 'FOR UPDATE': + return this.visitForUpdate(node as ForUpdateNode); + case 'FOR SHARE': + return this.visitForShare(node as ForShareNode); + case 'TABLE': + return this.visitTable(node as TableNode); + case 'COLUMN': + return this.visitColumn(node as ColumnNode); + case 'FOREIGN KEY': + return this.visitForeignKey(node as ForeignKeyNode); + case 'JOIN': + return this.visitJoin(node as JoinNode); + case 'LITERAL': + return this.visitLiteral(node as LiteralNode); + case 'TEXT': + return this.visitText(node as TextNode); + case 'PARAMETER': + return this.visitParameter(node as ParameterNode); + case 'DEFAULT': + return this.visitDefault(node as DefaultNode); + case 'IF EXISTS': + return this.visitIfExists(node as IfExistsNode); + case 'IF NOT EXISTS': + return this.visitIfNotExists(node as IfNotExistsNode); + case 'OR IGNORE': + return this.visitOrIgnore(node as OrIgnoreNode); + case 'CASCADE': + return this.visitCascade(node as CascadeNode); + case 'RESTRICT': + return this.visitRestrict(node as RestrictNode); + case 'RENAME': + return this.visitRename(node as RenameNode); + case 'ADD COLUMN': + return this.visitAddColumn(node as AddColumnNode); + case 'DROP COLUMN': + return this.visitDropColumn(node as DropColumnNode); + case 'RENAME COLUMN': + return this.visitRenameColumn(node as RenameColumnNode); + case 'INDEXES': + return this.visitIndexes(node as IndexesNode); + case 'CREATE INDEX': + return this.visitCreateIndex(node as CreateIndexNode); + case 'DROP INDEX': + return this.visitDropIndex(node as DropIndexNode); + case 'FUNCTION CALL': + return this.visitFunctionCall(node as FunctionCallNode); + case 'ARRAY CALL': + return this.visitArrayCall(node as ArrayCallNode); + case 'ROW CALL': + return this.visitRowCall(node as RowCallNode); + case 'CREATE VIEW': + return this.visitCreateView(node as CreateViewNode); + case 'INTERVAL': + return this.visitInterval(node as IntervalNode); + case 'POSTFIX UNARY': + return this.visitPostfixUnary(node as PostfixUnaryNode); + case 'PREFIX UNARY': + return this.visitPrefixUnary(node as PrefixUnaryNode); + case 'BINARY': + return this.visitBinary(node as BinaryNode); + case 'TERNARY': + return this.visitTernary(node as TernaryNode); + case 'IN': + return this.visitIn(node as InNode); + case 'NOT IN': + return this.visitNotIn(node as NotInNode); + case 'CASE': + return this.visitCase(node as CaseNode); + case 'AT': + return this.visitAt(node as AtNode); + case 'SLICE': + return this.visitSlice(node as SliceNode); + case 'LIMIT': + case 'OFFSET': + return this.visitModifier(node as ModifierNode); + default: + throw new Error(`Unrecognized node type ${node.type}`); + } + } + public quote(word: string, quoteCharacter?: string) { + const q = quoteCharacter != null ? quoteCharacter : this.quoteCharacter; + // handle square brackets specially + return q === '[' ? '[' + word + ']' : q + word.replace(new RegExp(q, 'g'), q + q) + q; + } + public visitSelect(selectNode: SelectNode): string[] { + const result = ['SELECT']; + if (selectNode.isDistinct) { + result.push('DISTINCT'); + } + const distinctOnNode = selectNode.nodes.filter((node) => node.type === 'DISTINCT ON').shift(); + const nonDistinctOnNodes = selectNode.nodes.filter((node) => node.type !== 'DISTINCT ON'); + if (distinctOnNode) { + result.push(this.visit(distinctOnNode).join()); + } + result.push(nonDistinctOnNodes.map(this.visit.bind(this)).join(', ')); + this.selectOrDeleteEndIndex = this.output.length + result.length; + return result; + } + public visitInsert(insertNode: InsertNode): string[] { + // don't use table.column for inserts + this.visitedInsert = true; + const result = ['INSERT', ...insertNode.nodes.map((n) => this.visit(n).join())]; + result.push(`INTO ${this.visit(this.queryNode!.table.toNode()).join()}`); + result.push(`(${insertNode.columns.map(this.visit.bind(this)).join(', ')})`); + const paramNodes = insertNode.getParameters(); + if (paramNodes.length > 0) { + const paramText = paramNodes + .map((paramSet) => { + return paramSet.map((param) => this.visit(param)).join(', '); + }) + .map((param) => `(${param})`) + .join(', '); + result.push('VALUES', paramText); + if (result.slice(2, 5).join(' ') === '() VALUES ()') { + result.splice(2, 3, 'DEFAULT VALUES'); + } + } + this.visitedInsert = false; + return result; + } + public visitReplace(replaceNode: ReplaceNode): string[] { + throw new Error('Postgres does not support REPLACE.'); + } + public visitUpdate(updateNode: UpdateNode): string[] { + // don't auto-generate from clause + const params: string[] = []; + /* jshint boss: true */ + for (const node of updateNode.nodes as ColumnNode[]) { + this.visitingUpdateTargetColumn = true; + const targetCol = this.visit(node); + this.visitingUpdateTargetColumn = false; + params.push(`${targetCol} = ${this.visit(node.value)}`); + } + const result = ['UPDATE', this.visit(this.queryNode!.table.toNode()).join(), 'SET', params.join(', ')]; + return result; + } + public visitDelete(deleteNode: DeleteNode): string[] { + const result = ['DELETE']; + if (deleteNode.nodes.length) { + result.push(deleteNode.nodes.map(this.visit.bind(this)).join(', ')); + } + this.selectOrDeleteEndIndex = result.length; + return result; + } + public visitCreate(createNode: CreateNode): string[] { + this.visitingCreate = true; + // don't auto-generate from clause + const table = this.queryNode!.table; + const colNodes = table.columns.map((col) => col.toNode()); + const foreignKeyNodes = table.foreignKeys; + let result = ['CREATE TABLE']; + if (createNode.options.isTemporary) { + result = ['CREATE TEMPORARY TABLE']; + } + result = result.concat(createNode.nodes.map((n) => this.visit(n).join())); + result.push(this.visit(table.toNode()).join()); + const primaryColNodes = colNodes.filter((n) => n.primaryKey); + this.visitCreateCompoundPrimaryKey = primaryColNodes.length > 1; + let colspec = `(${colNodes.map((n) => this.visit(n).join()).join(', ')}`; + if (this.visitCreateCompoundPrimaryKey) { + colspec += `, PRIMARY KEY (${primaryColNodes.map((node) => this.quote(node.name)).join(', ')})`; + } + if (foreignKeyNodes.length > 0) { + colspec += `, ${foreignKeyNodes.map((n) => this.visit(n).join()).join(', ')}`; + } + colspec += ')'; + result.push(colspec); + this.visitCreateCompoundPrimaryKey = false; + this.visitingCreate = false; + return result; + } + public visitDrop(dropNode: DropNode): string[] { + // don't auto-generate from clause + let result = ['DROP TABLE']; + result = result.concat(dropNode.nodes.map((n) => this.visit(n).join())); + return result; + } + public visitTruncate(truncateNode: TruncateNode): string[] { + let result = ['TRUNCATE TABLE']; + result = result.concat(truncateNode.nodes.map((n) => this.visit(n).join())); + return result; + } + public visitDistinct(distinctNode: DistinctNode): string[] { + // Nothing to do here since it's handled in the SELECT clause + return []; + } + public visitDistinctOn(distinctOnNode: DistinctOnNode): string[] { + return [`DISTINCT ON(${distinctOnNode.nodes.map((n) => this.visit(n).join()).join(', ')})`]; + } + public visitAlias(aliasNode: AliasNode): string[] { + const result = [this.visit(aliasNode.value) + this.aliasText + this.quote(aliasNode.alias)]; + return result; + } + public visitAlter(alterNode: AlterNode): string[] { + this.visitingAlter = true; + // don't auto-generate from clause + const table = this.queryNode!.table; + const result: string[] = ['ALTER TABLE', ...this.visit(table.toNode()), alterNode.nodes.map(this.visit.bind(this)).join(', ')]; + this.visitingAlter = false; + return result; + } + public visitCast(castNode: CastNode): string[] { + this.visitingCast = true; + const result: string[] = ['CAST(' + this.visit(castNode.value) + ' AS ' + castNode.dataType + ')']; + this.visitingCast = false; + return result; + } + public visitFrom(fromNode: FromNode): string[] { + let result = []; + if (fromNode.skipFromStatement) { + result.push(','); + } else { + result.push('FROM'); + } + for (const node of fromNode.nodes) { + result = result.concat(this.visit(node)); + } + return result; + } + public visitWhere(whereNode: WhereNode): string[] { + this.visitingWhere = true; + const result = ['WHERE', whereNode.nodes.map(this.visit.bind(this)).join(', ')]; + this.visitingWhere = false; + return result; + } + public visitOrderBy(orderByNode: OrderByNode): string[] { + const result = ['ORDER BY', orderByNode.nodes.map(this.visit.bind(this)).join(', ')]; + return result; + } + public visitOrderByValue(orderByValueNode: OrderByValueNode): string[] { + let text = this.visit(orderByValueNode.value).join(); + if (orderByValueNode.direction) { + text += ' ' + this.visit(orderByValueNode.direction).join(); + } + return [text]; + } + public visitGroupBy(groupByNode: GroupByNode): string[] { + const result = ['GROUP BY', groupByNode.nodes.map(this.visit.bind(this)).join(', ')]; + return result; + } + public visitHaving(havingNode: HavingNode): string[] { + const result = ['HAVING', havingNode.nodes.map(this.visit.bind(this)).join(' AND ')]; + return result; + } + public visitPrefixUnary(prefixUnaryNode: PrefixUnaryNode): string[] { + const text = '(' + prefixUnaryNode.operator + ' ' + this.visit(prefixUnaryNode.left) + ')'; + return [text]; + } + public visitPostfixUnary(postfixUnaryNode: PostfixUnaryNode): string[] { + const text = '(' + this.visit(postfixUnaryNode.left) + ' ' + postfixUnaryNode.operator + ')'; + return [text]; + } + public visitBinary(binaryNode: BinaryNode): string[] { + (binaryNode.left as any).property = (binaryNode.left as any).name; + (binaryNode.right as any).property = (binaryNode.right as any).name; + let text = `(${this.visit(binaryNode.left)} ${binaryNode.operator} `; + text += Array.isArray(binaryNode.right) ? `(${binaryNode.right.map((node) => this.visit(node)).join(', ')})` : this.visit(binaryNode.right).join(); + text += ')'; + return [text]; + } + public visitTernary(ternaryNode: TernaryNode): string[] { + const visitPart = (value: Node) => { + return Array.isArray(value) ? `(${value.map((node) => this.visit(node)).join(', ')})` : this.visit(value).join(); + }; + const text = `(${this.visit(ternaryNode.left)} ${ternaryNode.operator} ${visitPart(ternaryNode.middle)} ${ + ternaryNode.separator + } ${visitPart(ternaryNode.right)})`; + return [text]; + } + public visitIn(inNode: InNode): string[] { + let text = '('; + if (Array.isArray(inNode.right)) { + if (inNode.right.length) { + const params: string[] = []; + let hasNull = false; + inNode.right.forEach((node) => { + if (node.type === 'PARAMETER' && (node as ParameterNode).value() === null) { + hasNull = true; + } else { + params.push(this.visit(node).join()); + } + }); + if (params.length) { + text += `${this.visit(inNode.left)} IN (${params.join(', ')})`; + if (hasNull) { + text += ` OR ${this.visit(inNode.left)} IS NULL`; + } + } else { + // implicitely has null + text += `${this.visit(inNode.left)} IS NULL`; + } + } else { + text += '1=0'; + } + } else { + text += `${this.visit(inNode.left)} IN ${this.visit(inNode.right)}`; + } + text += ')'; + return [text]; + } + public visitNotIn(notInNode: NotInNode): string[] { + let text = '('; + if (Array.isArray(notInNode.right)) { + if (notInNode.right.length) { + const params: string[] = []; + let hasNull = false; + notInNode.right.forEach((node) => { + if (node.type === 'PARAMETER' && (node as ParameterNode).value() === null) { + hasNull = true; + } else { + params.push(this.visit(node).join()); + } + }); + if (params.length && hasNull) { + text += `NOT (${this.visit(notInNode.left)} IN (${params.join(', ')}) OR ${this.visit(notInNode.left)} IS NULL)`; + } else if (params.length) { + text += `${this.visit(notInNode.left)} NOT IN (${params.join(', ')})`; + } else { + // implicitely has null + text += `${this.visit(notInNode.left)} IS NOT NULL`; + } + } else { + text += '1=1'; + } + } else { + text += `${this.visit(notInNode.left)} NOT IN ${this.visit(notInNode.right)}`; + } + text += ')'; + return [text]; + } + public visitCase(caseNode: CaseNode): string[] { + assert(caseNode.whenList.length === caseNode.thenList.length); + let text = '(CASE'; + this.visitingCase = true; + for (let i = 0; i < caseNode.whenList.length; i++) { + text += ` WHEN ${this.visit(caseNode.whenList[i])} THEN ${this.visit(caseNode.thenList[i])}`; + } + if (caseNode.else != null) { + text += ` ELSE ${this.visit(caseNode.else)}`; + } + this.visitingCase = false; + text += ' END)'; + return [text]; + } + public visitAt(atNode: AtNode): string[] { + const text = `(${this.visit(atNode.value)})[${this.visit(atNode.index)}]`; + return [text]; + } + public visitSlice(sliceNode: SliceNode): string[] { + const text = `(${this.visit(sliceNode.value)})[${this.visit(sliceNode.start)}:${this.visit(sliceNode.end)}]`; + return [text]; + } + public visitQuery(queryNode: Query): string[] { + if (this.queryNode) { + return this.visitSubquery(queryNode, dontParenthesizeSubQuery(this.queryNode)); + } + this.queryNode = queryNode; + // need to sort the top level query nodes on visitation priority + // so select/insert/update/delete comes before from comes before where + let missingFrom = true; + let hasFrom = false; + let createView; + let isSelect = false; + const actions = []; + const targets = []; + const filters = []; + for (const node of queryNode.nodes) { + switch (node.type) { + case 'SELECT': + isSelect = true; + case 'DELETE': + actions.push(node); + break; + case 'INDEXES': + case 'INSERT': + case 'REPLACE': + case 'UPDATE': + case 'CREATE': + case 'DROP': + case 'TRUNCATE': + case 'ALTER': + actions.push(node); + missingFrom = false; + break; + case 'FROM': + (node as FromNode).skipFromStatement = hasFrom; + hasFrom = true; + missingFrom = false; + targets.push(node); + break; + case 'CREATE VIEW': + createView = node; + break; + default: + filters.push(node); + break; + } + } + if (!actions.length) { + // if no actions are given, guess it's a select + actions.push(new SelectNode().add(new TextNode('*'))); + isSelect = true; + } + if (missingFrom && queryNode.table instanceof Table) { + // the instanceof handles the situation where a sql.select(some expression) is used and there should be no FROM clause + targets.push(new FromNode().add(queryNode.table)); + } + if (createView) { + if (isSelect) { + actions.unshift(createView); + } else { + throw new Error('Create View requires a Select.'); + } + } + return this.visitQueryHelper(actions, targets, filters); + } + /** + * We separate out this part of query building so it can be overridden by other implementations. + * + * @param {Node[]} actions + * @param {Node[]} targets + * @param {Node[]} filters + * @returns {String[]} + */ + public visitQueryHelper(actions: Node[], targets: Node[], filters: Node[]): string[] { + this.handleDistinct(actions, filters); + // lazy-man sorting + const sortedNodes = actions.concat(targets).concat(filters); + for (const node of sortedNodes) { + const res = this.visit(node); + this.output = this.output.concat(res); + } + // implicit 'from' + return this.output; + } + public visitSubquery(queryNode: Query, dontParenthesize?: boolean): string[] { + // create another query builder of the current class to build the subquery + const subQuery = this.createSubInstance(); + // let the subquery modify this instance's params array + subQuery.params = this.params; + // pass on the disable parameter placeholder flag + const previousFlagStatus = subQuery.disableParameterPlaceholders; + subQuery.disableParameterPlaceholders = this.disableParameterPlaceholders; + try { + subQuery.visitQuery(queryNode); + } finally { + // restore the flag + subQuery.disableParameterPlaceholders = previousFlagStatus; + } + const alias = queryNode.alias; + if (dontParenthesize) { + return [subQuery.output.join(' ') + (alias ? ' ' + this.quote(alias) : '')]; + } + return ['(' + subQuery.output.join(' ') + ')' + (alias ? ' ' + this.quote(alias) : '')]; + } + public visitTable(tableNode: TableNode): string[] { + const table = tableNode.table; + let txt = ''; + if (table.getSchema()) { + txt = this.quote(table.getSchema()!); + txt += '.'; + } + txt += this.quote(table.getName()); + if (typeof table.alias === 'string') { + txt += this.aliasText + this.quote(table.alias); + } + return [txt]; + } + public visitColumn(columnNode: ColumnNode): string[] { + const table = columnNode.table; + const inInsertUpdateClause = this.visitedInsert || this.visitedReplace || this.visitingUpdateTargetColumn; + const inDdlClause = this.visitingAddColumn || this.visitingAlter || this.visitingCreate; + const inSelectClause = + this.visitingReturning || + (!this.selectOrDeleteEndIndex && + !this.visitingWhere && + !inInsertUpdateClause && + !inDdlClause && + !this.visitingCase && + !this.visitingJoin); + const inFunctionCall = this.visitingFunctionCall; + const inCast = this.visitingCast; + const txt = []; + let closeParen = 0; + if (inSelectClause && ((table && !table.alias) || !!columnNode.alias)) { + if (columnNode.asArray) { + closeParen++; + txt.push(`${this.arrayAggFunctionName}(`); + } + if (!!columnNode.aggregator) { + closeParen++; + txt.push(`${columnNode.aggregator}(`); + } + if (columnNode.isDistinct === true) { + closeParen++; + txt.push('DISTINCT('); + } + } + if ( + !inInsertUpdateClause && + !this.visitingReturning && + !this.visitingCreate && + !this.visitingAlter && + !columnNode.subfieldContainer + ) { + if (table) { + if (typeof table.alias === 'string') { + txt.push(this.quote(table.alias)); + } else { + if (table.getSchema()) { + txt.push(this.quote(table.getSchema()!)); + txt.push('.'); + } + txt.push(this.quote(table.getName())); + } + txt.push('.'); + } + } + if (columnNode.star) { + const allCols = []; + let hasAliases = false; + if (columnNode.aggregator !== 'COUNT') { + const tableName = txt.join(''); + for (const col of table!.columns) { + const aliased = col.name !== (col.alias || col.property!); + hasAliases = hasAliases || aliased; + allCols.push( + tableName + this.quote(col.name) + (aliased ? this.aliasText + this.quote(col.alias || col.property!) : '') + ); + } + } + if (hasAliases) { + txt.length = 0; + txt.push(allCols.join(', ')); + } else { + txt.push('*'); + } + } else if (columnNode.isConstant) { + // this injects directly into SELECT statement rather than creating a parameter + // txt.push(this._getParameterValue(columnNode.literalValue)) + // currently thinking it is better to generate a parameter + const value = columnNode.constantValue; + this.params.push(value); + txt.push(this._getParameterText(this.params.length, value)); + } else { + if (columnNode.subfieldContainer) { + txt.push('(' + this.visitColumn(columnNode.subfieldContainer.toNode()) + ').'); + } + txt.push(this.quote(columnNode.name)); + } + if (closeParen) { + for (let j = 0; j < closeParen; j++) { + txt.push(')'); + } + } + if (inSelectClause && !inFunctionCall && !inCast && (columnNode.alias || columnNode.property !== columnNode.name)) { + txt.push(this.aliasText + this.quote(columnNode.alias || columnNode.property)); + } + if (this.visitingCreate || this.visitingAddColumn) { + assert( + columnNode.dataType, + `dataType missing for column ${columnNode.name} (CREATE TABLE and ADD COLUMN statements require a dataType)` + ); + txt.push(` ${columnNode.dataType}`); + if (this.visitingCreate) { + if (columnNode.primaryKey && !this.visitCreateCompoundPrimaryKey) { + // creating a column as a primary key + txt.push(' PRIMARY KEY'); + } else if (columnNode.notNull) { + txt.push(' NOT NULL'); + } + if (!columnNode.primaryKey && columnNode.unique) { + txt.push(' UNIQUE'); + } + if (columnNode.defaultValue !== undefined) { + txt.push(` DEFAULT ${this._getParameterValue(columnNode.defaultValue)}`); + } + } + if (!!columnNode.references) { + assert.strictEqual( + typeof columnNode.references, + 'object', + 'references is not a object for column ' + + columnNode.name + + ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + + ' require refrences to be expressed as an object)' + ); + // Empty refrence objects are ok + if (Object.keys(columnNode.references).length > 0) { + const references = columnNode.references! as Exclude, string>; + assert( + references.table, + 'reference.table missing for column ' + + columnNode.name + + ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + + ' require a table and column)' + ); + assert( + references.column, + 'reference.column missing for column ' + + columnNode.name + + ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + + ' require a table and column)' + ); + txt.push(' REFERENCES '); + // TODO: if this is used need to put back in + // if (references.schema) { + // txt.push(this.quote(references.schema) + '.'); + // } + txt.push(this.quote(references.table!) + '(' + this.quote(references.column!) + ')'); + let onDelete: string | undefined = references.onDelete; + if (onDelete) { + onDelete = onDelete.toUpperCase(); + } + if ( + onDelete === 'CASCADE' || + onDelete === 'RESTRICT' || + onDelete === 'SET NULL' || + onDelete === 'SET DEFAULT' || + onDelete === 'NO ACTION' + ) { + txt.push(` ON DELETE ${onDelete}`); + } + let onUpdate: string | undefined = references.onUpdate; + if (onUpdate) { + onUpdate = onUpdate.toUpperCase(); + } + if ( + onUpdate === 'CASCADE' || + onUpdate === 'RESTRICT' || + onUpdate === 'SET NULL' || + onUpdate === 'SET DEFAULT' || + onUpdate === 'NO ACTION' + ) { + txt.push(` ON UPDATE ${onUpdate}`); + } + const constraint: string | undefined = references.constraint; + if (constraint) { + txt.push(` ${constraint.toUpperCase()}`); + } + } + } + } + return [txt.join('')]; + } + public visitForeignKey(foreignKeyNode: ForeignKeyNode): string[] { + const txt = []; + if (this.visitingCreate) { + assert(foreignKeyNode.table, 'Foreign table missing for table reference'); + assert(foreignKeyNode.columns, 'Columns missing for table reference'); + if (foreignKeyNode.refColumns !== undefined) { + assert.strictEqual( + foreignKeyNode.columns.length, + foreignKeyNode.refColumns.length, + 'Number of local columns and foreign columns differ in table reference' + ); + } + if (foreignKeyNode.name !== undefined) { + txt.push('CONSTRAINT ' + this.quote(foreignKeyNode.name) + ' '); + } + txt.push('FOREIGN KEY ( '); + for (let i = 0; i < foreignKeyNode.columns.length; i++) { + if (i > 0) { + txt.push(', '); + } + txt.push(this.quote(foreignKeyNode.columns[i])); + } + txt.push(' ) REFERENCES '); + if (foreignKeyNode.schema !== undefined) { + txt.push(this.quote(foreignKeyNode.schema) + '.'); + } + txt.push(this.quote(foreignKeyNode.table)); + if (foreignKeyNode.refColumns !== undefined) { + txt.push(' ( '); + for (let i = 0; i < foreignKeyNode.refColumns.length; i++) { + if (i > 0) { + txt.push(', '); + } + txt.push(this.quote(foreignKeyNode.refColumns[i])); + } + txt.push(' )'); + } + let onDelete = foreignKeyNode.onDelete; + if (onDelete) { + onDelete = onDelete.toUpperCase(); + if ( + onDelete === 'CASCADE' || + onDelete === 'RESTRICT' || + onDelete === 'SET NULL' || + onDelete === 'SET DEFAULT' || + onDelete === 'NO ACTION' + ) { + txt.push(` ON DELETE ${onDelete}`); + } + } + let onUpdate = foreignKeyNode.onUpdate; + if (onUpdate) { + onUpdate = onUpdate.toUpperCase(); + if ( + onUpdate === 'CASCADE' || + onUpdate === 'RESTRICT' || + onUpdate === 'SET NULL' || + onUpdate === 'SET DEFAULT' || + onUpdate === 'NO ACTION' + ) { + txt.push(` ON UPDATE ${onUpdate}`); + } + } + if (foreignKeyNode.constraint) { + txt.push(` ${foreignKeyNode.constraint.toUpperCase()}`); + } + } + return [txt.join('')]; + } + public visitFunctionCall(functionCallNode: FunctionCallNode): string[] { + this.visitingFunctionCall = true; + const extract = () => { + const nodes = functionCallNode.nodes.map(this.visit.bind(this)); + if (nodes.length !== 1) { + throw new Error(`Not enough parameters passed to ${functionCallNode.name} function`); + } + return `EXTRACT(${functionCallNode.name} FROM ${nodes[0] + ''})`; + }; + let txt = ''; + // Override date functions since postgres (and others) uses extract + if (['YEAR', 'MONTH', 'DAY', 'HOUR'].indexOf(functionCallNode.name) >= 0) { + txt = extract(); + } + // Override CURRENT_TIMESTAMP function to remove parens + else if ('CURRENT_TIMESTAMP' === functionCallNode.name) { + txt = functionCallNode.name; + } else { + txt = `${functionCallNode.name}(${functionCallNode.nodes.map(this.visit.bind(this)).join(', ')})`; + } + this.visitingFunctionCall = false; + return [txt]; + } + public visitArrayCall(arrayCallNode: ArrayCallNode): string[] { + const txt = `ARRAY[${arrayCallNode.nodes.map(this.visit.bind(this)).join(', ')}]`; + return [txt]; + } + public visitRowCall(rowCallNode: RowCallNode): string[] { + const txt = `(${rowCallNode.nodes.map(this.visit.bind(this)).join(', ')})`; + return [txt]; + } + public visitParameter(parameterNode: ParameterNode): string[] { + // save the value into the parameters array + const value = parameterNode.value(); + this.params.push(value); + return parameterNode.isExplicit ? [] : [this._getParameterText(this.params.length, value)]; + } + public visitDefault(defaultNode: DefaultNode): string[] { + /* jshint unused: false */ + return ['DEFAULT']; + } + public visitAddColumn(addColumnNode: AddColumnNode): string[] { + this.visitingAddColumn = true; + const result = [`ADD COLUMN ${this.visit(addColumnNode.nodes[0])}`]; + this.visitingAddColumn = false; + return result; + } + public visitDropColumn(dropColumnNode: DropColumnNode): string[] { + return [`DROP COLUMN ${this.visit(dropColumnNode.nodes[0])}`]; + } + public visitRenameColumn(renameColumnNode: RenameColumnNode): string[] { + return [`RENAME COLUMN ${this.visit(renameColumnNode.nodes[0])} TO ${this.visit(renameColumnNode.nodes[1])}`]; + } + public visitRename(renameNode: RenameNode): string[] { + return [`RENAME TO ${this.visit(renameNode.nodes[0])}`]; + } + public visitIfExists(ifExistsNode: IfExistsNode): string[] { + return ['IF EXISTS']; + } + public visitIfNotExists(ifNotExistsNode: IfNotExistsNode): string[] { + return ['IF NOT EXISTS']; + } + public visitOrIgnore(orIgnoreNode: OrIgnoreNode): string[] { + throw new Error('PostgreSQL does not allow orIgnore clause.'); + } + public visitCascade(cascadeNode: CascadeNode): string[] { + return ['CASCADE']; + } + public visitRestrict(restrictNode: RestrictNode): string[] { + return ['RESTRICT']; + } + public visitForUpdate(forUpdateNode: ForUpdateNode): string[] { + return ['FOR UPDATE']; + } + public visitForShare(forShareNode: ForShareNode): string[] { + return ['FOR SHARE']; + } + public visitJoin(joinNode: JoinNode): string[] { + this.visitingJoin = true; + return [...this.visit(joinNode.from), `${joinNode.subType} JOIN`, ...this.visit(joinNode.to), 'ON', ...this.visit(joinNode.onNode)]; + } + public visitLiteral(literalNode: LiteralNode): string[] { + const txt = [literalNode.literal]; + if (literalNode.alias) { + txt.push(this.aliasText + this.quote(literalNode.alias)); + } + return [txt.join('')]; + } + public visitText(textNode: TextNode): string[] { + return [textNode.text]; + } + public visitReturning(returningNode: ReturningNode): string[] { + this.visitingReturning = true; + const r = ['RETURNING', returningNode.nodes.map(this.visit.bind(this)).join(', ')]; + this.visitingReturning = false; + return r; + } + public visitOnDuplicate(onDuplicateNode: OnDuplicateNode): string[] { + throw new Error('PostgreSQL does not allow onDuplicate clause.'); + } + public visitOnConflict(onConflictNode: OnConflictNode): string[] { + const result = ['ON CONFLICT']; + const columns = []; + const updateClause = []; + let i; + let col; + const table = this.queryNode!.table; + if (onConflictNode.constraint) { + result.push(['ON CONSTRAINT', this.quote(onConflictNode.constraint)].join(' ')); + } else if (onConflictNode.columns) { + for (i = 0; i < onConflictNode.columns.length; i++) { + columns.push(this.quote(table.getColumn(onConflictNode.columns[i])!.name)); + } + result.push('(' + columns.join(', ') + ')'); + } + if (onConflictNode.update) { + updateClause.push('DO UPDATE SET'); + const update = onConflictNode.update; + const setClause = []; + for (i = 0; i < update.length; i++) { + col = this.quote(table.getColumn(update[i])!.name); + setClause.push(col + ' = EXCLUDED.' + col); + } + updateClause.push(setClause.join(', ')); + } else { + updateClause.push('DO NOTHING'); + } + result.push(updateClause.join(' ')); + return result; + } + public visitModifier(modifierNode: ModifierNode): string[] { + return [modifierNode.type, ...this.visit(modifierNode.count)]; + } + public visitIndexes(indexesNode: IndexesNode): string[] { + /* jshint unused: false */ + const tableName = this.queryNode!.table.getName(); + const schemaName = this.queryNode!.table.getSchema() || 'public'; + return [ + 'SELECT relname', + 'FROM pg_class', + 'WHERE oid IN (', + 'SELECT indexrelid', + `FROM pg_index, pg_class WHERE pg_class.relname='${tableName}'`, + `AND pg_class.relnamespace IN (SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = '${schemaName}')`, + 'AND pg_class.oid=pg_index.indrelid)' + ]; + } + + protected notEmpty(t: T | undefined): t is T { + return t !== undefined + } + + protected _visitCreateIndex(createIndexNode: CreateIndexNode) { + if (!createIndexNode.options.columns || createIndexNode.options.columns.length === 0) { + throw new Error('No columns defined!'); + } + const tableName = this.visit(createIndexNode.table.toNode()); + const ifNotExists = createIndexNode.options?.ifNotExists ? this.visitIfNotExistsIndex() : []; + const indexType = createIndexNode.options?.type?.toUpperCase(); + const indexName = this.quote(createIndexNode.indexName()); + const algorithm = createIndexNode.options.algorithm ? 'USING ' + createIndexNode.options.algorithm.toUpperCase() : undefined; + const columns = '(' + createIndexNode.options.columns.reduce((res, col) => { + const column = col.name ? col.name : col.value.name; + const direction = col instanceof OrderByValueNode ? ` ${col.direction!.text}` : ''; + return res.concat(this.quote(column) + direction); + }, []) + ')'; + const parser = createIndexNode.options.parser ? 'WITH PARSER ' + createIndexNode.options.parser : undefined; + + return { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser }; + } + + public visitCreateIndex(createIndexNode: CreateIndexNode): string[] { + const { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser } = this._visitCreateIndex(createIndexNode); + + return [ + 'CREATE', + indexType, + 'INDEX', + ...ifNotExists, + indexName, + 'ON', + ...tableName, + algorithm, + columns, + parser + ].filter(this.notEmpty); + } + public visitIfNotExistsIndex(): string[] { + return ['IF NOT EXISTS'] + } + public visitDropIndex(dropIndexNode: DropIndexNode): string[] { + const ifExists = dropIndexNode.options.ifExists ? this.visitIfExistsIndex() : [] + return [ + 'DROP INDEX', + ...ifExists, + this.quote(dropIndexNode.table.getSchema() || 'public') + '.' + this.quote(dropIndexNode.options.indexName), + ] + } + public visitIfExistsIndex(): string[] { + return ['IF EXISTS'] + } + public visitCreateView(createViewNode: CreateViewNode): string[] { + const result = ['CREATE VIEW', this.quote(createViewNode.options.viewName), 'AS']; + return result; + } + public visitInterval(intervalNode: IntervalNode): string[] { + let parameter = ''; + const add = (n: number, unit: string) => { + if (!isNumber(n)) { + return; + } + if (parameter !== '') { + parameter += ' '; + } + parameter += `${n} ${unit}`; + }; + add(intervalNode.years, 'YEAR'); + add(intervalNode.months, 'MONTH'); + add(intervalNode.days, 'DAY'); + add(intervalNode.hours, 'HOUR'); + add(intervalNode.minutes, 'MINUTE'); + add(intervalNode.seconds, 'SECOND'); + if (parameter === '') { + parameter = '0 SECOND'; + } + return [`INTERVAL '${parameter}'`]; + } + /** + * Broken out as a separate function so that dialects that derive from this class can still use this functionality. + * + * @param {Node[]} list + * @param {String} type + * @returns {Object|undefined} {index:number, node:Node} + */ + public findNode(list: Node[], type: string) { + for (let i = 0, len = list.length; i < len; i++) { + const n = list[i]; + if (n.type === type) { + return { index: i, node: n }; + } + } + return undefined; + } + /** + * pulls the DISTINCT node out of the filters and flags the SELECT node that it should be distinct. + * Broken out as a separate function so that dialects that derive from this class can still use this functionality. + */ + public handleDistinct(actions: Node[], filters: Node[]) { + const distinctNode = this.findNode(filters, 'DISTINCT'); + // if (!distinctNode) distinctNode = _findNode(targets,"DISTINCT"); + // if (!distinctNode) distinctNode = _findNode(actions,"DISTINCT"); + if (!distinctNode) { + return; + } + const selectInfo = this.findNode(actions, 'SELECT'); + if (!selectInfo) { + return; + } // there should be one by now, I think + // mark the SELECT node that it's distinct + (selectInfo.node as SelectNode).isDistinct = true; + } +} + +/** + * If the parent of the subquery is an INSERT we don't want to parenthesize. + * This happens when you create the query like so: + * + * const query=post.insert(post.id) + * const select=user.select(user.id) + * query.add(select) + * + * @param parentQuery + * @returns {boolean} + */ +const dontParenthesizeSubQuery = (parentQuery: Query) => { + if (!parentQuery) { + return false; + } + if (parentQuery.nodes.length === 0) { + return false; + } + if (['INSERT', 'REPLACE'].indexOf(parentQuery.nodes[0].type) === -1) { + return false; } - public abstract getQuery(queryNode: Query | Table): { text: string, values: string[] }; - public abstract getString(queryNode: Query): string; + return true; } diff --git a/lib/dialect/index.ts b/lib/dialect/index.ts deleted file mode 100644 index 9c4e3674..00000000 --- a/lib/dialect/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -import { Dialect } from './dialect'; - -// given a dialect name, return the class -export const getDialect = (dialect: string): Dialect => { - switch (dialect.toLowerCase()) { - case 'postgres': - return require('./postgres').Postgres; - case 'mysql': - return require('./mysql').Mysql; - case 'sqlite': - return require('./sqlite').Sqlite; - case 'mssql': - return require('./mssql').Mssql; - case 'oracle': - return require('./oracle').Oracle; - default: - throw new Error(dialect + ' is unsupported'); - } -}; - -// default dialect is postgres -export const DEFAULT_DIALECT = 'postgres'; diff --git a/lib/dialect/mapper.ts b/lib/dialect/mapper.ts new file mode 100644 index 00000000..30a09d8e --- /dev/null +++ b/lib/dialect/mapper.ts @@ -0,0 +1,20 @@ +import type { Dialect } from './dialect.js'; + +const dialects = new Map Dialect>(); + +export const registerDialect = (dialect: string, ctor: new (...args: any[]) => Dialect) => { + dialects.set(dialect, ctor); +} + +// given a dialect name, return the class +export const getDialect = (dialect: string): new (...args: any[]) => Dialect => { + const foundDialect = dialects.get(dialect.toLowerCase()); + if (foundDialect == null) { + throw new Error(dialect + ' is unsupported'); + } else { + return foundDialect; + } +}; + +// default dialect is postgres +export const DEFAULT_DIALECT = 'postgres'; \ No newline at end of file diff --git a/lib/dialect/mssql.ts b/lib/dialect/mssql.ts index f1ed2f95..f6c5be31 100644 --- a/lib/dialect/mssql.ts +++ b/lib/dialect/mssql.ts @@ -1,30 +1,26 @@ // TODO: visitCreate needs to support schemas // TODO: visitDrop needs to support schemas -'use strict'; - import assert from 'assert'; -import { - AlterNode, - BinaryNode, - CaseNode, - ColumnNode, - CreateIndexNode, - CreateNode, - DropNode, - FunctionCallNode, - ModifierNode, - Node, - OnConflictNode, - OnDuplicateNode, - OrderByNode, - ParameterNode, - ReplaceNode, - ReturningNode, - SelectNode -} from '../node'; -import { Postgres } from './postgres'; +import { AlterNode } from '../node/alter.js'; +import { BinaryNode } from '../node/binary.js'; +import { CaseNode } from '../node/case.js'; +import { ColumnNode } from '../node/column.js'; +import { CreateNode } from '../node/create.js'; +import { CreateIndexNode } from '../node/createIndex.js'; +import { DropNode } from '../node/drop.js'; +import { FunctionCallNode } from '../node/functionCall.js'; +import { ModifierNode } from '../node/modifier.js'; +import { Node } from '../node/node.js'; +import { OnConflictNode } from '../node/onConflict.js'; +import { OnDuplicateNode } from '../node/onDuplicate.js'; +import { OrderByNode } from '../node/orderBy.js'; +import { ParameterNode } from '../node/parameter.js'; +import { ReplaceNode } from '../node/replace.js'; +import { ReturningNode } from '../node/returning.js'; +import { SelectNode } from '../node/select.js'; +import { Dialect } from './dialect.js'; /** * Config can contain: @@ -34,13 +30,17 @@ import { Postgres } from './postgres'; * @param config * @constructor */ -export class Mssql extends Postgres { - protected myClass = Mssql; - protected quoteCharacter = '['; - protected arrayAggFunctionName = ''; +export class Mssql extends Dialect<{ questionMarkParameterPlaceholder?: boolean }> { constructor(config: { questionMarkParameterPlaceholder?: boolean }) { super(config); + this.quoteCharacter = '[' + this.arrayAggFunctionName = ''; + } + + protected createSubInstance() { + return new Mssql(this.config); } + public _getParameterPlaceholder(index: string | number, value: any): string { if (this.config.questionMarkParameterPlaceholder) { return '?'; @@ -51,10 +51,10 @@ export class Mssql extends Postgres { throw new Error('Mssql does not support REPLACE.'); } public visitBinary(binaryNode: BinaryNode): string[] { - if (binaryNode.operator === '@@') { - return [`(CONTAINS (${this.visit(binaryNode.left)}, ${this.visit(binaryNode.right)}))`]; + if (binaryNode.operator === '@@' && !Array.isArray(binaryNode.right)) { + return [`(CONTAINS (${this.visit(binaryNode.left)}, ${this.visit(binaryNode.right as Node)}))`]; } - if (!isRightSideArray(binaryNode)) { + if (!Array.isArray(binaryNode.right)) { return super.visitBinary(binaryNode); } if (binaryNode.operator === 'IN' || binaryNode.operator === 'NOT IN') { @@ -146,11 +146,7 @@ export class Mssql extends Postgres { } // dealing with a true/false value const val = (node as ParameterNode).value(); - if (val === true) { - return '1=1'; - } else { - return '0=1'; - } + return val === true ? '1=1' : '0=1'; }; assert(caseNode.whenList.length === caseNode.thenList.length); let text = '(CASE'; @@ -166,9 +162,8 @@ export class Mssql extends Postgres { return [text]; } public visitColumn(columnNode: ColumnNode): string[] { - let table; let inSelectClause: boolean = false; - table = columnNode.table; + const table = columnNode.table; inSelectClause = !this.selectOrDeleteEndIndex; const arrayAgg = () => { throw new Error('SQL Server does not support array_agg.'); @@ -434,11 +429,11 @@ export class Mssql extends Postgres { } // Node is either an OFFSET or LIMIT node -function getModifierValue(dialect: Mssql, node: ModifierNode) { +const getModifierValue = (dialect: Mssql, node: ModifierNode) => { return node.count.type ? dialect.visit(node.count) : node.count; } -function isAlterAddColumn(alterNode: AlterNode) { +const isAlterAddColumn = (alterNode: AlterNode) => { if (alterNode.nodes.length === 0) { return false; } @@ -448,7 +443,7 @@ function isAlterAddColumn(alterNode: AlterNode) { return true; } -function isAlterDropColumn(alterNode: AlterNode) { +const isAlterDropColumn = (alterNode: AlterNode) => { if (alterNode.nodes.length === 0) { return false; } @@ -458,7 +453,7 @@ function isAlterDropColumn(alterNode: AlterNode) { return true; } -function isAlterRename(alterNode: AlterNode) { +const isAlterRename = (alterNode: AlterNode) => { if (alterNode.nodes.length === 0) { return false; } @@ -468,7 +463,7 @@ function isAlterRename(alterNode: AlterNode) { return true; } -function isAlterRenameColumn(alterNode: AlterNode) { +const isAlterRenameColumn = (alterNode: AlterNode) => { if (alterNode.nodes.length === 0) { return false; } @@ -478,7 +473,7 @@ function isAlterRenameColumn(alterNode: AlterNode) { return true; } -function isCountStarExpression(columnNode: ColumnNode) { +const isCountStarExpression = (columnNode: ColumnNode) => { if (!columnNode.aggregator) { return false; } @@ -491,7 +486,7 @@ function isCountStarExpression(columnNode: ColumnNode) { return true; } -function isCreateIfNotExists(createNode: CreateNode) { +const isCreateIfNotExists = (createNode: CreateNode) => { if (createNode.nodes.length === 0) { return false; } @@ -501,11 +496,11 @@ function isCreateIfNotExists(createNode: CreateNode) { return true; } -function isCreateTemporary(createNode: CreateNode) { +const isCreateTemporary = (createNode: CreateNode) => { return createNode.options.isTemporary; } -function isDropIfExists(dropNode: DropNode) { +const isDropIfExists = (dropNode: DropNode) => { if (dropNode.nodes.length === 0) { return false; } @@ -514,8 +509,3 @@ function isDropIfExists(dropNode: DropNode) { } return true; } - -// SQL Server does not support array expressions except in the IN clause. -function isRightSideArray(binaryNode: BinaryNode) { - return Array.isArray(binaryNode.right); -} diff --git a/lib/dialect/mysql.ts b/lib/dialect/mysql.ts index c24151e2..e76dd664 100644 --- a/lib/dialect/mysql.ts +++ b/lib/dialect/mysql.ts @@ -1,44 +1,43 @@ -'use strict'; - import assert from 'assert'; -import isNumber from 'lodash/isNumber'; - -import { - BinaryNode, - ColumnNode, - CreateIndexNode, - CreateNode, - ForShareNode, - FunctionCallNode, - IndexesNode, - InsertNode, - IntervalNode, - OnConflictNode, - OnDuplicateNode, - RenameColumnNode, - ReplaceNode, - ReturningNode -} from '../node'; -import { Postgres } from './postgres'; +import isNumber from 'lodash/isNumber.js'; -export class Mysql extends Postgres { - protected myClass = Mysql; - protected quoteCharacter = '`'; - protected arrayAggFunctionName = 'GROUP_CONCAT'; +import { BinaryNode } from '../node/binary.js'; +import { ColumnNode } from '../node/column.js'; +import { CreateNode } from '../node/create.js'; +import { CreateIndexNode } from '../node/createIndex.js'; +import { ForShareNode } from '../node/forShare.js'; +import { FunctionCallNode } from '../node/functionCall.js'; +import { IndexesNode } from '../node/indexes.js'; +import { InsertNode } from '../node/insert.js'; +import { IntervalNode } from '../node/interval.js'; +import { OnConflictNode } from '../node/onConflict.js'; +import { OnDuplicateNode } from '../node/onDuplicate.js'; +import { RenameColumnNode } from '../node/renameColumn.js'; +import { ReplaceNode } from '../node/replace.js'; +import { ReturningNode } from '../node/returning.js'; +import { Dialect } from './dialect.js'; +export class Mysql extends Dialect { constructor(config: any) { super(config); + this.quoteCharacter = '`'; + this.arrayAggFunctionName = 'GROUP_CONCAT'; } + + protected createSubInstance() { + return new Mysql(this.config); + } + public _getParameterPlaceholder(index: string | number, value: any): string { return '?'; } public _getParameterValue( - value: null | boolean | number | string | any[] | Date | Buffer | object, + value: null | boolean | number | string | any[] | Date | Buffer | Record, quoteChar?: string ): string | number { return Buffer.isBuffer(value) - ? 'x' + this._getParameterValue(value.toString('hex')) - : Postgres.prototype._getParameterValue.call(this, value); + ? 'x' + this._getParameterValue(value.toString('hex'), quoteChar) + : super._getParameterValue(value, quoteChar); } public visitReplace(replaceNode: ReplaceNode): string[] { // don't use table.column for replaces @@ -143,7 +142,7 @@ export class Mysql extends Postgres { throw new Error('MySQL does not allow ifExists clause on indexes.'); } public visitBinary(binaryNode: BinaryNode): string[] { - if (binaryNode.operator === '@@') { + if (binaryNode.operator === '@@' && !Array.isArray(binaryNode.right)) { return [`(MATCH ${this.visit(binaryNode.left)} AGAINST ${this.visit(binaryNode.right)})`]; } return super.visitBinary(binaryNode); diff --git a/lib/dialect/oracle.ts b/lib/dialect/oracle.ts index 69116b80..e521c12c 100644 --- a/lib/dialect/oracle.ts +++ b/lib/dialect/oracle.ts @@ -1,44 +1,43 @@ -'use strict'; - import assert from 'assert'; -import { - AliasNode, - AlterNode, - BinaryNode, - CascadeNode, - CaseNode, - ColumnNode, - CreateIndexNode, - CreateNode, - DropIndexNode, - DropNode, - IndexesNode, - ModifierNode, - Node, - OnConflictNode, - ParameterNode, - ReplaceNode, - RestrictNode, - ReturningNode, - TableNode -} from '../node'; -import { Postgres } from './postgres'; - -export class Oracle extends Postgres { - protected myClass = Oracle; +import { AliasNode } from '../node/alias.js'; +import { AlterNode } from '../node/alter.js'; +import { BinaryNode } from '../node/binary.js'; +import { CascadeNode } from '../node/cascade.js'; +import { CaseNode } from '../node/case.js'; +import { ColumnNode } from '../node/column.js'; +import { CreateNode } from '../node/create.js'; +import { CreateIndexNode } from '../node/createIndex.js'; +import { DropNode } from '../node/drop.js'; +import { DropIndexNode } from '../node/dropIndex.js'; +import { IndexesNode } from '../node/indexes.js'; +import { ModifierNode } from '../node/modifier.js'; +import { Node } from '../node/node.js'; +import { OnConflictNode } from '../node/onConflict.js'; +import { ParameterNode } from '../node/parameter.js'; +import { ReplaceNode } from '../node/replace.js'; +import { RestrictNode } from '../node/restrict.js'; +import { ReturningNode } from '../node/returning.js'; +import { TableNode } from '../node/table.js'; +import { Dialect } from './dialect.js'; - protected aliasText = ' '; +export class Oracle extends Dialect { constructor(config: any) { super(config); + this.aliasText = ' '; + } + + protected createSubInstance() { + return new Oracle(this.config); } + public _getParameterValue( - value: null | boolean | number | string | any[] | Date | Buffer | object, + value: null | boolean | number | string | any[] | Date | Buffer | Record, quoteChar?: string ): string | number { return Buffer.isBuffer(value) ? "utl_raw.cast_to_varchar2(hextoraw('" + value.toString('hex') + "'))" - : super._getParameterValue(value); + : super._getParameterValue(value, quoteChar); } public _getParameterPlaceholder(index: string | number, value: any): string { return `:${index}`; @@ -163,13 +162,13 @@ export class Oracle extends Postgres { return createText; } public visitBinary(binaryNode: BinaryNode): string[] { - if (binaryNode.operator === '@@') { + if (binaryNode.operator === '@@' && !Array.isArray(binaryNode.right)) { let text = '(INSTR (' + this.visit(binaryNode.left) + ', '; text += this.visit(binaryNode.right); text += ') > 0)'; return [text]; } - if (!isRightSideArray(binaryNode)) { + if (!Array.isArray(binaryNode.right)) { return super.visitBinary(binaryNode); } if (binaryNode.operator === 'IN' || binaryNode.operator === 'NOT IN') { @@ -282,11 +281,7 @@ export class Oracle extends Postgres { } // dealing with a true/false value const val = (node as ParameterNode).value(); - if (val === true) { - return '1=1'; - } else { - return '0=1'; - } + return val === true ? '1=1' : '0=1'; }; assert(caseNode.whenList.length === caseNode.thenList.length); let text = '(CASE'; @@ -306,7 +301,7 @@ export class Oracle extends Postgres { } } -function isCreateIfNotExists(createNode: CreateNode) { +const isCreateIfNotExists = (createNode: CreateNode) => { if (createNode.nodes.length === 0) { return false; } @@ -316,11 +311,11 @@ function isCreateIfNotExists(createNode: CreateNode) { return true; } -function isCreateTemporary(createNode: CreateNode) { +const isCreateTemporary = (createNode: CreateNode) => { return createNode.options.isTemporary; } -function isDropIfExists(dropNode: DropNode) { +const isDropIfExists = (dropNode: DropNode) => { if (dropNode.nodes.length === 0) { return false; } @@ -330,12 +325,7 @@ function isDropIfExists(dropNode: DropNode) { return true; } -// SQL Server does not support array expressions except in the IN clause. -function isRightSideArray(binaryNode: BinaryNode) { - return Array.isArray(binaryNode.right); -} - -function isCountStarExpression(columnNode: ColumnNode) { +const isCountStarExpression = (columnNode: ColumnNode) => { if (!columnNode.aggregator) { return false; } @@ -348,7 +338,7 @@ function isCountStarExpression(columnNode: ColumnNode) { return true; } -function isAlterAddColumn(alterNode: AlterNode) { +const isAlterAddColumn = (alterNode: AlterNode) => { if (alterNode.nodes.length === 0) { return false; } @@ -358,7 +348,7 @@ function isAlterAddColumn(alterNode: AlterNode) { return true; } -function isAlterDropColumn(alterNode: AlterNode) { +const isAlterDropColumn = (alterNode: AlterNode) => { if (alterNode.nodes.length === 0) { return false; } diff --git a/lib/dialect/postgres.ts b/lib/dialect/postgres.ts index 233baaf2..9b76342c 100644 --- a/lib/dialect/postgres.ts +++ b/lib/dialect/postgres.ts @@ -1,78 +1,10 @@ -'use strict'; +import isFunction from 'lodash/isFunction.js'; +import padStart from 'lodash/padStart.js'; -import assert from 'assert'; -import isFunction from 'lodash/isFunction'; -import isNumber from 'lodash/isNumber'; -import map from 'lodash/map'; -import padStart from 'lodash/padStart'; +import { OrderByNode } from '../node/orderBy.js'; +import { Dialect } from './dialect.js'; -import { - AddColumnNode, - AliasNode, - AlterNode, - ArrayCallNode, - AtNode, - BinaryNode, - CascadeNode, - CaseNode, - CastNode, - ColumnNode, - CreateIndexNode, - CreateNode, - CreateViewNode, - DefaultNode, - DeleteNode, - DistinctNode, - DistinctOnNode, - DropColumnNode, - DropIndexNode, - DropNode, - ForeignKeyNode, - ForShareNode, - ForUpdateNode, - FromNode, - FunctionCallNode, - GroupByNode, - HavingNode, - IfExistsNode, - IfNotExistsNode, - IndexesNode, - InNode, - InsertNode, - IntervalNode, - JoinNode, - LiteralNode, - ModifierNode, - Node, - NotInNode, - OnConflictNode, - OnDuplicateNode, - OrderByNode, - OrderByValueNode, - OrIgnoreNode, - ParameterNode, - PostfixUnaryNode, - PrefixUnaryNode, - Query, - RenameColumnNode, - RenameNode, - ReplaceNode, - RestrictNode, - ReturningNode, - RowCallNode, - SelectNode, - SliceNode, - TableNode, - TernaryNode, - TextNode, - TruncateNode, - UpdateNode, - WhereNode -} from '../node'; -import { Table } from '../table'; -import { Dialect } from './dialect'; - -function dateToStringUTC(date: Date) { +const dateToStringUTC = (date: Date) => { let year = date.getUTCFullYear(); const isBCYear = year < 1; if (isBCYear) year = Math.abs(year) + 1; // negative years are 1 off their BC representation @@ -105,1190 +37,44 @@ function dateToStringUTC(date: Date) { * @param config * @constructor */ -export class Postgres extends Dialect { - protected output: string[]; - protected params: string[]; - protected queryNode?: Query; - protected myClass: typeof Postgres = Postgres; - protected arrayAggFunctionName: string = 'array_agg'; - protected aliasText: string = ' AS '; - protected quoteCharacter: string = '"'; - protected disableParameterPlaceholders: boolean = false; - protected selectOrDeleteEndIndex: number = 0; - protected visitedInsert: boolean = false; - protected visitingUpdateTargetColumn: boolean = false; - protected visitingCreate: boolean = false; - protected visitCreateCompoundPrimaryKey: boolean = false; - protected visitingAlter: boolean = false; - protected visitingCast: boolean = false; - protected visitingWhere: boolean = false; - protected visitingCase: boolean = false; - protected visitedReplace: boolean = false; - protected visitingAddColumn: boolean = false; - protected visitingReturning: boolean = false; - protected visitingJoin: boolean = false; - protected visitingFunctionCall: boolean = false; - constructor(config: any) { +export class Postgres extends Dialect<{ nullOrder?: string }> { + constructor(config: { nullOrder?: string }) { super(config); - this.output = []; - this.params = []; } - public _getParameterText(index: number, value: any): string { - if (this.disableParameterPlaceholders) { - // do not use placeholder - return this._getParameterValue(value).toString(); - } else { - // use placeholder - return this._getParameterPlaceholder(index, value); - } + + protected createSubInstance() { + return new Postgres(this.config); } + public _getParameterValue( - value: null | boolean | number | string | any[] | Date | Buffer | object, + value: null | boolean | number | string | any[] | Date | Buffer | Record, quoteChar?: string ): string | number { - // handle primitives - if (null === value) { - value = 'NULL'; - } else if ('boolean' === typeof value) { - value = value ? 'TRUE' : 'FALSE'; - } else if ('number' === typeof value) { - // number is just number - value = value; - } else if ('string' === typeof value) { - // string uses single quote by default - value = this.quote(value, quoteChar || "'"); - } else if ('object' === typeof value) { - if (Array.isArray(value)) { - if (this.myClass === Postgres) { - // naive check to see if this is an array of objects, which - // is handled differently than an array of primitives - if (value.length && 'object' === typeof value[0] && !isFunction(value[0].toISOString) && !Array.isArray(value[0])) { - value = `'${JSON.stringify(value)}'`; - } else { - // In a Postgres array, strings must be double-quoted - value = value.map((item) => this._getParameterValue(item, '"')); - value = `'{${(value as any[]).join(',')}}'`; - } - } else { - value = map(value, this._getParameterValue.bind(this)); - value = `(${(value as any[]).join(', ')})`; - } - } else if (value instanceof Date) { - // Date object's default toString format does not get parsed well - // Handle dates using custom dateToString method for postgres and toISOString for others - value = (this.myClass === Postgres) - ? this._getParameterValue(dateToStringUTC(value)) - : this._getParameterValue(value.toISOString()); - } else if (Buffer.isBuffer(value)) { - value = this._getParameterValue('\\x' + value.toString('hex')); + if ('object' === typeof value && Array.isArray(value)) { + // naive check to see if this is an array of objects, which + // is handled differently than an array of primitives + if (value.length && 'object' === typeof value[0] && !isFunction(value[0].toISOString) && !Array.isArray(value[0])) { + value = `'${JSON.stringify(value)}'`; } else { - // rich object represent with string - const strValue = value.toString(); - value = strValue === '[object Object]' ? this._getParameterValue(JSON.stringify(value)) : this._getParameterValue(strValue); - } + // In a Postgres array, strings must be double-quoted + value = value.map((item) => this._getParameterValue(item, '"')); + value = `'{${(value as any[]).join(',')}}'`; + } + } else if ('object' === typeof value && value instanceof Date) { + // Date object's default toString format does not get parsed well + // Handle dates using custom dateToString method for postgres + value = this._getParameterValue(dateToStringUTC(value), quoteChar); } else { - throw new Error(`Unable to use ${value} in query`); + value = super._getParameterValue(value, quoteChar); } // value has been converted at this point return value; } - public _getParameterPlaceholder(index: string | number, value: unknown): string { - return '$' + index; - } - public getQuery(queryNode: Query | Table): { text: string, values: string[] } { - // passed in a table, not a query - if (queryNode instanceof Table) { - queryNode = queryNode.select(queryNode.star()); - } - this.output = this.visit(queryNode); - // if is a create view, must replace paramaters with values - if (this.output.indexOf('CREATE VIEW') > -1) { - const previousFlagStatus = this.disableParameterPlaceholders; - this.disableParameterPlaceholders = true; - this.output = []; - this.output = this.visit(queryNode); - this.params = []; - this.disableParameterPlaceholders = previousFlagStatus; - } - // create the query object - const query = { text: this.output.join(' '), values: this.params }; - // reset the internal state of this builder - this.output = []; - this.params = []; - return query; - } - public getString(queryNode: Query) { - // switch off parameter placeholders - const previousFlagStatus = this.disableParameterPlaceholders; - this.disableParameterPlaceholders = true; - let query; - try { - // use the same code path for query building - query = this.getQuery(queryNode); - } finally { - // always restore the flag afterwards - this.disableParameterPlaceholders = previousFlagStatus; - } - return query.text; - } - public visit(node: Node): string[] { - switch (node.type) { - case 'QUERY': - return this.visitQuery(node as Query); - case 'SUBQUERY': - return this.visitSubquery(node as Query); - case 'SELECT': - return this.visitSelect(node as SelectNode); - case 'INSERT': - return this.visitInsert(node as InsertNode); - case 'REPLACE': - return this.visitReplace(node as ReplaceNode); - case 'UPDATE': - return this.visitUpdate(node as UpdateNode); - case 'DELETE': - return this.visitDelete(node as DeleteNode); - case 'CREATE': - return this.visitCreate(node as CreateNode); - case 'DROP': - return this.visitDrop(node as DropNode); - case 'TRUNCATE': - return this.visitTruncate(node as TruncateNode); - case 'DISTINCT': - return this.visitDistinct(node as DistinctNode); - case 'DISTINCT ON': - return this.visitDistinctOn(node as DistinctOnNode); - case 'ALIAS': - return this.visitAlias(node as AliasNode); - case 'ALTER': - return this.visitAlter(node as AlterNode); - case 'CAST': - return this.visitCast(node as CastNode); - case 'FROM': - return this.visitFrom(node as FromNode); - case 'WHERE': - return this.visitWhere(node as WhereNode); - case 'ORDER BY': - return this.visitOrderBy(node as OrderByNode); - case 'ORDER BY VALUE': - return this.visitOrderByValue(node as OrderByValueNode); - case 'GROUP BY': - return this.visitGroupBy(node as GroupByNode); - case 'HAVING': - return this.visitHaving(node as HavingNode); - case 'RETURNING': - return this.visitReturning(node as ReturningNode); - case 'ONDUPLICATE': - return this.visitOnDuplicate(node as OnDuplicateNode); - case 'ONCONFLICT': - return this.visitOnConflict(node as OnConflictNode); - case 'FOR UPDATE': - return this.visitForUpdate(node as ForUpdateNode); - case 'FOR SHARE': - return this.visitForShare(node as ForShareNode); - case 'TABLE': - return this.visitTable(node as TableNode); - case 'COLUMN': - return this.visitColumn(node as ColumnNode); - case 'FOREIGN KEY': - return this.visitForeignKey(node as ForeignKeyNode); - case 'JOIN': - return this.visitJoin(node as JoinNode); - case 'LITERAL': - return this.visitLiteral(node as LiteralNode); - case 'TEXT': - return this.visitText(node as TextNode); - case 'PARAMETER': - return this.visitParameter(node as ParameterNode); - case 'DEFAULT': - return this.visitDefault(node as DefaultNode); - case 'IF EXISTS': - return this.visitIfExists(node as IfExistsNode); - case 'IF NOT EXISTS': - return this.visitIfNotExists(node as IfNotExistsNode); - case 'OR IGNORE': - return this.visitOrIgnore(node as OrIgnoreNode); - case 'CASCADE': - return this.visitCascade(node as CascadeNode); - case 'RESTRICT': - return this.visitRestrict(node as RestrictNode); - case 'RENAME': - return this.visitRename(node as RenameNode); - case 'ADD COLUMN': - return this.visitAddColumn(node as AddColumnNode); - case 'DROP COLUMN': - return this.visitDropColumn(node as DropColumnNode); - case 'RENAME COLUMN': - return this.visitRenameColumn(node as RenameColumnNode); - case 'INDEXES': - return this.visitIndexes(node as IndexesNode); - case 'CREATE INDEX': - return this.visitCreateIndex(node as CreateIndexNode); - case 'DROP INDEX': - return this.visitDropIndex(node as DropIndexNode); - case 'FUNCTION CALL': - return this.visitFunctionCall(node as FunctionCallNode); - case 'ARRAY CALL': - return this.visitArrayCall(node as ArrayCallNode); - case 'ROW CALL': - return this.visitRowCall(node as RowCallNode); - case 'CREATE VIEW': - return this.visitCreateView(node as CreateViewNode); - case 'INTERVAL': - return this.visitInterval(node as IntervalNode); - case 'POSTFIX UNARY': - return this.visitPostfixUnary(node as PostfixUnaryNode); - case 'PREFIX UNARY': - return this.visitPrefixUnary(node as PrefixUnaryNode); - case 'BINARY': - return this.visitBinary(node as BinaryNode); - case 'TERNARY': - return this.visitTernary(node as TernaryNode); - case 'IN': - return this.visitIn(node as InNode); - case 'NOT IN': - return this.visitNotIn(node as NotInNode); - case 'CASE': - return this.visitCase(node as CaseNode); - case 'AT': - return this.visitAt(node as AtNode); - case 'SLICE': - return this.visitSlice(node as SliceNode); - case 'LIMIT': - case 'OFFSET': - return this.visitModifier(node as ModifierNode); - default: - throw new Error(`Unrecognized node type ${node.type}`); - } - } - public quote(word: string, quoteCharacter?: string) { - const q = quoteCharacter != null ? quoteCharacter : this.quoteCharacter; - // handle square brackets specially - if (q === '[') { - return '[' + word + ']'; - } else { - return q + word.replace(new RegExp(q, 'g'), q + q) + q; - } - } - public visitSelect(selectNode: SelectNode): string[] { - const result = ['SELECT']; - if (selectNode.isDistinct) { - result.push('DISTINCT'); - } - const distinctOnNode = selectNode.nodes.filter((node) => node.type === 'DISTINCT ON').shift(); - const nonDistinctOnNodes = selectNode.nodes.filter((node) => node.type !== 'DISTINCT ON'); - if (distinctOnNode) { - result.push(this.visit(distinctOnNode).join()); - } - result.push(nonDistinctOnNodes.map(this.visit.bind(this)).join(', ')); - this.selectOrDeleteEndIndex = this.output.length + result.length; - return result; - } - public visitInsert(insertNode: InsertNode): string[] { - // don't use table.column for inserts - this.visitedInsert = true; - const result = ['INSERT', ...insertNode.nodes.map((n) => this.visit(n).join())]; - result.push(`INTO ${this.visit(this.queryNode!.table.toNode()).join()}`); - result.push(`(${insertNode.columns.map(this.visit.bind(this)).join(', ')})`); - const paramNodes = insertNode.getParameters(); - if (paramNodes.length > 0) { - const paramText = paramNodes - .map((paramSet) => { - return paramSet.map((param) => this.visit(param)).join(', '); - }) - .map((param) => `(${param})`) - .join(', '); - result.push('VALUES', paramText); - if (result.slice(2, 5).join(' ') === '() VALUES ()') { - result.splice(2, 3, 'DEFAULT VALUES'); - } - } - this.visitedInsert = false; - return result; - } - public visitReplace(replaceNode: ReplaceNode): string[] { - throw new Error('Postgres does not support REPLACE.'); - } - public visitUpdate(updateNode: UpdateNode): string[] { - // don't auto-generate from clause - const params: string[] = []; - /* jshint boss: true */ - for (const node of updateNode.nodes as ColumnNode[]) { - this.visitingUpdateTargetColumn = true; - const targetCol = this.visit(node); - this.visitingUpdateTargetColumn = false; - params.push(`${targetCol} = ${this.visit(node.value)}`); - } - const result = ['UPDATE', this.visit(this.queryNode!.table.toNode()).join(), 'SET', params.join(', ')]; - return result; - } - public visitDelete(deleteNode: DeleteNode): string[] { - const result = ['DELETE']; - if (deleteNode.nodes.length) { - result.push(deleteNode.nodes.map(this.visit.bind(this)).join(', ')); - } - this.selectOrDeleteEndIndex = result.length; - return result; - } - public visitCreate(createNode: CreateNode): string[] { - this.visitingCreate = true; - // don't auto-generate from clause - const table = this.queryNode!.table; - const colNodes = table.columns.map((col) => col.toNode()); - const foreignKeyNodes = table.foreignKeys; - let result = ['CREATE TABLE']; - if (createNode.options.isTemporary) { - result = ['CREATE TEMPORARY TABLE']; - } - result = result.concat(createNode.nodes.map((n) => this.visit(n).join())); - result.push(this.visit(table.toNode()).join()); - const primaryColNodes = colNodes.filter((n) => n.primaryKey); - this.visitCreateCompoundPrimaryKey = primaryColNodes.length > 1; - let colspec = `(${colNodes.map((n) => this.visit(n).join()).join(', ')}`; - if (this.visitCreateCompoundPrimaryKey) { - colspec += `, PRIMARY KEY (${primaryColNodes.map((node) => this.quote(node.name)).join(', ')})`; - } - if (foreignKeyNodes.length > 0) { - colspec += `, ${foreignKeyNodes.map((n) => this.visit(n).join()).join(', ')}`; - } - colspec += ')'; - result.push(colspec); - this.visitCreateCompoundPrimaryKey = false; - this.visitingCreate = false; - return result; - } - public visitDrop(dropNode: DropNode): string[] { - // don't auto-generate from clause - let result = ['DROP TABLE']; - result = result.concat(dropNode.nodes.map((n) => this.visit(n).join())); - return result; - } - public visitTruncate(truncateNode: TruncateNode): string[] { - let result = ['TRUNCATE TABLE']; - result = result.concat(truncateNode.nodes.map((n) => this.visit(n).join())); - return result; - } - public visitDistinct(distinctNode: DistinctNode): string[] { - // Nothing to do here since it's handled in the SELECT clause - return []; - } - public visitDistinctOn(distinctOnNode: DistinctOnNode): string[] { - return [`DISTINCT ON(${distinctOnNode.nodes.map((n) => this.visit(n).join()).join(', ')})`]; - } - public visitAlias(aliasNode: AliasNode): string[] { - const result = [this.visit(aliasNode.value) + this.aliasText + this.quote(aliasNode.alias)]; - return result; - } - public visitAlter(alterNode: AlterNode): string[] { - this.visitingAlter = true; - // don't auto-generate from clause - const table = this.queryNode!.table; - const result: string[] = ['ALTER TABLE', ...this.visit(table.toNode()), alterNode.nodes.map(this.visit.bind(this)).join(', ')]; - this.visitingAlter = false; - return result; - } - public visitCast(castNode: CastNode): string[] { - this.visitingCast = true; - const result: string[] = ['CAST(' + this.visit(castNode.value) + ' AS ' + castNode.dataType + ')']; - this.visitingCast = false; - return result; - } - public visitFrom(fromNode: FromNode): string[] { - let result = []; - if (fromNode.skipFromStatement) { - result.push(','); - } else { - result.push('FROM'); - } - for (const node of fromNode.nodes) { - result = result.concat(this.visit(node)); - } - return result; - } - public visitWhere(whereNode: WhereNode): string[] { - this.visitingWhere = true; - const result = ['WHERE', whereNode.nodes.map(this.visit.bind(this)).join(', ')]; - this.visitingWhere = false; - return result; - } public visitOrderBy(orderByNode: OrderByNode): string[] { const result = ['ORDER BY', orderByNode.nodes.map(this.visit.bind(this)).join(', ')]; - if (this.myClass === Postgres && this.config.nullOrder) { + if (this.config.nullOrder) { result.push('NULLS ' + this.config.nullOrder.toUpperCase()); } return result; } - public visitOrderByValue(orderByValueNode: OrderByValueNode): string[] { - let text = this.visit(orderByValueNode.value).join(); - if (orderByValueNode.direction) { - text += ' ' + this.visit(orderByValueNode.direction).join(); - } - return [text]; - } - public visitGroupBy(groupByNode: GroupByNode): string[] { - const result = ['GROUP BY', groupByNode.nodes.map(this.visit.bind(this)).join(', ')]; - return result; - } - public visitHaving(havingNode: HavingNode): string[] { - const result = ['HAVING', havingNode.nodes.map(this.visit.bind(this)).join(' AND ')]; - return result; - } - public visitPrefixUnary(prefixUnaryNode: PrefixUnaryNode): string[] { - const text = '(' + prefixUnaryNode.operator + ' ' + this.visit(prefixUnaryNode.left) + ')'; - return [text]; - } - public visitPostfixUnary(postfixUnaryNode: PostfixUnaryNode): string[] { - const text = '(' + this.visit(postfixUnaryNode.left) + ' ' + postfixUnaryNode.operator + ')'; - return [text]; - } - public visitBinary(binaryNode: BinaryNode): string[] { - (binaryNode.left as any).property = (binaryNode.left as any).name; - (binaryNode.right as any).property = (binaryNode.right as any).name; - let text = `(${this.visit(binaryNode.left)} ${binaryNode.operator} `; - if (Array.isArray(binaryNode.right)) { - text += `(${binaryNode.right.map((node) => this.visit(node)).join(', ')})`; - } else { - text += this.visit(binaryNode.right).join(); - } - text += ')'; - return [text]; - } - public visitTernary(ternaryNode: TernaryNode): string[] { - const visitPart = (value: Node) => { - return Array.isArray(value) ? `(${value.map((node) => this.visit(node)).join(', ')})` : this.visit(value).join(); - }; - const text = `(${this.visit(ternaryNode.left)} ${ternaryNode.operator} ${visitPart(ternaryNode.middle)} ${ - ternaryNode.separator - } ${visitPart(ternaryNode.right)})`; - return [text]; - } - public visitIn(inNode: InNode): string[] { - let text = '('; - if (Array.isArray(inNode.right)) { - if (inNode.right.length) { - const params: string[] = []; - let hasNull = false; - inNode.right.forEach((node) => { - if (node.type === 'PARAMETER' && (node as ParameterNode).value() === null) { - hasNull = true; - } else { - params.push(this.visit(node).join()); - } - }); - if (params.length) { - text += `${this.visit(inNode.left)} IN (${params.join(', ')})`; - if (hasNull) { - text += ` OR ${this.visit(inNode.left)} IS NULL`; - } - } else { - // implicitely has null - text += `${this.visit(inNode.left)} IS NULL`; - } - } else { - text += '1=0'; - } - } else { - text += `${this.visit(inNode.left)} IN ${this.visit(inNode.right)}`; - } - text += ')'; - return [text]; - } - public visitNotIn(notInNode: NotInNode): string[] { - let text = '('; - if (Array.isArray(notInNode.right)) { - if (notInNode.right.length) { - const params: string[] = []; - let hasNull = false; - notInNode.right.forEach((node) => { - if (node.type === 'PARAMETER' && (node as ParameterNode).value() === null) { - hasNull = true; - } else { - params.push(this.visit(node).join()); - } - }); - if (params.length && hasNull) { - text += `NOT (${this.visit(notInNode.left)} IN (${params.join(', ')}) OR ${this.visit(notInNode.left)} IS NULL)`; - } else if (params.length) { - text += `${this.visit(notInNode.left)} NOT IN (${params.join(', ')})`; - } else { - // implicitely has null - text += `${this.visit(notInNode.left)} IS NOT NULL`; - } - } else { - text += '1=1'; - } - } else { - text += `${this.visit(notInNode.left)} NOT IN ${this.visit(notInNode.right)}`; - } - text += ')'; - return [text]; - } - public visitCase(caseNode: CaseNode): string[] { - assert(caseNode.whenList.length === caseNode.thenList.length); - let text = '(CASE'; - this.visitingCase = true; - for (let i = 0; i < caseNode.whenList.length; i++) { - text += ` WHEN ${this.visit(caseNode.whenList[i])} THEN ${this.visit(caseNode.thenList[i])}`; - } - if (caseNode.else != null) { - text += ` ELSE ${this.visit(caseNode.else)}`; - } - this.visitingCase = false; - text += ' END)'; - return [text]; - } - public visitAt(atNode: AtNode): string[] { - const text = `(${this.visit(atNode.value)})[${this.visit(atNode.index)}]`; - return [text]; - } - public visitSlice(sliceNode: SliceNode): string[] { - const text = `(${this.visit(sliceNode.value)})[${this.visit(sliceNode.start)}:${this.visit(sliceNode.end)}]`; - return [text]; - } - public visitQuery(queryNode: Query): string[] { - if (this.queryNode) { - return this.visitSubquery(queryNode, dontParenthesizeSubQuery(this.queryNode)); - } - this.queryNode = queryNode; - // need to sort the top level query nodes on visitation priority - // so select/insert/update/delete comes before from comes before where - let missingFrom = true; - let hasFrom = false; - let createView; - let isSelect = false; - const actions = []; - const targets = []; - const filters = []; - for (const node of queryNode.nodes) { - switch (node.type) { - case 'SELECT': - isSelect = true; - case 'DELETE': - actions.push(node); - break; - case 'INDEXES': - case 'INSERT': - case 'REPLACE': - case 'UPDATE': - case 'CREATE': - case 'DROP': - case 'TRUNCATE': - case 'ALTER': - actions.push(node); - missingFrom = false; - break; - case 'FROM': - (node as FromNode).skipFromStatement = hasFrom; - hasFrom = true; - missingFrom = false; - targets.push(node); - break; - case 'CREATE VIEW': - createView = node; - break; - default: - filters.push(node); - break; - } - } - if (!actions.length) { - // if no actions are given, guess it's a select - actions.push(new SelectNode().add('*')); - isSelect = true; - } - if (missingFrom && queryNode.table instanceof Table) { - // the instanceof handles the situation where a sql.select(some expression) is used and there should be no FROM clause - targets.push(new FromNode().add(queryNode.table)); - } - if (createView) { - if (isSelect) { - actions.unshift(createView); - } else { - throw new Error('Create View requires a Select.'); - } - } - return this.visitQueryHelper(actions, targets, filters); - } - /** - * We separate out this part of query building so it can be overridden by other implementations. - * - * @param {Node[]} actions - * @param {Node[]} targets - * @param {Node[]} filters - * @returns {String[]} - */ - public visitQueryHelper(actions: Node[], targets: Node[], filters: Node[]): string[] { - this.handleDistinct(actions, filters); - // lazy-man sorting - const sortedNodes = actions.concat(targets).concat(filters); - for (const node of sortedNodes) { - const res = this.visit(node); - this.output = this.output.concat(res); - } - // implicit 'from' - return this.output; - } - public visitSubquery(queryNode: Query, dontParenthesize?: boolean): string[] { - // create another query builder of the current class to build the subquery - const subQuery = new this.myClass(this.config); - // let the subquery modify this instance's params array - subQuery.params = this.params; - // pass on the disable parameter placeholder flag - const previousFlagStatus = subQuery.disableParameterPlaceholders; - subQuery.disableParameterPlaceholders = this.disableParameterPlaceholders; - try { - subQuery.visitQuery(queryNode); - } finally { - // restore the flag - subQuery.disableParameterPlaceholders = previousFlagStatus; - } - const alias = queryNode.alias; - if (dontParenthesize) { - return [subQuery.output.join(' ') + (alias ? ' ' + this.quote(alias) : '')]; - } - return ['(' + subQuery.output.join(' ') + ')' + (alias ? ' ' + this.quote(alias) : '')]; - } - public visitTable(tableNode: TableNode): string[] { - const table = tableNode.table; - let txt = ''; - if (table.getSchema()) { - txt = this.quote(table.getSchema()!); - txt += '.'; - } - txt += this.quote(table.getName()); - if (typeof table.alias === 'string') { - txt += this.aliasText + this.quote(table.alias); - } - return [txt]; - } - public visitColumn(columnNode: ColumnNode): string[] { - const table = columnNode.table; - const inInsertUpdateClause = this.visitedInsert || this.visitedReplace || this.visitingUpdateTargetColumn; - const inDdlClause = this.visitingAddColumn || this.visitingAlter || this.visitingCreate; - const inSelectClause = - this.visitingReturning || - (!this.selectOrDeleteEndIndex && - !this.visitingWhere && - !inInsertUpdateClause && - !inDdlClause && - !this.visitingCase && - !this.visitingJoin); - const inFunctionCall = this.visitingFunctionCall; - const inCast = this.visitingCast; - const txt = []; - let closeParen = 0; - if (inSelectClause && ((table && !table.alias) || !!columnNode.alias)) { - if (columnNode.asArray) { - closeParen++; - txt.push(`${this.arrayAggFunctionName}(`); - } - if (!!columnNode.aggregator) { - closeParen++; - txt.push(`${columnNode.aggregator}(`); - } - if (columnNode.isDistinct === true) { - closeParen++; - txt.push('DISTINCT('); - } - } - if ( - !inInsertUpdateClause && - !this.visitingReturning && - !this.visitingCreate && - !this.visitingAlter && - !columnNode.subfieldContainer - ) { - if (table) { - if (typeof table.alias === 'string') { - txt.push(this.quote(table.alias)); - } else { - if (table.getSchema()) { - txt.push(this.quote(table.getSchema()!)); - txt.push('.'); - } - txt.push(this.quote(table.getName())); - } - txt.push('.'); - } - } - if (columnNode.star) { - const allCols = []; - let hasAliases = false; - if (columnNode.aggregator !== 'COUNT') { - const tableName = txt.join(''); - for (const col of table!.columns) { - const aliased = col.name !== (col.alias || col.property!); - hasAliases = hasAliases || aliased; - allCols.push( - tableName + this.quote(col.name) + (aliased ? this.aliasText + this.quote(col.alias || col.property!) : '') - ); - } - } - if (hasAliases) { - txt.length = 0; - txt.push(allCols.join(', ')); - } else { - txt.push('*'); - } - } else if (columnNode.isConstant) { - // this injects directly into SELECT statement rather than creating a parameter - // txt.push(this._getParameterValue(columnNode.literalValue)) - // currently thinking it is better to generate a parameter - const value = columnNode.constantValue; - this.params.push(value); - txt.push(this._getParameterText(this.params.length, value)); - } else { - if (columnNode.subfieldContainer) { - txt.push('(' + this.visitColumn(columnNode.subfieldContainer.toNode()) + ').'); - } - txt.push(this.quote(columnNode.name)); - } - if (closeParen) { - for (let j = 0; j < closeParen; j++) { - txt.push(')'); - } - } - if (inSelectClause && !inFunctionCall && !inCast && (columnNode.alias || columnNode.property !== columnNode.name)) { - txt.push(this.aliasText + this.quote(columnNode.alias || columnNode.property)); - } - if (this.visitingCreate || this.visitingAddColumn) { - assert( - columnNode.dataType, - `dataType missing for column ${columnNode.name} (CREATE TABLE and ADD COLUMN statements require a dataType)` - ); - txt.push(` ${columnNode.dataType}`); - if (this.visitingCreate) { - if (columnNode.primaryKey && !this.visitCreateCompoundPrimaryKey) { - // creating a column as a primary key - txt.push(' PRIMARY KEY'); - } else if (columnNode.notNull) { - txt.push(' NOT NULL'); - } - if (!columnNode.primaryKey && columnNode.unique) { - txt.push(' UNIQUE'); - } - if (columnNode.defaultValue !== undefined) { - txt.push(` DEFAULT ${this._getParameterValue(columnNode.defaultValue)}`); - } - } - if (!!columnNode.references) { - assert.strictEqual( - typeof columnNode.references, - 'object', - 'references is not a object for column ' + - columnNode.name + - ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + - ' require refrences to be expressed as an object)' - ); - // Empty refrence objects are ok - if (Object.keys(columnNode.references).length > 0) { - const references = columnNode.references! as Exclude, string>; - assert( - references.table, - 'reference.table missing for column ' + - columnNode.name + - ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + - ' require a table and column)' - ); - assert( - references.column, - 'reference.column missing for column ' + - columnNode.name + - ' (REFERENCES statements within CREATE TABLE and ADD COLUMN statements' + - ' require a table and column)' - ); - txt.push(' REFERENCES '); - // TODO: if this is used need to put back in - // if (references.schema) { - // txt.push(this.quote(references.schema) + '.'); - // } - txt.push(this.quote(references.table!) + '(' + this.quote(references.column!) + ')'); - let onDelete: string | undefined = references.onDelete; - if (onDelete) { - onDelete = onDelete.toUpperCase(); - } - if ( - onDelete === 'CASCADE' || - onDelete === 'RESTRICT' || - onDelete === 'SET NULL' || - onDelete === 'SET DEFAULT' || - onDelete === 'NO ACTION' - ) { - txt.push(` ON DELETE ${onDelete}`); - } - let onUpdate: string | undefined = references.onUpdate; - if (onUpdate) { - onUpdate = onUpdate.toUpperCase(); - } - if ( - onUpdate === 'CASCADE' || - onUpdate === 'RESTRICT' || - onUpdate === 'SET NULL' || - onUpdate === 'SET DEFAULT' || - onUpdate === 'NO ACTION' - ) { - txt.push(` ON UPDATE ${onUpdate}`); - } - const constraint: string | undefined = references.constraint; - if (constraint) { - txt.push(` ${constraint.toUpperCase()}`); - } - } - } - } - return [txt.join('')]; - } - public visitForeignKey(foreignKeyNode: ForeignKeyNode): string[] { - const txt = []; - if (this.visitingCreate) { - assert(foreignKeyNode.table, 'Foreign table missing for table reference'); - assert(foreignKeyNode.columns, 'Columns missing for table reference'); - if (foreignKeyNode.refColumns !== undefined) { - assert.strictEqual( - foreignKeyNode.columns.length, - foreignKeyNode.refColumns.length, - 'Number of local columns and foreign columns differ in table reference' - ); - } - if (foreignKeyNode.name !== undefined) { - txt.push('CONSTRAINT ' + this.quote(foreignKeyNode.name) + ' '); - } - txt.push('FOREIGN KEY ( '); - for (let i = 0; i < foreignKeyNode.columns.length; i++) { - if (i > 0) { - txt.push(', '); - } - txt.push(this.quote(foreignKeyNode.columns[i])); - } - txt.push(' ) REFERENCES '); - if (foreignKeyNode.schema !== undefined) { - txt.push(this.quote(foreignKeyNode.schema) + '.'); - } - txt.push(this.quote(foreignKeyNode.table)); - if (foreignKeyNode.refColumns !== undefined) { - txt.push(' ( '); - for (let i = 0; i < foreignKeyNode.refColumns.length; i++) { - if (i > 0) { - txt.push(', '); - } - txt.push(this.quote(foreignKeyNode.refColumns[i])); - } - txt.push(' )'); - } - let onDelete = foreignKeyNode.onDelete; - if (onDelete) { - onDelete = onDelete.toUpperCase(); - if ( - onDelete === 'CASCADE' || - onDelete === 'RESTRICT' || - onDelete === 'SET NULL' || - onDelete === 'SET DEFAULT' || - onDelete === 'NO ACTION' - ) { - txt.push(` ON DELETE ${onDelete}`); - } - } - let onUpdate = foreignKeyNode.onUpdate; - if (onUpdate) { - onUpdate = onUpdate.toUpperCase(); - if ( - onUpdate === 'CASCADE' || - onUpdate === 'RESTRICT' || - onUpdate === 'SET NULL' || - onUpdate === 'SET DEFAULT' || - onUpdate === 'NO ACTION' - ) { - txt.push(` ON UPDATE ${onUpdate}`); - } - } - if (foreignKeyNode.constraint) { - txt.push(` ${foreignKeyNode.constraint.toUpperCase()}`); - } - } - return [txt.join('')]; - } - public visitFunctionCall(functionCallNode: FunctionCallNode): string[] { - this.visitingFunctionCall = true; - const extract = () => { - const nodes = functionCallNode.nodes.map(this.visit.bind(this)); - if (nodes.length !== 1) { - throw new Error(`Not enough parameters passed to ${functionCallNode.name} function`); - } - return `EXTRACT(${functionCallNode.name} FROM ${nodes[0] + ''})`; - }; - let txt = ''; - // Override date functions since postgres (and others) uses extract - if (['YEAR', 'MONTH', 'DAY', 'HOUR'].indexOf(functionCallNode.name) >= 0) { - txt = extract(); - } - // Override CURRENT_TIMESTAMP function to remove parens - else if ('CURRENT_TIMESTAMP' === functionCallNode.name) { - txt = functionCallNode.name; - } else { - txt = `${functionCallNode.name}(${functionCallNode.nodes.map(this.visit.bind(this)).join(', ')})`; - } - this.visitingFunctionCall = false; - return [txt]; - } - public visitArrayCall(arrayCallNode: ArrayCallNode): string[] { - const txt = `ARRAY[${arrayCallNode.nodes.map(this.visit.bind(this)).join(', ')}]`; - return [txt]; - } - public visitRowCall(rowCallNode: RowCallNode): string[] { - const txt = `(${rowCallNode.nodes.map(this.visit.bind(this)).join(', ')})`; - return [txt]; - } - public visitParameter(parameterNode: ParameterNode): string[] { - // save the value into the parameters array - const value = parameterNode.value(); - this.params.push(value); - return parameterNode.isExplicit ? [] : [this._getParameterText(this.params.length, value)]; - } - public visitDefault(defaultNode: DefaultNode): string[] { - /* jshint unused: false */ - return ['DEFAULT']; - } - public visitAddColumn(addColumnNode: AddColumnNode): string[] { - this.visitingAddColumn = true; - const result = [`ADD COLUMN ${this.visit(addColumnNode.nodes[0])}`]; - this.visitingAddColumn = false; - return result; - } - public visitDropColumn(dropColumnNode: DropColumnNode): string[] { - return [`DROP COLUMN ${this.visit(dropColumnNode.nodes[0])}`]; - } - public visitRenameColumn(renameColumnNode: RenameColumnNode): string[] { - return [`RENAME COLUMN ${this.visit(renameColumnNode.nodes[0])} TO ${this.visit(renameColumnNode.nodes[1])}`]; - } - public visitRename(renameNode: RenameNode): string[] { - return [`RENAME TO ${this.visit(renameNode.nodes[0])}`]; - } - public visitIfExists(ifExistsNode: IfExistsNode): string[] { - return ['IF EXISTS']; - } - public visitIfNotExists(ifNotExistsNode: IfNotExistsNode): string[] { - return ['IF NOT EXISTS']; - } - public visitOrIgnore(orIgnoreNode: OrIgnoreNode): string[] { - throw new Error('PostgreSQL does not allow orIgnore clause.'); - } - public visitCascade(cascadeNode: CascadeNode): string[] { - return ['CASCADE']; - } - public visitRestrict(restrictNode: RestrictNode): string[] { - return ['RESTRICT']; - } - public visitForUpdate(forUpdateNode: ForUpdateNode): string[] { - return ['FOR UPDATE']; - } - public visitForShare(forShareNode: ForShareNode): string[] { - return ['FOR SHARE']; - } - public visitJoin(joinNode: JoinNode): string[] { - this.visitingJoin = true; - return [...this.visit(joinNode.from), `${joinNode.subType} JOIN`, ...this.visit(joinNode.to), 'ON', ...this.visit(joinNode.onNode)]; - } - public visitLiteral(literalNode: LiteralNode): string[] { - const txt = [literalNode.literal]; - if (literalNode.alias) { - txt.push(this.aliasText + this.quote(literalNode.alias)); - } - return [txt.join('')]; - } - public visitText(textNode: TextNode): string[] { - return [textNode.text]; - } - public visitReturning(returningNode: ReturningNode): string[] { - this.visitingReturning = true; - const r = ['RETURNING', returningNode.nodes.map(this.visit.bind(this)).join(', ')]; - this.visitingReturning = false; - return r; - } - public visitOnDuplicate(onDuplicateNode: OnDuplicateNode): string[] { - throw new Error('PostgreSQL does not allow onDuplicate clause.'); - } - public visitOnConflict(onConflictNode: OnConflictNode): string[] { - const result = ['ON CONFLICT']; - const columns = []; - const updateClause = []; - let i; - let col; - const table = this.queryNode!.table; - if (onConflictNode.constraint) { - result.push(['ON CONSTRAINT', this.quote(onConflictNode.constraint)].join(' ')); - } else if (onConflictNode.columns) { - for (i = 0; i < onConflictNode.columns.length; i++) { - columns.push(this.quote(table.getColumn(onConflictNode.columns[i])!.name)); - } - result.push('(' + columns.join(', ') + ')'); - } - if (onConflictNode.update) { - updateClause.push('DO UPDATE SET'); - const update = onConflictNode.update; - const setClause = []; - for (i = 0; i < update.length; i++) { - col = this.quote(table.getColumn(update[i])!.name); - setClause.push(col + ' = EXCLUDED.' + col); - } - updateClause.push(setClause.join(', ')); - } else { - updateClause.push('DO NOTHING'); - } - result.push(updateClause.join(' ')); - return result; - } - public visitModifier(modifierNode: ModifierNode): string[] { - return [modifierNode.type, ...this.visit(modifierNode.count)]; - } - public visitIndexes(indexesNode: IndexesNode): string[] { - /* jshint unused: false */ - const tableName = this.queryNode!.table.getName(); - const schemaName = this.queryNode!.table.getSchema() || 'public'; - return [ - 'SELECT relname', - 'FROM pg_class', - 'WHERE oid IN (', - 'SELECT indexrelid', - `FROM pg_index, pg_class WHERE pg_class.relname='${tableName}'`, - `AND pg_class.relnamespace IN (SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = '${schemaName}')`, - 'AND pg_class.oid=pg_index.indrelid)' - ]; - } - - protected notEmpty(t: T | undefined): t is T { - return t !== undefined - } - - protected _visitCreateIndex(createIndexNode: CreateIndexNode) { - if (!createIndexNode.options.columns || createIndexNode.options.columns.length === 0) { - throw new Error('No columns defined!'); - } - const tableName = this.visit(createIndexNode.table.toNode()); - const ifNotExists = createIndexNode.options?.ifNotExists ? this.visitIfNotExistsIndex() : []; - const indexType = createIndexNode.options?.type?.toUpperCase(); - const indexName = this.quote(createIndexNode.indexName()); - const algorithm = createIndexNode.options.algorithm ? 'USING ' + createIndexNode.options.algorithm.toUpperCase() : undefined; - const columns = '(' + createIndexNode.options.columns.reduce((res, col) => { - const column = col.name ? col.name : col.value.name; - const direction = col instanceof OrderByValueNode ? ` ${col.direction!.text}` : ''; - return res.concat(this.quote(column) + direction); - }, []) + ')'; - const parser = createIndexNode.options.parser ? 'WITH PARSER ' + createIndexNode.options.parser : undefined; - - return { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser }; - } - - public visitCreateIndex(createIndexNode: CreateIndexNode): string[] { - const { indexType, ifNotExists, indexName, tableName, algorithm, columns, parser } = this._visitCreateIndex(createIndexNode); - - return [ - 'CREATE', - indexType, - 'INDEX', - ...ifNotExists, - indexName, - 'ON', - ...tableName, - algorithm, - columns, - parser - ].filter(this.notEmpty); - } - public visitIfNotExistsIndex(): string[] { - return ['IF NOT EXISTS'] - } - public visitDropIndex(dropIndexNode: DropIndexNode): string[] { - const ifExists = dropIndexNode.options.ifExists ? this.visitIfExistsIndex() : [] - return [ - 'DROP INDEX', - ...ifExists, - this.quote(dropIndexNode.table.getSchema() || 'public') + '.' + this.quote(dropIndexNode.options.indexName), - ] - } - public visitIfExistsIndex(): string[] { - return ['IF EXISTS'] - } - public visitCreateView(createViewNode: CreateViewNode): string[] { - const result = ['CREATE VIEW', this.quote(createViewNode.options.viewName), 'AS']; - return result; - } - public visitInterval(intervalNode: IntervalNode): string[] { - let parameter = ''; - const add = (n: number, unit: string) => { - if (!isNumber(n)) { - return; - } - if (parameter !== '') { - parameter += ' '; - } - parameter += `${n} ${unit}`; - }; - add(intervalNode.years, 'YEAR'); - add(intervalNode.months, 'MONTH'); - add(intervalNode.days, 'DAY'); - add(intervalNode.hours, 'HOUR'); - add(intervalNode.minutes, 'MINUTE'); - add(intervalNode.seconds, 'SECOND'); - if (parameter === '') { - parameter = '0 SECOND'; - } - return [`INTERVAL '${parameter}'`]; - } - /** - * Broken out as a separate function so that dialects that derive from this class can still use this functionality. - * - * @param {Node[]} list - * @param {String} type - * @returns {Object|undefined} {index:number, node:Node} - */ - public findNode(list: Node[], type: string) { - for (let i = 0, len = list.length; i < len; i++) { - const n = list[i]; - if (n.type === type) { - return { index: i, node: n }; - } - } - return undefined; - } - /** - * pulls the DISTINCT node out of the filters and flags the SELECT node that it should be distinct. - * Broken out as a separate function so that dialects that derive from this class can still use this functionality. - */ - public handleDistinct(actions: Node[], filters: Node[]) { - const distinctNode = this.findNode(filters, 'DISTINCT'); - // if (!distinctNode) distinctNode = _findNode(targets,"DISTINCT"); - // if (!distinctNode) distinctNode = _findNode(actions,"DISTINCT"); - if (!distinctNode) { - return; - } - const selectInfo = this.findNode(actions, 'SELECT'); - if (!selectInfo) { - return; - } // there should be one by now, I think - // mark the SELECT node that it's distinct - (selectInfo.node as SelectNode).isDistinct = true; - } -} - -/** - * If the parent of the subquery is an INSERT we don't want to parenthesize. - * This happens when you create the query like so: - * - * const query=post.insert(post.id) - * const select=user.select(user.id) - * query.add(select) - * - * @param parentQuery - * @returns {boolean} - */ -function dontParenthesizeSubQuery(parentQuery: Query) { - if (!parentQuery) { - return false; - } - if (parentQuery.nodes.length === 0) { - return false; - } - if (['INSERT', 'REPLACE'].indexOf(parentQuery.nodes[0].type) === -1) { - return false; - } - return true; } diff --git a/lib/dialect/sqlite.ts b/lib/dialect/sqlite.ts index c68ea09f..12d0bbc1 100644 --- a/lib/dialect/sqlite.ts +++ b/lib/dialect/sqlite.ts @@ -1,55 +1,50 @@ -'use strict'; - import assert from 'assert'; -import isArray from 'lodash/isArray'; - -import { - AddColumnNode, - BinaryNode, - CascadeNode, - CreateIndexNode, - DefaultNode, - DropColumnNode, - ForShareNode, - ForUpdateNode, - FunctionCallNode, - IndexesNode, - OnConflictNode, - OnDuplicateNode, - OrIgnoreNode, - RenameColumnNode, - ReplaceNode, - RestrictNode, - ReturningNode, - TruncateNode -} from '../node'; -import { Postgres } from './postgres'; +import isArray from 'lodash/isArray.js'; -export class Sqlite extends Postgres { - public config: { dateTimeMillis?: boolean }; - protected myClass = Sqlite; +import { AddColumnNode } from '../node/addColumn.js'; +import { BinaryNode } from '../node/binary.js'; +import { CascadeNode } from '../node/cascade.js'; +import { CreateIndexNode } from '../node/createIndex.js'; +import { DefaultNode } from '../node/default.js'; +import { DropColumnNode } from '../node/dropColumn.js'; +import { ForShareNode } from '../node/forShare.js'; +import { ForUpdateNode } from '../node/forUpdate.js'; +import { FunctionCallNode } from '../node/functionCall.js'; +import { IndexesNode } from '../node/indexes.js'; +import { OnConflictNode } from '../node/onConflict.js'; +import { OnDuplicateNode } from '../node/onDuplicate.js'; +import { OrIgnoreNode } from '../node/orIgnore.js'; +import { RenameColumnNode } from '../node/renameColumn.js'; +import { ReplaceNode } from '../node/replace.js'; +import { RestrictNode } from '../node/restrict.js'; +import { ReturningNode } from '../node/returning.js'; +import { TruncateNode } from '../node/truncate.js'; +import { Dialect } from './dialect.js'; - protected arrayAggFunctionName = 'GROUP_CONCAT'; - protected hasAddedAColumn: boolean; +export class Sqlite extends Dialect<{ dateTimeMillis?: boolean }> { + protected hasAddedAColumn: boolean = false; constructor(config: { dateTimeMillis?: boolean }) { super(config); this.config = config; - this.hasAddedAColumn = false; + this.arrayAggFunctionName = 'GROUP_CONCAT'; + } + protected createSubInstance() { + return new Sqlite(this.config); } public _getParameterValue( - value: null | boolean | number | string | any[] | Date | Buffer | object, + value: null | boolean | number | string | any[] | Date | Buffer | Record, quoteChar?: string ): string | number { if (Buffer.isBuffer(value)) { - value = 'x' + this._getParameterValue(value.toString('hex')); + value = 'x' + this._getParameterValue(value.toString('hex'), quoteChar); } else if (value instanceof Date && this.config.dateTimeMillis) { value = value.getTime(); } else if ('boolean' === typeof value) { value = value ? 1 : 0; } else if (isArray(value)) { - value = Postgres.prototype._getParameterValue.call(this, JSON.stringify(value)); + value = super._getParameterValue(JSON.stringify(value), quoteChar); } else { - value = Postgres.prototype._getParameterValue.call(this, value); + value = super._getParameterValue(value, quoteChar); } return value; } @@ -171,7 +166,7 @@ export class Sqlite extends Postgres { } public visitAddColumn(addColumnNode: AddColumnNode): string[] { assert(!this.hasAddedAColumn, 'SQLite can not add more that one column at a time'); - const result = Postgres.prototype.visitAddColumn.call(this, addColumnNode); + const result = super.visitAddColumn.call(this, addColumnNode); this.hasAddedAColumn = true; return result; } diff --git a/lib/functions.ts b/lib/functions.ts index 073d0d8b..714598da 100644 --- a/lib/functions.ts +++ b/lib/functions.ts @@ -1,8 +1,6 @@ -'use strict'; - -import reduce from 'lodash/reduce'; +import reduce from 'lodash/reduce.js'; import sliced from 'sliced'; -import { FunctionCallNode } from './node'; +import { FunctionCallNode } from './node/functionCall.js'; // create a function that creates a function call of the specific name, using the specified sql instance const getFunctionCallCreator = (name: string) => { diff --git a/lib/index.ts b/lib/index.ts index 4260617c..1621ba88 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,5 +1,91 @@ -export * from './node'; -export * from './dialect'; -export * from './sql'; -export * from './column'; -export * from './table'; +export * from './node/node.js'; +import './node/_internal.js'; + +export * from './node/select.js'; +export * from './node/insert.js'; +export * from './node/replace.js'; +export * from './node/update.js'; +export * from './node/delete.js'; +export * from './node/create.js'; +export * from './node/drop.js'; +export * from './node/truncate.js'; +export * from './node/distinct.js'; +export * from './node/distinctOn.js'; +export * from './node/alias.js'; +export * from './node/alter.js'; +export * from './node/cast.js'; +export * from './node/from.js'; +export * from './node/where.js'; +export * from './node/orderBy.js'; +export * from './node/orderByValue.js'; +export * from './node/groupBy.js'; +export * from './node/having.js'; +export * from './node/prefixUnary.js'; +export * from './node/postfixUnary.js'; +export * from './node/binary.js'; +export * from './node/ternary.js'; +export * from './node/in.js'; +export * from './node/notIn.js'; +export * from './node/case.js'; +export * from './node/at.js'; +export * from './node/slice.js'; +export * from './node/table.js'; +export * from './node/column.js'; +export * from './node/foreignKey.js'; +export * from './node/functionCall.js'; +export * from './node/arrayCall.js'; +export * from './node/rowCall.js'; +export * from './node/parameter.js'; +export * from './node/default.js'; +export * from './node/addColumn.js'; +export * from './node/dropColumn.js'; +export * from './node/renameColumn.js'; +export * from './node/rename.js'; +export * from './node/ifExists.js'; +export * from './node/ifNotExists.js'; +export * from './node/orIgnore.js'; +export * from './node/cascade.js'; +export * from './node/restrict.js'; +export * from './node/forUpdate.js'; +export * from './node/forShare.js'; +export * from './node/join.js'; +export * from './node/literal.js'; +export * from './node/returning.js'; +export * from './node/onDuplicate.js'; +export * from './node/onConflict.js'; +export * from './node/indexes.js'; +export * from './node/createIndex.js'; +export * from './node/dropIndex.js'; +export * from './node/createView.js'; +export * from './node/interval.js'; +export * from './node/modifier.js'; + +export * from './node/query.js'; + +export * from './dialect/mapper.js'; +export * from './sql.js'; +export * from './column.js'; +export * from './table.js'; + +import { Dialect } from './dialect/dialect.js'; +import { Mssql } from './dialect/mssql.js'; +import { Mysql } from './dialect/mysql.js'; +import { Oracle } from './dialect/oracle.js'; +import { Postgres } from './dialect/postgres.js'; +import { Sqlite } from './dialect/sqlite.js'; +import { registerDialect } from './dialect/mapper.js'; + +registerDialect('mssql', Mssql); +registerDialect('mysql', Mysql); +registerDialect('oracle', Oracle); +registerDialect('postgres', Postgres); +registerDialect('sqlite', Sqlite); + +export { + Dialect, + Mssql, + Mysql, + Oracle, + Postgres, + Sqlite +} diff --git a/lib/joiner.ts b/lib/joiner.ts index 8b775651..5570c3d7 100644 --- a/lib/joiner.ts +++ b/lib/joiner.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Table } from './table'; +import { Table } from './table.js'; const getPrimaryKeyColumn = (table: Table) => { for (const col of table.columns) { diff --git a/lib/node/_internal.ts b/lib/node/_internal.ts new file mode 100644 index 00000000..14409a79 --- /dev/null +++ b/lib/node/_internal.ts @@ -0,0 +1,11 @@ +export * from './valueExpression.js'; +export * from './at.js'; +export * from './binary.js'; +export * from './case.js'; +export * from './cast.js'; +export * from './in.js'; +export * from './notIn.js'; +export * from './orderByValue.js'; +export * from './postfixUnary.js'; +export * from './slice.js'; +export * from './ternary.js'; diff --git a/lib/node/addColumn.ts b/lib/node/addColumn.ts index 9688f0ab..46f945fe 100644 --- a/lib/node/addColumn.ts +++ b/lib/node/addColumn.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class AddColumnNode extends Node { constructor() { diff --git a/lib/node/alias.ts b/lib/node/alias.ts index 91397843..dd89e684 100644 --- a/lib/node/alias.ts +++ b/lib/node/alias.ts @@ -1,21 +1,7 @@ -'use strict'; - -import defaults from 'lodash/defaults'; -import { Node } from '.'; +import defaults from 'lodash/defaults.js'; +import { Node } from './node.js'; export class AliasNode extends Node { - - public static AliasMixin = { - as(this: Node, alias: string) { - // create an alias node - const aliasNode = new AliasNode(this, alias); - - // defaults the properties of the aliased node - defaults(aliasNode, this); - - return aliasNode; - } - }; public value: Node; public alias: string; constructor(value: Node, alias: string) { @@ -26,6 +12,14 @@ export class AliasNode extends Node { } } -export interface IAliasMixin { - as(alias: string): AliasNode; -} +export const AliasMixin = { + as(this: Node, alias: string) { + // create an alias node + const aliasNode = new AliasNode(this, alias); + + // defaults the properties of the aliased node + defaults(aliasNode, this); + + return aliasNode; + } +}; diff --git a/lib/node/alter.ts b/lib/node/alter.ts index c085b4aa..4c113b67 100644 --- a/lib/node/alter.ts +++ b/lib/node/alter.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class AlterNode extends Node { constructor() { diff --git a/lib/node/arrayCall.ts b/lib/node/arrayCall.ts index d95e671d..5de7aa05 100644 --- a/lib/node/arrayCall.ts +++ b/lib/node/arrayCall.ts @@ -1,21 +1,14 @@ -'use strict'; +import flatten from 'lodash/flatten.js'; +import { AliasMixin } from './alias.js'; +import { ParameterNode } from './parameter.js'; +import { ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import flatten from 'lodash/flatten'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, ParameterNode, valueExpressionMixin } from '.'; - -export class ArrayCallNode extends Node { +export class ArrayCallNode extends ValueExpressionNode { constructor(args: any[]) { super('ARRAY CALL'); args = flatten(args); this.addAll(args.map(ParameterNode.getNodeOrParameterNode)); } -} - -// mix in value expression -extend(ArrayCallNode.prototype, valueExpressionMixin()); -// allow aliasing -extend(ArrayCallNode.prototype, AliasNode.AliasMixin); - -export interface ArrayCallNode extends IValueExpressionMixin, IAliasMixin {} + public as = AliasMixin.as; +} diff --git a/lib/node/at.ts b/lib/node/at.ts index 76041821..af9274bd 100644 --- a/lib/node/at.ts +++ b/lib/node/at.ts @@ -1,25 +1,17 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class AtNode extends Node { +export class AtNode extends ValueExpressionNode { public value: Node; public index: Node; constructor(value: Node, index: Node) { super('AT'); this.value = value; this.index = index; - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(AtNode.prototype, valueExpressionMixin()); - } } -} -extend(AtNode.prototype, AliasNode.AliasMixin); + public as = AliasMixin.as; +} -export interface AtNode extends IValueExpressionMixin, IAliasMixin {} +classMap.set('AT', AtNode); diff --git a/lib/node/binary.ts b/lib/node/binary.ts index d6f57c8c..04ace610 100644 --- a/lib/node/binary.ts +++ b/lib/node/binary.ts @@ -1,28 +1,19 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class BinaryNode extends Node { +export class BinaryNode extends ValueExpressionNode { public left: Node; public operator: string; - public right: Node; - constructor(config: { left: Node; operator: string; right: Node }) { + public right: Node | Node[]; + constructor(config: { left: Node; operator: string; right: Node | Node[] }) { super('BINARY'); this.left = config.left; this.operator = config.operator; this.right = config.right; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(BinaryNode.prototype, valueExpressionMixin()); - } } -} -extend(BinaryNode.prototype, AliasNode.AliasMixin); + public as = AliasMixin.as; +} -export interface BinaryNode extends IValueExpressionMixin, IAliasMixin {} +classMap.set('BINARY', BinaryNode); diff --git a/lib/node/cascade.ts b/lib/node/cascade.ts index 46610baa..d8c90dcf 100644 --- a/lib/node/cascade.ts +++ b/lib/node/cascade.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class CascadeNode extends Node { constructor() { diff --git a/lib/node/case.ts b/lib/node/case.ts index b440477f..652a3122 100644 --- a/lib/node/case.ts +++ b/lib/node/case.ts @@ -1,10 +1,8 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class CaseNode extends Node { +export class CaseNode extends ValueExpressionNode { public whenList: Node[]; public thenList: Node[]; public else?: Node; @@ -13,16 +11,9 @@ export class CaseNode extends Node { this.whenList = config.whenList; this.thenList = config.thenList; this.else = config.else; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(CaseNode.prototype, valueExpressionMixin()); - } } -} -extend(CaseNode.prototype, AliasNode.AliasMixin); + public as = AliasMixin.as; +} -export interface CaseNode extends IValueExpressionMixin, IAliasMixin {} +classMap.set('CASE', CaseNode); diff --git a/lib/node/cast.ts b/lib/node/cast.ts index 43a93474..470e6038 100644 --- a/lib/node/cast.ts +++ b/lib/node/cast.ts @@ -1,25 +1,17 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class CastNode extends Node { +export class CastNode extends ValueExpressionNode { public value: Node; public dataType: string; constructor(value: Node, dataType: string) { super('CAST'); this.value = value; this.dataType = dataType; - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(CastNode.prototype, valueExpressionMixin()); - } } -} -extend(CastNode.prototype, AliasNode.AliasMixin); + public as = AliasMixin.as; +} -export interface CastNode extends IValueExpressionMixin, IAliasMixin {} +classMap.set('CAST', CastNode); diff --git a/lib/node/column.ts b/lib/node/column.ts index f2a3ac8c..b2a176dd 100644 --- a/lib/node/column.ts +++ b/lib/node/column.ts @@ -1,8 +1,6 @@ -'use strict'; - -import { Node } from '.'; -import { Column } from '../column'; -import { Table } from '../table'; +import { Column } from '../column.js'; +import { Table } from '../table.js'; +import { Node } from './node.js'; export class ColumnNode extends Node { public name: string; diff --git a/lib/node/create.ts b/lib/node/create.ts index 66f2da00..476708ba 100644 --- a/lib/node/create.ts +++ b/lib/node/create.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class CreateNode extends Node { public options: { isTemporary: boolean }; diff --git a/lib/node/createIndex.ts b/lib/node/createIndex.ts index 5820ec23..0f16f539 100644 --- a/lib/node/createIndex.ts +++ b/lib/node/createIndex.ts @@ -1,9 +1,7 @@ -'use strict'; - import sliced from 'sliced'; -import { Node } from '.'; -import { Column } from '../column'; -import { IndexCreationQuery, Table } from '../table'; +import { Column } from '../column.js'; +import { IndexCreationQuery, Table } from '../table.js'; +import { Node } from './node.js'; export class CreateIndexNode extends Node implements IndexCreationQuery { public table: Table; diff --git a/lib/node/createView.ts b/lib/node/createView.ts index 3a3ce0ab..0d946fe5 100644 --- a/lib/node/createView.ts +++ b/lib/node/createView.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class CreateViewNode extends Node { public options: { viewName: string }; diff --git a/lib/node/default.ts b/lib/node/default.ts index cd6e8f53..b9997196 100644 --- a/lib/node/default.ts +++ b/lib/node/default.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class DefaultNode extends Node { constructor() { diff --git a/lib/node/delete.ts b/lib/node/delete.ts index f8ab1a05..efaee58b 100644 --- a/lib/node/delete.ts +++ b/lib/node/delete.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class DeleteNode extends Node { constructor() { diff --git a/lib/node/distinct.ts b/lib/node/distinct.ts index fbcf7b91..a1600599 100644 --- a/lib/node/distinct.ts +++ b/lib/node/distinct.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class DistinctNode extends Node { constructor() { diff --git a/lib/node/distinctOn.ts b/lib/node/distinctOn.ts index 76200e19..2c0236c1 100644 --- a/lib/node/distinctOn.ts +++ b/lib/node/distinctOn.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class DistinctOnNode extends Node { constructor() { diff --git a/lib/node/drop.ts b/lib/node/drop.ts index 414e5f83..3772b2c4 100644 --- a/lib/node/drop.ts +++ b/lib/node/drop.ts @@ -1,7 +1,5 @@ -'use strict'; - -import { Node } from '.'; -import { Table } from '../table'; +import { Table } from '../table.js'; +import { Node } from './node.js'; export class DropNode extends Node { constructor(table: Table) { diff --git a/lib/node/dropColumn.ts b/lib/node/dropColumn.ts index 74f5cbed..ea49c548 100644 --- a/lib/node/dropColumn.ts +++ b/lib/node/dropColumn.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class DropColumnNode extends Node { constructor() { diff --git a/lib/node/dropIndex.ts b/lib/node/dropIndex.ts index 244d5bb0..c800507e 100644 --- a/lib/node/dropIndex.ts +++ b/lib/node/dropIndex.ts @@ -1,8 +1,6 @@ -'use strict'; - -import { Node } from '.'; -import { Column } from '../column'; -import { Table } from '../table'; +import { Column } from '../column.js'; +import { Table } from '../table.js'; +import { Node } from './node.js'; export class DropIndexNode extends Node { public table: Table; diff --git a/lib/node/forShare.ts b/lib/node/forShare.ts index ea4e0630..a70b254e 100644 --- a/lib/node/forShare.ts +++ b/lib/node/forShare.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class ForShareNode extends Node { constructor() { diff --git a/lib/node/forUpdate.ts b/lib/node/forUpdate.ts index 3f7fe154..b48d15b9 100644 --- a/lib/node/forUpdate.ts +++ b/lib/node/forUpdate.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class ForUpdateNode extends Node { constructor() { diff --git a/lib/node/foreignKey.ts b/lib/node/foreignKey.ts index f63a7f41..b380563e 100644 --- a/lib/node/foreignKey.ts +++ b/lib/node/foreignKey.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class ForeignKeyNode extends Node { public name?: string; diff --git a/lib/node/from.ts b/lib/node/from.ts index f16c3442..222d7d75 100644 --- a/lib/node/from.ts +++ b/lib/node/from.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class FromNode extends Node { public skipFromStatement: boolean = false; diff --git a/lib/node/functionCall.ts b/lib/node/functionCall.ts index b577e858..018ca126 100644 --- a/lib/node/functionCall.ts +++ b/lib/node/functionCall.ts @@ -1,20 +1,14 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { ParameterNode } from './parameter.js'; +import { ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, ParameterNode, valueExpressionMixin } from '.'; - -export class FunctionCallNode extends Node { +export class FunctionCallNode extends ValueExpressionNode { public name: string; constructor(name: string, args: any[]) { super('FUNCTION CALL'); this.name = name; this.addAll(args.map(ParameterNode.getNodeOrParameterNode)); } -} - -// mix in value expression -extend(FunctionCallNode.prototype, valueExpressionMixin()); -extend(FunctionCallNode.prototype, AliasNode.AliasMixin); - -export interface FunctionCallNode extends IValueExpressionMixin, IAliasMixin {} + public as = AliasMixin.as; +} diff --git a/lib/node/groupBy.ts b/lib/node/groupBy.ts index efb1eada..1800e953 100644 --- a/lib/node/groupBy.ts +++ b/lib/node/groupBy.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class GroupByNode extends Node { constructor() { diff --git a/lib/node/having.ts b/lib/node/having.ts index 73dc4195..d3663edd 100644 --- a/lib/node/having.ts +++ b/lib/node/having.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class HavingNode extends Node { constructor() { diff --git a/lib/node/ifExists.ts b/lib/node/ifExists.ts index 3c46c4bd..30266f80 100644 --- a/lib/node/ifExists.ts +++ b/lib/node/ifExists.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class IfExistsNode extends Node { constructor() { diff --git a/lib/node/ifNotExists.ts b/lib/node/ifNotExists.ts index f4970129..b576048b 100644 --- a/lib/node/ifNotExists.ts +++ b/lib/node/ifNotExists.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class IfNotExistsNode extends Node { constructor() { diff --git a/lib/node/in.ts b/lib/node/in.ts index b7af2c65..2261c2af 100644 --- a/lib/node/in.ts +++ b/lib/node/in.ts @@ -1,26 +1,17 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class InNode extends Node { +export class InNode extends ValueExpressionNode { public left: Node; - public right: Node; - constructor(config: { left: Node; right: Node }) { + public right: Node | Node[]; + constructor(config: { left: Node; right: Node | Node[] }) { super('IN'); this.left = config.left; this.right = config.right; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(InNode.prototype, valueExpressionMixin()); - } } -} -extend(InNode.prototype, AliasNode.AliasMixin); + public as = AliasMixin.as; +} -export interface InNode extends IValueExpressionMixin, IAliasMixin {} +classMap.set('IN', InNode); diff --git a/lib/node/index.ts b/lib/node/index.ts deleted file mode 100644 index 03c02d94..00000000 --- a/lib/node/index.ts +++ /dev/null @@ -1,66 +0,0 @@ -export * from './node'; - -export * from './valueExpression'; - -export * from './text'; - -export * from './select'; -export * from './insert'; -export * from './replace'; -export * from './update'; -export * from './delete'; -export * from './create'; -export * from './drop'; -export * from './truncate'; -export * from './distinct'; -export * from './distinctOn'; -export * from './alias'; -export * from './alter'; -export * from './cast'; -export * from './from'; -export * from './where'; -export * from './orderBy'; -export * from './orderByValue'; -export * from './groupBy'; -export * from './having'; -export * from './prefixUnary'; -export * from './postfixUnary'; -export * from './binary'; -export * from './ternary'; -export * from './in'; -export * from './notIn'; -export * from './case'; -export * from './at'; -export * from './slice'; -export * from './table'; -export * from './column'; -export * from './foreignKey'; -export * from './functionCall'; -export * from './arrayCall'; -export * from './rowCall'; -export * from './parameter'; -export * from './default'; -export * from './addColumn'; -export * from './dropColumn'; -export * from './renameColumn'; -export * from './rename'; -export * from './ifExists'; -export * from './ifNotExists'; -export * from './orIgnore'; -export * from './cascade'; -export * from './restrict'; -export * from './forUpdate'; -export * from './forShare'; -export * from './join'; -export * from './literal'; -export * from './returning'; -export * from './onDuplicate'; -export * from './onConflict'; -export * from './indexes'; -export * from './createIndex'; -export * from './dropIndex'; -export * from './createView'; -export * from './interval'; -export * from './modifier'; - -export * from './query'; diff --git a/lib/node/indexes.ts b/lib/node/indexes.ts index 32097d0b..4e814524 100644 --- a/lib/node/indexes.ts +++ b/lib/node/indexes.ts @@ -1,7 +1,5 @@ -'use strict'; - -import { Node } from '.'; -import { Table } from '../table'; +import { Node } from './node.js'; +import { Table } from '../table.js'; export class IndexesNode extends Node { public table: Table; diff --git a/lib/node/insert.ts b/lib/node/insert.ts index 1f557118..c7ce9ce4 100644 --- a/lib/node/insert.ts +++ b/lib/node/insert.ts @@ -1,8 +1,9 @@ -'use strict'; - -import { ColumnNode, DefaultNode, Node, ParameterNode } from '.'; -import { Column } from '../column'; -import { INodeable } from '../nodeable'; +import { Column } from '../column.js'; +import { INodeable } from '../nodeable.js'; +import { ColumnNode } from './column.js'; +import { DefaultNode } from './default.js'; +import { Node } from './node.js'; +import { ParameterNode } from './parameter.js'; export class InsertNode extends Node { public names: string[]; diff --git a/lib/node/interval.ts b/lib/node/interval.ts index 2bccb4a2..f485c1cc 100644 --- a/lib/node/interval.ts +++ b/lib/node/interval.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; interface Interval { years: number; diff --git a/lib/node/join.ts b/lib/node/join.ts index 641713ee..cab29b1d 100644 --- a/lib/node/join.ts +++ b/lib/node/join.ts @@ -1,8 +1,6 @@ -'use strict'; - -import { Node } from '.'; -import { INodeable } from '../nodeable'; -import { hasTable } from '../tableTracker'; +import { INodeable } from '../nodeable.js'; +import { hasTable } from '../tableTracker.js'; +import { Node } from './node.js'; export class JoinNode extends Node { public subType: string; diff --git a/lib/node/literal.ts b/lib/node/literal.ts index 6b9e2030..9a93beef 100644 --- a/lib/node/literal.ts +++ b/lib/node/literal.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class LiteralNode extends Node { public literal: string; diff --git a/lib/node/modifier.ts b/lib/node/modifier.ts index 0f929589..430b16e4 100644 --- a/lib/node/modifier.ts +++ b/lib/node/modifier.ts @@ -1,4 +1,6 @@ -import { Node, ParameterNode, Query } from '.'; +import { Node } from './node.js'; +import { ParameterNode } from './parameter.js'; +import { Query } from './query.js'; export class ModifierNode extends Node { public query: Query; diff --git a/lib/node/node.ts b/lib/node/node.ts index 8f8d0cf9..0cf1ed7f 100644 --- a/lib/node/node.ts +++ b/lib/node/node.ts @@ -1,11 +1,10 @@ -'use strict'; - +/* eslint-disable max-classes-per-file */ import assert from 'assert'; -import { Query, TextNode } from '.'; -import { DEFAULT_DIALECT, getDialect } from '../dialect'; -import { Dialect } from '../dialect/dialect'; -import { INodeable, instanceofINodeable } from '../nodeable'; -import { Sql } from '../sql'; +import { DEFAULT_DIALECT, getDialect } from '../dialect/mapper.js'; +import type { Dialect } from '../dialect/dialect.js'; +import { INodeable, instanceofINodeable } from '../nodeable.js'; +import type { Sql } from '../sql.js'; +import type { Query } from './query.js'; export abstract class Node implements INodeable { public sql?: Sql; @@ -18,22 +17,20 @@ export abstract class Node implements INodeable { public toNode() { return this; } - public add(node: Node | INodeable | string) { - assert(node, 'Error while trying to add a non-existant node to a query'); - let newNode; - if (typeof node === 'string') { - newNode = new TextNode(node); - } else if (instanceofINodeable(node)) { - newNode = node.toNode(); - } else { - newNode = node; + public add(node: Node | INodeable) { + assert(node, 'Error while trying to add a non-existent node to a query'); + if (!instanceofINodeable(node)) { + throw new Error('Expected Node or INodeable, got ' + typeof node); } - this.nodes.push(newNode as Node); + this.nodes.push(node.toNode()); return this; } - public unshift(node: Node | INodeable | string) { - assert(node, 'Error while trying to add a non-existant node to a query'); - this.nodes.unshift(typeof node === 'string' ? new TextNode(node) : node.toNode()); + public unshift(node: Node | INodeable) { + assert(node, 'Error while trying to add a non-existent node to a query'); + if (!instanceofINodeable(node)) { + throw new Error('Expected Node or INodeable, got ' + typeof node); + } + this.nodes.unshift(node.toNode()); return this; } public toQuery(dialect?: string) { @@ -51,7 +48,7 @@ export abstract class Node implements INodeable { const DialectClass = determineDialect(this, dialect); return initializeDialect(DialectClass, this).getString(this as unknown as Query); } - public addAll(nodes: (Node | INodeable | string)[]) { + public addAll(nodes: (Node | INodeable)[]) { for (let i = 0, len = nodes.length; i < len; i++) { this.add(nodes[i]); } @@ -62,7 +59,7 @@ export abstract class Node implements INodeable { // Before the change that introduced parallel dialects, every node could be turned // into a query. The parallel dialects change made it impossible to change some nodes // into a query because not all nodes are constructed with the sql instance. -const determineDialect = (query: any, dialect?: string): typeof Dialect & NewableFunction => { +const determineDialect = (query: any, dialect?: string): new (...args: any[]) => Dialect => { const sql = query.sql || (query.table && query.table.sql); let DialectClass; @@ -79,7 +76,7 @@ const determineDialect = (query: any, dialect?: string): typeof Dialect & Newabl return DialectClass; }; -const initializeDialect = (DialectClass: T, query: any): Dialect => { +const initializeDialect = Dialect>(DialectClass: T, query: any): Dialect => { const sql = query.sql || (query.table && query.table.sql); const config = sql ? sql.config : {}; return new DialectClass(config); diff --git a/lib/node/notIn.ts b/lib/node/notIn.ts index 8e79336a..63d3fb70 100644 --- a/lib/node/notIn.ts +++ b/lib/node/notIn.ts @@ -1,26 +1,17 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class NotInNode extends Node { +export class NotInNode extends ValueExpressionNode { public left: Node; - public right: Node; - constructor(config: { left: Node; right: Node }) { + public right: Node | Node[]; + constructor(config: { left: Node; right: Node | Node[] }) { super('NOT IN'); this.left = config.left; this.right = config.right; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(NotInNode.prototype, valueExpressionMixin()); - } } -} -extend(NotInNode.prototype, AliasNode.AliasMixin); + public as = AliasMixin.as; +} -export interface NotInNode extends IValueExpressionMixin, IAliasMixin {} +classMap.set('NOT IN', NotInNode); diff --git a/lib/node/onConflict.ts b/lib/node/onConflict.ts index b4f73479..66337115 100644 --- a/lib/node/onConflict.ts +++ b/lib/node/onConflict.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class OnConflictNode extends Node { public columns?: string[]; diff --git a/lib/node/onDuplicate.ts b/lib/node/onDuplicate.ts index 97e47abf..49a37b8e 100644 --- a/lib/node/onDuplicate.ts +++ b/lib/node/onDuplicate.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class OnDuplicateNode extends Node { constructor() { diff --git a/lib/node/orIgnore.ts b/lib/node/orIgnore.ts index f6a4c7db..1ff2a5bc 100644 --- a/lib/node/orIgnore.ts +++ b/lib/node/orIgnore.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class OrIgnoreNode extends Node { constructor() { diff --git a/lib/node/orderBy.ts b/lib/node/orderBy.ts index 9af595e0..8a6087cd 100644 --- a/lib/node/orderBy.ts +++ b/lib/node/orderBy.ts @@ -1,6 +1,5 @@ -'use strict'; - -import { ModifierNode, Node } from '.'; +import { ModifierNode } from './modifier.js'; +import { Node } from './node.js'; export class OrderByNode extends Node { public msSQLOffsetNode?: ModifierNode; diff --git a/lib/node/orderByValue.ts b/lib/node/orderByValue.ts index 0e9f4f27..df43ce93 100644 --- a/lib/node/orderByValue.ts +++ b/lib/node/orderByValue.ts @@ -1,6 +1,6 @@ -'use strict'; - -import { Node, TextNode } from '.'; +import { Node } from './node.js'; +import { TextNode } from './text.js'; +import { classMap } from './valueExpression.js'; export class OrderByValueNode extends Node { public value: Node; @@ -11,3 +11,5 @@ export class OrderByValueNode extends Node { this.direction = config.direction; } } + +classMap.set('ORDER BY VALUE', OrderByValueNode); diff --git a/lib/node/parameter.ts b/lib/node/parameter.ts index a8370810..db1cac05 100644 --- a/lib/node/parameter.ts +++ b/lib/node/parameter.ts @@ -1,18 +1,10 @@ -'use strict'; - -import { Node } from '.'; -import { INodeable, instanceofINodeable } from '../nodeable'; +import { INodeable, instanceofINodeable } from '../nodeable.js'; +import { Node } from './node.js'; export class ParameterNode extends Node { // wrap a value as a parameter node if value is not already a node public static getNodeOrParameterNode(value?: INodeable | unknown) { - if (value && instanceofINodeable(value)) { - // use toNode - return value.toNode(); - } else { - // wrap as parameter node - return new ParameterNode(value); - } + return value && instanceofINodeable(value) ? value.toNode() : new ParameterNode(value); } public isExplicit: boolean; private val: any; diff --git a/lib/node/postfixUnary.ts b/lib/node/postfixUnary.ts index efe105d4..f757e9fe 100644 --- a/lib/node/postfixUnary.ts +++ b/lib/node/postfixUnary.ts @@ -1,26 +1,17 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class PostfixUnaryNode extends Node { +export class PostfixUnaryNode extends ValueExpressionNode { public left: Node; public operator: string; constructor(config: { left: Node; operator: string }) { super('POSTFIX UNARY'); this.left = config.left; this.operator = config.operator; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(PostfixUnaryNode.prototype, valueExpressionMixin()); - } } -} -extend(PostfixUnaryNode.prototype, AliasNode.AliasMixin); + public as = AliasMixin.as; +} -export interface PostfixUnaryNode extends IValueExpressionMixin, IAliasMixin {} +classMap.set('POSTFIX UNARY', PostfixUnaryNode); diff --git a/lib/node/prefixUnary.ts b/lib/node/prefixUnary.ts index 4b263e7a..1fbeecff 100644 --- a/lib/node/prefixUnary.ts +++ b/lib/node/prefixUnary.ts @@ -1,26 +1,15 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class PrefixUnaryNode extends Node { +export class PrefixUnaryNode extends ValueExpressionNode { public left: Node; public operator: string; constructor(config: { left: Node; operator: string }) { super('PREFIX UNARY'); this.left = config.left; this.operator = config.operator; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(PrefixUnaryNode.prototype, valueExpressionMixin()); - } } -} -extend(PrefixUnaryNode.prototype, AliasNode.AliasMixin); - -export interface PrefixUnaryNode extends IValueExpressionMixin, IAliasMixin {} + public as = AliasMixin.as; +} diff --git a/lib/node/query.ts b/lib/node/query.ts index e17dd468..bbaef028 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -1,71 +1,70 @@ -'use strict'; - +/* eslint-disable no-underscore-dangle */ import assert from 'assert'; -import extend from 'lodash/extend'; import sliced from 'sliced'; -import { - AddColumnNode, - AliasNode, - AlterNode, - CascadeNode, - ColumnNode, - CreateIndexNode, - CreateNode, - CreateViewNode, - DeleteNode, - DistinctNode, - DistinctOnNode, - DropColumnNode, - DropIndexNode, - DropNode, - ForShareNode, - ForUpdateNode, - FromNode, - GroupByNode, - HavingNode, - IAliasMixin, - IfExistsNode, - IfNotExistsNode, - IndexesNode, - InsertNode, - IValueExpressionMixinBase, - JoinNode, - ModifierNode, - Node, - OnConflictNode, - OnDuplicateNode, - OrderByNode, - OrIgnoreNode, - ParameterNode, - PrefixUnaryNode, - RenameColumnNode, - RenameNode, - ReplaceNode, - RestrictNode, - ReturningNode, - SelectNode, - TableNode, - TruncateNode, - UpdateNode, - valueExpressionMixin, - WhereNode -} from '.'; -import { Column } from '../column'; -import { INodeable, instanceofINodeable, PartialNodeable } from '../nodeable'; -import { Table } from '../table'; +import { Column } from '../column.js'; +import { INodeable, instanceofINodeable, PartialNodeable } from '../nodeable.js'; +import { Table } from '../table.js'; +import { AddColumnNode } from './addColumn.js'; +import { AliasMixin } from './alias.js'; +import { AlterNode } from './alter.js'; +import { CascadeNode } from './cascade.js'; +import { ColumnNode } from './column.js'; +import { CreateNode } from './create.js'; +import { CreateIndexNode } from './createIndex.js'; +import { CreateViewNode } from './createView.js'; +import { DeleteNode } from './delete.js'; +import { DistinctNode } from './distinct.js'; +import { DistinctOnNode } from './distinctOn.js'; +import { DropNode } from './drop.js'; +import { DropColumnNode } from './dropColumn.js'; +import { DropIndexNode } from './dropIndex.js'; +import { ForShareNode } from './forShare.js'; +import { ForUpdateNode } from './forUpdate.js'; +import { FromNode } from './from.js'; +import { GroupByNode } from './groupBy.js'; +import { HavingNode } from './having.js'; +import { IfExistsNode } from './ifExists.js'; +import { IfNotExistsNode } from './ifNotExists.js'; +import { IndexesNode } from './indexes.js'; +import { InsertNode } from './insert.js'; +import { JoinNode } from './join.js'; +import { ModifierNode } from './modifier.js'; +import { Node } from './node.js'; +import { OnConflictNode } from './onConflict.js'; +import { OnDuplicateNode } from './onDuplicate.js'; +import { OrderByNode } from './orderBy.js'; +import { OrIgnoreNode } from './orIgnore.js'; +import { ParameterNode } from './parameter.js'; +import { PrefixUnaryNode } from './prefixUnary.js'; +import { RenameNode } from './rename.js'; +import { RenameColumnNode } from './renameColumn.js'; +import { ReplaceNode } from './replace.js'; +import { RestrictNode } from './restrict.js'; +import { ReturningNode } from './returning.js'; +import { SelectNode } from './select.js'; +import { TableNode } from './table.js'; +import { TextNode } from './text.js'; +import { TruncateNode } from './truncate.js'; +import { UpdateNode } from './update.js'; +import { ValueExpressionBaseNode } from './_internal.js'; +import { WhereNode } from './where.js'; // get the first element of an arguments if it is an array, else return arguments as an array const getArrayOrArgsAsArray = (args: (T | T[])[]): T[] => { const first = args[0]; - if (Array.isArray(first)) { - return first; - } else { - return sliced(args as T[]); - } + return Array.isArray(first) ? first : sliced(args as T[]); }; -export class Query extends Node { +const nodeableOrTextNode = (val: INodeable | string) => { + return instanceofINodeable(val) ? val.toNode() : new TextNode(val); +} + +// Here we are extending query from ValueExpressionBaseNode so that it's possible to write queries like +// const query=sql.select(a.select(a.x.sum()).plus(b.select(b.y.sum())) +// which generates: +// SELECT (SELECT SUM(a.x) FROM a) + (SELECT SUM(b.y) FROM b) +export class Query extends ValueExpressionBaseNode { public table: Table; public nodes: Node[] = []; public alias?: string; @@ -73,11 +72,8 @@ export class Query extends Node { private insertClause?: InsertNode; private replaceClause?: ReplaceNode; private indexesClause?: IndexesNode; - // tslint:disable-next-line:variable-name private _select?: SelectNode; - // tslint:disable-next-line:variable-name private _orderBy?: OrderByNode; - // tslint:disable-next-line:variable-name private _distinctOn?: DistinctOnNode; constructor(table: Table, isSubquery?: boolean) { @@ -89,6 +85,12 @@ export class Query extends Node { } } + // Extend the query with the aliasMixin so that it's possible to write queries like + // const query=sql.select(a.select(a.count()).as("column1")) + // which generates: + // SELECT (SELECT COUNT(*) FROM a) AS "column1" + public as = AliasMixin.as; + public select(...args: any[]): this { let select; if (this._select) { @@ -109,7 +111,7 @@ export class Query extends Node { return cur; }, []); - select.addAll(flattenedArgs); + select.addAll(flattenedArgs.map(nodeableOrTextNode)); // if this is a subquery then add reference to this column if (this.type === 'SUBQUERY') { @@ -144,7 +146,7 @@ export class Query extends Node { const sourceNodes = Array.isArray(nodes[0]) ? (nodes[0] as Table[]) : (nodes as Table[]); for (const node of sourceNodes) { - this.add(new FromNode().add(node)); + this.add(new FromNode().add(nodeableOrTextNode(node))); } return this; @@ -229,6 +231,7 @@ export class Query extends Node { } public insert(object: Column[] | Column): this; + // eslint-disable-next-line @typescript-eslint/unified-signatures public insert(object: PartialNodeable[] | PartialNodeable): this; public insert(...nodes: Column[]): this; public insert(...nodes: (Column[] | Column | PartialNodeable[] | PartialNodeable)[]): this { @@ -261,6 +264,7 @@ export class Query extends Node { } public replace(object: Column[] | Column): this; + // eslint-disable-next-line @typescript-eslint/unified-signatures public replace(object: Partial[] | Partial): this; public replace(...nodes: Column[]): this; public replace(...nodes: (Column[] | Column | Partial[] | Partial)[]): this { @@ -310,6 +314,7 @@ export class Query extends Node { return this.add(param); } + // eslint-disable-next-line @typescript-eslint/unified-signatures public delete(table: Table[] | Table | Partial): this; public delete(): this; public delete(params?: Table | Table[] | Partial): this { @@ -334,9 +339,9 @@ export class Query extends Node { public returning(...args: any[]): this { const returning = new ReturningNode(); if (args.length === 0) { - returning.add('*'); + returning.add(new TextNode('*')); } else { - returning.addAll(getArrayOrArgsAsArray(args)); + returning.addAll(getArrayOrArgsAsArray(args).map(nodeableOrTextNode)); } return this.add(returning); @@ -428,7 +433,7 @@ export class Query extends Node { return cur; }, []); - distinctOn.addAll(flattenedArgs); + distinctOn.addAll(flattenedArgs.map(nodeableOrTextNode)); return this; } @@ -559,29 +564,7 @@ export class Query extends Node { } } -// Here we are extending query with valueExpressions so that it's possible to write queries like -// const query=sql.select(a.select(a.x.sum()).plus(b.select(b.y.sum())) -// which generates: -// SELECT (SELECT SUM(a.x) FROM a) + (SELECT SUM(b.y) FROM b) -// We need to remove "or" and "and" from here because it conflicts with the already existing functionality of appending -// to the where clause like so: -// const query=a.select().where(a.name.equals("joe")).or(a.name.equals("sam")) -const valueExpressions = valueExpressionMixin(); -// @ts-ignore -delete valueExpressions.or; -// @ts-ignore -delete valueExpressions.and; -extend(Query.prototype, valueExpressions); - -// Extend the query with the aliasMixin so that it's possible to write queries like -// const query=sql.select(a.select(a.count()).as("column1")) -// which generates: -// SELECT (SELECT COUNT(*) FROM a) AS "column1" -extend(Query.prototype, AliasNode.AliasMixin); - -export interface Query extends IValueExpressionMixinBase, IAliasMixin {} - -type SubQueryExtensions = { +type SubQueryExtensions> = { join: (other: INodeable) => JoinNode; } & { columns: Column[] @@ -589,4 +572,4 @@ type SubQueryExtensions = { [P in NonNullable]: Column }; -export type SubQuery = Query & SubQueryExtensions; \ No newline at end of file +export type SubQuery> = Query & SubQueryExtensions; \ No newline at end of file diff --git a/lib/node/rename.ts b/lib/node/rename.ts index 6a14417c..0ed6f43c 100644 --- a/lib/node/rename.ts +++ b/lib/node/rename.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class RenameNode extends Node { constructor() { diff --git a/lib/node/renameColumn.ts b/lib/node/renameColumn.ts index c1bb6b25..0040e8c1 100644 --- a/lib/node/renameColumn.ts +++ b/lib/node/renameColumn.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class RenameColumnNode extends Node { constructor() { diff --git a/lib/node/replace.ts b/lib/node/replace.ts index 85a7fcce..a740bfd9 100644 --- a/lib/node/replace.ts +++ b/lib/node/replace.ts @@ -1,8 +1,9 @@ -'use strict'; - -import { ColumnNode, DefaultNode, Node, ParameterNode } from '.'; -import { Column } from '../column'; -import { INodeable } from '../nodeable'; +import { Column } from '../column.js'; +import { INodeable } from '../nodeable.js'; +import { ColumnNode } from './column.js'; +import { DefaultNode } from './default.js'; +import { Node } from './node.js'; +import { ParameterNode } from './parameter.js'; export class ReplaceNode extends Node { public columns: ColumnNode[]; diff --git a/lib/node/restrict.ts b/lib/node/restrict.ts index 56589d24..5ac7bc52 100644 --- a/lib/node/restrict.ts +++ b/lib/node/restrict.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class RestrictNode extends Node { constructor() { diff --git a/lib/node/returning.ts b/lib/node/returning.ts index 4e27e2fa..9d61edf7 100644 --- a/lib/node/returning.ts +++ b/lib/node/returning.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class ReturningNode extends Node { constructor() { diff --git a/lib/node/rowCall.ts b/lib/node/rowCall.ts index 0ad0fc5e..f955abfe 100644 --- a/lib/node/rowCall.ts +++ b/lib/node/rowCall.ts @@ -1,21 +1,14 @@ -'use strict'; +import flatten from 'lodash/flatten.js'; +import { AliasMixin } from './alias.js'; +import { ParameterNode } from './parameter.js'; +import { ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import flatten from 'lodash/flatten'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, ParameterNode, valueExpressionMixin } from '.'; - -export class RowCallNode extends Node { +export class RowCallNode extends ValueExpressionNode { constructor(args: any[]) { super('ROW CALL'); args = flatten(args); this.addAll(args.map(ParameterNode.getNodeOrParameterNode)); } -} - -// mix in value expression -extend(RowCallNode.prototype, valueExpressionMixin()); -// allow aliasing -extend(RowCallNode.prototype, AliasNode.AliasMixin); - -export interface RowCallNode extends IValueExpressionMixin, IAliasMixin {} + public as = AliasMixin.as; +} diff --git a/lib/node/select.ts b/lib/node/select.ts index bbf3fd0b..f78b3ad7 100644 --- a/lib/node/select.ts +++ b/lib/node/select.ts @@ -1,6 +1,5 @@ -'use strict'; - -import { ModifierNode, Node } from '.'; +import { ModifierNode } from './modifier.js'; +import { Node } from './node.js'; export class SelectNode extends Node { public msSQLLimitNode?: ModifierNode; diff --git a/lib/node/slice.ts b/lib/node/slice.ts index 354aef76..ec5d0bb3 100644 --- a/lib/node/slice.ts +++ b/lib/node/slice.ts @@ -1,10 +1,8 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class SliceNode extends Node { +export class SliceNode extends ValueExpressionNode { public value: Node; public start: Node; public end: Node; @@ -13,15 +11,9 @@ export class SliceNode extends Node { this.value = value; this.start = start; this.end = end; - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(SliceNode.prototype, valueExpressionMixin()); - } } -} -extend(SliceNode.prototype, AliasNode.AliasMixin); + public as = AliasMixin.as; +} -export interface SliceNode extends IValueExpressionMixin, IAliasMixin {} +classMap.set('SLICE', SliceNode); diff --git a/lib/node/table.ts b/lib/node/table.ts index bc3f7b6b..915814df 100644 --- a/lib/node/table.ts +++ b/lib/node/table.ts @@ -1,7 +1,5 @@ -'use strict'; - -import { Node } from '.'; -import { Table } from '../table'; +import { Table } from '../table.js'; +import { Node } from './node.js'; export class TableNode extends Node { public table: Table; diff --git a/lib/node/ternary.ts b/lib/node/ternary.ts index 7b63f017..a276085d 100644 --- a/lib/node/ternary.ts +++ b/lib/node/ternary.ts @@ -1,10 +1,8 @@ -'use strict'; +import { AliasMixin } from './alias.js'; +import { Node } from './node.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; -import extend from 'lodash/extend'; -import { AliasNode, IAliasMixin, IValueExpressionMixin, Node, valueExpressionMixin } from '.'; - -let valueExpressionMixed = false; -export class TernaryNode extends Node { +export class TernaryNode extends ValueExpressionNode { public left: Node; public middle: Node; public operator: string; @@ -17,16 +15,9 @@ export class TernaryNode extends Node { this.operator = config.operator; this.right = config.right; this.separator = config.separator; - - // Delay mixin to runtime, when all nodes have been defined, and - // mixin only once. ValueExpressionMixin has circular dependencies. - if (!valueExpressionMixed) { - valueExpressionMixed = true; - extend(TernaryNode.prototype, valueExpressionMixin()); - } } -} -extend(TernaryNode.prototype, AliasNode.AliasMixin); + public as = AliasMixin.as; +} -export interface TernaryNode extends IValueExpressionMixin, IAliasMixin {} +classMap.set('TERNARY', TernaryNode); diff --git a/lib/node/text.ts b/lib/node/text.ts index a04c2ef3..37951998 100644 --- a/lib/node/text.ts +++ b/lib/node/text.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class TextNode extends Node { public text: string; @@ -8,4 +6,4 @@ export class TextNode extends Node { super('TEXT'); this.text = text; } -} +} \ No newline at end of file diff --git a/lib/node/truncate.ts b/lib/node/truncate.ts index 4b51752f..7ae5ba5e 100644 --- a/lib/node/truncate.ts +++ b/lib/node/truncate.ts @@ -1,7 +1,5 @@ -'use strict'; - -import { Node } from '.'; -import { Table } from '../table'; +import { Table } from '../table.js'; +import { Node } from './node.js'; export class TruncateNode extends Node { constructor(table: Table) { diff --git a/lib/node/update.ts b/lib/node/update.ts index 587933dc..5b75b48f 100644 --- a/lib/node/update.ts +++ b/lib/node/update.ts @@ -1,6 +1,4 @@ -'use strict'; - -import { Node } from '.'; +import { Node } from './node.js'; export class UpdateNode extends Node { constructor() { diff --git a/lib/node/valueExpression.ts b/lib/node/valueExpression.ts index 7c5260c0..08f931ca 100644 --- a/lib/node/valueExpression.ts +++ b/lib/node/valueExpression.ts @@ -1,7 +1,6 @@ -'use strict'; -// tslint:disable:object-literal-sort-keys - -import { +/* eslint-disable max-classes-per-file */ +import { INodeable } from '../nodeable.js'; +import type { AtNode, BinaryNode, CaseNode, @@ -9,219 +8,180 @@ import { InNode, NotInNode, OrderByValueNode, - ParameterNode, PostfixUnaryNode, SliceNode, - TernaryNode, - TextNode -} from '.'; -import { INodeable } from '../nodeable'; + TernaryNode +} from './_internal.js'; +import { Node } from './node.js'; +import { ParameterNode } from './parameter.js'; +import { TextNode } from './text.js'; + +export const classMap = new Map any>(); // Process values, wrapping them in ParameterNode if necessary. -const processParams = (val: any) => { +const processParam = (val: unknown): Node => { + if (Array.isArray(val)) { + throw new Error('expected single value'); + } + return ParameterNode.getNodeOrParameterNode(val); +}; +const processParams = (val: any): Node[] => { + if (!Array.isArray(val)) { + throw new Error('expected array value'); + } + return val.map(ParameterNode.getNodeOrParameterNode); +}; +const processParamOrParams = (val: any): Node | Node[] => { return Array.isArray(val) ? val.map(ParameterNode.getNodeOrParameterNode) : ParameterNode.getNodeOrParameterNode(val); }; -// Value expressions can be composed to form new value expressions. -// ValueExpressionMixin is evaluated at runtime, hence the -// "thunk" around it. -export const valueExpressionMixin = () => { - // tslint:disable:no-shadowed-variable - const BinaryNode = require('./binary').BinaryNode; - const InNode = require('./in').InNode; - const NotInNode = require('./notIn').NotInNode; - const CastNode = require('./cast').CastNode; - const PostfixUnaryNode = require('./postfixUnary').PostfixUnaryNode; - const TernaryNode = require('./ternary').TernaryNode; - const CaseNode = require('./case').CaseNode; - const AtNode = require('./at').AtNode; - const SliceNode = require('./slice').SliceNode; - // tslint:enable:no-shadowed-variable +// Builder functions - const postfixUnaryMethod = (operator: string) => { - /*jshint unused: false */ - return function(this: INodeable) { - return new PostfixUnaryNode({ - left: this.toNode(), - operator - }); - }; - }; - - const binaryMethod = (operator: string) => { - return function(this: INodeable, val: any) { - return new BinaryNode({ - left: this.toNode(), - operator, - right: processParams(val) - }); - }; - }; - - const inMethod = function(this: INodeable, val: any) { - return new InNode({ +const postfixUnaryMethod = (operator: string) => { + return function(this: INodeable): PostfixUnaryNode { + const ctor = classMap.get('POSTFIX UNARY')!; + return new ctor({ left: this.toNode(), - right: processParams(val) + operator }); }; +}; - const notInMethod = function(this: INodeable, val: any) { - return new NotInNode({ +const binaryMethod = (operator: string) => { + return function(this: INodeable, val: any): BinaryNode { + const ctor = classMap.get('BINARY')!; + return new ctor({ left: this.toNode(), - right: processParams(val) + operator, + right: processParamOrParams(val) }); }; +}; - const ternaryMethod = (operator: string, separator: string) => { - return function(this: INodeable, middle: any, right: any) { - return new TernaryNode({ - left: this.toNode(), - operator, - middle: processParams(middle), - separator, - right: processParams(right) - }); - }; - }; - - const atMethod = function(this: INodeable, index: any) { - return new AtNode(this.toNode(), processParams(index)); +const ternaryMethod = (operator: string, separator: string) => { + return function(this: INodeable, middle: any, right: any): TernaryNode { + const ctor = classMap.get('TERNARY')!; + return new ctor({ + left: this.toNode(), + operator, + middle: processParam(middle), + separator, + right: processParam(right) + }); }; +}; - const sliceMethod = function(this: INodeable, start: number, end: number) { - return new SliceNode(this.toNode(), processParams(start), processParams(end)); +const orderMethod = (direction: string) => { + return function(this: INodeable): OrderByValueNode { + const ctor = classMap.get('ORDER BY VALUE')!; + return new ctor({ + value: this.toNode(), + direction: direction ? new TextNode(direction) : undefined + }); }; +}; - const castMethod = function(this: INodeable, dataType: string) { - return new CastNode(this.toNode(), dataType); - }; +// eslint-disable-next-line prefer-arrow/prefer-arrow-functions +export function ValueExpressionBaseMixin INodeable>(Base: TBase) { + abstract class ValueExpressionBaseClass extends Base { - const orderMethod = (direction: string) => { - return function(this: INodeable) { - return new OrderByValueNode({ - value: this.toNode(), - direction: direction ? new TextNode(direction) : undefined + public in(val: any) : InNode { + const ctor = classMap.get('IN')!; + return new ctor({ + left: this.toNode(), + right: processParamOrParams(val) }); - }; - }; - - const caseMethod = function(this: INodeable, whenList: any[], thenList: any[], elseBranch?: any) { - if (undefined !== elseBranch) { - elseBranch = processParams(elseBranch); } - return new CaseNode({ - whenList: processParams(whenList), - thenList: processParams(thenList), - else: elseBranch - }); - }; - - return { - isNull: postfixUnaryMethod('IS NULL'), - isNotNull: postfixUnaryMethod('IS NOT NULL'), - or: binaryMethod('OR'), - and: binaryMethod('AND'), - equals: binaryMethod('='), - notEquals: binaryMethod('<>'), - gt: binaryMethod('>'), - gte: binaryMethod('>='), - lt: binaryMethod('<'), - lte: binaryMethod('<='), - plus: binaryMethod('+'), - minus: binaryMethod('-'), - multiply: binaryMethod('*'), - divide: binaryMethod('/'), - modulo: binaryMethod('%'), - leftShift: binaryMethod('<<'), - rightShift: binaryMethod('>>'), - bitwiseAnd: binaryMethod('&'), - bitwiseNot: binaryMethod('~'), - bitwiseOr: binaryMethod('|'), - bitwiseXor: binaryMethod('#'), - regex: binaryMethod('~'), - iregex: binaryMethod('~*'), - regexp: binaryMethod('REGEXP'), - notRegex: binaryMethod('!~'), - notIregex: binaryMethod('!~*'), - concat: binaryMethod('||'), - key: binaryMethod('->'), - keyText: binaryMethod('->>'), - path: binaryMethod('#>'), - pathText: binaryMethod('#>>'), - like: binaryMethod('LIKE'), - rlike: binaryMethod('RLIKE'), - notLike: binaryMethod('NOT LIKE'), - ilike: binaryMethod('ILIKE'), - notIlike: binaryMethod('NOT ILIKE'), - match: binaryMethod('@@'), - in: inMethod, - notIn: notInMethod, - between: ternaryMethod('BETWEEN', 'AND'), - notBetween: ternaryMethod('NOT BETWEEN', 'AND'), - at: atMethod, - contains: binaryMethod('@>'), - containedBy: binaryMethod('<@'), - containsKey: binaryMethod('?'), - overlap: binaryMethod('&&'), - slice: sliceMethod, - cast: castMethod, - descending: orderMethod('DESC'), - case: caseMethod - }; -}; - -export interface IValueExpressionMixinBase { - isNull(): PostfixUnaryNode; - isNotNull(): PostfixUnaryNode; - equals(val: any): BinaryNode; - notEquals(val: any): BinaryNode; - gt(val: any): BinaryNode; - gte(val: any): BinaryNode; - lt(val: any): BinaryNode; - lte(val: any): BinaryNode; - plus(val: any): BinaryNode; - minus(val: any): BinaryNode; - multiply(val: any): BinaryNode; - divide(val: any): BinaryNode; - modulo(val: any): BinaryNode; - leftShift(val: any): BinaryNode; - rightShift(val: any): BinaryNode; - bitwiseAnd(val: any): BinaryNode; - bitwiseNot(val: any): BinaryNode; - bitwiseOr(val: any): BinaryNode; - bitwiseXor(val: any): BinaryNode; - regex(val: any): BinaryNode; - iregex(val: any): BinaryNode; - regexp(val: any): BinaryNode; - notRegex(val: any): BinaryNode; - notIregex(val: any): BinaryNode; - concat(val: any): BinaryNode; - key(val: any): BinaryNode; - keyText(val: any): BinaryNode; - path(val: any): BinaryNode; - pathText(val: any): BinaryNode; - like(val: any): BinaryNode; - rlike(val: any): BinaryNode; - notLike(val: any): BinaryNode; - ilike(val: any): BinaryNode; - notIlike(val: any): BinaryNode; - match(val: any): BinaryNode; - in(val: any): InNode; - notIn(val: any): NotInNode; - between(middle: any, right: any): TernaryNode; - notBetween(middle: any, right: any): TernaryNode; - at(index: any): AtNode; - contains(val: any): BinaryNode; - containedBy(val: any): BinaryNode; - containsKey(val: any): BinaryNode; - overlap(val: any): BinaryNode; - slice(start: number, end: number): SliceNode; - cast(dataType: string): CastNode; - descending(): OrderByValueNode; - case(whenList: any[], thenList: any[], elseBranch?: any): CaseNode; + + public notIn(val: any): NotInNode { + const ctor = classMap.get('NOT IN')!; + return new ctor({ + left: this.toNode(), + right: processParamOrParams(val) + }); + } + + public at(index: any): AtNode { + const ctor = classMap.get('AT')!; + return new ctor(this.toNode(), processParam(index)); + } + + public slice(start: number, end: number): SliceNode { + const ctor = classMap.get('SLICE')!; + return new ctor(this.toNode(), processParam(start), processParam(end)); + } + + public cast(dataType: string): CastNode { + const ctor = classMap.get('CAST')!; + return new ctor(this.toNode(), dataType); + } + + public case(whenList: any[], thenList: any[], elseBranch?: any): CaseNode { + const ctor = classMap.get('CASE')!; + if (undefined !== elseBranch) { + elseBranch = processParam(elseBranch); + } + return new ctor({ + whenList: processParams(whenList), + thenList: processParams(thenList), + else: elseBranch + }); + } + + public isNull = postfixUnaryMethod('IS NULL'); + public isNotNull = postfixUnaryMethod('IS NOT NULL'); + public equals = binaryMethod('='); + public notEquals = binaryMethod('<>'); + public gt = binaryMethod('>'); + public gte = binaryMethod('>='); + public lt = binaryMethod('<'); + public lte = binaryMethod('<='); + public plus = binaryMethod('+'); + public minus = binaryMethod('-'); + public multiply = binaryMethod('*'); + public divide = binaryMethod('/'); + public modulo = binaryMethod('%'); + public leftShift = binaryMethod('<<'); + public rightShift = binaryMethod('>>'); + public bitwiseAnd = binaryMethod('&'); + public bitwiseNot = binaryMethod('~'); + public bitwiseOr = binaryMethod('|'); + public bitwiseXor = binaryMethod('#'); + public regex = binaryMethod('~'); + public iregex = binaryMethod('~*'); + public regexp = binaryMethod('REGEXP'); + public notRegex = binaryMethod('!~'); + public notIregex = binaryMethod('!~*'); + public concat = binaryMethod('||'); + public key = binaryMethod('->'); + public keyText = binaryMethod('->>'); + public path = binaryMethod('#>'); + public pathText = binaryMethod('#>>'); + public like = binaryMethod('LIKE'); + public rlike = binaryMethod('RLIKE'); + public notLike = binaryMethod('NOT LIKE'); + public ilike = binaryMethod('ILIKE'); + public notIlike = binaryMethod('NOT ILIKE'); + public match = binaryMethod('@@'); + public between = ternaryMethod('BETWEEN', 'AND'); + public notBetween = ternaryMethod('NOT BETWEEN', 'AND'); + public contains = binaryMethod('@>'); + public containedBy = binaryMethod('<@'); + public containsKey = binaryMethod('?'); + public overlap = binaryMethod('&&'); + public descending = orderMethod('DESC'); + } + return ValueExpressionBaseClass; } -export interface IValueExpressionMixin extends IValueExpressionMixinBase { - or(val: any): BinaryNode; - and(val: any): BinaryNode; +// eslint-disable-next-line prefer-arrow/prefer-arrow-functions +export function ValueExpressionMixin INodeable>(Base: TBase) { + abstract class ValueExpressionClass extends ValueExpressionBaseMixin(Base) { + public or = binaryMethod('OR'); + public and = binaryMethod('AND'); + } + return ValueExpressionClass; } + +export const ValueExpressionBaseNode = ValueExpressionBaseMixin(Node); +export const ValueExpressionNode = ValueExpressionMixin(Node); diff --git a/lib/node/where.ts b/lib/node/where.ts index a66dbbb0..5b18e28d 100644 --- a/lib/node/where.ts +++ b/lib/node/where.ts @@ -1,10 +1,10 @@ -'use strict'; +import { INodeable, instanceofINodeable } from '../nodeable.js'; +import { Table } from '../table.js'; +import { BinaryNode } from './binary.js'; +import { Node } from './node.js'; +import { TextNode } from './text.js'; -import { BinaryNode, Node, TextNode } from '.'; -import { INodeable, instanceofINodeable } from '../nodeable'; -import { Table } from '../table'; - -const normalizeNode = (table: Table, node: Node[] | Node | INodeable | object | string): Node => { +const normalizeNode = (table: Table, node: Node[] | Node | INodeable | Record | string): Node => { if (typeof node === 'string') { return new TextNode(`(${node})`); } else if (Array.isArray(node)) { @@ -39,12 +39,12 @@ export class WhereNode extends Node { this.table = table; } - public add(node: Node[] | Node | INodeable | object | string) { + public add(node: Node[] | Node | INodeable | Record | string) { const add = normalizeNode(this.table, node); return super.add(add); } - public or(other: Node | object | string): void { + public or(other: Node | Record | string): void { const right = normalizeNode(this.table, other); // calling 'or' without an initial 'where' if (!this.nodes.length) { @@ -60,7 +60,7 @@ export class WhereNode extends Node { } } - public and(other: Node[] | Node | object | string): void { + public and(other: Node[] | Node | Record | string): void { const right = normalizeNode(this.table, other); this.nodes.push( new BinaryNode({ diff --git a/lib/nodeable.ts b/lib/nodeable.ts index daf45a0d..28cc5402 100644 --- a/lib/nodeable.ts +++ b/lib/nodeable.ts @@ -1,9 +1,10 @@ -import { Node } from './node'; +import type { Node } from './node/node.js'; export interface INodeable { toNode(): Node; } +// eslint-disable-next-line prefer-arrow/prefer-arrow-functions export function instanceofINodeable(o: unknown): o is INodeable { return typeof o === 'object' && o !== null && 'toNode' in o; } diff --git a/lib/sql.ts b/lib/sql.ts index 90946215..c1e6ecdf 100644 --- a/lib/sql.ts +++ b/lib/sql.ts @@ -1,20 +1,22 @@ -'use strict'; - -import defaults from 'lodash/defaults'; +import defaults from 'lodash/defaults.js'; import sliced from 'sliced'; -import { Column } from './column'; -import { ColumnDefinition, SQLDialects, TableDefinition } from './configTypes'; -import { DEFAULT_DIALECT, getDialect } from './dialect'; -import * as functions from './functions'; -import { ArrayCallNode, FunctionCallNode, RowCallNode, IntervalNode, LiteralNode, Query } from './node'; -import { Table, TableWithColumns } from './table'; +import { Column } from './column.js'; +import { ColumnDefinition, SQLDialects, TableDefinition } from './configTypes.js'; +import { DEFAULT_DIALECT, getDialect } from './dialect/mapper.js'; +import * as functions from './functions.js'; +import { ArrayCallNode } from './node/arrayCall.js'; +import { FunctionCallNode } from './node/functionCall.js'; +import { IntervalNode } from './node/interval.js'; +import { LiteralNode } from './node/literal.js'; +import { Query } from './node/query.js'; +import { RowCallNode } from './node/rowCall.js'; +import { Table, TableWithColumns } from './table.js'; export class Sql { public functions: functions.StandardFunctions; public dialect: any; public dialectName!: SQLDialects; public config: any; - // tslint:disable-next-line:variable-name private _function: any; constructor(dialect: SQLDialects = DEFAULT_DIALECT, config: any = {}) { this.setDialect(dialect, config); diff --git a/lib/table.ts b/lib/table.ts index e1094685..3c10d667 100644 --- a/lib/table.ts +++ b/lib/table.ts @@ -1,13 +1,18 @@ -'use strict'; - -import map from 'lodash/map'; -import fromPairs from 'lodash/fromPairs'; -import { Column } from './column'; -import { ColumnDefinition, TableDefinition } from './configTypes'; -import { leftJoin } from './joiner'; -import { ColumnNode, DropIndexNode, ForeignKeyNode, JoinNode, LiteralNode, Node, OrderByValueNode, Query, SubQuery, TableNode } from './node'; -import { INodeable, PartialNodeable } from './nodeable'; -import { Sql } from './sql'; +import map from 'lodash/map.js'; +import fromPairs from 'lodash/fromPairs.js'; +import { Column } from './column.js'; +import { ColumnDefinition, TableDefinition } from './configTypes.js'; +import { leftJoin } from './joiner.js'; +import { ColumnNode } from './node/column.js'; +import { DropIndexNode } from './node/dropIndex.js'; +import { ForeignKeyNode } from './node/foreignKey.js'; +import { JoinNode } from './node/join.js'; +import { Node } from './node/node.js'; +import { OrderByValueNode } from './node/orderByValue.js'; +import { Query, SubQuery } from './node/query.js'; +import { TableNode } from './node/table.js'; +import { INodeable, PartialNodeable } from './nodeable.js'; +import { Sql } from './sql.js'; export type TableWithColumns = Table & { [Name in NonNullable]: Column }; @@ -90,7 +95,6 @@ export class Table implements INodeable { public createColumn(col: string | ColumnDefinition | Column): Column { if (!(col instanceof Column)) { if (typeof col === 'string') { - // tslint:disable-next-line:no-object-literal-type-assertion col = { name: col } as ColumnDefinition; } const column = new Column({ ...col, table: this }); @@ -121,7 +125,7 @@ export class Table implements INodeable { return this; } } else if (!!(this as any)[column.name] && process.env.NODE_ENV === 'debug') { - // tslint:disable-next-line:no-console + // eslint-disable-next-line no-console console.log( `Please notice that you have just defined the column "${ column.name @@ -191,7 +195,7 @@ export class Table implements INodeable { } return query; } - public subQuery(alias?: string): SubQuery { + public subQuery>(alias?: string): SubQuery { // create the query and pass it off const query = new Query(this, true) as SubQuery; query.columns = []; @@ -202,6 +206,7 @@ export class Table implements INodeable { return query; } public insert(object: Column[] | Column): Query; + // eslint-disable-next-line @typescript-eslint/unified-signatures public insert(object: PartialNodeable[] | PartialNodeable): Query; public insert(...nodes: Column[]): Query; public insert(...nodes: (Column[] | Column | PartialNodeable[] | PartialNodeable)[]): Query { @@ -215,6 +220,7 @@ export class Table implements INodeable { return query; } public replace(object: Column[] | Column): Query; + // eslint-disable-next-line @typescript-eslint/unified-signatures public replace(object: PartialNodeable[] | PartialNodeable): Query; public replace(...nodes: Column[]): Query; public replace(...nodes: (Column[] | Column | PartialNodeable[] | PartialNodeable)[]): Query { @@ -264,6 +270,7 @@ export class Table implements INodeable { query.create(); return query; } + // eslint-disable-next-line @typescript-eslint/unified-signatures public delete(table: Table[] | Table | Table | Partial): Query; public delete(): Query; public delete(arg?: Table[] | Table | Table | Partial): Query { diff --git a/lib/tableTracker.ts b/lib/tableTracker.ts index 348a07e7..92617d6e 100644 --- a/lib/tableTracker.ts +++ b/lib/tableTracker.ts @@ -1,9 +1,10 @@ -import { Table } from './table'; +import { Table } from './table.js'; export interface ITableTracker { table?: Table; } -export function hasTable(o: object): o is Required { +// eslint-disable-next-line prefer-arrow/prefer-arrow-functions +export function hasTable(o: unknown): o is Required { return typeof o === 'object' && o !== null && 'table' in o; } diff --git a/package-lock.json b/package-lock.json index c55b8e54..d2fe4326 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,352 +13,1876 @@ "@babel/highlight": "^7.10.4" } }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", + "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", "dev": true }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", + "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.160", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.160.tgz", - "integrity": "sha512-aP03BShJoO+WVndoVj/WNcB/YBPt+CIU1mvaao2GRAHy2yg4pT/XS4XnVHEQBjPJGycWf/9seKEO9vopTJGkvA==", - "dev": true - }, - "@types/mocha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz", - "integrity": "sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==", - "dev": true - }, - "@types/node": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz", - "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "@babel/eslint-parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.14.7.tgz", + "integrity": "sha512-6WPwZqO5priAGIwV6msJcdc9TsEPzYeYdS/Xuoap+/ihkgN6dzHp2bcAAwyWZ5bLzk0vvjDmKvRwkqNaiJ8BiQ==", + "dev": true, + "requires": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", "dev": true, "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" } }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "@babel/types": "^7.14.5" } }, - "array.prototype.map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", - "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "@babel/helper-member-expression-to-functions": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.4" + "@babel/types": "^7.14.5" } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true + "@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + } + } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/types": "^7.14.5" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", + "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", "dev": true }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "dev": true + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "@babel/highlight": "^7.14.5" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true } } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", "dev": true, "requires": { - "color-name": "1.1.3" + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true + } } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "@es-joy/jsdoccomment": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.8.0.tgz", + "integrity": "sha512-Xd3GzYsL2sz2pcdtYt5Q0Wz1ol/o9Nt2UQL4nFPDcaEomvPmwjJsbjkKx1SKhl2h3TgwazNBLdcNr2m0UiGiFA==", + "dev": true, + "requires": { + "comment-parser": "^1.1.5", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "1.0.4" + } + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", + "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", + "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rollup/plugin-typescript": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.1.tgz", + "integrity": "sha512-Qd2E1pleDR4bwyFxqbjt4eJf+wB0UKVMLc7/BAFDGVdAXQMCsD4DUv5/7/ww47BZCYxWtJqe1Lo0KVNswBJlRw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", + "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", + "dev": true + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/lodash": { + "version": "4.14.170", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", + "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "dev": true + }, + "@types/mocha": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", + "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", + "dev": true + }, + "@types/node": { + "version": "14.17.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz", + "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz", + "integrity": "sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.28.0", + "@typescript-eslint/scope-manager": "4.28.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", + "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.0.tgz", + "integrity": "sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", + "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0" + } + }, + "@typescript-eslint/types": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", + "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", + "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", + "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001240", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz", + "integrity": "sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "comment-parser": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.5.tgz", + "integrity": "sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + } + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "electron-to-chromium": { + "version": "1.3.759", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.759.tgz", + "integrity": "sha512-nM76xH0t2FBH5iMEZDVc3S/qbdKjGH7TThezxC8k1Q7w7WHvIAyJh8lAe2UamGfdRqBTjHfPDn82LJ0ksCiB9g==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-jsdoc": { + "version": "35.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.4.0.tgz", + "integrity": "sha512-0cr+NkPTxpTiMCtYOd8W5fd2IyC/CmaTHKb+0bzkpP9p8HfmJ3B2/M6FWj97rQJOLwLMkx+g2MIEZsrttpbFmQ==", + "dev": true, + "requires": { + "@es-joy/jsdoccomment": "^0.8.0-alpha.2", + "comment-parser": "1.1.5", + "debug": "^4.3.1", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "^1.0.4", + "lodash": "^4.17.21", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "dev": true + }, + "eslint-plugin-unicorn": { + "version": "33.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-33.0.1.tgz", + "integrity": "sha512-VxX/L/9DUEyB3D0v00185LrgsB5/fBwkgA4IC7ehHRu5hFSgA6VecmdpFybhsr4GQ/Y1iyXMHf6q+JKvcR2MwA==", + "dev": true, + "requires": { + "ci-info": "^3.1.1", + "clean-regexp": "^1.0.0", + "eslint-template-visitor": "^2.3.2", + "eslint-utils": "^3.0.0", + "import-modules": "^2.1.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.23", + "reserved-words": "^0.1.2", + "safe-regex": "^2.1.1", + "semver": "^7.3.5" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-template-visitor": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz", + "integrity": "sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "eslint-visitor-keys": "^2.0.0", + "esquery": "^1.3.1", + "multimap": "^1.1.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { - "ms": "^2.1.1" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz", + "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" } }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "es-get-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", - "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", "dev": true, "requires": { - "es-abstract": "^1.17.4", - "has-symbols": "^1.0.1", - "is-arguments": "^1.0.4", - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-string": "^1.0.5", - "isarray": "^2.0.5" + "reusify": "^1.0.4" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "flat-cache": "^3.0.4" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -379,14 +1903,27 @@ } }, "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "is-buffer": "~2.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -394,9 +1931,9 @@ "dev": true }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -406,12 +1943,35 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -427,14 +1987,43 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", + "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -450,6 +2039,12 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -457,9 +2052,9 @@ "dev": true }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, "he": { @@ -468,6 +2063,46 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-modules": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.1.0.tgz", + "integrity": "sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -484,10 +2119,16 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", "dev": true }, "is-binary-path": { @@ -499,22 +2140,51 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-builtin-module": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", + "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", + "dev": true, + "requires": { + "builtin-modules": "^3.0.0" + }, + "dependencies": { + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true + } + } }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", "dev": true }, "is-extglob": { @@ -538,10 +2208,10 @@ "is-extglob": "^2.1.1" } }, - "is-map": { + "is-negative-zero": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", - "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true }, "is-number": { @@ -550,46 +2220,59 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" } }, - "is-set": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", - "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", - "dev": true - }, "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", "dev": true }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, "isexe": { @@ -598,22 +2281,6 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "iterate-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", - "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", - "dev": true - }, - "iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, - "requires": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - } - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -630,6 +2297,79 @@ "esprima": "^4.0.0" } }, + "jsdoc-type-pratt-parser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz", + "integrity": "sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -640,33 +2380,51 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -695,9 +2453,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -705,12 +2463,46 @@ } } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -726,64 +2518,90 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "mocha": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.2.tgz", - "integrity": "sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.0.1.tgz", + "integrity": "sha512-9zwsavlRO+5csZu6iRtl3GHImAbhERoDsZwdRkdJ/bE+eVplmoxNKE901ZJ9LdSchYBjSCPbjKc5XvcAri2ylw==", "dev": true, "requires": { + "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.4.2", - "debug": "4.1.1", - "diff": "4.0.2", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", + "glob": "7.1.7", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", "minimatch": "3.0.4", - "ms": "2.1.2", - "object.assign": "4.1.0", - "promise.allsettled": "1.0.2", - "serialize-javascript": "4.0.0", - "strip-json-comments": "3.0.1", - "supports-color": "7.1.0", + "ms": "2.1.3", + "nanoid": "3.1.23", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", "which": "2.0.2", "wide-align": "1.1.3", - "workerpool": "6.0.0", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.1" + "workerpool": "6.1.4", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -791,12 +2609,48 @@ } } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", + "dev": true + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", "dev": true }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -804,9 +2658,9 @@ "dev": true }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", "dev": true }, "object-keys": { @@ -816,15 +2670,26 @@ "dev": true }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" } }, "once": { @@ -836,13 +2701,27 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -854,12 +2733,40 @@ "p-limit": "^3.0.2" } }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -872,31 +2779,174 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, - "promise.allsettled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", - "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "array.prototype.map": "^1.0.1", - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "iterate-value": "^1.0.0" + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } } }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -906,25 +2956,126 @@ "safe-buffer": "^5.1.0" } }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + } + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { "picomatch": "^2.2.1" } }, + "regexp-tree": { + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.23.tgz", + "integrity": "sha512-+7HWfb4Bvu8Rs2eQTUIpX9I/PlQkYOuTNbRpKLJlQpSgwSkzFYh+pUj0gtvglnOZLKB6YgnIgRuJ2/IlpL48qw==", + "dev": true + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "regextras": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", + "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", "dev": true }, "resolve": { @@ -936,12 +3087,101 @@ "path-parse": "^1.0.6" } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup-plugin-delete": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", + "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", + "dev": true, + "requires": { + "del": "^5.1.0" + } + }, + "rollup-plugin-dts": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz", + "integrity": "sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "magic-string": "^0.25.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "optional": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, + "optional": true + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -949,20 +3189,78 @@ "dev": true }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } + } + }, "sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", @@ -984,6 +3282,44 @@ "source-map": "^0.6.0" } }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1001,23 +3337,23 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "strip-ansi": { @@ -1029,10 +3365,16 @@ "ansi-regex": "^3.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { @@ -1044,6 +3386,84 @@ "has-flag": "^3.0.0" } }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1054,81 +3474,98 @@ } }, "ts-node": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", - "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz", + "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==", "dev": true, "requires": { + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.1", "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.17", "yn": "3.1.1" } }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - } + "prelude-ls": "^1.2.1" } }, - "tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "typescript": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", + "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - } + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" } }, - "typescript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", - "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -1138,11 +3575,18 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } }, "wide-align": { "version": "1.1.3", @@ -1153,47 +3597,83 @@ "string-width": "^1.0.2 || 2" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "workerpool": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", - "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.4.tgz", + "integrity": "sha512-jGWPzsUqzkow8HoAvqaPWTUPCrlPJaJ5tY8Iz7n1uCz3tTp6s3CDG0FF1NsX42WNlkRSW6Mr+CDZGnNoSsKa7g==", "dev": true }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } } } @@ -1205,221 +3685,82 @@ "dev": true }, "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { + "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } } } }, "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true }, "yargs-unparser": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", - "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "requires": { - "camelcase": "^5.3.1", - "decamelize": "^1.2.0", - "flat": "^4.1.0", - "is-plain-obj": "^1.1.0", - "yargs": "^14.2.3" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" } }, "yn": { @@ -1427,6 +3768,12 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index d41a987c..ce5e7650 100644 --- a/package.json +++ b/package.json @@ -12,41 +12,52 @@ "type": "git", "url": "git://github.com/charsleysa/node-sql-ts.git" }, - "main": "dist/cjs/", - "module": "dist/esm/", - "types": "dist/esm/index.d.ts", + "type": "module", + "exports": { + "import": "./dist/lib.js" + }, + "main": "./dist/lib.js", + "types": "./dist/lib.d.ts", "scripts": { - "pretest": "tslint --project . && tslint --project ./test", - "test": "TS_NODE_PROJECT='test/tsconfig.json' mocha", - "lint": "tslint --project .", - "tsc": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json", - "release:major": "npm run test && npm run tsc && npm version major -m \"chore: release\" && git push origin master --tags && npm publish", - "release:minor": "npm run test && npm run tsc && npm version minor -m \"chore: release\" && git push origin master --tags && npm publish", - "release:patch": "npm run test && npm run tsc && npm version patch -m \"chore: release\" && git push origin master --tags && npm publish" + "pretest": "eslint --ext .ts ./lib && eslint --ext .ts ./test && rollup -c && tsc -p ./test/tsconfig.json", + "test": "mocha", + "lint": "eslint --ext .ts ./lib && eslint --ext .ts ./test", + "build": "rollup -c", + "release:major": "npm run test && npm run build && npm version major -m \"chore: release\" && git push origin master --tags && npm publish", + "release:minor": "npm run test && npm run build && npm version minor -m \"chore: release\" && git push origin master --tags && npm publish", + "release:patch": "npm run test && npm run build && npm version patch -m \"chore: release\" && git push origin master --tags && npm publish" }, "engines": { - "node": "^12.0.0 || >=14.0.0" + "node": "^12.20.0 || >=14.15.0" }, "dependencies": { - "lodash": "^4.17.20", + "lodash": "^4.17.21", "sliced": "~1.0.x", - "tslib": "~2.0.1" + "tslib": "~2.3.0" }, "devDependencies": { - "@types/lodash": "^4.14.160", - "@types/mocha": "^8.0.3", - "@types/node": "^12.0.0", - "mocha": "^8.1.2", - "ts-node": "^9.0.0", - "tslint": "^6.1.3", - "tslint-config-prettier": "^1.18.0", - "typescript": "^4.0.2" + "@rollup/plugin-typescript": "^8.2.1", + "@types/lodash": "^4.14.170", + "@types/mocha": "^8.2.2", + "@types/node": "^14.17.4", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", + "eslint": "^7.29.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-jsdoc": "^35.4.0", + "eslint-plugin-prefer-arrow": "^1.2.3", + "eslint-plugin-unicorn": "^33.0.1", + "mocha": "^9.0.1", + "rollup-plugin-delete": "^2.0.0", + "rollup-plugin-dts": "^3.0.2", + "ts-node": "^10.0.0", + "typescript": "^4.3.4" }, "mocha": { "reporter": "dot", "ui": "tdd", - "require": "ts-node/register", - "watch-extensions": "tsx,ts", - "spec": "test/*.ts" + "watch-extensions": "js", + "spec": "spec/**/*.js" } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..e1239732 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,49 @@ +import typescript from '@rollup/plugin-typescript'; +import del from 'rollup-plugin-delete'; +import dts from 'rollup-plugin-dts'; + +export default [ + { + input: './lib/index.ts', + output: { + file: './dist/lib.js', + format: 'esm', + sourcemap: true + }, + external: [ + 'assert', + 'lodash/defaults.js', + 'lodash/flatten.js', + 'lodash/fromPairs.js', + 'lodash/isArray.js', + 'lodash/isNumber.js', + 'lodash/isFunction.js', + 'lodash/map.js', + 'lodash/padStart.js', + 'lodash/reduce.js', + 'sliced' + ], + plugins: [ + del({ + targets: './dist' + }), + typescript({ + tsconfig: './tsconfig.build.json' + }) + ] + }, + { + input: './dist/dts/index.d.ts', + output: { + file: './dist/lib.d.ts', + format: 'es' + }, + plugins: [ + dts(), + del({ + hook: 'buildEnd', + targets: './dist/dts' + }) + ] + } +]; diff --git a/runtests.js b/runtests.js deleted file mode 100644 index ac89769b..00000000 --- a/runtests.js +++ /dev/null @@ -1,18 +0,0 @@ -var childProcess = require("child_process"); -var path = require("path"); - -var env = process.env; -env.NODE_ENV = "test"; - -var options = { - env: env -}; - -var command = path.join(".", "node_modules", ".bin", "mocha"); -if (process.platform == "win32") command += ".cmd"; -var run = childProcess.spawn(command, [], options); -run.stdout.pipe(process.stdout); -run.stderr.pipe(process.stderr); -run.on('close', function(code) { - process.exit(code); -}); diff --git a/test/.eslintrc.json b/test/.eslintrc.json new file mode 100644 index 00000000..ac57f9aa --- /dev/null +++ b/test/.eslintrc.json @@ -0,0 +1,14 @@ +{ + "extends": "../.eslintrc.json", + "parserOptions": { + "project": [ + "tsconfig.json" + ], + "sourceType": "module" + }, + "rules": { + "prefer-arrow/prefer-arrow-functions": "off", + "id-blacklist": "off", + "import/no-internal-modules": "off" + } +} \ No newline at end of file diff --git a/test/binary-clause-tests.ts b/test/binary-clause-tests.ts index d10dd29d..eafc76b1 100644 --- a/test/binary-clause-tests.ts +++ b/test/binary-clause-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - import { strictEqual } from 'assert'; -import { Table } from '../lib/table'; +import { Table } from '../dist/lib.js'; const Foo = Table.define<{ baz: string; bar: string }>({ name: 'foo', diff --git a/test/clause-definition.ts b/test/clause-definition.ts index 32632b81..c5445fce 100644 --- a/test/clause-definition.ts +++ b/test/clause-definition.ts @@ -1,8 +1,7 @@ -'use strict'; - +/* eslint-disable max-classes-per-file */ import { strictEqual } from 'assert'; -import { Node } from '../lib/node/'; +import { Node } from '../dist/lib.js'; class Bang extends Node { constructor() { diff --git a/test/column-tests.ts b/test/column-tests.ts index c5b11156..dace5ff7 100644 --- a/test/column-tests.ts +++ b/test/column-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - import { strictEqual, throws } from 'assert'; -import { Sql } from '../lib'; +import { Sql } from '../dist/lib.js'; const sql = new Sql(); diff --git a/test/dialects/aggregate-tests.ts b/test/dialects/aggregate-tests.ts index 5835df1b..5d7bd605 100644 --- a/test/dialects/aggregate-tests.ts +++ b/test/dialects/aggregate-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const customerAlias = Harness.defineCustomerAliasTable(); const post = Harness.definePostTable(); diff --git a/test/dialects/alias-tests.ts b/test/dialects/alias-tests.ts index 3dec1125..d010eafa 100644 --- a/test/dialects/alias-tests.ts +++ b/test/dialects/alias-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const customer = Harness.defineCustomerTable(); const instance = new Sql('postgres'); diff --git a/test/dialects/alter-table-tests.ts b/test/dialects/alter-table-tests.ts index 660519ba..e4bbf186 100644 --- a/test/dialects/alter-table-tests.ts +++ b/test/dialects/alter-table-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Table } from '../../lib/table'; +import * as Harness from './support.js'; +import { Table } from '../../dist/lib.js'; const post = Harness.definePostTable(); Harness.test({ diff --git a/test/dialects/array-tests.ts b/test/dialects/array-tests.ts index cd1d9699..48e2eb8e 100644 --- a/test/dialects/array-tests.ts +++ b/test/dialects/array-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const post = Harness.definePostTable(); const instance = new Sql('postgres'); diff --git a/test/dialects/binary-clause-tests.ts b/test/dialects/binary-clause-tests.ts index 5105b474..fa33a494 100644 --- a/test/dialects/binary-clause-tests.ts +++ b/test/dialects/binary-clause-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const customer = Harness.defineCustomerTable(); const customerAlias = Harness.defineCustomerAliasTable(); const post = Harness.definePostTable(); diff --git a/test/dialects/case-tests.ts b/test/dialects/case-tests.ts index b5ecb568..19b41b60 100644 --- a/test/dialects/case-tests.ts +++ b/test/dialects/case-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const customer = Harness.defineCustomerTable(); // Check case expression with primary when expressions and else branch. diff --git a/test/dialects/cast-tests.ts b/test/dialects/cast-tests.ts index 27447f84..70fabcfe 100644 --- a/test/dialects/cast-tests.ts +++ b/test/dialects/cast-tests.ts @@ -1,5 +1,4 @@ -'use strict'; -import * as Harness from './support'; +import * as Harness from './support.js'; const customer = Harness.defineCustomerTable(); const customerAlias = Harness.defineCustomerAliasTable(); diff --git a/test/dialects/clause-ordering-tests.ts b/test/dialects/clause-ordering-tests.ts index 68872328..8ac50cce 100644 --- a/test/dialects/clause-ordering-tests.ts +++ b/test/dialects/clause-ordering-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); diff --git a/test/dialects/create-table-tests.ts b/test/dialects/create-table-tests.ts index ff6300a3..c635e2cc 100644 --- a/test/dialects/create-table-tests.ts +++ b/test/dialects/create-table-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Table } from '../../lib/table'; +import * as Harness from './support.js'; +import { Table } from '../../dist/lib.js'; const group = Table.define({ name: 'group', diff --git a/test/dialects/create-view-tests.ts b/test/dialects/create-view-tests.ts index 9ea8169a..d9731d88 100644 --- a/test/dialects/create-view-tests.ts +++ b/test/dialects/create-view-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const user = Harness.defineUserTable(); // simple view create diff --git a/test/dialects/date-tests.ts b/test/dialects/date-tests.ts index 716c41a0..7fcee52c 100644 --- a/test/dialects/date-tests.ts +++ b/test/dialects/date-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const customer = Harness.defineCustomerTable(); const instance = new Sql('postgres'); diff --git a/test/dialects/delete-tests.ts b/test/dialects/delete-tests.ts index 386d6527..73695cd1 100644 --- a/test/dialects/delete-tests.ts +++ b/test/dialects/delete-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); diff --git a/test/dialects/distinct-on-tests.ts b/test/dialects/distinct-on-tests.ts index d72d0b8d..d2eeaf8e 100644 --- a/test/dialects/distinct-on-tests.ts +++ b/test/dialects/distinct-on-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const user = Harness.defineUserTable(); Harness.test({ diff --git a/test/dialects/distinct-tests.ts b/test/dialects/distinct-tests.ts index 4210fbf7..bc8c7da1 100644 --- a/test/dialects/distinct-tests.ts +++ b/test/dialects/distinct-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const user = Harness.defineUserTable(); Harness.test({ diff --git a/test/dialects/drop-table-tests.ts b/test/dialects/drop-table-tests.ts index f2bdb142..f3114985 100644 --- a/test/dialects/drop-table-tests.ts +++ b/test/dialects/drop-table-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); Harness.test({ diff --git a/test/dialects/for-share-tests.ts b/test/dialects/for-share-tests.ts index 2ebba21c..ceaa2ea8 100644 --- a/test/dialects/for-share-tests.ts +++ b/test/dialects/for-share-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); diff --git a/test/dialects/for-update-tests.ts b/test/dialects/for-update-tests.ts index 9377e439..dd1bddb3 100644 --- a/test/dialects/for-update-tests.ts +++ b/test/dialects/for-update-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); diff --git a/test/dialects/from-clause-tests.ts b/test/dialects/from-clause-tests.ts index 12d93e18..2fb3efa8 100644 --- a/test/dialects/from-clause-tests.ts +++ b/test/dialects/from-clause-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); diff --git a/test/dialects/function-tests.ts b/test/dialects/function-tests.ts index 15cff372..e6e742e4 100644 --- a/test/dialects/function-tests.ts +++ b/test/dialects/function-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const post = Harness.definePostTable(); const instance = new Sql('postgres'); diff --git a/test/dialects/group-by-tests.ts b/test/dialects/group-by-tests.ts index 8234f62d..c5c207af 100644 --- a/test/dialects/group-by-tests.ts +++ b/test/dialects/group-by-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); Harness.test({ diff --git a/test/dialects/having-tests.ts b/test/dialects/having-tests.ts index 80558f21..a46b184d 100644 --- a/test/dialects/having-tests.ts +++ b/test/dialects/having-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); Harness.test({ diff --git a/test/dialects/hstore-tests.ts b/test/dialects/hstore-tests.ts index 52a3815c..9e51243f 100644 --- a/test/dialects/hstore-tests.ts +++ b/test/dialects/hstore-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const customer = Harness.defineCustomerTable(); const instance = new Sql('postgres'); diff --git a/test/dialects/ilike-tests.ts b/test/dialects/ilike-tests.ts index e558c394..be6bb510 100644 --- a/test/dialects/ilike-tests.ts +++ b/test/dialects/ilike-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); diff --git a/test/dialects/in-clause-tests.ts b/test/dialects/in-clause-tests.ts index d51a5dfc..1f6ac719 100644 --- a/test/dialects/in-clause-tests.ts +++ b/test/dialects/in-clause-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); Harness.test({ diff --git a/test/dialects/index.ts b/test/dialects/index.ts deleted file mode 100644 index ad9a93a7..00000000 --- a/test/dialects/index.ts +++ /dev/null @@ -1 +0,0 @@ -'use strict'; diff --git a/test/dialects/indexes-tests.ts b/test/dialects/indexes-tests.ts index 64e4d0ea..c78deeac 100644 --- a/test/dialects/indexes-tests.ts +++ b/test/dialects/indexes-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); Harness.test({ diff --git a/test/dialects/insert-tests.ts b/test/dialects/insert-tests.ts index 51ac8ce8..0ce9bb68 100644 --- a/test/dialects/insert-tests.ts +++ b/test/dialects/insert-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Table } from '../../lib/table'; +import * as Harness from './support.js'; +import { Table } from '../../dist/lib.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); const contentTable = Harness.defineContentTable(); diff --git a/test/dialects/join-tests.ts b/test/dialects/join-tests.ts index 683d5a13..e8f0555e 100644 --- a/test/dialects/join-tests.ts +++ b/test/dialects/join-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); const comment = Harness.defineCommentTable(); diff --git a/test/dialects/join-to-tests.ts b/test/dialects/join-to-tests.ts index 79e14cc5..44155f61 100644 --- a/test/dialects/join-to-tests.ts +++ b/test/dialects/join-to-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const instance = new Sql('postgres'); const user = instance.define({ diff --git a/test/dialects/json-tests.ts b/test/dialects/json-tests.ts index 8346ca6b..7d8bcc16 100644 --- a/test/dialects/json-tests.ts +++ b/test/dialects/json-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const customer = Harness.defineCustomerTable(); Harness.test({ diff --git a/test/dialects/limit-and-offset-tests.ts b/test/dialects/limit-and-offset-tests.ts index 48b9a39a..6d8551c3 100644 --- a/test/dialects/limit-and-offset-tests.ts +++ b/test/dialects/limit-and-offset-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const user = Harness.defineUserTable(); // For compatibility with PostgreSQL, MySQL also supports the LIMIT row_count OFFSET offset syntax. diff --git a/test/dialects/literal-tests.ts b/test/dialects/literal-tests.ts index 44acc000..16c0fce9 100644 --- a/test/dialects/literal-tests.ts +++ b/test/dialects/literal-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const user = Harness.defineUserTable(); const instance = new Sql('postgres'); diff --git a/test/dialects/matches-test.ts b/test/dialects/matches-test.ts index 03efa13f..5ea5793a 100644 --- a/test/dialects/matches-test.ts +++ b/test/dialects/matches-test.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const post = Harness.definePostTable(); const instance = new Sql('postgres'); diff --git a/test/dialects/namespace-tests.ts b/test/dialects/namespace-tests.ts index 8e6afae6..87631c63 100644 --- a/test/dialects/namespace-tests.ts +++ b/test/dialects/namespace-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Table } from '../../lib/table'; +import * as Harness from './support.js'; +import { Table } from '../../dist/lib.js'; const user = Harness.defineUserTable(); const post = Harness.definePostTable(); diff --git a/test/dialects/not-in-clause-tests.ts b/test/dialects/not-in-clause-tests.ts index 9133d690..b933ab95 100644 --- a/test/dialects/not-in-clause-tests.ts +++ b/test/dialects/not-in-clause-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); Harness.test({ diff --git a/test/dialects/order-tests.ts b/test/dialects/order-tests.ts index a9426fd7..98035820 100644 --- a/test/dialects/order-tests.ts +++ b/test/dialects/order-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const post = Harness.definePostTable(); const instance = new Sql('postgres'); diff --git a/test/dialects/regex-tests.ts b/test/dialects/regex-tests.ts index b6553037..375d3119 100644 --- a/test/dialects/regex-tests.ts +++ b/test/dialects/regex-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const customer = Harness.defineCustomerTable(); Harness.test({ diff --git a/test/dialects/replace-tests.ts b/test/dialects/replace-tests.ts index 13b5cbaf..2dcd0ced 100644 --- a/test/dialects/replace-tests.ts +++ b/test/dialects/replace-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Table } from '../../lib/table'; +import * as Harness from './support.js'; +import { Table } from '../../dist/lib.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); const contentTable = Harness.defineContentTable(); diff --git a/test/dialects/returning-tests.ts b/test/dialects/returning-tests.ts index c22bbb64..3bfee9a2 100644 --- a/test/dialects/returning-tests.ts +++ b/test/dialects/returning-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const user = Harness.defineUserTable(); Harness.test({ diff --git a/test/dialects/row-tests.ts b/test/dialects/row-tests.ts index f1735035..0ad77761 100644 --- a/test/dialects/row-tests.ts +++ b/test/dialects/row-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const post = Harness.definePostTable(); const instance = new Sql('postgres'); diff --git a/test/dialects/schema-tests.ts b/test/dialects/schema-tests.ts index 928a339d..122f91e3 100644 --- a/test/dialects/schema-tests.ts +++ b/test/dialects/schema-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Table } from '../../lib/table'; +import * as Harness from './support.js'; +import { Table } from '../../dist/lib.js'; const userWithSchema = Table.define<{ id: number; name: string }>({ schema: 'staging', diff --git a/test/dialects/select-tests.ts b/test/dialects/select-tests.ts index 632b427c..de636879 100644 --- a/test/dialects/select-tests.ts +++ b/test/dialects/select-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); const customerAlias = Harness.defineCustomerAliasTable(); diff --git a/test/dialects/shortcut-tests.ts b/test/dialects/shortcut-tests.ts index cca655cb..903ad70e 100644 --- a/test/dialects/shortcut-tests.ts +++ b/test/dialects/shortcut-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); diff --git a/test/dialects/subfield-tests.ts b/test/dialects/subfield-tests.ts index 9f9a6f8a..7f1cdc68 100644 --- a/test/dialects/subfield-tests.ts +++ b/test/dialects/subfield-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const customerComposite = Harness.defineCustomerCompositeTable(); Harness.test({ diff --git a/test/dialects/subquery-tests.ts b/test/dialects/subquery-tests.ts index 612fedb2..3e836094 100644 --- a/test/dialects/subquery-tests.ts +++ b/test/dialects/subquery-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - -import * as Harness from './support'; -import { Sql } from '../../lib'; +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; const customer = Harness.defineCustomerTable(); const post = Harness.definePostTable(); const user = Harness.defineUserTable(); diff --git a/test/dialects/support.ts b/test/dialects/support.ts index ba48fa67..caf5c012 100644 --- a/test/dialects/support.ts +++ b/test/dialects/support.ts @@ -1,12 +1,6 @@ -'use strict'; import assert from 'assert'; -import { Mssql } from '../../lib/dialect/mssql'; -import { Mysql } from '../../lib/dialect/mysql'; -import { Oracle } from '../../lib/dialect/oracle'; -import { Postgres } from '../../lib/dialect/postgres'; -import { Sqlite } from '../../lib/dialect/sqlite'; -import { Table } from '../../lib/table'; +import { Mssql, Mysql, Oracle, Postgres, Sqlite, Table } from '../../dist/lib.js'; // specify dialect classes const dialects = { @@ -111,7 +105,7 @@ export interface CustomerTable { name: string; age: number; income: number; - metadata: object; + metadata: Record; } export function defineCustomerTable() { @@ -123,7 +117,7 @@ export function defineCustomerTable() { export interface CustomerCompositeTable { id: number; - info: object; + info: Record; } // This table defines the customer attributes as a composite field @@ -142,7 +136,7 @@ export interface CustomerAliasTable { name_alias: string; age_alias: number; income_alias: number; - metadata_alias: object; + metadata_alias: Record; } export function defineCustomerAliasTable() { diff --git a/test/dialects/table-tests.ts b/test/dialects/table-tests.ts index d6862cb0..7a267a0d 100644 --- a/test/dialects/table-tests.ts +++ b/test/dialects/table-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const user = Harness.defineUserTable(); Harness.test({ diff --git a/test/dialects/ternary-clause-tests.ts b/test/dialects/ternary-clause-tests.ts index 89b529da..8a79b919 100644 --- a/test/dialects/ternary-clause-tests.ts +++ b/test/dialects/ternary-clause-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const customer = Harness.defineCustomerTable(); const post = Harness.definePostTable(); diff --git a/test/dialects/tostring-tests.ts b/test/dialects/tostring-tests.ts index 5426c136..f999c2a4 100644 --- a/test/dialects/tostring-tests.ts +++ b/test/dialects/tostring-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - import assert from 'assert'; -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); // Null diff --git a/test/dialects/truncate-table-tests.ts b/test/dialects/truncate-table-tests.ts index 6c8bb7ee..343ebf27 100644 --- a/test/dialects/truncate-table-tests.ts +++ b/test/dialects/truncate-table-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); Harness.test({ diff --git a/test/dialects/unary-clause-tests.ts b/test/dialects/unary-clause-tests.ts index 407b123f..e8d53ea2 100644 --- a/test/dialects/unary-clause-tests.ts +++ b/test/dialects/unary-clause-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const customer = Harness.defineCustomerTable(); const post = Harness.definePostTable(); diff --git a/test/dialects/update-tests.ts b/test/dialects/update-tests.ts index 4673f51b..f0141991 100644 --- a/test/dialects/update-tests.ts +++ b/test/dialects/update-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const post = Harness.definePostTable(); const user = Harness.defineUserTable(); const variable = Harness.defineVariableTable(); diff --git a/test/dialects/value-expression-tests.ts b/test/dialects/value-expression-tests.ts index 2f9c9a15..24dff856 100644 --- a/test/dialects/value-expression-tests.ts +++ b/test/dialects/value-expression-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const customer = Harness.defineCustomerTable(); const post = Harness.definePostTable(); const variable = Harness.defineVariableTable(); diff --git a/test/dialects/where-clause-tests.ts b/test/dialects/where-clause-tests.ts index eda0c8d3..10a34afa 100644 --- a/test/dialects/where-clause-tests.ts +++ b/test/dialects/where-clause-tests.ts @@ -1,6 +1,4 @@ -'use strict'; - -import * as Harness from './support'; +import * as Harness from './support.js'; const user = Harness.defineUserTable(); Harness.test({ diff --git a/test/function-tests.ts b/test/function-tests.ts index 9008368a..2257cd30 100644 --- a/test/function-tests.ts +++ b/test/function-tests.ts @@ -1,7 +1,6 @@ -'use strict'; import { strictEqual } from 'assert'; -import { Sql } from '../lib'; +import { Sql } from '../dist/lib.js'; const instance = new Sql('postgres'); const user = instance.define<{ id: string; email: string; name: string; howOld: number }>({ diff --git a/test/index-tests.ts b/test/index-tests.ts index 420ef9c0..5a0f4f86 100644 --- a/test/index-tests.ts +++ b/test/index-tests.ts @@ -1,7 +1,6 @@ -'use strict'; import { throws, strictEqual, deepStrictEqual } from 'assert'; -import { Sql } from '../lib'; +import { Sql, Mysql, Mssql, Oracle, Postgres, Sqlite } from '../dist/lib.js'; const instance = new Sql(); const user = instance.define<{ id: string; email: string }>({ @@ -97,11 +96,11 @@ suite('index', function() { const sqlite = new Sql('sqlite'); const oracle = new Sql('oracle'); - strictEqual(mysql.dialect, require('../lib/dialect/mysql').Mysql); - strictEqual(postgres.dialect, require('../lib/dialect/postgres').Postgres); - strictEqual(sqlite.dialect, require('../lib/dialect/sqlite').Sqlite); - strictEqual(mssql.dialect, require('../lib/dialect/mssql').Mssql); - strictEqual(oracle.dialect, require('../lib/dialect/oracle').Oracle); + strictEqual(mysql.dialect, Mysql); + strictEqual(postgres.dialect, Postgres); + strictEqual(sqlite.dialect, Sqlite); + strictEqual(mssql.dialect, Mssql); + strictEqual(oracle.dialect, Oracle); }); test('override dialect for toQuery using dialect name', function() { diff --git a/test/index.ts b/test/index.ts deleted file mode 100644 index db82e92d..00000000 --- a/test/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -import { readdirSync } from 'fs'; -import { join, extname } from 'path'; - -const testDir = __dirname; - -const directories = [testDir + '/dialects']; - -directories.forEach((d) => { - const files = readdirSync(d); - for (const file of files) { - const filePath = join(d, file); - if (extname(file) === '.ts') { - require(filePath); - } - } -}); diff --git a/test/select-tests.ts b/test/select-tests.ts index eca53403..c82755a2 100644 --- a/test/select-tests.ts +++ b/test/select-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - import { strictEqual } from 'assert'; -import { SelectNode } from '../lib/node'; +import { SelectNode } from '../dist/lib.js'; const select = new SelectNode(); diff --git a/test/table-tests.ts b/test/table-tests.ts index 86cede8e..a7c5af52 100644 --- a/test/table-tests.ts +++ b/test/table-tests.ts @@ -1,10 +1,6 @@ -'use strict'; import assert, { strictEqual, ok, throws, doesNotThrow, notStrictEqual } from 'assert'; -import { Table } from '../lib/table'; -import { Column } from '../lib/column'; -import { Sql } from '../lib'; -import { ColumnNode, ModifierNode, ParameterNode } from '../lib/node'; +import { Table, Column, Sql, ColumnNode, ModifierNode, ParameterNode } from '../dist/lib.js'; suite('table', function() { const table = new Table({ diff --git a/test/ternary-clause-tests.ts b/test/ternary-clause-tests.ts index 809706d3..69ca303f 100644 --- a/test/ternary-clause-tests.ts +++ b/test/ternary-clause-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - import assert from 'assert'; -import { Table } from '../lib/table'; +import { Table } from '../dist/lib.js'; const Foo = Table.define<{ baz: string; bar: string }>({ name: 'foo', diff --git a/test/tsconfig.json b/test/tsconfig.json index 0533fb61..7424fd4b 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,4 +1,7 @@ { - "extends": "../tsconfig.cjs.json", - "include": ["./**/*.ts", "./**/*.js", "./**/*.d.ts"] + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../spec" + }, + "include": ["./*.ts", "./**/*.ts", "./**/*.js", "./**/*.d.ts"] } diff --git a/test/tslint.json b/test/tslint.json deleted file mode 100644 index 5fb21e30..00000000 --- a/test/tslint.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": ["../tslint.json"], - "rules": { - "only-arrow-functions": false, - "object-literal-sort-keys": false, - "max-classes-per-file": false - } -} diff --git a/test/unary-clause-tests.ts b/test/unary-clause-tests.ts index d5271d78..2accd93c 100644 --- a/test/unary-clause-tests.ts +++ b/test/unary-clause-tests.ts @@ -1,7 +1,5 @@ -'use strict'; - import assert from 'assert'; -import { Table } from '../lib/table'; +import { Table } from '../dist/lib.js'; const Foo = Table.define<{ baz: string; bar: string }>({ name: 'foo', diff --git a/test/value-expression-tests.ts b/test/value-expression-tests.ts deleted file mode 100644 index a40f2f37..00000000 --- a/test/value-expression-tests.ts +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -import assert from 'assert'; -import { valueExpressionMixin, Node } from '../lib/node/'; - -suite('value-expression', function() { - test('value expression mixin should not overwrite Node prototype properties', function() { - const mixin = valueExpressionMixin(); - - // make sure that the node class doesn't have any conflicting properties - for (const key in mixin) { - if (mixin.hasOwnProperty(key)) { - assert.strictEqual((Node.prototype as any)[key], undefined); - } - } - }); -}); diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..9e232a1c --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "baseUrl": "./lib", + "outDir": "./dist", + "declarationDir": "./dts" + }, + "include": ["./lib/**/*.ts"] +} \ No newline at end of file diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json deleted file mode 100644 index 87413745..00000000 --- a/tsconfig.cjs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "commonjs", - "outDir": "./dist/cjs", - "declaration": false - } -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 3fb894d3..31baff70 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,8 @@ { "compilerOptions": { "target": "es2016", - "module": "es2020", + "module": "esnext", "moduleResolution": "node", - "outDir": "./dist/esm", "resolveJsonModule": true, "esModuleInterop": true, "noEmitHelpers": true, @@ -17,11 +16,9 @@ "removeComments": false, "noImplicitReturns": true, "declaration": true, - "baseUrl": "./lib", "typeRoots": ["@types", "node_modules/@types"] }, - "include": ["./lib/**/*.ts", "./lib/**/*.js", "./lib/**/*.d.ts"], - "exclude": ["node_modules"], + "exclude": ["node_modules", "./dist"], "compileOnSave": true, "buildOnSave": true } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 847b313c..00000000 --- a/tslint.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": ["tslint:latest", "tslint-config-prettier"], - "rules": { - "interface-name": false, - "no-submodule-imports": [true, "lodash"] - } -} From 45c9659aa221b3aa6985d845e70d51d772892cda Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 29 Jun 2021 14:17:26 +1200 Subject: [PATCH 42/74] fix: cidc pipeline --- .github/workflows/nodejs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index f492ba99..efc4c194 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -16,7 +16,7 @@ jobs: run: npm install env: CI: true - - name: npm run test && npm run tsc - run: npm run test && npm run tsc + - name: npm run test + run: npm run test env: CI: true From b221e53d72460fd8f6368856d2ee6ae75091ba21 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 29 Jun 2021 14:20:07 +1200 Subject: [PATCH 43/74] fix: cicd pipeline --- .github/workflows/nodejs.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index efc4c194..bdf3afaa 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -12,6 +12,10 @@ jobs: uses: actions/setup-node@v1 with: node-version: '14' + - name: npm install --global rollup + run: npm install --global rollup + env: + CI: true - name: npm install run: npm install env: From 83d6093aa9a53d9d38913ac96968b4738c0f26e0 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 29 Jun 2021 14:22:43 +1200 Subject: [PATCH 44/74] chore: release --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2fe4326..9db4ff23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "5.2.3", + "version": "6.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ce5e7650..55676a0f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.2.3", + "version": "6.0.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 88e6c392f54c2ffa73bef47dd4750ea8429383c3 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 29 Jun 2021 14:35:26 +1200 Subject: [PATCH 45/74] fix: incorrect typings --- lib/dialect/dialect.ts | 2 +- lib/dialect/mysql.ts | 2 +- lib/dialect/oracle.ts | 2 +- lib/dialect/postgres.ts | 2 +- lib/dialect/sqlite.ts | 2 +- lib/node/query.ts | 4 ++-- lib/node/where.ts | 8 ++++---- lib/table.ts | 2 +- test/dialects/support.ts | 6 +++--- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/dialect/dialect.ts b/lib/dialect/dialect.ts index a7322643..13fff9d1 100644 --- a/lib/dialect/dialect.ts +++ b/lib/dialect/dialect.ts @@ -99,7 +99,7 @@ export abstract class Dialect { } public _getParameterValue( - value: null | boolean | number | string | any[] | Date | Buffer | Record, + value: null | boolean | number | string | any[] | Date | Buffer | Record, quoteChar?: string ): string | number { // handle primitives diff --git a/lib/dialect/mysql.ts b/lib/dialect/mysql.ts index e76dd664..da5850e2 100644 --- a/lib/dialect/mysql.ts +++ b/lib/dialect/mysql.ts @@ -32,7 +32,7 @@ export class Mysql extends Dialect { return '?'; } public _getParameterValue( - value: null | boolean | number | string | any[] | Date | Buffer | Record, + value: null | boolean | number | string | any[] | Date | Buffer | Record, quoteChar?: string ): string | number { return Buffer.isBuffer(value) diff --git a/lib/dialect/oracle.ts b/lib/dialect/oracle.ts index e521c12c..e768a305 100644 --- a/lib/dialect/oracle.ts +++ b/lib/dialect/oracle.ts @@ -32,7 +32,7 @@ export class Oracle extends Dialect { } public _getParameterValue( - value: null | boolean | number | string | any[] | Date | Buffer | Record, + value: null | boolean | number | string | any[] | Date | Buffer | Record, quoteChar?: string ): string | number { return Buffer.isBuffer(value) diff --git a/lib/dialect/postgres.ts b/lib/dialect/postgres.ts index 9b76342c..05a8c244 100644 --- a/lib/dialect/postgres.ts +++ b/lib/dialect/postgres.ts @@ -47,7 +47,7 @@ export class Postgres extends Dialect<{ nullOrder?: string }> { } public _getParameterValue( - value: null | boolean | number | string | any[] | Date | Buffer | Record, + value: null | boolean | number | string | any[] | Date | Buffer | Record, quoteChar?: string ): string | number { if ('object' === typeof value && Array.isArray(value)) { diff --git a/lib/dialect/sqlite.ts b/lib/dialect/sqlite.ts index 12d0bbc1..27cd0dce 100644 --- a/lib/dialect/sqlite.ts +++ b/lib/dialect/sqlite.ts @@ -32,7 +32,7 @@ export class Sqlite extends Dialect<{ dateTimeMillis?: boolean }> { return new Sqlite(this.config); } public _getParameterValue( - value: null | boolean | number | string | any[] | Date | Buffer | Record, + value: null | boolean | number | string | any[] | Date | Buffer | Record, quoteChar?: string ): string | number { if (Buffer.isBuffer(value)) { diff --git a/lib/node/query.ts b/lib/node/query.ts index bbaef028..cc24e77a 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -564,7 +564,7 @@ export class Query extends ValueExpressionBaseNode { } } -type SubQueryExtensions> = { +type SubQueryExtensions> = { join: (other: INodeable) => JoinNode; } & { columns: Column[] @@ -572,4 +572,4 @@ type SubQueryExtensions> = { [P in NonNullable]: Column }; -export type SubQuery> = Query & SubQueryExtensions; \ No newline at end of file +export type SubQuery> = Query & SubQueryExtensions; \ No newline at end of file diff --git a/lib/node/where.ts b/lib/node/where.ts index 5b18e28d..2db17e45 100644 --- a/lib/node/where.ts +++ b/lib/node/where.ts @@ -4,7 +4,7 @@ import { BinaryNode } from './binary.js'; import { Node } from './node.js'; import { TextNode } from './text.js'; -const normalizeNode = (table: Table, node: Node[] | Node | INodeable | Record | string): Node => { +const normalizeNode = (table: Table, node: Node[] | Node | INodeable | Record | string): Node => { if (typeof node === 'string') { return new TextNode(`(${node})`); } else if (Array.isArray(node)) { @@ -39,12 +39,12 @@ export class WhereNode extends Node { this.table = table; } - public add(node: Node[] | Node | INodeable | Record | string) { + public add(node: Node[] | Node | INodeable | Record | string) { const add = normalizeNode(this.table, node); return super.add(add); } - public or(other: Node | Record | string): void { + public or(other: Node | Record | string): void { const right = normalizeNode(this.table, other); // calling 'or' without an initial 'where' if (!this.nodes.length) { @@ -60,7 +60,7 @@ export class WhereNode extends Node { } } - public and(other: Node[] | Node | Record | string): void { + public and(other: Node[] | Node | Record | string): void { const right = normalizeNode(this.table, other); this.nodes.push( new BinaryNode({ diff --git a/lib/table.ts b/lib/table.ts index 3c10d667..b458b8eb 100644 --- a/lib/table.ts +++ b/lib/table.ts @@ -195,7 +195,7 @@ export class Table implements INodeable { } return query; } - public subQuery>(alias?: string): SubQuery { + public subQuery>(alias?: string): SubQuery { // create the query and pass it off const query = new Query(this, true) as SubQuery; query.columns = []; diff --git a/test/dialects/support.ts b/test/dialects/support.ts index caf5c012..ad0c9c95 100644 --- a/test/dialects/support.ts +++ b/test/dialects/support.ts @@ -105,7 +105,7 @@ export interface CustomerTable { name: string; age: number; income: number; - metadata: Record; + metadata: Record; } export function defineCustomerTable() { @@ -117,7 +117,7 @@ export function defineCustomerTable() { export interface CustomerCompositeTable { id: number; - info: Record; + info: Record; } // This table defines the customer attributes as a composite field @@ -136,7 +136,7 @@ export interface CustomerAliasTable { name_alias: string; age_alias: number; income_alias: number; - metadata_alias: Record; + metadata_alias: Record; } export function defineCustomerAliasTable() { From 73bd280a53970d245df6610d0a2d77e87e045dc2 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 29 Jun 2021 14:36:14 +1200 Subject: [PATCH 46/74] chore: release --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9db4ff23..a87e8f25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "6.0.0", + "version": "6.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 55676a0f..5b535a99 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "6.0.0", + "version": "6.0.1", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 2d9e3b9319a0f44d148fb1034a1bb71da9a2f254 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 22 Sep 2021 11:35:06 +1200 Subject: [PATCH 47/74] fix: remove unnecessary files from published package --- .npmignore | 4 ++++ package.json | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.npmignore b/.npmignore index 9ad0e6f7..7d28380f 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,5 @@ +.github/ +.vscode/ @types/ lib/ node_modules/ @@ -8,4 +10,6 @@ test/ .prettierrc .travis.yml runtests.js +rollup.config.js +tsconfig.build.json tsconfig.json \ No newline at end of file diff --git a/package.json b/package.json index 5b535a99..56fe42f0 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,7 @@ "url": "git://github.com/charsleysa/node-sql-ts.git" }, "type": "module", - "exports": { - "import": "./dist/lib.js" - }, - "main": "./dist/lib.js", + "exports": "./dist/lib.js", "types": "./dist/lib.d.ts", "scripts": { "pretest": "eslint --ext .ts ./lib && eslint --ext .ts ./test && rollup -c && tsc -p ./test/tsconfig.json", From 8c50c3e4b6d819cd073adf0e4ad453118a5267f9 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Wed, 22 Sep 2021 11:35:38 +1200 Subject: [PATCH 48/74] chore: release --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index a87e8f25..b8ecda22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "sql-ts", - "version": "6.0.1", + "version": "6.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 56fe42f0..481d4207 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "6.0.1", + "version": "6.0.2", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 5e7799becfaea6846b58cc7cc202e3f01ef4d002 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Fri, 8 Oct 2021 12:29:58 +1300 Subject: [PATCH 49/74] feat: expose creating parameters in Sql class --- lib/sql.ts | 6 +- package-lock.json | 1904 +++++++++++++++++++++++++++++++++- test/dialects/array-tests.ts | 9 + 3 files changed, 1917 insertions(+), 2 deletions(-) diff --git a/lib/sql.ts b/lib/sql.ts index 90946215..edd3ec10 100644 --- a/lib/sql.ts +++ b/lib/sql.ts @@ -6,7 +6,7 @@ import { Column } from './column'; import { ColumnDefinition, SQLDialects, TableDefinition } from './configTypes'; import { DEFAULT_DIALECT, getDialect } from './dialect'; import * as functions from './functions'; -import { ArrayCallNode, FunctionCallNode, RowCallNode, IntervalNode, LiteralNode, Query } from './node'; +import { ArrayCallNode, FunctionCallNode, RowCallNode, IntervalNode, LiteralNode, Query, ParameterNode } from './node'; import { Table, TableWithColumns } from './table'; export class Sql { @@ -81,4 +81,8 @@ export class Sql { public literal(literal: any): LiteralNode { return new LiteralNode(literal); } + // Create a parameter + public parameter(value: any): ParameterNode { + return new ParameterNode(value); + } } diff --git a/package-lock.json b/package-lock.json index c55b8e54..d04f9041 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,1910 @@ { "name": "sql-ts", "version": "5.2.3", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "sql-ts", + "version": "5.2.3", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "sliced": "~1.0.x", + "tslib": "~2.0.1" + }, + "devDependencies": { + "@types/lodash": "^4.14.160", + "@types/mocha": "^8.0.3", + "@types/node": "^12.0.0", + "mocha": "^8.1.2", + "ts-node": "^9.0.0", + "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "typescript": "^4.0.2" + }, + "engines": { + "node": "^12.0.0 || >=14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.160", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.160.tgz", + "integrity": "sha512-aP03BShJoO+WVndoVj/WNcB/YBPt+CIU1mvaao2GRAHy2yg4pT/XS4XnVHEQBjPJGycWf/9seKEO9vopTJGkvA==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz", + "integrity": "sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz", + "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "dependencies": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "deprecated": "Fixed a prototype pollution security issue in 4.1.0, please upgrade to ^4.1.1 or ^5.0.1.", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/iterate-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.2.tgz", + "integrity": "sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.2", + "debug": "4.1.1", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "object.assign": "4.1.0", + "promise.allsettled": "1.0.2", + "serialize-javascript": "4.0.0", + "strip-json-comments": "3.0.1", + "supports-color": "7.1.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.0", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.1" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/promise.allsettled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", + "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "dev": true, + "dependencies": { + "array.prototype.map": "^1.0.1", + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "iterate-value": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-node": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", + "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + }, + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint-config-prettier": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", + "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", + "dev": true, + "bin": { + "tslint-config-prettier-check": "bin/check.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/workerpool": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", + "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-unparser": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", + "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "decamelize": "^1.2.0", + "flat": "^4.1.0", + "is-plain-obj": "^1.1.0", + "yargs": "^14.2.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs-unparser/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-unparser/node_modules/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "node_modules/yargs-unparser/node_modules/yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.10.4", diff --git a/test/dialects/array-tests.ts b/test/dialects/array-tests.ts index cd1d9699..cdc4ce1e 100644 --- a/test/dialects/array-tests.ts +++ b/test/dialects/array-tests.ts @@ -62,6 +62,15 @@ Harness.test({ params: [2] }); +Harness.test({ + query: post.select(post.tags.overlap(instance.parameter(['nodejs', 'js']))), + pg: { + text: 'SELECT ("post"."tags" && $1) FROM "post"', + string: 'SELECT ("post"."tags" && \'{"nodejs","js"}\') FROM "post"' + }, + params: [['nodejs', 'js']] +}); + // Array literals Harness.test({ query: post.select(instance.array(1, 2, 3)), From 6dfc48a099e40d5faace14dde75718bac03d083b Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Fri, 8 Oct 2021 12:31:33 +1300 Subject: [PATCH 50/74] chore: release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d04f9041..48b416f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sql-ts", - "version": "5.2.3", + "version": "5.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sql-ts", - "version": "5.2.3", + "version": "5.3.0", "license": "MIT", "dependencies": { "lodash": "^4.17.20", diff --git a/package.json b/package.json index d41a987c..0487bd86 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.2.3", + "version": "5.3.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 5409dfbad0b7a7b29d9f9455fdbdd8fc458d4f78 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Fri, 8 Oct 2021 12:35:47 +1300 Subject: [PATCH 51/74] fix: merge issues --- package-lock.json | 6862 +++++++++++++++++++++++++++++++-------------- 1 file changed, 4809 insertions(+), 2053 deletions(-) diff --git a/package-lock.json b/package-lock.json index b45cb2bb..1a0ba657 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1274 +1,4180 @@ { "name": "sql-ts", "version": "6.0.2", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sql-ts", - "version": "5.3.0", + "version": "6.0.2", "license": "MIT", "dependencies": { - "lodash": "^4.17.20", + "lodash": "^4.17.21", "sliced": "~1.0.x", - "tslib": "~2.0.1" + "tslib": "~2.3.0" }, "devDependencies": { - "@types/lodash": "^4.14.160", - "@types/mocha": "^8.0.3", - "@types/node": "^12.0.0", - "mocha": "^8.1.2", - "ts-node": "^9.0.0", - "tslint": "^6.1.3", - "tslint-config-prettier": "^1.18.0", - "typescript": "^4.0.2" + "@rollup/plugin-typescript": "^8.2.1", + "@types/lodash": "^4.14.170", + "@types/mocha": "^8.2.2", + "@types/node": "^14.17.4", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", + "eslint": "^7.29.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-jsdoc": "^35.4.0", + "eslint-plugin-prefer-arrow": "^1.2.3", + "eslint-plugin-unicorn": "^33.0.1", + "mocha": "^9.0.1", + "rollup-plugin-delete": "^2.0.0", + "rollup-plugin-dts": "^3.0.2", + "ts-node": "^10.0.0", + "typescript": "^4.3.4" }, "engines": { - "node": "^12.0.0 || >=14.0.0" + "node": "^12.20.0 || >=14.15.0" } }, "node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true + "node_modules/@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "node_modules/@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.160", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.160.tgz", - "integrity": "sha512-aP03BShJoO+WVndoVj/WNcB/YBPt+CIU1mvaao2GRAHy2yg4pT/XS4XnVHEQBjPJGycWf/9seKEO9vopTJGkvA==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz", - "integrity": "sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==", - "dev": true - }, - "node_modules/@types/node": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz", - "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", - "dev": true + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "node_modules/@babel/eslint-parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.8.tgz", + "integrity": "sha512-fYP7QFngCvgxjUuw8O057SVH5jCXsbFFOoE77CFDcvzwBVgTOkMD/L4mIC5Ud1xf8chK/no2fRbSSn1wvNmKuQ==", "dev": true, + "dependencies": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, "engines": { - "node": ">=6" + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": ">=7.5.0" } }, - "node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "engines": { - "node": ">=4" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/array.prototype.map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", - "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "node_modules/@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.4" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, + "dependencies": { + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "node_modules/@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "@babel/types": "^7.15.4" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" + "node": ">=6.9.0" } }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "node_modules/@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "node_modules/@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=4" } }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "node_modules/@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true, + "engines": { + "node": ">= 12" + } }, - "node_modules/es-get-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", - "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", + "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", "dev": true, "dependencies": { - "es-abstract": "^1.17.4", - "has-symbols": "^1.0.1", - "is-arguments": "^1.0.4", - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-string": "^1.0.5", - "isarray": "^2.0.5" + "@cspotcode/source-map-consumer": "0.8.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=12" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/@es-joy/jsdoccomment": { + "version": "0.9.0-alpha.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz", + "integrity": "sha512-Clxxc0PwpISoYYBibA+1L2qFJ7gvFVhI2Hos87S06K+Q0cXdOhZQJNKWuaQGPAeHjZEuUB/YoWOfwjuF2wirqA==", "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "comment-parser": "1.1.6-beta.0", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@es-joy/jsdoccomment/node_modules/jsdoc-type-pratt-parser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz", + "integrity": "sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz", + "integrity": "sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0", + "tslib": "*", + "typescript": ">=3.7.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.175", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.175.tgz", + "integrity": "sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", + "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.17.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.21.tgz", + "integrity": "sha512-zv8ukKci1mrILYiQOwGSV4FpkZhyxQtuFWGya2GujWg+zVAeRQ4qbaMmWp9vb9889CFA8JECH7lkwCL6Ygg8kA==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", + "escalade": "^3.1.1", + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/comment-parser": { + "version": "1.1.6-beta.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.6-beta.0.tgz", + "integrity": "sha512-q3cA8TSMyqW7wcPSYWzbO/rMahnXgzs4SLG/UIWXdEsnXTFPZkEkWAdNgPiHig2OzxgpPLOh4WwsmClDxndwHw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "dependencies": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/del/node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.862", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz", + "integrity": "sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "35.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.5.1.tgz", + "integrity": "sha512-pPYPWtsykwVEue1tYEyoppBj4dgF7XicF67tLLLraY6RQYBq7qMKjUHji19+hfiTtYKKBD0YfeK8hgjPAE5viw==", + "dev": true, + "dependencies": { + "@es-joy/jsdoccomment": "0.9.0-alpha.1", + "comment-parser": "1.1.6-beta.0", + "debug": "^4.3.2", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "^1.0.4", + "lodash": "^4.17.21", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=2.0.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "33.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-33.0.1.tgz", + "integrity": "sha512-VxX/L/9DUEyB3D0v00185LrgsB5/fBwkgA4IC7ehHRu5hFSgA6VecmdpFybhsr4GQ/Y1iyXMHf6q+JKvcR2MwA==", + "dev": true, + "dependencies": { + "ci-info": "^3.1.1", + "clean-regexp": "^1.0.0", + "eslint-template-visitor": "^2.3.2", + "eslint-utils": "^3.0.0", + "import-modules": "^2.1.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.23", + "reserved-words": "^0.1.2", + "safe-regex": "^2.1.1", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=7.23.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-template-visitor": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz", + "integrity": "sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "eslint-visitor-keys": "^2.0.0", + "esquery": "^1.3.1", + "multimap": "^1.1.0" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-modules": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.1.0.tgz", + "integrity": "sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-builtin-module": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", + "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-builtin-module/node_modules/builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz", + "integrity": "sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mocha": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", + "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=0.3.1" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "deprecated": "Fixed a prototype pollution security issue in 4.1.0, please upgrade to ^4.1.1 or ^5.0.1.", + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "dev": true, - "dependencies": { - "is-buffer": "~2.0.3" - }, "bin": { - "flat": "cli.js" + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "node_modules/node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=0.10.0" } }, - "node_modules/function-bind": { + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, "engines": { - "node": ">= 6" + "node": ">= 0.8.0" } }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "node_modules/p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { - "node": ">=4.x" + "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=6" } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, "engines": { "node": ">=4" } }, - "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, - "bin": { - "he": "bin/he" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "engines": { + "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "node_modules/is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "find-up": "^2.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-fullwidth-code-point": { + "node_modules/pkg-dir/node_modules/locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, "engines": { "node": ">=4" } }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "p-try": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", - "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/pkg-dir/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true, "engines": { - "node": ">=0.12.0" + "node": ">=4" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dev": true, "dependencies": { - "has-symbols": "^1.0.1" + "find-up": "^2.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-set": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", - "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "node_modules/pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "node_modules/pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "node_modules/pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "has-symbols": "^1.0.1" + "p-try": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { + "node_modules/pkg-up/node_modules/p-locate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/iterate-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", - "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", - "dev": true - }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" + "p-limit": "^1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "node_modules/pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=4" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "node_modules/log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, - "dependencies": { - "chalk": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 0.8.0" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.4.0" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=6" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "safe-buffer": "^5.1.0" } }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "locate-path": "^2.0.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=4" } }, - "node_modules/mocha": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.2.tgz", - "integrity": "sha512-I8FRAcuACNMLQn3lS4qeWLxXqLvGf6r2CaLstDpZmMUUSmvW6Cnm1AuHxgbc7ctZVRcfwspCRbDHymPsi3dkJw==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.4.2", - "debug": "4.1.1", - "diff": "4.0.2", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "object.assign": "4.1.0", - "promise.allsettled": "1.0.2", - "serialize-javascript": "4.0.0", - "strip-json-comments": "3.0.1", - "supports-color": "7.1.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.0", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.1" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">= 10.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=4" } }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "p-try": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "pify": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "wrappy": "1" + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "node_modules/p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "node_modules/regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "regexp-tree": "bin/regexp-tree" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/regextras": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", + "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.1.14" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "node_modules/reserved-words": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", + "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", "dev": true }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, - "engines": { - "node": ">=8.6" + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/promise.allsettled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", - "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "array.prototype.map": "^1.0.1", - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "iterate-value": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8.10.0" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "node_modules/rollup": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", "dev": true, + "peer": true, + "bin": { + "rollup": "dist/bin/rollup" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/require-main-filename": { + "node_modules/rollup-plugin-delete": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", + "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", + "dev": true, + "dependencies": { + "del": "^5.1.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "node_modules/rollup-plugin-dts": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz", + "integrity": "sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw==", "dev": true, "dependencies": { - "path-parse": "^1.0.6" + "magic-string": "^0.25.7" + }, + "engines": { + "node": ">=v12.22.1" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/Swatinem" + }, + "optionalDependencies": { + "@babel/code-frame": "^7.12.13" + }, + "peerDependencies": { + "rollup": "^2.48.0", + "typescript": "^4.2.4" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -1283,7 +4189,25 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "dependencies": { + "regexp-tree": "~0.1.1" + } }, "node_modules/semver": { "version": "5.7.1", @@ -1295,18 +4219,106 @@ } }, "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, - "node_modules/set-blocking": { + "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/sliced": { @@ -1315,24 +4327,52 @@ "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, + "node_modules/spdx-license-ids": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1340,73 +4380,140 @@ "dev": true }, "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "ansi-regex": "^3.0.0" + "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "node_modules/table": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/table/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, "engines": { "node": ">=4" } @@ -1424,475 +4531,324 @@ } }, "node_modules/ts-node": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", - "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", + "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", "dev": true, "dependencies": { + "@cspotcode/source-map-support": "0.6.1", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" }, "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", "typescript": ">=2.7" - } - }, - "node_modules/tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" - }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", + "node_modules/ts-node/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true, "bin": { - "tslint-config-prettier-check": "bin/check.js" + "acorn": "bin/acorn" }, "engines": { - "node": ">=4.0.0" + "node": ">=0.4.0" } }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", "dev": true, "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "node_modules/typescript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", - "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "minimist": "^1.2.0" }, "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" + "json5": "lib/cli.js" } }, - "node_modules/workerpool": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", - "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", - "dev": true + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" + "node": ">=10" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs-unparser": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz", - "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==", + "node_modules/typescript": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "decamelize": "^1.2.0", - "flat": "^4.1.0", - "is-plain-obj": "^1.1.0", - "yargs": "^14.2.3" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" + "node": ">=4.2.0" } }, - "node_modules/yargs-unparser/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/yargs-unparser/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" + "punycode": "^2.1.0" } }, - "node_modules/yargs-unparser/node_modules/p-limit": { + "node_modules/v8-compile-cache": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, - "node_modules/yargs-unparser/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/yargs-unparser/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" + "node": ">= 8" } }, - "node_modules/yargs-unparser/node_modules/yargs-parser": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", - "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true }, - "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/yn": { @@ -1907,35 +4863,35 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.14.5" } }, "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", "dev": true }, "@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1944,59 +4900,18 @@ "source-map": "^0.5.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true } } }, "@babel/eslint-parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.14.7.tgz", - "integrity": "sha512-6WPwZqO5priAGIwV6msJcdc9TsEPzYeYdS/Xuoap+/ihkgN6dzHp2bcAAwyWZ5bLzk0vvjDmKvRwkqNaiJ8BiQ==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.8.tgz", + "integrity": "sha512-fYP7QFngCvgxjUuw8O057SVH5jCXsbFFOoE77CFDcvzwBVgTOkMD/L4mIC5Ud1xf8chK/no2fRbSSn1wvNmKuQ==", "dev": true, "requires": { "eslint-scope": "^5.1.1", @@ -2013,31 +4928,23 @@ } }, "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", "dev": true, "requires": { - "@babel/types": "^7.14.5", + "@babel/types": "^7.15.6", "jsesc": "^2.5.1", "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.14.5", + "@babel/compat-data": "^7.15.0", "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" @@ -2052,119 +4959,111 @@ } }, "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "dev": true - } + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" } }, "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/helper-validator-option": { @@ -2174,115 +5073,61 @@ "dev": true }, "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dev": true, "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "dev": true }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2292,38 +5137,53 @@ } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "dev": true - } } }, - "@es-joy/jsdoccomment": { + "@cspotcode/source-map-consumer": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.8.0.tgz", - "integrity": "sha512-Xd3GzYsL2sz2pcdtYt5Q0Wz1ol/o9Nt2UQL4nFPDcaEomvPmwjJsbjkKx1SKhl2h3TgwazNBLdcNr2m0UiGiFA==", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", + "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "dev": true, + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@es-joy/jsdoccomment": { + "version": "0.9.0-alpha.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz", + "integrity": "sha512-Clxxc0PwpISoYYBibA+1L2qFJ7gvFVhI2Hos87S06K+Q0cXdOhZQJNKWuaQGPAeHjZEuUB/YoWOfwjuF2wirqA==", "dev": true, "requires": { - "comment-parser": "^1.1.5", + "comment-parser": "1.1.6-beta.0", "esquery": "^1.4.0", "jsdoc-type-pratt-parser": "1.0.4" + }, + "dependencies": { + "jsdoc-type-pratt-parser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz", + "integrity": "sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ==", + "dev": true + } } }, "@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -2345,6 +5205,23 @@ } } }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2362,9 +5239,9 @@ "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", @@ -2372,9 +5249,9 @@ } }, "@rollup/plugin-typescript": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.1.tgz", - "integrity": "sha512-Qd2E1pleDR4bwyFxqbjt4eJf+wB0UKVMLc7/BAFDGVdAXQMCsD4DUv5/7/ww47BZCYxWtJqe1Lo0KVNswBJlRw==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz", + "integrity": "sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -2411,9 +5288,9 @@ "dev": true }, "@tsconfig/node16": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", - "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", "dev": true }, "@types/estree": { @@ -2423,9 +5300,9 @@ "dev": true }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -2433,9 +5310,9 @@ } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/json5": { @@ -2445,45 +5322,46 @@ "dev": true }, "@types/lodash": { - "version": "4.14.170", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", - "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==", + "version": "4.14.175", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.175.tgz", + "integrity": "sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==", "dev": true }, "@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/mocha": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.2.tgz", - "integrity": "sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", + "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", "dev": true }, "@types/node": { - "version": "14.17.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz", - "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==", + "version": "14.17.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.21.tgz", + "integrity": "sha512-zv8ukKci1mrILYiQOwGSV4FpkZhyxQtuFWGya2GujWg+zVAeRQ4qbaMmWp9vb9889CFA8JECH7lkwCL6Ygg8kA==", "dev": true }, "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz", - "integrity": "sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.28.0", - "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", "regexpp": "^3.1.0", "semver": "^7.3.5", "tsutils": "^3.21.0" @@ -2516,55 +5394,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", - "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", "dev": true, "requires": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.0", - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/typescript-estree": "4.28.0", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.0.tgz", - "integrity": "sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.28.0", - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/typescript-estree": "4.28.0", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", "debug": "^4.3.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", - "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0" + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" } }, "@typescript-eslint/types": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", - "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", - "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -2599,12 +5477,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", - "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" } }, @@ -2621,9 +5499,16 @@ "dev": true }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, "aggregate-error": { @@ -2655,9 +5540,9 @@ "dev": true }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -2695,16 +5580,16 @@ } }, "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", + "es-abstract": "^1.19.1", "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" + "is-string": "^1.0.7" } }, "array-union": { @@ -2714,14 +5599,14 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", + "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" + "es-abstract": "^1.19.0" } }, "astral-regex": { @@ -2768,24 +5653,18 @@ "dev": true }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2809,9 +5688,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001240", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz", - "integrity": "sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==", + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", "dev": true }, "chalk": { @@ -2826,19 +5705,19 @@ } }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "ci-info": { @@ -2871,40 +5750,6 @@ "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "color-convert": { @@ -2922,16 +5767,10 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, "comment-parser": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.5.tgz", - "integrity": "sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA==", + "version": "1.1.6-beta.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.6-beta.0.tgz", + "integrity": "sha512-q3cA8TSMyqW7wcPSYWzbO/rMahnXgzs4SLG/UIWXdEsnXTFPZkEkWAdNgPiHig2OzxgpPLOh4WwsmClDxndwHw==", "dev": true }, "concat-map": { @@ -2947,14 +5786,6 @@ "dev": true, "requires": { "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } } }, "create-require": { @@ -2975,20 +5806,12 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "decamelize": { @@ -2998,9 +5821,9 @@ "dev": true }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "define-properties": { @@ -3071,9 +5894,9 @@ } }, "electron-to-chromium": { - "version": "1.3.759", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.759.tgz", - "integrity": "sha512-nM76xH0t2FBH5iMEZDVc3S/qbdKjGH7TThezxC8k1Q7w7WHvIAyJh8lAe2UamGfdRqBTjHfPDn82LJ0ksCiB9g==", + "version": "1.3.862", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz", + "integrity": "sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg==", "dev": true }, "emoji-regex": { @@ -3101,22 +5924,26 @@ } }, "es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -3148,13 +5975,14 @@ "dev": true }, "eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3201,13 +6029,7 @@ "dev": true, "requires": { "@babel/highlight": "^7.10.4" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + } }, "ansi-styles": { "version": "4.3.0", @@ -3219,9 +6041,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -3287,15 +6109,6 @@ "lru-cache": "^6.0.0" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3311,39 +6124,34 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, "eslint-module-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", - "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", "dev": true, "requires": { "debug": "^3.2.7", @@ -3362,26 +6170,26 @@ } }, "eslint-plugin-import": { - "version": "2.23.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", - "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, "requires": { "array-includes": "^3.1.3", "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.1", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", "find-up": "^2.0.0", "has": "^1.0.3", - "is-core-module": "^2.4.0", + "is-core-module": "^2.6.0", "minimatch": "^3.0.4", - "object.values": "^1.1.3", + "object.values": "^1.1.4", "pkg-up": "^2.0.0", "read-pkg-up": "^3.0.0", "resolve": "^1.20.0", - "tsconfig-paths": "^3.9.0" + "tsconfig-paths": "^3.11.0" }, "dependencies": { "debug": { @@ -3445,33 +6253,29 @@ "p-limit": "^1.1.0" } }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } } } }, "eslint-plugin-jsdoc": { - "version": "35.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.4.0.tgz", - "integrity": "sha512-0cr+NkPTxpTiMCtYOd8W5fd2IyC/CmaTHKb+0bzkpP9p8HfmJ3B2/M6FWj97rQJOLwLMkx+g2MIEZsrttpbFmQ==", + "version": "35.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.5.1.tgz", + "integrity": "sha512-pPYPWtsykwVEue1tYEyoppBj4dgF7XicF67tLLLraY6RQYBq7qMKjUHji19+hfiTtYKKBD0YfeK8hgjPAE5viw==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "^0.8.0-alpha.2", - "comment-parser": "1.1.5", - "debug": "^4.3.1", + "@es-joy/jsdoccomment": "0.9.0-alpha.1", + "comment-parser": "1.1.6-beta.0", + "debug": "^4.3.2", "esquery": "^1.4.0", "jsdoc-type-pratt-parser": "^1.0.4", "lodash": "^4.17.21", @@ -3495,7 +6299,8 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-unicorn": { "version": "33.0.1", @@ -3555,12 +6360,6 @@ "p-limit": "^2.2.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -3743,9 +6542,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz", - "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -3768,9 +6567,9 @@ "dev": true }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -3821,9 +6620,9 @@ } }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, "fs.realpath": { @@ -3874,10 +6673,20 @@ "has-symbols": "^1.0.1" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3898,9 +6707,9 @@ } }, "globals": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz", - "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -3921,9 +6730,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "growl": { @@ -3959,6 +6768,15 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -4021,6 +6839,17 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4028,10 +6857,13 @@ "dev": true }, "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "dev": true + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } }, "is-binary-path": { "version": "2.1.0", @@ -4043,12 +6875,13 @@ } }, "is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-builtin-module": { @@ -4069,25 +6902,28 @@ } }, "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", + "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-extglob": { "version": "2.1.1", @@ -4096,9 +6932,9 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-glob": { @@ -4123,10 +6959,13 @@ "dev": true }, "is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-path-cwd": { "version": "2.2.0", @@ -4147,21 +6986,30 @@ "dev": true }, "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" + "has-tostringtag": "^1.0.0" } }, - "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", @@ -4177,6 +7025,15 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4200,9 +7057,9 @@ } }, "jsdoc-type-pratt-parser": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz", - "integrity": "sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz", + "integrity": "sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg==", "dev": true }, "jsesc": { @@ -4236,12 +7093,12 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" } }, "levn": { @@ -4324,9 +7181,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4421,16 +7278,16 @@ "dev": true }, "mocha": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.0.1.tgz", - "integrity": "sha512-9zwsavlRO+5csZu6iRtl3GHImAbhERoDsZwdRkdJ/bE+eVplmoxNKE901ZJ9LdSchYBjSCPbjKc5XvcAri2ylw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", + "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", @@ -4441,13 +7298,12 @@ "log-symbols": "4.1.0", "minimatch": "3.0.4", "ms": "2.1.3", - "nanoid": "3.1.23", - "serialize-javascript": "5.0.1", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.4", + "workerpool": "6.1.5", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -4471,20 +7327,6 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4500,6 +7342,12 @@ "argparse": "^2.0.1" } }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -4512,9 +7360,9 @@ } }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "multimap": { @@ -4524,9 +7372,9 @@ "dev": true }, "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "dev": true }, "natural-compare": { @@ -4536,9 +7384,9 @@ "dev": true }, "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", "dev": true }, "normalize-package-data": { @@ -4560,9 +7408,9 @@ "dev": true }, "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "dev": true }, "object-keys": { @@ -4584,14 +7432,14 @@ } }, "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "es-abstract": "^1.19.1" } }, "once": { @@ -4618,12 +7466,12 @@ } }, "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", "dev": true, "requires": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -4645,9 +7493,9 @@ } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "parent-module": { @@ -4699,6 +7547,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -4757,6 +7611,12 @@ "p-limit": "^1.1.0" } }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -4811,6 +7671,12 @@ "p-limit": "^1.1.0" } }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -4927,6 +7793,12 @@ "p-limit": "^1.1.0" } }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -4936,18 +7808,18 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" } }, "regexp-tree": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.23.tgz", - "integrity": "sha512-+7HWfb4Bvu8Rs2eQTUIpX9I/PlQkYOuTNbRpKLJlQpSgwSkzFYh+pUj0gtvglnOZLKB6YgnIgRuJ2/IlpL48qw==", + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", "dev": true }, "regexpp": { @@ -4981,11 +7853,12 @@ "dev": true }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -5010,6 +7883,16 @@ "glob": "^7.1.3" } }, + "rollup": { + "version": "2.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", + "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", + "dev": true, + "peer": true, + "requires": { + "fsevents": "~2.3.2" + } + }, "rollup-plugin-delete": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", @@ -5027,37 +7910,6 @@ "requires": { "@babel/code-frame": "^7.12.13", "magic-string": "^0.25.7" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dev": true, - "optional": true, - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "dev": true, - "optional": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "optional": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } } }, "run-parallel": { @@ -5070,9 +7922,9 @@ } }, "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex": { @@ -5091,9 +7943,9 @@ "dev": true }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -5114,6 +7966,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -5154,12 +8017,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true } } }, @@ -5169,21 +8026,11 @@ "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -5217,9 +8064,9 @@ } }, "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", "dev": true }, "sprintf-js": { @@ -5229,13 +8076,14 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "string.prototype.trimend": { @@ -5259,12 +8107,12 @@ } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -5289,23 +8137,23 @@ } }, "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", "dev": true, "requires": { "ajv": "^8.0.1", "lodash.clonedeep": "^4.5.0", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "dependencies": { "ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", - "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5314,43 +8162,11 @@ "uri-js": "^4.2.2" } }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } } } }, @@ -5376,39 +8192,60 @@ } }, "ts-node": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz", - "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", + "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", "dev": true, "requires": { + "@cspotcode/source-map-support": "0.6.1", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.1", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", "yn": "3.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + } } }, "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", "minimist": "^1.2.0", "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } } }, "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "type-check": { "version": "0.4.0", @@ -5426,9 +8263,9 @@ "dev": true }, "typescript": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", - "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", "dev": true }, "unbox-primitive": { @@ -5490,15 +8327,6 @@ "is-symbol": "^1.0.3" } }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -5506,9 +8334,9 @@ "dev": true }, "workerpool": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.4.tgz", - "integrity": "sha512-jGWPzsUqzkow8HoAvqaPWTUPCrlPJaJ5tY8Iz7n1uCz3tTp6s3CDG0FF1NsX42WNlkRSW6Mr+CDZGnNoSsKa7g==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", "dev": true }, "wrap-ansi": { @@ -5522,12 +8350,6 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5551,32 +8373,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } } } }, @@ -5611,40 +8407,6 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "yargs-parser": { @@ -5670,12 +8432,6 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } } } From 1f6f3646756453a6195db00c396abb0f13520ea7 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Fri, 8 Oct 2021 12:36:52 +1300 Subject: [PATCH 52/74] chore: release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a0ba657..25b6d595 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sql-ts", - "version": "6.0.2", + "version": "6.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sql-ts", - "version": "6.0.2", + "version": "6.1.0", "license": "MIT", "dependencies": { "lodash": "^4.17.21", diff --git a/package.json b/package.json index 481d4207..66a20be3 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "6.0.2", + "version": "6.1.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 9690355d108081cf71c305319b0d571ad50d7927 Mon Sep 17 00:00:00 2001 From: Henry Stanford <30746076+hstanford@users.noreply.github.com> Date: Mon, 13 Jun 2022 08:34:21 +0100 Subject: [PATCH 53/74] feat: add support for custom unary, binary and ternary operators (#9) * feat: add support for custom unary, binary and ternary operators * feat: adds custom operator creation to main export and to mixin * refactor: remove unused import statements * feat: separate implementations of global and mixin generic operators * style: newline at end of prefixUnary.ts --- lib/node/_internal.ts | 1 + lib/node/operator.ts | 54 +++++++++++++++++++++++ lib/node/prefixUnary.ts | 4 +- lib/node/valueExpression.ts | 39 ++++++++++++++++- lib/sql.ts | 11 +++++ test/operator-tests.ts | 87 +++++++++++++++++++++++++++++++++++++ 6 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 lib/node/operator.ts create mode 100644 test/operator-tests.ts diff --git a/lib/node/_internal.ts b/lib/node/_internal.ts index 14409a79..6b30ef4c 100644 --- a/lib/node/_internal.ts +++ b/lib/node/_internal.ts @@ -7,5 +7,6 @@ export * from './in.js'; export * from './notIn.js'; export * from './orderByValue.js'; export * from './postfixUnary.js'; +export * from './prefixUnary.js'; export * from './slice.js'; export * from './ternary.js'; diff --git a/lib/node/operator.ts b/lib/node/operator.ts new file mode 100644 index 00000000..759cc4d8 --- /dev/null +++ b/lib/node/operator.ts @@ -0,0 +1,54 @@ +import { BinaryNode, PostfixUnaryNode, PrefixUnaryNode, TernaryNode } from './_internal.js'; +import { Node } from './node.js'; +import { ParameterNode } from './parameter.js'; + +// Process values, wrapping them in ParameterNode if necessary. +const processParam = (val: unknown): Node => { + if (Array.isArray(val)) { + throw new Error('expected single value'); + } + return ParameterNode.getNodeOrParameterNode(val); +}; +const processParamOrParams = (val: any): Node | Node[] => { + return Array.isArray(val) ? val.map(ParameterNode.getNodeOrParameterNode) : ParameterNode.getNodeOrParameterNode(val); +}; + +export const prefixUnaryOperator = (operator: string) => { + return (left: any): PrefixUnaryNode => { + return new PrefixUnaryNode({ + left: processParam(left), + operator, + }); + }; +}; + +export const postfixUnaryOperator = (operator: string) => { + return (left: any): PostfixUnaryNode => { + return new PostfixUnaryNode({ + left: processParam(left), + operator, + }); + }; +}; + +export const binaryOperator = (operator: string) => { + return (left: any, val: any): BinaryNode => { + return new BinaryNode({ + left: processParam(left), + operator, + right: processParamOrParams(val), + }); + }; +}; + +export const ternaryOperator = (operator: string, separator: string) => { + return (left: any, middle: any, right: any): TernaryNode => { + return new TernaryNode({ + left: processParam(left), + operator, + middle: processParam(middle), + separator, + right: processParam(right), + }); + }; +}; diff --git a/lib/node/prefixUnary.ts b/lib/node/prefixUnary.ts index 1fbeecff..ccbd9e8c 100644 --- a/lib/node/prefixUnary.ts +++ b/lib/node/prefixUnary.ts @@ -1,6 +1,6 @@ import { AliasMixin } from './alias.js'; import { Node } from './node.js'; -import { ValueExpressionNode } from './_internal.js'; +import { classMap, ValueExpressionNode } from './_internal.js'; export class PrefixUnaryNode extends ValueExpressionNode { public left: Node; @@ -13,3 +13,5 @@ export class PrefixUnaryNode extends ValueExpressionNode { public as = AliasMixin.as; } + +classMap.set('PREFIX UNARY', PrefixUnaryNode); diff --git a/lib/node/valueExpression.ts b/lib/node/valueExpression.ts index 08f931ca..dab8fb75 100644 --- a/lib/node/valueExpression.ts +++ b/lib/node/valueExpression.ts @@ -9,6 +9,7 @@ import type { NotInNode, OrderByValueNode, PostfixUnaryNode, + PrefixUnaryNode, SliceNode, TernaryNode } from './_internal.js'; @@ -127,7 +128,43 @@ export function ValueExpressionBaseMixin(def: TableDefinition): TableWithColumns { def = defaults(def || {}, { diff --git a/test/operator-tests.ts b/test/operator-tests.ts new file mode 100644 index 00000000..6374f930 --- /dev/null +++ b/test/operator-tests.ts @@ -0,0 +1,87 @@ +import { strictEqual } from 'assert'; + +import { Sql } from '../dist/lib.js'; +const instance = new Sql('postgres'); + +const user = instance.define<{ id: string; email: string; name: string; howOld: number }>({ + name: 'user', + columns: [{ name: 'id' }, { name: 'email' }, { name: 'name' }, { name: 'age', property: 'howOld' }] +}); + +suite('operator', function() { + // PREFIX UNARY + test('creating a prefix unary operator works', function() { + const not = instance.prefixUnaryOperator('NOT'); + const operator = not(user.id).toQuery(); + + strictEqual(operator.text, '(NOT "user"."id")'); + }); + + test('creating a prefix unary operator works with a parameter', function() { + const not = instance.prefixUnaryOperator('NOT'); + const operator = not('hello').toQuery(); + + strictEqual(operator.text, '(NOT $1)'); + strictEqual(operator.values[0], 'hello'); + }); + + test('creating a prefix unary operator works via the mixin', function() { + const operator = user.id.prefixUnaryOperator('NOT').toQuery(); + + strictEqual(operator.text, '(NOT "user"."id")'); + }); + + // POSTFIX UNARY + test('creating a postfix unary operator works', function() { + const isNull = instance.postfixUnaryOperator('IS NULL'); + const operator = isNull(user.id).toQuery(); + + strictEqual(operator.text, '("user"."id" IS NULL)'); + }); + + test('creating a postfix unary operator works with a parameter', function() { + const isNull = instance.postfixUnaryOperator('IS NULL'); + const operator = isNull('hello').toQuery(); + + strictEqual(operator.text, '($1 IS NULL)'); + strictEqual(operator.values[0], 'hello'); + }); + + test('creating a postfix unary operator works via the mixin', function() { + const operator = user.id.postfixUnaryOperator('IS NOT NULL').toQuery(); + + strictEqual(operator.text, '("user"."id" IS NOT NULL)'); + }); + + // BINARY + test('creating a binary operator works', function() { + const lt = instance.binaryOperator('<'); + const operator = lt(user.id, 3).toQuery(); + + strictEqual(operator.text, '("user"."id" < $1)'); + strictEqual(operator.values[0], 3); + }); + + test('creating a binary operator works via the mixin', function() { + const operator = user.id.binaryOperator('<->', 3).toQuery(); + + strictEqual(operator.text, '("user"."id" <-> $1)'); + strictEqual(operator.values[0], 3); + }); + + // TERNARY + test('creating a ternary operator works', function() { + const between = instance.ternaryOperator('BETWEEN', 'AND'); + const operator = between(user.id, 3, user.id).toQuery(); + + strictEqual(operator.text, '("user"."id" BETWEEN $1 AND "user"."id")'); + strictEqual(operator.values[0], 3); + }); + + test('creating a ternary operator works via the mixin', function() { + const operator = user.id.ternaryOperator('BETWEEN', 3, 'AND', user.id).toQuery(); + + strictEqual(operator.text, '("user"."id" BETWEEN $1 AND "user"."id")'); + strictEqual(operator.values[0], 3); + }); +}); From 85151d595844d3f9c5e64a0aa5800f7d249f684e Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 14 Jun 2022 13:44:03 +1200 Subject: [PATCH 54/74] chore: update packages --- package-lock.json | 147 +++++++++++++++++++++++++++------------------- 1 file changed, 87 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index 25b6d595..a6b4ca36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1186,10 +1186,16 @@ } }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -1304,9 +1310,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -2457,9 +2463,9 @@ } }, "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -3281,38 +3287,38 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/mocha": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", - "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", + "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -3377,6 +3383,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -3411,9 +3429,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -3638,9 +3656,9 @@ } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/path-type": { @@ -4733,9 +4751,9 @@ } }, "node_modules/workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", "dev": true }, "node_modules/wrap-ansi": { @@ -5705,9 +5723,9 @@ } }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -5806,9 +5824,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -6684,9 +6702,9 @@ } }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -7272,38 +7290,38 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mocha": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", - "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", + "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -7342,6 +7360,15 @@ "argparse": "^2.0.1" } }, + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -7372,9 +7399,9 @@ "dev": true }, "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true }, "natural-compare": { @@ -7536,9 +7563,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { @@ -8334,9 +8361,9 @@ "dev": true }, "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", "dev": true }, "wrap-ansi": { From bf02f568d5fd502c1fb6cddef77030da7d6cec99 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 14 Jun 2022 13:45:43 +1200 Subject: [PATCH 55/74] chore: update packages --- package-lock.json | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6b4ca36..be9a19d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1162,14 +1162,20 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001265", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", - "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "version": "1.0.30001352", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", + "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/chalk": { "version": "2.4.2", @@ -5706,9 +5712,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001265", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", - "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "version": "1.0.30001352", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", + "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", "dev": true }, "chalk": { From 2159d3b6ab82298871d3e6be595fd91f5ad9c8f6 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Tue, 14 Jun 2022 13:46:16 +1200 Subject: [PATCH 56/74] chore: release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index be9a19d4..96b2a613 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sql-ts", - "version": "6.1.0", + "version": "6.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sql-ts", - "version": "6.1.0", + "version": "6.2.0", "license": "MIT", "dependencies": { "lodash": "^4.17.21", diff --git a/package.json b/package.json index 66a20be3..b800565b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "6.1.0", + "version": "6.2.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 13028768e5b63e291d3ad69b432cdb03663356eb Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Fri, 3 Feb 2023 17:28:28 +1300 Subject: [PATCH 57/74] fix: distinctOn should not use alias or property --- lib/dialect/postgres.ts | 9 +++++++-- test/dialects/distinct-on-tests.ts | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/dialect/postgres.ts b/lib/dialect/postgres.ts index 233baaf2..18c236a7 100644 --- a/lib/dialect/postgres.ts +++ b/lib/dialect/postgres.ts @@ -128,6 +128,7 @@ export class Postgres extends Dialect { protected visitingReturning: boolean = false; protected visitingJoin: boolean = false; protected visitingFunctionCall: boolean = false; + protected visitingDistinctOn: boolean = false; constructor(config: any) { super(config); this.output = []; @@ -472,7 +473,10 @@ export class Postgres extends Dialect { return []; } public visitDistinctOn(distinctOnNode: DistinctOnNode): string[] { - return [`DISTINCT ON(${distinctOnNode.nodes.map((n) => this.visit(n).join()).join(', ')})`]; + this.visitingDistinctOn = true; + const result: string[] = [`DISTINCT ON(${distinctOnNode.nodes.map((n) => this.visit(n).join()).join(', ')})`]; + this.visitingDistinctOn = false; + return result; } public visitAlias(aliasNode: AliasNode): string[] { const result = [this.visit(aliasNode.value) + this.aliasText + this.quote(aliasNode.alias)]; @@ -774,6 +778,7 @@ export class Postgres extends Dialect { !this.visitingJoin); const inFunctionCall = this.visitingFunctionCall; const inCast = this.visitingCast; + const inDistinctOn = this.visitingDistinctOn; const txt = []; let closeParen = 0; if (inSelectClause && ((table && !table.alias) || !!columnNode.alias)) { @@ -847,7 +852,7 @@ export class Postgres extends Dialect { txt.push(')'); } } - if (inSelectClause && !inFunctionCall && !inCast && (columnNode.alias || columnNode.property !== columnNode.name)) { + if (inSelectClause && !inFunctionCall && !inCast && !inDistinctOn && (columnNode.alias || columnNode.property !== columnNode.name)) { txt.push(this.aliasText + this.quote(columnNode.alias || columnNode.property)); } if (this.visitingCreate || this.visitingAddColumn) { diff --git a/test/dialects/distinct-on-tests.ts b/test/dialects/distinct-on-tests.ts index d72d0b8d..ed2967fc 100644 --- a/test/dialects/distinct-on-tests.ts +++ b/test/dialects/distinct-on-tests.ts @@ -2,6 +2,7 @@ import * as Harness from './support'; const user = Harness.defineUserTable(); +const customerAlias = Harness.defineCustomerAliasTable(); Harness.test({ query: user.select().distinctOn(user.id), @@ -13,10 +14,19 @@ Harness.test({ }); Harness.test({ - query: user.select(user.id, user.name).distinctOn(user.id), + query: customerAlias.select().distinctOn(customerAlias.id_alias), pg: { - text: 'SELECT DISTINCT ON("user"."id") "user"."id", "user"."name" FROM "user"', - string: 'SELECT DISTINCT ON("user"."id") "user"."id", "user"."name" FROM "user"' + text: 'SELECT DISTINCT ON("customer"."id") "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"', + string: 'SELECT DISTINCT ON("customer"."id") "customer"."id" AS "id_alias", "customer"."name" AS "name_alias", "customer"."age" AS "age_alias", "customer"."income" AS "income_alias", "customer"."metadata" AS "metadata_alias" FROM "customer"' + }, + params: [] +}); + +Harness.test({ + query: customerAlias.select(customerAlias.id_alias, customerAlias.name_alias).distinctOn(customerAlias.id_alias), + pg: { + text: 'SELECT DISTINCT ON("customer"."id") "customer"."id" AS "id_alias", "customer"."name" AS "name_alias" FROM "customer"', + string: 'SELECT DISTINCT ON("customer"."id") "customer"."id" AS "id_alias", "customer"."name" AS "name_alias" FROM "customer"' }, params: [] }); From 270414248f95dacafb5272e6669be65254d98f6b Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Fri, 3 Feb 2023 17:29:00 +1300 Subject: [PATCH 58/74] chore: release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 48b416f4..a26c0536 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sql-ts", - "version": "5.3.0", + "version": "5.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sql-ts", - "version": "5.3.0", + "version": "5.4.0", "license": "MIT", "dependencies": { "lodash": "^4.17.20", diff --git a/package.json b/package.json index 0487bd86..b0715080 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "5.3.0", + "version": "5.4.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 8a471d2ec3d23cb2e8615da50f2773e9ef3c40c3 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Fri, 3 Feb 2023 17:32:32 +1300 Subject: [PATCH 59/74] chore: update packages --- package-lock.json | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 96b2a613..ff759db5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3059,13 +3059,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -3281,9 +3278,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -4623,9 +4620,9 @@ } }, "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -7117,13 +7114,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "levn": { "version": "0.4.1", @@ -7287,9 +7281,9 @@ } }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -8265,9 +8259,9 @@ }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" From 7ebff284d0317f16d60864bcfaaedf29ff64bbd3 Mon Sep 17 00:00:00 2001 From: Henry Stanford <30746076+hstanford@users.noreply.github.com> Date: Fri, 3 Feb 2023 04:43:54 +0000 Subject: [PATCH 60/74] feat: enable calling .onConflict() without any args (#11) Co-authored-by: Stefan Charsley --- lib/node/onConflict.ts | 2 +- lib/node/query.ts | 2 +- test/dialects/insert-tests.ts | 26 ++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/node/onConflict.ts b/lib/node/onConflict.ts index 66337115..368751de 100644 --- a/lib/node/onConflict.ts +++ b/lib/node/onConflict.ts @@ -5,7 +5,7 @@ export class OnConflictNode extends Node { public constraint?: string; public update?: string[]; - constructor(config: { columns?: string[]; constraint?: string; update?: string[] }) { + constructor(config: { columns?: string[]; constraint?: string; update?: string[] } = {}) { super('ONCONFLICT'); this.columns = config.columns; this.constraint = config.constraint; diff --git a/lib/node/query.ts b/lib/node/query.ts index cc24e77a..bd596048 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -361,7 +361,7 @@ export class Query extends ValueExpressionBaseNode { return this.add(onDuplicate); } - public onConflict(options: { constraint: string; update?: string[] } | { columns: string[]; update?: string[] }): this { + public onConflict(options?: { constraint: string; update?: string[] } | { columns: string[]; update?: string[] }): this { const onConflict = new OnConflictNode(options); return this.add(onConflict); } diff --git a/test/dialects/insert-tests.ts b/test/dialects/insert-tests.ts index 0ce9bb68..a545af82 100644 --- a/test/dialects/insert-tests.ts +++ b/test/dialects/insert-tests.ts @@ -901,6 +901,32 @@ Harness.test({ params: ['test', 2] }); +Harness.test({ + query: post + .insert({ + content: 'test', + userId: 2 + }) + .onConflict(), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT DO NOTHING', + string: 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT DO NOTHING' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2] +}); + Harness.test({ query: post .insert({ From 98de8000f275c9f8b8397d92fba8dd634a30be91 Mon Sep 17 00:00:00 2001 From: Stefan Andres Charsley Date: Fri, 3 Feb 2023 17:45:48 +1300 Subject: [PATCH 61/74] chore: release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff759db5..e6008f84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sql-ts", - "version": "6.2.0", + "version": "6.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sql-ts", - "version": "6.2.0", + "version": "6.3.0", "license": "MIT", "dependencies": { "lodash": "^4.17.21", diff --git a/package.json b/package.json index b800565b..83435ef6 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "6.2.0", + "version": "6.3.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From a540513e0f7bbff7bc0d3bac0cafc913a01b7675 Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Fri, 20 Sep 2024 02:46:53 +0000 Subject: [PATCH 62/74] chore: npm audit fix --- package-lock.json | 666 ++++++++++++++++++++++++---------------------- 1 file changed, 354 insertions(+), 312 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6008f84..bdc40653 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,17 +37,26 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/compat-data": { "version": "7.15.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", @@ -88,10 +97,11 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -115,23 +125,26 @@ } }, "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", - "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.15.6", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" @@ -156,52 +169,15 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", @@ -296,11 +272,22 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -329,24 +316,37 @@ } }, "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/highlight/node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/parser": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", - "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -355,33 +355,33 @@ } }, "node_modules/@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", - "debug": "^4.1.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -398,12 +398,14 @@ } }, "node_modules/@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -503,6 +505,59 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -688,13 +743,11 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -832,13 +885,11 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1087,12 +1138,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1792,13 +1844,11 @@ } }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1957,13 +2007,11 @@ } }, "node_modules/eslint-plugin-unicorn/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2149,13 +2197,11 @@ } }, "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2333,10 +2379,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2863,6 +2910,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3228,18 +3276,6 @@ "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -3265,13 +3301,14 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -3680,10 +3717,11 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -4231,10 +4269,11 @@ } }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } @@ -4544,6 +4583,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -4745,10 +4785,11 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4824,12 +4865,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -4884,12 +4919,21 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + } } }, "@babel/compat-data": { @@ -4922,9 +4966,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -4941,22 +4985,23 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/generator": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", - "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dev": true, "requires": { - "@babel/types": "^7.15.6", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" } }, "@babel/helper-compilation-targets": { @@ -4972,42 +5017,13 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, - "@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, "@babel/helper-member-expression-to-functions": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", @@ -5081,10 +5097,16 @@ "@babel/types": "^7.15.4" } }, + "@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true }, "@babel/helper-validator-option": { @@ -5105,47 +5127,57 @@ } }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + } } }, "@babel/parser": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", - "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", - "dev": true + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.25.6" + } }, "@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", - "debug": "^4.1.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "dependencies": { @@ -5158,12 +5190,13 @@ } }, "@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" } }, @@ -5243,6 +5276,45 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5389,13 +5461,10 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true }, "tslib": { "version": "1.14.1", @@ -5472,13 +5541,10 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true }, "tslib": { "version": "1.14.1", @@ -5659,12 +5725,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-stdout": { @@ -6122,13 +6188,10 @@ "dev": true }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true }, "supports-color": { "version": "7.2.0", @@ -6306,13 +6369,10 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true } } }, @@ -6425,13 +6485,10 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true }, "type-fest": { "version": "0.8.1", @@ -6606,9 +6663,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -7240,15 +7297,6 @@ } } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -7271,13 +7319,13 @@ "dev": true }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.3", + "picomatch": "^2.3.1" } }, "minimatch": { @@ -7581,9 +7629,9 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { @@ -7964,9 +8012,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "serialize-javascript": { @@ -8355,9 +8403,9 @@ } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "workerpool": { @@ -8415,12 +8463,6 @@ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", From 15bf119f9622329e4ce14dd5e1360f778000a49d Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Fri, 20 Sep 2024 02:48:07 +0000 Subject: [PATCH 63/74] chore: update nodejs.yml --- .github/workflows/nodejs.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index bdf3afaa..057fc7a8 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -7,11 +7,11 @@ jobs: name: 'Build & Test' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Setup node - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: - node-version: '14' + node-version: '20' - name: npm install --global rollup run: npm install --global rollup env: From 75cf50bcfa967f8f245221f3d9021547e58fbeee Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Fri, 20 Sep 2024 04:24:27 +0000 Subject: [PATCH 64/74] chore: update packages --- .eslintrc.json | 29 +- package-lock.json | 6997 +++++++++++++++++++++++---------------------- package.json | 36 +- 3 files changed, 3621 insertions(+), 3441 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index d1a12fd8..cecee316 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -27,31 +27,6 @@ "default": "array" } ], - "@typescript-eslint/ban-types": [ - "error", - { - "types": { - "Object": { - "message": "Avoid using the `Object` type. Did you mean `object`?" - }, - "Function": { - "message": "Avoid using the `Function` type. Prefer a specific function type, like `() => void`." - }, - "Boolean": { - "message": "Avoid using the `Boolean` type. Did you mean `boolean`?" - }, - "Number": { - "message": "Avoid using the `Number` type. Did you mean `number`?" - }, - "String": { - "message": "Avoid using the `String` type. Did you mean `string`?" - }, - "Symbol": { - "message": "Avoid using the `Symbol` type. Did you mean `symbol`?" - } - } - } - ], "@typescript-eslint/consistent-type-assertions": "error", "@typescript-eslint/dot-notation": "error", "@typescript-eslint/indent": "off", @@ -71,6 +46,7 @@ "@typescript-eslint/naming-convention": "off", "@typescript-eslint/no-empty-function": "error", "@typescript-eslint/no-empty-interface": "error", + "@typescript-eslint/no-empty-object-type": "error", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-misused-new": "error", "@typescript-eslint/no-namespace": "error", @@ -82,9 +58,11 @@ } ], "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unsafe-function-type": "error", "@typescript-eslint/no-unused-expressions": "error", "@typescript-eslint/no-use-before-define": "off", "@typescript-eslint/no-var-requires": "error", + "@typescript-eslint/no-wrapper-object-types": "error", "@typescript-eslint/prefer-for-of": "error", "@typescript-eslint/prefer-function-type": "error", "@typescript-eslint/prefer-namespace-keyword": "error", @@ -146,7 +124,6 @@ "indent": "off", "jsdoc/check-alignment": "error", "jsdoc/check-indentation": "error", - "jsdoc/newline-after-description": "error", "linebreak-style": "off", "max-classes-per-file": [ "error", diff --git a/package-lock.json b/package-lock.json index bdc40653..6536cc5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,29 +11,29 @@ "dependencies": { "lodash": "^4.17.21", "sliced": "~1.0.x", - "tslib": "~2.3.0" + "tslib": "~2.7.0" }, "devDependencies": { - "@rollup/plugin-typescript": "^8.2.1", - "@types/lodash": "^4.14.170", - "@types/mocha": "^8.2.2", - "@types/node": "^14.17.4", - "@typescript-eslint/eslint-plugin": "^4.28.0", - "@typescript-eslint/parser": "^4.28.0", - "eslint": "^7.29.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-import": "^2.23.4", - "eslint-plugin-jsdoc": "^35.4.0", + "@rollup/plugin-typescript": "^11.1.6", + "@types/lodash": "^4.17.7", + "@types/mocha": "^10.0.8", + "@types/node": "^20.16.5", + "@typescript-eslint/eslint-plugin": "^8.6.0", + "@typescript-eslint/parser": "^8.6.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-jsdoc": "^50.2.4", "eslint-plugin-prefer-arrow": "^1.2.3", - "eslint-plugin-unicorn": "^33.0.1", - "mocha": "^9.0.1", - "rollup-plugin-delete": "^2.0.0", - "rollup-plugin-dts": "^3.0.2", - "ts-node": "^10.0.0", - "typescript": "^4.3.4" + "eslint-plugin-unicorn": "^55.0.0", + "mocha": "^10.7.3", + "rollup-plugin-delete": "^2.1.0", + "rollup-plugin-dts": "^6.1.1", + "ts-node": "^10.9.2", + "typescript": "~5.5.0" }, "engines": { - "node": "^12.20.0 || >=14.15.0" + "node": "^18 || ^20 || >=22" } }, "node_modules/@babel/code-frame": { @@ -50,583 +50,530 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true, - "license": "ISC" - }, - "node_modules/@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", - "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.15.8", - "@babel/generator": "^7.15.8", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.8", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.8", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.8.tgz", - "integrity": "sha512-fYP7QFngCvgxjUuw8O057SVH5jCXsbFFOoE77CFDcvzwBVgTOkMD/L4mIC5Ud1xf8chK/no2fRbSSn1wvNmKuQ==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-scope": "^5.1.1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": ">=7.5.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=12" } }, - "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "node_modules/@es-joy/jsdoccomment": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz", + "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=16" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, - "dependencies": { - "@babel/types": "^7.15.4" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.15.4" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", - "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "dependencies": { - "@babel/types": "^7.15.4" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.10.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "dependencies": { - "@babel/types": "^7.15.4" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.15.4" + "node": ">=12.22" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } + "license": "BSD-3-Clause" }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - }, - "engines": { - "node": ">=6.9.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "node_modules/@babel/highlight/node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "ISC" + "engines": { + "node": ">= 8" + } }, - "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 8" } }, - "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "node_modules/@rollup/plugin-typescript": { + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", + "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } } }, - "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.0.tgz", + "integrity": "sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw==", + "cpu": [ + "arm" + ], "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.0.tgz", + "integrity": "sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.9.0-alpha.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz", - "integrity": "sha512-Clxxc0PwpISoYYBibA+1L2qFJ7gvFVhI2Hos87S06K+Q0cXdOhZQJNKWuaQGPAeHjZEuUB/YoWOfwjuF2wirqA==", + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.0.tgz", + "integrity": "sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "comment-parser": "1.1.6-beta.0", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "1.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@es-joy/jsdoccomment/node_modules/jsdoc-type-pratt-parser": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz", - "integrity": "sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ==", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.0.tgz", + "integrity": "sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.0.tgz", + "integrity": "sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.0.tgz", + "integrity": "sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg==", + "cpu": [ + "arm" + ], "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.0.tgz", + "integrity": "sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.0.tgz", + "integrity": "sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.0.tgz", + "integrity": "sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.0.tgz", + "integrity": "sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.0.tgz", + "integrity": "sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz", + "integrity": "sha512-tsSWy3YQzmpjDKnQ1Vcpy3p9Z+kMFbSIesCdMNgLizDWFhrLZIoN21JSq01g+MZMDFF+Y1+4zxgrlqPjid5ohg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz", + "integrity": "sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.0.tgz", + "integrity": "sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.0.tgz", + "integrity": "sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/plugin-typescript": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz", - "integrity": "sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ==", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.0.tgz", + "integrity": "sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "resolve": "^1.17.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0", - "tslib": "*", - "typescript": ">=3.7.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } + "license": "MIT" }, "node_modules/@tsconfig/node10": { "version": "1.0.8", @@ -653,10 +600,11 @@ "dev": true }, "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/glob": { "version": "7.1.4", @@ -668,23 +616,19 @@ "@types/node": "*" } }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.14.175", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.175.tgz", - "integrity": "sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==", - "dev": true + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "3.0.5", @@ -693,16 +637,21 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", - "dev": true + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", + "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "14.17.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.21.tgz", - "integrity": "sha512-zv8ukKci1mrILYiQOwGSV4FpkZhyxQtuFWGya2GujWg+zVAeRQ4qbaMmWp9vb9889CFA8JECH7lkwCL6Ygg8kA==", - "dev": true + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -711,30 +660,32 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", + "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/type-utils": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -742,115 +693,86 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/@typescript-eslint/parser": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", + "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "tslib": "^1.8.1" + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", + "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", + "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", + "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", "dev": true, + "license": "MIT", "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -858,21 +780,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", + "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -884,6 +808,32 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -897,55 +847,60 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/@typescript-eslint/utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", + "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^1.8.1" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0" }, "engines": { - "node": ">= 6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", + "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "8.6.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -958,6 +913,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -989,6 +945,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1001,10 +958,11 @@ } }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1043,6 +1001,16 @@ "node": ">= 8" } }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -1050,25 +1018,110 @@ "dev": true }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -1077,24 +1130,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1103,13 +1153,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/balanced-match": { @@ -1157,36 +1214,66 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", - "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001264", - "electron-to-chromium": "^1.3.857", - "escalade": "^3.1.1", - "node-releases": "^1.1.77", - "picocolors": "^0.2.1" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1197,6 +1284,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1214,9 +1302,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001352", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", - "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", + "version": "1.0.30001662", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", + "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", "dev": true, "funding": [ { @@ -1226,8 +1314,13 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", @@ -1271,10 +1364,20 @@ } }, "node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/clean-regexp": { "version": "1.0.0", @@ -1324,12 +1427,13 @@ "dev": true }, "node_modules/comment-parser": { - "version": "1.1.6-beta.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.6-beta.0.tgz", - "integrity": "sha512-q3cA8TSMyqW7wcPSYWzbO/rMahnXgzs4SLG/UIWXdEsnXTFPZkEkWAdNgPiHig2OzxgpPLOh4WwsmClDxndwHw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 10.0.0" + "node": ">= 12.0.0" } }, "node_modules/concat-map": { @@ -1338,13 +1442,18 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.1" + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, "node_modules/create-require": { @@ -1367,13 +1476,68 @@ "node": ">= 8" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1400,18 +1564,43 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/del": { @@ -1486,10 +1675,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.3.862", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz", - "integrity": "sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg==", - "dev": true + "version": "1.5.25", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", + "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -1497,18 +1687,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1519,31 +1697,58 @@ } }, "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -1552,11 +1757,80 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -1570,10 +1844,11 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1588,67 +1863,67 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -1657,13 +1932,15 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -1671,21 +1948,27 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", - "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "pkg-dir": "^2.0.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/eslint-module-utils/node_modules/debug": { @@ -1693,46 +1976,52 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { - "version": "2.24.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.6.2", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.6.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.4", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -1747,100 +2036,84 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/eslint-plugin-import/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/eslint-plugin-import/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/eslint-plugin-jsdoc": { + "version": "50.2.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.2.4.tgz", + "integrity": "sha512-020jA+dXaXdb+TML3ZJBvpPmzwbNROjnYuTYi/g6A5QEmEjhptz4oPJDKkOGMIByNxsPpdTLzSU1HYVqebOX1w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "p-limit": "^1.1.0" + "@es-joy/jsdoccomment": "~0.48.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.6", + "escape-string-regexp": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-import/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-jsdoc": { - "version": "35.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.5.1.tgz", - "integrity": "sha512-pPYPWtsykwVEue1tYEyoppBj4dgF7XicF67tLLLraY6RQYBq7qMKjUHji19+hfiTtYKKBD0YfeK8hgjPAE5viw==", + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@es-joy/jsdoccomment": "0.9.0-alpha.1", - "comment-parser": "1.1.6-beta.0", - "debug": "^4.3.2", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "^1.0.4", - "lodash": "^4.17.21", - "regextras": "^0.8.0", - "semver": "^7.3.5", - "spdx-expression-parse": "^3.0.1" + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { @@ -1856,6 +2129,17 @@ "node": ">=10" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/eslint-plugin-prefer-arrow": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", @@ -1866,33 +2150,37 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "33.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-33.0.1.tgz", - "integrity": "sha512-VxX/L/9DUEyB3D0v00185LrgsB5/fBwkgA4IC7ehHRu5hFSgA6VecmdpFybhsr4GQ/Y1iyXMHf6q+JKvcR2MwA==", + "version": "55.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz", + "integrity": "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==", "dev": true, + "license": "MIT", "dependencies": { - "ci-info": "^3.1.1", + "@babel/helper-validator-identifier": "^7.24.5", + "@eslint-community/eslint-utils": "^4.4.0", + "ci-info": "^4.0.0", "clean-regexp": "^1.0.0", - "eslint-template-visitor": "^2.3.2", - "eslint-utils": "^3.0.0", - "import-modules": "^2.1.0", - "is-builtin-module": "^3.1.0", - "lodash": "^4.17.21", + "core-js-compat": "^3.37.0", + "esquery": "^1.5.0", + "globals": "^15.7.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.1", + "jsesc": "^3.0.2", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.23", - "reserved-words": "^0.1.2", - "safe-regex": "^2.1.1", - "semver": "^7.3.5" + "regexp-tree": "^0.1.27", + "regjsparser": "^0.10.0", + "semver": "^7.6.1", + "strip-indent": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=18.18" }, "funding": { "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" }, "peerDependencies": { - "eslint": ">=7.23.0" + "eslint": ">=8.56.0" } }, "node_modules/eslint-plugin-unicorn/node_modules/find-up": { @@ -1908,6 +2196,19 @@ "node": ">=8" } }, + "node_modules/eslint-plugin-unicorn/node_modules/globals": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", + "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-plugin-unicorn/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -2029,68 +2330,33 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-template-visitor": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz", - "integrity": "sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.16", - "@babel/eslint-parser": "^7.12.16", - "eslint-visitor-keys": "^2.0.0", - "esquery": "^1.3.1", - "multimap": "^1.1.0" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "estraverse": "^5.2.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ansi-styles": { @@ -2154,28 +2420,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" + "is-glob": "^4.0.3" }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, "engines": { - "node": ">=4" + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/has-flag": { @@ -2187,28 +2442,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2222,46 +2455,29 @@ } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2269,20 +2485,12 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2290,29 +2498,22 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", @@ -2327,13 +2528,15 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2342,20 +2545,22 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.13.0", @@ -2435,6 +2640,16 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2456,24 +2671,42 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-caller-file": { @@ -2486,27 +2719,35 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -2548,10 +2789,11 @@ } }, "node_modules/globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2562,24 +2804,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { @@ -2588,32 +2840,19 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } + "license": "MIT" }, "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2627,11 +2866,54 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -2639,19 +2921,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/he": { @@ -2670,10 +2950,11 @@ "dev": true }, "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -2683,6 +2964,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2694,18 +2976,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-modules": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.1.0.tgz", - "integrity": "sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -2741,19 +3011,37 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2765,6 +3053,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -2789,6 +3078,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -2801,34 +3091,43 @@ } }, "node_modules/is-builtin-module": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", - "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, + "license": "MIT", "dependencies": { - "builtin-modules": "^3.0.0" + "builtin-modules": "^3.3.0" }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-builtin-module/node_modules/builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { "node": ">= 0.4" }, @@ -2836,13 +3135,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-core-module": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", - "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2853,6 +3156,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2882,10 +3186,11 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2894,10 +3199,11 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2916,10 +3222,11 @@ } }, "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2962,6 +3269,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -2974,10 +3282,17 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2987,6 +3302,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -3002,6 +3318,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -3012,6 +3329,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -3025,17 +3358,25 @@ } }, "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3049,45 +3390,41 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz", - "integrity": "sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0.0" } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -3098,7 +3435,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -3107,15 +3445,16 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, "bin": { "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" } }, "node_modules/levn": { @@ -3123,6 +3462,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3137,21 +3477,6 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3172,24 +3497,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -3277,12 +3590,13 @@ } }, "node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, + "license": "MIT", "dependencies": { - "sourcemap-codec": "^1.4.4" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/make-error": { @@ -3314,6 +3628,16 @@ "node": ">=8.6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3327,65 +3651,67 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">= 14.0.0" } }, - "node_modules/mocha/node_modules/argparse": { + "node_modules/mocha/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } }, "node_modules/mocha/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -3402,6 +3728,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3411,36 +3758,19 @@ "node": ">=8" } }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3457,28 +3787,11 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multimap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", - "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -3487,10 +3800,11 @@ "dev": true }, "node_modules/node-releases": { - "version": "1.1.77", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", - "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", - "dev": true + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -3514,10 +3828,14 @@ } }, "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3527,37 +3845,74 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3576,17 +3931,18 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -3648,6 +4004,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -3655,17 +4012,18 @@ "node": ">=6" } }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "node_modules/parse-imports": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.1.tgz", + "integrity": "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" }, "engines": { - "node": ">=4" + "node": ">= 18" } }, "node_modules/path-exists": { @@ -3711,10 +4069,11 @@ } }, "node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -3729,180 +4088,23 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, "engines": { "node": ">=4" } }, - "node_modules/pkg-up/node_modules/p-try": { + "node_modules/possible-typed-array-names": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.4" } }, "node_modules/prelude-ls": { @@ -3910,24 +4112,17 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3957,116 +4152,11 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4080,33 +4170,54 @@ } }, "node_modules/regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, + "license": "MIT", "bin": { "regexp-tree": "bin/regexp-tree" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regextras": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", - "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", + "node_modules/regjsparser": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", "dev": true, - "engines": { - "node": ">=0.1.14" + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" } }, "node_modules/require-directory": { @@ -4118,29 +4229,19 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", - "dev": true - }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4151,6 +4252,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -4181,55 +4283,89 @@ } }, "node_modules/rollup": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", - "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.0.tgz", + "integrity": "sha512-W21MUIFPZ4+O2Je/EU+GP3iz7PH4pVPUXSbEZdatQnxo29+3rsUjgrJmzuAZU24z7yRAnFN6ukxeAhZh/c7hzg==", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.22.0", + "@rollup/rollup-android-arm64": "4.22.0", + "@rollup/rollup-darwin-arm64": "4.22.0", + "@rollup/rollup-darwin-x64": "4.22.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.0", + "@rollup/rollup-linux-arm-musleabihf": "4.22.0", + "@rollup/rollup-linux-arm64-gnu": "4.22.0", + "@rollup/rollup-linux-arm64-musl": "4.22.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.0", + "@rollup/rollup-linux-riscv64-gnu": "4.22.0", + "@rollup/rollup-linux-s390x-gnu": "4.22.0", + "@rollup/rollup-linux-x64-gnu": "4.22.0", + "@rollup/rollup-linux-x64-musl": "4.22.0", + "@rollup/rollup-win32-arm64-msvc": "4.22.0", + "@rollup/rollup-win32-ia32-msvc": "4.22.0", + "@rollup/rollup-win32-x64-msvc": "4.22.0", "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-delete": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", - "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.1.0.tgz", + "integrity": "sha512-TEbqJd7giLvzQDTu4jSPufwhTJs/iYVN2LfR/YIYkqjC/oZ0/h9Q0AeljifIhzBzJYZtHQTWKEbMms5fbh54pw==", "dev": true, + "license": "MIT", "dependencies": { "del": "^5.1.0" }, "engines": { "node": ">=10" + }, + "peerDependencies": { + "rollup": "*" } }, "node_modules/rollup-plugin-dts": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz", - "integrity": "sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz", + "integrity": "sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==", "dev": true, + "license": "LGPL-3.0-only", "dependencies": { - "magic-string": "^0.25.7" + "magic-string": "^0.30.10" }, "engines": { - "node": ">=v12.22.1" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/Swatinem" }, "optionalDependencies": { - "@babel/code-frame": "^7.12.13" + "@babel/code-frame": "^7.24.2" }, "peerDependencies": { - "rollup": "^2.48.0", - "typescript": "^4.2.4" + "rollup": "^3.29.4 || ^4", + "typescript": "^4.5 || ^5.0" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4253,19 +4389,62 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { - "regexp-tree": "~0.1.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/semver": { @@ -4279,14 +4458,49 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4309,14 +4523,19 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4331,76 +4550,18 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "license": "ISC" }, "node_modules/sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -4433,12 +4594,6 @@ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", "dev": true }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4453,27 +4608,53 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4494,12 +4675,26 @@ "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -4524,60 +4719,42 @@ "node": ">=4" } }, - "node_modules/table": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", - "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, + "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://opencollective.com/unts" } }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4591,13 +4768,27 @@ "node": ">=8.0" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "0.6.1", + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -4608,18 +4799,17 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=12.0.0" - }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", @@ -4635,52 +4825,31 @@ } } }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/tsconfig-paths": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", - "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", + "json5": "^1.0.2", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -4688,60 +4857,180 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", @@ -4773,6 +5062,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -4784,6 +5074,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -4795,10 +5105,11 @@ } }, "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -4884,10 +5195,11 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -4926,206 +5238,14 @@ "requires": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" - }, - "dependencies": { - "picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - } - } - }, - "@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", - "dev": true - }, - "@babel/core": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", - "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.15.8", - "@babel/generator": "^7.15.8", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.8", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.8", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/eslint-parser": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.8.tgz", - "integrity": "sha512-fYP7QFngCvgxjUuw8O057SVH5jCXsbFFOoE77CFDcvzwBVgTOkMD/L4mIC5Ud1xf8chK/no2fRbSSn1wvNmKuQ==", - "dev": true, - "requires": { - "eslint-scope": "^5.1.1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", - "dev": true, - "requires": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-module-imports": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", - "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" } }, - "@babel/helper-simple-access": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", - "dev": true, - "requires": { - "@babel/types": "^7.15.4" - } - }, - "@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true - }, "@babel/helper-validator-identifier": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true - }, - "@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", - "dev": true, - "requires": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" - } - }, "@babel/highlight": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", @@ -5136,156 +5256,88 @@ "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" - }, - "dependencies": { - "picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - } - } - }, - "@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.25.6" } }, - "@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@jridgewell/trace-mapping": "0.3.9" } }, - "@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "@es-joy/jsdoccomment": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz", + "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" } }, - "@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "eslint-visitor-keys": "^3.3.0" } }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true }, - "@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@es-joy/jsdoccomment": { - "version": "0.9.0-alpha.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz", - "integrity": "sha512-Clxxc0PwpISoYYBibA+1L2qFJ7gvFVhI2Hos87S06K+Q0cXdOhZQJNKWuaQGPAeHjZEuUB/YoWOfwjuF2wirqA==", - "dev": true, - "requires": { - "comment-parser": "1.1.6-beta.0", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "1.0.4" - }, - "dependencies": { - "jsdoc-type-pratt-parser": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz", - "integrity": "sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ==", - "dev": true - } - } - }, "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } } }, + "@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true + }, "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" } }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true }, "@jridgewell/resolve-uri": { "version": "3.1.2", @@ -5293,12 +5345,6 @@ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, "@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -5306,13 +5352,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@nodelib/fs.scandir": { @@ -5336,31 +5382,171 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, + "@rollup/plugin-typescript": { + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", + "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + } + }, + "@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.0.tgz", + "integrity": "sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.0.tgz", + "integrity": "sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.0.tgz", + "integrity": "sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.0.tgz", + "integrity": "sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.0.tgz", + "integrity": "sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.0.tgz", + "integrity": "sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.0.tgz", + "integrity": "sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.0.tgz", + "integrity": "sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.0.tgz", + "integrity": "sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.0.tgz", + "integrity": "sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.0.tgz", + "integrity": "sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz", + "integrity": "sha512-tsSWy3YQzmpjDKnQ1Vcpy3p9Z+kMFbSIesCdMNgLizDWFhrLZIoN21JSq01g+MZMDFF+Y1+4zxgrlqPjid5ohg==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz", + "integrity": "sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw==", + "dev": true, + "optional": true, + "peer": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.0.tgz", + "integrity": "sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw==", + "dev": true, + "optional": true, + "peer": true }, - "@rollup/plugin-typescript": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz", - "integrity": "sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ==", + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.0.tgz", + "integrity": "sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ==", "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "resolve": "^1.17.0" - } + "optional": true, + "peer": true }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "@rollup/rollup-win32-x64-msvc": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.0.tgz", + "integrity": "sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA==", "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } + "optional": true, + "peer": true + }, + "@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true }, "@tsconfig/node10": { "version": "1.0.8", @@ -5387,9 +5573,9 @@ "dev": true }, "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "@types/glob": { @@ -5402,22 +5588,16 @@ "@types/node": "*" } }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/lodash": { - "version": "4.14.175", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.175.tgz", - "integrity": "sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", "dev": true }, "@types/minimatch": { @@ -5427,16 +5607,19 @@ "dev": true }, "@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", + "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==", "dev": true }, "@types/node": { - "version": "14.17.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.21.tgz", - "integrity": "sha512-zv8ukKci1mrILYiQOwGSV4FpkZhyxQtuFWGya2GujWg+zVAeRQ4qbaMmWp9vb9889CFA8JECH7lkwCL6Ygg8kA==", - "dev": true + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } }, "@types/normalize-package-data": { "version": "2.4.1", @@ -5445,144 +5628,137 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", + "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/type-utils": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" } }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "@typescript-eslint/parser": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", + "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", "dev": true, "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "debug": "^4.3.4" } }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", + "@typescript-eslint/scope-manager": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", + "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0" } }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", + "@typescript-eslint/type-utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", + "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" } }, "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", + "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", + "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", "dev": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } } } }, + "@typescript-eslint/utils": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", + "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0" + } + }, "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", + "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "8.6.0", + "eslint-visitor-keys": "^3.4.3" } }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true }, "acorn-jsx": { @@ -5621,9 +5797,9 @@ } }, "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true }, "ansi-regex": { @@ -5651,6 +5827,12 @@ "picomatch": "^2.0.4" } }, + "are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -5658,24 +5840,32 @@ "dev": true }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" } }, "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, @@ -5685,22 +5875,68 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array.prototype.flat": { + "array.prototype.findlastindex": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" } }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true + "array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + } + }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "balanced-match": { "version": "1.0.0", @@ -5740,26 +5976,34 @@ "dev": true }, "browserslist": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", - "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001264", - "electron-to-chromium": "^1.3.857", - "escalade": "^3.1.1", - "node-releases": "^1.1.77", - "picocolors": "^0.2.1" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -5775,9 +6019,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001352", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", - "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", + "version": "1.0.30001662", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", + "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", "dev": true }, "chalk": { @@ -5808,9 +6052,9 @@ } }, "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", + "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", "dev": true }, "clean-regexp": { @@ -5855,9 +6099,9 @@ "dev": true }, "comment-parser": { - "version": "1.1.6-beta.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.6-beta.0.tgz", - "integrity": "sha512-q3cA8TSMyqW7wcPSYWzbO/rMahnXgzs4SLG/UIWXdEsnXTFPZkEkWAdNgPiHig2OzxgpPLOh4WwsmClDxndwHw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true }, "concat-map": { @@ -5866,13 +6110,13 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "browserslist": "^4.23.3" } }, "create-require": { @@ -5892,13 +6136,46 @@ "which": "^2.0.1" } }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "decamelize": { @@ -5913,13 +6190,26 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "del": { @@ -5981,9 +6271,9 @@ } }, "electron-to-chromium": { - "version": "1.3.862", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz", - "integrity": "sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg==", + "version": "1.5.25", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", + "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", "dev": true }, "emoji-regex": { @@ -5992,15 +6282,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6011,31 +6292,107 @@ } }, "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" } }, "es-to-primitive": { @@ -6050,9 +6407,9 @@ } }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -6062,62 +6419,51 @@ "dev": true }, "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -6158,21 +6504,13 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "is-glob": "^4.0.3" } }, "has-flag": { @@ -6181,18 +6519,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6205,20 +6531,21 @@ } }, "eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "requires": {} }, "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" }, "dependencies": { "debug": { @@ -6233,13 +6560,12 @@ } }, "eslint-module-utils": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", - "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", "dev": true, "requires": { - "debug": "^3.2.7", - "pkg-dir": "^2.0.0" + "debug": "^3.2.7" }, "dependencies": { "debug": { @@ -6254,35 +6580,38 @@ } }, "eslint-plugin-import": { - "version": "2.24.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", + "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", "dev": true, "requires": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.6.2", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.6.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.4", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.9.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "doctrine": { @@ -6294,85 +6623,71 @@ "esutils": "^2.0.2" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "eslint-plugin-jsdoc": { - "version": "35.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.5.1.tgz", - "integrity": "sha512-pPYPWtsykwVEue1tYEyoppBj4dgF7XicF67tLLLraY6RQYBq7qMKjUHji19+hfiTtYKKBD0YfeK8hgjPAE5viw==", + "version": "50.2.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.2.4.tgz", + "integrity": "sha512-020jA+dXaXdb+TML3ZJBvpPmzwbNROjnYuTYi/g6A5QEmEjhptz4oPJDKkOGMIByNxsPpdTLzSU1HYVqebOX1w==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "0.9.0-alpha.1", - "comment-parser": "1.1.6-beta.0", - "debug": "^4.3.2", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "^1.0.4", - "lodash": "^4.17.21", - "regextras": "^0.8.0", - "semver": "^7.3.5", - "spdx-expression-parse": "^3.0.1" + "@es-joy/jsdoccomment": "~0.48.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.6", + "escape-string-regexp": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" }, "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true + }, + "espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "requires": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + } + }, "semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true + }, + "spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } } } }, @@ -6384,24 +6699,27 @@ "requires": {} }, "eslint-plugin-unicorn": { - "version": "33.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-33.0.1.tgz", - "integrity": "sha512-VxX/L/9DUEyB3D0v00185LrgsB5/fBwkgA4IC7ehHRu5hFSgA6VecmdpFybhsr4GQ/Y1iyXMHf6q+JKvcR2MwA==", + "version": "55.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz", + "integrity": "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==", "dev": true, "requires": { - "ci-info": "^3.1.1", + "@babel/helper-validator-identifier": "^7.24.5", + "@eslint-community/eslint-utils": "^4.4.0", + "ci-info": "^4.0.0", "clean-regexp": "^1.0.0", - "eslint-template-visitor": "^2.3.2", - "eslint-utils": "^3.0.0", - "import-modules": "^2.1.0", - "is-builtin-module": "^3.1.0", - "lodash": "^4.17.21", + "core-js-compat": "^3.37.0", + "esquery": "^1.5.0", + "globals": "^15.7.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.1", + "jsesc": "^3.0.2", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.23", - "reserved-words": "^0.1.2", - "safe-regex": "^2.1.1", - "semver": "^7.3.5" + "regexp-tree": "^0.1.27", + "regjsparser": "^0.10.0", + "semver": "^7.6.1", + "strip-indent": "^3.0.0" }, "dependencies": { "find-up": { @@ -6414,6 +6732,12 @@ "path-exists": "^4.0.0" } }, + "globals": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", + "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", + "dev": true + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -6499,83 +6823,39 @@ } }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-template-visitor": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz", - "integrity": "sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==", - "dev": true, - "requires": { - "@babel/core": "^7.12.16", - "@babel/eslint-parser": "^7.12.16", - "eslint-visitor-keys": "^2.0.0", - "esquery": "^1.3.1", - "multimap": "^1.1.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" + "estraverse": "^5.2.0" } }, "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } } }, "esrecurse": { @@ -6585,26 +6865,18 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "esutils": { @@ -6620,9 +6892,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -6641,7 +6913,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fastq": { @@ -6703,6 +6975,15 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6717,21 +6998,27 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "get-caller-file": { @@ -6741,24 +7028,27 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "glob": { @@ -6785,26 +7075,31 @@ } }, "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" } }, "graceful-fs": { @@ -6813,25 +7108,16 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { @@ -6840,19 +7126,43 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "has-symbols": { + "has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" } }, "he": { @@ -6868,9 +7178,9 @@ "dev": true }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "import-fresh": { @@ -6883,12 +7193,6 @@ "resolve-from": "^4.0.0" } }, - "import-modules": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-modules/-/import-modules-2.1.0.tgz", - "integrity": "sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==", - "dev": true - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6918,16 +7222,26 @@ "dev": true }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -6963,35 +7277,36 @@ } }, "is-builtin-module": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", - "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "requires": { - "builtin-modules": "^3.0.0" - }, - "dependencies": { - "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true - } + "builtin-modules": "^3.3.0" } }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", - "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "requires": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" } }, "is-date-object": { @@ -7016,18 +7331,18 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true }, "is-number": { @@ -7037,9 +7352,9 @@ "dev": true }, "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -7074,10 +7389,13 @@ } }, "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } }, "is-string": { "version": "1.0.7", @@ -7097,6 +7415,15 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.14" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -7104,14 +7431,20 @@ "dev": true }, "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2" } }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -7125,31 +7458,24 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "jsdoc-type-pratt-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz", - "integrity": "sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true }, "json-parse-even-better-errors": { @@ -7171,10 +7497,13 @@ "dev": true }, "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } }, "levn": { "version": "0.4.1", @@ -7192,18 +7521,6 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7218,24 +7535,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -7298,12 +7603,12 @@ } }, "magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "requires": { - "sourcemap-codec": "^1.4.4" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "make-error": { @@ -7328,6 +7633,12 @@ "picomatch": "^2.3.1" } }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7338,53 +7649,52 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "argparse": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } }, "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true }, "escape-string-regexp": { @@ -7393,36 +7703,34 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, "minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -7435,21 +7743,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multimap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", - "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==", - "dev": true - }, - "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "natural-compare": { @@ -7459,9 +7755,9 @@ "dev": true }, "node-releases": { - "version": "1.1.77", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", - "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "normalize-package-data": { @@ -7483,9 +7779,9 @@ "dev": true }, "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true }, "object-keys": { @@ -7495,26 +7791,49 @@ "dev": true }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, + "object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + } + }, + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + } + }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "once": { @@ -7527,9 +7846,9 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "requires": { "deep-is": "^0.1.3", @@ -7537,7 +7856,7 @@ "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" } }, "p-limit": { @@ -7582,14 +7901,14 @@ "callsites": "^3.0.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "parse-imports": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.1.tgz", + "integrity": "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" } }, "path-exists": { @@ -7623,142 +7942,16 @@ "dev": true }, "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, "pluralize": { "version": "8.0.0", @@ -7766,22 +7959,22 @@ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "queue-microtask": { @@ -7799,89 +7992,6 @@ "safe-buffer": "^5.1.0" } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - } - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -7892,22 +8002,39 @@ } }, "regexp-tree": { - "version": "0.1.24", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", - "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true + "regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "requires": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + } }, - "regextras": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", - "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", - "dev": true + "regjsparser": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } }, "require-directory": { "version": "2.1.1", @@ -7915,26 +8042,15 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", - "dev": true - }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { @@ -7959,32 +8075,58 @@ } }, "rollup": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.58.0.tgz", - "integrity": "sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.0.tgz", + "integrity": "sha512-W21MUIFPZ4+O2Je/EU+GP3iz7PH4pVPUXSbEZdatQnxo29+3rsUjgrJmzuAZU24z7yRAnFN6ukxeAhZh/c7hzg==", "dev": true, "peer": true, "requires": { + "@rollup/rollup-android-arm-eabi": "4.22.0", + "@rollup/rollup-android-arm64": "4.22.0", + "@rollup/rollup-darwin-arm64": "4.22.0", + "@rollup/rollup-darwin-x64": "4.22.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.0", + "@rollup/rollup-linux-arm-musleabihf": "4.22.0", + "@rollup/rollup-linux-arm64-gnu": "4.22.0", + "@rollup/rollup-linux-arm64-musl": "4.22.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.0", + "@rollup/rollup-linux-riscv64-gnu": "4.22.0", + "@rollup/rollup-linux-s390x-gnu": "4.22.0", + "@rollup/rollup-linux-x64-gnu": "4.22.0", + "@rollup/rollup-linux-x64-musl": "4.22.0", + "@rollup/rollup-win32-arm64-msvc": "4.22.0", + "@rollup/rollup-win32-ia32-msvc": "4.22.0", + "@rollup/rollup-win32-x64-msvc": "4.22.0", + "@types/estree": "1.0.5", "fsevents": "~2.3.2" + }, + "dependencies": { + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "peer": true + } } }, "rollup-plugin-delete": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", - "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.1.0.tgz", + "integrity": "sha512-TEbqJd7giLvzQDTu4jSPufwhTJs/iYVN2LfR/YIYkqjC/oZ0/h9Q0AeljifIhzBzJYZtHQTWKEbMms5fbh54pw==", "dev": true, "requires": { "del": "^5.1.0" } }, "rollup-plugin-dts": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-3.0.2.tgz", - "integrity": "sha512-hswlsdWu/x7k5pXzaLP6OvKRKcx8Bzprksz9i9mUe72zvt8LvqAb/AZpzs6FkLgmyRaN8B6rUQOVtzA3yEt9Yw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz", + "integrity": "sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==", "dev": true, "requires": { - "@babel/code-frame": "^7.12.13", - "magic-string": "^0.25.7" + "@babel/code-frame": "^7.24.2", + "magic-string": "^0.30.10" } }, "run-parallel": { @@ -7996,19 +8138,33 @@ "queue-microtask": "^1.2.2" } }, + "safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, - "safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "requires": { - "regexp-tree": "~0.1.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" } }, "semver": { @@ -8018,14 +8174,40 @@ "dev": true }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8042,14 +8224,15 @@ "dev": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "slash": { @@ -8058,60 +8241,17 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } + "slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true }, "sliced": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -8144,12 +8284,6 @@ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", "dev": true }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -8161,24 +8295,38 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + } + }, "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { @@ -8193,9 +8341,18 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -8211,38 +8368,20 @@ "has-flag": "^3.0.0" } }, - "table": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", - "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" } }, "text-table": { @@ -8251,12 +8390,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8266,13 +8399,20 @@ "is-number": "^7.0.0" } }, + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, "ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "requires": { - "@cspotcode/source-map-support": "0.6.1", + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -8283,44 +8423,26 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" - }, - "dependencies": { - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true - } } }, "tsconfig-paths": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", - "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", + "json5": "^1.0.2", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "type-check": { "version": "0.4.0", @@ -8337,24 +8459,92 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + } + }, "typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true }, "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "requires": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8364,10 +8554,10 @@ "punycode": "^2.1.0" } }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "validate-npm-package-license": { @@ -8402,6 +8592,19 @@ "is-symbol": "^1.0.3" } }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, "word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -8409,9 +8612,9 @@ "dev": true }, "workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", "dev": true }, "wrap-ansi": { @@ -8479,9 +8682,9 @@ } }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, "yargs-unparser": { diff --git a/package.json b/package.json index 83435ef6..ebf91052 100644 --- a/package.json +++ b/package.json @@ -25,31 +25,31 @@ "release:patch": "npm run test && npm run build && npm version patch -m \"chore: release\" && git push origin master --tags && npm publish" }, "engines": { - "node": "^12.20.0 || >=14.15.0" + "node": "^18 || ^20 || >=22" }, "dependencies": { "lodash": "^4.17.21", "sliced": "~1.0.x", - "tslib": "~2.3.0" + "tslib": "~2.7.0" }, "devDependencies": { - "@rollup/plugin-typescript": "^8.2.1", - "@types/lodash": "^4.14.170", - "@types/mocha": "^8.2.2", - "@types/node": "^14.17.4", - "@typescript-eslint/eslint-plugin": "^4.28.0", - "@typescript-eslint/parser": "^4.28.0", - "eslint": "^7.29.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-import": "^2.23.4", - "eslint-plugin-jsdoc": "^35.4.0", + "@rollup/plugin-typescript": "^11.1.6", + "@types/lodash": "^4.17.7", + "@types/mocha": "^10.0.8", + "@types/node": "^20.16.5", + "@typescript-eslint/eslint-plugin": "^8.6.0", + "@typescript-eslint/parser": "^8.6.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.30.0", + "eslint-plugin-jsdoc": "^50.2.4", "eslint-plugin-prefer-arrow": "^1.2.3", - "eslint-plugin-unicorn": "^33.0.1", - "mocha": "^9.0.1", - "rollup-plugin-delete": "^2.0.0", - "rollup-plugin-dts": "^3.0.2", - "ts-node": "^10.0.0", - "typescript": "^4.3.4" + "eslint-plugin-unicorn": "^55.0.0", + "mocha": "^10.7.3", + "rollup-plugin-delete": "^2.1.0", + "rollup-plugin-dts": "^6.1.1", + "ts-node": "^10.9.2", + "typescript": "~5.5.0" }, "mocha": { "reporter": "dot", From 84fa1ec03ef6cebf88003bce9cb14d985af05dfc Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Fri, 20 Sep 2024 16:29:06 +1200 Subject: [PATCH 65/74] Fix code scanning alert #1: Incomplete string escaping or encoding (#14) Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- lib/dialect/mssql.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dialect/mssql.ts b/lib/dialect/mssql.ts index f6c5be31..8d497b64 100644 --- a/lib/dialect/mssql.ts +++ b/lib/dialect/mssql.ts @@ -202,7 +202,7 @@ export class Mssql extends Dialect<{ questionMarkParameterPlaceholder?: boolean createResult.push(`(${colNodes.map(this.visit.bind(this)).join(', ')})`); this.visitingCreate = false; let tableStr = tableResult.join(' '); - tableStr = tableStr.replace("'", "''"); + tableStr = tableStr.replace(/'/g, "''"); tableStr = `'${tableStr.substring(1, tableStr.length - 1)}'`; const whereClause = `WHERE TABLE_NAME = ${tableStr}`; // TODO: need to add schema check, sudo code: From 58225c62f0b2dfd08eb55004e5a5719405ec5079 Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Fri, 20 Sep 2024 04:34:49 +0000 Subject: [PATCH 66/74] chore: update tsconfig to target es2022 --- tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 31baff70..463c4be1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2016", + "target": "es2022", "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, @@ -9,7 +9,7 @@ "importHelpers": true, "pretty": true, "sourceMap": true, - "lib": ["es2017", "esnext.asynciterable"], + "lib": ["es2022", "esnext.asynciterable"], "strict": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, From bd5434a387d5c3b870356e61ce60ffad4744dd39 Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Fri, 20 Sep 2024 04:34:55 +0000 Subject: [PATCH 67/74] chore: update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b9c5699..0ca25b87 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# node-sql-ts +# sql-ts _sql string builder for node_ - supports PostgreSQL, mysql, Microsoft SQL Server, Oracle and sqlite dialects. From 22128b0222d1f06aff81b534d8af6b6b4551882a Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Fri, 20 Sep 2024 05:50:21 +0000 Subject: [PATCH 68/74] feat: support AS OF queries for CockroachDB --- lib/dialect/dialect.ts | 7 +++++++ lib/dialect/mssql.ts | 4 ++++ lib/dialect/mysql.ts | 4 ++++ lib/dialect/oracle.ts | 5 +++++ lib/dialect/sqlite.ts | 4 ++++ lib/functions.ts | 11 ++++++++++- lib/node/asOf.ts | 7 +++++++ lib/node/query.ts | 6 ++++++ test/dialects/as-of-tests.ts | 32 ++++++++++++++++++++++++++++++++ 9 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 lib/node/asOf.ts create mode 100644 test/dialects/as-of-tests.ts diff --git a/lib/dialect/dialect.ts b/lib/dialect/dialect.ts index 1ea48861..d867b9fe 100644 --- a/lib/dialect/dialect.ts +++ b/lib/dialect/dialect.ts @@ -6,6 +6,7 @@ import { AddColumnNode } from '../node/addColumn.js'; import { AliasNode } from '../node/alias.js'; import { AlterNode } from '../node/alter.js'; import { ArrayCallNode } from '../node/arrayCall.js'; +import { AsOfNode } from '../node/asOf.js'; import { AtNode } from '../node/at.js'; import { BinaryNode } from '../node/binary.js'; import { CascadeNode } from '../node/cascade.js'; @@ -208,6 +209,8 @@ export abstract class Dialect { return this.visitCast(node as CastNode); case 'FROM': return this.visitFrom(node as FromNode); + case 'AS OF': + return this.visitAsOf(node as AsOfNode); case 'WHERE': return this.visitWhere(node as WhereNode); case 'ORDER BY': @@ -446,6 +449,10 @@ export abstract class Dialect { } return result; } + public visitAsOf(asOfNode: AsOfNode): string[] { + const result = ['AS OF SYSTEM TIME', ...asOfNode.nodes.flatMap(this.visit.bind(this))]; + return result; + } public visitWhere(whereNode: WhereNode): string[] { this.visitingWhere = true; const result = ['WHERE', whereNode.nodes.map(this.visit.bind(this)).join(', ')]; diff --git a/lib/dialect/mssql.ts b/lib/dialect/mssql.ts index 8d497b64..5e4cdf94 100644 --- a/lib/dialect/mssql.ts +++ b/lib/dialect/mssql.ts @@ -4,6 +4,7 @@ import assert from 'assert'; import { AlterNode } from '../node/alter.js'; +import { AsOfNode } from '../node/asOf.js'; import { BinaryNode } from '../node/binary.js'; import { CaseNode } from '../node/case.js'; import { ColumnNode } from '../node/column.js'; @@ -47,6 +48,9 @@ export class Mssql extends Dialect<{ questionMarkParameterPlaceholder?: boolean } return `@${index}`; } + public visitAsOf(asOfNode: AsOfNode): string[] { + throw new Error('Mssql does not support AS OF.'); + } public visitReplace(replaceNode: ReplaceNode): string[] { throw new Error('Mssql does not support REPLACE.'); } diff --git a/lib/dialect/mysql.ts b/lib/dialect/mysql.ts index da5850e2..71ed2356 100644 --- a/lib/dialect/mysql.ts +++ b/lib/dialect/mysql.ts @@ -1,6 +1,7 @@ import assert from 'assert'; import isNumber from 'lodash/isNumber.js'; +import { AsOfNode } from '../node/asOf.js'; import { BinaryNode } from '../node/binary.js'; import { ColumnNode } from '../node/column.js'; import { CreateNode } from '../node/create.js'; @@ -67,6 +68,9 @@ export class Mysql extends Dialect { } return result; } + public visitAsOf(asOfNode: AsOfNode): string[] { + throw new Error('Mysql does not support AS OF.'); + } public visitOnDuplicate(onDuplicateNode: OnDuplicateNode): string[] { const params: string[] = []; /* jshint boss: true */ diff --git a/lib/dialect/oracle.ts b/lib/dialect/oracle.ts index e768a305..cd3d6c5b 100644 --- a/lib/dialect/oracle.ts +++ b/lib/dialect/oracle.ts @@ -2,6 +2,7 @@ import assert from 'assert'; import { AliasNode } from '../node/alias.js'; import { AlterNode } from '../node/alter.js'; +import { AsOfNode } from '../node/asOf.js'; import { BinaryNode } from '../node/binary.js'; import { CascadeNode } from '../node/cascade.js'; import { CaseNode } from '../node/case.js'; @@ -95,6 +96,10 @@ export class Oracle extends Dialect { } return super.visitAlter(alterNode); } + public visitAsOf(asOfNode: AsOfNode): string[] { + const result = ['AS OF TIMESTAMP', ...asOfNode.nodes.flatMap(this.visit.bind(this))]; + return result; + } public visitTable(tableNode: TableNode): string[] { const table = tableNode.table; let txt = ''; diff --git a/lib/dialect/sqlite.ts b/lib/dialect/sqlite.ts index 27cd0dce..37e063dc 100644 --- a/lib/dialect/sqlite.ts +++ b/lib/dialect/sqlite.ts @@ -2,6 +2,7 @@ import assert from 'assert'; import isArray from 'lodash/isArray.js'; import { AddColumnNode } from '../node/addColumn.js'; +import { AsOfNode } from '../node/asOf.js'; import { BinaryNode } from '../node/binary.js'; import { CascadeNode } from '../node/cascade.js'; import { CreateIndexNode } from '../node/createIndex.js'; @@ -48,6 +49,9 @@ export class Sqlite extends Dialect<{ dateTimeMillis?: boolean }> { } return value; } + public visitAsOf(asOfNode: AsOfNode): string[] { + throw new Error('SQLite does not support AS OF.'); + } public visitReplace(replaceNode: ReplaceNode): string[] { // don't use table.column for replaces this.visitedReplace = true; diff --git a/lib/functions.ts b/lib/functions.ts index 714598da..44ac2f4d 100644 --- a/lib/functions.ts +++ b/lib/functions.ts @@ -74,13 +74,22 @@ const jsonbFunctions = [ 'JSONB_AGG' ] as const; +// time travel timestamp functions available to cockroachdb +const timeTravelFunctions = [ + 'STATEMENT_TIMESTAMP', + 'FOLLOWER_READ_TIMESTAMP', + 'WITH_MIN_TIMESTAMP', + 'WITH_MAX_STALENESS' +] as const; + const standardFunctionNames = [ ...aggregateFunctions, ...scalarFunctions, ...hstoreFunctions, ...textsearchFunctions, ...dateFunctions, - ...jsonbFunctions + ...jsonbFunctions, + ...timeTravelFunctions ] as const; type StandardFunctions = { diff --git a/lib/node/asOf.ts b/lib/node/asOf.ts new file mode 100644 index 00000000..685b4648 --- /dev/null +++ b/lib/node/asOf.ts @@ -0,0 +1,7 @@ +import { Node } from './node.js'; + +export class AsOfNode extends Node { + constructor() { + super('AS OF'); + } +} diff --git a/lib/node/query.ts b/lib/node/query.ts index bd596048..18cafe00 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -49,6 +49,7 @@ import { TruncateNode } from './truncate.js'; import { UpdateNode } from './update.js'; import { ValueExpressionBaseNode } from './_internal.js'; import { WhereNode } from './where.js'; +import { AsOfNode } from './asOf.js'; // get the first element of an arguments if it is an array, else return arguments as an array const getArrayOrArgsAsArray = (args: (T | T[])[]): T[] => { @@ -152,6 +153,11 @@ export class Query extends ValueExpressionBaseNode { return this; } + public asOf(node: INodeable | string): this { + this.add(new AsOfNode().add(nodeableOrTextNode(node))); + return this; + } + public leftJoin(other: INodeable): JoinNode { assert(this.type === 'SUBQUERY', 'leftJoin() can only be used on a subQuery'); return new JoinNode('LEFT', this, other.toNode()); diff --git a/test/dialects/as-of-tests.ts b/test/dialects/as-of-tests.ts new file mode 100644 index 00000000..7f409657 --- /dev/null +++ b/test/dialects/as-of-tests.ts @@ -0,0 +1,32 @@ +import * as Harness from './support.js'; +import { Sql } from '../../dist/lib.js'; +const post = Harness.definePostTable(); +const user = Harness.defineUserTable(); +const instance = new Sql('postgres'); + +Harness.test({ + query: user + .select(user.star()) + .from(user) + .asOf(instance.functions.FOLLOWER_READ_TIMESTAMP()), + pg: { + text: 'SELECT "user".* FROM "user" AS OF SYSTEM TIME FOLLOWER_READ_TIMESTAMP()', + string: 'SELECT "user".* FROM "user" AS OF SYSTEM TIME FOLLOWER_READ_TIMESTAMP()' + }, + oracle: { + text: 'SELECT "user".* FROM "user" AS OF TIMESTAMP FOLLOWER_READ_TIMESTAMP()', + string: 'SELECT "user".* FROM "user" AS OF TIMESTAMP FOLLOWER_READ_TIMESTAMP()' + } +}); + +Harness.test({ + query: user.select(user.star()).from([user, post]).asOf('\'-10s\''), + pg: { + text: 'SELECT "user".* FROM "user" , "post" AS OF SYSTEM TIME \'-10s\'', + string: 'SELECT "user".* FROM "user" , "post" AS OF SYSTEM TIME \'-10s\'' + }, + oracle: { + text: 'SELECT "user".* FROM "user" , "post" AS OF TIMESTAMP \'-10s\'', + string: 'SELECT "user".* FROM "user" , "post" AS OF TIMESTAMP \'-10s\'' + } +}); From f82e41ccc0bbab12db1e3759499ef3661e05ccf0 Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Fri, 20 Sep 2024 05:51:36 +0000 Subject: [PATCH 69/74] chore: release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6536cc5a..68ed25f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sql-ts", - "version": "6.3.0", + "version": "7.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sql-ts", - "version": "6.3.0", + "version": "7.0.0", "license": "MIT", "dependencies": { "lodash": "^4.17.21", diff --git a/package.json b/package.json index ebf91052..eecfd69f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "6.3.0", + "version": "7.0.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From 80aa430ce7cffbf2dd5da5d1ee96df40616cf085 Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Mon, 23 Sep 2024 05:47:02 +0000 Subject: [PATCH 70/74] feat: support both commonjs and esm --- package-lock.json | 7 ++++--- package.json | 11 ++++++++--- rollup.config.js | 26 ++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68ed25f3..c0abcc01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,7 @@ "license": "MIT", "dependencies": { "lodash": "^4.17.21", - "sliced": "~1.0.x", - "tslib": "~2.7.0" + "sliced": "~1.0.x" }, "devDependencies": { "@rollup/plugin-typescript": "^11.1.6", @@ -4842,6 +4841,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, "license": "0BSD" }, "node_modules/type-check": { @@ -8442,7 +8442,8 @@ "tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true }, "type-check": { "version": "0.4.0", diff --git a/package.json b/package.json index eecfd69f..0e047218 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,13 @@ "url": "git://github.com/charsleysa/node-sql-ts.git" }, "type": "module", - "exports": "./dist/lib.js", + "exports": { + ".": { + "import": "./dist/lib.js", + "require": "./dist/lib.cjs", + "types": "./dist/lib.d.ts" + } + }, "types": "./dist/lib.d.ts", "scripts": { "pretest": "eslint --ext .ts ./lib && eslint --ext .ts ./test && rollup -c && tsc -p ./test/tsconfig.json", @@ -29,8 +35,7 @@ }, "dependencies": { "lodash": "^4.17.21", - "sliced": "~1.0.x", - "tslib": "~2.7.0" + "sliced": "~1.0.x" }, "devDependencies": { "@rollup/plugin-typescript": "^11.1.6", diff --git a/rollup.config.js b/rollup.config.js index e1239732..c5e077c4 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -32,6 +32,32 @@ export default [ }) ] }, + { + input: './lib/index.ts', + output: { + file: './dist/lib.cjs', + format: 'commonjs', + sourcemap: true + }, + external: [ + 'assert', + 'lodash/defaults.js', + 'lodash/flatten.js', + 'lodash/fromPairs.js', + 'lodash/isArray.js', + 'lodash/isNumber.js', + 'lodash/isFunction.js', + 'lodash/map.js', + 'lodash/padStart.js', + 'lodash/reduce.js', + 'sliced' + ], + plugins: [ + typescript({ + tsconfig: './tsconfig.build.json' + }) + ] + }, { input: './dist/dts/index.d.ts', output: { From 213e00f17e30e9d17bee08e7916cd3d0d0aeb04c Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Mon, 23 Sep 2024 05:47:48 +0000 Subject: [PATCH 71/74] chore: release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c0abcc01..ab503253 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sql-ts", - "version": "7.0.0", + "version": "7.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sql-ts", - "version": "7.0.0", + "version": "7.1.0", "license": "MIT", "dependencies": { "lodash": "^4.17.21", diff --git a/package.json b/package.json index 0e047218..014e077d 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "7.0.0", + "version": "7.1.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": { From b8a674fb1d31af97c292256c84b1cddbeb75a05d Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Wed, 29 Jul 2026 03:08:24 +0000 Subject: [PATCH 72/74] chore!: update packages & set node minimum version to 22 --- .eslintrc.json | 207 -- eslint.config.mjs | 192 + lib/node/node.ts | 1 - lib/node/query.ts | 1 - package-lock.json | 8618 ++++++++++++++++--------------------------- package.json | 31 +- test/.eslintrc.json | 14 - test/tsconfig.json | 3 +- tsconfig.build.json | 4 +- tsconfig.json | 5 +- 10 files changed, 3399 insertions(+), 5677 deletions(-) delete mode 100644 .eslintrc.json create mode 100644 eslint.config.mjs delete mode 100644 test/.eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index cecee316..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,207 +0,0 @@ -{ - "env": { - "es6": true - }, - "extends": [ - "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": [ - "tsconfig.json" - ], - "sourceType": "module" - }, - "plugins": [ - "eslint-plugin-import", - "eslint-plugin-jsdoc", - "eslint-plugin-prefer-arrow", - "eslint-plugin-unicorn", - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/adjacent-overload-signatures": "error", - "@typescript-eslint/array-type": [ - "error", - { - "default": "array" - } - ], - "@typescript-eslint/consistent-type-assertions": "error", - "@typescript-eslint/dot-notation": "error", - "@typescript-eslint/indent": "off", - "@typescript-eslint/member-delimiter-style": [ - "off", - { - "multiline": { - "delimiter": "none", - "requireLast": true - }, - "singleline": { - "delimiter": "semi", - "requireLast": false - } - } - ], - "@typescript-eslint/naming-convention": "off", - "@typescript-eslint/no-empty-function": "error", - "@typescript-eslint/no-empty-interface": "error", - "@typescript-eslint/no-empty-object-type": "error", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-parameter-properties": "off", - "@typescript-eslint/no-shadow": [ - "error", - { - "hoist": "all" - } - ], - "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/no-unsafe-function-type": "error", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/no-var-requires": "error", - "@typescript-eslint/no-wrapper-object-types": "error", - "@typescript-eslint/prefer-for-of": "error", - "@typescript-eslint/prefer-function-type": "error", - "@typescript-eslint/prefer-namespace-keyword": "error", - "@typescript-eslint/quotes": "off", - "@typescript-eslint/semi": [ - "off", - null - ], - "@typescript-eslint/triple-slash-reference": [ - "error", - { - "path": "always", - "types": "prefer-import", - "lib": "always" - } - ], - "@typescript-eslint/type-annotation-spacing": "off", - "@typescript-eslint/unified-signatures": "error", - "arrow-parens": [ - "off", - "always" - ], - "brace-style": [ - "off", - "off" - ], - "comma-dangle": "off", - "complexity": "off", - "constructor-super": "error", - "dot-notation": "error", - "eol-last": "off", - "eqeqeq": [ - "error", - "smart" - ], - "guard-for-in": "error", - "id-blacklist": [ - "error", - "any", - "Number", - "number", - "String", - "string", - "Boolean", - "boolean", - "Undefined", - "undefined" - ], - "id-match": "error", - "import/no-extraneous-dependencies": "error", - "import/no-internal-modules": [ - "error", - { - "allow": [ - "lodash/*" - ] - } - ], - "indent": "off", - "jsdoc/check-alignment": "error", - "jsdoc/check-indentation": "error", - "linebreak-style": "off", - "max-classes-per-file": [ - "error", - 1 - ], - "max-len": "off", - "new-parens": "off", - "newline-per-chained-call": "off", - "no-bitwise": "error", - "no-caller": "error", - "no-cond-assign": "error", - "no-console": "error", - "no-debugger": "error", - "no-duplicate-case": "error", - "no-duplicate-imports": "error", - "no-empty": "error", - "no-empty-function": "error", - "no-eval": "error", - "no-extra-bind": "error", - "no-extra-semi": "off", - "no-fallthrough": "off", - "no-invalid-this": "off", - "no-irregular-whitespace": "off", - "no-multiple-empty-lines": "off", - "no-new-func": "error", - "no-new-wrappers": "error", - "no-redeclare": "error", - "no-return-await": "error", - "no-sequences": "error", - "no-shadow": "error", - "no-sparse-arrays": "error", - "no-template-curly-in-string": "error", - "no-throw-literal": "error", - "no-trailing-spaces": "off", - "no-undef-init": "error", - "no-underscore-dangle": "off", - "no-unsafe-finally": "error", - "no-unused-expressions": "error", - "no-unused-labels": "error", - "no-use-before-define": "off", - "no-var": "error", - "object-shorthand": "error", - "one-var": [ - "error", - "never" - ], - "padded-blocks": [ - "off", - { - "blocks": "never" - }, - { - "allowSingleLineBlocks": true - } - ], - "prefer-arrow/prefer-arrow-functions": "error", - "prefer-const": "error", - "prefer-object-spread": "error", - "quote-props": "off", - "quotes": "off", - "radix": "error", - "semi": "off", - "space-before-function-paren": "off", - "space-in-parens": [ - "off", - "never" - ], - "spaced-comment": [ - "error", - "always", - { - "markers": [ - "/" - ] - } - ], - "unicorn/prefer-ternary": "error", - "use-isnan": "error", - "valid-typeof": "off" - } -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..146a5dd9 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,192 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { defineConfig, globalIgnores } from '@eslint/config-helpers'; +import TypescriptEslint from '@typescript-eslint/eslint-plugin'; +import typescriptParser from '@typescript-eslint/parser'; +import EslintPluginImport from 'eslint-plugin-import'; +import EslintPluginJsdoc from 'eslint-plugin-jsdoc'; +import EslintPluginPreferArrow from 'eslint-plugin-prefer-arrow'; +import EslintPluginUnicorn from 'eslint-plugin-unicorn'; +import eslintConfigPrettier from 'eslint-config-prettier'; +// eslint-disable-next-line import/no-extraneous-dependencies +import globals from 'globals'; + +export default defineConfig([ + globalIgnores(['node_modules/', 'dist/', 'spec/', '.idea']), + { + extends: [eslintConfigPrettier], + plugins: { + 'import': EslintPluginImport, + 'jsdoc': EslintPluginJsdoc, + 'prefer-arrow': EslintPluginPreferArrow, + 'unicorn': EslintPluginUnicorn, + '@typescript-eslint': TypescriptEslint, + }, + languageOptions: { + globals: { + ...globals.es2024, + }, + sourceType: 'module', + parser: typescriptParser, + parserOptions: { + project: ['tsconfig.json'], + }, + }, + rules: { + '@typescript-eslint/adjacent-overload-signatures': 'error', + '@typescript-eslint/array-type': [ + 'error', + { + default: 'array', + }, + ], + '@typescript-eslint/consistent-type-assertions': 'error', + '@typescript-eslint/dot-notation': 'error', + '@typescript-eslint/indent': 'off', + '@typescript-eslint/member-delimiter-style': [ + 'off', + { + multiline: { + delimiter: 'none', + requireLast: true, + }, + singleline: { + delimiter: 'semi', + requireLast: false, + }, + }, + ], + '@typescript-eslint/naming-convention': 'off', + '@typescript-eslint/no-empty-function': 'error', + '@typescript-eslint/no-empty-interface': 'error', + '@typescript-eslint/no-empty-object-type': 'error', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-misused-new': 'error', + '@typescript-eslint/no-namespace': 'error', + '@typescript-eslint/no-parameter-properties': 'off', + '@typescript-eslint/no-shadow': [ + 'error', + { + hoist: 'all', + }, + ], + '@typescript-eslint/no-this-alias': 'error', + '@typescript-eslint/no-unsafe-function-type': 'error', + '@typescript-eslint/no-unused-expressions': 'error', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/no-wrapper-object-types': 'error', + '@typescript-eslint/prefer-for-of': 'error', + '@typescript-eslint/prefer-function-type': 'error', + '@typescript-eslint/prefer-namespace-keyword': 'error', + '@typescript-eslint/quotes': 'off', + '@typescript-eslint/semi': ['off', null], + '@typescript-eslint/triple-slash-reference': [ + 'error', + { + path: 'always', + types: 'prefer-import', + lib: 'always', + }, + ], + '@typescript-eslint/type-annotation-spacing': 'off', + '@typescript-eslint/unified-signatures': 'error', + 'arrow-parens': ['off', 'always'], + 'brace-style': ['off', 'off'], + 'comma-dangle': 'off', + complexity: 'off', + 'constructor-super': 'error', + 'dot-notation': 'error', + 'eol-last': 'off', + eqeqeq: ['error', 'smart'], + 'guard-for-in': 'error', + 'id-blacklist': ['error', 'any', 'Number', 'number', 'String', 'string', 'Boolean', 'boolean', 'Undefined', 'undefined'], + 'id-match': 'error', + 'import/no-extraneous-dependencies': 'error', + 'import/no-internal-modules': [ + 'error', + { + allow: ['lodash/*'], + }, + ], + indent: 'off', + 'jsdoc/check-alignment': 'error', + 'jsdoc/check-indentation': 'error', + 'linebreak-style': 'off', + 'max-classes-per-file': ['error', 1], + 'max-len': 'off', + 'new-parens': 'off', + 'newline-per-chained-call': 'off', + 'no-bitwise': 'error', + 'no-caller': 'error', + 'no-cond-assign': 'error', + 'no-console': 'error', + 'no-debugger': 'error', + 'no-duplicate-case': 'error', + 'no-duplicate-imports': 'error', + 'no-empty': 'error', + 'no-empty-function': 'error', + 'no-eval': 'error', + 'no-extra-bind': 'error', + 'no-extra-semi': 'off', + 'no-fallthrough': 'off', + 'no-invalid-this': 'off', + 'no-irregular-whitespace': 'off', + 'no-multiple-empty-lines': 'off', + 'no-new-func': 'error', + 'no-new-wrappers': 'error', + 'no-redeclare': 'error', + 'no-return-await': 'error', + 'no-shadow': 'error', + 'no-sparse-arrays': 'error', + 'no-template-curly-in-string': 'error', + 'no-throw-literal': 'error', + 'no-trailing-spaces': 'off', + 'no-undef-init': 'error', + 'no-underscore-dangle': 'off', + 'no-unsafe-finally': 'error', + 'no-unused-expressions': 'error', + 'no-unused-labels': 'error', + 'no-use-before-define': 'off', + 'no-var': 'error', + 'object-shorthand': 'error', + 'one-var': ['error', 'never'], + 'padded-blocks': [ + 'off', + { + blocks: 'never', + }, + { + allowSingleLineBlocks: true, + }, + ], + 'prefer-arrow/prefer-arrow-functions': 'error', + 'prefer-const': 'error', + 'prefer-object-spread': 'error', + 'quote-props': 'off', + quotes: 'off', + radix: 'error', + semi: 'off', + 'space-before-function-paren': 'off', + 'space-in-parens': ['off', 'never'], + 'spaced-comment': [ + 'error', + 'always', + { + markers: ['/'], + }, + ], + 'unicorn/prefer-ternary': 'error', + 'use-isnan': 'error', + 'valid-typeof': 'off', + 'no-sequences': ['error'], + }, + }, + { + files: ['test/**/*.ts'], + rules: { + "prefer-arrow/prefer-arrow-functions": "off", + "id-blacklist": "off", + "import/no-internal-modules": "off" + } + }, +]); diff --git a/lib/node/node.ts b/lib/node/node.ts index 0cf1ed7f..d846dd23 100644 --- a/lib/node/node.ts +++ b/lib/node/node.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-classes-per-file */ import assert from 'assert'; import { DEFAULT_DIALECT, getDialect } from '../dialect/mapper.js'; import type { Dialect } from '../dialect/dialect.js'; diff --git a/lib/node/query.ts b/lib/node/query.ts index 18cafe00..1572cd7e 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-underscore-dangle */ import assert from 'assert'; import sliced from 'sliced'; diff --git a/package-lock.json b/package-lock.json index ab503253..2e6fc373 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "sql-ts", "version": "7.1.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -13,64 +13,51 @@ "sliced": "~1.0.x" }, "devDependencies": { - "@rollup/plugin-typescript": "^11.1.6", + "@rollup/plugin-typescript": "^12.3.0", "@types/lodash": "^4.17.7", - "@types/mocha": "^10.0.8", - "@types/node": "^20.16.5", - "@typescript-eslint/eslint-plugin": "^8.6.0", - "@typescript-eslint/parser": "^8.6.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.30.0", - "eslint-plugin-jsdoc": "^50.2.4", + "@types/mocha": "^10.0.10", + "@types/node": "^24.13.3", + "@typescript-eslint/eslint-plugin": "^8.65.0", + "@typescript-eslint/parser": "^8.65.0", + "eslint": "^9.39.5", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsdoc": "^63.3.2", "eslint-plugin-prefer-arrow": "^1.2.3", - "eslint-plugin-unicorn": "^55.0.0", - "mocha": "^10.7.3", - "rollup-plugin-delete": "^2.1.0", - "rollup-plugin-dts": "^6.1.1", + "eslint-plugin-unicorn": "^65.0.0", + "mocha": "^11.7.6", + "rollup-plugin-delete": "^3.0.2", + "rollup-plugin-dts": "^6.4.1", "ts-node": "^10.9.2", - "typescript": "~5.5.0" + "tslib": "^2.8.1", + "typescript": "~6.0.3" }, "engines": { - "node": "^18 || ^20 || >=22" + "node": "^22 || ^24 || >=26" } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, "engines": { "node": ">=6.9.0" } @@ -88,95 +75,327 @@ "node": ">=12" } }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz", - "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.91.0.tgz", + "integrity": "sha512-vgqlMGNNhZxwDYbUNIHj3Hskb4R28iqdXx90ufHyt/NeuTQkeqjTDslAs9I0/GCAfbxP5BpH5WsL1R1fht5Lxg==", "dev": true, "license": "MIT", "dependencies": { - "comment-parser": "1.4.1", - "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.1.0" + "@types/estree": "^1.0.9", + "@typescript-eslint/types": "^8.65.0", + "comment-parser": "1.4.7", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~8.0.0" }, "engines": { - "node": ">=16" + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^4.3.0", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -193,13 +412,59 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", @@ -212,21 +477,21 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -234,6 +499,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -247,6 +513,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -256,6 +523,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -264,23 +532,21 @@ "node": ">= 8" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "node": ">=14" } }, "node_modules/@rollup/plugin-typescript": { - "version": "11.1.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", - "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.3.0.tgz", + "integrity": "sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==", "dev": true, "license": "MIT", "dependencies": { @@ -305,15 +571,15 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -328,9 +594,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.0.tgz", - "integrity": "sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.3.tgz", + "integrity": "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==", "cpu": [ "arm" ], @@ -343,9 +609,9 @@ "peer": true }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.0.tgz", - "integrity": "sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.3.tgz", + "integrity": "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==", "cpu": [ "arm64" ], @@ -358,9 +624,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.0.tgz", - "integrity": "sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.3.tgz", + "integrity": "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==", "cpu": [ "arm64" ], @@ -373,9 +639,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.0.tgz", - "integrity": "sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.3.tgz", + "integrity": "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==", "cpu": [ "x64" ], @@ -387,10 +653,40 @@ ], "peer": true }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.3.tgz", + "integrity": "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.3.tgz", + "integrity": "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.0.tgz", - "integrity": "sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.3.tgz", + "integrity": "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==", "cpu": [ "arm" ], @@ -403,9 +699,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.0.tgz", - "integrity": "sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.3.tgz", + "integrity": "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==", "cpu": [ "arm" ], @@ -418,9 +714,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.0.tgz", - "integrity": "sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.3.tgz", + "integrity": "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==", "cpu": [ "arm64" ], @@ -433,9 +729,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.0.tgz", - "integrity": "sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.3.tgz", + "integrity": "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==", "cpu": [ "arm64" ], @@ -447,12 +743,12 @@ ], "peer": true }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.0.tgz", - "integrity": "sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.3.tgz", + "integrity": "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==", "cpu": [ - "ppc64" + "loong64" ], "dev": true, "license": "MIT", @@ -462,12 +758,12 @@ ], "peer": true }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.0.tgz", - "integrity": "sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.3.tgz", + "integrity": "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==", "cpu": [ - "riscv64" + "loong64" ], "dev": true, "license": "MIT", @@ -477,12 +773,12 @@ ], "peer": true }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.0.tgz", - "integrity": "sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.3.tgz", + "integrity": "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==", "cpu": [ - "s390x" + "ppc64" ], "dev": true, "license": "MIT", @@ -492,12 +788,12 @@ ], "peer": true }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz", - "integrity": "sha512-tsSWy3YQzmpjDKnQ1Vcpy3p9Z+kMFbSIesCdMNgLizDWFhrLZIoN21JSq01g+MZMDFF+Y1+4zxgrlqPjid5ohg==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.3.tgz", + "integrity": "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "license": "MIT", @@ -507,12 +803,12 @@ ], "peer": true }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz", - "integrity": "sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.3.tgz", + "integrity": "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==", "cpu": [ - "x64" + "riscv64" ], "dev": true, "license": "MIT", @@ -522,27 +818,132 @@ ], "peer": true }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.0.tgz", - "integrity": "sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.3.tgz", + "integrity": "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==", "cpu": [ - "arm64" + "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "peer": true }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.0.tgz", - "integrity": "sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.3.tgz", + "integrity": "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==", "cpu": [ - "ia32" + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.3.tgz", + "integrity": "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.3.tgz", + "integrity": "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.3.tgz", + "integrity": "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.3.tgz", + "integrity": "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.3.tgz", + "integrity": "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.3.tgz", + "integrity": "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.3.tgz", + "integrity": "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==", + "cpu": [ + "x64" ], "dev": true, "license": "MIT", @@ -553,9 +954,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.0.tgz", - "integrity": "sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.3.tgz", + "integrity": "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==", "cpu": [ "x64" ], @@ -574,46 +975,73 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, - "node_modules/@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -623,57 +1051,44 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", "dev": true, "license": "MIT" }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, "node_modules/@types/mocha": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", - "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==", + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "20.16.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", - "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~7.18.0" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", - "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/type-utils": "8.6.0", - "@typescript-eslint/utils": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -683,27 +1098,23 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.65.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", - "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", - "debug": "^4.3.4" + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -713,23 +1124,26 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", - "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0" + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -737,19 +1151,21 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", - "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/utils": "8.6.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -758,16 +1174,14 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", - "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", "dev": true, "license": "MIT", "engines": { @@ -776,23 +1190,22 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", - "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -801,62 +1214,90 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", - "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", + "node_modules/@typescript-eslint/parser": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0" + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -866,18 +1307,26 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", - "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.6.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -885,119 +1334,193 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", "dev": true, + "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@typescript-eslint/types": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "eslint-visitor-keys": "^5.0.0" + }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/ansi-regex": { + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "acorn": "^8.11.0" }, "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/are-docs-informative": { @@ -1014,7 +1537,8 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", @@ -1024,14 +1548,14 @@ "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -1041,18 +1565,20 @@ } }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -1061,28 +1587,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -1092,16 +1610,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1111,16 +1629,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1130,20 +1648,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -1152,6 +1669,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -1169,28 +1696,39 @@ } }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/baseline-browser-mapping": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.6.tgz", + "integrity": "sha512-69D/imtToCsIcAl8WBS2YaRwA4jO/j0HhU+hELqMEu9f54MoUtI6+XH5mrKU8rEFNEk/Ui1I2MK4/JkWacclGw==", "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/braces": { @@ -1210,12 +1748,13 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "dev": true, "funding": [ { @@ -1233,10 +1772,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -1246,30 +1786,60 @@ } }, "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.3.0.tgz", + "integrity": "sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -1289,10 +1859,11 @@ } }, "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1301,9 +1872,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001662", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", - "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "dev": true, "funding": [ { @@ -1322,50 +1893,49 @@ "license": "CC-BY-4.0" }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -1378,57 +1948,108 @@ "node": ">=8" } }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { - "escape-string-regexp": "^1.0.5" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.7.tgz", + "integrity": "sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==", "dev": true, "license": "MIT", "engines": { @@ -1438,17 +2059,25 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", @@ -1459,13 +2088,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1476,15 +2107,15 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -1494,31 +2125,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -1530,9 +2161,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -1552,6 +2183,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1603,151 +2235,160 @@ } }, "node_modules/del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/del/-/del-8.0.1.tgz", + "integrity": "sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==", "dev": true, + "license": "MIT", "dependencies": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" + "globby": "^14.0.2", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^7.0.2", + "presentable-error": "^0.0.1", + "slash": "^5.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "node_modules/del/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.25", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", - "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", + "version": "1.5.398", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.398.tgz", + "integrity": "sha512-AsvhAxopJGh6museTDMIjn6JpDYOfgu4RLlygomt87MUwBUqTfd/1EiPtx10/LZE8xpTvkP2E9Gafq7lkLtodQ==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } + "license": "MIT" }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", + "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -1756,15 +2397,31 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-define-property": { + "node_modules/es-abstract-get": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4" + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -1779,17 +2436,10 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true, - "license": "MIT" - }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -1800,40 +2450,47 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -1853,93 +2510,104 @@ } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -1952,10 +2620,34 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-module-utils": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", - "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", "dev": true, "license": "MIT", "dependencies": { @@ -1981,36 +2673,55 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.9.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -2028,6 +2739,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -2035,6 +2747,19 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -2046,67 +2771,86 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.2.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.2.4.tgz", - "integrity": "sha512-020jA+dXaXdb+TML3ZJBvpPmzwbNROjnYuTYi/g6A5QEmEjhptz4oPJDKkOGMIByNxsPpdTLzSU1HYVqebOX1w==", + "version": "63.3.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.2.tgz", + "integrity": "sha512-5B3oO23iqbNJC/ru7uqIY80wmY66De1Q0+5kXQGHuLrGze/rL0Zw/YktMcqgYQ+kdHmgvY1q5TpRgl3yZMLmhQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.48.0", + "@es-joy/jsdoccomment": "~0.91.0", + "@es-joy/resolve.exports": "1.2.0", "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.6", + "comment-parser": "1.4.7", + "debug": "^4.4.3", "escape-string-regexp": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.6.0", - "parse-imports": "^2.1.1", - "semver": "^7.6.3", - "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.1" + "espree": "^11.2.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.1", + "parse-imports-exports": "^0.2.4", + "semver": "^7.8.5", + "spdx-expression-parse": "^5.0.0", + "to-valid-identifier": "^1.0.0" }, "engines": { - "node": ">=18" + "node": "^22.13.0 || >=24" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": ">=2.0.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "license": "Apache-2.0", + "node_modules/eslint-plugin-unicorn": { + "version": "65.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-65.0.1.tgz", + "integrity": "sha512-daCrQrgxOoOz2uMPWB3Y3vvv/5q+ncwICI8IjoebiwtW87CaY4tAN5EEiRXTYVnf7qi1v1BGBdHOSnZLV0rx6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "@eslint-community/eslint-utils": "^4.9.1", + "change-case": "^5.4.4", + "ci-info": "^4.4.0", + "core-js-compat": "^3.49.0", + "detect-indent": "^7.0.2", + "find-up-simple": "^1.0.1", + "globals": "^17.4.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regjsparser": "^0.13.0", + "semver": "^7.7.4", + "strip-indent": "^4.1.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.10.0 || >=21.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.38.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2115,366 +2859,126 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-prefer-arrow": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", - "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "peerDependencies": { - "eslint": ">=2.0.0" + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-unicorn": { - "version": "55.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz", - "integrity": "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==", + "node_modules/eslint/node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.5", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^4.0.0", - "clean-regexp": "^1.0.0", - "core-js-compat": "^3.37.0", - "esquery": "^1.5.0", - "globals": "^15.7.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.10.0", - "semver": "^7.6.1", - "strip-indent": "^3.0.0" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">=18.18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.56.0" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-unicorn/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2519,6 +3023,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2531,9 +3036,9 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -2541,12 +3046,25 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2562,24 +3080,44 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -2600,6 +3138,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2611,60 +3150,95 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "dev": true, + "license": "ISC" }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], + "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -2680,16 +3254,21 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2708,27 +3287,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2737,16 +3332,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -2756,48 +3365,81 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, + "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.3.tgz", + "integrity": "sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.8.0.tgz", + "integrity": "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2820,49 +3462,61 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -2879,11 +3533,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2892,9 +3549,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -2921,9 +3578,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -2938,20 +3595,32 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { @@ -2959,9 +3628,9 @@ } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2978,61 +3647,51 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -3041,46 +3700,51 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "has-bigints": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3090,16 +3754,16 @@ } }, "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", "dev": true, "license": "MIT", "dependencies": { - "builtin-modules": "^3.3.0" + "builtin-modules": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3119,13 +3783,13 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -3135,12 +3799,14 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -3151,13 +3817,30 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -3169,21 +3852,59 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3197,6 +3918,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -3221,13 +3955,14 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3237,12 +3972,16 @@ } }, "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-path-inside": { @@ -3250,6 +3989,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3259,20 +3999,36 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3281,13 +4037,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -3297,13 +4053,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3313,13 +4070,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3329,13 +4088,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -3349,6 +4108,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3356,20 +4116,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isarray": { + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", @@ -3379,20 +4172,49 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT", + "optional": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -3402,19 +4224,19 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", - "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-8.0.0.tgz", + "integrity": "sha512-uQu/fXVqVaMg6gM8/E5G5+eygVcZ1NV0Z51CvqhNa2bDWxvHMl484ETr6vph4oPyC+KUcbP/w2W2pewfCiR9aQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -3424,11 +4246,12 @@ "node": ">=6" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -3440,8 +4263,9 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "1.0.2", @@ -3456,6 +4280,16 @@ "json5": "lib/cli.js" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3470,17 +4304,12 @@ "node": ">= 0.8.0" } }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -3492,21 +4321,24 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -3518,97 +4350,46 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "ISC" }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -3627,26 +4408,33 @@ "node": ">=8.6" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.8" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -3659,32 +4447,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mocha": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "version": "11.7.6", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.6.tgz", + "integrity": "sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", + "chokidar": "^4.0.1", "debug": "^4.3.5", - "diff": "^5.2.0", + "diff": "^7.0.0", "escape-string-regexp": "^4.0.0", "find-up": "^5.0.0", - "glob": "^8.1.0", + "glob": "^10.4.5", "he": "^1.2.0", + "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", + "minimatch": "^9.0.5", "ms": "^2.1.3", + "picocolors": "^1.1.1", "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", "yargs-unparser": "^2.0.0" }, "bin": { @@ -3692,89 +4491,48 @@ "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 14.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/mocha/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.3.tgz", + "integrity": "sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, - "node_modules/mocha/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/mocha/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "brace-expansion": "^2.0.2" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3795,41 +4553,60 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, + "node_modules/object-deep-merge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.1.tgz", + "integrity": "sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==", + "dev": true, + "license": "MIT" + }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -3850,15 +4627,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -3868,6 +4647,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", @@ -3903,13 +4698,14 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -3920,15 +4716,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3947,13 +4734,33 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" @@ -3967,6 +4774,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -3978,25 +4786,24 @@ } }, "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "BlueOak-1.0.0" }, "node_modules/parent-module": { "version": "1.0.1", @@ -4011,43 +4818,39 @@ "node": ">=6" } }, - "node_modules/parse-imports": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.1.tgz", - "integrity": "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==", + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "es-module-lexer": "^1.5.3", - "slashes": "^3.0.12" - }, - "engines": { - "node": ">= 18" + "parse-statements": "1.0.11" } }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4056,32 +4859,54 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -4092,14 +4917,15 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -4116,6 +4942,19 @@ "node": ">= 0.8.0" } }, + "node_modules/presentable-error": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/presentable-error/-/presentable-error-0.0.1.tgz", + "integrity": "sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4144,7 +4983,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", @@ -4157,38 +4997,55 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, + "license": "MIT", "engines": { - "node": ">=8.10.0" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", - "bin": { - "regexp-tree": "bin/regexp-tree" + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -4198,50 +5055,59 @@ } }, "node_modules/regjsparser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", - "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", + "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4257,39 +5123,25 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.0.tgz", - "integrity": "sha512-W21MUIFPZ4+O2Je/EU+GP3iz7PH4pVPUXSbEZdatQnxo29+3rsUjgrJmzuAZU24z7yRAnFN6ukxeAhZh/c7hzg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.3.tgz", + "integrity": "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -4299,72 +5151,76 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.0", - "@rollup/rollup-android-arm64": "4.22.0", - "@rollup/rollup-darwin-arm64": "4.22.0", - "@rollup/rollup-darwin-x64": "4.22.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.0", - "@rollup/rollup-linux-arm-musleabihf": "4.22.0", - "@rollup/rollup-linux-arm64-gnu": "4.22.0", - "@rollup/rollup-linux-arm64-musl": "4.22.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.0", - "@rollup/rollup-linux-riscv64-gnu": "4.22.0", - "@rollup/rollup-linux-s390x-gnu": "4.22.0", - "@rollup/rollup-linux-x64-gnu": "4.22.0", - "@rollup/rollup-linux-x64-musl": "4.22.0", - "@rollup/rollup-win32-arm64-msvc": "4.22.0", - "@rollup/rollup-win32-ia32-msvc": "4.22.0", - "@rollup/rollup-win32-x64-msvc": "4.22.0", + "@rollup/rollup-android-arm-eabi": "4.62.3", + "@rollup/rollup-android-arm64": "4.62.3", + "@rollup/rollup-darwin-arm64": "4.62.3", + "@rollup/rollup-darwin-x64": "4.62.3", + "@rollup/rollup-freebsd-arm64": "4.62.3", + "@rollup/rollup-freebsd-x64": "4.62.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.3", + "@rollup/rollup-linux-arm-musleabihf": "4.62.3", + "@rollup/rollup-linux-arm64-gnu": "4.62.3", + "@rollup/rollup-linux-arm64-musl": "4.62.3", + "@rollup/rollup-linux-loong64-gnu": "4.62.3", + "@rollup/rollup-linux-loong64-musl": "4.62.3", + "@rollup/rollup-linux-ppc64-gnu": "4.62.3", + "@rollup/rollup-linux-ppc64-musl": "4.62.3", + "@rollup/rollup-linux-riscv64-gnu": "4.62.3", + "@rollup/rollup-linux-riscv64-musl": "4.62.3", + "@rollup/rollup-linux-s390x-gnu": "4.62.3", + "@rollup/rollup-linux-x64-gnu": "4.62.3", + "@rollup/rollup-linux-x64-musl": "4.62.3", + "@rollup/rollup-openbsd-x64": "4.62.3", + "@rollup/rollup-openharmony-arm64": "4.62.3", + "@rollup/rollup-win32-arm64-msvc": "4.62.3", + "@rollup/rollup-win32-ia32-msvc": "4.62.3", + "@rollup/rollup-win32-x64-gnu": "4.62.3", + "@rollup/rollup-win32-x64-msvc": "4.62.3", "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-delete": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.1.0.tgz", - "integrity": "sha512-TEbqJd7giLvzQDTu4jSPufwhTJs/iYVN2LfR/YIYkqjC/oZ0/h9Q0AeljifIhzBzJYZtHQTWKEbMms5fbh54pw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-3.0.2.tgz", + "integrity": "sha512-26GSi/aeYQ/hEBdG1rjEMeh+WUhiPZ3hGmSr9Ucj7mhLQ1P9j8KEgtYoybDp7OlIMj3eQjHHB9fnqhxNuVgfzA==", "dev": true, "license": "MIT", "dependencies": { - "del": "^5.1.0" + "del": "^8.0.1" }, "engines": { - "node": ">=10" + "node": ">=18" }, "peerDependencies": { "rollup": "*" } }, "node_modules/rollup-plugin-dts": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz", - "integrity": "sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.4.1.tgz", + "integrity": "sha512-l//F3Zf7ID5GoOfLfD8kroBjQKEKpy1qfhtAdnpibFZMffPaylrg1CoDC2vGkPeTeyxUe4bVFCln2EFuL7IGGg==", "dev": true, "license": "LGPL-3.0-only", "dependencies": { - "magic-string": "^0.30.10" + "@jridgewell/remapping": "^2.3.5", + "@jridgewell/sourcemap-codec": "^1.5.5", + "convert-source-map": "^2.0.0", + "magic-string": "^0.30.21" }, "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/Swatinem" }, "optionalDependencies": { - "@babel/code-frame": "^7.24.2" + "@babel/code-frame": "^7.29.0" }, "peerDependencies": { "rollup": "^3.29.4 || ^4", - "typescript": "^4.5 || ^5.0" + "typescript": "^4.5 || ^5.0 || ^6.0" } }, - "node_modules/rollup/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4384,20 +5240,22 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -4428,16 +5286,33 @@ ], "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -4447,13 +5322,16 @@ } }, "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/serialize-javascript": { @@ -4500,11 +5378,27 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -4517,21 +5411,23 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4540,84 +5436,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slashes": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", - "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true, - "license": "ISC" - }, - "node_modules/sliced": { + "node_modules/side-channel-list": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -4626,31 +5453,233 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==", + "deprecated": "Unsupported", + "license": "MIT" + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-5.0.0.tgz", + "integrity": "sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4660,10 +5689,28 @@ } }, "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4671,6 +5718,16 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -4682,16 +5739,16 @@ } }, "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", + "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -4699,6 +5756,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4707,15 +5765,16 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -4731,29 +5790,23 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=12.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4767,17 +5820,34 @@ "node": ">=8.0" } }, + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-node": { @@ -4824,6 +5894,16 @@ } } }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -4838,9 +5918,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, @@ -4857,46 +5937,33 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -4906,18 +5973,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -4927,18 +5995,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -4948,9 +6016,9 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4962,32 +6030,48 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -5005,8 +6089,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -5032,21 +6116,12 @@ "dev": true, "license": "MIT" }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -5058,33 +6133,85 @@ } }, "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -5105,17 +6232,37 @@ } }, "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", "dev": true, "license": "Apache-2.0" }, "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5128,80 +6275,101 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-unparser": { @@ -5209,6 +6377,7 @@ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -5219,3492 +6388,73 @@ "node": ">=10" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@es-joy/jsdoccomment": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz", - "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==", - "dev": true, - "requires": { - "comment-parser": "1.4.1", - "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.1.0" - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "node": ">=8" } }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } + "license": "MIT" }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true - }, - "@rollup/plugin-typescript": { - "version": "11.1.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", - "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "requires": { - "@rollup/pluginutils": "^5.1.0", - "resolve": "^1.22.1" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.0.tgz", - "integrity": "sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.0.tgz", - "integrity": "sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.0.tgz", - "integrity": "sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.0.tgz", - "integrity": "sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.0.tgz", - "integrity": "sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.0.tgz", - "integrity": "sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.0.tgz", - "integrity": "sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.0.tgz", - "integrity": "sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.0.tgz", - "integrity": "sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.0.tgz", - "integrity": "sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.0.tgz", - "integrity": "sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz", - "integrity": "sha512-tsSWy3YQzmpjDKnQ1Vcpy3p9Z+kMFbSIesCdMNgLizDWFhrLZIoN21JSq01g+MZMDFF+Y1+4zxgrlqPjid5ohg==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz", - "integrity": "sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.0.tgz", - "integrity": "sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.0.tgz", - "integrity": "sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ==", - "dev": true, - "optional": true, - "peer": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.0.tgz", - "integrity": "sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA==", - "dev": true, - "optional": true, - "peer": true - }, - "@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/mocha": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", - "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==", - "dev": true - }, - "@types/node": { - "version": "20.16.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", - "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", - "dev": true, - "requires": { - "undici-types": "~6.19.2" - } - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", - "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/type-utils": "8.6.0", - "@typescript-eslint/utils": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/parser": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", - "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", - "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", - "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/utils": "8.6.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/types": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", - "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", - "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "@typescript-eslint/utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", - "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", - "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.6.0", - "eslint-visitor-keys": "^3.4.3" - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - } - }, - "array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - } - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - } - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001662", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", - "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", - "dev": true - }, - "clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", - "dev": true, - "requires": { - "browserslist": "^4.23.3" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - } - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.5.25", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", - "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - } - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true - }, - "es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true - }, - "es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - } - }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", - "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", - "dev": true, - "requires": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.9.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "eslint-plugin-jsdoc": { - "version": "50.2.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.2.4.tgz", - "integrity": "sha512-020jA+dXaXdb+TML3ZJBvpPmzwbNROjnYuTYi/g6A5QEmEjhptz4oPJDKkOGMIByNxsPpdTLzSU1HYVqebOX1w==", - "dev": true, - "requires": { - "@es-joy/jsdoccomment": "~0.48.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.6", - "escape-string-regexp": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.6.0", - "parse-imports": "^2.1.1", - "semver": "^7.6.3", - "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.1" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true - }, - "espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "requires": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - } - } - }, - "eslint-plugin-prefer-arrow": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", - "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", - "dev": true, - "requires": {} - }, - "eslint-plugin-unicorn": { - "version": "55.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz", - "integrity": "sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.24.5", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^4.0.0", - "clean-regexp": "^1.0.0", - "core-js-compat": "^3.37.0", - "esquery": "^1.5.0", - "globals": "^15.7.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.10.0", - "semver": "^7.6.1", - "strip-indent": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "requires": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "requires": { - "is-typed-array": "^1.1.13" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.14" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsdoc-type-pratt-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", - "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", - "dev": true - }, - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "mocha": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - } - }, - "object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - } - }, - "object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - } - }, - "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-imports": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.1.tgz", - "integrity": "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==", - "dev": true, - "requires": { - "es-module-lexer": "^1.5.3", - "slashes": "^3.0.12" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - } - }, - "regjsparser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", - "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.0.tgz", - "integrity": "sha512-W21MUIFPZ4+O2Je/EU+GP3iz7PH4pVPUXSbEZdatQnxo29+3rsUjgrJmzuAZU24z7yRAnFN6ukxeAhZh/c7hzg==", - "dev": true, - "peer": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.22.0", - "@rollup/rollup-android-arm64": "4.22.0", - "@rollup/rollup-darwin-arm64": "4.22.0", - "@rollup/rollup-darwin-x64": "4.22.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.0", - "@rollup/rollup-linux-arm-musleabihf": "4.22.0", - "@rollup/rollup-linux-arm64-gnu": "4.22.0", - "@rollup/rollup-linux-arm64-musl": "4.22.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.0", - "@rollup/rollup-linux-riscv64-gnu": "4.22.0", - "@rollup/rollup-linux-s390x-gnu": "4.22.0", - "@rollup/rollup-linux-x64-gnu": "4.22.0", - "@rollup/rollup-linux-x64-musl": "4.22.0", - "@rollup/rollup-win32-arm64-msvc": "4.22.0", - "@rollup/rollup-win32-ia32-msvc": "4.22.0", - "@rollup/rollup-win32-x64-msvc": "4.22.0", - "@types/estree": "1.0.5", - "fsevents": "~2.3.2" - }, - "dependencies": { - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "peer": true - } - } - }, - "rollup-plugin-delete": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.1.0.tgz", - "integrity": "sha512-TEbqJd7giLvzQDTu4jSPufwhTJs/iYVN2LfR/YIYkqjC/oZ0/h9Q0AeljifIhzBzJYZtHQTWKEbMms5fbh54pw==", - "dev": true, - "requires": { - "del": "^5.1.0" - } - }, - "rollup-plugin-dts": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz", - "integrity": "sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.2", - "magic-string": "^0.30.10" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slashes": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", - "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true - }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", - "dev": true, - "requires": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "requires": {} - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - } - }, - "typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", - "dev": true, - "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - } - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true } } } diff --git a/package.json b/package.json index 014e077d..4fef768a 100644 --- a/package.json +++ b/package.json @@ -31,30 +31,31 @@ "release:patch": "npm run test && npm run build && npm version patch -m \"chore: release\" && git push origin master --tags && npm publish" }, "engines": { - "node": "^18 || ^20 || >=22" + "node": "^22 || ^24 || >=26" }, "dependencies": { "lodash": "^4.17.21", "sliced": "~1.0.x" }, "devDependencies": { - "@rollup/plugin-typescript": "^11.1.6", + "@rollup/plugin-typescript": "^12.3.0", + "@types/mocha": "^10.0.10", "@types/lodash": "^4.17.7", - "@types/mocha": "^10.0.8", - "@types/node": "^20.16.5", - "@typescript-eslint/eslint-plugin": "^8.6.0", - "@typescript-eslint/parser": "^8.6.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.30.0", - "eslint-plugin-jsdoc": "^50.2.4", + "@types/node": "^24.13.3", + "@typescript-eslint/eslint-plugin": "^8.65.0", + "@typescript-eslint/parser": "^8.65.0", + "eslint": "^9.39.5", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsdoc": "^63.3.2", "eslint-plugin-prefer-arrow": "^1.2.3", - "eslint-plugin-unicorn": "^55.0.0", - "mocha": "^10.7.3", - "rollup-plugin-delete": "^2.1.0", - "rollup-plugin-dts": "^6.1.1", + "eslint-plugin-unicorn": "^65.0.0", + "mocha": "^11.7.6", + "rollup-plugin-delete": "^3.0.2", + "rollup-plugin-dts": "^6.4.1", "ts-node": "^10.9.2", - "typescript": "~5.5.0" + "tslib": "^2.8.1", + "typescript": "~6.0.3" }, "mocha": { "reporter": "dot", diff --git a/test/.eslintrc.json b/test/.eslintrc.json deleted file mode 100644 index ac57f9aa..00000000 --- a/test/.eslintrc.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../.eslintrc.json", - "parserOptions": { - "project": [ - "tsconfig.json" - ], - "sourceType": "module" - }, - "rules": { - "prefer-arrow/prefer-arrow-functions": "off", - "id-blacklist": "off", - "import/no-internal-modules": "off" - } -} \ No newline at end of file diff --git a/test/tsconfig.json b/test/tsconfig.json index 7424fd4b..7fb67499 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "outDir": "../spec" + "outDir": "../spec", + "types": ["lodash", "mocha", "node", "sliced"] }, "include": ["./*.ts", "./**/*.ts", "./**/*.js", "./**/*.d.ts"] } diff --git a/tsconfig.build.json b/tsconfig.build.json index 9e232a1c..6e9c87e5 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,9 +1,9 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "baseUrl": "./lib", "outDir": "./dist", - "declarationDir": "./dts" + "rootDir": "./lib", + "declarationDir": "./dist/dts" }, "include": ["./lib/**/*.ts"] } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 463c4be1..59dde7b6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "es2022", "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "esModuleInterop": true, "noEmitHelpers": true, @@ -16,7 +16,8 @@ "removeComments": false, "noImplicitReturns": true, "declaration": true, - "typeRoots": ["@types", "node_modules/@types"] + "typeRoots": ["./@types", "./node_modules/@types"], + "types": ["lodash", "node", "sliced"] }, "exclude": ["node_modules", "./dist"], "compileOnSave": true, From 5a11a7acc5fc606690ecb86656ef3f58eb83eb96 Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Wed, 29 Jul 2026 03:58:19 +0000 Subject: [PATCH 73/74] feat: add support for index predicate in ON CONFLICT --- lib/dialect/dialect.ts | 3 +++ lib/node/onConflict.ts | 5 ++++- lib/node/query.ts | 2 +- test/dialects/insert-tests.ts | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/lib/dialect/dialect.ts b/lib/dialect/dialect.ts index d867b9fe..ff830e81 100644 --- a/lib/dialect/dialect.ts +++ b/lib/dialect/dialect.ts @@ -1063,6 +1063,9 @@ export abstract class Dialect { columns.push(this.quote(table.getColumn(onConflictNode.columns[i])!.name)); } result.push('(' + columns.join(', ') + ')'); + if (onConflictNode.where) { + result.push('WHERE', ...this.visit(onConflictNode.where)); + } } if (onConflictNode.update) { updateClause.push('DO UPDATE SET'); diff --git a/lib/node/onConflict.ts b/lib/node/onConflict.ts index 368751de..b10082a9 100644 --- a/lib/node/onConflict.ts +++ b/lib/node/onConflict.ts @@ -1,14 +1,17 @@ +import { INodeable } from '../nodeable.js'; import { Node } from './node.js'; export class OnConflictNode extends Node { public columns?: string[]; public constraint?: string; + public where?: Node; public update?: string[]; - constructor(config: { columns?: string[]; constraint?: string; update?: string[] } = {}) { + constructor(config: { columns?: string[]; constraint?: string; where?: INodeable; update?: string[] } = {}) { super('ONCONFLICT'); this.columns = config.columns; this.constraint = config.constraint; + this.where = config.where?.toNode(); this.update = config.update; } } diff --git a/lib/node/query.ts b/lib/node/query.ts index 1572cd7e..1f3f8009 100644 --- a/lib/node/query.ts +++ b/lib/node/query.ts @@ -366,7 +366,7 @@ export class Query extends ValueExpressionBaseNode { return this.add(onDuplicate); } - public onConflict(options?: { constraint: string; update?: string[] } | { columns: string[]; update?: string[] }): this { + public onConflict(options?: { constraint: string; update?: string[] } | { columns: string[]; where?: INodeable; update?: string[] }): this { const onConflict = new OnConflictNode(options); return this.add(onConflict); } diff --git a/test/dialects/insert-tests.ts b/test/dialects/insert-tests.ts index a545af82..e4081ce8 100644 --- a/test/dialects/insert-tests.ts +++ b/test/dialects/insert-tests.ts @@ -809,6 +809,38 @@ Harness.test({ params: ['test', 2] }); +Harness.test({ + query: post + .insert({ + content: 'test', + userId: 2 + }) + .onConflict({ + columns: ['userId', 'content'], + where: post.length.gt(250), + update: ['content', 'userId'], + }), + mysql: { + throws: true + }, + sqlite: { + throws: true + }, + pg: { + text: + 'INSERT INTO "post" ("content", "userId") VALUES ($1, $2) ON CONFLICT ("userId", "content") WHERE ("post"."length" > $3) DO UPDATE SET "content" = EXCLUDED."content", "userId" = EXCLUDED."userId"', + string: + 'INSERT INTO "post" ("content", "userId") VALUES (\'test\', 2) ON CONFLICT ("userId", "content") WHERE ("post"."length" > 250) DO UPDATE SET "content" = EXCLUDED."content", "userId" = EXCLUDED."userId"' + }, + mssql: { + throws: true + }, + oracle: { + throws: true + }, + params: ['test', 2, 250] +}); + Harness.test({ query: post .insert({ From deeaa3172aa075433300669a813d510ff4a11187 Mon Sep 17 00:00:00 2001 From: Stefan Charsley Date: Wed, 29 Jul 2026 04:08:29 +0000 Subject: [PATCH 74/74] chore: release --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2e6fc373..3651bcba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sql-ts", - "version": "7.1.0", + "version": "8.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sql-ts", - "version": "7.1.0", + "version": "8.0.0", "license": "MIT", "dependencies": { "lodash": "^4.17.21", diff --git a/package.json b/package.json index 4fef768a..c4aa8968 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ }, "name": "sql-ts", "description": "SQL Builder", - "version": "7.1.0", + "version": "8.0.0", "homepage": "https://github.com/charsleysa/node-sql-ts", "license": "MIT", "repository": {