From 2d35645cb3008b6d45e20916d0beccce9f6e7e30 Mon Sep 17 00:00:00 2001 From: daffl Date: Tue, 24 Sep 2024 16:41:05 -0700 Subject: [PATCH] chore: Remove all modules that will be moved into the ecosystem --- {generators => .generate}/package.ts | 0 .../package/index.tpl.ts | 0 .../package/license.tpl.ts | 0 .../package/package.json.tpl.ts | 2 +- .../package/readme.md.tpl.ts | 0 {generators => .generate}/package/test.tpl.ts | 0 .../package/tsconfig.json.tpl.ts | 0 docs/.vitepress/components.d.ts | 2 +- docs/auto-imports.d.ts | 1 + package-lock.json | 10851 ++++++---------- package.json | 2 +- packages/adapter-commons/CHANGELOG.md | 624 - packages/adapter-commons/LICENSE | 22 - packages/adapter-commons/README.md | 27 - packages/adapter-commons/package.json | 68 - packages/adapter-commons/src/declarations.ts | 162 - packages/adapter-commons/src/index.ts | 29 - packages/adapter-commons/src/query.ts | 158 - packages/adapter-commons/src/service.ts | 188 - packages/adapter-commons/src/sort.ts | 129 - packages/adapter-commons/test/commons.test.ts | 91 - packages/adapter-commons/test/fixture.ts | 115 - packages/adapter-commons/test/query.test.ts | 313 - packages/adapter-commons/test/service.test.ts | 227 - packages/adapter-commons/test/sort.test.ts | 384 - packages/adapter-commons/tsconfig.json | 9 - packages/adapter-tests/CHANGELOG.md | 487 - packages/adapter-tests/LICENSE | 22 - packages/adapter-tests/README.md | 21 - packages/adapter-tests/package.json | 61 - packages/adapter-tests/src/basic.ts | 50 - packages/adapter-tests/src/declarations.ts | 98 - packages/adapter-tests/src/index.ts | 57 - packages/adapter-tests/src/methods.ts | 773 -- packages/adapter-tests/src/syntax.ts | 423 - packages/adapter-tests/test/index.test.ts | 85 - packages/adapter-tests/tsconfig.json | 9 - packages/authentication-client/CHANGELOG.md | 847 -- packages/authentication-client/LICENSE | 22 - packages/authentication-client/README.md | 23 - packages/authentication-client/package.json | 77 - packages/authentication-client/src/core.ts | 248 - .../src/hooks/authentication.ts | 26 - .../authentication-client/src/hooks/index.ts | 2 - .../src/hooks/populate-header.ts | 27 - packages/authentication-client/src/index.ts | 68 - packages/authentication-client/src/storage.ts | 49 - .../authentication-client/test/index.test.ts | 247 - .../test/integration/commons.ts | 118 - .../test/integration/express.test.ts | 40 - .../test/integration/fixture.ts | 65 - .../test/integration/socketio.test.ts | 98 - packages/authentication-client/tsconfig.json | 9 - packages/authentication-local/CHANGELOG.md | 827 -- packages/authentication-local/LICENSE | 22 - packages/authentication-local/README.md | 23 - packages/authentication-local/package.json | 76 - .../src/hooks/hash-password.ts | 67 - .../authentication-local/src/hooks/protect.ts | 42 - packages/authentication-local/src/index.ts | 28 - packages/authentication-local/src/strategy.ts | 142 - packages/authentication-local/test/fixture.ts | 63 - .../test/hooks/hash-password.test.ts | 91 - .../test/hooks/protect.test.ts | 183 - .../test/strategy.test.ts | 224 - packages/authentication-local/tsconfig.json | 9 - packages/authentication-oauth/CHANGELOG.md | 555 - packages/authentication-oauth/LICENSE | 21 - packages/authentication-oauth/README.md | 23 - packages/authentication-oauth/package.json | 85 - packages/authentication-oauth/src/index.ts | 56 - packages/authentication-oauth/src/service.ts | 203 - packages/authentication-oauth/src/strategy.ts | 176 - packages/authentication-oauth/src/utils.ts | 127 - .../authentication-oauth/test/index.test.ts | 29 - .../authentication-oauth/test/service.test.ts | 57 - .../test/strategy.test.ts | 200 - .../authentication-oauth/test/utils.test.ts | 73 - .../test/utils/fixture.ts | 95 - .../test/utils/provider.ts | 282 - packages/authentication-oauth/tsconfig.json | 9 - packages/authentication/CHANGELOG.md | 1836 --- packages/authentication/LICENSE | 22 - packages/authentication/README.md | 23 - packages/authentication/package.json | 80 - packages/authentication/src/core.ts | 318 - .../authentication/src/hooks/authenticate.ts | 69 - .../authentication/src/hooks/connection.ts | 17 - packages/authentication/src/hooks/event.ts | 16 - packages/authentication/src/hooks/index.ts | 3 - packages/authentication/src/index.ts | 15 - packages/authentication/src/jwt.ts | 190 - packages/authentication/src/options.ts | 16 - packages/authentication/src/service.ts | 203 - packages/authentication/src/strategy.ts | 34 - packages/authentication/test/core.test.ts | 445 - packages/authentication/test/fixtures.ts | 65 - .../test/hooks/authenticate.test.ts | 256 - .../authentication/test/hooks/event.test.ts | 83 - packages/authentication/test/jwt.test.ts | 492 - packages/authentication/test/service.test.ts | 322 - packages/authentication/tsconfig.json | 9 - packages/cli/package.json | 23 +- packages/cli/src/index.ts | 20 +- packages/commons/package.json | 5 +- packages/configuration/CHANGELOG.md | 713 - packages/configuration/LICENSE | 22 - packages/configuration/README.md | 23 - packages/configuration/package.json | 76 - packages/configuration/src/index.ts | 39 - .../configuration/test/config/default.json | 6 - packages/configuration/test/index.test.ts | 67 - packages/configuration/tsconfig.json | 9 - packages/errors/package.json | 5 +- packages/express/CHANGELOG.md | 738 -- packages/express/LICENSE | 21 - packages/express/README.md | 23 - packages/express/package.json | 82 - packages/express/public/401.html | 67 - packages/express/public/404.html | 66 - packages/express/public/default.html | 66 - packages/express/src/authentication.ts | 66 - packages/express/src/declarations.ts | 68 - packages/express/src/handlers.ts | 132 - packages/express/src/index.ts | 166 - packages/express/src/rest.ts | 113 - packages/express/test/authentication.test.ts | 210 - packages/express/test/error-handler.test.ts | 399 - packages/express/test/index.test.ts | 291 - .../express/test/not-found-handler.test.ts | 44 - packages/express/test/rest.test.ts | 715 - packages/express/tsconfig.json | 9 - packages/feathers/package.json | 5 +- packages/generators/CHANGELOG.md | 206 - packages/generators/README.md | 22 - packages/generators/package.json | 96 - packages/generators/src/app/index.ts | 214 - .../src/app/templates/app.test.tpl.ts | 50 - .../generators/src/app/templates/app.tpl.ts | 141 - .../src/app/templates/channels.tpl.ts | 54 - .../src/app/templates/client.test.tpl.ts | 28 - .../src/app/templates/client.tpl.ts | 53 - .../src/app/templates/configuration.tpl.ts | 89 - .../src/app/templates/declarations.tpl.ts | 42 - .../src/app/templates/gitignore.tpl.ts | 128 - .../src/app/templates/index.html.tpl.ts | 44 - .../generators/src/app/templates/index.tpl.ts | 26 - .../src/app/templates/logger.tpl.ts | 56 - .../src/app/templates/package.json.tpl.ts | 78 - .../src/app/templates/prettierrc.tpl.ts | 14 - .../src/app/templates/readme.md.tpl.ts | 57 - .../src/app/templates/services.tpl.ts | 20 - .../src/app/templates/tsconfig.json.tpl.ts | 29 - .../src/app/templates/validators.tpl.ts | 39 - .../generators/src/authentication/index.ts | 119 - .../templates/authentication.tpl.ts | 52 - .../templates/client.test.tpl.ts | 78 - .../authentication/templates/config.tpl.ts | 60 - .../templates/declarations.tpl.ts | 38 - packages/generators/src/commons.ts | 346 - packages/generators/src/connection/index.ts | 138 - .../src/connection/templates/knex.tpl.ts | 73 - .../src/connection/templates/mongodb.tpl.ts | 50 - packages/generators/src/hook/index.ts | 52 - .../generators/src/hook/templates/hook.tpl.ts | 33 - packages/generators/src/index.ts | 8 - packages/generators/src/service/index.ts | 214 - .../src/service/templates/client.tpl.ts | 33 - .../src/service/templates/schema.json.tpl.ts | 143 - .../service/templates/schema.typebox.tpl.ts | 131 - .../src/service/templates/service.tpl.ts | 161 - .../src/service/templates/shared.tpl.ts | 64 - .../src/service/templates/test.tpl.ts | 33 - .../generators/src/service/type/custom.tpl.ts | 112 - .../generators/src/service/type/knex.tpl.ts | 105 - .../src/service/type/mongodb.tpl.ts | 64 - packages/generators/test/build/.gitkeep | 0 packages/generators/test/commons.test.ts | 40 - packages/generators/test/generators.test.ts | 176 - packages/generators/test/utils.ts | 36 - packages/generators/tsconfig.json | 11 - packages/knex/CHANGELOG.md | 243 - packages/knex/LICENSE | 22 - packages/knex/README.md | 23 - packages/knex/package.json | 75 - packages/knex/src/adapter.ts | 363 - packages/knex/src/declarations.ts | 23 - packages/knex/src/error-handler.ts | 98 - packages/knex/src/hooks.ts | 102 - packages/knex/src/index.ts | 79 - packages/knex/test/connection.ts | 32 - packages/knex/test/error-handler.test.ts | 65 - packages/knex/test/index.test.ts | 728 -- packages/knex/test/overrides.test.ts | 132 - packages/knex/tsconfig.json | 9 - packages/koa/CHANGELOG.md | 329 - packages/koa/LICENSE | 22 - packages/koa/README.md | 23 - packages/koa/package.json | 82 - packages/koa/src/authentication.ts | 56 - packages/koa/src/declarations.ts | 37 - packages/koa/src/handlers.ts | 20 - packages/koa/src/index.ts | 109 - packages/koa/src/rest.ts | 94 - packages/koa/test/app.fixture.ts | 70 - packages/koa/test/authentication.test.ts | 128 - packages/koa/test/index.test.ts | 219 - packages/koa/tsconfig.json | 9 - packages/memory/CHANGELOG.md | 762 -- packages/memory/LICENSE | 22 - packages/memory/README.md | 23 - packages/memory/package.json | 68 - packages/memory/src/index.ts | 328 - packages/memory/test/index.test.ts | 280 - packages/memory/tsconfig.json | 9 - packages/mongodb/CHANGELOG.md | 263 - packages/mongodb/LICENSE | 22 - packages/mongodb/README.md | 23 - packages/mongodb/package.json | 73 - packages/mongodb/src/adapter.ts | 582 - packages/mongodb/src/converters.ts | 64 - packages/mongodb/src/error-handler.ts | 14 - packages/mongodb/src/index.ts | 75 - packages/mongodb/test/converters.test.ts | 109 - packages/mongodb/test/index.test.ts | 841 -- packages/mongodb/tsconfig.json | 9 - packages/rest-client/package.json | 5 +- packages/schema/CHANGELOG.md | 368 - packages/schema/LICENSE | 22 - packages/schema/README.md | 23 - packages/schema/package.json | 80 - packages/schema/src/default-schemas.ts | 178 - packages/schema/src/hooks/index.ts | 2 - packages/schema/src/hooks/resolve.ts | 242 - packages/schema/src/hooks/validate.ts | 60 - packages/schema/src/index.ts | 24 - packages/schema/src/json-schema.ts | 244 - packages/schema/src/resolver.ts | 203 - packages/schema/src/schema.ts | 70 - packages/schema/test/fixture.ts | 285 - packages/schema/test/hooks.test.ts | 276 - packages/schema/test/json-schema.test.ts | 109 - packages/schema/test/resolver.test.ts | 220 - packages/schema/test/schema.test.ts | 341 - packages/schema/tsconfig.json | 9 - packages/socketio-client/CHANGELOG.md | 609 - packages/socketio-client/LICENSE | 22 - packages/socketio-client/README.md | 23 - packages/socketio-client/package.json | 74 - packages/socketio-client/src/index.ts | 64 - packages/socketio-client/test/index.test.ts | 108 - packages/socketio-client/test/server.ts | 66 - packages/socketio-client/tsconfig.json | 9 - packages/socketio/CHANGELOG.md | 913 -- packages/socketio/LICENSE | 22 - packages/socketio/README.md | 23 - packages/socketio/package.json | 74 - packages/socketio/src/index.ts | 103 - packages/socketio/src/middleware.ts | 77 - packages/socketio/test/events.ts | 216 - packages/socketio/test/index.test.ts | 280 - packages/socketio/test/methods.ts | 128 - packages/socketio/tsconfig.json | 9 - packages/tests/package.json | 3 +- packages/transport-commons/package.json | 5 +- packages/typebox/CHANGELOG.md | 202 - packages/typebox/LICENSE | 21 - packages/typebox/README.md | 23 - packages/typebox/package.json | 68 - packages/typebox/src/default-schemas.ts | 109 - packages/typebox/src/index.ts | 201 - packages/typebox/test/index.test.ts | 152 - packages/typebox/tsconfig.json | 9 - 273 files changed, 4056 insertions(+), 42980 deletions(-) rename {generators => .generate}/package.ts (100%) rename {generators => .generate}/package/index.tpl.ts (100%) rename {generators => .generate}/package/license.tpl.ts (100%) rename {generators => .generate}/package/package.json.tpl.ts (96%) rename {generators => .generate}/package/readme.md.tpl.ts (100%) rename {generators => .generate}/package/test.tpl.ts (100%) rename {generators => .generate}/package/tsconfig.json.tpl.ts (100%) delete mode 100644 packages/adapter-commons/CHANGELOG.md delete mode 100644 packages/adapter-commons/LICENSE delete mode 100644 packages/adapter-commons/README.md delete mode 100644 packages/adapter-commons/package.json delete mode 100644 packages/adapter-commons/src/declarations.ts delete mode 100644 packages/adapter-commons/src/index.ts delete mode 100644 packages/adapter-commons/src/query.ts delete mode 100644 packages/adapter-commons/src/service.ts delete mode 100644 packages/adapter-commons/src/sort.ts delete mode 100644 packages/adapter-commons/test/commons.test.ts delete mode 100644 packages/adapter-commons/test/fixture.ts delete mode 100644 packages/adapter-commons/test/query.test.ts delete mode 100644 packages/adapter-commons/test/service.test.ts delete mode 100644 packages/adapter-commons/test/sort.test.ts delete mode 100644 packages/adapter-commons/tsconfig.json delete mode 100644 packages/adapter-tests/CHANGELOG.md delete mode 100644 packages/adapter-tests/LICENSE delete mode 100644 packages/adapter-tests/README.md delete mode 100644 packages/adapter-tests/package.json delete mode 100644 packages/adapter-tests/src/basic.ts delete mode 100644 packages/adapter-tests/src/declarations.ts delete mode 100644 packages/adapter-tests/src/index.ts delete mode 100644 packages/adapter-tests/src/methods.ts delete mode 100644 packages/adapter-tests/src/syntax.ts delete mode 100644 packages/adapter-tests/test/index.test.ts delete mode 100644 packages/adapter-tests/tsconfig.json delete mode 100644 packages/authentication-client/CHANGELOG.md delete mode 100644 packages/authentication-client/LICENSE delete mode 100644 packages/authentication-client/README.md delete mode 100644 packages/authentication-client/package.json delete mode 100644 packages/authentication-client/src/core.ts delete mode 100644 packages/authentication-client/src/hooks/authentication.ts delete mode 100644 packages/authentication-client/src/hooks/index.ts delete mode 100644 packages/authentication-client/src/hooks/populate-header.ts delete mode 100644 packages/authentication-client/src/index.ts delete mode 100644 packages/authentication-client/src/storage.ts delete mode 100644 packages/authentication-client/test/index.test.ts delete mode 100644 packages/authentication-client/test/integration/commons.ts delete mode 100644 packages/authentication-client/test/integration/express.test.ts delete mode 100644 packages/authentication-client/test/integration/fixture.ts delete mode 100644 packages/authentication-client/test/integration/socketio.test.ts delete mode 100644 packages/authentication-client/tsconfig.json delete mode 100644 packages/authentication-local/CHANGELOG.md delete mode 100644 packages/authentication-local/LICENSE delete mode 100644 packages/authentication-local/README.md delete mode 100644 packages/authentication-local/package.json delete mode 100644 packages/authentication-local/src/hooks/hash-password.ts delete mode 100644 packages/authentication-local/src/hooks/protect.ts delete mode 100644 packages/authentication-local/src/index.ts delete mode 100644 packages/authentication-local/src/strategy.ts delete mode 100644 packages/authentication-local/test/fixture.ts delete mode 100644 packages/authentication-local/test/hooks/hash-password.test.ts delete mode 100644 packages/authentication-local/test/hooks/protect.test.ts delete mode 100644 packages/authentication-local/test/strategy.test.ts delete mode 100644 packages/authentication-local/tsconfig.json delete mode 100644 packages/authentication-oauth/CHANGELOG.md delete mode 100644 packages/authentication-oauth/LICENSE delete mode 100644 packages/authentication-oauth/README.md delete mode 100644 packages/authentication-oauth/package.json delete mode 100644 packages/authentication-oauth/src/index.ts delete mode 100644 packages/authentication-oauth/src/service.ts delete mode 100644 packages/authentication-oauth/src/strategy.ts delete mode 100644 packages/authentication-oauth/src/utils.ts delete mode 100644 packages/authentication-oauth/test/index.test.ts delete mode 100644 packages/authentication-oauth/test/service.test.ts delete mode 100644 packages/authentication-oauth/test/strategy.test.ts delete mode 100644 packages/authentication-oauth/test/utils.test.ts delete mode 100644 packages/authentication-oauth/test/utils/fixture.ts delete mode 100644 packages/authentication-oauth/test/utils/provider.ts delete mode 100644 packages/authentication-oauth/tsconfig.json delete mode 100644 packages/authentication/CHANGELOG.md delete mode 100644 packages/authentication/LICENSE delete mode 100644 packages/authentication/README.md delete mode 100644 packages/authentication/package.json delete mode 100644 packages/authentication/src/core.ts delete mode 100644 packages/authentication/src/hooks/authenticate.ts delete mode 100644 packages/authentication/src/hooks/connection.ts delete mode 100644 packages/authentication/src/hooks/event.ts delete mode 100644 packages/authentication/src/hooks/index.ts delete mode 100644 packages/authentication/src/index.ts delete mode 100644 packages/authentication/src/jwt.ts delete mode 100644 packages/authentication/src/options.ts delete mode 100644 packages/authentication/src/service.ts delete mode 100644 packages/authentication/src/strategy.ts delete mode 100644 packages/authentication/test/core.test.ts delete mode 100644 packages/authentication/test/fixtures.ts delete mode 100644 packages/authentication/test/hooks/authenticate.test.ts delete mode 100644 packages/authentication/test/hooks/event.test.ts delete mode 100644 packages/authentication/test/jwt.test.ts delete mode 100644 packages/authentication/test/service.test.ts delete mode 100644 packages/authentication/tsconfig.json delete mode 100644 packages/configuration/CHANGELOG.md delete mode 100644 packages/configuration/LICENSE delete mode 100644 packages/configuration/README.md delete mode 100644 packages/configuration/package.json delete mode 100644 packages/configuration/src/index.ts delete mode 100644 packages/configuration/test/config/default.json delete mode 100644 packages/configuration/test/index.test.ts delete mode 100644 packages/configuration/tsconfig.json delete mode 100644 packages/express/CHANGELOG.md delete mode 100644 packages/express/LICENSE delete mode 100644 packages/express/README.md delete mode 100644 packages/express/package.json delete mode 100644 packages/express/public/401.html delete mode 100644 packages/express/public/404.html delete mode 100644 packages/express/public/default.html delete mode 100644 packages/express/src/authentication.ts delete mode 100644 packages/express/src/declarations.ts delete mode 100644 packages/express/src/handlers.ts delete mode 100644 packages/express/src/index.ts delete mode 100644 packages/express/src/rest.ts delete mode 100644 packages/express/test/authentication.test.ts delete mode 100644 packages/express/test/error-handler.test.ts delete mode 100644 packages/express/test/index.test.ts delete mode 100644 packages/express/test/not-found-handler.test.ts delete mode 100644 packages/express/test/rest.test.ts delete mode 100644 packages/express/tsconfig.json delete mode 100644 packages/generators/CHANGELOG.md delete mode 100644 packages/generators/README.md delete mode 100644 packages/generators/package.json delete mode 100644 packages/generators/src/app/index.ts delete mode 100644 packages/generators/src/app/templates/app.test.tpl.ts delete mode 100644 packages/generators/src/app/templates/app.tpl.ts delete mode 100644 packages/generators/src/app/templates/channels.tpl.ts delete mode 100644 packages/generators/src/app/templates/client.test.tpl.ts delete mode 100644 packages/generators/src/app/templates/client.tpl.ts delete mode 100644 packages/generators/src/app/templates/configuration.tpl.ts delete mode 100644 packages/generators/src/app/templates/declarations.tpl.ts delete mode 100644 packages/generators/src/app/templates/gitignore.tpl.ts delete mode 100644 packages/generators/src/app/templates/index.html.tpl.ts delete mode 100644 packages/generators/src/app/templates/index.tpl.ts delete mode 100644 packages/generators/src/app/templates/logger.tpl.ts delete mode 100644 packages/generators/src/app/templates/package.json.tpl.ts delete mode 100644 packages/generators/src/app/templates/prettierrc.tpl.ts delete mode 100644 packages/generators/src/app/templates/readme.md.tpl.ts delete mode 100644 packages/generators/src/app/templates/services.tpl.ts delete mode 100644 packages/generators/src/app/templates/tsconfig.json.tpl.ts delete mode 100644 packages/generators/src/app/templates/validators.tpl.ts delete mode 100644 packages/generators/src/authentication/index.ts delete mode 100644 packages/generators/src/authentication/templates/authentication.tpl.ts delete mode 100644 packages/generators/src/authentication/templates/client.test.tpl.ts delete mode 100644 packages/generators/src/authentication/templates/config.tpl.ts delete mode 100644 packages/generators/src/authentication/templates/declarations.tpl.ts delete mode 100644 packages/generators/src/commons.ts delete mode 100644 packages/generators/src/connection/index.ts delete mode 100644 packages/generators/src/connection/templates/knex.tpl.ts delete mode 100644 packages/generators/src/connection/templates/mongodb.tpl.ts delete mode 100644 packages/generators/src/hook/index.ts delete mode 100644 packages/generators/src/hook/templates/hook.tpl.ts delete mode 100644 packages/generators/src/index.ts delete mode 100644 packages/generators/src/service/index.ts delete mode 100644 packages/generators/src/service/templates/client.tpl.ts delete mode 100644 packages/generators/src/service/templates/schema.json.tpl.ts delete mode 100644 packages/generators/src/service/templates/schema.typebox.tpl.ts delete mode 100644 packages/generators/src/service/templates/service.tpl.ts delete mode 100644 packages/generators/src/service/templates/shared.tpl.ts delete mode 100644 packages/generators/src/service/templates/test.tpl.ts delete mode 100644 packages/generators/src/service/type/custom.tpl.ts delete mode 100644 packages/generators/src/service/type/knex.tpl.ts delete mode 100644 packages/generators/src/service/type/mongodb.tpl.ts delete mode 100644 packages/generators/test/build/.gitkeep delete mode 100644 packages/generators/test/commons.test.ts delete mode 100644 packages/generators/test/generators.test.ts delete mode 100644 packages/generators/test/utils.ts delete mode 100644 packages/generators/tsconfig.json delete mode 100644 packages/knex/CHANGELOG.md delete mode 100644 packages/knex/LICENSE delete mode 100644 packages/knex/README.md delete mode 100644 packages/knex/package.json delete mode 100644 packages/knex/src/adapter.ts delete mode 100644 packages/knex/src/declarations.ts delete mode 100644 packages/knex/src/error-handler.ts delete mode 100644 packages/knex/src/hooks.ts delete mode 100644 packages/knex/src/index.ts delete mode 100644 packages/knex/test/connection.ts delete mode 100644 packages/knex/test/error-handler.test.ts delete mode 100644 packages/knex/test/index.test.ts delete mode 100644 packages/knex/test/overrides.test.ts delete mode 100644 packages/knex/tsconfig.json delete mode 100644 packages/koa/CHANGELOG.md delete mode 100644 packages/koa/LICENSE delete mode 100644 packages/koa/README.md delete mode 100644 packages/koa/package.json delete mode 100644 packages/koa/src/authentication.ts delete mode 100644 packages/koa/src/declarations.ts delete mode 100644 packages/koa/src/handlers.ts delete mode 100644 packages/koa/src/index.ts delete mode 100644 packages/koa/src/rest.ts delete mode 100644 packages/koa/test/app.fixture.ts delete mode 100644 packages/koa/test/authentication.test.ts delete mode 100644 packages/koa/test/index.test.ts delete mode 100644 packages/koa/tsconfig.json delete mode 100644 packages/memory/CHANGELOG.md delete mode 100644 packages/memory/LICENSE delete mode 100644 packages/memory/README.md delete mode 100644 packages/memory/package.json delete mode 100644 packages/memory/src/index.ts delete mode 100644 packages/memory/test/index.test.ts delete mode 100644 packages/memory/tsconfig.json delete mode 100644 packages/mongodb/CHANGELOG.md delete mode 100644 packages/mongodb/LICENSE delete mode 100644 packages/mongodb/README.md delete mode 100644 packages/mongodb/package.json delete mode 100644 packages/mongodb/src/adapter.ts delete mode 100644 packages/mongodb/src/converters.ts delete mode 100644 packages/mongodb/src/error-handler.ts delete mode 100644 packages/mongodb/src/index.ts delete mode 100644 packages/mongodb/test/converters.test.ts delete mode 100644 packages/mongodb/test/index.test.ts delete mode 100644 packages/mongodb/tsconfig.json delete mode 100644 packages/schema/CHANGELOG.md delete mode 100644 packages/schema/LICENSE delete mode 100644 packages/schema/README.md delete mode 100644 packages/schema/package.json delete mode 100644 packages/schema/src/default-schemas.ts delete mode 100644 packages/schema/src/hooks/index.ts delete mode 100644 packages/schema/src/hooks/resolve.ts delete mode 100644 packages/schema/src/hooks/validate.ts delete mode 100644 packages/schema/src/index.ts delete mode 100644 packages/schema/src/json-schema.ts delete mode 100644 packages/schema/src/resolver.ts delete mode 100644 packages/schema/src/schema.ts delete mode 100644 packages/schema/test/fixture.ts delete mode 100644 packages/schema/test/hooks.test.ts delete mode 100644 packages/schema/test/json-schema.test.ts delete mode 100644 packages/schema/test/resolver.test.ts delete mode 100644 packages/schema/test/schema.test.ts delete mode 100644 packages/schema/tsconfig.json delete mode 100644 packages/socketio-client/CHANGELOG.md delete mode 100644 packages/socketio-client/LICENSE delete mode 100644 packages/socketio-client/README.md delete mode 100644 packages/socketio-client/package.json delete mode 100644 packages/socketio-client/src/index.ts delete mode 100644 packages/socketio-client/test/index.test.ts delete mode 100644 packages/socketio-client/test/server.ts delete mode 100644 packages/socketio-client/tsconfig.json delete mode 100644 packages/socketio/CHANGELOG.md delete mode 100644 packages/socketio/LICENSE delete mode 100644 packages/socketio/README.md delete mode 100644 packages/socketio/package.json delete mode 100644 packages/socketio/src/index.ts delete mode 100644 packages/socketio/src/middleware.ts delete mode 100644 packages/socketio/test/events.ts delete mode 100644 packages/socketio/test/index.test.ts delete mode 100644 packages/socketio/test/methods.ts delete mode 100644 packages/socketio/tsconfig.json delete mode 100644 packages/typebox/CHANGELOG.md delete mode 100644 packages/typebox/LICENSE delete mode 100644 packages/typebox/README.md delete mode 100644 packages/typebox/package.json delete mode 100644 packages/typebox/src/default-schemas.ts delete mode 100644 packages/typebox/src/index.ts delete mode 100644 packages/typebox/test/index.test.ts delete mode 100644 packages/typebox/tsconfig.json diff --git a/generators/package.ts b/.generate/package.ts similarity index 100% rename from generators/package.ts rename to .generate/package.ts diff --git a/generators/package/index.tpl.ts b/.generate/package/index.tpl.ts similarity index 100% rename from generators/package/index.tpl.ts rename to .generate/package/index.tpl.ts diff --git a/generators/package/license.tpl.ts b/.generate/package/license.tpl.ts similarity index 100% rename from generators/package/license.tpl.ts rename to .generate/package/license.tpl.ts diff --git a/generators/package/package.json.tpl.ts b/.generate/package/package.json.tpl.ts similarity index 96% rename from generators/package/package.json.tpl.ts rename to .generate/package/package.json.tpl.ts index 1a27515aef..26827f7abc 100644 --- a/generators/package/package.json.tpl.ts +++ b/.generate/package/package.json.tpl.ts @@ -44,7 +44,7 @@ export const generate = (context: Context) => scripts: { prepublish: 'npm run compile', pack: 'npm pack --pack-destination ../generators/test/build', - compile: 'shx rm -rf lib/ && tsc && npm run pack', + compile: 'shx rm -rf lib/ && tsc', test: 'mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts' }, publishConfig: { diff --git a/generators/package/readme.md.tpl.ts b/.generate/package/readme.md.tpl.ts similarity index 100% rename from generators/package/readme.md.tpl.ts rename to .generate/package/readme.md.tpl.ts diff --git a/generators/package/test.tpl.ts b/.generate/package/test.tpl.ts similarity index 100% rename from generators/package/test.tpl.ts rename to .generate/package/test.tpl.ts diff --git a/generators/package/tsconfig.json.tpl.ts b/.generate/package/tsconfig.json.tpl.ts similarity index 100% rename from generators/package/tsconfig.json.tpl.ts rename to .generate/package/tsconfig.json.tpl.ts diff --git a/docs/.vitepress/components.d.ts b/docs/.vitepress/components.d.ts index febaf90a5b..1a744ba1f0 100644 --- a/docs/.vitepress/components.d.ts +++ b/docs/.vitepress/components.d.ts @@ -1,10 +1,10 @@ /* eslint-disable */ -/* prettier-ignore */ // @ts-nocheck // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 export {} +/* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { Badges: typeof import('./components/Badges.vue')['default'] diff --git a/docs/auto-imports.d.ts b/docs/auto-imports.d.ts index 1d89ee8c48..9d2400790b 100644 --- a/docs/auto-imports.d.ts +++ b/docs/auto-imports.d.ts @@ -3,6 +3,7 @@ // @ts-nocheck // noinspection JSUnusedGlobalSymbols // Generated by unplugin-auto-import +// biome-ignore lint: disable export {} declare global { diff --git a/package-lock.json b/package-lock.json index d1b794868d..da39ff6923 100644 --- a/package-lock.json +++ b/package-lock.json @@ -200,9 +200,9 @@ } }, "node_modules/@algolia/client-common": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.2.4.tgz", - "integrity": "sha512-xNkNJ9Vk1WjxEU/SzcA2vZWeYSiQFQOUS7Akffx8aeAIJIOcmwbpLr2D8JzBEC4QNmNb5KAZOJTrGl1ri9Mclg==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.6.0.tgz", + "integrity": "sha512-oh8Ow3g1TTPcOopJG3o7td8U48vn7SHfnXX5Ciwl1KJd5FHoUr2wrQiQg0iQD5j+4t3lO/B9iLM4LyH81hH/zg==", "dev": true, "peer": true, "engines": { @@ -231,15 +231,16 @@ } }, "node_modules/@algolia/client-search": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.2.4.tgz", - "integrity": "sha512-xlBaro8nU5EvsNsLu8dSsd7jzHVvOVGCOTW4dM6gjRmQDYChzMsF69Tb1OfLaXk7YJ0jHk1rNeccBOsYBtQcIQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.6.0.tgz", + "integrity": "sha512-H5Fm662YDzx17cKZUjZRwv6IkygDeXTxoyeoervGl32MVxIIjO/dOPS3kJBM1D45zVac/LG4XRBTPKyY9pcy9Q==", "dev": true, "peer": true, "dependencies": { - "@algolia/client-common": "5.2.4", - "@algolia/requester-browser-xhr": "5.2.4", - "@algolia/requester-node-http": "5.2.4" + "@algolia/client-common": "5.6.0", + "@algolia/requester-browser-xhr": "5.6.0", + "@algolia/requester-fetch": "5.6.0", + "@algolia/requester-node-http": "5.6.0" }, "engines": { "node": ">= 14.0.0" @@ -319,13 +320,13 @@ } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.2.4.tgz", - "integrity": "sha512-ncssmlq86ZnoQ/RH/EEG2KgmBZQnprzx3dZZ+iJrvkbxIi8V9wBWyCgjsuPrKGitzhpnjxZLNlHJZtcps5jaXw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.6.0.tgz", + "integrity": "sha512-rB3Y/1dLX2ozJk+7nFzVcvuoEOwghbcly2TYyn+pYMx4qOV3EIg1qBO6x3zkqiW+lv7CWsAANP7M8xtP5fCGiA==", "dev": true, "peer": true, "dependencies": { - "@algolia/client-common": "5.2.4" + "@algolia/client-common": "5.6.0" }, "engines": { "node": ">= 14.0.0" @@ -337,14 +338,27 @@ "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", "dev": true }, + "node_modules/@algolia/requester-fetch": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.6.0.tgz", + "integrity": "sha512-/4ntw7RDHmLyMUfS7IPRuqtmSGal0Thhv1cqRAXFt5CLNiLqR4VnELu5pFi0eSxNxSj3LHBS2yIYFFvlMSwgNg==", + "dev": true, + "peer": true, + "dependencies": { + "@algolia/client-common": "5.6.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/requester-node-http": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.2.4.tgz", - "integrity": "sha512-EoLOebO81Dtwuz/hy4onmQAb9dK8fDqyPWMwX017SvGDi3w1h4i6W6//VTO0vKLfXMNpoAKWFi+LBBTLCVtiiw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.6.0.tgz", + "integrity": "sha512-kOXFn5o1R1L8g9x0JeGkstVwxxBPHB+D7vBscACuY7uVtYrEmJWcPxWcFvazfB57M+FVrzR7TCu41UlDLB1few==", "dev": true, "peer": true, "dependencies": { - "@algolia/client-common": "5.2.4" + "@algolia/client-common": "5.6.0" }, "engines": { "node": ">= 14.0.0" @@ -406,262 +420,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", - "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", - "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", - "dev": true, - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-client": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", - "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", - "dev": true, - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "^1.9.1", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.6.1", - "@azure/logger": "^1.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-http-compat": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.1.2.tgz", - "integrity": "sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ==", - "dev": true, - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-client": "^1.3.0", - "@azure/core-rest-pipeline": "^1.3.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-lro": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", - "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", - "dev": true, - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.2.0", - "@azure/logger": "^1.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-paging": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", - "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", - "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.3.tgz", - "integrity": "sha512-VxLk4AHLyqcHsfKe4MZ6IQ+D+ShuByy+RfStKfSjxJoL3WBWq17VNmrz8aT8etKzqc2nAeIyLxScjpzsS4fz8w==", - "dev": true, - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.9.0", - "@azure/logger": "^1.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-tracing": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", - "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", - "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-util": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.2.tgz", - "integrity": "sha512-l1Qrqhi4x1aekkV+OlcqsJa4AnAkj5p0JV8omgwjaV9OAbP41lvrMvs+CptfetKkeEaGRGSzby7sjPZEX7+kkQ==", - "dev": true, - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/identity": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.4.1.tgz", - "integrity": "sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA==", - "dev": true, - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.5.0", - "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.1.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.3.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^3.14.0", - "@azure/msal-node": "^2.9.2", - "events": "^3.0.0", - "jws": "^4.0.0", - "open": "^8.0.0", - "stoppable": "^1.1.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/identity/node_modules/@azure/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "dev": true, - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/keyvault-keys": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.8.0.tgz", - "integrity": "sha512-jkuYxgkw0aaRfk40OQhFqDIupqblIOIlYESWB6DKCVDxQet1pyv86Tfk9M+5uFM0+mCs6+MUHU+Hxh3joiUn4Q==", - "dev": true, - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-client": "^1.5.0", - "@azure/core-http-compat": "^2.0.1", - "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.1.1", - "@azure/core-rest-pipeline": "^1.8.1", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", - "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/keyvault-keys/node_modules/@azure/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "dev": true, - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", - "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", - "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/msal-browser": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.22.0.tgz", - "integrity": "sha512-ZkL2Z0zffsBIE3ovhMwa0rVrPeKV2GHhDWFgWiIcKiPt82b21YLijK3c/rNjTHkME+6FCjMIa/5Nul+ZjH197w==", - "dev": true, - "dependencies": { - "@azure/msal-common": "14.14.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-common": { - "version": "14.14.2", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.14.2.tgz", - "integrity": "sha512-XV0P5kSNwDwCA/SjIxTe9mEAsKB0NqGNSuaVrkCCE2lAyBr/D6YtD80Vkdp4tjWnPFwjzkwldjr1xU/facOJog==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.13.1.tgz", - "integrity": "sha512-sijfzPNorKt6+9g1/miHwhj6Iapff4mPQx1azmmZExgzUROqWTM1o3ACyxDja0g47VpowFy/sxTM/WsuCyXTiw==", - "dev": true, - "dependencies": { - "@azure/msal-common": "14.14.2", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@azure/msal-node/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", @@ -1355,21 +1113,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -1472,21 +1215,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", - "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", @@ -2234,25 +1962,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", - "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", @@ -2436,25 +2145,6 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", - "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", @@ -3031,9 +2721,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -3085,9 +2775,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "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, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3116,31 +2806,67 @@ } }, "node_modules/@feathersjs/adapter-commons": { - "resolved": "packages/adapter-commons", - "link": true - }, - "node_modules/@feathersjs/adapter-tests": { - "resolved": "packages/adapter-tests", - "link": true + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@feathersjs/adapter-commons/-/adapter-commons-5.0.30.tgz", + "integrity": "sha512-GVDyyCGKbOCOr7f8wh8sEPi0MNuYuIfxjEQG7+Vf1imD/4dZfbqanR9vy1J8d6zHxWcjChLik8E6FE6ai4g4Tw==", + "dependencies": { + "@feathersjs/commons": "^5.0.30", + "@feathersjs/errors": "^5.0.30", + "@feathersjs/feathers": "^5.0.30" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + } }, "node_modules/@feathersjs/authentication": { - "resolved": "packages/authentication", - "link": true + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication/-/authentication-5.0.30.tgz", + "integrity": "sha512-MpjsLljDeUlyw03IIFkPI5PxnMV3lIaCjGZFWgp7Ge1L6sqWS8QlEtV8ltQdHTth9H3kRUR93pPK5fmZIboJiA==", + "dependencies": { + "@feathersjs/commons": "^5.0.30", + "@feathersjs/errors": "^5.0.30", + "@feathersjs/feathers": "^5.0.30", + "@feathersjs/hooks": "^0.9.0", + "@feathersjs/schema": "^5.0.30", + "@feathersjs/transport-commons": "^5.0.30", + "@types/jsonwebtoken": "^9.0.6", + "jsonwebtoken": "^9.0.2", + "lodash": "^4.17.21", + "long-timeout": "^0.1.1", + "uuid": "^10.0.0" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + } }, "node_modules/@feathersjs/authentication-client": { - "resolved": "packages/authentication-client", - "link": true + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@feathersjs/authentication-client/-/authentication-client-5.0.30.tgz", + "integrity": "sha512-oO+bXJQoPfqOtLFC+WA3DCr6G1PA7rEHcm5dadH9Ajhqi36lJdWxk38N0de7n2VaodATpDLa+f/av1jvk0dm2w==", + "dependencies": { + "@feathersjs/authentication": "^5.0.30", + "@feathersjs/commons": "^5.0.30", + "@feathersjs/errors": "^5.0.30", + "@feathersjs/feathers": "^5.0.30" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + } }, - "node_modules/@feathersjs/authentication-local": { - "resolved": "packages/authentication-local", - "link": true - }, - "node_modules/@feathersjs/authentication-oauth": { - "resolved": "packages/authentication-oauth", - "link": true - }, - "node_modules/@feathersjs/cli": { - "resolved": "packages/cli", + "node_modules/@feathersjs/cli": { + "resolved": "packages/cli", "link": true }, "node_modules/@feathersjs/client": { @@ -3151,25 +2877,59 @@ "resolved": "packages/commons", "link": true }, - "node_modules/@feathersjs/configuration": { - "resolved": "packages/configuration", - "link": true - }, "node_modules/@feathersjs/errors": { "resolved": "packages/errors", "link": true }, "node_modules/@feathersjs/express": { - "resolved": "packages/express", - "link": true + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@feathersjs/express/-/express-5.0.30.tgz", + "integrity": "sha512-ZvaRaPIe12X6RWjQrFVwB9VPbdqz/q/95sH4V1t82TdASW22oc+zfcNeTtiG7vythEsmqrzGuWRm/2XM+lb0kQ==", + "dev": true, + "dependencies": { + "@feathersjs/authentication": "^5.0.30", + "@feathersjs/commons": "^5.0.30", + "@feathersjs/errors": "^5.0.30", + "@feathersjs/feathers": "^5.0.30", + "@feathersjs/transport-commons": "^5.0.30", + "@types/compression": "^1.7.5", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.19.5", + "compression": "^1.7.4", + "cors": "^2.8.5", + "express": "^4.19.2" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + } }, "node_modules/@feathersjs/feathers": { "resolved": "packages/feathers", "link": true }, "node_modules/@feathersjs/generators": { - "resolved": "packages/generators", - "link": true + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@feathersjs/generators/-/generators-5.0.30.tgz", + "integrity": "sha512-wMZUvEmo5br0Ko44rbLWm+ydVKP3gkWiHenj4AO1vZ4m0kGcqDmLpN6LozUIX39CLhoGUYGD0AZctoMhpeDQ+w==", + "dependencies": { + "@featherscloud/pinion": "^0.5.4", + "chalk": "^5.3.0", + "lodash": "^4.17.21", + "prettier": "^3.3.3", + "typescript": "^5.5.4" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + } }, "node_modules/@feathersjs/hooks": { "version": "0.9.0", @@ -3179,37 +2939,105 @@ "node": ">= 14" } }, - "node_modules/@feathersjs/knex": { - "resolved": "packages/knex", - "link": true - }, - "node_modules/@feathersjs/koa": { - "resolved": "packages/koa", - "link": true - }, "node_modules/@feathersjs/memory": { - "resolved": "packages/memory", - "link": true - }, - "node_modules/@feathersjs/mongodb": { - "resolved": "packages/mongodb", - "link": true + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@feathersjs/memory/-/memory-5.0.30.tgz", + "integrity": "sha512-Fh8uJ2oZ1qn7NvRZA3JI7OoAcloZeOi55kuBdbq0sv9eIYsVpfsE8iZgllFdI5yeUMGeVfoJmFhaht2hYAwqhA==", + "dev": true, + "dependencies": { + "@feathersjs/adapter-commons": "^5.0.30", + "@feathersjs/commons": "^5.0.30", + "@feathersjs/errors": "^5.0.30", + "sift": "^17.1.3" + }, + "engines": { + "node": ">= 12" + } }, "node_modules/@feathersjs/rest-client": { "resolved": "packages/rest-client", "link": true }, "node_modules/@feathersjs/schema": { - "resolved": "packages/schema", - "link": true + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@feathersjs/schema/-/schema-5.0.30.tgz", + "integrity": "sha512-2vNUP3m1Eu5Lz1X3FPgTaPnq2iQMXtnR20w5JmDF8ZfCvXaKsRNbnjJ/K3iTuktn0+qbNxeFxFMF2W3cnctM7w==", + "dependencies": { + "@feathersjs/adapter-commons": "^5.0.30", + "@feathersjs/commons": "^5.0.30", + "@feathersjs/errors": "^5.0.30", + "@feathersjs/feathers": "^5.0.30", + "@feathersjs/hooks": "^0.9.0", + "@types/json-schema": "^7.0.15", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "json-schema-to-ts": "^3.1.1" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + }, + "peerDependencies": { + "typescript": ">=5.5" + } + }, + "node_modules/@feathersjs/schema/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@feathersjs/schema/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==" }, "node_modules/@feathersjs/socketio": { - "resolved": "packages/socketio", - "link": true + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@feathersjs/socketio/-/socketio-5.0.30.tgz", + "integrity": "sha512-ox+yK+pBzfqmIX8pL3Zuh15VcgjEtpzOb5lPTZBVmo6rGZIGz08Yy532SVUEZgE32mnep7NDrmkIZi62S4D6Og==", + "dev": true, + "dependencies": { + "@feathersjs/commons": "^5.0.30", + "@feathersjs/feathers": "^5.0.30", + "@feathersjs/transport-commons": "^5.0.30", + "socket.io": "^4.7.5" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + } }, "node_modules/@feathersjs/socketio-client": { - "resolved": "packages/socketio-client", - "link": true + "version": "5.0.30", + "resolved": "https://registry.npmjs.org/@feathersjs/socketio-client/-/socketio-client-5.0.30.tgz", + "integrity": "sha512-hXGXU73J4cX66F68HUvJ18s2nl8OztZqFCijh0mo7bP//V19BI3NhMjrU6i/+wCLnGf3MQyesl08lQFQFmhukw==", + "dependencies": { + "@feathersjs/feathers": "^5.0.30", + "@feathersjs/transport-commons": "^5.0.30" + }, + "engines": { + "node": ">= 12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + } }, "node_modules/@feathersjs/tests": { "resolved": "packages/tests", @@ -3219,31 +3047,27 @@ "resolved": "packages/transport-commons", "link": true }, - "node_modules/@feathersjs/typebox": { - "resolved": "packages/typebox", - "link": true - }, "node_modules/@floating-ui/core": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", - "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", "dependencies": { - "@floating-ui/utils": "^0.2.7" + "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", - "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz", + "integrity": "sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.7" + "@floating-ui/utils": "^0.2.8" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", - "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" }, "node_modules/@gar/promisify": { "version": "1.1.3", @@ -3251,19 +3075,14 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, - "node_modules/@hapi/bourne": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==" - }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "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, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -3338,9 +3157,9 @@ "dev": true }, "node_modules/@iconify/utils": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.32.tgz", - "integrity": "sha512-LeifFZPPKu28O3AEDpYJNdEbvS4/ojAPyIW+pF/vUpJTYnbTiXUHkCh0bwgFRzKvdpb8H4Fbfd/742++MF4fPQ==", + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.33.tgz", + "integrity": "sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==", "dev": true, "dependencies": { "@antfu/install-pkg": "^0.4.0", @@ -3353,9 +3172,9 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", + "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", "engines": { "node": ">=18" } @@ -3378,9 +3197,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -3560,23 +3379,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@js-joda/core": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.3.tgz", - "integrity": "sha512-T1rRxzdqkEXcou0ZprN1q9yDRlvzCPLqmlNt5IIsGBzoEVgLCCYrKEwc84+TvsXuAc95VAZwtWD2zVsKPY4bcA==", - "dev": true - }, - "node_modules/@koa/cors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-5.0.0.tgz", - "integrity": "sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==", - "dependencies": { - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/@lerna/create": { "version": "8.1.8", "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.1.8.tgz", @@ -3880,14 +3682,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", - "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", @@ -4112,18 +3906,17 @@ } }, "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, - "optional": true, "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/name-from-folder": { @@ -4261,21 +4054,21 @@ } }, "node_modules/@nrwl/devkit": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.6.4.tgz", - "integrity": "sha512-jpr+T5/+21W/fwAMB6zDLZKO+ReYAfOOMIeM8CpeBi/r9nWmjGXaXN9YKwEOYS1fath62Y5ldGK4yZUttv1tkw==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.8.0.tgz", + "integrity": "sha512-LehpQ2D1687+JWaUpW84NPuXsQuPosmts66LShPT4+6KozB4gd0hJGAXNXpjNs9CUfLyNf8rRdEeqNjWnPYEmA==", "dev": true, "dependencies": { - "@nx/devkit": "19.6.4" + "@nx/devkit": "19.8.0" } }, "node_modules/@nrwl/tao": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.6.4.tgz", - "integrity": "sha512-1J8cD+MFzsmboiGe03VlQZ8gt64k/TaYYPZivnnhOJolPPs75nz1JyJX55uWcKKRy/b7FZNKWIu/6Wp9JDhJrQ==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.8.0.tgz", + "integrity": "sha512-tybyYdhHNfyBRb8SOc/SasT1iwjYkp/QibS8L3ayTvpvvzJpNr8BpuTznQWIkaIjilflmcdHl+rMiQDqwABqpg==", "dev": true, "dependencies": { - "nx": "19.6.4", + "nx": "19.8.0", "tslib": "^2.3.0" }, "bin": { @@ -4283,12 +4076,12 @@ } }, "node_modules/@nx/devkit": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.6.4.tgz", - "integrity": "sha512-mBitFwb/gcz8MR7STt7KQG0vf+QcsasDXiSYcf3OWpc6lGE5wn1q5jg6Iabp49Bd/mdHXVLQnP1aV5A+QqFIOQ==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.8.0.tgz", + "integrity": "sha512-nPaKHF0m2KONlt8GXjN9EhFo+NOvJnFcK6ujKFFLAyZ4TACY4F1FCjSHFTjYI82j+WukzuyjSmY9wzxYughWIQ==", "dev": true, "dependencies": { - "@nrwl/devkit": "19.6.4", + "@nrwl/devkit": "19.8.0", "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", @@ -4327,9 +4120,9 @@ } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.6.4.tgz", - "integrity": "sha512-kRn2FLvhwJA/TJrNlsCSqqQTrguNZLmiRsiXhvjkfUMbUKwyQfVMgJlvkZ+KoqraUSG+Qyb0FmrGur1I/Mld0Q==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.0.tgz", + "integrity": "sha512-JWtBb6ndCdGE+RBIwKN85BZnX41lFGsFxnsmot71GeAj/g7Cb0PM2qcmxawoy8yLPTBGZhb+eHER3z3nDIqRog==", "cpu": [ "arm64" ], @@ -4343,9 +4136,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.6.4.tgz", - "integrity": "sha512-3uABBUhxVk+SdRwpUu30iuBlgRWm3tA/G9seG+wt7oN2R+fOu8zzRCYa+Blvoh1Ef+D9743Ir4rDc9Mhzl2B2g==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.0.tgz", + "integrity": "sha512-NcNaqbbStBkyahLaoKFtW6nEdjCjYT5ZOmGjc6UpAx1Y3pkk/FcIOYJRCBxwuOsRRsEAyeVcHPdYrouZmV+6Yw==", "cpu": [ "x64" ], @@ -4359,9 +4152,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.6.4.tgz", - "integrity": "sha512-OG83MiEk5L54/vAldmwZJBKEvZaM+DEIDqn2yZLTToBRj5Z9jwKJX3jKP60xbHiaT/hzsb1xPlwhOHJnYd80EQ==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.0.tgz", + "integrity": "sha512-QXHRnMW5LrpYvtmdFRL2CRgX9CWDccrs2xhQNNzcgsLgL87Wte5kjDoJJN4GQjtrmjD3Q93w67CE9lhqnpXBvQ==", "cpu": [ "x64" ], @@ -4375,9 +4168,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.6.4.tgz", - "integrity": "sha512-hQ9x4qSKUh9mIVDuD270ULrBnmYfDTjXq7LnIwECw1AuP4LkKzKxULhsbqVnFQ/k3xxyFkwyGTIu2mfDcw16Gw==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.0.tgz", + "integrity": "sha512-VjZOLMxz0gT+0AdDygxQS0Vvi3AcEzO3y9o9WdGKKaDVUDycrFn72X+ZbvFoio1dF7S1s2TbmOlR09Bu1yTgGg==", "cpu": [ "arm" ], @@ -4391,9 +4184,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.6.4.tgz", - "integrity": "sha512-OFKpAHiaVg3YGFIMBmi/JshciP9buwtOPiHDXcQdzQgE22jyYzKEiFxfcpG0nCT8PlMYAbHPAda15WfWkfVGVQ==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.0.tgz", + "integrity": "sha512-sCSrXkSmEfDUDGLESXB3eHXECAIYz9nosFZpCggyUP1vgF/QcV40fHnV38nrFbKaVHuoaxy43RgnD+I3o6sDSw==", "cpu": [ "arm64" ], @@ -4407,9 +4200,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.6.4.tgz", - "integrity": "sha512-ZIR9u+mN0A7SmNd6vDxmPV1QVTgYPTdfBSM5TEnKl3q2fHw2Nkui81QBxA4d7VopJoJUz/pRHiUV+dlgEEZ6nA==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.0.tgz", + "integrity": "sha512-F3xEe7NGjsVKZTVlvUiUOTmCzxteRsQH2SSsYXyAfgJ42P3eZPc9HgeLx6RByjC/NBCwc7XEECMP1FjQgQXHVw==", "cpu": [ "arm64" ], @@ -4423,9 +4216,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.6.4.tgz", - "integrity": "sha512-AUMPvLs9KeCUuWD5DdlpbP3VfVsiD0IlptS2b3ul336rsQ7LwwdvE7jTVO5CixFOsiRZxP72fKJhaEargMn5Aw==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.0.tgz", + "integrity": "sha512-4uYuE+LvxOFXvi9z9ueJSVrME5D383SHNCjs6jYwc9KovCsmL5oPVXRieoE4/hYI4lrjly+CrAnPZU1P7ocBiw==", "cpu": [ "x64" ], @@ -4439,9 +4232,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.6.4.tgz", - "integrity": "sha512-PU7AaBlrgnJnDxTiV/PNCu0pHUCzaogm6uNcbzCyFJLGn7DoQK9rkqUMPJjb3CnJkAj9XrrhuZwmOdbrhvHAvA==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.0.tgz", + "integrity": "sha512-9UDEGjOvNt+m+kMBCAB7CGisSwv05Xvaq8K3NJ+xM5GPG74EkQel24mSoIJfm/6zmDkdZCiRzNN9VRjOjzOz6Q==", "cpu": [ "x64" ], @@ -4455,9 +4248,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.6.4.tgz", - "integrity": "sha512-6CCmGWwH/J2k+Uxeci48w4QVhtcQ3hRZ5Z2jh26HI8YzH4wqZyA7QPgLBE6sNCPVLoGW5cBgTsfnyEdr+xarQA==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.0.tgz", + "integrity": "sha512-JVzm0KjyLZY5ponBukZ/b35wttW0b3LB0nqaiiHY7WKwSzo+m0UGEYHD/Yk6rKA0RRZN2wQVeIzLeWfYcZYrhA==", "cpu": [ "arm64" ], @@ -4471,9 +4264,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.6.4.tgz", - "integrity": "sha512-jTNrlaFaKtbL2mYOcfPAiljtpF5CI7vbHIqYqBFYLUQXOwW9lOHlO+SeQnft6JYZs0FIr1IdHaCfdOw/hpnCiQ==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.0.tgz", + "integrity": "sha512-IRLhMZIInvp9okLsjnj76zaz8iaMovtLr6MHIFOOPIMsZYRhqQTArF5Os/NqEezeYYxvX6YZ5hKYe0xQO7A5LA==", "cpu": [ "x64" ], @@ -4727,9 +4520,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", "dev": true }, "node_modules/@popperjs/core": { @@ -4743,15 +4536,14 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -4790,9 +4582,9 @@ } }, "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.1.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", + "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -4812,9 +4604,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", - "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -4825,9 +4617,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", - "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -4838,9 +4630,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", - "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -4851,9 +4643,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", - "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -4864,9 +4656,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", - "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -4877,9 +4669,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", - "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -4890,9 +4682,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", - "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -4903,9 +4695,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", - "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -4916,9 +4708,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", - "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -4929,9 +4721,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", - "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -4942,9 +4734,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", - "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -4955,9 +4747,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", - "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -4968,9 +4760,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", - "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -4981,9 +4773,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", - "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -4994,9 +4786,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", - "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -5007,9 +4799,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", - "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -5020,27 +4812,59 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.16.1.tgz", - "integrity": "sha512-aI0hBtw+a6KsJp2jcD4YuQqKpeCbURMZbhHVozDknJpm+KJqeMRkEnfBC8BaKE/5XC+uofPgCLsa/TkTk0Ba0w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.18.0.tgz", + "integrity": "sha512-VK4BNVCd2leY62Nm2JjyxtRLkyrZT/tv104O81eyaCjHq4Adceq2uJVFJJAIof6lT1mBwZrEo2qT/T+grv3MQQ==", "dependencies": { - "@shikijs/vscode-textmate": "^9.2.0", - "@types/hast": "^3.0.4" + "@shikijs/engine-javascript": "1.18.0", + "@shikijs/engine-oniguruma": "1.18.0", + "@shikijs/types": "1.18.0", + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.3" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.18.0.tgz", + "integrity": "sha512-qoP/aO/ATNwYAUw1YMdaip/YVEstMZEgrwhePm83Ll9OeQPuxDZd48szZR8oSQNQBT8m8UlWxZv8EA3lFuyI5A==", + "dependencies": { + "@shikijs/types": "1.18.0", + "@shikijs/vscode-textmate": "^9.2.2", + "oniguruma-to-js": "0.4.3" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.18.0.tgz", + "integrity": "sha512-B9u0ZKI/cud+TcmF8Chyh+R4V5qQVvyDOqXC2l2a4x73PBSBc6sZ0JRAX3eqyJswqir6ktwApUUGBYePdKnMJg==", + "dependencies": { + "@shikijs/types": "1.18.0", + "@shikijs/vscode-textmate": "^9.2.2" } }, "node_modules/@shikijs/transformers": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.16.1.tgz", - "integrity": "sha512-mfbe4YMov+1eyIBU3F6BtaPmLgDkRQaVse8xsBlKTVAcNF3cbZMRCyUz2N6gJOMKLJiv9T5gapBPbRxrDMuoxA==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.18.0.tgz", + "integrity": "sha512-EdX/UIVaaS8qp9NWRyHIXp2dmuLpdVvx+UVpbIn9eafFlLemAuljPb2+K40ie6jrlg0uUIqkg25CM/8I34yBNw==", "dev": true, "dependencies": { - "shiki": "1.16.1" + "shiki": "1.18.0" + } + }, + "node_modules/@shikijs/types": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.18.0.tgz", + "integrity": "sha512-O9N36UEaGGrxv1yUrN2nye7gDLG5Uq0/c1LyfmxsvzNPqlHzWo9DI0A4+fhW2y3bGKuQu/fwS7EPdKJJCowcVA==", + "dependencies": { + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.0.tgz", - "integrity": "sha512-5FinaOp6Vdh/dl4/yaOTh0ZeKch+rYS8DUb38V3GMKYVkdqzxw53lViRKUYkVILRiVQT7dcPC7VvAKOR73zVtQ==" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.2.tgz", + "integrity": "sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==" }, "node_modules/@sigstore/bundle": { "version": "2.3.2", @@ -5137,7 +4961,8 @@ "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", @@ -5172,12 +4997,6 @@ "node": ">=14.16" } }, - "node_modules/@tediousjs/connection-string": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.5.0.tgz", - "integrity": "sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==", - "dev": true - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -5242,99 +5061,50 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/bcryptjs": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", - "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", - "dev": true - }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" } }, - "node_modules/@types/co-body": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.3.tgz", - "integrity": "sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*" - } - }, "node_modules/@types/compression": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.5.tgz", "integrity": "sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==", + "dev": true, "dependencies": { "@types/express": "*" } }, - "node_modules/@types/config": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@types/config/-/config-3.3.4.tgz", - "integrity": "sha512-qFiTLnWy+TdPSMIXFHP+87lFXFRM4SXjRS+CSB66+56TrpLNw003y1sh7DGaaC1NGesxgKoT5FDy6dyA1Xju/g==" - }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "dependencies": { "@types/node": "*" } }, - "node_modules/@types/content-disposition": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", - "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" - }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "node_modules/@types/cookie-session": { - "version": "2.0.49", - "resolved": "https://registry.npmjs.org/@types/cookie-session/-/cookie-session-2.0.49.tgz", - "integrity": "sha512-4E/bBjlqLhU5l4iGPR+NkVJH593hpNsT4dC3DJDr+ODm6Qpe13kZQVkezRIb+TYDXaBMemS3yLQ+0leba3jlkQ==", - "dev": true, - "dependencies": { - "@types/express": "*", - "@types/keygrip": "*" - } + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true }, "node_modules/@types/cookiejar": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==" }, - "node_modules/@types/cookies": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", - "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -5346,15 +5116,16 @@ "dev": true }, "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==", + "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 }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -5366,6 +5137,7 @@ "version": "4.19.5", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -5379,14 +5151,6 @@ "integrity": "sha512-H5IXcRn96/gaDmo+rDl2aJuIJsob8dgOXDqf8K0t8rWZd1AFNaaspmRsElESiU+EWE33qfbFPgI0OC/B1g9FCA==", "dev": true }, - "node_modules/@types/formidable": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz", - "integrity": "sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -5395,11 +5159,6 @@ "@types/unist": "*" } }, - "node_modules/@types/http-assert": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", - "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" - }, "node_modules/@types/http-cache-semantics": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", @@ -5409,7 +5168,8 @@ "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true }, "node_modules/@types/inquirer": { "version": "9.0.7", @@ -5432,84 +5192,13 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/keygrip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", - "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" - }, - "node_modules/@types/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa__cors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/koa__cors/-/koa__cors-5.0.0.tgz", - "integrity": "sha512-LCk/n25Obq5qlernGOK/2LUwa/2YJb2lxHUkkvYFDOpLXlVI6tKcdfCHRBQnOY4LwH6el5WOLs6PD/a8Uzau6g==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", - "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-qs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/koa-qs/-/koa-qs-2.0.3.tgz", - "integrity": "sha512-HS4oAQaUKUZJPHggg3DeHiuUwSSotieNRuS2ZlUZO14216Fhf7QDNx8mjR/ZwXaSBr/R46KFtE0OAvsF3yP44A==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-send": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/koa-send/-/koa-send-4.1.6.tgz", - "integrity": "sha512-vgnNGoOJkx7FrF0Jl6rbK1f8bBecqAchKpXtKuXzqIEdXTDO6dsSTjr+eZ5m7ltSjH4K/E7auNJEQCAd0McUPA==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-session": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@types/koa-session/-/koa-session-6.4.5.tgz", - "integrity": "sha512-Vc6+fslnPuMH2v9y80WYeo39UMo8mweuNNthKCwYU2ZE6l5vnRrzRU3BRvexKwsoI5sxsRl5CxDsBlLI8kY/XA==", - "dev": true, - "dependencies": { - "@types/cookies": "*", - "@types/koa": "*" - } - }, - "node_modules/@types/koa-static": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/koa-static/-/koa-static-4.0.4.tgz", - "integrity": "sha512-j1AUzzl7eJYEk9g01hNTlhmipFh8RFbOQmaMNLvLcNNAkPw0bdTs3XTa3V045XFlrWN0QYnblbDJv2RzawTn6A==", - "dependencies": { - "@types/koa": "*", - "@types/koa-send": "*" - } - }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", @@ -5517,9 +5206,9 @@ "dev": true }, "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.9", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz", + "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==" }, "node_modules/@types/lodash-es": { "version": "4.17.12", @@ -5539,6 +5228,14 @@ "@types/mdurl": "^2" } }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", @@ -5553,7 +5250,8 @@ "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true }, "node_modules/@types/minimatch": { "version": "3.0.5", @@ -5568,25 +5266,15 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz", - "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", + "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==", "dev": true }, - "node_modules/@types/mongodb": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-4.0.7.tgz", - "integrity": "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw==", - "deprecated": "mongodb provides its own types. @types/mongodb is no longer needed.", - "dev": true, - "dependencies": { - "mongodb": "*" - } - }, "node_modules/@types/node": { - "version": "22.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.2.tgz", - "integrity": "sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==", + "version": "22.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", + "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", "dependencies": { "undici-types": "~6.19.2" } @@ -5607,31 +5295,17 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/readable-stream": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.15.tgz", - "integrity": "sha512-oAZ3kw+kJFkEqyh7xORZOku1YAKvsFTogRY8kVl4vHpEKiDkfnSA/My8haRE7fvmix5Zyy+1pwzOi7yycGLBJw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true }, "node_modules/@types/resolve": { "version": "1.20.2", @@ -5658,6 +5332,7 @@ "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -5667,6 +5342,7 @@ "version": "1.15.7", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, "dependencies": { "@types/http-errors": "*", "@types/node": "*", @@ -5692,12 +5368,6 @@ "@types/node": "*" } }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -5709,30 +5379,11 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true - }, "node_modules/@types/web-bluetooth": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" - }, - "node_modules/@types/whatwg-url": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", - "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", - "dependencies": { - "@types/webidl-conversions": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.18.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", @@ -5921,18 +5572,17 @@ "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 + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@unocss/astro": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.62.3.tgz", - "integrity": "sha512-C6ZdyLbLDS0LebwmgwVItLNAOSkL/tvVWNRd1i3Jy5uj1vPxlrw+3lIYiHjEofn0GFpBiwlv5+OCvO1Xpq5MqA==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.62.4.tgz", + "integrity": "sha512-98KfkbrNhBLx2+uYxMiGsldIeIZ6/PbL4yaGRHeHoiHd7p4HmIyCF+auYe4Psntx3Yr8kU+XSIAhGDYebvTidQ==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3", - "@unocss/reset": "0.62.3", - "@unocss/vite": "0.62.3" + "@unocss/core": "0.62.4", + "@unocss/reset": "0.62.4", + "@unocss/vite": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -5947,16 +5597,16 @@ } }, "node_modules/@unocss/cli": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.62.3.tgz", - "integrity": "sha512-yEl1iNKkBVpo8+i8gzveM5/0/vOVe6m8+FmuSDuKeSPJnYMhI1mAn+OCKFb/I+qEeLbRPXebbJUUB1xZNzya+w==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.62.4.tgz", + "integrity": "sha512-p4VyS40mzn4LCOkIsbIRzN0Zi50rRepesREi2S1+R4Kpvd4QFeeuxTuZNHEyi2uCboQ9ZWl1gfStCXIrNECwTg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.3.0", "@rollup/pluginutils": "^5.1.0", - "@unocss/config": "0.62.3", - "@unocss/core": "0.62.3", - "@unocss/preset-uno": "0.62.3", + "@unocss/config": "0.62.4", + "@unocss/core": "0.62.4", + "@unocss/preset-uno": "0.62.4", "cac": "^6.7.14", "chokidar": "^3.6.0", "colorette": "^2.0.20", @@ -5964,7 +5614,7 @@ "magic-string": "^0.30.11", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0", - "tinyglobby": "^0.2.5" + "tinyglobby": "^0.2.6" }, "bin": { "unocss": "bin/unocss.mjs" @@ -5976,19 +5626,13 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@unocss/cli/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, "node_modules/@unocss/config": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.62.3.tgz", - "integrity": "sha512-zYOvFE0HfGIbnP/AvsbAlJpPRx9CQyXzL11m/8zgsHW5SGlJIYxuTll83l/xu026G5mPiksy7quoEOEgCLslqw==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.62.4.tgz", + "integrity": "sha512-XKudKxxW8P44JvlIdS6HBpfE3qZA9rhbemy6/sb8HyZjKYjgeM9jx5yjk+9+4hXNma/KlwDXwjAqY29z0S0SrA==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3", + "@unocss/core": "0.62.4", "unconfig": "^0.5.5" }, "engines": { @@ -5999,34 +5643,34 @@ } }, "node_modules/@unocss/core": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.62.3.tgz", - "integrity": "sha512-Pfyrj8S7jq9K1QXD6Z5BCeiQavaHpbMN5q958/kmdbNGp57hOg1e346fMJAvgPjLBR+lE/hgZEsDrijtRiZXnw==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.62.4.tgz", + "integrity": "sha512-Cc+Vo6XlaQpyVejkJrrzzWtiK9pgMWzVVBpm9VCVtwZPUjD4GSc+g7VQCPXSsr7m03tmSuRySJx72QcASmauNQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/extractor-arbitrary-variants": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.62.3.tgz", - "integrity": "sha512-9ZscWyXEwDZif+b56xZyJFHwJOjdMXmj+6x96jOsnRNBzwT9eW7YcGCErP1ih/q1S6KmuRrHM/JOXMBQ6H4qlw==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.62.4.tgz", + "integrity": "sha512-e4hJfBMyFr6T6dYSTTjNv9CQwaU1CVEKxDlYP0GpfSgxsV58pguID9j1mt0/XZD6LvEDzwxj9RTRWKpUSWqp+Q==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3" + "@unocss/core": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/inspector": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.62.3.tgz", - "integrity": "sha512-nTSXOf7YimFPxEYJo5VfP5wlMgYOCjlv3c5Ub/0fynCJXZNb89SFeU05ABXkEgg/FfiobVBTscikLc6guW8eHQ==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.62.4.tgz", + "integrity": "sha512-bRcnI99gZecNzrUr6kDMdwGHkhUuTPyvvadRdaOxHc9Ow3ANNyqymeFM1q5anZEUZt8h15TYN0mdyQyIWkU3zg==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3", - "@unocss/rule-utils": "0.62.3", + "@unocss/core": "0.62.4", + "@unocss/rule-utils": "0.62.4", "gzip-size": "^6.0.0", "sirv": "^2.0.4" }, @@ -6035,18 +5679,17 @@ } }, "node_modules/@unocss/postcss": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.62.3.tgz", - "integrity": "sha512-CwL378ef0QazduXqlaGcWgKJAzemBUxdhapWWiRqI8sXC/eXht5xK6nS1JxqADDuxosgqsGdvcCGmP8ZFrEyiA==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.62.4.tgz", + "integrity": "sha512-kWdHy7UsSP4bDu8I7sCKeO0VuzvVpNHmn2rifK5gNstUx5dZ1H/SoyXTHx5sKtgfZBRzdNXFu2nZ3PzYGvEFbw==", "dev": true, "dependencies": { - "@unocss/config": "0.62.3", - "@unocss/core": "0.62.3", - "@unocss/rule-utils": "0.62.3", + "@unocss/config": "0.62.4", + "@unocss/core": "0.62.4", + "@unocss/rule-utils": "0.62.4", "css-tree": "^2.3.1", - "magic-string": "^0.30.11", - "postcss": "^8.4.41", - "tinyglobby": "^0.2.5" + "postcss": "^8.4.47", + "tinyglobby": "^0.2.6" }, "engines": { "node": ">=14" @@ -6059,25 +5702,25 @@ } }, "node_modules/@unocss/preset-attributify": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.62.3.tgz", - "integrity": "sha512-ORNwyLobGTwnn/tK5yHnMabdJU6Mr/C4LyFH7G8VSLit/aVS0fFa795kJXwxfbqQoQ7Gw0Zxs9oE5RXI0/0y7g==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.62.4.tgz", + "integrity": "sha512-ei5nNT58GON9iyCGRRiIrphzyQbBIZ9iEqSBhIY0flcfi1uAPUXV32aO2slqJnWWAIwbRSb1GMpwYR8mmfuz8g==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3" + "@unocss/core": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-icons": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.62.3.tgz", - "integrity": "sha512-Ie+5RTyac1Q5CNB/s/4aB4VTHAQgQqsI5hshMNLkJ0Jj1lWxodUdEbCRKjXDalRjAXOS9vsLjfJ35ozJ1RSTIQ==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.62.4.tgz", + "integrity": "sha512-n9m2nRTxyiw0sqOwSioO3rro0kaPW0JJzWlzcfdwQ+ZORNR5WyJL298fLXYUFbZG3EOF+zSPg6CMDWudKk/tlA==", "dev": true, "dependencies": { - "@iconify/utils": "^2.1.32", - "@unocss/core": "0.62.3", + "@iconify/utils": "^2.1.33", + "@unocss/core": "0.62.4", "ofetch": "^1.3.4" }, "funding": { @@ -6085,63 +5728,63 @@ } }, "node_modules/@unocss/preset-mini": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.62.3.tgz", - "integrity": "sha512-dn/8ubeW2ry/ZF3iKxdQHnS0l3EBibt0rIOE/XVwx24ub6pRzclU4r7xHnXeqvAFOO9PoiKDGgFR92m6R2MxyQ==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.62.4.tgz", + "integrity": "sha512-1O+QpQFx7FT61aheAZEYemW5e4AGib8TFGm+rWLudKq2IBNnXHcS5xsq5QvqdC7rp9Dn3lnW5du6ijow5kCBuw==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3", - "@unocss/extractor-arbitrary-variants": "0.62.3", - "@unocss/rule-utils": "0.62.3" + "@unocss/core": "0.62.4", + "@unocss/extractor-arbitrary-variants": "0.62.4", + "@unocss/rule-utils": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-tagify": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.62.3.tgz", - "integrity": "sha512-8BpUCZ5sjOZOzBKtu7ecfhRggwwPF78IqeqeNjI+XYRs8r7TBBcUVeF6zUkwhlX/TbtREkw2OZj0Iusa9CBO+A==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.62.4.tgz", + "integrity": "sha512-8b2Kcsvt93xu1JqDqcD3QvvW0L5rqvH7ev3BlNEVx6n8ayBqfB5HEd4ILKr7wSC90re+EnCgnMm7EP2FiQAJkw==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3" + "@unocss/core": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-typography": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.62.3.tgz", - "integrity": "sha512-GjtDgQ1Jec/5RNmnyGMWMgyPdStWcFG/S+NUfOuroRsGSI8PDxihVOwFu5CwvOB2J2r6mRNLeUYMluE05jW3sw==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.62.4.tgz", + "integrity": "sha512-ZVh+NbcibMmD6ve8Deub/G+XAFcGPuzE2Fx/tMAfWfYlfyOAtrMxuL+AARMthpRxdE0JOtggXNTrJb0ZhGYl9g==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3", - "@unocss/preset-mini": "0.62.3" + "@unocss/core": "0.62.4", + "@unocss/preset-mini": "0.62.4" } }, "node_modules/@unocss/preset-uno": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.62.3.tgz", - "integrity": "sha512-RlsrMlpEzoZqB0lr5VvlkHGpEgr0Vp6z4Q/7DjW5t7mi20Z2i8olaLGWM0TO1wKoRi8bxc6HP0RHUS7pHtZxBA==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.62.4.tgz", + "integrity": "sha512-2S6+molIz8dH/al0nfkU7i/pMS0oERPr4k9iW80Byt4cKDIhh/0jhZrC83kgZRtCf5hclSBO4oCoMTi1JF7SBw==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3", - "@unocss/preset-mini": "0.62.3", - "@unocss/preset-wind": "0.62.3", - "@unocss/rule-utils": "0.62.3" + "@unocss/core": "0.62.4", + "@unocss/preset-mini": "0.62.4", + "@unocss/preset-wind": "0.62.4", + "@unocss/rule-utils": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-web-fonts": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.62.3.tgz", - "integrity": "sha512-rGEouncGFwcUY1cjkQ/ZoSmEzOeSi3Yk4YAfHGyS0ff5zKuTDWZgivB8hh/mTtvRzZunIL+FW1+1z5G9rUwjgQ==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.62.4.tgz", + "integrity": "sha512-kaxgYBVyMdBlErseN8kWLiaS2N5OMlwg5ktAxUlei275fMoY7inQjOwppnjDVveJbN9SP6TcqqFpBIPfUayPkQ==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3", + "@unocss/core": "0.62.4", "ofetch": "^1.3.4" }, "funding": { @@ -6149,35 +5792,35 @@ } }, "node_modules/@unocss/preset-wind": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.62.3.tgz", - "integrity": "sha512-6+VNce1he1U5EXKlXRwTIPn8KeK6bZ2jAEgcCxk8mFy8SzOlLeYzXCI9lcdiWRTjIeIiK5iSaUqmsQFtKdTyQg==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.62.4.tgz", + "integrity": "sha512-YOzfQ11AmAnl1ZkcWLMMxCdezLjRKavLNk38LumUMtcdsa0DAy+1JjTp+KEvVQAnD+Et/ld5X+YcBWJkVy5WFQ==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3", - "@unocss/preset-mini": "0.62.3", - "@unocss/rule-utils": "0.62.3" + "@unocss/core": "0.62.4", + "@unocss/preset-mini": "0.62.4", + "@unocss/rule-utils": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/reset": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.62.3.tgz", - "integrity": "sha512-XVKPkbm8y9SGzRaG3x+HygGZURm50MvKLVHXsbxi67RbIir9Ouyt9hQTV6Xs3RicRZFWOpJx3wMRb8iKUOe5Zw==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.62.4.tgz", + "integrity": "sha512-CtxjeDgN39fY/eZDLIXN4wy7C8W7+SD+41AlzGVU5JwhcXmnb1XoDpOd2lzMxc/Yy3F5dIJt2+MRDj9RnpX9Ew==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/rule-utils": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-0.62.3.tgz", - "integrity": "sha512-qI37jHH//XzyR5Y2aN3Kpo4lQrQO+CaiXpqPSwMLYh2bIypc2RQVpqGVtU736x0eA6IIx41XEkKzUW+VtvJvmg==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-0.62.4.tgz", + "integrity": "sha512-XUwLbLUzL+VSHCJNK5QBHC9RbFehumge1/XJmsRfmh0+oxgJoO1gvEvxi57gYEmdJdMRJHRJZ66se6+cB0Ymvw==", "dev": true, "dependencies": { - "@unocss/core": "^0.62.3", + "@unocss/core": "^0.62.4", "magic-string": "^0.30.11" }, "engines": { @@ -6187,90 +5830,67 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@unocss/scope": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/scope/-/scope-0.62.3.tgz", - "integrity": "sha512-TJGmFfsMrTo8DBJ7CJupIqObpgij+w4jCHMBf1uu0/9jbm63dH6WGcrl3zf5mm6UBTeLmB0RwJ8K4hs7LtrBDQ==", - "dev": true - }, "node_modules/@unocss/transformer-attributify-jsx": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.62.3.tgz", - "integrity": "sha512-AutidZj26QW1vLQzuW/aQigC/5ZnIeqGYIBeb/O+FKKt0bU411tHrHnA1iV4CoxIdWJTkw2sGAl6z6YvwAYG6w==", - "dev": true, - "dependencies": { - "@unocss/core": "0.62.3" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-attributify-jsx-babel": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.62.3.tgz", - "integrity": "sha512-3yFZPSoN8VLiAGUAFIyfDRv9HQYTKFGKawDdMM9ATZmSEYOecJnYjS2HayT1P9kzGwBwuKoFjcX50JH1PuNokg==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.62.4.tgz", + "integrity": "sha512-z9DDqS2DibDR9gno55diKfAVegeJ9uoyQXQhH3R0KY4YMF49N1fWy/t74gOiHtlPmvjQtDRZYgjgaMCc2w8oWg==", "dev": true, "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/preset-typescript": "^7.24.7", - "@unocss/core": "0.62.3" + "@unocss/core": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-compile-class": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.62.3.tgz", - "integrity": "sha512-1hf+99wJXzQXQPz9xR0AiTB3vBXT5RiEyugIX95HFx7EvSE/P17RP90yKEKZtDZRUwGiz2vIyySlxcKTFak9Vg==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.62.4.tgz", + "integrity": "sha512-8yadY9T7LToJwSsrmYU3rUKlnDgPGVRvON7z9g1IjUCmFCGx7Gpg84x9KpKUG6eUTshPQFUI0YUHocrYFevAEA==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3" + "@unocss/core": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-directives": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.62.3.tgz", - "integrity": "sha512-HqHwFOA7DfxD/A1ROZIp8Dr8iZcE0z4w3VQtViWPQ89Fqmb7p2wCPGekk+8yW5PAltpynvHE4ahJEto5xjdg6w==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.62.4.tgz", + "integrity": "sha512-bq9ZDG6/mr6X2mAogAo0PBVrLSLT0900MPqnj/ixadYHc7mRpX+y6bc/1AgWytZIFYSdNzf7XDoquZuwf42Ucg==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3", - "@unocss/rule-utils": "0.62.3", + "@unocss/core": "0.62.4", + "@unocss/rule-utils": "0.62.4", "css-tree": "^2.3.1" } }, "node_modules/@unocss/transformer-variant-group": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.62.3.tgz", - "integrity": "sha512-oNX1SdfWemz0GWGSXACu8NevM0t2l44j2ancnooNkNz3l1+z1nbn4vFwfsJCOqOaoVm4ZqxaiQ8HIx81ZSiU1A==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.62.4.tgz", + "integrity": "sha512-W1fxMc2Lzxu4E+6JBQEBzK+AwoCQYI+EL2FT2BCUsAno37f3JdnwFFEVscck0epSdmdtidsSLDognyX8h10r8A==", "dev": true, "dependencies": { - "@unocss/core": "0.62.3" + "@unocss/core": "0.62.4" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/vite": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.62.3.tgz", - "integrity": "sha512-RrqF6Go8s0BGpwRfkOiLuO+n3CUE/CXxGqb0ipbUARhmNWJlekE3YPfayqImSEnCcImpaPgtVGv6Y0u3kLGG/w==", + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.62.4.tgz", + "integrity": "sha512-JKq3V6bcevYl9X5Jl3p9crArbhzI8JVWQkOxKV2nGLFaqvnc47vMSDxlU4MUdRWp3aQvzDw132tcx27oSbrojw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.3.0", "@rollup/pluginutils": "^5.1.0", - "@unocss/config": "0.62.3", - "@unocss/core": "0.62.3", - "@unocss/inspector": "0.62.3", - "@unocss/scope": "0.62.3", - "@unocss/transformer-directives": "0.62.3", + "@unocss/config": "0.62.4", + "@unocss/core": "0.62.4", + "@unocss/inspector": "0.62.4", "chokidar": "^3.6.0", "magic-string": "^0.30.11", - "tinyglobby": "^0.2.5" + "tinyglobby": "^0.2.6" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -6280,9 +5900,9 @@ } }, "node_modules/@vitejs/plugin-vue": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.3.tgz", - "integrity": "sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", + "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -6293,67 +5913,67 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.38.tgz", - "integrity": "sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.8.tgz", + "integrity": "sha512-Uzlxp91EPjfbpeO5KtC0KnXPkuTfGsNDeaKQJxQN718uz+RqDYarEf7UhQJGK+ZYloD2taUbHTI2J4WrUaZQNA==", "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.38", + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.8", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz", - "integrity": "sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.8.tgz", + "integrity": "sha512-GUNHWvoDSbSa5ZSHT9SnV5WkStWfzJwwTd6NMGzilOE/HM5j+9EB9zGXdtu/fCNEmctBqMs6C9SvVPpVPuk1Eg==", "dependencies": { - "@vue/compiler-core": "3.4.38", - "@vue/shared": "3.4.38" + "@vue/compiler-core": "3.5.8", + "@vue/shared": "3.5.8" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.38.tgz", - "integrity": "sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==", - "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.38", - "@vue/compiler-dom": "3.4.38", - "@vue/compiler-ssr": "3.4.38", - "@vue/shared": "3.4.38", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.8.tgz", + "integrity": "sha512-taYpngQtSysrvO9GULaOSwcG5q821zCoIQBtQQSx7Uf7DxpR6CIHR90toPr9QfDD2mqHQPCSgoWBvJu0yV9zjg==", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.8", + "@vue/compiler-dom": "3.5.8", + "@vue/compiler-ssr": "3.5.8", + "@vue/shared": "3.5.8", "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.40", + "magic-string": "^0.30.11", + "postcss": "^8.4.47", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.38.tgz", - "integrity": "sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.8.tgz", + "integrity": "sha512-W96PtryNsNG9u0ZnN5Q5j27Z/feGrFV6zy9q5tzJVyJaLiwYxvC0ek4IXClZygyhjm+XKM7WD9pdKi/wIRVC/Q==", "dependencies": { - "@vue/compiler-dom": "3.4.38", - "@vue/shared": "3.4.38" + "@vue/compiler-dom": "3.5.8", + "@vue/shared": "3.5.8" } }, "node_modules/@vue/devtools-api": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.3.9.tgz", - "integrity": "sha512-D+GTYtFg68bqSu66EugQUydsOqaDlPLNmYw5oYk8k81uBu9/bVTUrqlAJrAA9Am7MXhKz2gWdDkopY6sOBf/Bg==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.4.6.tgz", + "integrity": "sha512-XipBV5k0/IfTr0sNBDTg7OBUCp51cYMMXyPxLXJZ4K/wmUeMqt8cVdr2ZZGOFq+si/jTyCYnNxeKoyev5DOUUA==", "dev": true, "dependencies": { - "@vue/devtools-kit": "^7.3.9" + "@vue/devtools-kit": "^7.4.6" } }, "node_modules/@vue/devtools-kit": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.3.9.tgz", - "integrity": "sha512-Gr17nA+DaQzqyhNx1DUJr1CJRzTRfbIuuC80ZgU8MD/qNO302tv9la+ROi+Uaw+ULVwU9T71GnwLy4n8m9Lspg==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.4.6.tgz", + "integrity": "sha512-NbYBwPWgEic1AOd9bWExz9weBzFdjiIfov0yRn4DrRfR+EQJCI9dn4I0XS7IxYGdkmUJi8mFW42LLk18WsGqew==", "dev": true, "dependencies": { - "@vue/devtools-shared": "^7.3.9", + "@vue/devtools-shared": "^7.4.6", "birpc": "^0.2.17", "hookable": "^5.5.3", "mitt": "^3.0.1", @@ -6363,67 +5983,67 @@ } }, "node_modules/@vue/devtools-shared": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.3.9.tgz", - "integrity": "sha512-CdfMRZKXyI8vw+hqOcQIiLihB6Hbbi7WNZGp7LsuH1Qe4aYAFmTaKjSciRZ301oTnwmU/knC/s5OGuV6UNiNoA==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.4.6.tgz", + "integrity": "sha512-rPeSBzElnHYMB05Cc056BQiJpgocQjY8XVulgni+O9a9Gr9tNXgPteSzFFD+fT/iWMxNuUgGKs9CuW5DZewfIg==", "dev": true, "dependencies": { "rfdc": "^1.4.1" } }, "node_modules/@vue/reactivity": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.38.tgz", - "integrity": "sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.8.tgz", + "integrity": "sha512-mlgUyFHLCUZcAYkqvzYnlBRCh0t5ZQfLYit7nukn1GR96gc48Bp4B7OIcSfVSvlG1k3BPfD+p22gi1t2n9tsXg==", "dependencies": { - "@vue/shared": "3.4.38" + "@vue/shared": "3.5.8" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.38.tgz", - "integrity": "sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.8.tgz", + "integrity": "sha512-fJuPelh64agZ8vKkZgp5iCkPaEqFJsYzxLk9vSC0X3G8ppknclNDr61gDc45yBGTaN5Xqc1qZWU3/NoaBMHcjQ==", "dependencies": { - "@vue/reactivity": "3.4.38", - "@vue/shared": "3.4.38" + "@vue/reactivity": "3.5.8", + "@vue/shared": "3.5.8" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.38.tgz", - "integrity": "sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.8.tgz", + "integrity": "sha512-DpAUz+PKjTZPUOB6zJgkxVI3GuYc2iWZiNeeHQUw53kdrparSTG6HeXUrYDjaam8dVsCdvQxDz6ZWxnyjccUjQ==", "dependencies": { - "@vue/reactivity": "3.4.38", - "@vue/runtime-core": "3.4.38", - "@vue/shared": "3.4.38", + "@vue/reactivity": "3.5.8", + "@vue/runtime-core": "3.5.8", + "@vue/shared": "3.5.8", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.38.tgz", - "integrity": "sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.8.tgz", + "integrity": "sha512-7AmC9/mEeV9mmXNVyUIm1a1AjUhyeeGNbkLh39J00E7iPeGks8OGRB5blJiMmvqSh8SkaS7jkLWSpXtxUCeagA==", "dependencies": { - "@vue/compiler-ssr": "3.4.38", - "@vue/shared": "3.4.38" + "@vue/compiler-ssr": "3.5.8", + "@vue/shared": "3.5.8" }, "peerDependencies": { - "vue": "3.4.38" + "vue": "3.5.8" } }, "node_modules/@vue/shared": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.38.tgz", - "integrity": "sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==" + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.8.tgz", + "integrity": "sha512-mJleSWbAGySd2RJdX1RBtcrUBX6snyOc0qHpgk3lGi4l9/P/3ny3ELqFWqYdkXIwwNN/kdm8nD9ky8o6l/Lx2A==" }, "node_modules/@vueuse/core": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.0.3.tgz", - "integrity": "sha512-RENlh64+SYA9XMExmmH1a3TPqeIuJBNNB/63GT35MZI+zpru3oMRUA6cEFr9HmGqEgUisurwGwnIieF6qu3aXw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.1.0.tgz", + "integrity": "sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg==", "dependencies": { "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "11.0.3", - "@vueuse/shared": "11.0.3", + "@vueuse/metadata": "11.1.0", + "@vueuse/shared": "11.1.0", "vue-demi": ">=0.14.10" }, "funding": { @@ -6456,13 +6076,13 @@ } }, "node_modules/@vueuse/integrations": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-11.0.3.tgz", - "integrity": "sha512-w6CDisaxs19S5Fd+NPPLFaA3GoX5gxuxrbTTBu0EYap7oH13w75L6C/+7e9mcoF9akhcR6GyYajwVMQEjdapJg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-11.1.0.tgz", + "integrity": "sha512-O2ZgrAGPy0qAjpoI2YR3egNgyEqwG85fxfwmA9BshRIGjV4G6yu6CfOPpMHAOoCD+UfsIl7Vb1bXJ6ifrHYDDA==", "dev": true, "dependencies": { - "@vueuse/core": "11.0.3", - "@vueuse/shared": "11.0.3", + "@vueuse/core": "11.1.0", + "@vueuse/shared": "11.1.0", "vue-demi": ">=0.14.10" }, "funding": { @@ -6548,17 +6168,17 @@ } }, "node_modules/@vueuse/metadata": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.0.3.tgz", - "integrity": "sha512-+FtbO4SD5WpsOcQTcC0hAhNlOid6QNLzqedtquTtQ+CRNBoAt9GuV07c6KNHK1wCmlq8DFPwgiLF2rXwgSHX5Q==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.1.0.tgz", + "integrity": "sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg==", "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.0.3.tgz", - "integrity": "sha512-0rY2m6HS5t27n/Vp5cTDsKTlNnimCqsbh/fmT2LgE+aaU42EMfXo8+bNX91W9I7DDmxfuACXMmrd7d79JxkqWA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.1.0.tgz", + "integrity": "sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==", "dependencies": { "vue-demi": ">=0.14.10" }, @@ -6861,22 +6481,11 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -6916,9 +6525,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "dependencies": { "acorn": "^8.11.0" @@ -6990,7 +6599,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -7007,7 +6615,6 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -7022,8 +6629,7 @@ "node_modules/ajv-formats/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 + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -7238,7 +6844,8 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true }, "node_modules/array-ify": { "version": "1.0.0", @@ -7289,19 +6896,8 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "optional": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true }, "node_modules/async": { "version": "3.2.6", @@ -7309,15 +6905,6 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, - "node_modules/async-mutex": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", - "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/async-validator": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", @@ -7362,16 +6949,10 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", - "dev": true - }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "dependencies": { "find-cache-dir": "^4.0.0", @@ -7439,13 +7020,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", - "dev": true, - "optional": true - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -7469,30 +7043,17 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, "engines": { "node": "^4.5.0 || >= 5.9" } }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" - }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true }, - "node_modules/bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/bin-links": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", @@ -7520,15 +7081,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/birpc": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz", @@ -7548,16 +7100,11 @@ "readable-stream": "^3.4.0" } }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "optional": true - }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -7567,7 +7114,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -7581,6 +7128,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -7589,6 +7137,7 @@ "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" } @@ -7596,21 +7145,8 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/boxen": { "version": "7.1.1", @@ -7635,9 +7171,9 @@ } }, "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -7758,12 +7294,6 @@ "node": ">=8" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "optional": true - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -7802,14 +7332,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bson": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", - "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", - "engines": { - "node": ">=16.20.1" - } - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -7833,15 +7355,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -7853,18 +7366,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "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, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bundle-require": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", @@ -7893,6 +7394,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -7954,18 +7456,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dependencies": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -8005,18 +7495,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacheable-request/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "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", @@ -8071,9 +7549,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001655", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", - "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", + "version": "1.0.30001663", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", + "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", "dev": true, "funding": [ { @@ -8090,6 +7568,15 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -8101,6 +7588,24 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -8348,30 +7853,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/co-body": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.2.0.tgz", - "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==", - "dependencies": { - "@hapi/bourne": "^3.0.0", - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -8397,9 +7878,9 @@ } }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/columnify": { @@ -8426,6 +7907,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", @@ -8455,12 +7945,6 @@ "node": ">=4.0.0" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -8484,6 +7968,7 @@ "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -8495,6 +7980,7 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -8512,6 +7998,7 @@ "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" } @@ -8519,7 +8006,14 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/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/concat-map": { "version": "0.0.1", @@ -8548,17 +8042,6 @@ "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", "dev": true }, - "node_modules/config": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/config/-/config-3.3.12.tgz", - "integrity": "sha512-Vmx389R/QVM3foxqBzXO8t2tUikYZP64Q6vQxGrsMpREeJc/aWRnPRERXWsYzOHAumx/AOoILWe6nU3ZJL+6Sw==", - "dependencies": { - "json5": "^2.2.3" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -8640,6 +8123,7 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -8647,29 +8131,11 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/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==", - "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/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -8839,87 +8305,36 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/cookie-session": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.1.0.tgz", - "integrity": "sha512-u73BDmR8QLGcs+Lprs0cfbcAPKl2HnPcjpwRXT41sEV4DRJ2+W0vJEEZkG31ofkx+HZflA70siRIjiTdIodmOQ==", + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, "dependencies": { - "cookies": "0.9.1", - "debug": "3.2.7", - "on-headers": "~1.0.2", - "safe-buffer": "5.2.1" + "is-what": "^4.1.8" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cookie-session/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/cookie-session/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==", - "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/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "node_modules/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dev": true, - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" } }, "node_modules/core-js-compat": { @@ -8938,12 +8353,14 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, "dependencies": { "object-assign": "^4", "vary": "^1" @@ -8978,14 +8395,6 @@ } } }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dependencies": { - "buffer": "^5.1.0" - } - }, "node_modules/create-feathers": { "resolved": "packages/create-feathers", "link": true @@ -9151,11 +8560,12 @@ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -9223,6 +8633,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -9237,11 +8659,6 @@ } } }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==" - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -9345,12 +8762,14 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -9361,6 +8780,14 @@ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, "node_modules/destr": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", @@ -9371,6 +8798,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -9385,25 +8813,29 @@ "node": ">=4" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -9517,7 +8949,8 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true }, "node_modules/ejs": { "version": "3.1.10", @@ -9535,15 +8968,15 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "version": "1.5.28", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", + "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==", "dev": true }, "node_modules/element-plus": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.8.1.tgz", - "integrity": "sha512-p11/6w/O0+hGvPhiN3jrcgh+XG+eg5jZlLdQVYvcPHZYhhCh3J3YeZWW1JO/REPES1vevkboT6VAi+9wHA8Dsg==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.8.3.tgz", + "integrity": "sha512-BXQOyDf0s7JHyNEV8iaO+iaOzTZPsBXVKMzMI967vLCodUBDLrtiY5vglAn1YEebQcUOEUMhGcttTpIvEkcBjQ==", "dependencies": { "@ctrl/tinycolor": "^3.4.1", "@element-plus/icons-vue": "^2.3.1", @@ -9653,21 +9086,6 @@ } } }, - "node_modules/elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", - "optional": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9714,9 +9132,10 @@ } }, "node_modules/engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.1.tgz", + "integrity": "sha512-NEpDCw9hrvBW+hVEOK4T7v0jFJ++KgtPl4jKFwsZVfG1XhS0dCrSb3VMb9gPAd7VAdW52VT1EnaNiU2vM8C0og==", + "dev": true, "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -9734,22 +9153,23 @@ } }, "node_modules/engine.io-client": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz", - "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.1.tgz", + "integrity": "sha512-aYuoak7I+R83M/BBPIOs2to51BmFIpC1wZe6zZzMrT2llVsHy5cvcmdsJgP2Qz6smHu+sD9oexiSUAVd8OfBPw==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1", - "xmlhttprequest-ssl": "~2.0.0" + "xmlhttprequest-ssl": "~2.1.1" } }, "node_modules/engine.io-parser": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, "engines": { "node": ">=10.0.0" } @@ -9758,6 +9178,7 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -10039,16 +9460,16 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@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", @@ -10234,15 +9655,6 @@ "node": "*" } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/esno": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/esno/-/esno-4.7.0.tgz", @@ -10336,17 +9748,9 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, "node_modules/eventemitter3": { @@ -10392,15 +9796,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -10408,36 +9803,37 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -10452,55 +9848,16 @@ "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/express/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/external-editor": { "version": "3.1.0", @@ -10526,12 +9883,6 @@ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -10643,12 +9994,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -10694,12 +10039,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -10714,22 +10060,16 @@ "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/finalhandler/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/find-cache-dir": { "version": "4.0.0", @@ -10896,18 +10236,18 @@ "dev": true }, "node_modules/focus-trap": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", - "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.0.tgz", + "integrity": "sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==", "dev": true, "dependencies": { "tabbable": "^6.2.0" } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -10971,14 +10311,14 @@ } }, "node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "dev": true, "dependencies": { "dezalgo": "^1.0.4", "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" + "once": "^1.4.0" }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" @@ -10988,6 +10328,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -11005,6 +10346,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -11200,15 +10542,6 @@ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/get-pkg-repo": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", @@ -11393,9 +10726,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", - "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -11403,12 +10736,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/getopts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", - "dev": true - }, "node_modules/git-raw-commits": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz", @@ -11492,12 +10819,6 @@ "ini": "^1.3.2" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -11665,43 +10986,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grant": { - "version": "5.4.22", - "resolved": "https://registry.npmjs.org/grant/-/grant-5.4.22.tgz", - "integrity": "sha512-DEi+/JjXT84mmFYhSmv+SX14v+3Z7vuCIYAMwtdPCTXHMSLhWqSYqWAMXDUQZuV7yaJv2d84AYnkCFNooLKBsA==", - "dependencies": { - "qs": "^6.11.2", - "request-compose": "^2.1.6", - "request-oauth": "^1.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "optionalDependencies": { - "cookie": "^0.5.0", - "cookie-signature": "^1.2.1", - "jwk-to-pem": "^2.0.5", - "jws": "^4.0.0" - } - }, - "node_modules/grant/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grant/node_modules/cookie-signature": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", - "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==", - "optional": true, - "engines": { - "node": ">=6.6.0" - } - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -11813,6 +11097,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -11841,16 +11126,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -11862,6 +11137,40 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-to-html": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -11875,21 +11184,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "optional": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hookable": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", @@ -11935,6 +11234,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/hpack.js/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/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -11950,47 +11255,13 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-assert/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/http-cache-semantics": { @@ -12009,6 +11280,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -12255,14 +11527,6 @@ "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, - "node_modules/inflation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", - "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -12340,9 +11604,9 @@ } }, "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, "engines": { "node": ">= 0.10" @@ -12352,7 +11616,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "devOptional": true, + "dev": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -12365,6 +11629,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, "engines": { "node": ">= 0.10" } @@ -12431,21 +11696,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -12470,11 +11720,6 @@ "is-ci": "bin.js" } }, - "node_modules/is-class-hotfix": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", - "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==" - }, "node_modules/is-core-module": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", @@ -12552,20 +11797,6 @@ "node": ">=8" } }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.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", @@ -12798,16 +12029,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-type-of": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-1.4.0.tgz", - "integrity": "sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==", - "dependencies": { - "core-util-is": "^1.0.2", - "is-class-hotfix": "~0.0.6", - "isstream": "~0.1.2" - } - }, "node_modules/is-typed-array": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", @@ -12906,11 +12127,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -13178,12 +12394,6 @@ "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, - "node_modules/js-md4": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", - "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", - "dev": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -13206,7 +12416,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "devOptional": true + "dev": true }, "node_modules/jsesc": { "version": "2.5.2", @@ -13299,6 +12509,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -13385,25 +12596,6 @@ "npm": ">=6" } }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/just-diff": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", @@ -13417,48 +12609,24 @@ "dev": true }, "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "devOptional": true, + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, - "node_modules/jwk-to-pem": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.6.tgz", - "integrity": "sha512-zPC/5vjyR08TpknpTGW6Z3V3lDf9dU92oHbf0jJlG8tGOzslF9xk2UiO/seSx2llCUrNAe+AvmuGTICSXiYU7A==", - "optional": true, - "dependencies": { - "asn1.js": "^5.3.0", - "elliptic": "^6.5.7", - "safe-buffer": "^5.0.1" - } - }, "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "devOptional": true, + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", "dependencies": { - "jwa": "^2.0.0", + "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -13486,421 +12654,135 @@ "node": ">=6" } }, - "node_modules/knex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", - "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", "dev": true, "dependencies": { - "colorette": "2.0.19", - "commander": "^10.0.0", - "debug": "4.3.4", - "escalade": "^3.1.1", - "esm": "^3.2.25", - "get-package-type": "^0.1.0", - "getopts": "2.3.0", - "interpret": "^2.2.0", - "lodash": "^4.17.21", - "pg-connection-string": "2.6.2", - "rechoir": "^0.8.0", - "resolve-from": "^5.0.0", - "tarn": "^3.0.2", - "tildify": "2.0.0" - }, - "bin": { - "knex": "bin/cli.js" + "package-json": "^8.1.0" }, "engines": { - "node": ">=16" + "node": ">=14.16" }, - "peerDependenciesMeta": { - "better-sqlite3": { - "optional": true - }, - "mysql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/knex/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "node_modules/lerna": { + "version": "8.1.8", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.1.8.tgz", + "integrity": "sha512-Rmo5ShMx73xM2CUcRixjmpZIXB7ZFlWEul1YvJyx/rH4onAwDHtUGD7Rx4NZYL8QSRiQHroglM2Oyq+WqA4BYg==", "dev": true, + "dependencies": { + "@lerna/create": "8.1.8", + "@npmcli/arborist": "7.5.4", + "@npmcli/package-json": "5.2.0", + "@npmcli/run-script": "8.1.0", + "@nx/devkit": ">=17.1.2 < 20", + "@octokit/plugin-enterprise-rest": "6.0.1", + "@octokit/rest": "19.0.11", + "aproba": "2.0.0", + "byte-size": "8.1.1", + "chalk": "4.1.0", + "clone-deep": "4.0.1", + "cmd-shim": "6.0.3", + "color-support": "1.1.3", + "columnify": "1.6.0", + "console-control-strings": "^1.1.0", + "conventional-changelog-angular": "7.0.0", + "conventional-changelog-core": "5.0.1", + "conventional-recommended-bump": "7.0.1", + "cosmiconfig": "^8.2.0", + "dedent": "1.5.3", + "envinfo": "7.13.0", + "execa": "5.0.0", + "fs-extra": "^11.2.0", + "get-port": "5.1.1", + "get-stream": "6.0.0", + "git-url-parse": "14.0.0", + "glob-parent": "6.0.2", + "globby": "11.1.0", + "graceful-fs": "4.2.11", + "has-unicode": "2.0.1", + "import-local": "3.1.0", + "ini": "^1.3.8", + "init-package-json": "6.0.3", + "inquirer": "^8.2.4", + "is-ci": "3.0.1", + "is-stream": "2.0.0", + "jest-diff": ">=29.4.3 < 30", + "js-yaml": "4.1.0", + "libnpmaccess": "8.0.6", + "libnpmpublish": "9.0.9", + "load-json-file": "6.2.0", + "lodash": "^4.17.21", + "make-dir": "4.0.0", + "minimatch": "3.0.5", + "multimatch": "5.0.0", + "node-fetch": "2.6.7", + "npm-package-arg": "11.0.2", + "npm-packlist": "8.0.2", + "npm-registry-fetch": "^17.1.0", + "nx": ">=17.1.2 < 20", + "p-map": "4.0.0", + "p-map-series": "2.1.0", + "p-pipe": "3.1.0", + "p-queue": "6.6.2", + "p-reduce": "2.1.0", + "p-waterfall": "2.1.1", + "pacote": "^18.0.6", + "pify": "5.0.0", + "read-cmd-shim": "4.0.0", + "resolve-from": "5.0.0", + "rimraf": "^4.4.1", + "semver": "^7.3.8", + "set-blocking": "^2.0.0", + "signal-exit": "3.0.7", + "slash": "3.0.0", + "ssri": "^10.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "strong-log-transformer": "2.1.0", + "tar": "6.2.1", + "temp-dir": "1.0.0", + "typescript": ">=3 < 6", + "upath": "2.0.1", + "uuid": "^10.0.0", + "validate-npm-package-license": "3.0.4", + "validate-npm-package-name": "5.0.1", + "wide-align": "1.1.5", + "write-file-atomic": "5.0.1", + "write-pkg": "4.0.0", + "yargs": "17.7.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "lerna": "dist/cli.js" + }, "engines": { - "node": ">=14" + "node": ">=18.0.0" } }, - "node_modules/knex/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/lerna/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": { - "ms": "2.1.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.0" + "node": ">=8" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/knex/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/koa": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", - "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" - } - }, - "node_modules/koa-body": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/koa-body/-/koa-body-6.0.1.tgz", - "integrity": "sha512-M8ZvMD8r+kPHy28aWP9VxL7kY8oPWA+C7ZgCljrCMeaU7uX6wsIQgDHskyrAr9sw+jqnIXyv4Mlxri5R4InIJg==", - "dependencies": { - "@types/co-body": "^6.1.0", - "@types/formidable": "^2.0.5", - "@types/koa": "^2.13.5", - "co-body": "^6.1.0", - "formidable": "^2.0.1", - "zod": "^3.19.1" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" - }, - "node_modules/koa-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", - "dependencies": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/koa-qs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/koa-qs/-/koa-qs-3.0.0.tgz", - "integrity": "sha512-05IB5KirwMs3heWW26iTz46HuMAtrlrRMus/aNH1BRDocLyF/099EtCB0MIfQpRuT0TISvaTsWwSy2gctIWiGA==", - "dependencies": { - "merge-descriptors": "^1.0.1", - "qs": "^6.9.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-session": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/koa-session/-/koa-session-6.4.0.tgz", - "integrity": "sha512-h/dxmSOvNEXpHQPRs4TV03TZVFyZIjmYQiTAW5JBFTYBOZ0VdpZ8QEE6Dud75g8z9JNGXi3m++VqRmqToB+c2A==", - "dependencies": { - "crc": "^3.8.0", - "debug": "^4.3.3", - "is-type-of": "^1.2.1", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/koa-session/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/koa/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/koa/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lerna": { - "version": "8.1.8", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.1.8.tgz", - "integrity": "sha512-Rmo5ShMx73xM2CUcRixjmpZIXB7ZFlWEul1YvJyx/rH4onAwDHtUGD7Rx4NZYL8QSRiQHroglM2Oyq+WqA4BYg==", - "dev": true, - "dependencies": { - "@lerna/create": "8.1.8", - "@npmcli/arborist": "7.5.4", - "@npmcli/package-json": "5.2.0", - "@npmcli/run-script": "8.1.0", - "@nx/devkit": ">=17.1.2 < 20", - "@octokit/plugin-enterprise-rest": "6.0.1", - "@octokit/rest": "19.0.11", - "aproba": "2.0.0", - "byte-size": "8.1.1", - "chalk": "4.1.0", - "clone-deep": "4.0.1", - "cmd-shim": "6.0.3", - "color-support": "1.1.3", - "columnify": "1.6.0", - "console-control-strings": "^1.1.0", - "conventional-changelog-angular": "7.0.0", - "conventional-changelog-core": "5.0.1", - "conventional-recommended-bump": "7.0.1", - "cosmiconfig": "^8.2.0", - "dedent": "1.5.3", - "envinfo": "7.13.0", - "execa": "5.0.0", - "fs-extra": "^11.2.0", - "get-port": "5.1.1", - "get-stream": "6.0.0", - "git-url-parse": "14.0.0", - "glob-parent": "6.0.2", - "globby": "11.1.0", - "graceful-fs": "4.2.11", - "has-unicode": "2.0.1", - "import-local": "3.1.0", - "ini": "^1.3.8", - "init-package-json": "6.0.3", - "inquirer": "^8.2.4", - "is-ci": "3.0.1", - "is-stream": "2.0.0", - "jest-diff": ">=29.4.3 < 30", - "js-yaml": "4.1.0", - "libnpmaccess": "8.0.6", - "libnpmpublish": "9.0.9", - "load-json-file": "6.2.0", - "lodash": "^4.17.21", - "make-dir": "4.0.0", - "minimatch": "3.0.5", - "multimatch": "5.0.0", - "node-fetch": "2.6.7", - "npm-package-arg": "11.0.2", - "npm-packlist": "8.0.2", - "npm-registry-fetch": "^17.1.0", - "nx": ">=17.1.2 < 20", - "p-map": "4.0.0", - "p-map-series": "2.1.0", - "p-pipe": "3.1.0", - "p-queue": "6.6.2", - "p-reduce": "2.1.0", - "p-waterfall": "2.1.1", - "pacote": "^18.0.6", - "pify": "5.0.0", - "read-cmd-shim": "4.0.0", - "resolve-from": "5.0.0", - "rimraf": "^4.4.1", - "semver": "^7.3.8", - "set-blocking": "^2.0.0", - "signal-exit": "3.0.7", - "slash": "3.0.0", - "ssri": "^10.0.6", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "strong-log-transformer": "2.1.0", - "tar": "6.2.1", - "temp-dir": "1.0.0", - "typescript": ">=3 < 6", - "upath": "2.0.1", - "uuid": "^10.0.0", - "validate-npm-package-license": "3.0.4", - "validate-npm-package-name": "5.0.1", - "wide-align": "1.1.5", - "write-file-atomic": "5.0.1", - "write-pkg": "4.0.0", - "yargs": "17.7.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "lerna": "dist/cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/lerna/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" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/lerna/node_modules/brace-expansion": { @@ -14179,9 +13061,9 @@ } }, "node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -14518,6 +13400,26 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -14534,6 +13436,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -14543,11 +13446,6 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" - }, "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", @@ -14763,13 +13661,17 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, @@ -14786,10 +13688,95 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -14807,6 +13794,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -14842,12 +13830,12 @@ } }, "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14866,13 +13854,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "devOptional": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "optional": true + "dev": true }, "node_modules/minimatch": { "version": "9.0.5", @@ -15093,12 +14075,6 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/mlly": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", @@ -15222,12 +14198,6 @@ "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", @@ -15296,161 +14266,6 @@ "node": ">=0.10.0" } }, - "node_modules/mongodb": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.8.0.tgz", - "integrity": "sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.7.0", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", - "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^13.0.0" - } - }, - "node_modules/mongodb-memory-server": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-10.0.0.tgz", - "integrity": "sha512-7Geo/s4lst/QHw+N8/stdnyb08xn68O0zbSee62jgoPfWOXfSPhX9a8OvyOY/o23oYk9ra2EpA2Oejenb3JKfw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "mongodb-memory-server-core": "10.0.0", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/mongodb-memory-server-core": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-10.0.0.tgz", - "integrity": "sha512-AdYi4nVqe3Pk95fRJ+DegbDdEfAG9wujNsVvJWbwh8+ZJd+d3JJK1PHxRyJ9rMvoczvlli5M30eMig7zBuF5pQ==", - "dev": true, - "dependencies": { - "async-mutex": "^0.5.0", - "camelcase": "^6.3.0", - "debug": "^4.3.5", - "find-cache-dir": "^3.3.2", - "follow-redirects": "^1.15.6", - "https-proxy-agent": "^7.0.5", - "mongodb": "^6.7.0", - "new-find-package-json": "^2.0.0", - "semver": "^7.6.3", - "tar-stream": "^3.1.7", - "tslib": "^2.6.3", - "yauzl": "^3.1.3" - }, - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/mongodb-memory-server-core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mongodb-memory-server-core/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/mongodb-memory-server-core/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mongodb-memory-server-core/node_modules/make-dir/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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/mongodb-memory-server-core/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -15461,38 +14276,9 @@ } }, "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==" - }, - "node_modules/mssql": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/mssql/-/mssql-11.0.1.tgz", - "integrity": "sha512-KlGNsugoT90enKlR8/G36H0kTxPthDhmtNUCwEHvgRza5Cjpjoj+P2X6eMpFUDN7pFrJZsKadL4x990G8RBE1w==", - "dev": true, - "dependencies": { - "@tediousjs/connection-string": "^0.5.0", - "commander": "^11.0.0", - "debug": "^4.3.3", - "rfdc": "^1.3.0", - "tarn": "^3.0.2", - "tedious": "^18.2.1" - }, - "bin": { - "mssql": "bin/mssql" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/mssql/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "engines": { - "node": ">=16" - } + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/multimatch": { "version": "5.0.0", @@ -15552,45 +14338,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mysql": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", - "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", - "dev": true, - "dependencies": { - "bignumber.js": "9.0.0", - "readable-stream": "2.3.7", - "safe-buffer": "5.1.2", - "sqlstring": "2.3.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mysql/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/mysql/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -15608,18 +14355,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "node_modules/native-duplexpair": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", - "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -15630,6 +14365,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -15640,36 +14376,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/new-find-package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-find-package-json/-/new-find-package-json-2.0.0.tgz", - "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/node-abi": { - "version": "3.67.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", - "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true - }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -15696,28 +14402,6 @@ "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", "dev": true }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-gyp": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", @@ -15912,69 +14596,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-check-updates/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-check-updates/node_modules/@npmcli/move-file/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-check-updates/node_modules/@npmcli/move-file/node_modules/minimatch": { - "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" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm-check-updates/node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm-check-updates/node_modules/@npmcli/promise-spawn": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", @@ -16092,9 +14713,9 @@ } }, "node_modules/npm-check-updates/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -16898,14 +15519,14 @@ } }, "node_modules/nx": { - "version": "19.6.4", - "resolved": "https://registry.npmjs.org/nx/-/nx-19.6.4.tgz", - "integrity": "sha512-yudYlBd3cMchRd8c0ZNan1SfT19AYK2zYOp77XVqVVwgqb6rJVxz6StFGFluUQ7Q7uSpkeT/8PsjwPVLt85EoQ==", + "version": "19.8.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.8.0.tgz", + "integrity": "sha512-zD1ZvkfxECrd9QnvUyAUVLESmjl0bpIhB1gLcYN2BqsCkB1vkngbxIvXDorI98keOVEfHzeuwNSkufQNls1hug==", "dev": true, "hasInstallScript": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", - "@nrwl/tao": "19.6.4", + "@nrwl/tao": "19.8.0", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.7", @@ -16924,7 +15545,7 @@ "ignore": "^5.0.4", "jest-diff": "^29.4.1", "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", + "lines-and-columns": "2.0.3", "minimatch": "9.0.3", "node-machine-id": "1.1.12", "npm-run-path": "^4.0.1", @@ -16945,16 +15566,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "19.6.4", - "@nx/nx-darwin-x64": "19.6.4", - "@nx/nx-freebsd-x64": "19.6.4", - "@nx/nx-linux-arm-gnueabihf": "19.6.4", - "@nx/nx-linux-arm64-gnu": "19.6.4", - "@nx/nx-linux-arm64-musl": "19.6.4", - "@nx/nx-linux-x64-gnu": "19.6.4", - "@nx/nx-linux-x64-musl": "19.6.4", - "@nx/nx-win32-arm64-msvc": "19.6.4", - "@nx/nx-win32-x64-msvc": "19.6.4" + "@nx/nx-darwin-arm64": "19.8.0", + "@nx/nx-darwin-x64": "19.8.0", + "@nx/nx-freebsd-x64": "19.8.0", + "@nx/nx-linux-arm-gnueabihf": "19.8.0", + "@nx/nx-linux-arm64-gnu": "19.8.0", + "@nx/nx-linux-arm64-musl": "19.8.0", + "@nx/nx-linux-x64-gnu": "19.8.0", + "@nx/nx-linux-x64-musl": "19.8.0", + "@nx/nx-win32-arm64-msvc": "19.8.0", + "@nx/nx-win32-x64-msvc": "19.8.0" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -17064,18 +15685,11 @@ "node": ">=14.14" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -17125,20 +15739,21 @@ "dev": true }, "node_modules/ofetch": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.4.tgz", - "integrity": "sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.0.tgz", + "integrity": "sha512-MuHgsEhU6zGeX+EMh+8mSMrYTnsqJQQrpM00Q6QHMKNqQ0bKy0B43tk8tL1wg+CnsSTy1kg4Ir2T5Ig6rD+dfQ==", "dev": true, "dependencies": { "destr": "^2.0.3", - "node-fetch-native": "^1.6.3", - "ufo": "^1.5.3" + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" } }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, "dependencies": { "ee-first": "1.1.1" }, @@ -17150,6 +15765,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -17158,6 +15774,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } @@ -17176,10 +15793,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" + "node_modules/oniguruma-to-js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", + "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", + "dependencies": { + "regex": "^4.3.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, "node_modules/open": { "version": "8.4.2", @@ -17586,6 +16209,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -17603,6 +16227,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -17639,9 +16264,10 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "dev": true }, "node_modules/path-type": { "version": "4.0.0", @@ -17658,126 +16284,16 @@ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, "node_modules/perfect-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "dev": true }, - "node_modules/pg": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", - "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", - "dev": true, - "dependencies": { - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, - "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", - "dev": true, - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", - "dev": true - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", - "dev": true, - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", - "dev": true - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dev": true, - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pg/node_modules/pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==", - "dev": true - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dev": true, - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/pgpass/node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "engines": { - "node": ">= 10.x" - } - }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -17888,9 +16404,9 @@ } }, "node_modules/postcss": { - "version": "8.4.44", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", - "integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -17907,8 +16423,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -17927,81 +16443,16 @@ "node": ">=4" } }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dev": true, - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/preact": { - "version": "10.23.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.23.2.tgz", - "integrity": "sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==", + "version": "10.24.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.1.tgz", + "integrity": "sha512-PnBAwFI3Yjxxcxw75n6VId/5TFxNW/81zexzWD9jn1+eSrOP84NdsS38H5IkF/UH3frqRPT+MvuCoVHjTDTnDw==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" } }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -18072,15 +16523,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -18115,9 +16557,9 @@ } }, "node_modules/promise-call-limit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.1.tgz", - "integrity": "sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz", + "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==", "dev": true, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -18167,6 +16609,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -18183,6 +16634,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -18196,26 +16648,11 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -18274,12 +16711,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -18300,12 +16731,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, "node_modules/quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", @@ -18328,6 +16753,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -18336,6 +16762,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -18350,6 +16777,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, "engines": { "node": ">= 0.8" } @@ -18687,15 +17115,15 @@ } }, "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { - "resolve": "^1.20.0" + "resolve": "^1.1.6" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 0.10" } }, "node_modules/redent": { @@ -18718,9 +17146,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -18743,6 +17171,11 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regex": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.2.tgz", + "integrity": "sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -18835,35 +17268,6 @@ "node": ">=8" } }, - "node_modules/request-compose": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/request-compose/-/request-compose-2.1.6.tgz", - "integrity": "sha512-S07L+2VbJB32WddD/o/PnYGKym63zLVbymygVWXvt8L79VAngcjAxhHaGuFOICLxEV90EasEPzqPKKHPspXP8w==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/request-oauth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/request-oauth/-/request-oauth-1.0.1.tgz", - "integrity": "sha512-85THTg1RgOYtqQw42JON6AqvHLptlj1biw265Tsq4fD4cPdUvhDB2Qh9NTv17yCD322ROuO9aOmpc4GyayGVBA==", - "dependencies": { - "oauth-sign": "^0.9.0", - "qs": "^6.9.6", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/request-oauth/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -18881,12 +17285,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -18940,73 +17338,21 @@ "node": ">=4" } }, - "node_modules/resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/resolve-path/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/resolve-path/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/resolve-path/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" + "lowercase-keys": "^3.0.0" }, "engines": { "node": ">=14.16" @@ -19117,9 +17463,9 @@ } }, "node_modules/rollup": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", - "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -19132,25 +17478,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.2", - "@rollup/rollup-android-arm64": "4.21.2", - "@rollup/rollup-darwin-arm64": "4.21.2", - "@rollup/rollup-darwin-x64": "4.21.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", - "@rollup/rollup-linux-arm-musleabihf": "4.21.2", - "@rollup/rollup-linux-arm64-gnu": "4.21.2", - "@rollup/rollup-linux-arm64-musl": "4.21.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", - "@rollup/rollup-linux-riscv64-gnu": "4.21.2", - "@rollup/rollup-linux-s390x-gnu": "4.21.2", - "@rollup/rollup-linux-x64-gnu": "4.21.2", - "@rollup/rollup-linux-x64-musl": "4.21.2", - "@rollup/rollup-win32-arm64-msvc": "4.21.2", - "@rollup/rollup-win32-ia32-msvc": "4.21.2", - "@rollup/rollup-win32-x64-msvc": "4.21.2", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, + "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 + }, "node_modules/run-async": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", @@ -19215,9 +17567,23 @@ "dev": true }, "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==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safe-regex-test": { "version": "1.0.3", @@ -19242,12 +17608,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", + "version": "1.79.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.3.tgz", + "integrity": "sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==", "dev": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", + "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -19258,6 +17624,34 @@ "node": ">=14.0.0" } }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz", + "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==", + "dev": true, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", @@ -19341,9 +17735,9 @@ "dev": true }, "node_modules/search-insights": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.0.tgz", - "integrity": "sha512-AskayU3QNsXQzSL6v4LTYST7NNfs2HWyHHB+sdORP9chsytAhro5XRfToAMI/LAVYgNbzowVZTMfBRodgbUHKg==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz", + "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==", "dev": true, "peer": true }, @@ -19386,9 +17780,10 @@ "dev": true }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -19412,6 +17807,7 @@ "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" } @@ -19419,21 +17815,18 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { "node": ">= 0.8" } }, - "node_modules/send/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==" - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -19444,27 +17837,20 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -19505,7 +17891,8 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -19588,15 +17975,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/shelljs/node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/shelljs/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -19609,25 +17987,16 @@ "node": "*" } }, - "node_modules/shelljs/node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/shiki": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.16.1.tgz", - "integrity": "sha512-tCJIMaxDVB1mEIJ5TvfZU7kCPB5eo9fli5+21Olc/bmyv+w8kye3JOp+LZRmGkAyT71hrkefQhTiY+o9mBikRQ==", - "dependencies": { - "@shikijs/core": "1.16.1", - "@shikijs/vscode-textmate": "^9.2.0", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.18.0.tgz", + "integrity": "sha512-8jo7tOXr96h9PBQmOHVrltnETn1honZZY76YA79MHheGQg55jBvbm9dtU+MI5pjC5NJCFuA6rvVTLVeSW5cE4A==", + "dependencies": { + "@shikijs/core": "1.18.0", + "@shikijs/engine-javascript": "1.18.0", + "@shikijs/engine-oniguruma": "1.18.0", + "@shikijs/types": "1.18.0", + "@shikijs/vscode-textmate": "^9.2.2", "@types/hast": "^3.0.4" } }, @@ -19667,7 +18036,8 @@ "node_modules/sift": { "version": "17.1.3", "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", - "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "dev": true }, "node_modules/signal-exit": { "version": "4.1.0", @@ -19698,51 +18068,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "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" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -19807,7 +18132,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "devOptional": true, + "dev": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -19820,15 +18145,16 @@ "dev": true }, "node_modules/socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz", + "integrity": "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==", + "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.5.2", + "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, @@ -19840,20 +18166,21 @@ "version": "2.5.5", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" } }, "node_modules/socket.io-client": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", - "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.0.tgz", + "integrity": "sha512-C0jdhD5yQahMws9alf/yvtsMGTaIDBnZ8Rb5HU56svyq0l5LIrGzIDZZD5pHQlmzxLuU91Gz+VpQMKgCTNYtkw==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.5.2", + "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" }, "engines": { @@ -19864,6 +18191,7 @@ "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -19876,7 +18204,7 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "devOptional": true, + "dev": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -19922,9 +18250,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -19946,12 +18274,13 @@ "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "dependencies": { - "memory-pager": "^1.0.2" + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/spawn-please": { @@ -20073,492 +18402,346 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "devOptional": true + "dev": true }, - "node_modules/sqlite3": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", - "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, - "hasInstallScript": true, "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" - }, - "peerDependencies": { - "node-gyp": "8.x" + "minipass": "^7.0.3" }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } - } - }, - "node_modules/sqlite3/node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/sqlite3/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "optional": true, "engines": { - "node": ">= 6" + "node": ">= 0.8" } }, - "node_modules/sqlite3/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "node_modules/sqlite3/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "optional": 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==", "dependencies": { - "debug": "4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 6.0.0" + "node": ">=8" } }, - "node_modules/sqlite3/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/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, - "optional": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/sqlite3/node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, - "optional": true, "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "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", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/sqlite3/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "optional": true, - "dependencies": { - "minipass": "^3.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sqlite3/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "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, - "optional": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sqlite3/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "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==", "dev": true, - "optional": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sqlite3/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "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, - "optional": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sqlite3/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, - "optional": true, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dependencies": { - "yallist": "^4.0.0" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/sqlite3/node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, - "optional": true, "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" }, "engines": { - "node": ">= 10" + "node": ">=4" } }, - "node_modules/sqlite3/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/sqlite3/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "optional": true, + "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==", "dependencies": { - "yallist": "^4.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/sqlite3/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "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, - "optional": true, "dependencies": { - "minipass": "^3.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/sqlite3/node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "optional": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, "engines": { "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" } }, - "node_modules/sqlite3/node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true, - "optional": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, "engines": { - "node": ">= 10.12.0" + "node": ">=10" } }, - "node_modules/sqlite3/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, "engines": { "node": ">=6" } }, - "node_modules/sqlite3/node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "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, - "optional": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "min-indent": "^1.0.0" }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/sqlite3/node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "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, - "optional": true, - "dependencies": { - "minipass": "^3.1.1" - }, "engines": { - "node": ">= 8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sqlite3/node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "node_modules/strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dev": true, - "optional": true, "dependencies": { - "unique-slug": "^2.0.0" + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/sqlite3/node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "optional": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "dev": true }, - "node_modules/sqlstring": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", - "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "node_modules/superagent": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.1.0.tgz", + "integrity": "sha512-JMmik7PbnXGlq7g528Gi6apHbVbTz2vrE3du6fuG4kIPSb2PnLoSOPvfjKn8aQYuJcBWAKW6ZG90qPPsE5jZxQ==", "dev": true, "dependencies": { - "minipass": "^7.0.3" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" + "node": ">=14.18.0" } }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=4", - "npm": ">=6" + "node": ">=4.0.0" } }, - "node_modules/streamx": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.0.tgz", - "integrity": "sha512-ZGd1LhDeGFucr1CUCTBOS58ZhEendd0ttpGT3usTvosS4ntIwKN9LJFp+OeCSprsCPL14BXVRZlHGRY1V9PVzQ==", + "node_modules/superjson": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", "dev": true, "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/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==", - "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/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==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "copy-anything": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "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, + "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==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "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": { - "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", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, "engines": { "node": ">= 0.4" }, @@ -20566,4154 +18749,3347 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/unts" } }, - "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/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "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/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/stringify-object/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", "dependencies": { - "ansi-regex": "^5.0.1" + "minipass": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "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==", + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "yallist": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, "dependencies": { - "min-indent": "^1.0.0" + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, "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", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/tempy/node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "engines": { "node": ">=8" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", + "node_modules/tempy/node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "dependencies": { - "js-tokens": "^9.0.0" + "crypto-random-string": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "engines": { + "node": ">=8" } }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true - }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "node_modules/terser": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", + "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", "dev": true, "dependencies": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" }, "bin": { - "sl-log-transformer": "bin/sl-log-transformer.js" + "terser": "bin/terser" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/superagent": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.1.0.tgz", - "integrity": "sha512-JMmik7PbnXGlq7g528Gi6apHbVbTz2vrE3du6fuG4kIPSb2PnLoSOPvfjKn8aQYuJcBWAKW6ZG90qPPsE5jZxQ==", + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^3.5.1", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0" + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/superagent/node_modules/formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", - "dev": true, - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0" + "node": ">= 10.13.0" }, "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/terser-webpack-plugin/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, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/superjson": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", - "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "copy-anything": "^3.0.2" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=16" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "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/terser/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/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { "node": ">=8" } }, - "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==", + "node_modules/test-exclude/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, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "*" }, "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "dev": true - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" } }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/through2/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/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "engines": { - "node": ">=8.0.0" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/tedious": { - "version": "18.6.1", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-18.6.1.tgz", - "integrity": "sha512-9AvErXXQTd6l7TDd5EmM+nxbOGyhnmdbp/8c3pw+tjaiSXW9usME90ET/CRG1LN1Y9tPMtz/p83z4Q97B4DDpw==", + "node_modules/tinyexec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", + "dev": true + }, + "node_modules/tinyglobby": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.6.tgz", + "integrity": "sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==", "dev": true, "dependencies": { - "@azure/core-auth": "^1.7.2", - "@azure/identity": "^4.2.1", - "@azure/keyvault-keys": "^4.4.0", - "@js-joda/core": "^5.6.1", - "@types/node": ">=18", - "bl": "^6.0.11", - "iconv-lite": "^0.6.3", - "js-md4": "^0.3.2", - "native-duplexpair": "^1.0.0", - "sprintf-js": "^1.1.3" + "fdir": "^6.3.0", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=18" - } - }, - "node_modules/tedious/node_modules/bl": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.14.tgz", - "integrity": "sha512-TJfbvGdL7KFGxTsEbsED7avqpFdY56q9IW0/aiytyheJzxST/+Io6cx/4Qx0K2/u0BPRDs65mjaQzYvMZeNocQ==", - "dev": true, - "dependencies": { - "@types/readable-stream": "^4.0.0", - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^4.2.0" + "node": ">=12.0.0" } }, - "node_modules/tedious/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", + "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", "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" + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" } }, - "node_modules/tedious/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tedious/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dev": true, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.6.0" } }, - "node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "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-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.0" } }, - "node_modules/tempy/node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/tempy/node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", "dev": true, "engines": { - "node": ">=10" - }, + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/tempy/node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==" + }, + "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, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, "engines": { - "node": ">=10" + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=12.0.0" }, "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "typescript": "*", + "webpack": "^5.0.0" } }, - "node_modules/terser-webpack-plugin/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==", + "node_modules/ts-loader/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": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/ts-loader/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": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/terser/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/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/ts-loader/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": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/test-exclude/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/ts-loader/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/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">= 8" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/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, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@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" }, - "engines": { - "node": "*" + "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" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/ts-node/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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=0.3.1" } }, - "node_modules/text-decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", - "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "dependencies": { - "b4a": "^1.6.4" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "node_modules/tsconfig-paths/node_modules/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, "engines": { - "node": ">=0.10" + "node": ">=4" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, + "node_modules/tsx": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/tuf-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "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": { - "safe-buffer": "~5.1.0" + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "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, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tinyexec": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", - "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", - "dev": true - }, - "node_modules/tinyglobby": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.5.tgz", - "integrity": "sha512-Dlqgt6h0QkoHttG53/WGADNh9QhcjCAIZMTERAVhdpmIBEejSuLI9ZmGKWzB7tweBjlk30+s/ofi4SLmBeTYhw==", + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "dependencies": { - "fdir": "^6.2.0", - "picomatch": "^4.0.2" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.6" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", - "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", + "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, - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": ">= 0.4" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "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, + "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": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "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, "dependencies": { - "os-tmpdir": "~1.0.2" + "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.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "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, + "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": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=8.0" + "node": ">=14.17" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, "engines": { - "node": ">=0.6" + "node": ">=0.8.0" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "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==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "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/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "node_modules/unconfig": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.5.5.tgz", + "integrity": "sha512-VQZ5PT9HDX+qag0XdgQi8tJepPhXiR/yVOkn707gJDKo31lGjRilPREiQJ9Z6zd/Ugpv6ZvO5VxVIcatldYcNQ==", "dev": true, "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "@antfu/utils": "^0.7.10", + "defu": "^6.1.4", + "importx": "^0.4.3" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "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==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">=4" } }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, "dependencies": { - "punycode": "^2.3.0" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { - "node": ">=14" + "node": ">=4" } }, - "node_modules/treeverse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", - "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/ts-algebra": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", - "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==" - }, - "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==", + "node_modules/unimport": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.12.0.tgz", + "integrity": "sha512-5y8dSvNvyevsnw4TBQkIQR1Rjdbb+XjVSwQwxltpnVZrStBvvPkMPcZrh1kg5kY77kpx6+D4Ztd3W6FOBH/y2Q==", "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "acorn": "^8.12.1", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.11", + "mlly": "^1.7.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "scule": "^1.3.0", + "strip-literal": "^2.1.0", + "unplugin": "^1.14.1" + } + }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" + "@types/estree": "^1.0.0" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" }, "engines": { - "node": ">=12.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ts-loader/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/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "crypto-random-string": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ts-loader/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, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ts-loader/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, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dependencies": { - "color-name": "~1.1.4" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">=7.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ts-loader/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==", + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "dev": true }, - "node_modules/ts-loader/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { - "node": ">= 8" + "node": ">= 10.0.0" } }, - "node_modules/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, - "dependencies": { - "@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" + "node_modules/unocss": { + "version": "0.62.4", + "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.62.4.tgz", + "integrity": "sha512-SaGbxXQkk8GDPeJpWsBCZ8a23Knu4ixVTt6pvcQWKjOCGTd9XBd+vLZzN2WwdwgBPVwmMmx5wp+/gPHKFNOmIw==", + "dev": true, + "dependencies": { + "@unocss/astro": "0.62.4", + "@unocss/cli": "0.62.4", + "@unocss/core": "0.62.4", + "@unocss/postcss": "0.62.4", + "@unocss/preset-attributify": "0.62.4", + "@unocss/preset-icons": "0.62.4", + "@unocss/preset-mini": "0.62.4", + "@unocss/preset-tagify": "0.62.4", + "@unocss/preset-typography": "0.62.4", + "@unocss/preset-uno": "0.62.4", + "@unocss/preset-web-fonts": "0.62.4", + "@unocss/preset-wind": "0.62.4", + "@unocss/transformer-attributify-jsx": "0.62.4", + "@unocss/transformer-compile-class": "0.62.4", + "@unocss/transformer-directives": "0.62.4", + "@unocss/transformer-variant-group": "0.62.4", + "@unocss/vite": "0.62.4" }, - "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": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "@unocss/webpack": "0.62.4", + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0" }, "peerDependenciesMeta": { - "@swc/core": { + "@unocss/webpack": { "optional": true }, - "@swc/wasm": { + "vite": { "optional": true } } }, - "node_modules/ts-node/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/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">= 0.8" } }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "node_modules/unplugin": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz", + "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==", "dev": true, "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" }, "engines": { - "node": ">=6" + "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } } }, - "node_modules/tsconfig-paths/node_modules/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==", + "node_modules/unplugin-auto-import": { + "version": "0.18.3", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.18.3.tgz", + "integrity": "sha512-q3FUtGQjYA2e+kb1WumyiQMjHM27MrTQ05QfVwtLRVhyYe+KF6TblBYaEX9L6Z0EibsqaXAiW+RFfkcQpfaXzg==", "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "engines": { - "node": ">=0.6.x" - } - }, - "node_modules/tsx": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.0.tgz", - "integrity": "sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==", "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.0", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.11", + "minimatch": "^9.0.5", + "unimport": "^3.12.0", + "unplugin": "^1.14.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=14" }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } } }, - "node_modules/tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", + "node_modules/unplugin-vue-components": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.27.4.tgz", + "integrity": "sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==", "dev": true, "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.0", + "chokidar": "^3.6.0", + "debug": "^4.3.6", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.11", + "minimatch": "^9.0.5", + "mlly": "^1.7.1", + "unplugin": "^1.12.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, "engines": { - "node": "*" + "node": ">=8" } }, - "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==", + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=4", + "yarn": "*" } }, - "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/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, - "engines": { - "node": ">=10" + "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" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dev": true, "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, - "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==", + "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": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" + "punycode": "^2.1.0" } }, - "node_modules/typed-array-byte-length": { + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, - "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": ">= 0.4.0" } }, - "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==", + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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 + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "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" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.12.0" } }, - "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==", + "node_modules/v8-to-istanbul/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, "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": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "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": { - "is-typedarray": "^1.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, "engines": { - "node": ">=14.17" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.8" } }, - "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==", - "dev": true, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/unconfig": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.5.5.tgz", - "integrity": "sha512-VQZ5PT9HDX+qag0XdgQi8tJepPhXiR/yVOkn707gJDKo31lGjRilPREiQJ9Z6zd/Ugpv6ZvO5VxVIcatldYcNQ==", - "dev": true, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dependencies": { - "@antfu/utils": "^0.7.10", - "defu": "^6.1.4", - "importx": "^0.4.3" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "node_modules/vite": { + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", + "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=4" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/vite-plugin-pwa": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.20.5.tgz", + "integrity": "sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==", "dev": true, "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.0", + "workbox-build": "^7.1.0", + "workbox-window": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vite-pwa/assets-generator": "^0.2.6", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0", + "workbox-build": "^7.1.0", + "workbox-window": "^7.1.0" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/unimport": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.11.1.tgz", - "integrity": "sha512-DuB1Uoq01LrrXTScxnwOoMSlTXxyKcULguFxbLrMDFcE/CO0ZWHpEiyhovN0mycPt7K6luAHe8laqvwvuoeUPg==", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "acorn": "^8.12.1", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "fast-glob": "^3.3.2", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.11", - "mlly": "^1.7.1", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "scule": "^1.3.0", - "strip-literal": "^2.1.0", - "unplugin": "^1.12.2" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unimport/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unimport/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.0.0" + "node": ">=12" } }, - "node_modules/unocss": { - "version": "0.62.3", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.62.3.tgz", - "integrity": "sha512-CLS6+JIlBobe/iPTz07pehyGDP8VqGJsiE+ZZ3Xkgib3hw76nCqAQF/4mJ8jVoV4C8KvGyVxmHaSSCFOkWmmZg==", - "dev": true, - "dependencies": { - "@unocss/astro": "0.62.3", - "@unocss/cli": "0.62.3", - "@unocss/core": "0.62.3", - "@unocss/extractor-arbitrary-variants": "0.62.3", - "@unocss/postcss": "0.62.3", - "@unocss/preset-attributify": "0.62.3", - "@unocss/preset-icons": "0.62.3", - "@unocss/preset-mini": "0.62.3", - "@unocss/preset-tagify": "0.62.3", - "@unocss/preset-typography": "0.62.3", - "@unocss/preset-uno": "0.62.3", - "@unocss/preset-web-fonts": "0.62.3", - "@unocss/preset-wind": "0.62.3", - "@unocss/reset": "0.62.3", - "@unocss/transformer-attributify-jsx": "0.62.3", - "@unocss/transformer-attributify-jsx-babel": "0.62.3", - "@unocss/transformer-compile-class": "0.62.3", - "@unocss/transformer-directives": "0.62.3", - "@unocss/transformer-variant-group": "0.62.3", - "@unocss/vite": "0.62.3" - }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@unocss/webpack": "0.62.3", - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0" - }, - "peerDependenciesMeta": { - "@unocss/webpack": { - "optional": true - }, - "vite": { - "optional": true - } + "node": ">=12" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/unplugin": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.12.3.tgz", - "integrity": "sha512-my8DH0/T/Kx33KO+6QXAqdeMYgyy0GktlOpdQjpagfHKw5DrD0ctPr7SHUyOT3g4ZVpzCQGt/qcpuoKJ/pniHA==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "acorn": "^8.12.1", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.6.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.0.0" + "node": ">=12" } }, - "node_modules/unplugin-auto-import": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.18.2.tgz", - "integrity": "sha512-Dwb3rAic75harVBrVjwiq6H24PT+nBq2dpxV5BH8NNI6sDFaTytvP+iyo4xy7prQbR3r5K6nMs4f5Wp9PE4g8A==", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@antfu/utils": "^0.7.10", - "@rollup/pluginutils": "^5.1.0", - "fast-glob": "^3.3.2", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.10", - "minimatch": "^9.0.5", - "unimport": "^3.9.0", - "unplugin": "^1.11.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@nuxt/kit": "^3.2.2", - "@vueuse/core": "*" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - }, - "@vueuse/core": { - "optional": true - } + "node": ">=12" } }, - "node_modules/unplugin-vue-components": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.27.4.tgz", - "integrity": "sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@antfu/utils": "^0.7.10", - "@rollup/pluginutils": "^5.1.0", - "chokidar": "^3.6.0", - "debug": "^4.3.6", - "fast-glob": "^3.3.2", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.11", - "minimatch": "^9.0.5", - "mlly": "^1.7.1", - "unplugin": "^1.12.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@babel/parser": "^7.15.8", - "@nuxt/kit": "^3.2.2", - "vue": "2 || 3" - }, - "peerDependenciesMeta": { - "@babel/parser": { - "optional": true - }, - "@nuxt/kit": { - "optional": true - } + "node": ">=12" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4", - "yarn": "*" + "node": ">=12" } }, - "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==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "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" - } - ], - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "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": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" + "optional": true, + "os": [ + "linux" ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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 - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/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, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "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/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz", - "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.41", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-pwa": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.20.2.tgz", - "integrity": "sha512-9wLqHt/NjP7YKj6CCEKS5+Fhffo6tHGrAa+wvoqCG59oZkmpX5lBBl38MVjLaO4ELrLqjdtUhILJDwZu+q/hGQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "pretty-bytes": "^6.1.1", - "tinyglobby": "^0.2.0", - "workbox-build": "^7.1.0", - "workbox-window": "^7.1.0" - }, "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vite-pwa/assets-generator": "^0.2.4", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0", - "workbox-build": "^7.1.0", - "workbox-window": "^7.1.0" - }, - "peerDependenciesMeta": { - "@vite-pwa/assets-generator": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ - "ppc64" + "x64" ], "dev": true, "optional": true, "os": [ - "aix" + "netbsd" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ - "arm" + "x64" ], "dev": true, "optional": true, "os": [ - "android" + "openbsd" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { + "node_modules/vite/node_modules/@esbuild/sunos-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, "os": [ - "android" + "sunos" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { + "node_modules/vite/node_modules/@esbuild/win32-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ - "x64" + "arm64" ], "dev": true, "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "node_modules/vite/node_modules/@esbuild/win32-ia32": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ - "arm64" + "ia32" ], "dev": true, "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/vitepress": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.3.4.tgz", + "integrity": "sha512-I1/F6OW1xl3kW4PaIMC6snxjWgf3qfziq2aqsDoFc/Gt41WbcRv++z8zjw8qGRIJ+I4bUW7ZcKFDHHN/jkH9DQ==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@docsearch/css": "^3.6.1", + "@docsearch/js": "^3.6.1", + "@shikijs/core": "^1.13.0", + "@shikijs/transformers": "^1.13.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.1.2", + "@vue/devtools-api": "^7.3.8", + "@vue/shared": "^3.4.38", + "@vueuse/core": "^11.0.0", + "@vueuse/integrations": "^11.0.0", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.0", + "shiki": "^1.13.0", + "vite": "^5.4.1", + "vue": "^3.4.38" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "node_modules/vitepress-plugin-google-analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vitepress-plugin-google-analytics/-/vitepress-plugin-google-analytics-1.0.2.tgz", + "integrity": "sha512-ri8bFUAmt3c/DtPrALauGBIUr2gIJ11c1qNRhwd3/+aiuYZBfQpOosSxcO1AswgwRxP9FwBS6Z7jgdDVyXb2hA==", + "dev": true }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], + "node_modules/vitepress-plugin-search": { + "version": "1.0.4-alpha.22", + "resolved": "https://registry.npmjs.org/vitepress-plugin-search/-/vitepress-plugin-search-1.0.4-alpha.22.tgz", + "integrity": "sha512-IAOEJu+kjVY+0pb6/PeRjIbr175HFFbnMdLmLjqcy7VWxkabIRZbLoQL1VUYDZl804o/Or+GaX02gsiMOnVxFA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@types/flexsearch": "^0.7.3", + "@types/markdown-it": "^12.2.3", + "glob-to-regexp": "^0.4.1", + "markdown-it": "^13.0.1" + }, "engines": { - "node": ">=12" + "node": "^14.13.1 || ^16.7.0 || >=18" + }, + "peerDependencies": { + "flexsearch": "^0.7.31", + "vitepress": "^1.0.0-rc.35", + "vue": "3" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], + "node_modules/vitepress-plugin-search/node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/vitepress-plugin-search/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/vitepress-plugin-search/node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "uc.micro": "^1.0.1" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/vitepress-plugin-search/node_modules/markdown-it": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitepress": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.3.4.tgz", - "integrity": "sha512-I1/F6OW1xl3kW4PaIMC6snxjWgf3qfziq2aqsDoFc/Gt41WbcRv++z8zjw8qGRIJ+I4bUW7ZcKFDHHN/jkH9DQ==", - "dev": true, - "dependencies": { - "@docsearch/css": "^3.6.1", - "@docsearch/js": "^3.6.1", - "@shikijs/core": "^1.13.0", - "@shikijs/transformers": "^1.13.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^5.1.2", - "@vue/devtools-api": "^7.3.8", - "@vue/shared": "^3.4.38", - "@vueuse/core": "^11.0.0", - "@vueuse/integrations": "^11.0.0", - "focus-trap": "^7.5.4", - "mark.js": "8.11.1", - "minisearch": "^7.1.0", - "shiki": "^1.13.0", - "vite": "^5.4.1", - "vue": "^3.4.38" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "postcss": "^8" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } - } - }, - "node_modules/vitepress-plugin-google-analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vitepress-plugin-google-analytics/-/vitepress-plugin-google-analytics-1.0.2.tgz", - "integrity": "sha512-ri8bFUAmt3c/DtPrALauGBIUr2gIJ11c1qNRhwd3/+aiuYZBfQpOosSxcO1AswgwRxP9FwBS6Z7jgdDVyXb2hA==", - "dev": true - }, - "node_modules/vitepress-plugin-search": { - "version": "1.0.4-alpha.22", - "resolved": "https://registry.npmjs.org/vitepress-plugin-search/-/vitepress-plugin-search-1.0.4-alpha.22.tgz", - "integrity": "sha512-IAOEJu+kjVY+0pb6/PeRjIbr175HFFbnMdLmLjqcy7VWxkabIRZbLoQL1VUYDZl804o/Or+GaX02gsiMOnVxFA==", - "dev": true, - "dependencies": { - "@types/flexsearch": "^0.7.3", - "@types/markdown-it": "^12.2.3", - "glob-to-regexp": "^0.4.1", - "markdown-it": "^13.0.1" - }, - "engines": { - "node": "^14.13.1 || ^16.7.0 || >=18" - }, - "peerDependencies": { - "flexsearch": "^0.7.31", - "vitepress": "^1.0.0-rc.35", - "vue": "3" - } - }, - "node_modules/vitepress-plugin-search/node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/vitepress-plugin-search/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/vitepress-plugin-search/node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "dev": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/vitepress-plugin-search/node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/vitepress-plugin-search/node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, - "node_modules/vitepress-plugin-search/node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "node_modules/vue": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.38.tgz", - "integrity": "sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==", - "dependencies": { - "@vue/compiler-dom": "3.4.38", - "@vue/compiler-sfc": "3.4.38", - "@vue/runtime-dom": "3.4.38", - "@vue/server-renderer": "3.4.38", - "@vue/shared": "3.4.38" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "dev": true - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-cli/node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-cli/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true - }, - "node_modules/webpack/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/webpack/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/webpack/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/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "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-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": { - "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/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, - "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/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/widest-line/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, - "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/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "node_modules/vitepress-plugin-search/node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true }, - "node_modules/workbox-background-sync": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz", - "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==", - "dev": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "7.1.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz", - "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==", - "dev": true, - "dependencies": { - "workbox-core": "7.1.0" - } - }, - "node_modules/workbox-build": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.1.1.tgz", - "integrity": "sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==", - "dev": true, - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.24.4", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^2.4.1", - "@rollup/plugin-terser": "^0.4.3", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "7.1.0", - "workbox-broadcast-update": "7.1.0", - "workbox-cacheable-response": "7.1.0", - "workbox-core": "7.1.0", - "workbox-expiration": "7.1.0", - "workbox-google-analytics": "7.1.0", - "workbox-navigation-preload": "7.1.0", - "workbox-precaching": "7.1.0", - "workbox-range-requests": "7.1.0", - "workbox-recipes": "7.1.0", - "workbox-routing": "7.1.0", - "workbox-strategies": "7.1.0", - "workbox-streams": "7.1.0", - "workbox-sw": "7.1.0", - "workbox-window": "7.1.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dev": true, - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } + "node_modules/vitepress-plugin-search/node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true }, - "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dev": true, + "node_modules/vue": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.8.tgz", + "integrity": "sha512-hvuvuCy51nP/1fSRvrrIqTLSvrSyz2Pq+KQ8S8SXCxTWVE0nMaOnSDnSOxV1eYmGfvK7mqiwvd1C59CEEz7dAQ==", "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" + "@vue/compiler-dom": "3.5.8", + "@vue/compiler-sfc": "3.5.8", + "@vue/runtime-dom": "3.5.8", + "@vue/server-renderer": "3.5.8", + "@vue/shared": "3.5.8" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" + "typescript": "*" }, "peerDependenciesMeta": { - "@types/babel__core": { + "typescript": { "optional": true } } }, - "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true + }, + "node_modules/watchpack": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/workbox-build/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/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "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" + "minimalistic-assert": "^1.0.0" } }, - "node_modules/workbox-build/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==", + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/webpack": { + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/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" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/workbox-build/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/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10" + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/workbox-build/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14" } }, - "node_modules/workbox-build/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/workbox-build/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "node_modules/webpack-cli/node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/workbox-build/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "resolve": "^1.20.0" }, "engines": { - "node": "*" + "node": ">= 10.13.0" } }, - "node_modules/workbox-build/node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "node_modules/webpack-cli/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/workbox-build/node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, - "bin": { - "rollup": "dist/bin/rollup" + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=18.0.0" } }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, "engines": { - "node": ">= 8" + "node": ">=10.13.0" } }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true + }, + "node_modules/webpack/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": { - "punycode": "^2.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/workbox-build/node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "node_modules/webpack/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", - "yarn": "*" + "node": ">=4.0" } }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "node_modules/webpack/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/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/workbox-cacheable-response": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz", - "integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==", + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "dependencies": { - "workbox-core": "7.1.0" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "node_modules/workbox-core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", - "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", - "dev": true - }, - "node_modules/workbox-expiration": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz", - "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==", + "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": { - "idb": "^7.0.1", - "workbox-core": "7.1.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/workbox-google-analytics": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.1.0.tgz", - "integrity": "sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==", + "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": { - "workbox-background-sync": "7.1.0", - "workbox-core": "7.1.0", - "workbox-routing": "7.1.0", - "workbox-strategies": "7.1.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/workbox-navigation-preload": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.1.0.tgz", - "integrity": "sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==", + "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, "dependencies": { - "workbox-core": "7.1.0" + "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/workbox-precaching": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz", - "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==", + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "dependencies": { - "workbox-core": "7.1.0", - "workbox-routing": "7.1.0", - "workbox-strategies": "7.1.0" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/workbox-range-requests": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.1.0.tgz", - "integrity": "sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==", + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "dev": true, "dependencies": { - "workbox-core": "7.1.0" + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/workbox-recipes": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.1.0.tgz", - "integrity": "sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==", + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, - "dependencies": { - "workbox-cacheable-response": "7.1.0", - "workbox-core": "7.1.0", - "workbox-expiration": "7.1.0", - "workbox-precaching": "7.1.0", - "workbox-routing": "7.1.0", - "workbox-strategies": "7.1.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/workbox-routing": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz", - "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==", + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/widest-line/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, "dependencies": { - "workbox-core": "7.1.0" + "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/workbox-strategies": { + "node_modules/widest-line/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz", - "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "workbox-core": "7.1.0" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/workbox-streams": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz", - "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==", + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "dependencies": { - "workbox-core": "7.1.0", - "workbox-routing": "7.1.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/workbox-sw": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.1.0.tgz", - "integrity": "sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==", + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, - "node_modules/workbox-window": { + "node_modules/workbox-background-sync": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.1.0.tgz", - "integrity": "sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz", + "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==", "dev": true, "dependencies": { - "@types/trusted-types": "^2.0.2", + "idb": "^7.0.1", "workbox-core": "7.1.0" } }, - "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/workbox-broadcast-update": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz", + "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==", + "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "workbox-core": "7.1.0" } }, - "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==", + "node_modules/workbox-build": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.1.1.tgz", + "integrity": "sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.1.0", + "workbox-broadcast-update": "7.1.0", + "workbox-cacheable-response": "7.1.0", + "workbox-core": "7.1.0", + "workbox-expiration": "7.1.0", + "workbox-google-analytics": "7.1.0", + "workbox-navigation-preload": "7.1.0", + "workbox-precaching": "7.1.0", + "workbox-range-requests": "7.1.0", + "workbox-recipes": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0", + "workbox-streams": "7.1.0", + "workbox-sw": "7.1.0", + "workbox-window": "7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=16.0.0" } }, - "node_modules/wrap-ansi-cjs/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/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "ajv": ">=8" } }, - "node_modules/wrap-ansi-cjs/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/workbox-build/node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } } }, - "node_modules/wrap-ansi-cjs/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/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" } }, - "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/workbox-build/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": { - "color-name": "~1.1.4" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=7.0.0" + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "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==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "node_modules/workbox-build/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/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", + "node_modules/workbox-build/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": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" - }, - "engines": { - "node": ">=6" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/write-json-file/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/workbox-build/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/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/write-json-file/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/workbox-build/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=6" - } - }, - "node_modules/write-json-file/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/write-json-file/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/workbox-build/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/write-json-file/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "node_modules/workbox-build/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "sourcemap-codec": "^1.4.8" } }, - "node_modules/write-pkg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", - "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", + "node_modules/workbox-build/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "sort-keys": "^2.0.0", - "type-fest": "^0.4.1", - "write-json-file": "^3.2.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/write-pkg/node_modules/type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "node_modules/workbox-build/node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, "engines": { "node": ">=10.0.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "whatwg-url": "^7.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 8" } }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=4", + "yarn": "*" } }, - "node_modules/xtend": { + "node_modules/workbox-build/node_modules/webidl-conversions": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, - "engines": { - "node": ">=0.4" + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/workbox-cacheable-response": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz", + "integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "workbox-core": "7.1.0" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "node_modules/workbox-core": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz", + "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==", "dev": true }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/workbox-expiration": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz", + "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==", "dev": true, "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" + "idb": "^7.0.1", + "workbox-core": "7.1.0" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/workbox-google-analytics": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.1.0.tgz", + "integrity": "sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "workbox-background-sync": "7.1.0", + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" } }, - "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==", + "node_modules/workbox-navigation-preload": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.1.0.tgz", + "integrity": "sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==", "dev": true, "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" + "workbox-core": "7.1.0" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/workbox-precaching": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz", + "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" } }, - "node_modules/yargs-unparser/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==", + "node_modules/workbox-range-requests": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.1.0.tgz", + "integrity": "sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "workbox-core": "7.1.0" } }, - "node_modules/yargs-unparser/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==", + "node_modules/workbox-recipes": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.1.0.tgz", + "integrity": "sha512-NRrk4ycFN9BHXJB6WrKiRX3W3w75YNrNrzSX9cEZgFB5ubeGoO8s/SDmOYVrFYp9HMw6sh1Pm3eAY/1gVS8YLg==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "workbox-cacheable-response": "7.1.0", + "workbox-core": "7.1.0", + "workbox-expiration": "7.1.0", + "workbox-precaching": "7.1.0", + "workbox-routing": "7.1.0", + "workbox-strategies": "7.1.0" } }, - "node_modules/yauzl": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.1.3.tgz", - "integrity": "sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==", + "node_modules/workbox-routing": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz", + "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==", "dev": true, "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/ylru": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", - "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", - "engines": { - "node": ">= 4.0.0" + "workbox-core": "7.1.0" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "node_modules/workbox-strategies": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz", + "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "workbox-core": "7.1.0" } }, - "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==", + "node_modules/workbox-streams": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz", + "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "workbox-core": "7.1.0", + "workbox-routing": "7.1.0" } }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } + "node_modules/workbox-sw": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.1.0.tgz", + "integrity": "sha512-Hml/9+/njUXBglv3dtZ9WBKHI235AQJyLBV1G7EFmh4/mUdSQuXui80RtjDeVRrXnm/6QWgRUEHG3/YBVbxtsA==", + "dev": true }, - "packages/adapter-commons": { - "name": "@feathersjs/adapter-commons", - "version": "5.0.30", - "license": "MIT", + "node_modules/workbox-window": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.1.0.tgz", + "integrity": "sha512-ZHeROyqR+AS5UPzholQRDttLFqGMwP0Np8MKWAdyxsDETxq3qOAyXvqessc3GniohG6e0mAqSQyKOHmT8zPF7g==", + "dev": true, "dependencies": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30" - }, - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/mongodb": "^4.0.6", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "mongodb": "^6.8.0", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.1.0" } }, - "packages/adapter-tests": { - "name": "@feathersjs/adapter-tests", - "version": "5.0.30", - "license": "MIT", - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" + "node": ">=8" } }, - "packages/authentication": { - "name": "@feathersjs/authentication", - "version": "5.0.30", - "license": "MIT", - "dependencies": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/hooks": "^0.9.0", - "@feathersjs/schema": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@types/jsonwebtoken": "^9.0.6", - "jsonwebtoken": "^9.0.2", - "lodash": "^4.17.21", - "long-timeout": "^0.1.1", - "uuid": "^10.0.0" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.30", - "@types/lodash": "^4.17.7", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "@types/uuid": "^10.0.0", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" + "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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 12" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "packages/authentication-client": { - "name": "@feathersjs/authentication-client", - "version": "5.0.30", - "license": "MIT", + "node_modules/wrap-ansi-cjs/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": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/express": "^5.0.30", - "@feathersjs/memory": "^5.0.30", - "@feathersjs/rest-client": "^5.0.30", - "@feathersjs/socketio": "^5.0.30", - "@feathersjs/socketio-client": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "axios": "^1.7.7", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 12" + "node": ">=8" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "packages/authentication-local": { - "name": "@feathersjs/authentication-local", - "version": "5.0.30", - "license": "MIT", + "node_modules/wrap-ansi-cjs/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": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "bcryptjs": "^2.4.3", - "lodash": "^4.17.21" + "color-name": "~1.1.4" }, - "devDependencies": { - "@feathersjs/memory": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@types/bcryptjs": "^2.4.6", - "@types/lodash": "^4.17.7", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/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/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==", + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 12" + "node": ">=8" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "packages/authentication-oauth": { - "name": "@feathersjs/authentication-oauth", - "version": "5.0.30", - "license": "MIT", + "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==", "dependencies": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/express": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/koa": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "cookie-session": "^2.1.0", - "grant": "^5.4.22", - "koa-session": "^6.4.0", - "qs": "^6.13.0" + "color-name": "~1.1.4" }, - "devDependencies": { - "@feathersjs/memory": "^5.0.30", - "@types/cookie-session": "^2.0.49", - "@types/express": "^4.17.21", - "@types/koa-session": "^6.4.5", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "@types/tough-cookie": "^4.0.5", - "axios": "^1.7.7", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "tough-cookie": "^4.1.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" + "engines": { + "node": ">=7.0.0" + } + }, + "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==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-json-file": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", + "dev": true, + "dependencies": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.15", + "make-dir": "^2.1.0", + "pify": "^4.0.1", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.4.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "engines": { + "node": ">=6" } }, - "packages/cli": { - "name": "@feathersjs/cli", - "version": "5.0.30", - "license": "MIT", + "node_modules/write-json-file/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, "dependencies": { - "@feathersjs/generators": "^5.0.30", - "chalk": "^5.3.0", - "commander": "^12.1.0" + "pify": "^4.0.1", + "semver": "^5.6.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/write-json-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/write-json-file/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { - "feathers": "bin/feathers.js" + "semver": "bin/semver" + } + }, + "node_modules/write-json-file/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/write-json-file/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/write-pkg": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", + "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", + "dev": true, + "dependencies": { + "sort-keys": "^2.0.0", + "type-fest": "^0.4.1", + "write-json-file": "^3.2.0" }, - "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/authentication-client": "^5.0.30", - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/authentication-oauth": "^5.0.30", - "@feathersjs/configuration": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/express": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/knex": "^5.0.30", - "@feathersjs/koa": "^5.0.30", - "@feathersjs/mongodb": "^5.0.30", - "@feathersjs/rest-client": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@feathersjs/socketio": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@feathersjs/typebox": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "@types/prettier": "^2.7.3", - "axios": "^1.7.7", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "type-fest": "^4.26.0", - "typescript": "^5.5.4" + "engines": { + "node": ">=8" + } + }, + "node_modules/write-pkg/node_modules/type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" }, - "engines": { - "node": ">= 14" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "packages/cli/node_modules/type-fest": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", - "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true, "engines": { - "node": ">=16" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/client": { - "name": "@feathersjs/client", - "version": "5.0.30", - "license": "MIT", + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", + "integrity": "sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "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": ">=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": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "dependencies": { - "@feathersjs/authentication-client": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/rest-client": "^5.0.30", - "@feathersjs/socketio-client": "^5.0.30" - }, - "devDependencies": { - "@babel/core": "^7.25.2", - "@babel/preset-env": "^7.25.4", - "@feathersjs/express": "^5.0.30", - "@feathersjs/memory": "^5.0.30", - "@feathersjs/socketio": "^5.0.30", - "@feathersjs/tests": "^5.0.30", - "babel-loader": "^9.1.3", - "mocha": "^10.7.3", - "node-fetch": "^2.6.1", - "shx": "^0.3.4", - "socket.io-client": "^4.7.5", - "superagent": "^10.1.0", - "ts-loader": "^9.5.1", - "typescript": "^5.5.4", - "webpack": "^5.94.0", - "webpack-cli": "^5.1.4", - "webpack-merge": "^6.0.1" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": ">=12" } }, - "packages/commons": { - "name": "@feathersjs/commons", - "version": "5.0.30", - "license": "MIT", - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, + "node_modules/yargs-parser": { + "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, "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": ">=12" } }, - "packages/configuration": { - "name": "@feathersjs/configuration", - "version": "5.0.30", - "license": "MIT", + "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": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@types/config": "^3.3.4", - "config": "^3.3.12" - }, - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">= 12" + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/create-feathers": { - "version": "5.0.30", - "license": "MIT", - "dependencies": { - "@feathersjs/cli": "^5.0.30" - }, - "bin": { - "create-feathers": "bin/create-feathers.js" - }, + "node_modules/yargs-unparser/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": ">= 18" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/errors": { - "name": "@feathersjs/errors", - "version": "5.0.30", - "license": "MIT", - "devDependencies": { - "@feathersjs/feathers": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, + "node_modules/yargs-unparser/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": ">= 12" + "node": ">=8" } }, - "packages/express": { - "name": "@feathersjs/express", - "version": "5.0.30", - "license": "MIT", - "dependencies": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@types/compression": "^1.7.5", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.19.5", - "compression": "^1.7.4", - "cors": "^2.8.5", - "express": "^4.19.2" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/tests": "^5.0.30", - "@types/lodash": "^4.17.7", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "axios": "^1.7.7", - "lodash": "^4.17.21", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, + "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": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": ">=6" } }, - "packages/feathers": { - "name": "@feathersjs/feathers", - "version": "5.0.30", - "license": "MIT", - "dependencies": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/hooks": "^0.9.0", - "events": "^3.3.0" - }, - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" + "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, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", "engines": { - "node": ">= 12" + "node": ">=18" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "funding": { "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/sponsors/wooorm" } }, - "packages/generators": { - "name": "@feathersjs/generators", + "packages/cli": { + "name": "@feathersjs/cli", "version": "5.0.30", "license": "MIT", "dependencies": { - "@featherscloud/pinion": "^0.5.4", + "@feathersjs/generators": "^5.0.30", "chalk": "^5.3.0", - "lodash": "^4.17.21", - "prettier": "^3.3.3", - "typescript": "^5.5.4" + "commander": "^12.1.0" + }, + "bin": { + "feathers": "bin/feathers.js" }, "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/authentication-client": "^5.0.30", - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/authentication-oauth": "^5.0.30", - "@feathersjs/configuration": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/express": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/knex": "^5.0.30", - "@feathersjs/koa": "^5.0.30", - "@feathersjs/mongodb": "^5.0.30", - "@feathersjs/rest-client": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@feathersjs/socketio": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@feathersjs/typebox": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "@types/prettier": "^2.7.3", - "axios": "^1.7.7", - "knex": "^3.1.0", "mocha": "^10.7.3", - "mongodb": "^6.8.0", - "mssql": "^11.0.1", - "mysql": "^2.18.1", - "pg": "^8.12.0", "shx": "^0.3.4", - "sqlite3": "^5.1.7", - "tsx": "^4.19.0", + "ts-node": "^10.9.2", "type-fest": "^4.26.0", "typescript": "^5.5.4" }, "engines": { - "node": ">= 16" + "node": ">= 14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/daffl" } }, - "packages/generators/node_modules/type-fest": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", - "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", + "packages/cli/node_modules/type-fest": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "dev": true, "engines": { "node": ">=16" @@ -24722,90 +22098,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/knex": { - "name": "@feathersjs/knex", + "packages/client": { + "name": "@feathersjs/client", "version": "5.0.30", "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/commons": "^5.0.30", + "@feathersjs/authentication-client": "^5.0.30", "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30" + "@feathersjs/feathers": "^5.0.30", + "@feathersjs/rest-client": "^5.0.30", + "@feathersjs/socketio-client": "^5.0.30" }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "knex": "^3.1.0", + "@babel/core": "^7.25.2", + "@babel/preset-env": "^7.25.4", + "@feathersjs/express": "^5.0.30", + "@feathersjs/memory": "^5.0.30", + "@feathersjs/socketio": "^5.0.30", + "@feathersjs/tests": "^5.0.30", + "babel-loader": "^9.1.3", "mocha": "^10.7.3", - "pg": "^8.12.0", + "node-fetch": "^2.6.1", "shx": "^0.3.4", - "sqlite3": "^5.1.7", - "typescript": "^5.5.4" + "socket.io-client": "^4.7.5", + "superagent": "^10.1.0", + "ts-loader": "^9.5.1", + "typescript": "^5.5.4", + "webpack": "^5.94.0", + "webpack-cli": "^5.1.4", + "webpack-merge": "^6.0.1" }, "engines": { - "node": ">= 14" + "node": ">= 12" }, "funding": { "type": "github", "url": "https://github.com/sponsors/daffl" - }, - "peerDependencies": { - "knex": ">=3.1.0" - } - }, - "packages/koa": { - "name": "@feathersjs/koa", - "version": "5.0.30", - "license": "MIT", - "dependencies": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@koa/cors": "^5.0.0", - "@types/koa": "^2.15.0", - "@types/koa__cors": "^5.0.0", - "@types/koa-qs": "^2.0.3", - "@types/koa-static": "^4.0.4", - "koa": "^2.15.3", - "koa-body": "^6.0.1", - "koa-compose": "^4.1.0", - "koa-qs": "^3.0.0", - "koa-static": "^5.0.0" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/memory": "^5.0.30", - "@feathersjs/tests": "^5.0.30", - "@types/koa-compose": "^3.2.8", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "axios": "^1.7.7", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "engines": { - "node": ">= 14" } }, - "packages/memory": { - "name": "@feathersjs/memory", + "packages/commons": { + "name": "@feathersjs/commons", "version": "5.0.30", "license": "MIT", - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "sift": "^17.1.3" - }, "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", "@types/mocha": "^10.0.7", "@types/node": "^22.5.1", "mocha": "^10.7.3", @@ -24815,150 +22150,61 @@ }, "engines": { "node": ">= 12" - } - }, - "packages/mongodb": { - "name": "@feathersjs/mongodb", - "version": "5.0.30", - "license": "MIT", - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "mongodb-memory-server": "^10.0.0", - "shx": "^0.3.4", - "typescript": "^5.5.4" - }, - "engines": { - "node": ">= 14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/daffl" - }, - "peerDependencies": { - "mongodb": "^6.8.0" } }, - "packages/rest-client": { - "name": "@feathersjs/rest-client", + "packages/create-feathers": { "version": "5.0.30", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@types/superagent": "^8.1.9", - "qs": "^6.13.0" + "@feathersjs/cli": "^5.0.30" }, - "devDependencies": { - "@feathersjs/express": "^5.0.30", - "@feathersjs/memory": "^5.0.30", - "@feathersjs/tests": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "@types/node-fetch": "^2.6.11", - "@types/qs": "^6.9.15", - "axios": "^1.7.7", - "mocha": "^10.7.3", - "node-fetch": "^2.6.1", - "rxjs": "^7.8.1", - "shx": "^0.3.4", - "superagent": "^10.1.0", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" + "bin": { + "create-feathers": "bin/create-feathers.js" }, "engines": { - "node": ">= 12" + "node": ">= 18" }, "funding": { "type": "github", "url": "https://github.com/sponsors/daffl" } }, - "packages/schema": { - "name": "@feathersjs/schema", + "packages/errors": { + "name": "@feathersjs/errors", "version": "5.0.30", "license": "MIT", - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/hooks": "^0.9.0", - "@types/json-schema": "^7.0.15", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "json-schema-to-ts": "^3.1.1" - }, "devDependencies": { - "@feathersjs/memory": "^5.0.30", + "@feathersjs/feathers": "^5.0.30", "@types/mocha": "^10.0.7", "@types/node": "^22.5.1", - "ajv-formats": "^3.0.1", "mocha": "^10.7.3", "shx": "^0.3.4", + "ts-node": "^10.9.2", "typescript": "^5.5.4" }, "engines": { "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "peerDependencies": { - "typescript": ">=5.5" - } - }, - "packages/schema/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" } }, - "packages/schema/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==" - }, - "packages/socketio": { - "name": "@feathersjs/socketio", + "packages/feathers": { + "name": "@feathersjs/feathers", "version": "5.0.30", "license": "MIT", "dependencies": { "@feathersjs/commons": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "socket.io": "^4.7.5" + "@feathersjs/hooks": "^0.9.0", + "events": "^3.3.0" }, "devDependencies": { - "@feathersjs/express": "^5.0.30", - "@feathersjs/memory": "^5.0.30", - "@feathersjs/tests": "^5.0.30", "@types/mocha": "^10.0.7", "@types/node": "^22.5.1", - "lodash": "^4.17.21", "mocha": "^10.7.3", "shx": "^0.3.4", - "socket.io-client": "^4.7.5", + "ts-node": "^10.9.2", "typescript": "^5.5.4" }, "engines": { @@ -24969,24 +22215,31 @@ "url": "https://github.com/sponsors/daffl" } }, - "packages/socketio-client": { - "name": "@feathersjs/socketio-client", + "packages/rest-client": { + "name": "@feathersjs/rest-client", "version": "5.0.30", "license": "MIT", "dependencies": { + "@feathersjs/commons": "^5.0.30", + "@feathersjs/errors": "^5.0.30", "@feathersjs/feathers": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30" + "@types/superagent": "^8.1.9", + "qs": "^6.13.0" }, "devDependencies": { - "@feathersjs/commons": "^5.0.30", + "@feathersjs/express": "^5.0.30", "@feathersjs/memory": "^5.0.30", - "@feathersjs/socketio": "^5.0.30", "@feathersjs/tests": "^5.0.30", "@types/mocha": "^10.0.7", "@types/node": "^22.5.1", + "@types/node-fetch": "^2.6.11", + "@types/qs": "^6.9.15", + "axios": "^1.7.7", "mocha": "^10.7.3", + "node-fetch": "^2.6.1", + "rxjs": "^7.8.1", "shx": "^0.3.4", - "socket.io-client": "^4.7.5", + "superagent": "^10.1.0", "ts-node": "^10.9.2", "typescript": "^5.5.4" }, @@ -25052,34 +22305,6 @@ "type": "github", "url": "https://github.com/sponsors/daffl" } - }, - "packages/typebox": { - "name": "@feathersjs/typebox", - "version": "5.0.30", - "license": "MIT", - "dependencies": { - "@feathersjs/schema": "^5.0.30", - "@sinclair/typebox": "^0.25.0" - }, - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "typescript": "^5.5.4" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - } - }, - "packages/typebox/node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" } } } diff --git a/package.json b/package.json index 49fbcac648..f1915ada82 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "lint": "npm run prettier && npm run eslint", "compile": "lerna run compile", "build:docs": "npm run build --workspace docs", - "update-dependencies": "npm exec --workspaces --include-workspace-root -- ncu -u --dep prod,dev,optional,peer -x node-fetch,\"@sinclair/typebox\"", + "update-dependencies": "npm exec --workspaces --include-workspace-root -- ncu -u --dep prod,dev,optional,peer -x node-fetch", "clean": "find . -name node_modules -exec rm -rf '{}' + && find . -name package-lock.json -exec rm -rf '{}' +", "test:deno": "deno test --config deno/tsconfig.json deno/test.ts", "test": "npm run lint && npm run compile && c8 lerna run test --ignore @feathersjs/tests", diff --git a/packages/adapter-commons/CHANGELOG.md b/packages/adapter-commons/CHANGELOG.md deleted file mode 100644 index f67857b5d8..0000000000 --- a/packages/adapter-commons/CHANGELOG.md +++ /dev/null @@ -1,624 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **adapter-commons:** Faster sorter ([#3495](https://github.com/feathersjs/feathers/issues/3495)) ([22243e4](https://github.com/feathersjs/feathers/commit/22243e4d92edc1a7343b4cf42be6dfb22e8b86d5)) - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **core:** Add PaginationParams to general find method ([#3095](https://github.com/feathersjs/feathers/issues/3095)) ([8ebdcf5](https://github.com/feathersjs/feathers/commit/8ebdcf5107fae5fa23920390052b871033de3a0a)) -- **core:** Use Symbol.for to instantiate shared symbols ([#3087](https://github.com/feathersjs/feathers/issues/3087)) ([7f3fc21](https://github.com/feathersjs/feathers/commit/7f3fc2167576f228f8183568eb52b077160e8d65)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Features - -- **mongodb:** Add Object ID keyword converter and update MongoDB CLI & docs ([#3041](https://github.com/feathersjs/feathers/issues/3041)) ([ca0994e](https://github.com/feathersjs/feathers/commit/ca0994eaecb5a31f310bc980d106834e11f24f41)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **databases:** Ensure that query sanitization is not necessary when using query schemas ([#3022](https://github.com/feathersjs/feathers/issues/3022)) ([dbf514e](https://github.com/feathersjs/feathers/commit/dbf514e85d1508b95c007462a39b3cadd4ff391d)) - -### Features - -- **database:** Add and to the query syntax ([#3021](https://github.com/feathersjs/feathers/issues/3021)) ([00cb0d9](https://github.com/feathersjs/feathers/commit/00cb0d9c302ae951ae007d3d6ceba33e254edd9c)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **adapter-commons:** multiple type definition issues ([#2876](https://github.com/feathersjs/feathers/issues/2876)) ([4ff1ed0](https://github.com/feathersjs/feathers/commit/4ff1ed084eb2b2cb687de27a28c96a0dad4530b7)) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **knex:** Add KnexJS SQL database adapter to core ([#2671](https://github.com/feathersjs/feathers/issues/2671)) ([9380fff](https://github.com/feathersjs/feathers/commit/9380fff58596e8bb90b8bb098d2795b7eadfec20)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Bug Fixes - -- **adapter-commons:** Clarify adapter query filtering ([#2607](https://github.com/feathersjs/feathers/issues/2607)) ([2dac771](https://github.com/feathersjs/feathers/commit/2dac771b0a3298d6dd25994d05186701b0617718)) - -### Features - -- **mongodb:** Add feathers-mongodb adapter as @feathersjs/mongodb ([#2610](https://github.com/feathersjs/feathers/issues/2610)) ([6d43734](https://github.com/feathersjs/feathers/commit/6d43734a53db02c435cafc52a22dca414e5d0940)) -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -### BREAKING CHANGES - -- **adapter-commons:** Changes the common adapter base class to use `sanitizeQuery` and `sanitizeData` - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **core:** Add app.teardown functionality ([#2570](https://github.com/feathersjs/feathers/issues/2570)) ([fcdf524](https://github.com/feathersjs/feathers/commit/fcdf524ae1995bb59265d39f12e98b7794bed023)) -- **core:** Finalize app.teardown() functionality ([#2584](https://github.com/feathersjs/feathers/issues/2584)) ([1a166f3](https://github.com/feathersjs/feathers/commit/1a166f3ded811ecacf0ae8cb67880bc9fa2eeafa)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **adapter-commons:** clean up in sort.ts and select function ([#2492](https://github.com/feathersjs/feathers/issues/2492)) ([c3ec8a4](https://github.com/feathersjs/feathers/commit/c3ec8a418bdc85506e3c5100015720a45454d8d3)) -- **adapter-commons:** Fix sorting for embedded objects ([#2488](https://github.com/feathersjs/feathers/issues/2488)) ([9c22f70](https://github.com/feathersjs/feathers/commit/9c22f70a838cb6341775d91705a7527c8fc5590e)) -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- Update database adapter common repository urls ([#2380](https://github.com/feathersjs/feathers/issues/2380)) ([3f4db68](https://github.com/feathersjs/feathers/commit/3f4db68d6700c7d9023ecd17d0d39893f75a19fd)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) -- **typescript:** Allow to pass generic service options to adapter services ([#2392](https://github.com/feathersjs/feathers/issues/2392)) ([f9431f2](https://github.com/feathersjs/feathers/commit/f9431f242354f804cafb835519f98dd405ac4f0b)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Bug Fixes - -- **typescript:** Move Paginated type back for better compatibility ([#2350](https://github.com/feathersjs/feathers/issues/2350)) ([2917d05](https://github.com/feathersjs/feathers/commit/2917d05fffb4716d3c4cdaa5ac6a1aee0972e8a6)) - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **dependencies:** Fix transport-commons dependency and update other dependencies ([#2284](https://github.com/feathersjs/feathers/issues/2284)) ([05b03b2](https://github.com/feathersjs/feathers/commit/05b03b27b40604d956047e3021d8053c3a137616)) - -### Features - -- **adapter-commons:** Added mongoDB like search in embedded objects ([687e3c7](https://github.com/feathersjs/feathers/commit/687e3c7c36904221b2707d0220c0893e3cb1faa9)) - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- **adapter-commons:** Always respect paginate.max ([#2267](https://github.com/feathersjs/feathers/issues/2267)) ([f588257](https://github.com/feathersjs/feathers/commit/f5882575536624ed3a32bb6e3ff1919fa17e366d)) -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) -- **adapter-commons:** Return missing overloads ([#2203](https://github.com/feathersjs/feathers/issues/2203)) ([bbe7e2a](https://github.com/feathersjs/feathers/commit/bbe7e2a131633e9a6e7aac7f7fa02a312bca63c7)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -### Features - -- **memory:** Move feathers-memory into @feathersjs/memory ([#2153](https://github.com/feathersjs/feathers/issues/2153)) ([dd61fe3](https://github.com/feathersjs/feathers/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-10-21) - -### Bug Fixes - -- **typescript:** Remove remaining overloads ([a29fabc](https://github.com/feathersjs/databases/commit/a29fabc9cf6050793a5e93948507ce3e19a235dd)) - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-10-21) - -### Bug Fixes - -- Revert "fix(adapter-commons): Add missing overloads ([#4](https://github.com/feathersjs/databases/issues/4))" ([dfaa850](https://github.com/feathersjs/databases/commit/dfaa8500644021f78d6234a79358f1b26ce2c8d3)) - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-10-21) - -### Bug Fixes - -- **typescript:** Revert "fix: add overloads for `find` ([#9](https://github.com/feathersjs/databases/issues/9))" ([85c20b2](https://github.com/feathersjs/databases/commit/85c20b267e67192169ded97dd5056f116a5ad7b5)) - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-09-27) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## 4.5.3 (2020-09-24) - -### Bug Fixes - -- add overloads for `find` ([#9](https://github.com/feathersjs/databases/issues/9)) ([87c7c29](https://github.com/feathersjs/databases/commit/87c7c29ef017b3cae135e7b7597a7e63fb7d0961)) -- **adapter-commons:** Add missing overloads ([#4](https://github.com/feathersjs/databases/issues/4)) ([b6c80ff](https://github.com/feathersjs/databases/commit/b6c80ff39a32c1b023178f06cffbcaa6d08c554d)) -- Improve Service typings for DB Common API ([#1](https://github.com/feathersjs/databases/issues/1)) ([fd3b949](https://github.com/feathersjs/databases/commit/fd3b9496b0a46f8fd9779c2603faeeb92bd1afc1)) - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -### Bug Fixes - -- **adapter-commons:** Filter arrays in queries ([#1724](https://github.com/feathersjs/feathers/issues/1724)) ([872b669](https://github.com/feathersjs/feathers/commit/872b66906a806ab92ca41b5f6f504ff0af1ce79e)) - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.3.8](https://github.com/feathersjs/feathers/compare/v4.3.7...v4.3.8) (2019-10-14) - -### Bug Fixes - -- Remove adapter commons type alternatives ([#1620](https://github.com/feathersjs/feathers/issues/1620)) ([c9f3086](https://github.com/feathersjs/feathers/commit/c9f3086344420b57dbce7c4169cf550c97509f0d)) - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -### Bug Fixes - -- improve Service and AdapterService types ([#1567](https://github.com/feathersjs/feathers/issues/1567)) ([baad6a2](https://github.com/feathersjs/feathers/commit/baad6a26f0f543b712ccb40359b3933ad3a21392)) - -## [4.3.6](https://github.com/feathersjs/feathers/compare/v4.3.5...v4.3.6) (2019-10-07) - -### Bug Fixes - -- Check query for NaN ([#1607](https://github.com/feathersjs/feathers/issues/1607)) ([f1a781f](https://github.com/feathersjs/feathers/commit/f1a781f)) - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- @feathersjs/adapter-commons: `update` id is non-nullable ([#1468](https://github.com/feathersjs/feathers/issues/1468)) ([43ec802](https://github.com/feathersjs/feathers/commit/43ec802)) - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -### Bug Fixes - -- @feathersjs/adapter-commons: remove data from `remove` arguments ([#1426](https://github.com/feathersjs/feathers/issues/1426)) ([fd54ae9](https://github.com/feathersjs/feathers/commit/fd54ae9)) - -### Features - -- adapter-commons: add `allowsMulti(method)` to AdapterService ([#1431](https://github.com/feathersjs/feathers/issues/1431)) ([e688851](https://github.com/feathersjs/feathers/commit/e688851)) -- Add hook-less methods and service option types to adapter-commons ([#1433](https://github.com/feathersjs/feathers/issues/1433)) ([857f54a](https://github.com/feathersjs/feathers/commit/857f54a)) - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Bug Fixes - -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **adapter-commons:** Keep Symbols when filtering a query ([#1141](https://github.com/feathersjs/feathers/issues/1141)) ([c9f55d8](https://github.com/feathersjs/feathers/commit/c9f55d8)) -- **chore:** Add .npmignore to adapter-commons ([8e129d8](https://github.com/feathersjs/feathers/commit/8e129d8)) -- Add whitelist and filter support to common adapter service ([#1132](https://github.com/feathersjs/feathers/issues/1132)) ([df1daaa](https://github.com/feathersjs/feathers/commit/df1daaa)) -- Fix AdapterService multi option when set to true ([#1134](https://github.com/feathersjs/feathers/issues/1134)) ([40402fc](https://github.com/feathersjs/feathers/commit/40402fc)) -- Throw error in `filterQuery` when query parameter is unknown ([#1131](https://github.com/feathersjs/feathers/issues/1131)) ([cd1a183](https://github.com/feathersjs/feathers/commit/cd1a183)) -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) -- Update adapter common tests to check for falsy ([#1140](https://github.com/feathersjs/feathers/issues/1140)) ([2856722](https://github.com/feathersjs/feathers/commit/2856722)) - -### chore - -- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) -- Common database adapter utilities and test suite ([#1130](https://github.com/feathersjs/feathers/issues/1130)) ([17b3dc8](https://github.com/feathersjs/feathers/commit/17b3dc8)) - -### BREAKING CHANGES - -- **package:** Removes adapter tests from @feathersjs/adapter-commons -- Move database adapter utilities from @feathersjs/commons into its own module - -# [2.0.0](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.7...@feathersjs/adapter-commons@2.0.0) (2019-01-10) - -### chore - -- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - -### BREAKING CHANGES - -- **package:** Removes adapter tests from @feathersjs/adapter-commons - -## [1.0.7](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.6...@feathersjs/adapter-commons@1.0.7) (2019-01-02) - -### Bug Fixes - -- **chore:** Add .npmignore to adapter-commons ([8e129d8](https://github.com/feathersjs/feathers/commit/8e129d8)) - -## [1.0.6](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.5...@feathersjs/adapter-commons@1.0.6) (2018-12-21) - -### Bug Fixes - -- **adapter-commons:** Keep Symbols when filtering a query ([#1141](https://github.com/feathersjs/feathers/issues/1141)) ([c9f55d8](https://github.com/feathersjs/feathers/commit/c9f55d8)) - -## [1.0.5](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.4...@feathersjs/adapter-commons@1.0.5) (2018-12-20) - -### Bug Fixes - -- Update adapter common tests to check for falsy ([#1140](https://github.com/feathersjs/feathers/issues/1140)) ([2856722](https://github.com/feathersjs/feathers/commit/2856722)) - -## [1.0.4](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.3...@feathersjs/adapter-commons@1.0.4) (2018-12-17) - -### Bug Fixes - -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) - - - -## [1.0.3](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.2...@feathersjs/adapter-commons@1.0.3) (2018-12-17) - -### Bug Fixes - -- Fix AdapterService multi option when set to true ([#1134](https://github.com/feathersjs/feathers/issues/1134)) ([40402fc](https://github.com/feathersjs/feathers/commit/40402fc)) - - - -## [1.0.2](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.1...@feathersjs/adapter-commons@1.0.2) (2018-12-17) - -### Bug Fixes - -- Add whitelist and filter support to common adapter service ([#1132](https://github.com/feathersjs/feathers/issues/1132)) ([df1daaa](https://github.com/feathersjs/feathers/commit/df1daaa)) - - - -## [1.0.1](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.0...@feathersjs/adapter-commons@1.0.1) (2018-12-17) - -### Bug Fixes - -- Throw error in `filterQuery` when query parameter is unknown ([#1131](https://github.com/feathersjs/feathers/issues/1131)) ([cd1a183](https://github.com/feathersjs/feathers/commit/cd1a183)) - - - -# 1.0.0 (2018-12-16) - -### Features - -- Common database adapter utilities and test suite ([#1130](https://github.com/feathersjs/feathers/issues/1130)) ([17b3dc8](https://github.com/feathersjs/feathers/commit/17b3dc8)) - -### BREAKING CHANGES - -- Move database adapter utilities from @feathersjs/commons into its own module diff --git a/packages/adapter-commons/LICENSE b/packages/adapter-commons/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/adapter-commons/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/adapter-commons/README.md b/packages/adapter-commons/README.md deleted file mode 100644 index 4e9d263c6f..0000000000 --- a/packages/adapter-commons/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feathers Adapter Commons - -[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-commons) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Shared utility functions for Feathers adatabase adapters - -## Installation - -``` -npm install @feathersjs/adapter-commons --save -``` - -## Documentation - -Refer to the [Feathers database adapter documentation](https://feathersjs.com/api/databases/common.html) for more details. - -## Authors - -[Feathers contributors](https://github.com/feathersjs/adapter-commons/graphs/contributors) - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-commons/package.json b/packages/adapter-commons/package.json deleted file mode 100644 index 8fda1dda8c..0000000000 --- a/packages/adapter-commons/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "@feathersjs/adapter-commons", - "version": "5.0.30", - "description": "Shared database adapter utility functions", - "homepage": "https://feathersjs.com", - "keywords": [ - "feathers" - ], - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/adapter-commons" - }, - "author": { - "name": "Feathers contributor", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "main": "lib/", - "types": "lib/", - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**" - ], - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30" - }, - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/mongodb": "^4.0.6", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "mongodb": "^6.8.0", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/adapter-commons/src/declarations.ts b/packages/adapter-commons/src/declarations.ts deleted file mode 100644 index ce35da3dca..0000000000 --- a/packages/adapter-commons/src/declarations.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { Query, Params, Paginated, Id, PaginationParams, PaginationOptions } from '@feathersjs/feathers' - -export type FilterQueryOptions = { - filters?: FilterSettings - operators?: string[] - paginate?: PaginationParams -} - -export type QueryFilter = (value: any, options: FilterQueryOptions) => any - -export type FilterSettings = { - [key: string]: QueryFilter | true -} - -// re-export from @feathersjs/feathers to prevent breaking changes -export { PaginationOptions, PaginationParams } - -export interface AdapterServiceOptions { - /** - * Whether to allow multiple updates for everything (`true`) or specific methods (e.g. `['create', 'remove']`) - */ - multi?: boolean | string[] - /** - * The name of the id property - */ - id?: string - /** - * Pagination settings for this service - */ - paginate?: PaginationParams - /** - * A list of additional property query operators to allow in a query - * - * @deprecated No longer needed when a query schema is used - */ - operators?: string[] - /** - * An object of additional top level query filters, e.g. `{ $populate: true }` - * Can also be a converter function like `{ $ignoreCase: (value) => value === 'true' ? true : false }` - * - * @deprecated No longer needed when a query schema is used - */ - filters?: FilterSettings - /** - * @deprecated Use service `events` option when registering the service with `app.use`. - */ - events?: string[] - /** - * @deprecated No longer needed when a query schema is used - */ - whitelist?: string[] -} - -export interface AdapterQuery extends Query { - $limit?: number - $skip?: number - $select?: string[] - $sort?: { [key: string]: 1 | -1 } -} -/** - * Additional `params` that can be passed to an adapter service method call. - */ -export interface AdapterParams< - Q = AdapterQuery, - A extends Partial = Partial -> extends Params { - adapter?: A - paginate?: PaginationParams -} - -/** - * Hook-less (internal) service methods. Directly call database adapter service methods - * without running any service-level hooks or sanitization. This can be useful if you need the raw data - * from the service and don't want to trigger any of its hooks. - * - * Important: These methods are only available internally on the server, not on the client - * side and only for the Feathers database adapters. - * - * These methods do not trigger events. - * - * @see {@link https://docs.feathersjs.com/guides/migrating.html#hook-less-service-methods} - */ -export interface InternalServiceMethods< - Result = any, - Data = Result, - PatchData = Partial, - Params extends AdapterParams = AdapterParams, - IdType = Id -> { - /** - * Retrieve all resources from this service. - * Does not sanitize the query and should only be used on the server. - * - * @param _params - Service call parameters {@link Params} - */ - _find(_params?: Params & { paginate?: PaginationOptions }): Promise> - _find(_params?: Params & { paginate: false }): Promise - _find(params?: Params): Promise> - - /** - * Retrieve a single resource matching the given ID, skipping any service-level hooks. - * Does not sanitize the query and should only be used on the server. - * - * @param id - ID of the resource to locate - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#get-id-params|Feathers API Documentation: .get(id, params)} - */ - _get(id: IdType, params?: Params): Promise - - /** - * Create a new resource for this service, skipping any service-level hooks. - * Does not sanitize data or checks if multiple updates are allowed and should only be used on the server. - * - * @param data - Data to insert into this service. - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} - */ - _create(data: Data, params?: Params): Promise - _create(data: Data[], params?: Params): Promise - _create(data: Data | Data[], params?: Params): Promise - - /** - * Completely replace the resource identified by id, skipping any service-level hooks. - * Does not sanitize data or query and should only be used on the server. - * - * @param id - ID of the resource to be updated - * @param data - Data to be put in place of the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} - */ - _update(id: IdType, data: Data, params?: Params): Promise - - /** - * Merge any resources matching the given ID with the given data, skipping any service-level hooks. - * Does not sanitize the data or query and should only be used on the server. - * - * @param id - ID of the resource to be patched - * @param data - Data to merge with the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} - */ - _patch(id: null, data: PatchData, params?: Params): Promise - _patch(id: IdType, data: PatchData, params?: Params): Promise - _patch(id: IdType | null, data: PatchData, params?: Params): Promise - - /** - * Remove resources matching the given ID from the this service, skipping any service-level hooks. - * Does not sanitize query and should only be used on the server. - * - * @param id - ID of the resource to be removed - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} - */ - _remove(id: null, params?: Params): Promise - _remove(id: IdType, params?: Params): Promise - _remove(id: IdType | null, params?: Params): Promise -} diff --git a/packages/adapter-commons/src/index.ts b/packages/adapter-commons/src/index.ts deleted file mode 100644 index 8007e44e00..0000000000 --- a/packages/adapter-commons/src/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { _ } from '@feathersjs/commons' -import { Params } from '@feathersjs/feathers' - -export * from './declarations' -export * from './service' -export * from './query' -export * from './sort' - -// Return a function that filters a result object or array -// and picks only the fields passed as `params.query.$select` -// and additional `otherFields` -export function select(params: Params, ...otherFields: string[]) { - const queryFields: string[] | undefined = params?.query?.$select - - if (!queryFields) { - return (result: any) => result - } - - const resultFields = queryFields.concat(otherFields) - const convert = (result: any) => _.pick(result, ...resultFields) - - return (result: any) => { - if (Array.isArray(result)) { - return result.map(convert) - } - - return convert(result) - } -} diff --git a/packages/adapter-commons/src/query.ts b/packages/adapter-commons/src/query.ts deleted file mode 100644 index 1dc31ffdec..0000000000 --- a/packages/adapter-commons/src/query.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { _ } from '@feathersjs/commons' -import { BadRequest } from '@feathersjs/errors' -import { Query } from '@feathersjs/feathers' -import { FilterQueryOptions, FilterSettings, PaginationParams } from './declarations' - -const parse = (value: any) => (typeof value !== 'undefined' ? parseInt(value, 10) : value) - -const isPlainObject = (value: any) => _.isObject(value) && value.constructor === {}.constructor - -const validateQueryProperty = (query: any, operators: string[] = []): Query => { - if (!isPlainObject(query)) { - return query - } - - for (const key of Object.keys(query)) { - if (key.startsWith('$') && !operators.includes(key)) { - throw new BadRequest(`Invalid query parameter ${key}`, query) - } - - const value = query[key] - - if (isPlainObject(value)) { - query[key] = validateQueryProperty(value, operators) - } - } - - return { - ...query - } -} - -const getFilters = (query: Query, settings: FilterQueryOptions) => { - const filterNames = Object.keys(settings.filters) - - return filterNames.reduce( - (current, key) => { - const queryValue = query[key] - const filter = settings.filters[key] - - if (filter) { - const value = typeof filter === 'function' ? filter(queryValue, settings) : queryValue - - if (value !== undefined) { - current[key] = value - } - } - - return current - }, - {} as { [key: string]: any } - ) -} - -const getQuery = (query: Query, settings: FilterQueryOptions) => { - const keys = Object.keys(query).concat(Object.getOwnPropertySymbols(query) as any as string[]) - - return keys.reduce((result, key) => { - if (typeof key === 'string' && key.startsWith('$')) { - if (settings.filters[key] === undefined) { - throw new BadRequest(`Invalid filter value ${key}`) - } - } else { - result[key] = validateQueryProperty(query[key], settings.operators) - } - - return result - }, {} as Query) -} - -/** - * Returns the converted `$limit` value based on the `paginate` configuration. - * @param _limit The limit value - * @param paginate The pagination options - * @returns The converted $limit value - */ -export const getLimit = (_limit: any, paginate?: PaginationParams) => { - const limit = parse(_limit) - - if (paginate && (paginate.default || paginate.max)) { - const base = paginate.default || 0 - const lower = typeof limit === 'number' && !isNaN(limit) && limit >= 0 ? limit : base - const upper = typeof paginate.max === 'number' ? paginate.max : Number.MAX_VALUE - - return Math.min(lower, upper) - } - - return limit -} - -export const OPERATORS = ['$in', '$nin', '$lt', '$lte', '$gt', '$gte', '$ne', '$or'] - -export const FILTERS: FilterSettings = { - $skip: (value: any) => parse(value), - $sort: (sort: any): { [key: string]: number } => { - if (typeof sort !== 'object' || Array.isArray(sort)) { - return sort - } - - return Object.keys(sort).reduce( - (result, key) => { - result[key] = typeof sort[key] === 'object' ? sort[key] : parse(sort[key]) - - return result - }, - {} as { [key: string]: number } - ) - }, - $limit: (_limit: any, { paginate }: FilterQueryOptions) => getLimit(_limit, paginate), - $select: (select: any) => { - if (Array.isArray(select)) { - return select.map((current) => `${current}`) - } - - return select - }, - $or: (or: any, { operators }: FilterQueryOptions) => { - if (Array.isArray(or)) { - return or.map((current) => validateQueryProperty(current, operators)) - } - - return or - }, - $and: (and: any, { operators }: FilterQueryOptions) => { - if (Array.isArray(and)) { - return and.map((current) => validateQueryProperty(current, operators)) - } - - return and - } -} - -/** - * Converts Feathers special query parameters and pagination settings - * and returns them separately as `filters` and the rest of the query - * as `query`. `options` also gets passed the pagination settings and - * a list of additional `operators` to allow when querying properties. - * - * @param query The initial query - * @param options Options for filtering the query - * @returns An object with `query` which contains the query without `filters` - * and `filters` which contains the converted values for each filter. - */ -export function filterQuery(_query: Query, options: FilterQueryOptions = {}) { - const query = _query || {} - const settings = { - ...options, - filters: { - ...FILTERS, - ...options.filters - }, - operators: OPERATORS.concat(options.operators || []) - } - - return { - filters: getFilters(query, settings), - query: getQuery(query, settings) - } -} diff --git a/packages/adapter-commons/src/service.ts b/packages/adapter-commons/src/service.ts deleted file mode 100644 index cbaeb38718..0000000000 --- a/packages/adapter-commons/src/service.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { Id, Paginated, Query } from '@feathersjs/feathers' -import { - AdapterParams, - AdapterServiceOptions, - InternalServiceMethods, - PaginationOptions -} from './declarations' -import { filterQuery } from './query' - -export const VALIDATED = Symbol.for('@feathersjs/adapter/sanitized') - -const alwaysMulti: { [key: string]: boolean } = { - find: true, - get: false, - update: false -} - -/** - * An abstract base class that a database adapter can extend from to implement the - * `__find`, `__get`, `__update`, `__patch` and `__remove` methods. - */ -export abstract class AdapterBase< - Result = any, - Data = Result, - PatchData = Partial, - ServiceParams extends AdapterParams = AdapterParams, - Options extends AdapterServiceOptions = AdapterServiceOptions, - IdType = Id -> implements InternalServiceMethods -{ - options: Options - - constructor(options: Options) { - this.options = { - id: 'id', - events: [], - paginate: false, - multi: false, - filters: {}, - operators: [], - ...options - } - } - - get id() { - return this.options.id - } - - get events() { - return this.options.events - } - - /** - * Check if this adapter allows multiple updates for a method. - * @param method The method name to check. - * @param params The service call params. - * @returns Wether or not multiple updates are allowed. - */ - allowsMulti(method: string, params: ServiceParams = {} as ServiceParams) { - const always = alwaysMulti[method] - - if (typeof always !== 'undefined') { - return always - } - - const { multi } = this.getOptions(params) - - if (multi === true || !multi) { - return multi - } - - return multi.includes(method) - } - - /** - * Returns the combined options for a service call. Options will be merged - * with `this.options` and `params.adapter` for dynamic overrides. - * - * @param params The parameters for the service method call - * @returns The actual options for this call - */ - getOptions(params: ServiceParams): Options { - const paginate = params.paginate !== undefined ? params.paginate : this.options.paginate - - return { - ...this.options, - paginate, - ...params.adapter - } - } - - /** - * Returns a sanitized version of `params.query`, converting filter values - * (like $limit and $skip) into the expected type. Will throw an error if - * a `$` prefixed filter or operator value that is not allowed in `filters` - * or `operators` is encountered. - * - * @param params The service call parameter. - * @returns A new object containing the sanitized query. - */ - async sanitizeQuery(params: ServiceParams = {} as ServiceParams): Promise { - // We don't need legacy query sanitisation if the query has been validated by a schema already - if (params.query && (params.query as any)[VALIDATED]) { - return params.query || {} - } - - const options = this.getOptions(params) - const { query, filters } = filterQuery(params.query, options) - - return { - ...filters, - ...query - } - } - - /** - * Retrieve all resources from this service. - * Does not sanitize the query and should only be used on the server. - * - * @param _params - Service call parameters {@link ServiceParams} - */ - abstract _find(_params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - abstract _find(_params?: ServiceParams & { paginate: false }): Promise - abstract _find(params?: ServiceParams): Promise> - - /** - * Retrieve a single resource matching the given ID, skipping any service-level hooks. - * Does not sanitize the query and should only be used on the server. - * - * @param id - ID of the resource to locate - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#get-id-params|Feathers API Documentation: .get(id, params)} - */ - abstract _get(id: IdType, params?: ServiceParams): Promise - - /** - * Create a new resource for this service, skipping any service-level hooks. - * Does not check if multiple updates are allowed and should only be used on the server. - * - * @param data - Data to insert into this service. - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} - */ - abstract _create(data: Data, params?: ServiceParams): Promise - abstract _create(data: Data[], params?: ServiceParams): Promise - abstract _create(data: Data | Data[], params?: ServiceParams): Promise - - /** - * Completely replace the resource identified by id, skipping any service-level hooks. - * Does not sanitize the query and should only be used on the server. - * - * @param id - ID of the resource to be updated - * @param data - Data to be put in place of the current resource. - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} - */ - abstract _update(id: IdType, data: Data, params?: ServiceParams): Promise - - /** - * Merge any resources matching the given ID with the given data, skipping any service-level hooks. - * Does not sanitize the query and should only be used on the server. - * - * @param id - ID of the resource to be patched - * @param data - Data to merge with the current resource. - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} - */ - abstract _patch(id: null, data: PatchData, params?: ServiceParams): Promise - abstract _patch(id: IdType, data: PatchData, params?: ServiceParams): Promise - abstract _patch(id: IdType | null, data: PatchData, params?: ServiceParams): Promise - - /** - * Remove resources matching the given ID from the this service, skipping any service-level hooks. - * Does not sanitize query and should only be used on the server. - * - * @param id - ID of the resource to be removed - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} - */ - abstract _remove(id: null, params?: ServiceParams): Promise - abstract _remove(id: IdType, params?: ServiceParams): Promise - abstract _remove(id: IdType | null, params?: ServiceParams): Promise -} diff --git a/packages/adapter-commons/src/sort.ts b/packages/adapter-commons/src/sort.ts deleted file mode 100644 index d84cb69cc1..0000000000 --- a/packages/adapter-commons/src/sort.ts +++ /dev/null @@ -1,129 +0,0 @@ -// Sorting algorithm taken from NeDB (https://github.com/louischatriot/nedb) -// See https://github.com/louischatriot/nedb/blob/e3f0078499aa1005a59d0c2372e425ab789145c1/lib/model.js#L189 - -export function compareNSB(a: number | string | boolean, b: number | string | boolean): 0 | 1 | -1 { - if (a === b) { - return 0 - } - - return a < b ? -1 : 1 -} - -export function compareArrays(a: any[], b: any[]): 0 | 1 | -1 { - for (let i = 0, l = Math.min(a.length, b.length); i < l; i++) { - const comparison = compare(a[i], b[i]) - - if (comparison !== 0) { - return comparison - } - } - - // Common section was identical, longest one wins - return compareNSB(a.length, b.length) -} - -export function compare( - a: any, - b: any, - compareStrings: (a: any, b: any) => 0 | 1 | -1 = compareNSB -): 0 | 1 | -1 { - if (a === b) { - return 0 - } - - // null or undefined - if (a == null) { - return -1 - } - if (b == null) { - return 1 - } - - // detect typeof once - const typeofA = typeof a - const typeofB = typeof b - - // Numbers - if (typeofA === 'number') { - return typeofB === 'number' ? compareNSB(a, b) : -1 - } - if (typeofB === 'number') { - return 1 - } - - // Strings - if (typeofA === 'string') { - return typeofB === 'string' ? compareStrings(a, b) : -1 - } - if (typeofB === 'string') { - return 1 - } - - // Booleans - if (typeofA === 'boolean') { - return typeofB === 'boolean' ? compareNSB(a, b) : -1 - } - if (typeofB === 'boolean') { - return 1 - } - - // Dates - if (a instanceof Date) { - return b instanceof Date ? compareNSB(a.getTime(), b.getTime()) : -1 - } - if (b instanceof Date) { - return 1 - } - - // Arrays (first element is most significant and so on) - if (Array.isArray(a)) { - return Array.isArray(b) ? compareArrays(a, b) : -1 - } - if (Array.isArray(b)) { - return 1 - } - - // Objects - const aKeys = Object.keys(a).sort() - const bKeys = Object.keys(b).sort() - - for (let i = 0, l = Math.min(aKeys.length, bKeys.length); i < l; i++) { - const comparison = compare(a[aKeys[i]], b[bKeys[i]]) - - if (comparison !== 0) { - return comparison - } - } - - return compareNSB(aKeys.length, bKeys.length) -} - -// lodash-y get - probably want to use lodash get instead -const get = (value: any, path: string[]) => path.reduce((value, key) => value[key], value) - -// An in-memory sorting function according to the -// $sort special query parameter -export function sorter($sort: { [key: string]: -1 | 1 }) { - const compares = Object.keys($sort).map((key) => { - const direction = $sort[key] - - if (!key.includes('.')) { - return (a: any, b: any) => direction * compare(a[key], b[key]) - } else { - const path = key.split('.') - return (a: any, b: any) => direction * compare(get(a, path), get(b, path)) - } - }) - - return function (a: any, b: any) { - for (const compare of compares) { - const comparison = compare(a, b) - - if (comparison !== 0) { - return comparison - } - } - - return 0 - } -} diff --git a/packages/adapter-commons/test/commons.test.ts b/packages/adapter-commons/test/commons.test.ts deleted file mode 100644 index b0f5eb8d23..0000000000 --- a/packages/adapter-commons/test/commons.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -import assert from 'assert' -import { select } from '../src' - -describe('@feathersjs/adapter-commons', () => { - describe('select', () => { - it('select', () => { - const selector = select({ - query: { $select: ['name', 'age'] } - }) - - return Promise.resolve({ - name: 'David', - age: 3, - test: 'me' - }) - .then(selector) - .then((result) => - assert.deepStrictEqual(result, { - name: 'David', - age: 3 - }) - ) - }) - - it('select with arrays', () => { - const selector = select({ - query: { $select: ['name', 'age'] } - }) - - return Promise.resolve([ - { - name: 'David', - age: 3, - test: 'me' - }, - { - name: 'D', - age: 4, - test: 'you' - } - ]) - .then(selector) - .then((result) => - assert.deepStrictEqual(result, [ - { - name: 'David', - age: 3 - }, - { - name: 'D', - age: 4 - } - ]) - ) - }) - - it('select with no query', () => { - const selector = select({}) - const data = { - name: 'David' - } - - return Promise.resolve(data) - .then(selector) - .then((result) => assert.deepStrictEqual(result, data)) - }) - - it('select with other fields', () => { - const selector = select( - { - query: { $select: ['name'] } - }, - 'id' - ) - const data = { - id: 'me', - name: 'David', - age: 10 - } - - return Promise.resolve(data) - .then(selector) - .then((result) => - assert.deepStrictEqual(result, { - id: 'me', - name: 'David' - }) - ) - }) - }) -}) diff --git a/packages/adapter-commons/test/fixture.ts b/packages/adapter-commons/test/fixture.ts deleted file mode 100644 index 43bd667d06..0000000000 --- a/packages/adapter-commons/test/fixture.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { AdapterBase, AdapterParams, PaginationOptions } from '../src' -import { Id, NullableId, Paginated } from '@feathersjs/feathers' -import { BadRequest, MethodNotAllowed } from '@feathersjs/errors/lib' - -export type Data = { - id: Id -} - -export class MethodBase extends AdapterBase, AdapterParams> { - async _find(_params?: AdapterParams & { paginate?: PaginationOptions }): Promise> - async _find(_params?: AdapterParams & { paginate: false }): Promise - async _find(params?: AdapterParams): Promise> { - if (params && params.paginate === false) { - return [] - } - - return { - total: 0, - limit: 10, - skip: 0, - data: [] - } - } - - async _get(id: Id, _params?: AdapterParams): Promise { - return { id } - } - - async _create(data: Data, _params?: AdapterParams): Promise - async _create(data: Data[], _params?: AdapterParams): Promise - async _create(data: Data | Data[], _params?: AdapterParams): Promise - async _create(data: Data | Data[], _params?: AdapterParams): Promise { - if (Array.isArray(data)) { - return [ - { - id: 'something' - } - ] - } - - return { - id: 'something' - } - } - - async _update(id: Id, _data: Data, _params?: AdapterParams) { - return Promise.resolve({ id: id ?? _data.id }) - } - - async _patch(id: null, _data: Partial, _params?: AdapterParams): Promise - async _patch(id: Id, _data: Partial, _params?: AdapterParams): Promise - async _patch(id: NullableId, _data: Partial, _params?: AdapterParams): Promise - async _patch(id: NullableId, _data: Partial, _params?: AdapterParams): Promise { - if (id === null) { - return [] - } - - return { id } - } - - async _remove(id: null, _params?: AdapterParams): Promise - async _remove(id: Id, _params?: AdapterParams): Promise - async _remove(id: NullableId, _params?: AdapterParams): Promise - async _remove(id: NullableId, _params?: AdapterParams) { - if (id === null) { - return [] as Data[] - } - - return { id } - } -} - -export class MethodService extends MethodBase { - find(params?: AdapterParams): Promise> { - return this._find(params) - } - - get(id: Id, params?: AdapterParams): Promise { - return this._get(id, params) - } - - async create(data: Data[], _params?: AdapterParams): Promise - async create(data: Data, _params?: AdapterParams): Promise - async create(data: Data | Data[], params?: AdapterParams): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - return this._create(data, params) - } - - async update(id: Id, data: Data, params?: AdapterParams) { - if (id === null || Array.isArray(data)) { - throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?") - } - - return this._update(id, data, params) - } - - async patch(id: NullableId, data: Partial, params?: AdapterParams) { - if (id === null && !this.allowsMulti('patch', params)) { - throw new MethodNotAllowed('Can not patch multiple entries') - } - - return this._patch(id, data, params) - } - - async remove(id: NullableId, params?: AdapterParams) { - if (id === null && !this.allowsMulti('remove', params)) { - throw new MethodNotAllowed('Can not remove multiple entries') - } - - return this._remove(id, params) - } -} diff --git a/packages/adapter-commons/test/query.test.ts b/packages/adapter-commons/test/query.test.ts deleted file mode 100644 index 805704c97e..0000000000 --- a/packages/adapter-commons/test/query.test.ts +++ /dev/null @@ -1,313 +0,0 @@ -import assert from 'assert' -import { ObjectId } from 'mongodb' -import { filterQuery } from '../src' - -describe('@feathersjs/adapter-commons/filterQuery', () => { - describe('$sort', () => { - it('returns $sort when present in query', () => { - const originalQuery = { $sort: { name: 1 } } - const { filters, query } = filterQuery(originalQuery) - - assert.strictEqual(filters.$sort.name, 1) - assert.deepStrictEqual(query, {}) - assert.deepStrictEqual( - originalQuery, - { - $sort: { name: 1 } - }, - 'does not modify original query' - ) - }) - - it('returns $sort when present in query as an object', () => { - const { filters, query } = filterQuery({ - $sort: { name: { something: 10 } } - }) - - assert.strictEqual(filters.$sort.name.something, 10) - assert.deepStrictEqual(query, {}) - }) - - it('converts strings in $sort', () => { - const { filters, query } = filterQuery({ $sort: { test: '-1' } }) - - assert.strictEqual(filters.$sort.test, -1) - assert.deepStrictEqual(query, {}) - }) - - it('does not convert $sort arrays', () => { - const $sort = [ - ['test', '-1'], - ['a', '1'] - ] - const { filters, query } = filterQuery({ $sort }) - - assert.strictEqual(filters.$sort, $sort) - assert.deepStrictEqual(query, {}) - }) - - it('throws an error when special parameter is not known', () => { - try { - const query = { $foo: 1 } - filterQuery(query) - assert.ok(false, 'Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'BadRequest') - assert.strictEqual(error.message, 'Invalid filter value $foo') - } - }) - - it('returns undefined when not present in query', () => { - const query = { foo: 1 } - const { filters } = filterQuery(query) - - assert.strictEqual(filters.$sort, undefined) - }) - }) - - describe('$limit', () => { - let testQuery: any - - beforeEach(() => { - testQuery = { $limit: 1 } - }) - - it('returns $limit when present in query', () => { - const { filters, query } = filterQuery(testQuery) - - assert.strictEqual(filters.$limit, 1) - assert.deepStrictEqual(query, {}) - }) - - it('returns undefined when not present in query', () => { - const query = { foo: 1 } - const { filters } = filterQuery(query) - - assert.strictEqual(filters.$limit, undefined) - }) - - it('removes $limit from query when present', () => { - assert.deepStrictEqual(filterQuery(testQuery).query, {}) - }) - - it('parses $limit strings into integers (#4)', () => { - const { filters } = filterQuery({ $limit: '2' }) - - assert.strictEqual(filters.$limit, 2) - }) - - it('allows $limit 0', () => { - const { filters } = filterQuery({ $limit: 0 }, { paginate: { default: 10 } }) - - assert.strictEqual(filters.$limit, 0) - }) - - describe('pagination', () => { - it('limits with default pagination', () => { - const { filters } = filterQuery({}, { paginate: { default: 10 } }) - const { filters: filtersNeg } = filterQuery({ $limit: -20 }, { paginate: { default: 5, max: 10 } }) - - assert.strictEqual(filters.$limit, 10) - assert.strictEqual(filtersNeg.$limit, 5) - }) - - it('limits with max pagination', () => { - const { filters } = filterQuery({ $limit: 20 }, { paginate: { default: 5, max: 10 } }) - - assert.strictEqual(filters.$limit, 10) - }) - - it('limits with default pagination when not a number', () => { - const { filters } = filterQuery({ $limit: 'something' }, { paginate: { default: 5, max: 10 } }) - - assert.strictEqual(filters.$limit, 5) - }) - - it('limits to 0 when no paginate.default and not a number', () => { - const { filters } = filterQuery({ $limit: 'something' }, { paginate: { max: 10 } }) - - assert.strictEqual(filters.$limit, 0) - }) - - it('still uses paginate.max when there is no paginate.default (#2104)', () => { - const { filters } = filterQuery({ $limit: 100 }, { paginate: { max: 10 } }) - - assert.strictEqual(filters.$limit, 10) - }) - }) - }) - - describe('$skip', () => { - let testQuery: any - - beforeEach(() => { - testQuery = { $skip: 1 } - }) - - it('returns $skip when present in query', () => { - const { filters } = filterQuery(testQuery) - - assert.strictEqual(filters.$skip, 1) - }) - - it('removes $skip from query when present', () => { - assert.deepStrictEqual(filterQuery(testQuery).query, {}) - }) - - it('returns undefined when not present in query', () => { - const query = { foo: 1 } - const { filters } = filterQuery(query) - - assert.strictEqual(filters.$skip, undefined) - }) - - it('parses $skip strings into integers (#4)', () => { - const { filters } = filterQuery({ $skip: '33' }) - - assert.strictEqual(filters.$skip, 33) - }) - }) - - describe('$select', () => { - let testQuery: any - - beforeEach(() => { - testQuery = { $select: 1 } - }) - - it('returns $select when present in query', () => { - const { filters } = filterQuery(testQuery) - - assert.strictEqual(filters.$select, 1) - }) - - it('removes $select from query when present', () => { - assert.deepStrictEqual(filterQuery(testQuery).query, {}) - }) - - it('returns undefined when not present in query', () => { - const query = { foo: 1 } - const { filters } = filterQuery(query) - - assert.strictEqual(filters.$select, undefined) - }) - - it('includes Symbols', () => { - const TEST = Symbol('testing') - const original = { - [TEST]: 'message', - other: true, - sub: { [TEST]: 'othermessage' } - } - - const { query } = filterQuery(original) - - assert.deepStrictEqual(query, { - [TEST]: 'message', - other: true, - sub: { [TEST]: 'othermessage' } - }) - }) - - it('only converts plain objects', () => { - const userId = new ObjectId() - const original = { - userId - } - - const { query } = filterQuery(original) - - assert.deepStrictEqual(query, original) - }) - }) - - describe('arrays', () => { - it('validates queries in arrays', () => { - assert.throws( - () => { - filterQuery({ - $or: [{ $exists: false }] - }) - }, - { - name: 'BadRequest', - message: 'Invalid query parameter $exists' - } - ) - }) - - it('allows default operators in $or', () => { - const { filters } = filterQuery({ - $or: [{ value: { $gte: 10 } }] - }) - - assert.deepStrictEqual(filters, { - $or: [{ value: { $gte: 10 } }] - }) - }) - }) - - describe('additional filters', () => { - it('throw error when not set as additionals', () => { - try { - filterQuery({ $select: 1, $known: 1 }) - assert.ok(false, 'Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Invalid filter value $known') - } - }) - - it('returns default and known additional filters (array)', () => { - const query = { $select: ['a', 'b'], $known: 1, $unknown: 1 } - const { filters } = filterQuery(query, { - filters: { - $known: true, - $unknown: true - } - }) - - assert.strictEqual(filters.$unknown, 1) - assert.strictEqual(filters.$known, 1) - assert.deepStrictEqual(filters.$select, ['a', 'b']) - }) - - it('returns default and known additional filters (object)', () => { - const { filters } = filterQuery( - { - $known: 1, - $select: 1 - }, - { filters: { $known: (value: any) => value.toString() } } - ) - - assert.strictEqual(filters.$unknown, undefined) - assert.strictEqual(filters.$known, '1') - assert.strictEqual(filters.$select, 1) - }) - }) - - describe('additional operators', () => { - it('returns query with default and known additional operators', () => { - const { query } = filterQuery( - { - prop: { $ne: 1, $known: 1 } - }, - { operators: ['$known'] } - ) - - assert.deepStrictEqual(query, { prop: { $ne: 1, $known: 1 } }) - }) - - it('throws an error with unknown query operator', () => { - assert.throws( - () => - filterQuery({ - prop: { $unknown: 'something' } - }), - { - message: 'Invalid query parameter $unknown' - } - ) - }) - }) -}) diff --git a/packages/adapter-commons/test/service.test.ts b/packages/adapter-commons/test/service.test.ts deleted file mode 100644 index ed5cc4a4c6..0000000000 --- a/packages/adapter-commons/test/service.test.ts +++ /dev/null @@ -1,227 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/ban-ts-comment */ -import assert from 'assert' -import { VALIDATED } from '../src' -import { MethodService } from './fixture' - -const METHODS: ['find', 'get', 'create', 'update', 'patch', 'remove'] = [ - 'find', - 'get', - 'create', - 'update', - 'patch', - 'remove' -] - -describe('@feathersjs/adapter-commons/service', () => { - describe('works when methods exist', () => { - METHODS.forEach((method) => { - it(`${method}`, () => { - const service = new MethodService({}) - const args: any[] = [] - - if (method !== 'find') { - args.push('test') - } - - if (method === 'update' || method === 'patch') { - args.push({}) - } - - // @ts-ignore - return service[method](...args) - }) - }) - - it('does not allow multi patch', async () => { - const service = new MethodService({}) - - await assert.rejects(() => service.patch(null, {}), { - name: 'MethodNotAllowed', - message: 'Can not patch multiple entries' - }) - }) - - it('does not allow multi remove', async () => { - const service = new MethodService({}) - - await assert.rejects(() => service.remove(null, {}), { - name: 'MethodNotAllowed', - message: 'Can not remove multiple entries' - }) - }) - - it('does not allow multi create', async () => { - const service = new MethodService({}) - - await assert.rejects(() => service.create([], {}), { - name: 'MethodNotAllowed', - message: 'Can not create multiple entries' - }) - }) - - it('multi can be set to true', async () => { - const service = new MethodService({}) - - service.options.multi = true - - await service.create([]) - }) - }) - - it('sanitizeQuery', async () => { - const service = new MethodService({ - filters: { - $something: true - }, - operators: ['$test'] - }) - - assert.deepStrictEqual( - await service.sanitizeQuery({ - query: { $limit: '10', test: 'me' } as any - }), - { $limit: 10, test: 'me' } - ) - - assert.deepStrictEqual( - await service.sanitizeQuery({ - adapter: { - paginate: { max: 2 } - }, - query: { $limit: '10', test: 'me' } as any - }), - { $limit: 2, test: 'me' } - ) - - await assert.rejects( - () => - service.sanitizeQuery({ - query: { name: { $bla: 'me' } } - }), - { - message: 'Invalid query parameter $bla' - } - ) - - assert.deepStrictEqual( - await service.sanitizeQuery({ - adapter: { - operators: ['$bla'] - }, - query: { name: { $bla: 'Dave' } } - }), - { name: { $bla: 'Dave' } } - ) - - const validatedQuery = { name: { $bla: 'me' } } - - Object.defineProperty(validatedQuery, VALIDATED, { value: true }) - - assert.deepStrictEqual( - await service.sanitizeQuery({ - query: validatedQuery - }), - validatedQuery, - 'validated queries are not sanitized' - ) - }) - - it('getOptions', () => { - const service = new MethodService({ - multi: true, - paginate: { - default: 1, - max: 10 - } - }) - const opts = service.getOptions({ - adapter: { - multi: ['create'], - paginate: { - default: 10, - max: 100 - } - } - }) - - assert.deepStrictEqual(opts, { - id: 'id', - events: [], - paginate: { default: 10, max: 100 }, - multi: ['create'], - filters: {}, - operators: [] - }) - - const notPaginated = service.getOptions({ - paginate: false - }) - - assert.deepStrictEqual(notPaginated, { - id: 'id', - events: [], - paginate: false, - multi: true, - filters: {}, - operators: [] - }) - }) - - it('allowsMulti', () => { - context('with true', () => { - const service = new MethodService({ multi: true }) - - it('does return true for multiple methodes', () => { - assert.equal(service.allowsMulti('patch'), true) - }) - - it('does return false for always non-multiple methodes', () => { - assert.equal(service.allowsMulti('update'), false) - }) - - it('does return true for unknown methods', () => { - assert.equal(service.allowsMulti('other'), true) - }) - }) - - context('with false', () => { - const service = new MethodService({ multi: false }) - - it('does return false for multiple methodes', () => { - assert.equal(service.allowsMulti('remove'), false) - }) - - it('does return true for always multiple methodes', () => { - assert.equal(service.allowsMulti('find'), true) - }) - - it('does return false for unknown methods', () => { - assert.equal(service.allowsMulti('other'), false) - }) - }) - - context('with array', () => { - const service = new MethodService({ multi: ['create', 'get', 'other'] }) - - it('does return true for specified multiple methodes', () => { - assert.equal(service.allowsMulti('create'), true) - }) - - it('does return false for non-specified multiple methodes', () => { - assert.equal(service.allowsMulti('patch'), false) - }) - - it('does return false for specified always multiple methodes', () => { - assert.equal(service.allowsMulti('get'), false) - }) - - it('does return true for specified unknown methodes', () => { - assert.equal(service.allowsMulti('other'), true) - }) - - it('does return false for non-specified unknown methodes', () => { - assert.equal(service.allowsMulti('another'), false) - }) - }) - }) -}) diff --git a/packages/adapter-commons/test/sort.test.ts b/packages/adapter-commons/test/sort.test.ts deleted file mode 100644 index d361c681af..0000000000 --- a/packages/adapter-commons/test/sort.test.ts +++ /dev/null @@ -1,384 +0,0 @@ -import assert from 'assert' -import { sorter } from '../src' - -describe('@feathersjs/adapter-commons', () => { - describe('sorter', () => { - it('simple sorter', () => { - const array = [ - { - name: 'David' - }, - { - name: 'Eric' - } - ] - - const sort = sorter({ - name: -1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { - name: 'Eric' - }, - { - name: 'David' - } - ]) - }) - - it('simple sorter with arrays', () => { - const array = [ - { - names: ['a', 'b'] - }, - { - names: ['c', 'd'] - } - ] - - const sort = sorter({ - names: -1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { - names: ['c', 'd'] - }, - { - names: ['a', 'b'] - } - ]) - }) - - it('simple sorter with objects', () => { - const array = [ - { - names: { - first: 'Dave', - last: 'L' - } - }, - { - names: { - first: 'A', - last: 'B' - } - } - ] - - const sort = sorter({ - names: 1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { - names: { - first: 'A', - last: 'B' - } - }, - { - names: { - first: 'Dave', - last: 'L' - } - } - ]) - }) - - it('two property sorter', () => { - const array = [ - { - name: 'David', - counter: 0 - }, - { - name: 'Eric', - counter: 1 - }, - { - name: 'David', - counter: 1 - }, - { - name: 'Eric', - counter: 0 - } - ] - - const sort = sorter({ - name: -1, - counter: 1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { name: 'Eric', counter: 0 }, - { name: 'Eric', counter: 1 }, - { name: 'David', counter: 0 }, - { name: 'David', counter: 1 } - ]) - }) - - it('two property sorter with names', () => { - const array = [ - { - name: 'David', - counter: 0 - }, - { - name: 'Eric', - counter: 1 - }, - { - name: 'Andrew', - counter: 1 - }, - { - name: 'David', - counter: 1 - }, - { - name: 'Andrew', - counter: 0 - }, - { - name: 'Eric', - counter: 0 - } - ] - - const sort = sorter({ - name: -1, - counter: 1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { name: 'Eric', counter: 0 }, - { name: 'Eric', counter: 1 }, - { name: 'David', counter: 0 }, - { name: 'David', counter: 1 }, - { name: 'Andrew', counter: 0 }, - { name: 'Andrew', counter: 1 } - ]) - }) - - it('three property sorter with names', () => { - const array = [ - { - name: 'David', - counter: 0, - age: 2 - }, - { - name: 'Eric', - counter: 1, - age: 2 - }, - { - name: 'David', - counter: 1, - age: 1 - }, - { - name: 'Eric', - counter: 0, - age: 1 - }, - { - name: 'Andrew', - counter: 0, - age: 2 - }, - { - name: 'Andrew', - counter: 0, - age: 1 - } - ] - - const sort = sorter({ - name: -1, - counter: 1, - age: -1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { name: 'Eric', counter: 0, age: 1 }, - { name: 'Eric', counter: 1, age: 2 }, - { name: 'David', counter: 0, age: 2 }, - { name: 'David', counter: 1, age: 1 }, - { name: 'Andrew', counter: 0, age: 2 }, - { name: 'Andrew', counter: 0, age: 1 } - ]) - }) - }) - - describe('sorter mongoDB-like sorting on embedded objects', () => { - let data: any[] = [] - - beforeEach(() => { - data = [ - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 } - ] - }) - - it('straight test', () => { - const sort = sorter({ - amount: -1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 } - ]) - }) - - it('embedded sort 1', () => { - const sort = sorter({ - 'item.category': 1, - 'item.type': 1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - } - ]) - }) - - it('embedded sort 2', () => { - const sort = sorter({ - 'item.category': 1, - 'item.type': 1, - amount: 1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - } - ]) - }) - - it('embedded sort 3', () => { - const sort = sorter({ - 'item.category': 1, - 'item.type': 1, - amount: -1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - } - ]) - }) - - it('embedded sort 4', () => { - const sort = sorter({ - amount: -1, - 'item.category': 1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 } - ]) - }) - - it('embedded sort 5', () => { - const sort = sorter({ - 'item.category': 1, - amount: 1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - } - ]) - }) - }) -}) diff --git a/packages/adapter-commons/tsconfig.json b/packages/adapter-commons/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/adapter-commons/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/adapter-tests/CHANGELOG.md b/packages/adapter-tests/CHANGELOG.md deleted file mode 100644 index 561cf9fe5b..0000000000 --- a/packages/adapter-tests/CHANGELOG.md +++ /dev/null @@ -1,487 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **typebox:** Revert to TypeBox 0.25 ([#3183](https://github.com/feathersjs/feathers/issues/3183)) ([cacedf5](https://github.com/feathersjs/feathers/commit/cacedf59e3d2df836777f0cd06ab1b2484ed87c5)) - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- **adapter-commons:** Support non-default import to ease use with ESM projects ([d06f2cf](https://github.com/feathersjs/feathers/commit/d06f2cfcadda7dc23f0e2bec44f64e6be8500d02)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **memory/mongodb:** $select as only property & force 'id' in '$select' ([#3081](https://github.com/feathersjs/feathers/issues/3081)) ([fbe3cf5](https://github.com/feathersjs/feathers/commit/fbe3cf5199e102b5aeda2ae33828d5034df3d105)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **databases:** Improve documentation for adapters and allow dynamic Knex adapter options ([#3019](https://github.com/feathersjs/feathers/issues/3019)) ([66c4b5e](https://github.com/feathersjs/feathers/commit/66c4b5e72000dd03acb57fca1cad4737c85c9c9e)) - -### Features - -- **database:** Add and to the query syntax ([#3021](https://github.com/feathersjs/feathers/issues/3021)) ([00cb0d9](https://github.com/feathersjs/feathers/commit/00cb0d9c302ae951ae007d3d6ceba33e254edd9c)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Bug Fixes - -- **adapter-commons:** Clarify adapter query filtering ([#2607](https://github.com/feathersjs/feathers/issues/2607)) ([2dac771](https://github.com/feathersjs/feathers/commit/2dac771b0a3298d6dd25994d05186701b0617718)) -- **adapter-tests:** Ensure multi tests can run standalone ([#2608](https://github.com/feathersjs/feathers/issues/2608)) ([d7243f2](https://github.com/feathersjs/feathers/commit/d7243f20e84d9dde428ad8dfc7f48388ca569e6e)) - -### BREAKING CHANGES - -- **adapter-commons:** Changes the common adapter base class to use `sanitizeQuery` and `sanitizeData` - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Bug Fixes - -- **adapter-tests:** Add tests for pagination in multi updates ([#2472](https://github.com/feathersjs/feathers/issues/2472)) ([98a811a](https://github.com/feathersjs/feathers/commit/98a811ac605575ff812a08d0504729a5efe7a69c)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- Update database adapter common repository urls ([#2380](https://github.com/feathersjs/feathers/issues/2380)) ([3f4db68](https://github.com/feathersjs/feathers/commit/3f4db68d6700c7d9023ecd17d0d39893f75a19fd)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **adapter-tests:** Add test that verified paginated total ([#2273](https://github.com/feathersjs/feathers/issues/2273)) ([879bd6b](https://github.com/feathersjs/feathers/commit/879bd6b24f42e04eeeeba110ddddda3e1e1dea34)) - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Features - -- **core:** Remove Uberproto ([#2178](https://github.com/feathersjs/feathers/issues/2178)) ([ddf8821](https://github.com/feathersjs/feathers/commit/ddf8821f53317e6a378657f7d66acb03a037ee47)) - -### BREAKING CHANGES - -- **core:** Services no longer extend Uberproto objects and - `service.mixin()` is no longer available. - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -### Features - -- **memory:** Move feathers-memory into @feathersjs/memory ([#2153](https://github.com/feathersjs/feathers/issues/2153)) ([dd61fe3](https://github.com/feathersjs/feathers/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-09-27) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## 4.5.3 (2020-09-24) - -### Bug Fixes - -- **adapter-tests:** Update multi patch + query tests ([#5](https://github.com/feathersjs/databases/issues/5)) ([84f1fe4](https://github.com/feathersjs/databases/commit/84f1fe4f13dc3a26891e43b965f75d08243f6c6f)) - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -### Bug Fixes - -- Fix feathers-memory dependency that did not get updated ([9422b13](https://github.com/feathersjs/feathers/commit/9422b13)) - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Bug Fixes - -- Add test to make sure different id in adapter query works ([#1165](https://github.com/feathersjs/feathers/issues/1165)) ([0ba4580](https://github.com/feathersjs/feathers/commit/0ba4580)) -- Update adapter tests to not rely on error instance ([#1202](https://github.com/feathersjs/feathers/issues/1202)) ([6885e0e](https://github.com/feathersjs/feathers/commit/6885e0e)) -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) - -### chore - -- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) - -### BREAKING CHANGES - -- **package:** Removes adapter tests from @feathersjs/adapter-commons - -## [1.0.1](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-tests@1.0.0...@feathersjs/adapter-tests@1.0.1) (2019-01-10) - -### Bug Fixes - -- Add test to make sure different id in adapter query works ([#1165](https://github.com/feathersjs/feathers/issues/1165)) ([0ba4580](https://github.com/feathersjs/feathers/commit/0ba4580)) - -# 1.0.0 (2019-01-10) - -### chore - -- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - -### BREAKING CHANGES - -- **package:** Removes adapter tests from @feathersjs/adapter-commons diff --git a/packages/adapter-tests/LICENSE b/packages/adapter-tests/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/adapter-tests/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/adapter-tests/README.md b/packages/adapter-tests/README.md deleted file mode 100644 index ebbe6fddc2..0000000000 --- a/packages/adapter-tests/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Feathers Adapter Tests - -[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-commons) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers shared database adapter test suite - -## About - -This is a repository that contains the test suite for the common database adapter syntax. See the [API documentation](https://docs.feathersjs.com/api/databases/common.html) for more information. - -## Authors - -[Feathers contributors](https://github.com/feathersjs/adapter-tests/graphs/contributors) - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-tests/package.json b/packages/adapter-tests/package.json deleted file mode 100644 index a9a317a0a0..0000000000 --- a/packages/adapter-tests/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "@feathersjs/adapter-tests", - "version": "5.0.30", - "description": "Feathers shared database adapter test suite", - "homepage": "https://feathersjs.com", - "keywords": [ - "feathers" - ], - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/adapter-tests" - }, - "author": { - "name": "Feathers contributor", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "main": "lib/", - "types": "lib/", - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**" - ], - "publishConfig": { - "access": "public" - }, - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/adapter-tests/src/basic.ts b/packages/adapter-tests/src/basic.ts deleted file mode 100644 index c19ad64a76..0000000000 --- a/packages/adapter-tests/src/basic.ts +++ /dev/null @@ -1,50 +0,0 @@ -import assert from 'assert' -import { AdapterBasicTest } from './declarations' - -export default (test: AdapterBasicTest, app: any, _errors: any, serviceName: string, idProp: string) => { - describe('Basic Functionality', () => { - let service: any - - beforeEach(() => { - service = app.service(serviceName) - }) - - it('.id', () => { - assert.strictEqual(service.id, idProp, 'id property is set to expected name') - }) - - test('.options', () => { - assert.ok(service.options, 'Options are available in service.options') - }) - - test('.events', () => { - assert.ok(service.events.includes('testing'), 'service.events is set and includes "testing"') - }) - - describe('Raw Methods', () => { - test('._get', () => { - assert.strictEqual(typeof service._get, 'function') - }) - - test('._find', () => { - assert.strictEqual(typeof service._find, 'function') - }) - - test('._create', () => { - assert.strictEqual(typeof service._create, 'function') - }) - - test('._update', () => { - assert.strictEqual(typeof service._update, 'function') - }) - - test('._patch', () => { - assert.strictEqual(typeof service._patch, 'function') - }) - - test('._remove', () => { - assert.strictEqual(typeof service._remove, 'function') - }) - }) - }) -} diff --git a/packages/adapter-tests/src/declarations.ts b/packages/adapter-tests/src/declarations.ts deleted file mode 100644 index 1674ced7bd..0000000000 --- a/packages/adapter-tests/src/declarations.ts +++ /dev/null @@ -1,98 +0,0 @@ -export type AdapterTest = (name: AdapterTestName, runner: any) => void - -export type AdapterBasicTest = (name: AdapterBasicTestName, runner: any) => void -export type AdapterMethodsTest = (name: AdapterMethodsTestName, runner: any) => void -export type AdapterSyntaxTest = (name: AdapterSyntaxTestName, runner: any) => void - -export type AdapterTestName = AdapterBasicTestName | AdapterMethodsTestName | AdapterSyntaxTestName - -export type AdapterBasicTestName = - | '.id' - | '.options' - | '.events' - | '._get' - | '._find' - | '._create' - | '._update' - | '._patch' - | '._remove' - | '.$get' - | '.$find' - | '.$create' - | '.$update' - | '.$patch' - | '.$remove' - -export type AdapterMethodsTestName = - | '.get' - | '.get + $select' - | '.get + id + query' - | '.get + NotFound' - | '.get + NotFound (integer)' - | '.get + id + query id' - | '.find' - | '.remove' - | '.remove + $select' - | '.remove + id + query' - | '.remove + NotFound' - | '.remove + NotFound (integer)' - | '.remove + multi' - | '.remove + multi no pagination' - | '.remove + id + query id' - | '.update' - | '.update + $select' - | '.update + id + query' - | '.update + NotFound' - | '.update + NotFound (integer)' - | '.update + query + NotFound' - | '.update + id + query id' - | '.patch' - | '.patch + $select' - | '.patch + id + query' - | '.patch multiple' - | '.patch multiple no pagination' - | '.patch multi query same' - | '.patch multi query changed' - | '.patch + NotFound' - | '.patch + NotFound (integer)' - | '.patch + query + NotFound' - | '.patch + id + query id' - | '.create' - | '.create + $select' - | '.create multi' - | '.create ignores query' - | 'internal .find' - | 'internal .get' - | 'internal .create' - | 'internal .update' - | 'internal .patch' - | 'internal .remove' - -export type AdapterSyntaxTestName = - | '.find + equal' - | '.find + equal multiple' - | '.find + $sort' - | '.find + $sort + string' - | '.find + $limit' - | '.find + $limit 0' - | '.find + $skip' - | '.find + $select' - | '.find + $or' - | '.find + $in' - | '.find + $nin' - | '.find + $lt' - | '.find + $lte' - | '.find + $gt' - | '.find + $gte' - | '.find + $ne' - | '.find + $gt + $lt + $sort' - | '.find + $or nested + $sort' - | '.find + $and' - | '.find + $and + $or' - | 'params.adapter + paginate' - | 'params.adapter + multi' - | '.find + paginate' - | '.find + paginate + query' - | '.find + paginate + $limit + $skip' - | '.find + paginate + $limit 0' - | '.find + paginate + params' diff --git a/packages/adapter-tests/src/index.ts b/packages/adapter-tests/src/index.ts deleted file mode 100644 index 9a86033698..0000000000 --- a/packages/adapter-tests/src/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* eslint-disable no-console */ -import basicTests from './basic' -import { AdapterTestName } from './declarations' -import methodTests from './methods' -import syntaxTests from './syntax' - -export const adapterTests = (testNames: AdapterTestName[]) => { - return (app: any, errors: any, serviceName: any, idProp = 'id') => { - if (!serviceName) { - throw new Error('You must pass a service name') - } - - const skippedTests: AdapterTestName[] = [] - const allTests: AdapterTestName[] = [] - - const test = (name: AdapterTestName, runner: any) => { - const skip = !testNames.includes(name) - const its = skip ? it.skip : it - - if (skip) { - skippedTests.push(name) - } - - allTests.push(name) - - its(name, runner) - } - - describe(`Adapter tests for '${serviceName}' service with '${idProp}' id property`, () => { - after(() => { - testNames.forEach((name) => { - if (!allTests.includes(name)) { - console.error(`WARNING: '${name}' test is not part of the test suite`) - } - }) - if (skippedTests.length) { - console.log( - `\nSkipped the following ${skippedTests.length} Feathers adapter test(s) out of ${allTests.length} total:` - ) - console.log(JSON.stringify(skippedTests, null, ' ')) - } - }) - - basicTests(test, app, errors, serviceName, idProp) - methodTests(test, app, errors, serviceName, idProp) - syntaxTests(test, app, errors, serviceName, idProp) - }) - } -} - -export * from './declarations' - -export default adapterTests - -if (typeof module !== 'undefined') { - module.exports = Object.assign(adapterTests, module.exports) -} diff --git a/packages/adapter-tests/src/methods.ts b/packages/adapter-tests/src/methods.ts deleted file mode 100644 index 84d6c3f18f..0000000000 --- a/packages/adapter-tests/src/methods.ts +++ /dev/null @@ -1,773 +0,0 @@ -import assert from 'assert' -import { AdapterMethodsTest } from './declarations' - -export default (test: AdapterMethodsTest, app: any, _errors: any, serviceName: string, idProp: string) => { - describe(' Methods', () => { - let doug: any - let service: any - - beforeEach(async () => { - service = app.service(serviceName) - doug = await app.service(serviceName).create({ - name: 'Doug', - age: 32 - }) - }) - - afterEach(async () => { - try { - await app.service(serviceName).remove(doug[idProp]) - } catch (error: any) {} - }) - - describe('get', () => { - test('.get', async () => { - const data = await service.get(doug[idProp]) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`) - assert.strictEqual(data.name, 'Doug', 'data.name matches') - assert.strictEqual(data.age, 32, 'data.age matches') - }) - - test('.get + $select', async () => { - const data = await service.get(doug[idProp], { - query: { $select: ['name'] } - }) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) - assert.strictEqual(data.name, 'Doug', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.get + id + query', async () => { - try { - await service.get(doug[idProp], { - query: { name: 'Tester' } - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - test('.get + NotFound', async () => { - try { - await service.get('568225fbfe21222432e836ff') - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.get + NotFound (integer)', async () => { - try { - await service.get(123456789) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.get + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }) - - try { - await service.get(doug[idProp], { - query: { [idProp]: alice[idProp] } - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - - await service.remove(alice[idProp]) - }) - }) - - describe('find', () => { - test('.find', async () => { - const data = await service.find() - - assert.ok(Array.isArray(data), 'Data is an array') - assert.strictEqual(data.length, 1, 'Got one entry') - }) - }) - - describe('remove', () => { - test('.remove', async () => { - const data = await service.remove(doug[idProp]) - - assert.strictEqual(data.name, 'Doug', 'data.name matches') - }) - - test('.remove + $select', async () => { - const data = await service.remove(doug[idProp], { - query: { $select: ['name'] } - }) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) - assert.strictEqual(data.name, 'Doug', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.remove + id + query', async () => { - try { - await service.remove(doug[idProp], { - query: { name: 'Tester' } - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - test('.remove + NotFound', async () => { - try { - await service.remove('568225fbfe21222432e836ff') - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.remove + NotFound (integer)', async () => { - try { - await service.remove(123456789) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.remove + multi', async () => { - try { - await service.remove(null) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.name, - 'MethodNotAllowed', - 'Removing multiple without option set throws MethodNotAllowed' - ) - } - - service.options.multi = ['remove'] - - await service.create({ name: 'Dave', age: 29, created: true }) - await service.create({ - name: 'David', - age: 3, - created: true - }) - - const data = await service.remove(null, { - query: { created: true } - }) - - assert.strictEqual(data.length, 2) - - const names = data.map((person: any) => person.name) - - assert.ok(names.includes('Dave'), 'Dave removed') - assert.ok(names.includes('David'), 'David removed') - }) - - test('.remove + multi no pagination', async () => { - try { - await service.remove(doug[idProp]) - } catch (error: any) {} - - const count = 14 - const defaultPaginate = 10 - - assert.ok(count > defaultPaginate, 'count is bigger than default pagination') - - const multiBefore = service.options.multi - const paginateBefore = service.options.paginate - - try { - service.options.multi = true - service.options.paginate = { - default: defaultPaginate, - max: 100 - } - - const emptyItems = await service.find({ paginate: false }) - assert.strictEqual(emptyItems.length, 0, 'no items before') - - const createdItems = await service.create( - Array.from(Array(count)).map((_, i) => ({ - name: `name-${i}`, - age: 3, - created: true - })) - ) - assert.strictEqual(createdItems.length, count, `created ${count} items`) - - const foundItems = await service.find({ paginate: false }) - assert.strictEqual(foundItems.length, count, `created ${count} items`) - - const foundPaginatedItems = await service.find({}) - assert.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated items') - - const allItems = await service.remove(null, { - query: { created: true } - }) - - assert.strictEqual(allItems.length, count, `removed all ${count} items`) - } finally { - await service.remove(null, { - query: { created: true }, - paginate: false - }) - - service.options.multi = multiBefore - service.options.paginate = paginateBefore - } - }) - - test('.remove + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }) - - try { - await service.remove(doug[idProp], { - query: { [idProp]: alice[idProp] } - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - - await service.remove(alice[idProp]) - }) - }) - - describe('update', () => { - test('.update', async () => { - const originalData = { [idProp]: doug[idProp], name: 'Dougler' } - const originalCopy = Object.assign({}, originalData) - - const data = await service.update(doug[idProp], originalData) - - assert.deepStrictEqual(originalData, originalCopy, 'data was not modified') - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`) - assert.strictEqual(data.name, 'Dougler', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.update + $select', async () => { - const originalData = { - [idProp]: doug[idProp], - name: 'Dougler', - age: 10 - } - - const data = await service.update(doug[idProp], originalData, { - query: { $select: ['name'] } - }) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) - assert.strictEqual(data.name, 'Dougler', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.update + id + query', async () => { - try { - await service.update( - doug[idProp], - { - name: 'Dougler' - }, - { - query: { name: 'Tester' } - } - ) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - test('.update + NotFound', async () => { - try { - await service.update('568225fbfe21222432e836ff', { - name: 'NotFound' - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.update + NotFound (integer)', async () => { - try { - await service.update(123456789, { - name: 'NotFound' - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.update + query + NotFound', async () => { - const dave = await service.create({ name: 'Dave' }) - try { - await service.update(dave[idProp], { name: 'UpdatedDave' }, { query: { name: 'NotDave' } }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - await service.remove(dave[idProp]) - }) - - test('.update + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }) - - try { - await service.update( - doug[idProp], - { - name: 'Dougler', - age: 33 - }, - { - query: { [idProp]: alice[idProp] } - } - ) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - - await service.remove(alice[idProp]) - }) - }) - - describe('patch', () => { - test('.patch', async () => { - const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' } - const originalCopy = Object.assign({}, originalData) - - const data = await service.patch(doug[idProp], originalData) - - assert.deepStrictEqual(originalData, originalCopy, 'original data was not modified') - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`) - assert.strictEqual(data.name, 'PatchDoug', 'data.name matches') - assert.strictEqual(data.age, 32, 'data.age matches') - }) - - test('.patch + $select', async () => { - const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' } - - const data = await service.patch(doug[idProp], originalData, { - query: { $select: ['name'] } - }) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) - assert.strictEqual(data.name, 'PatchDoug', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.patch + id + query', async () => { - try { - await service.patch( - doug[idProp], - { - name: 'id patched doug' - }, - { - query: { name: 'Tester' } - } - ) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - test('.patch multiple', async () => { - try { - await service.patch(null, {}) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.name, - 'MethodNotAllowed', - 'Removing multiple without option set throws MethodNotAllowed' - ) - } - - const params = { - query: { created: true } - } - const dave = await service.create({ - name: 'Dave', - age: 29, - created: true - }) - const david = await service.create({ - name: 'David', - age: 3, - created: true - }) - - service.options.multi = ['patch'] - - const data = await service.patch( - null, - { - age: 2 - }, - params - ) - - assert.strictEqual(data.length, 2, 'returned two entries') - assert.strictEqual(data[0].age, 2, 'First entry age was updated') - assert.strictEqual(data[1].age, 2, 'Second entry age was updated') - - await service.remove(dave[idProp]) - await service.remove(david[idProp]) - }) - - test('.patch multiple no pagination', async () => { - try { - await service.remove(doug[idProp]) - } catch (error: any) {} - - const count = 14 - const defaultPaginate = 10 - - assert.ok(count > defaultPaginate, 'count is bigger than default pagination') - - const multiBefore = service.options.multi - const paginateBefore = service.options.paginate - - let ids: any[] - - try { - service.options.multi = true - service.options.paginate = { - default: defaultPaginate, - max: 100 - } - - const emptyItems = await service.find({ paginate: false }) - assert.strictEqual(emptyItems.length, 0, 'no items before') - - const createdItems = await service.create( - Array.from(Array(count)).map((_, i) => ({ - name: `name-${i}`, - age: 3, - created: true - })) - ) - assert.strictEqual(createdItems.length, count, `created ${count} items`) - ids = createdItems.map((item: any) => item[idProp]) - - const foundItems = await service.find({ paginate: false }) - assert.strictEqual(foundItems.length, count, `created ${count} items`) - - const foundPaginatedItems = await service.find({}) - assert.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated data') - - const allItems = await service.patch(null, { age: 4 }, { query: { created: true } }) - - assert.strictEqual(allItems.length, count, `patched all ${count} items`) - } finally { - service.options.multi = multiBefore - service.options.paginate = paginateBefore - if (ids) { - await Promise.all(ids.map((id) => service.remove(id))) - } - } - }) - - test('.patch multi query same', async () => { - const service = app.service(serviceName) - const multiBefore = service.options.multi - - service.options.multi = true - - const params = { - query: { age: { $lt: 10 } } - } - const dave = await service.create({ - name: 'Dave', - age: 8, - created: true - }) - const david = await service.create({ - name: 'David', - age: 4, - created: true - }) - - const data = await service.patch( - null, - { - age: 2 - }, - params - ) - - assert.strictEqual(data.length, 2, 'returned two entries') - assert.strictEqual(data[0].age, 2, 'First entry age was updated') - assert.strictEqual(data[1].age, 2, 'Second entry age was updated') - - await service.remove(dave[idProp]) - await service.remove(david[idProp]) - - service.options.multi = multiBefore - }) - - test('.patch multi query changed', async () => { - const service = app.service(serviceName) - const multiBefore = service.options.multi - - service.options.multi = true - - const params = { - query: { age: 10 } - } - const dave = await service.create({ - name: 'Dave', - age: 10, - created: true - }) - const david = await service.create({ - name: 'David', - age: 10, - created: true - }) - - const data = await service.patch( - null, - { - age: 2 - }, - params - ) - - assert.strictEqual(data.length, 2, 'returned two entries') - assert.strictEqual(data[0].age, 2, 'First entry age was updated') - assert.strictEqual(data[1].age, 2, 'Second entry age was updated') - - await service.remove(dave[idProp]) - await service.remove(david[idProp]) - - service.options.multi = multiBefore - }) - - test('.patch + NotFound', async () => { - try { - await service.patch('568225fbfe21222432e836ff', { - name: 'PatchDoug' - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.patch + NotFound (integer)', async () => { - try { - await service.patch(123456789, { - name: 'PatchDoug' - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.patch + query + NotFound', async () => { - const dave = await service.create({ name: 'Dave' }) - try { - await service.patch(dave[idProp], { name: 'PatchedDave' }, { query: { name: 'NotDave' } }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - await service.remove(dave[idProp]) - }) - - test('.patch + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }) - - try { - await service.patch( - doug[idProp], - { - age: 33 - }, - { - query: { [idProp]: alice[idProp] } - } - ) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - - await service.remove(alice[idProp]) - }) - }) - - describe('create', () => { - test('.create', async () => { - const originalData = { - name: 'Bill', - age: 40 - } - const originalCopy = Object.assign({}, originalData) - - const data = await service.create(originalData) - - assert.deepStrictEqual(originalData, originalCopy, 'original data was not modified') - assert.ok(data instanceof Object, 'data is an object') - assert.strictEqual(data.name, 'Bill', 'data.name matches') - - await service.remove(data[idProp]) - }) - - test('.create ignores query', async () => { - const originalData = { - name: 'Billy', - age: 42 - } - const data = await service.create(originalData, { - query: { - name: 'Dave' - } - }) - - assert.strictEqual(data.name, 'Billy', 'data.name matches') - - await service.remove(data[idProp]) - }) - - test('.create + $select', async () => { - const originalData = { - name: 'William', - age: 23 - } - - const data = await service.create(originalData, { - query: { $select: ['name'] } - }) - - assert.ok(idProp in data, 'data has id') - assert.strictEqual(data.name, 'William', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - - await service.remove(data[idProp]) - }) - - test('.create multi', async () => { - try { - await service.create([], {}) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.name, - 'MethodNotAllowed', - 'Removing multiple without option set throws MethodNotAllowed' - ) - } - - const items = [ - { - name: 'Gerald', - age: 18 - }, - { - name: 'Herald', - age: 18 - } - ] - - service.options.multi = ['create', 'patch'] - - const data = await service.create(items) - - assert.ok(Array.isArray(data), 'data is an array') - assert.ok(typeof data[0][idProp] !== 'undefined', 'id is set') - assert.strictEqual(data[0].name, 'Gerald', 'first name matches') - assert.ok(typeof data[1][idProp] !== 'undefined', 'id is set') - assert.strictEqual(data[1].name, 'Herald', 'second name macthes') - - await service.remove(data[0][idProp]) - await service.remove(data[1][idProp]) - }) - }) - - describe("doesn't call public methods internally", () => { - let throwing: any - - before(() => { - throwing = Object.assign(Object.create(app.service(serviceName)), { - get store() { - return app.service(serviceName).store - }, - - find() { - throw new Error('find method called') - }, - get() { - throw new Error('get method called') - }, - create() { - throw new Error('create method called') - }, - update() { - throw new Error('update method called') - }, - patch() { - throw new Error('patch method called') - }, - remove() { - throw new Error('remove method called') - } - }) - }) - - test('internal .find', () => app.service(serviceName).find.call(throwing)) - - test('internal .get', () => service.get.call(throwing, doug[idProp])) - - test('internal .create', async () => { - const bob = await service.create.call(throwing, { - name: 'Bob', - age: 25 - }) - - await service.remove(bob[idProp]) - }) - - test('internal .update', () => - service.update.call(throwing, doug[idProp], { - name: 'Dougler' - })) - - test('internal .patch', () => - service.patch.call(throwing, doug[idProp], { - name: 'PatchDoug' - })) - - test('internal .remove', () => service.remove.call(throwing, doug[idProp])) - }) - }) -} diff --git a/packages/adapter-tests/src/syntax.ts b/packages/adapter-tests/src/syntax.ts deleted file mode 100644 index e559d394c2..0000000000 --- a/packages/adapter-tests/src/syntax.ts +++ /dev/null @@ -1,423 +0,0 @@ -import assert from 'assert' -import { AdapterSyntaxTest } from './declarations' - -export default (test: AdapterSyntaxTest, app: any, _errors: any, serviceName: string, idProp: string) => { - describe('Query Syntax', () => { - let bob: any - let alice: any - let doug: any - let service: any - - beforeEach(async () => { - service = app.service(serviceName) - bob = await app.service(serviceName).create({ - name: 'Bob', - age: 25 - }) - doug = await app.service(serviceName).create({ - name: 'Doug', - age: 32 - }) - alice = await app.service(serviceName).create({ - name: 'Alice', - age: 19 - }) - }) - - afterEach(async () => { - await service.remove(bob[idProp]) - await service.remove(alice[idProp]) - await service.remove(doug[idProp]) - }) - - test('.find + equal', async () => { - const params = { query: { name: 'Alice' } } - const data = await service.find(params) - - assert.ok(Array.isArray(data)) - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Alice') - }) - - test('.find + equal multiple', async () => { - const data = await service.find({ - query: { name: 'Alice', age: 20 } - }) - - assert.strictEqual(data.length, 0) - }) - - describe('special filters', () => { - test('.find + $sort', async () => { - let data = await service.find({ - query: { - $sort: { name: 1 } - } - }) - - assert.strictEqual(data.length, 3) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - assert.strictEqual(data[2].name, 'Doug') - - data = await service.find({ - query: { - $sort: { name: -1 } - } - }) - - assert.strictEqual(data.length, 3) - assert.strictEqual(data[0].name, 'Doug') - assert.strictEqual(data[1].name, 'Bob') - assert.strictEqual(data[2].name, 'Alice') - }) - - test('.find + $sort + string', async () => { - const data = await service.find({ - query: { - $sort: { name: '1' } - } - }) - - assert.strictEqual(data.length, 3) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - assert.strictEqual(data[2].name, 'Doug') - }) - - test('.find + $limit', async () => { - const data = await service.find({ - query: { - $limit: 2 - } - }) - - assert.strictEqual(data.length, 2) - }) - - test('.find + $limit 0', async () => { - const data = await service.find({ - query: { - $limit: 0 - } - }) - - assert.strictEqual(data.length, 0) - }) - - test('.find + $skip', async () => { - const data = await service.find({ - query: { - $sort: { name: 1 }, - $skip: 1 - } - }) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Bob') - assert.strictEqual(data[1].name, 'Doug') - }) - - test('.find + $select', async () => { - const data = await service.find({ - query: { - name: 'Alice', - $select: ['name'] - } - }) - - assert.strictEqual(data.length, 1) - assert.ok(idProp in data[0], 'data has id') - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[0].age, undefined) - }) - - test('.find + $or', async () => { - const data = await service.find({ - query: { - $or: [{ name: 'Alice' }, { name: 'Bob' }], - $sort: { name: 1 } - } - }) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - }) - - test('.find + $in', async () => { - const data = await service.find({ - query: { - name: { - $in: ['Alice', 'Bob'] - }, - $sort: { name: 1 } - } - }) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - }) - - test('.find + $nin', async () => { - const data = await service.find({ - query: { - name: { - $nin: ['Alice', 'Bob'] - } - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Doug') - }) - - test('.find + $lt', async () => { - const data = await service.find({ - query: { - age: { - $lt: 30 - } - } - }) - - assert.strictEqual(data.length, 2) - }) - - test('.find + $lte', async () => { - const data = await service.find({ - query: { - age: { - $lte: 25 - } - } - }) - - assert.strictEqual(data.length, 2) - }) - - test('.find + $gt', async () => { - const data = await service.find({ - query: { - age: { - $gt: 30 - } - } - }) - - assert.strictEqual(data.length, 1) - }) - - test('.find + $gte', async () => { - const data = await service.find({ - query: { - age: { - $gte: 25 - } - } - }) - - assert.strictEqual(data.length, 2) - }) - - test('.find + $ne', async () => { - const data = await service.find({ - query: { - age: { - $ne: 25 - } - } - }) - - assert.strictEqual(data.length, 2) - }) - }) - - test('.find + $gt + $lt + $sort', async () => { - const params = { - query: { - age: { - $gt: 18, - $lt: 30 - }, - $sort: { name: 1 } - } - } - - const data = await service.find(params) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - }) - - test('.find + $or nested + $sort', async () => { - const params = { - query: { - $or: [ - { name: 'Doug' }, - { - age: { - $gte: 18, - $lt: 25 - } - } - ], - $sort: { name: 1 } - } - } - - const data = await service.find(params) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Doug') - }) - - test('.find + $and', async () => { - const params = { - query: { - $and: [{ age: 19 }], - $sort: { name: 1 } - } - } - - const data = await service.find(params) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Alice') - }) - - test('.find + $and + $or', async () => { - const params = { - query: { - $and: [{ $or: [{ name: 'Alice' }] }], - $sort: { name: 1 } - } - } - - const data = await service.find(params) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Alice') - }) - - describe('params.adapter', () => { - test('params.adapter + paginate', async () => { - const page = await service.find({ - adapter: { - paginate: { default: 3 } - } - }) - - assert.strictEqual(page.limit, 3) - assert.strictEqual(page.skip, 0) - }) - - test('params.adapter + multi', async () => { - const items = [ - { - name: 'Garald', - age: 200 - }, - { - name: 'Harald', - age: 24 - } - ] - const multiParams = { - adapter: { - multi: ['create'] - } - } - const users = await service.create(items, multiParams) - - assert.strictEqual(users.length, 2) - - await service.remove(users[0][idProp]) - await service.remove(users[1][idProp]) - await assert.rejects(() => service.patch(null, { age: 2 }, multiParams), { - message: 'Can not patch multiple entries' - }) - }) - }) - - describe('paginate', function () { - beforeEach(() => { - service.options.paginate = { - default: 1, - max: 2 - } - }) - - afterEach(() => { - service.options.paginate = {} - }) - - test('.find + paginate', async () => { - const page = await service.find({ - query: { $sort: { name: -1 } } - }) - - assert.strictEqual(page.total, 3) - assert.strictEqual(page.limit, 1) - assert.strictEqual(page.skip, 0) - assert.strictEqual(page.data[0].name, 'Doug') - }) - - test('.find + paginate + query', async () => { - const page = await service.find({ - query: { - $sort: { name: -1 }, - name: 'Doug' - } - }) - - assert.strictEqual(page.total, 1) - assert.strictEqual(page.limit, 1) - assert.strictEqual(page.skip, 0) - assert.strictEqual(page.data[0].name, 'Doug') - }) - - test('.find + paginate + $limit + $skip', async () => { - const params = { - query: { - $skip: 1, - $limit: 4, - $sort: { name: -1 } - } - } - - const page = await service.find(params) - - assert.strictEqual(page.total, 3) - assert.strictEqual(page.limit, 2) - assert.strictEqual(page.skip, 1) - assert.strictEqual(page.data[0].name, 'Bob') - assert.strictEqual(page.data[1].name, 'Alice') - }) - - test('.find + paginate + $limit 0', async () => { - const page = await service.find({ - query: { $limit: 0 } - }) - - assert.strictEqual(page.total, 3) - assert.strictEqual(page.data.length, 0) - }) - - test('.find + paginate + params', async () => { - const page = await service.find({ paginate: { default: 3 } }) - - assert.strictEqual(page.limit, 3) - assert.strictEqual(page.skip, 0) - - const results = await service.find({ paginate: false }) - - assert.ok(Array.isArray(results)) - assert.strictEqual(results.length, 3) - }) - }) - }) -} diff --git a/packages/adapter-tests/test/index.test.ts b/packages/adapter-tests/test/index.test.ts deleted file mode 100644 index fc4a3ad0ec..0000000000 --- a/packages/adapter-tests/test/index.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { strict as assert } from 'assert' -import adapterTests from '../src' - -const testSuite = adapterTests([ - '.events', - '._get', - '._find', - '._create', - '._update', - '._patch', - '._remove', - '.$get', - '.$find', - '.$create', - '.$update', - '.$patch', - '.$remove', - '.get', - '.get + $select', - '.get + id + query', - '.get + NotFound', - '.find', - '.remove', - '.remove + $select', - '.remove + id + query', - '.remove + multi', - '.remove + multi no pagination', - '.update', - '.update + $select', - '.update + id + query', - '.update + NotFound', - '.patch', - '.patch + $select', - '.patch + id + query', - '.patch multiple', - '.patch multiple no pagination', - '.patch multi query changed', - '.patch multi query same', - '.patch + NotFound', - '.create', - '.create + $select', - '.create multi', - 'internal .find', - 'internal .get', - 'internal .create', - 'internal .update', - 'internal .patch', - 'internal .remove', - '.find + equal', - '.find + equal multiple', - '.find + $sort', - '.find + $sort + string', - '.find + $limit', - '.find + $limit 0', - '.find + $skip', - '.find + $select', - '.find + $or', - '.find + $in', - '.find + $nin', - '.find + $lt', - '.find + $lte', - '.find + $gt', - '.find + $gte', - '.find + $ne', - '.find + $gt + $lt + $sort', - '.find + $or nested + $sort', - '.find + paginate', - '.find + paginate + $limit + $skip', - '.find + paginate + $limit 0', - '.find + paginate + params', - '.get + id + query id', - '.remove + id + query id', - '.update + id + query id', - '.patch + id + query id' -]) - -describe('Feathers Memory Service', () => { - it('loads the test suite', () => { - assert.ok(typeof testSuite === 'function') - }) - - it('exports as CommonJS', () => { - assert.equal(typeof require('../lib'), 'function') - }) -}) diff --git a/packages/adapter-tests/tsconfig.json b/packages/adapter-tests/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/adapter-tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/authentication-client/CHANGELOG.md b/packages/authentication-client/CHANGELOG.md deleted file mode 100644 index 1022e15b59..0000000000 --- a/packages/authentication-client/CHANGELOG.md +++ /dev/null @@ -1,847 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **authentication-client:** Allow to abort fetch ([#3310](https://github.com/feathersjs/feathers/issues/3310)) ([ff3e104](https://github.com/feathersjs/feathers/commit/ff3e104b62d02d45261a293aff4e9491241f486f)) - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -### Bug Fixes - -- **authentication-client:** Do not trigger storage methods if storage not defined ([#3210](https://github.com/feathersjs/feathers/issues/3210)) ([261acbc](https://github.com/feathersjs/feathers/commit/261acbcde387db731e434cb106a27b49dcb64a9a)) -- **authentication-client:** removeAccessToken throws error if storage not defined ([#3195](https://github.com/feathersjs/feathers/issues/3195)) ([b8e2769](https://github.com/feathersjs/feathers/commit/b8e27698f7958a91fe9a4ee64ec5591d23194c44)) - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.2](https://github.com/feathersjs/feathers/compare/v5.0.1...v5.0.2) (2023-03-23) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **authentication-client:** Do not cache authentication errors ([#2892](https://github.com/feathersjs/feathers/issues/2892)) ([cc4e767](https://github.com/feathersjs/feathers/commit/cc4e76726fce1ac73252cfd92e22570d4bdeca20)) -- **authentication-client:** Improve socket reauthentication handling ([#2895](https://github.com/feathersjs/feathers/issues/2895)) ([9db5e7a](https://github.com/feathersjs/feathers/commit/9db5e7adb0f6aea43d607f530d8258ade98b7362)) -- **authentication-client:** Remove access token for fatal 400 errors ([#2894](https://github.com/feathersjs/feathers/issues/2894)) ([cfc6c7a](https://github.com/feathersjs/feathers/commit/cfc6c7a6b9dbc7fb60816e2b7f15897c38deb98d)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Features - -- **cli:** Add authentication client to generated client ([#2801](https://github.com/feathersjs/feathers/issues/2801)) ([bd59f91](https://github.com/feathersjs/feathers/commit/bd59f91b45a01c2eea0c4386e567f4de5aa6ad99)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **authentication-client:** Properly handle missing token error ([#2700](https://github.com/feathersjs/feathers/issues/2700)) ([160746e](https://github.com/feathersjs/feathers/commit/160746e2bceb465fd1b6a003415f8ab38daba521)) -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -### Bug Fixes - -- **authentication-client:** Ensure reAuthenticate works in parallel with other requests ([#2690](https://github.com/feathersjs/feathers/issues/2690)) ([41b3761](https://github.com/feathersjs/feathers/commit/41b376106b47e2f40a8914db7a5ed2935e070c08)) - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **hooks:** Migrate built-in hooks and allow backwards compatibility ([#2358](https://github.com/feathersjs/feathers/issues/2358)) ([759c5a1](https://github.com/feathersjs/feathers/commit/759c5a19327a731af965c3604119393b3d09a406)) -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) - -### Features - -- Application service types default to any ([#1566](https://github.com/feathersjs/feathers/issues/1566)) ([d93ba9a](https://github.com/feathersjs/feathers/commit/d93ba9a17edd20d3397bb00f4f6e82e804e42ed6)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) -- **authentication-client:** Throw separate OauthError in authentication client ([#2189](https://github.com/feathersjs/feathers/issues/2189)) ([fa45ec5](https://github.com/feathersjs/feathers/commit/fa45ec520b21834e103e6fe4200b06dced56c0e6)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### chore - -- **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) - -### BREAKING CHANGES - -- **package:** Remove primus packages to be moved into the ecosystem. - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### chore - -- **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) - -### BREAKING CHANGES - -- **package:** Remove primus packages to be moved into the ecosystem. - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -### Bug Fixes - -- **authentication-client:** Allow reAuthentication using specific strategy ([#2140](https://github.com/feathersjs/feathers/issues/2140)) ([2a2bbf7](https://github.com/feathersjs/feathers/commit/2a2bbf7f8ee6d32b9fac8afab3421286b06e6443)) -- **socketio-client:** Throw an error and show a warning if someone tries to use socket.io-client v3 ([#2135](https://github.com/feathersjs/feathers/issues/2135)) ([cc3521c](https://github.com/feathersjs/feathers/commit/cc3521c935a1cbd690e29b7057998e3898f282db)) - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -### Bug Fixes - -- **authentication-client:** Fix storage type so it works with all supported interfaces ([#2041](https://github.com/feathersjs/feathers/issues/2041)) ([6ee0e78](https://github.com/feathersjs/feathers/commit/6ee0e78d55cf1214f61458f386b94c350eec32af)) - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Bug Fixes - -- **authentication-client:** Reset authentication promise on socket disconnect ([#1696](https://github.com/feathersjs/feathers/issues/1696)) ([3951626](https://github.com/feathersjs/feathers/commit/395162633ff22e95833a3c2900cb9464bb5b056f)) - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -### Bug Fixes - -- Improve authentication client default storage initialization ([#1613](https://github.com/feathersjs/feathers/issues/1613)) ([d7f5107](https://github.com/feathersjs/feathers/commit/d7f5107ef76297b4ca6db580afc5e2b372f5ee4d)) - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -### Bug Fixes - -- Authentication type improvements and timeout fix ([#1605](https://github.com/feathersjs/feathers/issues/1605)) ([19854d3](https://github.com/feathersjs/feathers/commit/19854d3)) - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -### Bug Fixes - -- Typing improvements ([#1580](https://github.com/feathersjs/feathers/issues/1580)) ([7818aec](https://github.com/feathersjs/feathers/commit/7818aec)) - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -### Bug Fixes - -- Only remove token on NotAuthenticated error in authentication client and handle error better ([#1525](https://github.com/feathersjs/feathers/issues/1525)) ([13a8758](https://github.com/feathersjs/feathers/commit/13a8758)) - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -### Features - -- Let strategies handle the connection ([#1510](https://github.com/feathersjs/feathers/issues/1510)) ([4329feb](https://github.com/feathersjs/feathers/commit/4329feb)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Do not error in authentication client on logout ([#1473](https://github.com/feathersjs/feathers/issues/1473)) ([8211b98](https://github.com/feathersjs/feathers/commit/8211b98)) - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Make oAuth paths more consistent and improve authentication client ([#1377](https://github.com/feathersjs/feathers/issues/1377)) ([adb2543](https://github.com/feathersjs/feathers/commit/adb2543)) -- Typings fix and improvements. ([#1364](https://github.com/feathersjs/feathers/issues/1364)) ([515b916](https://github.com/feathersjs/feathers/commit/515b916)) -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -### Bug Fixes - -- Guard against null in client side logout function ([#1319](https://github.com/feathersjs/feathers/issues/1319)) ([fa7f057](https://github.com/feathersjs/feathers/commit/fa7f057)) -- Handle error oAuth redirect in authentication client ([#1307](https://github.com/feathersjs/feathers/issues/1307)) ([12d48ee](https://github.com/feathersjs/feathers/commit/12d48ee)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) -- Rename jwtStrategies option to authStrategies ([#1305](https://github.com/feathersjs/feathers/issues/1305)) ([4aee151](https://github.com/feathersjs/feathers/commit/4aee151)) -- Update version number check ([53575c5](https://github.com/feathersjs/feathers/commit/53575c5)) - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Bug Fixes - -- Authentication core improvements ([#1260](https://github.com/feathersjs/feathers/issues/1260)) ([c5dc7a2](https://github.com/feathersjs/feathers/commit/c5dc7a2)) -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **package:** update debug to version 3.0.0 ([#61](https://github.com/feathersjs/feathers/issues/61)) ([6f5009c](https://github.com/feathersjs/feathers/commit/6f5009c)) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) -- Add authentication through oAuth redirect to authentication client ([#1301](https://github.com/feathersjs/feathers/issues/1301)) ([35d8043](https://github.com/feathersjs/feathers/commit/35d8043)) -- Add AuthenticationBaseStrategy and make authentication option handling more explicit ([#1284](https://github.com/feathersjs/feathers/issues/1284)) ([2667d92](https://github.com/feathersjs/feathers/commit/2667d92)) -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Authentication v3 client ([#1240](https://github.com/feathersjs/feathers/issues/1240)) ([65b43bd](https://github.com/feathersjs/feathers/commit/65b43bd)) -- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) - -### BREAKING CHANGES - -- Rewrite for authentication v3 - -## [1.0.11](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.10...@feathersjs/authentication-client@1.0.11) (2019-01-26) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [1.0.10](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.9...@feathersjs/authentication-client@1.0.10) (2019-01-02) - -### Bug Fixes - -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) - - - -## [1.0.9](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.8...@feathersjs/authentication-client@1.0.9) (2018-12-16) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## [1.0.8](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.7...@feathersjs/authentication-client@1.0.8) (2018-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## [1.0.7](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.6...@feathersjs/authentication-client@1.0.7) (2018-10-25) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) - - - -## [1.0.6](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.5...@feathersjs/authentication-client@1.0.6) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## [1.0.5](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.4...@feathersjs/authentication-client@1.0.5) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## [1.0.4](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.3...@feathersjs/authentication-client@1.0.4) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## 1.0.3 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.0.2](https://github.com/feathersjs/authentication-client/tree/v1.0.2) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v1.0.1...v1.0.2) - -**Closed issues:** - -- No Auth header added when sending 1st request [\#80](https://github.com/feathersjs/authentication-client/issues/80) - -**Merged pull requests:** - -- Update to correspond with latest release [\#84](https://github.com/feathersjs/authentication-client/pull/84) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#83](https://github.com/feathersjs/authentication-client/pull/83) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#82](https://github.com/feathersjs/authentication-client/pull/82) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.1](https://github.com/feathersjs/authentication-client/tree/v1.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#81](https://github.com/feathersjs/authentication-client/pull/81) ([daffl](https://github.com/daffl)) -- Update @feathersjs/authentication to the latest version 🚀 [\#79](https://github.com/feathersjs/authentication-client/pull/79) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0](https://github.com/feathersjs/authentication-client/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v1.0.0-pre.1...v1.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#78](https://github.com/feathersjs/authentication-client/pull/78) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/authentication-client/tree/v1.0.0-pre.1) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.3.3...v1.0.0-pre.1) - -**Closed issues:** - -- Error authenticating! Error: Token provided to verifyJWT is missing or not a string ? [\#73](https://github.com/feathersjs/authentication-client/issues/73) -- Authorization Header not sent!! [\#69](https://github.com/feathersjs/authentication-client/issues/69) -- users.get\(id\) failed \(Not authenticated\) after successful login. [\#66](https://github.com/feathersjs/authentication-client/issues/66) - -**Merged pull requests:** - -- Updates for Feathers v3 [\#77](https://github.com/feathersjs/authentication-client/pull/77) ([daffl](https://github.com/daffl)) -- Update Codeclimate token and badges [\#76](https://github.com/feathersjs/authentication-client/pull/76) ([daffl](https://github.com/daffl)) -- Rename repository and use npm scope [\#75](https://github.com/feathersjs/authentication-client/pull/75) ([daffl](https://github.com/daffl)) -- Update to new plugin infrastructure [\#74](https://github.com/feathersjs/authentication-client/pull/74) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#72](https://github.com/feathersjs/authentication-client/pull/72) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Add babel-polyfill and package-lock.json [\#68](https://github.com/feathersjs/authentication-client/pull/68) ([daffl](https://github.com/daffl)) -- Passport.verifyJWT should return Promise\, not Promise\ [\#65](https://github.com/feathersjs/authentication-client/pull/65) ([zxh19890103](https://github.com/zxh19890103)) -- Update debug to the latest version 🚀 [\#61](https://github.com/feathersjs/authentication-client/pull/61) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update ws to the latest version 🚀 [\#60](https://github.com/feathersjs/authentication-client/pull/60) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v0.3.3](https://github.com/feathersjs/authentication-client/tree/v0.3.3) (2017-07-18) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.3.2...v0.3.3) - -**Closed issues:** - -- An in-range update of feathers is breaking the build 🚨 [\#59](https://github.com/feathersjs/authentication-client/issues/59) -- An in-range update of feathers is breaking the build 🚨 [\#58](https://github.com/feathersjs/authentication-client/issues/58) - -**Merged pull requests:** - -- typings: add auth methods to feathers.Application interface [\#57](https://github.com/feathersjs/authentication-client/pull/57) ([j2L4e](https://github.com/j2L4e)) -- Update feathers-authentication-local to the latest version 🚀 [\#55](https://github.com/feathersjs/authentication-client/pull/55) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update chai to the latest version 🚀 [\#54](https://github.com/feathersjs/authentication-client/pull/54) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-socketio to the latest version 🚀 [\#50](https://github.com/feathersjs/authentication-client/pull/50) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update socket.io-client to the latest version 🚀 [\#49](https://github.com/feathersjs/authentication-client/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update README.md [\#47](https://github.com/feathersjs/authentication-client/pull/47) ([bertho-zero](https://github.com/bertho-zero)) - -## [v0.3.2](https://github.com/feathersjs/authentication-client/tree/v0.3.2) (2017-04-30) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.3.1...v0.3.2) - -**Closed issues:** - -- An in-range update of feathers-errors is breaking the build 🚨 [\#45](https://github.com/feathersjs/authentication-client/issues/45) -- Proper way to save jwt in cookies [\#41](https://github.com/feathersjs/authentication-client/issues/41) -- Allow customizing the `tokenField` [\#38](https://github.com/feathersjs/authentication-client/issues/38) -- Show blank page in safari@iOS 8.3 [\#37](https://github.com/feathersjs/authentication-client/issues/37) - -**Merged pull requests:** - -- Catch getJWT promise errors [\#46](https://github.com/feathersjs/authentication-client/pull/46) ([NikitaVlaznev](https://github.com/NikitaVlaznev)) -- Update semistandard to the latest version 🚀 [\#43](https://github.com/feathersjs/authentication-client/pull/43) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#42](https://github.com/feathersjs/authentication-client/pull/42) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#40](https://github.com/feathersjs/authentication-client/pull/40) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Note that auth must be configured after rest/socket clients [\#36](https://github.com/feathersjs/authentication-client/pull/36) ([hubgit](https://github.com/hubgit)) - -## [v0.3.1](https://github.com/feathersjs/authentication-client/tree/v0.3.1) (2017-03-10) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.3.0...v0.3.1) - -**Closed issues:** - -- The latest tag on NPM is wrong [\#35](https://github.com/feathersjs/authentication-client/issues/35) -- exp claim should be optional [\#33](https://github.com/feathersjs/authentication-client/issues/33) - -**Merged pull requests:** - -- Fix \#33 exp claim should be optional [\#34](https://github.com/feathersjs/authentication-client/pull/34) ([whollacsek](https://github.com/whollacsek)) - -## [v0.3.0](https://github.com/feathersjs/authentication-client/tree/v0.3.0) (2017-03-08) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.2.0...v0.3.0) - -## [v0.2.0](https://github.com/feathersjs/authentication-client/tree/v0.2.0) (2017-03-07) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.10...v0.2.0) - -**Closed issues:** - -- Support `authenticated` and `logout` client side events [\#29](https://github.com/feathersjs/authentication-client/issues/29) -- The default header mismatches the default feathers-authentication header [\#23](https://github.com/feathersjs/authentication-client/issues/23) -- Re-authenticating fails when passing options [\#22](https://github.com/feathersjs/authentication-client/issues/22) -- Socket.io timeout does nothing when there is JWT token available [\#19](https://github.com/feathersjs/authentication-client/issues/19) - -**Merged pull requests:** - -- Fix header casing [\#32](https://github.com/feathersjs/authentication-client/pull/32) ([daffl](https://github.com/daffl)) -- Add client side `authenticated` and `logout` events [\#31](https://github.com/feathersjs/authentication-client/pull/31) ([daffl](https://github.com/daffl)) -- Add support for socket timeouts and some refactoring [\#30](https://github.com/feathersjs/authentication-client/pull/30) ([daffl](https://github.com/daffl)) - -## [v0.1.10](https://github.com/feathersjs/authentication-client/tree/v0.1.10) (2017-03-03) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.9...v0.1.10) - -**Merged pull requests:** - -- Remove hardcoded values for Config and Credentials typings [\#28](https://github.com/feathersjs/authentication-client/pull/28) ([myknbani](https://github.com/myknbani)) - -## [v0.1.9](https://github.com/feathersjs/authentication-client/tree/v0.1.9) (2017-03-01) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.8...v0.1.9) - -**Merged pull requests:** - -- Typescript Definitions [\#25](https://github.com/feathersjs/authentication-client/pull/25) ([AbraaoAlves](https://github.com/AbraaoAlves)) - -## [v0.1.8](https://github.com/feathersjs/authentication-client/tree/v0.1.8) (2017-02-05) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.7...v0.1.8) - -**Closed issues:** - -- Uncaught TypeError: Cannot read property 'options' of undefined [\#26](https://github.com/feathersjs/authentication-client/issues/26) -- Browser Version [\#24](https://github.com/feathersjs/authentication-client/issues/24) - -**Merged pull requests:** - -- Hoist upgrade handler into current scope by using an arrow function [\#27](https://github.com/feathersjs/authentication-client/pull/27) ([daffl](https://github.com/daffl)) - -## [v0.1.7](https://github.com/feathersjs/authentication-client/tree/v0.1.7) (2017-01-29) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.6...v0.1.7) - -**Closed issues:** - -- \[Webpack\] TypeError: \_this4.storage.getItem is not a function [\#18](https://github.com/feathersjs/authentication-client/issues/18) -- \[Feature request\] Signup via socket [\#17](https://github.com/feathersjs/authentication-client/issues/17) -- Missing auth token when used with feathers-rest in comparison to feathers-socketio [\#16](https://github.com/feathersjs/authentication-client/issues/16) -- Cannot read property 'on' of undefined - feathers-authentication-client [\#12](https://github.com/feathersjs/authentication-client/issues/12) - -**Merged pull requests:** - -- Update passport.js [\#20](https://github.com/feathersjs/authentication-client/pull/20) ([bertho-zero](https://github.com/bertho-zero)) - -## [v0.1.6](https://github.com/feathersjs/authentication-client/tree/v0.1.6) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.5...v0.1.6) - -**Closed issues:** - -- `logout\(\)` doesn't resolve [\#10](https://github.com/feathersjs/authentication-client/issues/10) - -**Merged pull requests:** - -- Fix linting [\#13](https://github.com/feathersjs/authentication-client/pull/13) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.5](https://github.com/feathersjs/authentication-client/tree/v0.1.5) (2016-12-13) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.4...v0.1.5) - -## [v0.1.4](https://github.com/feathersjs/authentication-client/tree/v0.1.4) (2016-12-13) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.3...v0.1.4) - -**Closed issues:** - -- populateAccessToken tries to access non-existent property [\#11](https://github.com/feathersjs/authentication-client/issues/11) -- Socket client should automatically auth on reconnect [\#2](https://github.com/feathersjs/authentication-client/issues/2) - -**Merged pull requests:** - -- More specific imports for StealJS [\#14](https://github.com/feathersjs/authentication-client/pull/14) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.3](https://github.com/feathersjs/authentication-client/tree/v0.1.3) (2016-11-23) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.2...v0.1.3) - -**Closed issues:** - -- Client should ensure socket.io upgrade is complete before authenticating [\#4](https://github.com/feathersjs/authentication-client/issues/4) - -**Merged pull requests:** - -- Socket reconnect [\#9](https://github.com/feathersjs/authentication-client/pull/9) ([ekryski](https://github.com/ekryski)) - -## [v0.1.2](https://github.com/feathersjs/authentication-client/tree/v0.1.2) (2016-11-22) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.1...v0.1.2) - -**Merged pull requests:** - -- Custom jwt strategy names [\#8](https://github.com/feathersjs/authentication-client/pull/8) ([ekryski](https://github.com/ekryski)) - -## [v0.1.1](https://github.com/feathersjs/authentication-client/tree/v0.1.1) (2016-11-21) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.0...v0.1.1) - -**Merged pull requests:** - -- Socket reconnect upgrade auth [\#3](https://github.com/feathersjs/authentication-client/pull/3) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.0](https://github.com/feathersjs/authentication-client/tree/v0.1.0) (2016-11-18) - -**Closed issues:** - -- Relation with feathers-authentication [\#6](https://github.com/feathersjs/authentication-client/issues/6) -- Client: Docs for getJWT & verifyJWT [\#1](https://github.com/feathersjs/authentication-client/issues/1) - -**Merged pull requests:** - -- Feathers authentication 1.0 compatible client [\#7](https://github.com/feathersjs/authentication-client/pull/7) ([ekryski](https://github.com/ekryski)) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/authentication-client/LICENSE b/packages/authentication-client/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/authentication-client/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/authentication-client/README.md b/packages/authentication-client/README.md deleted file mode 100644 index aa47ecfb25..0000000000 --- a/packages/authentication-client/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/authentication-client - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/authentication-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication-client) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers authentication client - -## Installation - -``` -npm install @feathersjs/authentication-client --save -``` - -## Documentation - -Refer to the [Feathers authentication client API documentation](https://feathersjs.com/api/authentication/client.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-client/package.json b/packages/authentication-client/package.json deleted file mode 100644 index 97b453fd98..0000000000 --- a/packages/authentication-client/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "@feathersjs/authentication-client", - "description": "The authentication plugin for feathers-client", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/authentication-client" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/express": "^5.0.30", - "@feathersjs/memory": "^5.0.30", - "@feathersjs/rest-client": "^5.0.30", - "@feathersjs/socketio": "^5.0.30", - "@feathersjs/socketio-client": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "axios": "^1.7.7", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/authentication-client/src/core.ts b/packages/authentication-client/src/core.ts deleted file mode 100644 index cad7754e67..0000000000 --- a/packages/authentication-client/src/core.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { NotAuthenticated, FeathersError } from '@feathersjs/errors' -import { Application, Params } from '@feathersjs/feathers' -import { AuthenticationRequest, AuthenticationResult } from '@feathersjs/authentication' -import { Storage, StorageWrapper } from './storage' - -class OauthError extends FeathersError { - constructor(message: string, data?: any) { - super(message, 'OauthError', 401, 'oauth-error', data) - } -} - -const getMatch = (location: Location, key: string): [string, RegExp] => { - const regex = new RegExp(`(?:\&?)${key}=([^&]*)`) - const match = location.hash ? location.hash.match(regex) : null - - if (match !== null) { - const [, value] = match - - return [value, regex] - } - - return [null, regex] -} - -export type ClientConstructor = new ( - app: Application, - options: AuthenticationClientOptions -) => AuthenticationClient - -export interface AuthenticationClientOptions { - storage: Storage - header: string - scheme: string - storageKey: string - locationKey: string - locationErrorKey: string - jwtStrategy: string - path: string - Authentication: ClientConstructor -} - -export class AuthenticationClient { - app: Application - authenticated: boolean - options: AuthenticationClientOptions - - constructor(app: Application, options: AuthenticationClientOptions) { - const socket = app.io - const storage = new StorageWrapper(app.get('storage') || options.storage) - - this.app = app - this.options = options - this.authenticated = false - this.app.set('storage', storage) - - if (socket) { - this.handleSocket(socket) - } - } - - get service() { - return this.app.service(this.options.path) - } - - get storage() { - return this.app.get('storage') as Storage - } - - handleSocket(socket: any) { - // When the socket disconnects and we are still authenticated, try to reauthenticate right away - // the websocket connection will handle timeouts and retries - socket.on('disconnect', () => { - if (this.authenticated) { - this.reAuthenticate(true) - } - }) - } - - /** - * Parse the access token or authentication error from the window location hash. Will remove it from the hash - * if found. - * - * @param location The window location - * @returns The access token if available, will throw an error if found, otherwise null - */ - getFromLocation(location: Location) { - const [accessToken, tokenRegex] = getMatch(location, this.options.locationKey) - - if (accessToken !== null) { - location.hash = location.hash.replace(tokenRegex, '') - - return Promise.resolve(accessToken) - } - - const [message, errorRegex] = getMatch(location, this.options.locationErrorKey) - - if (message !== null) { - location.hash = location.hash.replace(errorRegex, '') - - return Promise.reject(new OauthError(decodeURIComponent(message))) - } - - return Promise.resolve(null) - } - - /** - * Set the access token in storage. - * - * @param accessToken The access token to set - * @returns - */ - setAccessToken(accessToken: string) { - return this.storage.setItem(this.options.storageKey, accessToken) - } - - /** - * Returns the access token from storage or the window location hash. - * - * @returns The access token from storage or location hash - */ - getAccessToken(): Promise { - return this.storage.getItem(this.options.storageKey).then((accessToken: string) => { - if (!accessToken && typeof window !== 'undefined' && window.location) { - return this.getFromLocation(window.location) - } - - return accessToken || null - }) - } - - /** - * Remove the access token from storage - * @returns The removed access token - */ - removeAccessToken() { - return this.storage.removeItem(this.options.storageKey) - } - - /** - * Reset the internal authentication state. Usually not necessary to call directly. - * - * @returns null - */ - reset() { - this.app.set('authentication', null) - this.authenticated = false - - return Promise.resolve(null) - } - - handleError(error: FeathersError, type: 'authenticate' | 'logout') { - // For NotAuthenticated, PaymentError, Forbidden, NotFound, MethodNotAllowed, NotAcceptable - // errors, remove the access token - if (error.code > 400 && error.code < 408) { - const promise = this.removeAccessToken().then(() => this.reset()) - - return type === 'logout' ? promise : promise.then(() => Promise.reject(error)) - } - - return this.reset().then(() => Promise.reject(error)) - } - - /** - * Try to reauthenticate using the token from storage. Will do nothing if already authenticated unless - * `force` is true. - * - * @param force force reauthentication with the server - * @param strategy The name of the strategy to use. Defaults to `options.jwtStrategy` - * @param authParams Additional authentication parameters - * @returns The reauthentication result - */ - reAuthenticate(force = false, strategy?: string, authParams?: Params): Promise { - // Either returns the authentication state or - // tries to re-authenticate with the stored JWT and strategy - let authPromise = this.app.get('authentication') - - if (!authPromise || force === true) { - authPromise = this.getAccessToken().then((accessToken) => { - if (!accessToken) { - return this.handleError(new NotAuthenticated('No accessToken found in storage'), 'authenticate') - } - - return this.authenticate( - { - strategy: strategy || this.options.jwtStrategy, - accessToken - }, - authParams - ) - }) - this.app.set('authentication', authPromise) - } - - return authPromise - } - - /** - * Authenticate using a specific strategy and data. - * - * @param authentication The authentication data - * @param params Additional parameters - * @returns The authentication result - */ - authenticate(authentication?: AuthenticationRequest, params?: Params): Promise { - if (!authentication) { - return this.reAuthenticate() - } - - const promise = this.service - .create(authentication, params) - .then((authResult: AuthenticationResult) => { - const { accessToken } = authResult - - this.authenticated = true - this.app.emit('login', authResult) - this.app.emit('authenticated', authResult) - - return this.setAccessToken(accessToken).then(() => authResult) - }) - .catch((error: FeathersError) => this.handleError(error, 'authenticate')) - - this.app.set('authentication', promise) - - return promise - } - - /** - * Log out the current user and remove their token. Will do nothing - * if not authenticated. - * - * @returns The log out result. - */ - logout(): Promise { - return Promise.resolve(this.app.get('authentication')) - .then(() => - this.service.remove(null).then((authResult: AuthenticationResult) => - this.removeAccessToken() - .then(() => this.reset()) - .then(() => { - this.app.emit('logout', authResult) - - return authResult - }) - ) - ) - .catch((error: FeathersError) => this.handleError(error, 'logout')) - } -} diff --git a/packages/authentication-client/src/hooks/authentication.ts b/packages/authentication-client/src/hooks/authentication.ts deleted file mode 100644 index bba7b2dc2d..0000000000 --- a/packages/authentication-client/src/hooks/authentication.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { stripSlashes } from '@feathersjs/commons' - -export const authentication = () => { - return (context: HookContext, next: NextFunction) => { - const { - app, - params, - path, - method, - app: { authentication: service } - } = context - - if (stripSlashes(service.options.path) === path && method === 'create') { - return next() - } - - return Promise.resolve(app.get('authentication')) - .then((authResult) => { - if (authResult) { - context.params = Object.assign({}, authResult, params) - } - }) - .then(next) - } -} diff --git a/packages/authentication-client/src/hooks/index.ts b/packages/authentication-client/src/hooks/index.ts deleted file mode 100644 index ef7cf4ea53..0000000000 --- a/packages/authentication-client/src/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { authentication } from './authentication' -export { populateHeader } from './populate-header' diff --git a/packages/authentication-client/src/hooks/populate-header.ts b/packages/authentication-client/src/hooks/populate-header.ts deleted file mode 100644 index 1b4776187a..0000000000 --- a/packages/authentication-client/src/hooks/populate-header.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' - -export const populateHeader = () => { - return (context: HookContext, next: NextFunction) => { - const { - app, - params: { accessToken } - } = context - const authentication = app.authentication - - // Set REST header if necessary - if (app.rest && accessToken) { - const { scheme, header } = authentication.options - const authHeader = `${scheme} ${accessToken}` - - context.params.headers = Object.assign( - {}, - { - [header]: authHeader - }, - context.params.headers - ) - } - - return next() - } -} diff --git a/packages/authentication-client/src/index.ts b/packages/authentication-client/src/index.ts deleted file mode 100644 index 5ab704a8d7..0000000000 --- a/packages/authentication-client/src/index.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { AuthenticationClient, AuthenticationClientOptions } from './core' -import * as hooks from './hooks' -import { Application } from '@feathersjs/feathers' -import { Storage, MemoryStorage, StorageWrapper } from './storage' - -declare module '@feathersjs/feathers/lib/declarations' { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface Application { - // eslint-disable-line - io: any - rest?: any - authentication: AuthenticationClient - authenticate: AuthenticationClient['authenticate'] - reAuthenticate: AuthenticationClient['reAuthenticate'] - logout: AuthenticationClient['logout'] - } -} - -export const getDefaultStorage = () => { - try { - return new StorageWrapper(window.localStorage) - } catch (error: any) {} - - return new MemoryStorage() -} - -export { AuthenticationClient, AuthenticationClientOptions, Storage, MemoryStorage, hooks } - -export type ClientConstructor = new ( - app: Application, - options: AuthenticationClientOptions -) => AuthenticationClient - -export const defaultStorage: Storage = getDefaultStorage() - -export const defaults: AuthenticationClientOptions = { - header: 'Authorization', - scheme: 'Bearer', - storageKey: 'feathers-jwt', - locationKey: 'access_token', - locationErrorKey: 'error', - jwtStrategy: 'jwt', - path: '/authentication', - Authentication: AuthenticationClient, - storage: defaultStorage -} - -const init = (_options: Partial = {}) => { - const options: AuthenticationClientOptions = Object.assign({}, defaults, _options) - const { Authentication } = options - - return (app: Application) => { - const authentication = new Authentication(app, options) - - app.authentication = authentication - app.authenticate = authentication.authenticate.bind(authentication) - app.reAuthenticate = authentication.reAuthenticate.bind(authentication) - app.logout = authentication.logout.bind(authentication) - - app.hooks([hooks.authentication(), hooks.populateHeader()]) - } -} - -export default init - -if (typeof module !== 'undefined') { - module.exports = Object.assign(init, module.exports) -} diff --git a/packages/authentication-client/src/storage.ts b/packages/authentication-client/src/storage.ts deleted file mode 100644 index f344eabee6..0000000000 --- a/packages/authentication-client/src/storage.ts +++ /dev/null @@ -1,49 +0,0 @@ -export interface Storage { - getItem(key: string): any - setItem?(key: string, value: any): any - removeItem?(key: string): any -} - -export class MemoryStorage implements Storage { - store: { [key: string]: any } - - constructor() { - this.store = {} - } - - getItem(key: string) { - return Promise.resolve(this.store[key]) - } - - setItem(key: string, value: any) { - return Promise.resolve((this.store[key] = value)) - } - - removeItem(key: string) { - const value = this.store[key] - - delete this.store[key] - - return Promise.resolve(value) - } -} - -export class StorageWrapper implements Storage { - storage: any - - constructor(storage: any) { - this.storage = storage - } - - getItem(key: string) { - return Promise.resolve(this.storage?.getItem(key)) - } - - setItem(key: string, value: any) { - return Promise.resolve(this.storage?.setItem(key, value)) - } - - removeItem(key: string) { - return Promise.resolve(this.storage?.removeItem(key)) - } -} diff --git a/packages/authentication-client/test/index.test.ts b/packages/authentication-client/test/index.test.ts deleted file mode 100644 index 1720b45a4e..0000000000 --- a/packages/authentication-client/test/index.test.ts +++ /dev/null @@ -1,247 +0,0 @@ -import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' - -import client from '../src' -import { AuthenticationClient } from '../src' -import { NotAuthenticated } from '@feathersjs/errors' - -describe('@feathersjs/authentication-client', () => { - const accessToken = 'testing' - const user = { - name: 'Test User' - } - let app: Application - - beforeEach(() => { - app = feathers() - - app.configure(client()) - app.use('/authentication', { - async create(data: any) { - if (data.error) { - throw new Error('Did not work') - } - - return { - accessToken, - data, - user - } - }, - - async remove(id) { - if (!app.get('authentication')) { - throw new NotAuthenticated('Not logged in') - } - - return { id } - } - }) - app.use('dummy', { - async find(params) { - return params - } - }) - }) - - it('initializes', () => { - assert.ok(app.authentication instanceof AuthenticationClient) - assert.strictEqual(app.get('storage'), app.authentication.storage) - assert.strictEqual(typeof app.authenticate, 'function') - assert.strictEqual(typeof app.logout, 'function') - }) - - it('setAccessToken, getAccessToken, removeAccessToken', async () => { - const auth = app.authentication - const token = 'hi' - - await auth.setAccessToken(token) - - const res = await auth.getAccessToken() - - assert.strictEqual(res, token) - - await auth.removeAccessToken() - assert.strictEqual(await auth.getAccessToken(), null) - }) - - it('getFromLocation', async () => { - const auth = app.authentication - let dummyLocation = { hash: 'access_token=testing' } as Location - - let token = await auth.getFromLocation(dummyLocation) - - assert.strictEqual(token, 'testing') - assert.strictEqual(dummyLocation.hash, '') - - dummyLocation.hash = 'a=b&access_token=otherTest&c=d' - token = await auth.getFromLocation(dummyLocation) - - assert.strictEqual(token, 'otherTest') - assert.strictEqual(dummyLocation.hash, 'a=b&c=d') - - dummyLocation = { search: 'access_token=testing' } as Location - token = await auth.getFromLocation(dummyLocation) - - assert.strictEqual(await auth.getFromLocation({} as Location), null) - - try { - await auth.getFromLocation({ - hash: 'error=Error Happened&x=y' - } as Location) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'OauthError') - assert.strictEqual(error.message, 'Error Happened') - } - }) - - it('authenticate, authentication hook, login event', async () => { - const data = { - strategy: 'testing' - } - - const promise = new Promise((resolve) => { - app.once('login', resolve) - }) - - app.authenticate(data) - - const result = await promise - - assert.deepStrictEqual(result, { - accessToken, - data, - user - }) - - let at = await app.authentication.getAccessToken() - - assert.strictEqual(at, accessToken, 'Set accessToken in storage') - - at = await Promise.resolve(app.get('storage').getItem('feathers-jwt')) - - assert.strictEqual(at, accessToken, 'Set accessToken in storage') - - const found = await app.service('dummy').find() - assert.deepStrictEqual(found.accessToken, accessToken) - assert.deepStrictEqual(found.user, user) - }) - - it('logout event', async () => { - const promise = new Promise((resolve) => app.once('logout', resolve)) - - app.authenticate({ strategy: 'testing' }).then(() => app.logout()) - - const result = await promise - - assert.deepStrictEqual(result, { id: null }) - }) - - it('does not remove AccessToken on other errors', async () => { - await app.authenticate({ strategy: 'testing' }) - await app.authenticate({ strategy: 'testing' }) - - const at = await app.authentication.getAccessToken() - - assert.strictEqual(at, accessToken) - }) - - it('resets after any error (#1947)', async () => { - await assert.rejects(() => app.authenticate({ strategy: 'testing', error: true }), { - message: 'Did not work' - }) - - const found = await app.service('dummy').find() - - assert.deepStrictEqual(found, {}) - }) - - it('logout when not logged in without error', async () => { - const result = await app.logout() - - assert.strictEqual(result, null) - }) - - describe('reauthenticate', () => { - it('fails when no token in storage and resets authentication state', async () => { - await assert.rejects(() => app.authentication.reAuthenticate(), { - message: 'No accessToken found in storage' - }) - assert.ok(!app.get('authentication'), 'Reset authentication') - }) - - it('reauthenticates when token is in storage', async () => { - const data = { - strategy: 'testing' - } - - const result = await app.authenticate(data) - - assert.deepStrictEqual(result, { - accessToken, - data, - user - }) - await app.authentication.reAuthenticate() - await app.authentication.reset() - - let at = await Promise.resolve(app.get('storage').getItem('feathers-jwt')) - - assert.strictEqual(at, accessToken, 'Set accessToken in storage') - - at = await app.authentication.reAuthenticate() - - assert.deepStrictEqual(at, { - accessToken, - data: { strategy: 'jwt', accessToken: 'testing' }, - user - }) - - await app.logout() - - at = await Promise.resolve(app.get('storage').getItem('feathers-jwt')) - assert.ok(!at) - assert.ok(!app.get('authentication')) - }) - - it('reAuthenticate works with parallel requests', async () => { - const data = { - strategy: 'testing' - } - - await app.authenticate(data) - await app.reAuthenticate() - await app.authentication.reset() - - app.reAuthenticate() - - const found = await app.service('dummy').find() - - assert.deepStrictEqual(found.accessToken, accessToken) - assert.deepStrictEqual(found.user, user) - }) - - it('reauthenticates using different strategy', async () => { - app.configure(client({ jwtStrategy: 'any' })) - - const data = { - strategy: 'testing' - } - - let result = await app.authenticate(data) - assert.deepStrictEqual(result, { - accessToken, - data, - user - }) - - result = await app.authentication.reAuthenticate(false, 'jwt') - assert.deepStrictEqual(result, { - accessToken, - data, - user - }) - }) - }) -}) diff --git a/packages/authentication-client/test/integration/commons.ts b/packages/authentication-client/test/integration/commons.ts deleted file mode 100644 index 4973530792..0000000000 --- a/packages/authentication-client/test/integration/commons.ts +++ /dev/null @@ -1,118 +0,0 @@ -import assert from 'assert' -import { Application } from '@feathersjs/feathers' -import '../../src' - -export default ( - getApp: () => Application, - getClient: () => Application, - { provider, email, password }: { provider: string; email: string; password: string } -) => { - describe('common tests', () => { - let client: Application - let user: any - - before( - async () => - (user = await getApp().service('users').create({ - email, - password - })) - ) - - beforeEach(() => { - client = getClient() - }) - - after(async () => { - await getApp().service('users').remove(user.id) - }) - - it('authenticates with local strategy', async () => { - const result = await client.authenticate({ - strategy: 'local', - email, - password - }) - - assert.ok(result.accessToken) - assert.strictEqual(result.authentication.strategy, 'local') - assert.strictEqual(result.user.email, email) - }) - - it('authentication with wrong credentials fails, does not maintain state', async () => { - await assert.rejects( - () => - client.authenticate({ - strategy: 'local', - email, - password: 'blabla' - }), - { - name: 'NotAuthenticated', - message: 'Invalid login' - } - ) - assert.ok(!client.get('authentication'), 'Reset client state') - }) - - it('errors when not authenticated', async () => { - await assert.rejects(() => client.service('dummy').find(), { - name: 'NotAuthenticated', - code: 401, - message: 'Not authenticated' - }) - }) - - it('authenticates and allows access', async () => { - await client.authenticate({ - strategy: 'local', - email, - password - }) - const result = await client.service('dummy').find() - - assert.strictEqual(result.provider, provider) - assert.ok(result.authentication) - assert.ok(result.authentication.payload) - assert.strictEqual(result.user.email, user.email) - assert.strictEqual(result.user.id, user.id) - }) - - it('re-authenticates', async () => { - await client.authenticate({ - strategy: 'local', - email, - password - }) - - client.authentication.reset() - client.authenticate() - const result = await client.service('dummy').find() - - assert.strictEqual(result.provider, provider) - assert.ok(result.authentication) - assert.ok(result.authentication.payload) - assert.strictEqual(result.user.email, user.email) - assert.strictEqual(result.user.id, user.id) - }) - - it('after logout does not allow subsequent access', async () => { - await client.authenticate({ - strategy: 'local', - email, - password - }) - - const result = await client.logout() - - assert.ok(result!.accessToken) - assert.ok(result!.user) - - assert.rejects(() => client.service('dummy').find(), { - name: 'NotAuthenticated', - code: 401, - message: 'Not authenticated' - }) - }) - }) -} diff --git a/packages/authentication-client/test/integration/express.test.ts b/packages/authentication-client/test/integration/express.test.ts deleted file mode 100644 index e5f7709c6b..0000000000 --- a/packages/authentication-client/test/integration/express.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import axios from 'axios' -import { Server } from 'http' -import { feathers, Application as FeathersApplication } from '@feathersjs/feathers' -import * as express from '@feathersjs/express' -import rest from '@feathersjs/rest-client' - -import authClient from '../../src' -import getApp from './fixture' -import commonTests from './commons' - -describe('@feathersjs/authentication-client Express integration', () => { - let app: express.Application - let server: Server - - before(async () => { - const restApp = express - .default(feathers()) - .use(express.json()) - .configure(express.rest()) - .use(express.parseAuthentication()) - app = getApp(restApp as unknown as FeathersApplication) as express.Application - app.use(express.errorHandler()) - - server = await app.listen(9776) - }) - - after((done) => server.close(() => done())) - - commonTests( - () => app, - () => { - return feathers().configure(rest('http://localhost:9776').axios(axios)).configure(authClient()) - }, - { - email: 'expressauth@feathersjs.com', - password: 'secret', - provider: 'rest' - } - ) -}) diff --git a/packages/authentication-client/test/integration/fixture.ts b/packages/authentication-client/test/integration/fixture.ts deleted file mode 100644 index 1ecef9f9b0..0000000000 --- a/packages/authentication-client/test/integration/fixture.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { authenticate } from '@feathersjs/authentication' -import { HookContext, Application } from '@feathersjs/feathers' -import { memory } from '@feathersjs/memory' -import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' -import { LocalStrategy, hooks } from '@feathersjs/authentication-local' - -const { hashPassword, protect } = hooks - -export default (app: Application) => { - const authentication = new AuthenticationService(app) - - app.set('authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['local', 'jwt'], - local: { - usernameField: 'email', - passwordField: 'password' - } - }) - - authentication.register('jwt', new JWTStrategy()) - authentication.register('local', new LocalStrategy()) - - app.use('/authentication', authentication) - app.use( - '/users', - memory({ - paginate: { - default: 10, - max: 20 - } - }) - ) - - app.service('users').hooks({ - before: { - create: hashPassword('password') - }, - after: protect('password') - }) - - app.use('/dummy', { - find(params) { - return Promise.resolve(params) - } - }) - - app.service('dummy').hooks({ - before: authenticate('jwt') - }) - - app.service('users').hooks({ - before(context: HookContext) { - if (context.id !== undefined && context.id !== null) { - context.id = parseInt(context.id as string, 10) - } - - return context - } - }) - - return app -} diff --git a/packages/authentication-client/test/integration/socketio.test.ts b/packages/authentication-client/test/integration/socketio.test.ts deleted file mode 100644 index da4bd2e7cd..0000000000 --- a/packages/authentication-client/test/integration/socketio.test.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { io } from 'socket.io-client' -import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' -import socketio from '@feathersjs/socketio' -import socketioClient from '@feathersjs/socketio-client' - -import authClient from '../../src' -import getApp from './fixture' -import commonTests from './commons' -import { AuthenticationResult } from '@feathersjs/authentication/lib' - -describe('@feathersjs/authentication-client Socket.io integration', () => { - let app: Application - - before(async () => { - app = getApp(feathers().configure(socketio())) - - await app.listen(9777) - }) - - after((done) => app.io.close(() => done())) - - it('allows to authenticate with handshake headers and sends login event', async () => { - const user = { email: 'authtest@example.com', password: 'alsosecret' } - - await app.service('users').create(user) - - const { accessToken } = await app.service('authentication').create({ - strategy: 'local', - ...user - }) - - const socket = io('http://localhost:9777', { - transports: ['websocket'], - transportOptions: { - websocket: { - extraHeaders: { - Authorization: `Bearer ${accessToken}` - } - } - } - }) - const authResult: any = await new Promise((resolve) => app.once('login', (res) => resolve(res))) - - assert.strictEqual(authResult.accessToken, accessToken) - - const dummy: any = await new Promise((resolve, reject) => { - socket.emit('find', 'dummy', {}, (error: Error, page: any) => (error ? reject(error) : resolve(page))) - }) - - assert.strictEqual(dummy.user.email, user.email) - assert.strictEqual(dummy.authentication.accessToken, accessToken) - assert.strictEqual(dummy.headers.authorization, `Bearer ${accessToken}`) - }) - - it('reconnects after socket disconnection', async () => { - const user = { email: 'disconnecttest@example.com', password: 'alsosecret' } - const socket = io('http://localhost:9777', { - timeout: 500, - reconnection: true, - reconnectionDelay: 100 - }) - const client = feathers().configure(socketioClient(socket)).configure(authClient()) - - await app.service('users').create(user) - await client.authenticate({ - strategy: 'local', - ...user - }) - - const onLogin = new Promise((resolve) => app.once('login', (data) => resolve(data))) - - socket.once('disconnect', () => socket.connect()) - socket.disconnect() - - const { - authentication: { strategy } - } = await onLogin - const dummy = await client.service('dummy').find() - - assert.strictEqual(strategy, 'jwt') - assert.strictEqual(dummy.user.email, user.email) - }) - - commonTests( - () => app, - () => { - return feathers() - .configure(socketioClient(io('http://localhost:9777'))) - .configure(authClient()) - }, - { - email: 'socketioauth@feathersjs.com', - password: 'secretive', - provider: 'socketio' - } - ) -}) diff --git a/packages/authentication-client/tsconfig.json b/packages/authentication-client/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/authentication-client/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/authentication-local/CHANGELOG.md b/packages/authentication-local/CHANGELOG.md deleted file mode 100644 index d5ee7b605b..0000000000 --- a/packages/authentication-local/CHANGELOG.md +++ /dev/null @@ -1,827 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -### Bug Fixes - -- **authentication-local:** Local Auth - Nested username & Password fields ([#3091](https://github.com/feathersjs/feathers/issues/3091)) ([d135526](https://github.com/feathersjs/feathers/commit/d135526da18ecf2dc620b82820e1d09d8af5c0b5)) - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Features - -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **authentication-local:** Add passwordHash property resolver ([#2660](https://github.com/feathersjs/feathers/issues/2660)) ([b41279b](https://github.com/feathersjs/feathers/commit/b41279b55eea3771a6fa4983a37be2413287bbc6)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Features - -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -### Bug Fixes - -- **hooks:** Allow all built-in hooks to be used the async and regular way ([#2559](https://github.com/feathersjs/feathers/issues/2559)) ([8f9f631](https://github.com/feathersjs/feathers/commit/8f9f631e0ce89de349207db72def84e7ab496a4a)) - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -### Bug Fixes - -- **authentication-local:** adds error handling for undefined/null password field ([#2444](https://github.com/feathersjs/feathers/issues/2444)) ([4323f98](https://github.com/feathersjs/feathers/commit/4323f9859a66a7fe3f7f15d81476bd81b735c226)) - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **hooks:** Migrate built-in hooks and allow backwards compatibility ([#2358](https://github.com/feathersjs/feathers/issues/2358)) ([759c5a1](https://github.com/feathersjs/feathers/commit/759c5a19327a731af965c3604119393b3d09a406)) -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -### Bug Fixes - -- **authentication:** Add JWT getEntityQuery ([#2013](https://github.com/feathersjs/feathers/issues/2013)) ([e0e7fb5](https://github.com/feathersjs/feathers/commit/e0e7fb5162940fe776731283b40026c61d9c8a33)) - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -### Bug Fixes - -- **authentication-local:** Allow to hash passwords in array data ([#1936](https://github.com/feathersjs/feathers/issues/1936)) ([64705f5](https://github.com/feathersjs/feathers/commit/64705f5d9d4dc27f799da3a074efaf74379a3398)) - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -### Bug Fixes - -- **test:** typo in password ([#1797](https://github.com/feathersjs/feathers/issues/1797)) ([dfba6ec](https://github.com/feathersjs/feathers/commit/dfba6ec2f21adf3aa739218cf870eaaaa5df6e9c)) - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Features - -- **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -### Bug Fixes - -- LocalStrategy authenticates without username ([#1560](https://github.com/feathersjs/feathers/issues/1560)) ([2b258fd](https://github.com/feathersjs/feathers/commit/2b258fd)), closes [#1559](https://github.com/feathersjs/feathers/issues/1559) - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -### Bug Fixes - -- Always require strategy parameter in authentication ([#1327](https://github.com/feathersjs/feathers/issues/1327)) ([d4a8021](https://github.com/feathersjs/feathers/commit/d4a8021)) -- Improve authentication parameter handling ([#1333](https://github.com/feathersjs/feathers/issues/1333)) ([6e77204](https://github.com/feathersjs/feathers/commit/6e77204)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) -- Rename jwtStrategies option to authStrategies ([#1305](https://github.com/feathersjs/feathers/issues/1305)) ([4aee151](https://github.com/feathersjs/feathers/commit/4aee151)) - -### Features - -- Change and *JWT methods to *accessToken ([#1304](https://github.com/feathersjs/feathers/issues/1304)) ([5ac826b](https://github.com/feathersjs/feathers/commit/5ac826b)) - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Bug Fixes - -- Authentication core improvements ([#1260](https://github.com/feathersjs/feathers/issues/1260)) ([c5dc7a2](https://github.com/feathersjs/feathers/commit/c5dc7a2)) -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **package:** update debug to version 3.0.0 ([#31](https://github.com/feathersjs/feathers/issues/31)) ([f23d617](https://github.com/feathersjs/feathers/commit/f23d617)) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) -- Add AuthenticationBaseStrategy and make authentication option handling more explicit ([#1284](https://github.com/feathersjs/feathers/issues/1284)) ([2667d92](https://github.com/feathersjs/feathers/commit/2667d92)) -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) -- Authentication v3 local authentication ([#1211](https://github.com/feathersjs/feathers/issues/1211)) ([0fa5f7c](https://github.com/feathersjs/feathers/commit/0fa5f7c)) - -### BREAKING CHANGES - -- Update authentication strategies for @feathersjs/authentication v3 - -## [1.2.9](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.8...@feathersjs/authentication-local@1.2.9) (2019-01-02) - -### Bug Fixes - -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) - - - -## [1.2.8](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.7...@feathersjs/authentication-local@1.2.8) (2018-12-16) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## [1.2.7](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.6...@feathersjs/authentication-local@1.2.7) (2018-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## [1.2.6](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.5...@feathersjs/authentication-local@1.2.6) (2018-10-25) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) - - - -## [1.2.5](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.4...@feathersjs/authentication-local@1.2.5) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## [1.2.4](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.3...@feathersjs/authentication-local@1.2.4) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## [1.2.3](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.2...@feathersjs/authentication-local@1.2.3) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## 1.2.2 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.2.1](https://github.com/feathersjs/authentication-local/tree/v1.2.1) (2018-05-02) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.2.0...v1.2.1) - -**Merged pull requests:** - -- Make sure the original object is not modified [\#65](https://github.com/feathersjs/authentication-local/pull/65) ([daffl](https://github.com/daffl)) - -## [v1.2.0](https://github.com/feathersjs/authentication-local/tree/v1.2.0) (2018-05-02) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.3...v1.2.0) - -**Merged pull requests:** - -- added support for nested password fields option in hash password hook [\#64](https://github.com/feathersjs/authentication-local/pull/64) ([ThePesta](https://github.com/ThePesta)) - -## [v1.1.3](https://github.com/feathersjs/authentication-local/tree/v1.1.3) (2018-04-20) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.2...v1.1.3) - -**Merged pull requests:** - -- Adding tests and calling to hasOwnProperty on Object.prototype instead of assuming valid prototype [\#63](https://github.com/feathersjs/authentication-local/pull/63) ([pmabres](https://github.com/pmabres)) - -## [v1.1.2](https://github.com/feathersjs/authentication-local/tree/v1.1.2) (2018-04-15) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.1...v1.1.2) - -**Closed issues:** - -- Protect hooks does not support dot notation [\#61](https://github.com/feathersjs/authentication-local/issues/61) - -**Merged pull requests:** - -- Use latest version of Lodash [\#62](https://github.com/feathersjs/authentication-local/pull/62) ([daffl](https://github.com/daffl)) - -## [v1.1.1](https://github.com/feathersjs/authentication-local/tree/v1.1.1) (2018-03-25) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.0...v1.1.1) - -**Closed issues:** - -- hash-password hook will skip users if they are missing password [\#58](https://github.com/feathersjs/authentication-local/issues/58) -- User service create method gets called upon each validation [\#56](https://github.com/feathersjs/authentication-local/issues/56) - -**Merged pull requests:** - -- Do not skip users that have no password [\#60](https://github.com/feathersjs/authentication-local/pull/60) ([daffl](https://github.com/daffl)) -- Update sinon to the latest version 🚀 [\#59](https://github.com/feathersjs/authentication-local/pull/59) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update sinon-chai to the latest version 🚀 [\#57](https://github.com/feathersjs/authentication-local/pull/57) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.1.0](https://github.com/feathersjs/authentication-local/tree/v1.1.0) (2018-01-23) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.4...v1.1.0) - -**Closed issues:** - -- protect hook attempts to map through 'result.data' on all service methods. [\#53](https://github.com/feathersjs/authentication-local/issues/53) -- Protect hook should check for toJSON [\#48](https://github.com/feathersjs/authentication-local/issues/48) - -**Merged pull requests:** - -- Use .toJSON if available [\#55](https://github.com/feathersjs/authentication-local/pull/55) ([daffl](https://github.com/daffl)) -- Only map data for find method [\#54](https://github.com/feathersjs/authentication-local/pull/54) ([daffl](https://github.com/daffl)) -- Update @feathersjs/authentication-jwt to the latest version 🚀 [\#52](https://github.com/feathersjs/authentication-local/pull/52) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update mocha to the latest version 🚀 [\#51](https://github.com/feathersjs/authentication-local/pull/51) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.4](https://github.com/feathersjs/authentication-local/tree/v1.0.4) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.3...v1.0.4) - -## [v1.0.3](https://github.com/feathersjs/authentication-local/tree/v1.0.3) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.2...v1.0.3) - -**Closed issues:** - -- local authentication bug with users as sequelize service [\#47](https://github.com/feathersjs/authentication-local/issues/47) - -**Merged pull requests:** - -- Update documentation to correspond with latest release [\#50](https://github.com/feathersjs/authentication-local/pull/50) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#49](https://github.com/feathersjs/authentication-local/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.2](https://github.com/feathersjs/authentication-local/tree/v1.0.2) (2017-12-06) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.1...v1.0.2) - -**Closed issues:** - -- why is the password send as plain text instead of encrypting it on client side? [\#44](https://github.com/feathersjs/authentication-local/issues/44) - -**Merged pull requests:** - -- Update hook.result if an external provider is set [\#46](https://github.com/feathersjs/authentication-local/pull/46) ([daffl](https://github.com/daffl)) -- Update feathers-memory to the latest version 🚀 [\#45](https://github.com/feathersjs/authentication-local/pull/45) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.1](https://github.com/feathersjs/authentication-local/tree/v1.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#43](https://github.com/feathersjs/authentication-local/pull/43) ([daffl](https://github.com/daffl)) -- Update @feathersjs/authentication to the latest version 🚀 [\#42](https://github.com/feathersjs/authentication-local/pull/42) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0](https://github.com/feathersjs/authentication-local/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.0-pre.2...v1.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#41](https://github.com/feathersjs/authentication-local/pull/41) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.2](https://github.com/feathersjs/authentication-local/tree/v1.0.0-pre.2) (2017-10-27) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.0-pre.1...v1.0.0-pre.2) - -**Merged pull requests:** - -- Safely dispatch without password [\#40](https://github.com/feathersjs/authentication-local/pull/40) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/authentication-local/tree/v1.0.0-pre.1) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.4...v1.0.0-pre.1) - -**Closed issues:** - -- How configure local strategy to feathers-authentication? [\#36](https://github.com/feathersjs/authentication-local/issues/36) -- An in-range update of feathers is breaking the build 🚨 [\#32](https://github.com/feathersjs/authentication-local/issues/32) - -**Merged pull requests:** - -- Update to Feathers v3 [\#39](https://github.com/feathersjs/authentication-local/pull/39) ([daffl](https://github.com/daffl)) -- Rename repository and use npm scope [\#38](https://github.com/feathersjs/authentication-local/pull/38) ([daffl](https://github.com/daffl)) -- Update to new plugin infrastructure [\#37](https://github.com/feathersjs/authentication-local/pull/37) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#35](https://github.com/feathersjs/authentication-local/pull/35) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update sinon to the latest version 🚀 [\#34](https://github.com/feathersjs/authentication-local/pull/34) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Add babel-polyfill and package-lock.json [\#33](https://github.com/feathersjs/authentication-local/pull/33) ([daffl](https://github.com/daffl)) -- Update sinon to the latest version 🚀 [\#29](https://github.com/feathersjs/authentication-local/pull/29) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v0.4.4](https://github.com/feathersjs/authentication-local/tree/v0.4.4) (2017-08-11) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.3...v0.4.4) - -**Closed issues:** - -- i18n support [\#28](https://github.com/feathersjs/authentication-local/issues/28) -- Couldn't store jwt token in cookies [\#17](https://github.com/feathersjs/authentication-local/issues/17) -- Strategy for subapp [\#9](https://github.com/feathersjs/authentication-local/issues/9) - -**Merged pull requests:** - -- Update debug to the latest version 🚀 [\#31](https://github.com/feathersjs/authentication-local/pull/31) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Increase bcrypt cost factor, add future cost factor auto-optimization [\#30](https://github.com/feathersjs/authentication-local/pull/30) ([micaksica2](https://github.com/micaksica2)) - -## [v0.4.3](https://github.com/feathersjs/authentication-local/tree/v0.4.3) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.2...v0.4.3) - -**Closed issues:** - -- Log a warning if service.id is undefined or null [\#19](https://github.com/feathersjs/authentication-local/issues/19) - -**Merged pull requests:** - -- throw error if service.id is missing [\#27](https://github.com/feathersjs/authentication-local/pull/27) ([marshallswain](https://github.com/marshallswain)) - -## [v0.4.2](https://github.com/feathersjs/authentication-local/tree/v0.4.2) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.1...v0.4.2) - -## [v0.4.1](https://github.com/feathersjs/authentication-local/tree/v0.4.1) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.0...v0.4.1) - -**Merged pull requests:** - -- Resolves \#14 - Passes Feathers params to service hooks [\#15](https://github.com/feathersjs/authentication-local/pull/15) ([thomas-p-wilson](https://github.com/thomas-p-wilson)) - -## [v0.4.0](https://github.com/feathersjs/authentication-local/tree/v0.4.0) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.4...v0.4.0) - -**Closed issues:** - -- Module is using the wrong default config key [\#21](https://github.com/feathersjs/authentication-local/issues/21) -- Feathers params not available to user service hooks [\#14](https://github.com/feathersjs/authentication-local/issues/14) -- Bad error message is returned for invalid credentials [\#10](https://github.com/feathersjs/authentication-local/issues/10) - -**Merged pull requests:** - -- Greenkeeper/chai 4.0.2 [\#26](https://github.com/feathersjs/authentication-local/pull/26) ([daffl](https://github.com/daffl)) -- Return Invalid login message when user doesn’t exist [\#25](https://github.com/feathersjs/authentication-local/pull/25) ([marshallswain](https://github.com/marshallswain)) -- Adding separate entity username and password fields [\#23](https://github.com/feathersjs/authentication-local/pull/23) ([adamvr](https://github.com/adamvr)) -- use the correct default config key. Closes \#21 [\#22](https://github.com/feathersjs/authentication-local/pull/22) ([ekryski](https://github.com/ekryski)) -- Update feathers-socketio to the latest version 🚀 [\#20](https://github.com/feathersjs/authentication-local/pull/20) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#18](https://github.com/feathersjs/authentication-local/pull/18) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#16](https://github.com/feathersjs/authentication-local/pull/16) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#13](https://github.com/feathersjs/authentication-local/pull/13) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v0.3.4](https://github.com/feathersjs/authentication-local/tree/v0.3.4) (2017-03-28) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.3...v0.3.4) - -**Closed issues:** - -- Shouldn't it be `authentication` instead of the old `auth` there? [\#11](https://github.com/feathersjs/authentication-local/issues/11) - -**Merged pull requests:** - -- Fix default authentication config name [\#12](https://github.com/feathersjs/authentication-local/pull/12) ([marshallswain](https://github.com/marshallswain)) - -## [v0.3.3](https://github.com/feathersjs/authentication-local/tree/v0.3.3) (2017-01-27) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.2...v0.3.3) - -**Closed issues:** - -- Support dot notation [\#7](https://github.com/feathersjs/authentication-local/issues/7) -- Automatically register the authenticate hook with 'local' [\#4](https://github.com/feathersjs/authentication-local/issues/4) - -**Merged pull requests:** - -- Add support for dot notation, fix some whitespace [\#8](https://github.com/feathersjs/authentication-local/pull/8) ([elfey](https://github.com/elfey)) - -## [v0.3.2](https://github.com/feathersjs/authentication-local/tree/v0.3.2) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.1...v0.3.2) - -## [v0.3.1](https://github.com/feathersjs/authentication-local/tree/v0.3.1) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.0...v0.3.1) - -**Closed issues:** - -- Add docs section on expected request params. [\#5](https://github.com/feathersjs/authentication-local/issues/5) - -**Merged pull requests:** - -- Document expected request data [\#6](https://github.com/feathersjs/authentication-local/pull/6) ([marshallswain](https://github.com/marshallswain)) - -## [v0.3.0](https://github.com/feathersjs/authentication-local/tree/v0.3.0) (2016-11-23) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.2.0...v0.3.0) - -**Closed issues:** - -- Doesn't pull configuration from `auth.local` by default [\#2](https://github.com/feathersjs/authentication-local/issues/2) -- Does not pull from global auth config when strategy has a custom name [\#1](https://github.com/feathersjs/authentication-local/issues/1) - -**Merged pull requests:** - -- Payload support [\#3](https://github.com/feathersjs/authentication-local/pull/3) ([ekryski](https://github.com/ekryski)) - -## [v0.2.0](https://github.com/feathersjs/authentication-local/tree/v0.2.0) (2016-11-16) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.1.0...v0.2.0) - -## [v0.1.0](https://github.com/feathersjs/authentication-local/tree/v0.1.0) (2016-11-09) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/authentication-local/LICENSE b/packages/authentication-local/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/authentication-local/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/authentication-local/README.md b/packages/authentication-local/README.md deleted file mode 100644 index 9215940bd5..0000000000 --- a/packages/authentication-local/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/authentication-local - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/authentication-local.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication-local) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Local username and password authentication strategy for Feathers authentication - -## Installation - -``` -npm install @feathersjs/authentication-local --save -``` - -## Documentation - -Refer to the [Feathers local authentication API documentation](https://feathersjs.com/api/authentication/local.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-local/package.json b/packages/authentication-local/package.json deleted file mode 100644 index 8fcf282d3a..0000000000 --- a/packages/authentication-local/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "@feathersjs/authentication-local", - "description": "Local authentication strategy for @feathers/authentication", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/authentication-local" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "bcryptjs": "^2.4.3", - "lodash": "^4.17.21" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@types/bcryptjs": "^2.4.6", - "@types/lodash": "^4.17.7", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/authentication-local/src/hooks/hash-password.ts b/packages/authentication-local/src/hooks/hash-password.ts deleted file mode 100644 index 5a949bb856..0000000000 --- a/packages/authentication-local/src/hooks/hash-password.ts +++ /dev/null @@ -1,67 +0,0 @@ -import get from 'lodash/get' -import set from 'lodash/set' -import cloneDeep from 'lodash/cloneDeep' -import { BadRequest } from '@feathersjs/errors' -import { createDebug } from '@feathersjs/commons' -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { LocalStrategy } from '../strategy' - -const debug = createDebug('@feathersjs/authentication-local/hooks/hash-password') - -export interface HashPasswordOptions { - authentication?: string - strategy?: string -} - -/** - * @deprecated Use Feathers schema resolvers and the `passwordHash` resolver instead - * @param field - * @param options - * @returns - * @see https://dove.feathersjs.com/api/authentication/local.html#passwordhash - */ -export default function hashPassword(field: string, options: HashPasswordOptions = {}) { - if (!field) { - throw new Error('The hashPassword hook requires a field name option') - } - - return async (context: HookContext, next?: NextFunction) => { - const { app, data, params } = context - - if (data !== undefined) { - const authService = app.defaultAuthentication(options.authentication) - const { strategy = 'local' } = options - - if (!authService || typeof authService.getStrategies !== 'function') { - throw new BadRequest('Could not find an authentication service to hash password') - } - - const [localStrategy] = authService.getStrategies(strategy) as LocalStrategy[] - - if (!localStrategy || typeof localStrategy.hashPassword !== 'function') { - throw new BadRequest(`Could not find '${strategy}' strategy to hash password`) - } - - const addHashedPassword = async (data: any) => { - const password = get(data, field) - - if (password === undefined) { - debug(`hook.data.${field} is undefined, not hashing password`) - return data - } - - const hashedPassword: string = await localStrategy.hashPassword(password, params) - - return set(cloneDeep(data), field, hashedPassword) - } - - context.data = Array.isArray(data) - ? await Promise.all(data.map(addHashedPassword)) - : await addHashedPassword(data) - } - - if (typeof next === 'function') { - return next() - } - } -} diff --git a/packages/authentication-local/src/hooks/protect.ts b/packages/authentication-local/src/hooks/protect.ts deleted file mode 100644 index eb1657e942..0000000000 --- a/packages/authentication-local/src/hooks/protect.ts +++ /dev/null @@ -1,42 +0,0 @@ -import omit from 'lodash/omit' -import { HookContext, NextFunction } from '@feathersjs/feathers' - -/** - * @deprecated For reliable safe data representations use Feathers schema dispatch resolvers. - * @see https://dove.feathersjs.comapi/authentication/local.html#protecting-fields - */ -export default (...fields: string[]) => { - const o = (current: any) => { - if (typeof current === 'object' && !Array.isArray(current)) { - const data = typeof current.toJSON === 'function' ? current.toJSON() : current - - return omit(data, fields) - } - - return current - } - - return async (context: HookContext, next?: NextFunction) => { - if (typeof next === 'function') { - await next() - } - - const result = context.dispatch || context.result - - if (result) { - if (Array.isArray(result)) { - context.dispatch = result.map(o) - } else if (result.data && context.method === 'find') { - context.dispatch = Object.assign({}, result, { - data: result.data.map(o) - }) - } else { - context.dispatch = o(result) - } - - if (context.params && context.params.provider) { - context.result = context.dispatch - } - } - } -} diff --git a/packages/authentication-local/src/index.ts b/packages/authentication-local/src/index.ts deleted file mode 100644 index 5e9b827e73..0000000000 --- a/packages/authentication-local/src/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { HookContext } from '@feathersjs/feathers' -import hashPassword from './hooks/hash-password' -import protect from './hooks/protect' -import { LocalStrategy } from './strategy' - -export const hooks = { hashPassword, protect } -export { LocalStrategy } - -/** - * Returns as property resolver that hashes a given plain text password using a Local - * authentication strategy. - * - * @param options The authentication `service` and `strategy` name - * @returns - */ -export const passwordHash = - (options: { service?: string; strategy: string }) => - async >(value: string | undefined, _data: any, context: H) => { - if (value === undefined) { - return value - } - - const { app, params } = context - const authService = app.defaultAuthentication(options.service) - const localStrategy = authService.getStrategy(options.strategy) as LocalStrategy - - return localStrategy.hashPassword(value, params) - } diff --git a/packages/authentication-local/src/strategy.ts b/packages/authentication-local/src/strategy.ts deleted file mode 100644 index 86129792b2..0000000000 --- a/packages/authentication-local/src/strategy.ts +++ /dev/null @@ -1,142 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import bcrypt from 'bcryptjs' -import get from 'lodash/get' -import { NotAuthenticated } from '@feathersjs/errors' -import { Query, Params } from '@feathersjs/feathers' -import { AuthenticationRequest, AuthenticationBaseStrategy } from '@feathersjs/authentication' -import { createDebug } from '@feathersjs/commons' - -const debug = createDebug('@feathersjs/authentication-local/strategy') - -export class LocalStrategy extends AuthenticationBaseStrategy { - verifyConfiguration() { - const config = this.configuration - - ;['usernameField', 'passwordField'].forEach((prop) => { - if (typeof config[prop] !== 'string') { - throw new Error(`'${this.name}' authentication strategy requires a '${prop}' setting`) - } - }) - } - - get configuration() { - const authConfig = this.authentication.configuration - const config = super.configuration || {} - - return { - hashSize: 10, - service: authConfig.service, - entity: authConfig.entity, - entityId: authConfig.entityId, - errorMessage: 'Invalid login', - entityPasswordField: config.passwordField, - entityUsernameField: config.usernameField, - ...config - } - } - - async getEntityQuery(query: Query, _params: Params) { - return { - $limit: 1, - ...query - } - } - - async findEntity(username: string, params: Params) { - const { entityUsernameField, errorMessage } = this.configuration - if (!username) { - // don't query for users without any condition set. - throw new NotAuthenticated(errorMessage) - } - - const query = await this.getEntityQuery( - { - [entityUsernameField]: username - }, - params - ) - - const findParams = Object.assign({}, params, { query }) - const entityService = this.entityService - - debug('Finding entity with query', params.query) - - const result = await entityService.find(findParams) - const list = Array.isArray(result) ? result : result.data - - if (!Array.isArray(list) || list.length === 0) { - debug('No entity found') - - throw new NotAuthenticated(errorMessage) - } - - const [entity] = list - - return entity - } - - async getEntity(result: any, params: Params) { - const entityService = this.entityService - const { entityId = (entityService as any).id, entity } = this.configuration - - if (!entityId || result[entityId] === undefined) { - throw new NotAuthenticated('Could not get local entity') - } - - if (!params.provider) { - return result - } - - return entityService.get(result[entityId], { - ...params, - [entity]: result - }) - } - - async comparePassword(entity: any, password: string) { - const { entityPasswordField, errorMessage } = this.configuration - // find password in entity, this allows for dot notation - const hash = get(entity, entityPasswordField) - - if (!hash) { - debug(`Record is missing the '${entityPasswordField}' password field`) - - throw new NotAuthenticated(errorMessage) - } - - debug('Verifying password') - - const result = await bcrypt.compare(password, hash) - - if (result) { - return entity - } - - throw new NotAuthenticated(errorMessage) - } - - async hashPassword(password: string, _params: Params) { - return bcrypt.hash(password, this.configuration.hashSize) - } - - async authenticate(data: AuthenticationRequest, params: Params) { - const { passwordField, usernameField, entity, errorMessage } = this.configuration - const username = get(data, usernameField) - const password = get(data, passwordField) - - if (!password) { - // exit early if there is no password - throw new NotAuthenticated(errorMessage) - } - - const { provider, ...paramsWithoutProvider } = params - - const result = await this.findEntity(username, paramsWithoutProvider) - await this.comparePassword(result, password) - - return { - authentication: { strategy: this.name }, - [entity]: await this.getEntity(result, params) - } - } -} diff --git a/packages/authentication-local/test/fixture.ts b/packages/authentication-local/test/fixture.ts deleted file mode 100644 index 32be7b476b..0000000000 --- a/packages/authentication-local/test/fixture.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { feathers } from '@feathersjs/feathers' -import { memory, MemoryService } from '@feathersjs/memory' -import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' - -import { LocalStrategy, hooks } from '../src' -const { hashPassword, protect } = hooks - -export type ServiceTypes = { - authentication: AuthenticationService - users: MemoryService -} - -export function createApplication( - app = feathers(), - authOptionOverrides: Record = {} -) { - const authentication = new AuthenticationService(app) - - const authConfig = { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['local', 'jwt'], - parseStrategies: ['jwt'], - local: { - usernameField: 'email', - passwordField: 'password' - }, - ...authOptionOverrides - } - app.set('authentication', authConfig) - - authentication.register('jwt', new JWTStrategy()) - authentication.register('local', new LocalStrategy()) - - app.use('authentication', authentication) - app.use( - 'users', - memory({ - multi: ['create'], - paginate: { - default: 10, - max: 20 - } - }) - ) - - app.service('users').hooks([protect(authConfig.local.passwordField)]) - app.service('users').hooks({ - create: [hashPassword(authConfig.local.passwordField)], - get: [ - async (context, next) => { - await next() - - if (context.params.provider) { - context.result.fromGet = true - } - } - ] - }) - - return app -} diff --git a/packages/authentication-local/test/hooks/hash-password.test.ts b/packages/authentication-local/test/hooks/hash-password.test.ts deleted file mode 100644 index fb45bc928e..0000000000 --- a/packages/authentication-local/test/hooks/hash-password.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import assert from 'assert' -import { Application } from '@feathersjs/feathers' - -import { hooks } from '../../src' -import { createApplication, ServiceTypes } from '../fixture' - -const { hashPassword } = hooks - -describe('@feathersjs/authentication-local/hooks/hash-password', () => { - let app: Application - - beforeEach(() => { - app = createApplication() - }) - - it('throws error when no field provided', () => { - try { - // @ts-ignore - hashPassword() - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'The hashPassword hook requires a field name option') - } - }) - - it('errors when authentication service does not exist', async () => { - delete app.services.authentication - - try { - await app.service('users').create({ - email: 'dave@hashpassword.com', - password: 'supersecret' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Could not find an authentication service to hash password') - } - }) - - it('errors when authentication strategy does not exist', async () => { - delete app.services.authentication.strategies.local - - try { - await app.service('users').create({ - email: 'dave@hashpassword.com', - password: 'supersecret' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, "Could not find 'local' strategy to hash password") - } - }) - - it('hashes password on field', async () => { - const password = 'supersecret' - - const user = await app.service('users').create({ - email: 'dave@hashpassword.com', - password - }) - - assert.notStrictEqual(user.password, password) - }) - - it('hashes password on array data', async () => { - const password = 'supersecret' - - const users = await app.service('users').create([ - { - email: 'dave@hashpassword.com', - password - }, - { - email: 'dave2@hashpassword.com', - password: 'secret2' - } - ]) - - assert.notStrictEqual(users[0].password, password) - assert.notStrictEqual(users[1].password, 'secret2') - }) - - it('does nothing when field is not present', async () => { - const user = await app.service('users').create({ - email: 'dave@hashpassword.com' - }) - - assert.strictEqual(user.password, undefined) - }) -}) diff --git a/packages/authentication-local/test/hooks/protect.test.ts b/packages/authentication-local/test/hooks/protect.test.ts deleted file mode 100644 index 20e1320c3d..0000000000 --- a/packages/authentication-local/test/hooks/protect.test.ts +++ /dev/null @@ -1,183 +0,0 @@ -import assert from 'assert' -import { HookContext } from '@feathersjs/feathers' -import { hooks } from '../../src' - -const { protect } = hooks - -function testOmit(title: string, property: string) { - describe(title, () => { - const fn = protect('password') - - it('omits from object', async () => { - const data = { - email: 'test@user.com', - password: 'supersecret' - } - const context = { - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: { email: 'test@user.com' } - }) - }) - - it('omits from nested object', async () => { - const hook = protect('user.password') - const data = { - user: { - email: 'test@user.com', - password: 'supersecret' - } - } - const context = { - [property]: data - } as unknown as HookContext - - await hook(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: { user: { email: 'test@user.com' } } - }) - }) - - it('handles `data` property only for find', async () => { - const data = { - email: 'test@user.com', - password: 'supersecret', - data: 'yes' - } - const context = { - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: { email: 'test@user.com', data: 'yes' } - }) - }) - - it('uses .toJSON (#48)', async () => { - class MyUser { - toJSON() { - return { - email: 'test@user.com', - password: 'supersecret' - } - } - } - - const data = new MyUser() - const context = { - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: { email: 'test@user.com' } - }) - }) - - it('omits from array but only objects (#2053)', async () => { - const data = [ - { - email: 'test1@user.com', - password: 'supersecret' - }, - { - email: 'test2@user.com', - password: 'othersecret' - }, - ['one', 'two', 'three'], - 'test' - ] - const context = { - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: [{ email: 'test1@user.com' }, { email: 'test2@user.com' }, ['one', 'two', 'three'], 'test'] - }) - }) - - it('omits from pagination object', async () => { - const data = { - total: 2, - data: [ - { - email: 'test1@user.com', - password: 'supersecret' - }, - { - email: 'test2@user.com', - password: 'othersecret' - } - ] - } - const context = { - method: 'find', - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - method: 'find', - [property]: data, - dispatch: { - total: 2, - data: [{ email: 'test1@user.com' }, { email: 'test2@user.com' }] - } - }) - }) - - it('updates result if params.provider is set', async () => { - const data = [ - { - email: 'test1@user.com', - password: 'supersecret' - }, - { - email: 'test2@user.com', - password: 'othersecret' - } - ] - const params = { provider: 'test' } - const context = { - [property]: data, - params - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - params, - result: [{ email: 'test1@user.com' }, { email: 'test2@user.com' }], - dispatch: [{ email: 'test1@user.com' }, { email: 'test2@user.com' }] - }) - }) - }) -} - -describe('@feathersjs/authentication-local/hooks/protect', () => { - it('does nothing when called with no result', async () => { - const fn = protect() - - assert.deepStrictEqual(await fn({} as any), undefined) - }) - - testOmit('with hook.result', 'result') - testOmit('with hook.dispatch already set', 'dispatch') -}) diff --git a/packages/authentication-local/test/strategy.test.ts b/packages/authentication-local/test/strategy.test.ts deleted file mode 100644 index a8fca0fe16..0000000000 --- a/packages/authentication-local/test/strategy.test.ts +++ /dev/null @@ -1,224 +0,0 @@ -import assert from 'assert' -import omit from 'lodash/omit' -import { Application, HookContext } from '@feathersjs/feathers' -import { resolve } from '@feathersjs/schema' - -import { LocalStrategy, passwordHash } from '../src' -import { createApplication, ServiceTypes } from './fixture' - -describe('@feathersjs/authentication-local/strategy', () => { - const password = 'localsecret' - const email = 'localtester@feathersjs.com' - - let app: Application - let user: any - - beforeEach(async () => { - app = createApplication() - user = await app.service('users').create({ email, password }) - }) - - it('throw error when configuration is not set', () => { - const auth = app.service('authentication') - - try { - auth.register('something', new LocalStrategy()) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.message, - "'something' authentication strategy requires a 'usernameField' setting" - ) - } - }) - - it('fails when entity not found', async () => { - const authService = app.service('authentication') - - try { - await authService.create({ - strategy: 'local', - email: 'not in database', - password - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid login') - } - }) - - it('getEntity', async () => { - const [strategy] = app.service('authentication').getStrategies('local') as [LocalStrategy] - let entity = await strategy.getEntity(user, {}) - - assert.deepStrictEqual(entity, user) - - entity = await strategy.getEntity(user, { - provider: 'testing' - }) - - assert.deepStrictEqual(entity, { - ...omit(user, 'password'), - fromGet: true - }) - - try { - await strategy.getEntity({}, {}) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Could not get local entity') - } - }) - - it('strategy fails when strategy is different', async () => { - const [local] = app.service('authentication').getStrategies('local') - - await assert.rejects( - () => - local.authenticate( - { - strategy: 'not-me', - password: 'dummy', - email - }, - {} - ), - { - name: 'NotAuthenticated', - message: 'Invalid login' - } - ) - }) - - it('fails when password is wrong', async () => { - const authService = app.service('authentication') - try { - await authService.create({ - strategy: 'local', - email, - password: 'dummy' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid login') - } - }) - - it('fails when password is not provided', async () => { - const authService = app.service('authentication') - try { - await authService.create({ - strategy: 'local', - email - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid login') - } - }) - - it('fails when password field is not available', async () => { - const userEmail = 'someuser@localtest.com' - const authService = app.service('authentication') - - try { - await app.service('users').create({ - email: userEmail - }) - await authService.create({ - strategy: 'local', - password: 'dummy', - email: userEmail - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid login') - } - }) - - it('authenticates an existing user', async () => { - const authService = app.service('authentication') - const authResult = await authService.create({ - strategy: 'local', - email, - password - }) - const { accessToken } = authResult - - assert.ok(accessToken) - assert.strictEqual(authResult.user.email, email) - - const decoded = await authService.verifyAccessToken(accessToken) - - assert.strictEqual(decoded.sub, `${user.id}`) - }) - - it('returns safe result when params.provider is set, works without pagination', async () => { - const authService = app.service('authentication') - const authResult = await authService.create( - { - strategy: 'local', - email, - password - }, - { - provider: 'rest', - paginate: false - } - ) - const { accessToken } = authResult - - assert.ok(accessToken) - assert.strictEqual(authResult.user.email, email) - assert.strictEqual(authResult.user.password, undefined) - assert.ok(authResult.user.fromGet) - - const decoded = await authService.verifyAccessToken(accessToken) - - assert.strictEqual(decoded.sub, `${user.id}`) - }) - - it('passwordHash property resolver', async () => { - const userResolver = resolve<{ password: string }, HookContext>({ - properties: { - password: passwordHash({ - strategy: 'local' - }) - } - }) - - const resolvedData = await userResolver.resolve({ password: 'supersecret' }, { app } as HookContext) - - assert.notStrictEqual(resolvedData.password, 'supersecret') - }) - it('should allow for nested values in the usernameField', async () => { - const appWithNestedFieldOverride = createApplication(undefined, { - local: { - usernameField: 'auth.email', - passwordField: 'auth.password' - } - }) - const nestedUser = await appWithNestedFieldOverride.service('users').create({ auth: { email, password } }) - const authService = appWithNestedFieldOverride.service('authentication') - const authResult = await authService.create({ - strategy: 'local', - auth: { - email, - password - } - }) - const { accessToken } = authResult - - assert.ok(accessToken) - assert.strictEqual(authResult.user.auth.email, email) - - const decoded = await authService.verifyAccessToken(accessToken) - - assert.strictEqual(decoded.sub, `${nestedUser.id}`) - // - }) -}) diff --git a/packages/authentication-local/tsconfig.json b/packages/authentication-local/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/authentication-local/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/authentication-oauth/CHANGELOG.md b/packages/authentication-oauth/CHANGELOG.md deleted file mode 100644 index ba0a101081..0000000000 --- a/packages/authentication-oauth/CHANGELOG.md +++ /dev/null @@ -1,555 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -### Bug Fixes - -- **authentication-oauth:** Allow POST oauth callbacks ([#3497](https://github.com/feathersjs/feathers/issues/3497)) ([ffcc90b](https://github.com/feathersjs/feathers/commit/ffcc90bb95329cbb4b8f310e37024d417c216d8c)) - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- **oauth:** Export OAuthService type ([#3479](https://github.com/feathersjs/feathers/issues/3479)) ([e7185cd](https://github.com/feathersjs/feathers/commit/e7185cde63990a0d24a7180c63b61dbc8ef6cd5b)) -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -### Bug Fixes - -- **authentication-oauth:** Move Grant error handling to the correct spot ([#3297](https://github.com/feathersjs/feathers/issues/3297)) ([e9c0828](https://github.com/feathersjs/feathers/commit/e9c0828937453c3f0a1bd16010089b825185eab6)) - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -### Bug Fixes - -- **authentication-oauth:** Properly handle all oAuth errors ([#3284](https://github.com/feathersjs/feathers/issues/3284)) ([148a9a3](https://github.com/feathersjs/feathers/commit/148a9a319b8e29138fda82d6c03bb489a7b4a6e1)) - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -### Bug Fixes - -- **authentication-oauth:** Update OAuth redirect to handle user requested redirect paths ([#3186](https://github.com/feathersjs/feathers/issues/3186)) ([3742028](https://github.com/feathersjs/feathers/commit/37420283c17bb8129c6ffdde841ce2034109cc6b)) - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **authentication-oauth:** Use original headers in oauth flow ([#3025](https://github.com/feathersjs/feathers/issues/3025)) ([fb3d8cc](https://github.com/feathersjs/feathers/commit/fb3d8cca123d68a77b096bc92e49baa55424afe0)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **core:** Improve service option usage and method option typings ([#2902](https://github.com/feathersjs/feathers/issues/2902)) ([164d75c](https://github.com/feathersjs/feathers/commit/164d75c0f11139a316baa91f1762de8f8eb7da2d)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Bug Fixes - -- **authentication-oauth:** Fix regression with prefix handling in OAuth ([#2773](https://github.com/feathersjs/feathers/issues/2773)) ([b1844b1](https://github.com/feathersjs/feathers/commit/b1844b1f27feeb7e66920ec9e318872857711834)) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Bug Fixes - -- **authentication-oauth:** Fix oAuth origin and error handling ([#2752](https://github.com/feathersjs/feathers/issues/2752)) ([f7e1c33](https://github.com/feathersjs/feathers/commit/f7e1c33de1b7af0672a302d2ba6e15d997f0aa83)) - -### Features - -- Add CORS support to oAuth, Express, Koa and generated application ([#2744](https://github.com/feathersjs/feathers/issues/2744)) ([fd218f2](https://github.com/feathersjs/feathers/commit/fd218f289f8ca4c101e9938e8683e2efef6e8131)) -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Bug Fixes - -- **authentication-oauth:** Fix bug and properly set Grant defaults ([#2659](https://github.com/feathersjs/feathers/issues/2659)) ([cb93bb9](https://github.com/feathersjs/feathers/commit/cb93bb911fd92282424da2db805cd685b7e4a45b)) - -### Features - -- **cli:** Add typed client to a generated app ([#2669](https://github.com/feathersjs/feathers/issues/2669)) ([5b801b5](https://github.com/feathersjs/feathers/commit/5b801b5017ddc3eaa95622b539f51d605916bc86)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -### Bug Fixes - -- **authentication-oauth:** Fix regression using incorrect callback and redirect_uri ([#2631](https://github.com/feathersjs/feathers/issues/2631)) ([43d8a08](https://github.com/feathersjs/feathers/commit/43d8a082d7e1807f8a431c44a1dbd9b04c3af0d2)) - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **authentication-oauth:** Don't send origins in Grant's config, as it will be considered another provider ([#2617](https://github.com/feathersjs/feathers/issues/2617)) ([ae3dddd](https://github.com/feathersjs/feathers/commit/ae3dddd8a654924465512d56b4651413912c6932)) -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Bug Fixes - -- **authentication-oauth:** Fix issue with overriding the default Grant configuration ([#2615](https://github.com/feathersjs/feathers/issues/2615)) ([b345857](https://github.com/feathersjs/feathers/commit/b3458578532f9750de2940aeb8afdc75cb0b46f2)) -- **authentication-oauth:** Make oAuth authentication work with cookie-session ([#2614](https://github.com/feathersjs/feathers/issues/2614)) ([9f10bfc](https://github.com/feathersjs/feathers/commit/9f10bfc75083d5bcabea77cfb385aa3965cdf6d6)) - -### Features - -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Bug Fixes - -- **authentication-oauth:** OAuth redirect lost sometimes due to session store race ([#2514](https://github.com/feathersjs/feathers/issues/2514)) ([#2515](https://github.com/feathersjs/feathers/issues/2515)) ([6109c44](https://github.com/feathersjs/feathers/commit/6109c44428c6b8f6bb4e089be760ea1a4ef3d01e)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Features - -- **authentication-oauth:** Allow dynamic oAuth redirect ([#2469](https://github.com/feathersjs/feathers/issues/2469)) ([b7143d4](https://github.com/feathersjs/feathers/commit/b7143d4c0fbe961e714f79512be04449b9bbd7d9)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **authentication-oauth:** Omit query from internal calls ([#2398](https://github.com/feathersjs/feathers/issues/2398)) ([04c7c83](https://github.com/feathersjs/feathers/commit/04c7c83eeaa6a7466c84b958071b468ed42f0b0f)) -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -### Bug Fixes - -- **authentication-oauth:** Always end session after oAuth flows are finished ([#2087](https://github.com/feathersjs/feathers/issues/2087)) ([d219d0d](https://github.com/feathersjs/feathers/commit/d219d0d89c5e45aa289dd67cb0c8bdc05044c846)) - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -### Bug Fixes - -- **typescript:** Revert add overload types for `find` service methods ([#1972](https://github.com/feathersjs/feathers/issues/1972))" ([#2025](https://github.com/feathersjs/feathers/issues/2025)) ([a9501ac](https://github.com/feathersjs/feathers/commit/a9501acb4d3ef58dfb87d62c57a9bf76569da281)) - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -### Bug Fixes - -- **authentication-oauth:** Updated typings for projects with strictNullChecks ([#1941](https://github.com/feathersjs/feathers/issues/1941)) ([be91206](https://github.com/feathersjs/feathers/commit/be91206e3dba1e65a81412b7aa636bece3ab4aa2)) -- **typescript:** add overload types for `find` service methods ([#1972](https://github.com/feathersjs/feathers/issues/1972)) ([ef55af0](https://github.com/feathersjs/feathers/commit/ef55af088d05d9d36aba9d9f8d6c2c908a4f20dd)) - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -### Bug Fixes - -- **authentication-oauth:** Add getEntity method to oAuth authentication and remove provider field for other calls ([#1935](https://github.com/feathersjs/feathers/issues/1935)) ([d925c1b](https://github.com/feathersjs/feathers/commit/d925c1bd193b5c19cb23a246f04fc46d0429fc75)) - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -### Bug Fixes - -- **authentication-oauth:** Allow req.feathers to be used in oAuth authentication requests ([#1886](https://github.com/feathersjs/feathers/issues/1886)) ([854c9ca](https://github.com/feathersjs/feathers/commit/854c9cac9a9a5f8f89054a90feb24ab5c4766f5f)) - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -### Bug Fixes - -- **package:** update grant-profile to version 0.0.11 ([#1841](https://github.com/feathersjs/feathers/issues/1841)) ([5dcd2aa](https://github.com/feathersjs/feathers/commit/5dcd2aa3483059cc7a2546b145dd72b4705fe2fe)) - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -### Features - -- **authentication-oauth:** Set oAuth redirect URL dynamically and pass query the service ([#1737](https://github.com/feathersjs/feathers/issues/1737)) ([0b05f0b](https://github.com/feathersjs/feathers/commit/0b05f0b58a257820fa61d695a36f36455209f6a1)) - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Features - -- **authentication-oauth:** Set oAuth redirect URL dynamically ([#1608](https://github.com/feathersjs/feathers/issues/1608)) ([1293e08](https://github.com/feathersjs/feathers/commit/1293e088abbb3d23f4a44680836645a8049ceaae)) - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -### Bug Fixes - -- **authentication-oauth:** Allow hash based redirects ([#1676](https://github.com/feathersjs/feathers/issues/1676)) ([ffe7cf3](https://github.com/feathersjs/feathers/commit/ffe7cf3fbb4e62d7689065cf7b61f25f602ce8cf)) - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -### Bug Fixes - -- Only initialize default Express session if oAuth is actually used ([#1648](https://github.com/feathersjs/feathers/issues/1648)) ([9b9b43f](https://github.com/feathersjs/feathers/commit/9b9b43ff09af1080e4aaa537064bac37b881c9a2)) - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -### Bug Fixes - -- Omit standard protocol ports from the default hostname ([#1543](https://github.com/feathersjs/feathers/issues/1543)) ([ef16d29](https://github.com/feathersjs/feathers/commit/ef16d29)) - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) -- Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Make oAuth paths more consistent and improve authentication client ([#1377](https://github.com/feathersjs/feathers/issues/1377)) ([adb2543](https://github.com/feathersjs/feathers/commit/adb2543)) -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -### Bug Fixes - -- Correctly read the oauth strategy config ([#1349](https://github.com/feathersjs/feathers/issues/1349)) ([9abf314](https://github.com/feathersjs/feathers/commit/9abf314)) - -### Features - -- Add global disconnect event ([#1355](https://github.com/feathersjs/feathers/issues/1355)) ([85afcca](https://github.com/feathersjs/feathers/commit/85afcca)) - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -### Bug Fixes - -- Always require strategy parameter in authentication ([#1327](https://github.com/feathersjs/feathers/issues/1327)) ([d4a8021](https://github.com/feathersjs/feathers/commit/d4a8021)) -- Improve authentication parameter handling ([#1333](https://github.com/feathersjs/feathers/issues/1333)) ([6e77204](https://github.com/feathersjs/feathers/commit/6e77204)) -- Improve oAuth option handling and usability ([#1335](https://github.com/feathersjs/feathers/issues/1335)) ([adb137d](https://github.com/feathersjs/feathers/commit/adb137d)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) -- Rename jwtStrategies option to authStrategies ([#1305](https://github.com/feathersjs/feathers/issues/1305)) ([4aee151](https://github.com/feathersjs/feathers/commit/4aee151)) - -### Features - -- Change and *JWT methods to *accessToken ([#1304](https://github.com/feathersjs/feathers/issues/1304)) ([5ac826b](https://github.com/feathersjs/feathers/commit/5ac826b)) - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) diff --git a/packages/authentication-oauth/LICENSE b/packages/authentication-oauth/LICENSE deleted file mode 100644 index 7839c824d7..0000000000 --- a/packages/authentication-oauth/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/authentication-oauth/README.md b/packages/authentication-oauth/README.md deleted file mode 100644 index 797a932308..0000000000 --- a/packages/authentication-oauth/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/authentication-oauth - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/authentication-oauth.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication-oauth) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> OAuth 1 and 2 authentication for Feathers. Powered by Grant. - -## Installation - -``` -npm install @feathersjs/authentication-oauth --save -``` - -## Documentation - -Refer to the [Feathers oAuth authentication API documentation](https://feathersjs.com/api/authentication/oauth.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-oauth/package.json b/packages/authentication-oauth/package.json deleted file mode 100644 index bc48f6429f..0000000000 --- a/packages/authentication-oauth/package.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "@feathersjs/authentication-oauth", - "description": "oAuth 1 and 2 authentication for Feathers. Powered by Grant.", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/authentication-oauth" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "start": "ts-node test/app", - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/express": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/koa": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "cookie-session": "^2.1.0", - "grant": "^5.4.22", - "koa-session": "^6.4.0", - "qs": "^6.13.0" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.30", - "@types/cookie-session": "^2.0.49", - "@types/express": "^4.17.21", - "@types/koa-session": "^6.4.5", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "@types/tough-cookie": "^4.0.5", - "axios": "^1.7.7", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "tough-cookie": "^4.1.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/authentication-oauth/src/index.ts b/packages/authentication-oauth/src/index.ts deleted file mode 100644 index 9d25b6f6c1..0000000000 --- a/packages/authentication-oauth/src/index.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Application } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { resolveDispatch } from '@feathersjs/schema' - -import { OAuthStrategy, OAuthProfile } from './strategy' -import { redirectHook, OAuthService, OAuthCallbackService } from './service' -import { getGrantConfig, authenticationServiceOptions, OauthSetupSettings } from './utils' - -const debug = createDebug('@feathersjs/authentication-oauth') - -export { OauthSetupSettings, OAuthStrategy, OAuthProfile, OAuthService } - -export const oauth = - (settings: Partial = {}) => - (app: Application) => { - const authService = app.defaultAuthentication ? app.defaultAuthentication(settings.authService) : null - - if (!authService) { - throw new Error( - 'An authentication service must exist before registering @feathersjs/authentication-oauth' - ) - } - - if (!authService.configuration.oauth) { - debug('No oauth configuration found in authentication configuration. Skipping oAuth setup.') - return - } - - const oauthOptions = { - linkStrategy: 'jwt', - ...settings - } - - const grantConfig = getGrantConfig(authService) - const serviceOptions = authenticationServiceOptions(authService, oauthOptions) - const servicePath = `${grantConfig.defaults.prefix || 'oauth'}/:provider` - const callbackServicePath = `${servicePath}/callback` - const oauthService = new OAuthService(authService, oauthOptions) - - app.use(servicePath, oauthService, serviceOptions) - app.use(callbackServicePath, new OAuthCallbackService(oauthService), serviceOptions) - app.service(servicePath).hooks({ - around: { all: [resolveDispatch(), redirectHook()] } - }) - app.service(callbackServicePath).hooks({ - around: { all: [resolveDispatch(), redirectHook()] } - }) - - if (typeof app.service(servicePath).publish === 'function') { - app.service(servicePath).publish(() => null) - } - - if (typeof app.service(callbackServicePath).publish === 'function') { - app.service(callbackServicePath).publish(() => null) - } - } diff --git a/packages/authentication-oauth/src/service.ts b/packages/authentication-oauth/src/service.ts deleted file mode 100644 index 1ae575d6aa..0000000000 --- a/packages/authentication-oauth/src/service.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { createDebug } from '@feathersjs/commons' -import { HookContext, NextFunction, Params } from '@feathersjs/feathers' -import { FeathersError, GeneralError } from '@feathersjs/errors' -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -//@ts-ignore -import Grant from 'grant/lib/grant' -import { AuthenticationService } from '@feathersjs/authentication' -import { OAuthStrategy } from './strategy' -import { getGrantConfig, OauthSetupSettings } from './utils' - -const debug = createDebug('@feathersjs/authentication-oauth/services') - -export type GrantResponse = { - location: string - session: any - state: any -} - -export type OAuthParams = Omit & { - session: any - state: Record - route: { - provider: string - } -} - -export class OAuthError extends FeathersError { - constructor( - message: string, - data: any, - public location: string - ) { - super(message, 'NotAuthenticated', 401, 'not-authenticated', data) - } -} - -export const redirectHook = () => async (context: HookContext, next: NextFunction) => { - try { - await next() - - const { location } = context.result - - debug(`oAuth redirect to ${location}`) - - if (location) { - context.http = { - ...context.http, - location - } - } - } catch (error: any) { - if (error.location) { - context.http = { - ...context.http, - location: error.location - } - context.result = typeof error.toJSON === 'function' ? error.toJSON() : error - } else { - throw error - } - } -} - -export class OAuthService { - grant: any - - constructor( - public service: AuthenticationService, - public settings: OauthSetupSettings - ) { - const config = getGrantConfig(service) - - this.grant = Grant({ config }) - } - - async handler(method: string, params: OAuthParams, body?: any, override?: string): Promise { - const { - session, - state, - query, - route: { provider } - } = params - - const result: GrantResponse = await this.grant({ - params: { provider, override }, - state: state.grant, - session: session.grant, - query, - method, - body - }) - - session.grant = result.session - state.grant = result.state - - return result - } - - async authenticate(params: OAuthParams, result: GrantResponse) { - const name = params.route.provider - const { linkStrategy, authService } = this.settings - const { accessToken, grant, headers, query = {}, redirect } = params.session - const strategy = this.service.getStrategy(name) as OAuthStrategy - const authParams = { - ...params, - headers, - authStrategies: [name], - authentication: accessToken - ? { - strategy: linkStrategy, - accessToken - } - : null, - query, - redirect - } - - const payload = grant?.response || result?.session?.response || result?.state?.response || params.query - const authentication = { - strategy: name, - ...payload - } - - try { - if (payload.error) { - throw new GeneralError(payload.error_description || payload.error, payload) - } - - debug(`Calling ${authService}.create authentication with strategy ${name}`) - - const authResult = await this.service.create(authentication, authParams) - - debug('Successful oAuth authentication, sending response') - - const location = await strategy.getRedirect(authResult, authParams) - - if (typeof params.session.destroy === 'function') { - await params.session.destroy() - } - - return { - ...authResult, - location - } - } catch (error: any) { - const location = await strategy.getRedirect(error, authParams) - const e = new OAuthError(error.message, error.data, location) - - if (typeof params.session.destroy === 'function') { - await params.session.destroy() - } - - e.stack = error.stack - throw e - } - } - - async find(params: OAuthParams) { - const { session, query, headers } = params - const { feathers_token, redirect, ...restQuery } = query - const handlerParams = { - ...params, - query: restQuery - } - - if (feathers_token) { - debug('Got feathers_token query parameter to link accounts', feathers_token) - session.accessToken = feathers_token - } - - session.redirect = redirect - session.query = restQuery - session.headers = headers - - return this.handler('GET', handlerParams, {}) - } - - async get(override: string, params: OAuthParams) { - const result = await this.handler('GET', params, {}, override) - - return result - } - - async create(data: any, params: OAuthParams) { - return this.handler('POST', params, data) - } -} - -export class OAuthCallbackService { - constructor(public service: OAuthService) {} - - async find(params: OAuthParams) { - const result = await this.service.handler('GET', params, {}, 'callback') - - return this.service.authenticate(params, result) - } - - async create(data: any, params: OAuthParams) { - const result = await this.service.handler('POST', params, data, 'callback') - - return this.service.authenticate(params, result) - } -} diff --git a/packages/authentication-oauth/src/strategy.ts b/packages/authentication-oauth/src/strategy.ts deleted file mode 100644 index 4bfe2589fc..0000000000 --- a/packages/authentication-oauth/src/strategy.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { - AuthenticationRequest, - AuthenticationBaseStrategy, - AuthenticationResult, - AuthenticationParams -} from '@feathersjs/authentication' -import { Params } from '@feathersjs/feathers' -import { NotAuthenticated } from '@feathersjs/errors' -import { createDebug, _ } from '@feathersjs/commons' -import qs from 'qs' - -const debug = createDebug('@feathersjs/authentication-oauth/strategy') - -export interface OAuthProfile { - id?: string | number - [key: string]: any -} - -export class OAuthStrategy extends AuthenticationBaseStrategy { - get configuration() { - const { entity, service, entityId, oauth } = this.authentication.configuration - const config = oauth[this.name] as any - - return { - entity, - service, - entityId, - ...config - } - } - - get entityId(): string { - const { entityService } = this - - return this.configuration.entityId || (entityService && (entityService as any).id) - } - - async getEntityQuery(profile: OAuthProfile, _params: Params) { - return { - [`${this.name}Id`]: profile.sub || profile.id - } - } - - async getEntityData(profile: OAuthProfile, _existingEntity: any, _params: Params) { - return { - [`${this.name}Id`]: profile.sub || profile.id - } - } - - async getProfile(data: AuthenticationRequest, _params: Params) { - return data.profile - } - - async getCurrentEntity(params: Params) { - const { authentication } = params - const { entity } = this.configuration - - if (authentication && authentication.strategy) { - debug('getCurrentEntity with authentication', authentication) - - const { strategy } = authentication - const authResult = await this.authentication.authenticate(authentication, params, strategy) - - return authResult[entity] - } - - return null - } - - async getAllowedOrigin(params?: Params) { - const { redirect, origins = this.app.get('origins') } = this.authentication.configuration.oauth - - if (Array.isArray(origins)) { - const referer = params?.headers?.referer || origins[0] - const allowedOrigin = origins.find((current) => referer.toLowerCase().startsWith(current.toLowerCase())) - - if (!allowedOrigin) { - throw new NotAuthenticated(`Referer "${referer}" is not allowed.`) - } - - return allowedOrigin - } - - return redirect - } - - async getRedirect( - data: AuthenticationResult | Error, - params?: AuthenticationParams - ): Promise { - const queryRedirect = (params && params.redirect) || '' - const redirect = await this.getAllowedOrigin(params) - - if (!redirect) { - return null - } - - const redirectUrl = `${redirect}${queryRedirect}` - const separator = redirectUrl.endsWith('?') ? '' : redirect.indexOf('#') !== -1 ? '?' : '#' - const authResult: AuthenticationResult = data - const query = authResult.accessToken - ? { access_token: authResult.accessToken } - : { error: data.message || 'OAuth Authentication not successful' } - - return `${redirectUrl}${separator}${qs.stringify(query)}` - } - - async findEntity(profile: OAuthProfile, params: Params) { - const query = await this.getEntityQuery(profile, params) - - debug('findEntity with query', query) - - const result = await this.entityService.find({ - ...params, - query - }) - const [entity = null] = result.data ? result.data : result - - debug('findEntity returning', entity) - - return entity - } - - async createEntity(profile: OAuthProfile, params: Params) { - const data = await this.getEntityData(profile, null, params) - - debug('createEntity with data', data) - - return this.entityService.create(data, _.omit(params, 'query')) - } - - async updateEntity(entity: any, profile: OAuthProfile, params: Params) { - const id = entity[this.entityId] - const data = await this.getEntityData(profile, entity, params) - - debug(`updateEntity with id ${id} and data`, data) - - return this.entityService.patch(id, data, _.omit(params, 'query')) - } - - async getEntity(result: any, params: Params) { - const { entityService } = this - const { entityId = (entityService as any).id, entity } = this.configuration - - if (!entityId || result[entityId] === undefined) { - throw new NotAuthenticated('Could not get oAuth entity') - } - - if (!params.provider) { - return result - } - - return entityService.get(result[entityId], { - ..._.omit(params, 'query'), - [entity]: result - }) - } - - async authenticate(authentication: AuthenticationRequest, originalParams: AuthenticationParams) { - const entity: string = this.configuration.entity - const { provider, ...params } = originalParams - const profile = await this.getProfile(authentication, params) - const existingEntity = (await this.findEntity(profile, params)) || (await this.getCurrentEntity(params)) - - debug('authenticate with (existing) entity', existingEntity) - - const authEntity = !existingEntity - ? await this.createEntity(profile, params) - : await this.updateEntity(existingEntity, profile, params) - - return { - authentication: { strategy: this.name }, - [entity]: await this.getEntity(authEntity, originalParams) - } - } -} diff --git a/packages/authentication-oauth/src/utils.ts b/packages/authentication-oauth/src/utils.ts deleted file mode 100644 index 21eff4217f..0000000000 --- a/packages/authentication-oauth/src/utils.ts +++ /dev/null @@ -1,127 +0,0 @@ -import type { RequestHandler } from 'express' -import type { Middleware, Application as KoaApplication } from '@feathersjs/koa' - -import type { ServiceOptions } from '@feathersjs/feathers' - -import '@feathersjs/koa' -import '@feathersjs/express' -import expressCookieSession from 'cookie-session' -import koaCookieSession from 'koa-session' - -import { AuthenticationService } from '@feathersjs/authentication' -import { GrantConfig } from 'grant' - -export interface OauthSetupSettings { - linkStrategy: string - authService?: string - expressSession?: RequestHandler - koaSession?: Middleware -} - -export const getGrantConfig = (service: AuthenticationService): GrantConfig => { - const { - app, - configuration: { oauth } - } = service - // Set up all the defaults - const port = app.get('port') - let host = app.get('host') - let protocol = 'https' - - // Development environments commonly run on HTTP with an extended port - if (process.env.NODE_ENV !== 'production') { - protocol = 'http' - if (String(port) !== '80') { - host += `:${port}` - } - } - - // omit 'redirect' and 'origins' from oauth - const { redirect, origins, ...oauthConfig } = oauth - - const grant: GrantConfig = { - ...oauthConfig, - defaults: { - prefix: '/oauth', - origin: `${protocol}://${host}`, - transport: 'state', - response: ['tokens', 'raw', 'profile'], - ...oauthConfig.defaults - } - } - - const getUrl = (url: string) => { - const { defaults } = grant - return `${defaults.origin}${defaults.prefix}/${url}` - } - - // iterate over grant object with key and value - for (const [name, value] of Object.entries(grant)) { - if (name !== 'defaults') { - value.redirect_uri = value.redirect_uri || getUrl(`${name}/callback`) - } - } - - return grant -} - -export const setExpressParams: RequestHandler = (req, res, next) => { - req.session.destroy ||= () => { - req.session = null - } - - req.feathers = { - ...req.feathers, - session: req.session, - state: res.locals - } - - next() -} - -export const setKoaParams: Middleware = async (ctx, next) => { - ctx.session.destroy ||= () => { - ctx.session = null - } - - ctx.feathers = { - ...ctx.feathers, - session: ctx.session, - state: ctx.state - } as any - - await next() -} - -export const authenticationServiceOptions = ( - service: AuthenticationService, - settings: OauthSetupSettings -): ServiceOptions => { - const { secret } = service.configuration - const koaApp = service.app as KoaApplication - - if (koaApp.context) { - koaApp.keys = [secret] - - const { koaSession = koaCookieSession({ key: 'feathers.oauth' }, koaApp as any) } = settings - - return { - koa: { - before: [koaSession, setKoaParams] - } - } - } - - const { - expressSession = expressCookieSession({ - name: 'feathers.oauth', - keys: [secret] - }) - } = settings - - return { - express: { - before: [expressSession, setExpressParams] - } - } -} diff --git a/packages/authentication-oauth/test/index.test.ts b/packages/authentication-oauth/test/index.test.ts deleted file mode 100644 index f4e192482e..0000000000 --- a/packages/authentication-oauth/test/index.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { strict as assert } from 'assert' -import { feathers } from '@feathersjs/feathers' -import { oauth, OauthSetupSettings } from '../src' -import { AuthenticationService } from '@feathersjs/authentication' - -describe('@feathersjs/authentication-oauth', () => { - describe('setup', () => { - it('errors when service does not exist', () => { - const app = feathers() - - assert.throws( - () => { - app.configure(oauth({ authService: 'something' } as OauthSetupSettings)) - }, - { - message: 'An authentication service must exist before registering @feathersjs/authentication-oauth' - } - ) - }) - - it('does not error when service is configured', () => { - const app = feathers() - - app.use('/authentication', new AuthenticationService(app)) - - app.configure(oauth()) - }) - }) -}) diff --git a/packages/authentication-oauth/test/service.test.ts b/packages/authentication-oauth/test/service.test.ts deleted file mode 100644 index a39310763a..0000000000 --- a/packages/authentication-oauth/test/service.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { strict as assert } from 'assert' -import axios, { AxiosResponse } from 'axios' -import { CookieJar } from 'tough-cookie' -import { expressFixture } from './utils/fixture' - -describe('@feathersjs/authentication-oauth service', () => { - const port = 9778 - const req = axios.create({ - withCredentials: true, - maxRedirects: 0 - }) - const cookie = new CookieJar() - let app: Awaited> - - const fetchErrorResponse = async (url: string): Promise => { - try { - await req.get(url) - } catch (error: any) { - return error.response - } - assert.fail('Should never get here') - } - - before(async () => { - app = await expressFixture(port, 5115) - }) - - after(async () => { - await app.teardown() - }) - - it('runs through the oAuth flow', async () => { - const host = `http://localhost:${port}` - let location = `${host}/oauth/github` - - const oauthResponse = await fetchErrorResponse(location) - assert.equal(oauthResponse.status, 303) - - oauthResponse.headers['set-cookie']?.forEach((value) => cookie.setCookie(value, host)) - - location = oauthResponse.data.location - - const providerResponse = await fetchErrorResponse(location) - assert.equal(providerResponse.status, 302) - - location = providerResponse.headers.location - - const { data } = await req.get(location, { - headers: { - cookie: await cookie.getCookieString(host) - } - }) - - assert.ok(data.accessToken) - assert.equal(data.authentication.strategy, 'github') - }) -}) diff --git a/packages/authentication-oauth/test/strategy.test.ts b/packages/authentication-oauth/test/strategy.test.ts deleted file mode 100644 index a4386fcbc2..0000000000 --- a/packages/authentication-oauth/test/strategy.test.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { strict as assert } from 'assert' -import { expressFixture, TestOAuthStrategy } from './utils/fixture' -import { AuthenticationService } from '@feathersjs/authentication' - -describe('@feathersjs/authentication-oauth/strategy', () => { - let app: Awaited> - let authService: AuthenticationService - let strategy: TestOAuthStrategy - - before(async () => { - app = await expressFixture(9778, 5115) - authService = app.service('authentication') - strategy = authService.getStrategy('github') as TestOAuthStrategy - }) - - after(async () => { - await app.teardown() - }) - - it('initializes, has .entityId and configuration', () => { - assert.ok(strategy) - assert.strictEqual(strategy.entityId, 'id') - assert.ok(strategy.configuration.entity) - }) - - it('reads configuration from the oauth key', () => { - const testConfigValue = Math.random() - app.get('authentication').oauth.github.hello = testConfigValue - assert.strictEqual(strategy.configuration.hello, testConfigValue) - }) - - it('getRedirect', async () => { - app.get('authentication').oauth.redirect = '/home' - - let redirect = await strategy.getRedirect({ accessToken: 'testing' }) - assert.equal(redirect, '/home#access_token=testing') - - redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - redirect: '/hi-there' - } - ) - assert.strictEqual('/home/hi-there#access_token=testing', redirect) - - redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - redirect: '/hi-there?' - } - ) - assert.equal(redirect, '/home/hi-there?access_token=testing') - - redirect = await strategy.getRedirect(new Error('something went wrong')) - assert.equal(redirect, '/home#error=something%20went%20wrong') - - redirect = await strategy.getRedirect(new Error()) - assert.equal(redirect, '/home#error=OAuth%20Authentication%20not%20successful') - - app.get('authentication').oauth.redirect = '/home?' - - redirect = await strategy.getRedirect({ accessToken: 'testing' }) - assert.equal(redirect, '/home?access_token=testing') - - delete app.get('authentication').oauth.redirect - - redirect = await strategy.getRedirect({ accessToken: 'testing' }) - assert.equal(redirect, null) - - app.get('authentication').oauth.redirect = '/#dashboard' - - redirect = await strategy.getRedirect({ accessToken: 'testing' }) - assert.equal(redirect, '/#dashboard?access_token=testing') - }) - - it('getRedirect with referrer and allowed origins (#2430)', async () => { - app.get('authentication').oauth.origins = ['https://feathersjs.com', 'https://feathers.cloud'] - - let redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - headers: { - referer: 'https://feathersjs.com/somewhere' - } - } - ) - assert.equal(redirect, 'https://feathersjs.com#access_token=testing') - - redirect = await strategy.getRedirect({ accessToken: 'testing' }, {}) - assert.equal(redirect, 'https://feathersjs.com#access_token=testing') - - redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - headers: { - referer: 'HTTPS://feathers.CLOUD' - } - } - ) - assert.equal(redirect, 'https://feathers.cloud#access_token=testing') - - redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - redirect: '/home', - headers: { - referer: 'https://feathersjs.com/somewhere' - } - } - ) - assert.equal(redirect, 'https://feathersjs.com/home#access_token=testing') - - await assert.rejects( - () => - strategy.getRedirect( - { accessToken: 'testing' }, - { - headers: { - referer: 'https://example.com' - } - } - ), - { - message: 'Referer "https://example.com" is not allowed.' - } - ) - }) - - describe('authenticate', () => { - it('with new user', async () => { - const authResult = await strategy.authenticate( - { - strategy: 'test', - profile: { - id: 'newEntity' - } - }, - {} - ) - - assert.deepEqual(authResult, { - authentication: { strategy: 'github' }, - user: { githubId: 'newEntity', id: authResult.user.id } - }) - }) - - it('with existing user and already linked strategy', async () => { - const existingUser = await app.service('users').create({ - githubId: 'existingEntity', - name: 'David' - }) - const authResult = await strategy.authenticate( - { - strategy: 'test', - profile: { - id: 'existingEntity' - } - }, - {} - ) - - assert.deepEqual(authResult, { - authentication: { strategy: 'github' }, - user: existingUser - }) - }) - - it('links user with existing authentication', async () => { - const user = await app.service('users').create({ - name: 'David' - }) - const jwt = await authService.createAccessToken( - {}, - { - subject: `${user.id}` - } - ) - - const authResult = await strategy.authenticate( - { - strategy: 'test', - profile: { - id: 'linkedEntity' - } - }, - { - authentication: { - strategy: 'jwt', - accessToken: jwt - } - } - ) - - assert.deepEqual(authResult, { - authentication: { strategy: 'github' }, - user: { id: user.id, name: user.name, githubId: 'linkedEntity' } - }) - }) - }) -}) diff --git a/packages/authentication-oauth/test/utils.test.ts b/packages/authentication-oauth/test/utils.test.ts deleted file mode 100644 index 76a3bd34e7..0000000000 --- a/packages/authentication-oauth/test/utils.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { AuthenticationService } from '@feathersjs/authentication/lib' -import { feathers } from '@feathersjs/feathers/lib' -import { strict as assert } from 'assert' -import { getGrantConfig } from '../src/utils' - -describe('@feathersjs/authentication-oauth/utils', () => { - it('getGrantConfig initialises Grant defaults', () => { - const app = feathers<{ authentication: AuthenticationService }>() - const auth = new AuthenticationService(app) - - app.set('host', '127.0.0.1') - app.set('port', '8877') - app.set('authentication', { - secret: 'supersecret', - entity: 'user', - service: 'users', - authStrategies: ['jwt'], - oauth: { - github: { - key: 'some-key', - secret: 'a secret secret', - authorize_url: '/github/authorize_url', - access_url: '/github/access_url', - dynamic: true - } - } - }) - const { defaults } = getGrantConfig(auth) - - assert.deepStrictEqual(defaults, { - prefix: '/oauth', - origin: 'http://127.0.0.1:8877', - transport: 'state', - response: ['tokens', 'raw', 'profile'] - }) - }) - - it('getGrantConfig uses Grant defaults when set', () => { - const app = feathers<{ authentication: AuthenticationService }>() - const auth = new AuthenticationService(app) - - app.set('host', '127.0.0.1') - app.set('port', '8877') - app.set('authentication', { - secret: 'supersecret', - entity: 'user', - service: 'users', - authStrategies: ['jwt'], - oauth: { - defaults: { - prefix: '/auth', - origin: 'https://localhost:3344' - }, - github: { - key: 'some-key', - secret: 'a secret secret', - authorize_url: '/github/authorize_url', - access_url: '/github/access_url', - dynamic: true - } - } - }) - const { defaults, github } = getGrantConfig(auth) - - assert.deepStrictEqual(defaults, { - prefix: '/auth', - origin: 'https://localhost:3344', - transport: 'state', - response: ['tokens', 'raw', 'profile'] - }) - assert.strictEqual(github?.redirect_uri, 'https://localhost:3344/auth/github/callback') - }) -}) diff --git a/packages/authentication-oauth/test/utils/fixture.ts b/packages/authentication-oauth/test/utils/fixture.ts deleted file mode 100644 index 0371f516ea..0000000000 --- a/packages/authentication-oauth/test/utils/fixture.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Application, feathers, NextFunction } from '@feathersjs/feathers' -import express, { rest, errorHandler } from '@feathersjs/express' -import { memory, MemoryService } from '@feathersjs/memory' -import { - AuthenticationService, - JWTStrategy, - AuthenticationRequest, - AuthenticationParams -} from '@feathersjs/authentication' -import { provider } from './provider' -import { oauth, OAuthStrategy } from '../../src' - -export interface ServiceTypes { - authentication: AuthenticationService - users: MemoryService -} - -export class TestOAuthStrategy extends OAuthStrategy { - async authenticate(data: AuthenticationRequest, params: AuthenticationParams) { - const { fromMiddleware } = params - const authResult = await super.authenticate(data, params) - - if (fromMiddleware) { - authResult.fromMiddleware = fromMiddleware - } - - return authResult - } -} - -export const fixtureConfig = - (port: number, providerInstance: Awaited>) => (app: Application) => { - app.set('host', '127.0.0.1') - app.set('port', port) - app.set('authentication', { - secret: 'supersecret', - entity: 'user', - service: 'users', - authStrategies: ['jwt'], - oauth: { - github: { - key: 'some-key', - secret: 'a secret secret', - authorize_url: providerInstance.url(`/github/authorize_url`), - access_url: providerInstance.url(`/github/access_url`), - dynamic: true - } - } - }) - - return app - } - -export const expressFixture = async (serverPort: number, providerPort: number) => { - const providerInstance = await provider({ flow: 'oauth2', port: providerPort }) - const app = express(feathers()) - const auth = new AuthenticationService(app) - - auth.register('jwt', new JWTStrategy()) - auth.register('github', new TestOAuthStrategy()) - - app.configure(rest()) - app.configure(fixtureConfig(serverPort, providerInstance)) - - app.use((req, _res, next) => { - req.feathers = { fromMiddleware: 'testing' } - next() - }) - app.use('authentication', auth) - app.use('users', memory()) - - app.configure(oauth()) - app.use(errorHandler({ logger: false })) - app.hooks({ - teardown: [ - async (_context: any, next: NextFunction) => { - await providerInstance.close() - await next() - } - ] - }) - app.hooks({ - error: { - all: [ - async (context) => { - console.error(context.error) - } - ] - } - }) - - await app.listen(serverPort) - - return app -} diff --git a/packages/authentication-oauth/test/utils/provider.ts b/packages/authentication-oauth/test/utils/provider.ts deleted file mode 100644 index 7a63e25e87..0000000000 --- a/packages/authentication-oauth/test/utils/provider.ts +++ /dev/null @@ -1,282 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @typescript-eslint/no-empty-function */ -// Ported from https://github.com/simov/grant/blob/master/test/util/provider.js -import http from 'http' -import _url from 'url' -import qs from 'qs' - -const buffer = (req: http.IncomingMessage, done: any) => { - let data = '' - req.on('data', (chunk: any) => (data += chunk)) - req.on('end', () => done(/^{.*}$/.test(data) ? JSON.parse(data) : qs.parse(data))) -} -const _query = (req: http.IncomingMessage) => { - const parsed = _url.parse(req.url as string, false) - const query = qs.parse(parsed.query as any) - return query -} -const _oauth = (req: http.IncomingMessage) => - qs.parse((req.headers.authorization || '').replace('OAuth ', '').replace(/"/g, '').replace(/,/g, '&')) - -const sign = (...args: any[]) => - args - .map((arg, index) => - index < 2 - ? Buffer.from(JSON.stringify(arg)) - .toString('base64') - .replace(/=/g, '') - .replace(/\+/g, '-') - .replace(/\//g, '_') - : arg - ) - .join('.') - -export const provider = async ({ flow, port = 5000 }: { flow: 'oauth2' | 'oauth1'; port: number }) => { - const server = await (flow === 'oauth2' ? oauth2(port) : oauth1(port)) - return { - oauth1, - oauth2, - on, - server, - url: (path: string) => `http://localhost:${port}${path}`, - close: () => new Promise((resolve) => server.close(resolve)) - } -} - -const oauth1 = (port: number) => - new Promise((resolve) => { - let callback: any - const server = http.createServer() - server.on('request', (req, res) => { - const method = req.method - const url = req.url as string - const headers = req.headers - const oauth = _oauth(req) - const query = _query(req) - const provider = /^\/(.*)\/.*/.exec(url) && /^\/(.*)\/.*/.exec(url)![1] - - if (/request_url/.test(url)) { - callback = oauth.oauth_callback - buffer(req, (form: any) => { - if (provider === 'getpocket') { - callback = form.redirect_uri - } - on.request({ url, headers, query, form, oauth }) - provider === 'sellsy' - ? res.writeHead(200, { 'content-type': 'application/json' }) - : res.writeHead(200, { 'content-type': 'application/x-www-form-urlencoded' }) - provider === 'getpocket' - ? res.end(qs.stringify({ code: 'code' })) - : provider === 'sellsy' - ? res.end( - 'authentification_url=https://apifeed.sellsy.com/0/login.php&oauth_token=token&oauth_token_secret=secret&oauth_callback_confirmed=true' - ) - : res.end(qs.stringify({ oauth_token: 'token', oauth_token_secret: 'secret' })) - }) - } else if (/authorize_url/.test(url)) { - const location = callback + '?' + qs.stringify({ oauth_token: 'token', oauth_verifier: 'verifier' }) - on.authorize({ url, headers, query }) - res.writeHead(302, { location }) - res.end() - } else if (/access_url/.test(url)) { - buffer(req, (form: any) => { - on.access({ url, headers, query, form, oauth }) - res.writeHead(200, { 'content-type': 'application/json' }) - provider === 'getpocket' - ? res.end(JSON.stringify({ access_token: 'token' })) - : res.end( - JSON.stringify({ - oauth_token: 'token', - oauth_token_secret: 'secret', - user_id: provider === 'twitter' ? 'id' : undefined - }) - ) - }) - } else if (/request_error_message/.test(url)) { - callback = oauth.oauth_callback - buffer(req, (form: any) => { - on.request({ url, headers, query, form, oauth }) - res.writeHead(200, { 'content-type': 'application/x-www-form-urlencoded' }) - res.end(qs.stringify({ error: { message: 'invalid' } })) - }) - } else if (/request_error_token/.test(url)) { - callback = oauth.oauth_callback - buffer(req, (form: any) => { - on.request({ url, headers, query, form, oauth }) - res.writeHead(200, { 'content-type': 'application/x-www-form-urlencoded' }) - res.end() - }) - } else if (/request_error_status/.test(url)) { - callback = oauth.oauth_callback - buffer(req, (form: any) => { - on.request({ url, headers, query, form, oauth }) - res.writeHead(500, { 'content-type': 'application/x-www-form-urlencoded' }) - res.end(qs.stringify({ invalid: 'request_url' })) - }) - } else if (/authorize_error_message/.test(url)) { - const location = callback + '?' + qs.stringify({ error: { message: 'invalid' } }) - on.authorize({ url, headers, query }) - res.writeHead(302, { location }) - res.end() - } else if (/authorize_error_token/.test(url)) { - const location = callback as string - on.authorize({ url, headers, query }) - res.writeHead(302, { location }) - res.end() - } else if (/access_error_status/.test(url)) { - buffer(req, (form: any) => { - on.access({ url, headers, query, form, oauth }) - res.writeHead(500, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ invalid: 'access_url' })) - }) - } else if (/profile_url/.test(url)) { - on.profile({ method, url, query, headers }) - res.writeHead(200, { 'content-type': 'application/json' }) - provider === 'flickr' - ? res.end('callback({"user": "simov"})') - : res.end(JSON.stringify({ user: 'simov' })) - } - }) - server.listen(port, () => resolve(server)) - }) - -const oauth2 = (port: number) => - new Promise((resolve) => { - const server = http.createServer() - let openid: any - server.on('request', (req, res) => { - const method = req.method - const url = req.url as string - const headers = req.headers - const query = _query(req) as any - const provider = /^\/(.*)\/.*/.exec(url) && /^\/(.*)\/.*/.exec(url)![1] - - if (/authorize_url/.test(url)) { - openid = (query.scope || []).includes('openid') - on.authorize({ provider, method, url, headers, query }) - if (query.response_mode === 'form_post') { - provider === 'apple' - ? res.end( - qs.stringify({ - code: 'code', - user: { name: { firstName: 'jon', lastName: 'doe' }, email: 'jon@doe.com' } - }) - ) - : res.end('code') - return - } - const location = - query.redirect_uri + - '?' + - (provider === 'intuit' - ? qs.stringify({ code: 'code', realmId: '123' }) - : qs.stringify({ code: 'code' })) - res.writeHead(302, { location }) - res.end() - } else if (/access_url/.test(url)) { - buffer(req, (form: any) => { - on.access({ provider, method, url, headers, query, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - provider === 'concur' - ? res.end(' token refresh ') - : provider === 'withings' - ? res.end( - JSON.stringify({ - body: { - access_token: 'token', - refresh_token: 'refresh', - expires_in: 3600 - } - }) - ) - : res.end( - JSON.stringify({ - access_token: 'token', - refresh_token: 'refresh', - expires_in: 3600, - id_token: openid ? sign({ typ: 'JWT' }, { nonce: 'whatever' }, 'signature') : undefined, - open_id: provider === 'tiktok' ? 'id' : undefined, - uid: provider === 'weibo' ? 'id' : undefined, - openid: provider === 'wechat' ? 'openid' : undefined - }) - ) - }) - } else if (/authorize_error_message/.test(url)) { - on.authorize({ url, query, headers }) - const location = query.redirect_uri + '?' + qs.stringify({ error: { message: 'invalid' } }) - res.writeHead(302, { location }) - res.end() - } else if (/authorize_error_code/.test(url)) { - on.authorize({ url, query, headers }) - const location = query.redirect_uri as string - res.writeHead(302, { location }) - res.end() - } else if (/authorize_error_state_mismatch/.test(url)) { - on.authorize({ url, query, headers }) - const location = query.redirect_uri + '?' + qs.stringify({ code: 'code', state: 'whatever' }) - res.writeHead(302, { location }) - res.end() - } else if (/authorize_error_state_missing/.test(url)) { - on.authorize({ url, query, headers }) - const location = query.redirect_uri + '?' + qs.stringify({ code: 'code' }) - res.writeHead(302, { location }) - res.end() - } else if (/access_error_nonce_mismatch/.test(url)) { - buffer(req, (form: any) => { - on.access({ method, url, query, headers, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end( - JSON.stringify({ - id_token: sign({ typ: 'JWT' }, { nonce: 'whatever' }, 'signature') - }) - ) - }) - } else if (/access_error_nonce_missing/.test(url)) { - buffer(req, (form: any) => { - on.access({ method, url, query, headers, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end( - JSON.stringify({ - id_token: sign({ typ: 'JWT' }, {}, 'signature') - }) - ) - }) - } else if (/access_error_message/.test(url)) { - buffer(req, (form: any) => { - on.access({ method, url, query, headers, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ error: { message: 'invalid' } })) - }) - } else if (/access_error_status/.test(url)) { - buffer(req, (form: any) => { - on.access({ method, url, query, headers, form }) - res.writeHead(500, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ invalid: 'access_url' })) - }) - } else if (/profile_url/.test(url)) { - if (method === 'POST') { - buffer(req, (form: any) => { - on.profile({ method, url, query, headers, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ id: 'test', user: 'simov' })) - }) - } else { - on.profile({ method, url, query, headers }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ id: 'test', user: 'simov' })) - } - } else if (/profile_error/.test(url)) { - on.profile({ method, url, query, headers }) - res.writeHead(400, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ error: { message: 'Not Found' } })) - } - }) - server.listen(port, () => resolve(server)) - }) - -const on = { - request: (_opts: any) => {}, - authorize: (_opts: any) => {}, - access: (_opts: any) => {}, - profile: (_opts: any) => {} -} diff --git a/packages/authentication-oauth/tsconfig.json b/packages/authentication-oauth/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/authentication-oauth/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/authentication/CHANGELOG.md b/packages/authentication/CHANGELOG.md deleted file mode 100644 index bedf8c6348..0000000000 --- a/packages/authentication/CHANGELOG.md +++ /dev/null @@ -1,1836 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -### Bug Fixes - -- **authentication:** Export JwtVerifyOptions ([#3214](https://github.com/feathersjs/feathers/issues/3214)) ([d59896e](https://github.com/feathersjs/feathers/commit/d59896eb0229f1490c712f19cf84eb2bcf123698)) - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/authentication - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **authentication:** Fix order of connection and login event handling ([#2909](https://github.com/feathersjs/feathers/issues/2909)) ([801a503](https://github.com/feathersjs/feathers/commit/801a503425062e27f2a32b91493b6ffae3822626)) -- **core:** `context.type` for around hooks ([#2890](https://github.com/feathersjs/feathers/issues/2890)) ([d606ac6](https://github.com/feathersjs/feathers/commit/d606ac660fd5335c95206784fea36530dd2e851a)) - -### Features - -- **schema:** Virtual property resolvers ([#2900](https://github.com/feathersjs/feathers/issues/2900)) ([7d03b57](https://github.com/feathersjs/feathers/commit/7d03b57ae2f633bdd4a368e0d5955011fbd6c329)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **authentication:** Improve logout and disconnect connection handling ([#2813](https://github.com/feathersjs/feathers/issues/2813)) ([dd77379](https://github.com/feathersjs/feathers/commit/dd77379d8bdcd32d529bef912e672639e4899823)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) -- **schema:** Make schemas validation library independent and add TypeBox support ([#2772](https://github.com/feathersjs/feathers/issues/2772)) ([44172d9](https://github.com/feathersjs/feathers/commit/44172d99b566d11d9ceda04f1d0bf72b6d05ce76)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Features - -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Bug Fixes - -- **authentication:** Add safe dispatch data for authentication requests ([#2662](https://github.com/feathersjs/feathers/issues/2662)) ([d8104a1](https://github.com/feathersjs/feathers/commit/d8104a19ee9181e6a5ea81014af29ff9a3c28a8a)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Features - -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **authentication:** Add setup method for auth strategies ([#1611](https://github.com/feathersjs/feathers/issues/1611)) ([a3c3581](https://github.com/feathersjs/feathers/commit/a3c35814dccdbbf6de96f04f60b226ce206c6dbe)) -- **configuration:** Allow app configuration to be validated against a schema ([#2590](https://github.com/feathersjs/feathers/issues/2590)) ([a268f86](https://github.com/feathersjs/feathers/commit/a268f86da92a8ada14ed11ab456aac0a4bba5bb0)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -### Features - -- **authentication-oauth:** Allow dynamic oAuth redirect ([#2469](https://github.com/feathersjs/feathers/issues/2469)) ([b7143d4](https://github.com/feathersjs/feathers/commit/b7143d4c0fbe961e714f79512be04449b9bbd7d9)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **hooks:** Migrate built-in hooks and allow backwards compatibility ([#2358](https://github.com/feathersjs/feathers/issues/2358)) ([759c5a1](https://github.com/feathersjs/feathers/commit/759c5a19327a731af965c3604119393b3d09a406)) -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) - -### Features - -- Application service types default to any ([#1566](https://github.com/feathersjs/feathers/issues/1566)) ([d93ba9a](https://github.com/feathersjs/feathers/commit/d93ba9a17edd20d3397bb00f4f6e82e804e42ed6)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -**Note:** Version bump only for package @feathersjs/authentication - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -### Bug Fixes - -- **authentication:** consistent response return between local and jwt strategy ([#2042](https://github.com/feathersjs/feathers/issues/2042)) ([8d25be1](https://github.com/feathersjs/feathers/commit/8d25be101a2593a9e789375c928a07780b9e28cf)) - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -**Note:** Version bump only for package @feathersjs/authentication - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -**Note:** Version bump only for package @feathersjs/authentication - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -### Bug Fixes - -- **authentication:** Add JWT getEntityQuery ([#2013](https://github.com/feathersjs/feathers/issues/2013)) ([e0e7fb5](https://github.com/feathersjs/feathers/commit/e0e7fb5162940fe776731283b40026c61d9c8a33)) - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -### Bug Fixes - -- **authentication:** Omit query in JWT strategy ([#2011](https://github.com/feathersjs/feathers/issues/2011)) ([04ce7e9](https://github.com/feathersjs/feathers/commit/04ce7e98515fe9d495cd0e83e0da097e9bcd7382)) - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -### Bug Fixes - -- **authentication:** Include query params when authenticating via authenticate hook [#2009](https://github.com/feathersjs/feathers/issues/2009) ([4cdb7bf](https://github.com/feathersjs/feathers/commit/4cdb7bf2898385ddac7a1692bc9ac2f6cf5ad446)) - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -### Bug Fixes - -- **authentication:** Remove entity from connection information on logout ([#1889](https://github.com/feathersjs/feathers/issues/1889)) ([b062753](https://github.com/feathersjs/feathers/commit/b0627530d61babe15dd84369d3093ccae4b780ca)) - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -### Bug Fixes - -- **authentication:** Improve JWT strategy configuration error message ([#1844](https://github.com/feathersjs/feathers/issues/1844)) ([2c771db](https://github.com/feathersjs/feathers/commit/2c771dbb22d53d4f7de3c3f514e57afa1a186322)) - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/authentication - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -### Bug Fixes - -- Add `params.authentication` type, remove `hook.connection` type ([#1732](https://github.com/feathersjs/feathers/issues/1732)) ([d46b7b2](https://github.com/feathersjs/feathers/commit/d46b7b2abac8862c0e4dbfce20d71b8b8a96692f)) - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/authentication - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/authentication - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/authentication - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -### Bug Fixes - -- **authentication:** Retain object references in authenticate hook ([#1675](https://github.com/feathersjs/feathers/issues/1675)) ([e1939be](https://github.com/feathersjs/feathers/commit/e1939be19d4e79d3f5e2fe69ba894a11c627ae99)) - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/authentication - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -### Bug Fixes - -- Add jsonwebtoken TypeScript type dependency ([317c80a](https://github.com/feathersjs/feathers/commit/317c80a9205e8853bb830a12c3aa1a19e95f9abc)) -- Small type improvements ([#1624](https://github.com/feathersjs/feathers/issues/1624)) ([50162c6](https://github.com/feathersjs/feathers/commit/50162c6e562f0a47c6a280c4f01fff7c3afee293)) - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -**Note:** Version bump only for package @feathersjs/authentication - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -### Bug Fixes - -- Authentication type improvements and timeout fix ([#1605](https://github.com/feathersjs/feathers/issues/1605)) ([19854d3](https://github.com/feathersjs/feathers/commit/19854d3)) -- Improve error message when authentication strategy is not allowed ([#1600](https://github.com/feathersjs/feathers/issues/1600)) ([317a312](https://github.com/feathersjs/feathers/commit/317a312)) - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -**Note:** Version bump only for package @feathersjs/authentication - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- check for undefined access token ([#1571](https://github.com/feathersjs/feathers/issues/1571)) ([976369d](https://github.com/feathersjs/feathers/commit/976369d)) -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/authentication - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -### Bug Fixes - -- Use long-timeout for JWT expiration timers ([#1552](https://github.com/feathersjs/feathers/issues/1552)) ([65637ec](https://github.com/feathersjs/feathers/commit/65637ec)) - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/authentication - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -### Bug Fixes - -- Fix auth publisher mistake ([08bad61](https://github.com/feathersjs/feathers/commit/08bad61)) - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Expire and remove authenticated real-time connections ([#1512](https://github.com/feathersjs/feathers/issues/1512)) ([2707c33](https://github.com/feathersjs/feathers/commit/2707c33)) -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -### Features - -- Let strategies handle the connection ([#1510](https://github.com/feathersjs/feathers/issues/1510)) ([4329feb](https://github.com/feathersjs/feathers/commit/4329feb)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Add getEntityId to JWT strategy and fix legacy Socket authentication ([#1488](https://github.com/feathersjs/feathers/issues/1488)) ([9a3b324](https://github.com/feathersjs/feathers/commit/9a3b324)) -- Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/authentication - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/authentication - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -### Bug Fixes - -- Updated typings for ServiceMethods ([#1409](https://github.com/feathersjs/feathers/issues/1409)) ([b5ee7e2](https://github.com/feathersjs/feathers/commit/b5ee7e2)) - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Make oAuth paths more consistent and improve authentication client ([#1377](https://github.com/feathersjs/feathers/issues/1377)) ([adb2543](https://github.com/feathersjs/feathers/commit/adb2543)) -- Set authenticated: true after successful authentication ([#1367](https://github.com/feathersjs/feathers/issues/1367)) ([9918cff](https://github.com/feathersjs/feathers/commit/9918cff)) -- Typings fix and improvements. ([#1364](https://github.com/feathersjs/feathers/issues/1364)) ([515b916](https://github.com/feathersjs/feathers/commit/515b916)) -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -### Bug Fixes - -- Throw NotAuthenticated on token verification errors ([#1357](https://github.com/feathersjs/feathers/issues/1357)) ([e0120df](https://github.com/feathersjs/feathers/commit/e0120df)) - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -### Bug Fixes - -- Always require strategy parameter in authentication ([#1327](https://github.com/feathersjs/feathers/issues/1327)) ([d4a8021](https://github.com/feathersjs/feathers/commit/d4a8021)) -- Bring back params.authenticated ([#1317](https://github.com/feathersjs/feathers/issues/1317)) ([a0ffd5e](https://github.com/feathersjs/feathers/commit/a0ffd5e)) -- Improve authentication parameter handling ([#1333](https://github.com/feathersjs/feathers/issues/1333)) ([6e77204](https://github.com/feathersjs/feathers/commit/6e77204)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) -- Rename jwtStrategies option to authStrategies ([#1305](https://github.com/feathersjs/feathers/issues/1305)) ([4aee151](https://github.com/feathersjs/feathers/commit/4aee151)) - -### Features - -- Change and *JWT methods to *accessToken ([#1304](https://github.com/feathersjs/feathers/issues/1304)) ([5ac826b](https://github.com/feathersjs/feathers/commit/5ac826b)) - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Bug Fixes - -- Added path and method in to express request for passport ([#1112](https://github.com/feathersjs/feathers/issues/1112)) ([afa1cb4](https://github.com/feathersjs/feathers/commit/afa1cb4)) -- Authentication core improvements ([#1260](https://github.com/feathersjs/feathers/issues/1260)) ([c5dc7a2](https://github.com/feathersjs/feathers/commit/c5dc7a2)) -- Improve JWT authentication option handling ([#1261](https://github.com/feathersjs/feathers/issues/1261)) ([31b956b](https://github.com/feathersjs/feathers/commit/31b956b)) -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- Only merge authenticated property on update ([8a564f7](https://github.com/feathersjs/feathers/commit/8a564f7)) -- reduce authentication connection hook complexity and remove unnecessary checks ([fa94b2f](https://github.com/feathersjs/feathers/commit/fa94b2f)) -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **authentication:** Fall back when req.app is not the application when emitting events ([#1185](https://github.com/feathersjs/feathers/issues/1185)) ([6a534f0](https://github.com/feathersjs/feathers/commit/6a534f0)) -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) -- **docs/new-features:** syntax highlighting ([#347](https://github.com/feathersjs/feathers/issues/347)) ([4ab7c95](https://github.com/feathersjs/feathers/commit/4ab7c95)) -- **package:** update @feathersjs/commons to version 2.0.0 ([#692](https://github.com/feathersjs/feathers/issues/692)) ([ca665ab](https://github.com/feathersjs/feathers/commit/ca665ab)) -- **package:** update debug to version 3.0.0 ([#555](https://github.com/feathersjs/feathers/issues/555)) ([f788804](https://github.com/feathersjs/feathers/commit/f788804)) -- **package:** update jsonwebtoken to version 8.0.0 ([#567](https://github.com/feathersjs/feathers/issues/567)) ([6811626](https://github.com/feathersjs/feathers/commit/6811626)) -- **package:** update ms to version 2.0.0 ([#509](https://github.com/feathersjs/feathers/issues/509)) ([7e4b0b6](https://github.com/feathersjs/feathers/commit/7e4b0b6)) -- **package:** update passport to version 0.4.0 ([#558](https://github.com/feathersjs/feathers/issues/558)) ([dcb14a5](https://github.com/feathersjs/feathers/commit/dcb14a5)) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) -- Add AuthenticationBaseStrategy and make authentication option handling more explicit ([#1284](https://github.com/feathersjs/feathers/issues/1284)) ([2667d92](https://github.com/feathersjs/feathers/commit/2667d92)) -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) -- Authentication v3 local authentication ([#1211](https://github.com/feathersjs/feathers/issues/1211)) ([0fa5f7c](https://github.com/feathersjs/feathers/commit/0fa5f7c)) -- Remove (hook, next) signature and SKIP support ([#1269](https://github.com/feathersjs/feathers/issues/1269)) ([211c0f8](https://github.com/feathersjs/feathers/commit/211c0f8)) -- Support params symbol to skip authenticate hook ([#1296](https://github.com/feathersjs/feathers/issues/1296)) ([d16cf4d](https://github.com/feathersjs/feathers/commit/d16cf4d)) - -### BREAKING CHANGES - -- Update authentication strategies for @feathersjs/authentication v3 - -## [2.1.16](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.15...@feathersjs/authentication@2.1.16) (2019-01-26) - -### Bug Fixes - -- **authentication:** Fall back when req.app is not the application when emitting events ([#1185](https://github.com/feathersjs/feathers/issues/1185)) ([6a534f0](https://github.com/feathersjs/feathers/commit/6a534f0)) - -## [2.1.15](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.14...@feathersjs/authentication@2.1.15) (2019-01-02) - -### Bug Fixes - -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) - - - -## [2.1.14](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.13...@feathersjs/authentication@2.1.14) (2018-12-16) - -### Bug Fixes - -- Added path and method in to express request for passport ([#1112](https://github.com/feathersjs/feathers/issues/1112)) ([afa1cb4](https://github.com/feathersjs/feathers/commit/afa1cb4)) - - - -## [2.1.13](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.12...@feathersjs/authentication@2.1.13) (2018-10-26) - -**Note:** Version bump only for package @feathersjs/authentication - - - -## [2.1.12](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.11...@feathersjs/authentication@2.1.12) (2018-10-25) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- Only merge authenticated property on update ([8a564f7](https://github.com/feathersjs/feathers/commit/8a564f7)) - - - -## [2.1.11](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.10...@feathersjs/authentication@2.1.11) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/authentication - - - -## [2.1.10](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.9...@feathersjs/authentication@2.1.10) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/authentication - - - -## [2.1.9](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.8...@feathersjs/authentication@2.1.9) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/authentication - - - -## 2.1.8 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v2.1.7](https://github.com/feathersjs/authentication/tree/v2.1.7) (2018-06-29) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.6...v2.1.7) - -**Fixed bugs:** - -- XXXOrRestrict undermines provider \(security\) logic [\#395](https://github.com/feathersjs/authentication/issues/395) - -**Closed issues:** - -- Customize response of authentication service [\#679](https://github.com/feathersjs/authentication/issues/679) -- hook.params.user is null using REST [\#678](https://github.com/feathersjs/authentication/issues/678) -- Can't store JWT token to cookie on REST client [\#676](https://github.com/feathersjs/authentication/issues/676) -- Is there a way to get req.user without using the authentication middleware? [\#675](https://github.com/feathersjs/authentication/issues/675) - -**Merged pull requests:** - -- Remove subject from the JWT verification options [\#686](https://github.com/feathersjs/authentication/pull/686) ([rasendubi](https://github.com/rasendubi)) -- Replaced feathers.static with express.static [\#685](https://github.com/feathersjs/authentication/pull/685) ([georgehorrell](https://github.com/georgehorrell)) -- Remove dependency on Express and Express middleware [\#683](https://github.com/feathersjs/authentication/pull/683) ([daffl](https://github.com/daffl)) -- Update sinon to the latest version 🚀 [\#681](https://github.com/feathersjs/authentication/pull/681) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.6](https://github.com/feathersjs/authentication/tree/v2.1.6) (2018-06-01) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.5...v2.1.6) - -**Closed issues:** - -- Authentication local strategy not working with a Custom User service [\#672](https://github.com/feathersjs/authentication/issues/672) -- CLI command bug: 'Feathers generate authentication' produces bad working 'users' service [\#670](https://github.com/feathersjs/authentication/issues/670) -- config\default.json generated without callbackURL config needed to set redirect URL for Google Outh2 [\#669](https://github.com/feathersjs/authentication/issues/669) -- HELP WANTED: Authentication strategy 'jwt' is not registered. [\#668](https://github.com/feathersjs/authentication/issues/668) -- Authenticate shows error: No auth token [\#667](https://github.com/feathersjs/authentication/issues/667) -- authentication - Method: remove [\#662](https://github.com/feathersjs/authentication/issues/662) -- NotAuthenticated: jwt expired [\#633](https://github.com/feathersjs/authentication/issues/633) -- Authentication via phone number [\#616](https://github.com/feathersjs/authentication/issues/616) -- Persist auth tokens on db [\#569](https://github.com/feathersjs/authentication/issues/569) -- Tighter integration with feathers-authentication-management [\#393](https://github.com/feathersjs/authentication/issues/393) - -**Merged pull requests:** - -- Fix tests to work with latest Sinon [\#674](https://github.com/feathersjs/authentication/pull/674) ([daffl](https://github.com/daffl)) -- add option to allowUnauthenticated [\#599](https://github.com/feathersjs/authentication/pull/599) ([MichaelErmer](https://github.com/MichaelErmer)) - -## [v2.1.5](https://github.com/feathersjs/authentication/tree/v2.1.5) (2018-04-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.4...v2.1.5) - -**Closed issues:** - -- feathersjs Invalid token: expired [\#661](https://github.com/feathersjs/authentication/issues/661) -- Safari and iOS facebook login can't redirect back, but others can. [\#651](https://github.com/feathersjs/authentication/issues/651) - -**Merged pull requests:** - -- Remove payload and user entity on logout. [\#665](https://github.com/feathersjs/authentication/pull/665) ([bertho-zero](https://github.com/bertho-zero)) - -## [v2.1.4](https://github.com/feathersjs/authentication/tree/v2.1.4) (2018-04-12) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.3...v2.1.4) - -**Closed issues:** - -- Column "createdAt" does not exist" in Autentication [\#660](https://github.com/feathersjs/authentication/issues/660) -- How to make a user automatically logined on server side? [\#659](https://github.com/feathersjs/authentication/issues/659) -- authentication-jwt functional example [\#657](https://github.com/feathersjs/authentication/issues/657) -- "No auth token" with auth0 when following the guide [\#655](https://github.com/feathersjs/authentication/issues/655) -- Service returns \[No Auth Token\] same by passing Authorization Token on HEADER [\#641](https://github.com/feathersjs/authentication/issues/641) - -**Merged pull requests:** - -- Throw an error for unavailable strategy [\#663](https://github.com/feathersjs/authentication/pull/663) ([daffl](https://github.com/daffl)) -- Update sinon to the latest version 🚀 [\#656](https://github.com/feathersjs/authentication/pull/656) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.3](https://github.com/feathersjs/authentication/tree/v2.1.3) (2018-03-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.2...v2.1.3) - -**Closed issues:** - -- ts [\#647](https://github.com/feathersjs/authentication/issues/647) -- Using /auth/facebook gives a 404 from vue-router [\#643](https://github.com/feathersjs/authentication/issues/643) -- Crash after upgrade to feathersjs v3 [\#642](https://github.com/feathersjs/authentication/issues/642) -- SameSite cookie option [\#640](https://github.com/feathersjs/authentication/issues/640) -- context.params.user is empty object [\#635](https://github.com/feathersjs/authentication/issues/635) -- Token is undefined for authenticated user [\#500](https://github.com/feathersjs/authentication/issues/500) -- 1.x: logout timers need to be moved [\#467](https://github.com/feathersjs/authentication/issues/467) - -**Merged pull requests:** - -- Merge auk to master [\#653](https://github.com/feathersjs/authentication/pull/653) ([wnxhaja](https://github.com/wnxhaja)) -- Update ws to the latest version 🚀 [\#645](https://github.com/feathersjs/authentication/pull/645) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update sinon-chai to the latest version 🚀 [\#644](https://github.com/feathersjs/authentication/pull/644) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.2](https://github.com/feathersjs/authentication/tree/v2.1.2) (2018-02-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.1...v2.1.2) - -**Fixed bugs:** - -- hook failed with auth & sync [\#540](https://github.com/feathersjs/authentication/issues/540) -- JWT Cookie [\#389](https://github.com/feathersjs/authentication/issues/389) - -**Closed issues:** - -- forgot password [\#638](https://github.com/feathersjs/authentication/issues/638) -- registered many authentication services [\#634](https://github.com/feathersjs/authentication/issues/634) -- TypeError: Cannot read property '\_strategy' of undefined [\#632](https://github.com/feathersjs/authentication/issues/632) -- How to change 5000ms timeout? [\#628](https://github.com/feathersjs/authentication/issues/628) -- cookie reused from server in SSR app [\#619](https://github.com/feathersjs/authentication/issues/619) -- Express middleware not setCookie [\#617](https://github.com/feathersjs/authentication/issues/617) -- Server to Server Authentication Question [\#612](https://github.com/feathersjs/authentication/issues/612) -- No way to share token between socket-rest-express [\#607](https://github.com/feathersjs/authentication/issues/607) -- 404 when accessing route using customer authentication [\#579](https://github.com/feathersjs/authentication/issues/579) -- \[question\] is it possible to protect by role a create method? [\#564](https://github.com/feathersjs/authentication/issues/564) -- Authentication with server-side rendering [\#560](https://github.com/feathersjs/authentication/issues/560) -- Problem authenticating using REST middleware [\#495](https://github.com/feathersjs/authentication/issues/495) -- A supposed way to auth requests from SSR to Feathers API [\#469](https://github.com/feathersjs/authentication/issues/469) -- rename `app.authenticate\(\)` to `app.\_authenticate\(\)` [\#468](https://github.com/feathersjs/authentication/issues/468) - -**Merged pull requests:** - -- Delete slack link [\#637](https://github.com/feathersjs/authentication/pull/637) ([vodniciarv](https://github.com/vodniciarv)) -- Update @feathersjs/authentication-jwt to the latest version 🚀 [\#631](https://github.com/feathersjs/authentication/pull/631) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update mocha to the latest version 🚀 [\#629](https://github.com/feathersjs/authentication/pull/629) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update ws to the latest version 🚀 [\#625](https://github.com/feathersjs/authentication/pull/625) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Options merged [\#611](https://github.com/feathersjs/authentication/pull/611) ([Makingweb](https://github.com/Makingweb)) - -## [v2.1.1](https://github.com/feathersjs/authentication/tree/v2.1.1) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.0...v2.1.1) - -**Closed issues:** - -- Deleted user successfully signs in using JWT [\#615](https://github.com/feathersjs/authentication/issues/615) -- Feathers.authenticate gives window undefined \(server-rendered\) [\#573](https://github.com/feathersjs/authentication/issues/573) -- Be careful with discard\('password'\) in user [\#434](https://github.com/feathersjs/authentication/issues/434) - -**Merged pull requests:** - -- Update readme to correspond with latest release [\#621](https://github.com/feathersjs/authentication/pull/621) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#620](https://github.com/feathersjs/authentication/pull/620) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update mongodb to the latest version 🚀 [\#618](https://github.com/feathersjs/authentication/pull/618) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.0](https://github.com/feathersjs/authentication/tree/v2.1.0) (2017-12-06) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.0.1...v2.1.0) - -**Closed issues:** - -- Method "Remove" from Authentication Service gives Internal Server Error when using JWT Authentication with Cookies. [\#606](https://github.com/feathersjs/authentication/issues/606) -- Anonymous Authentication fails over Socket.io [\#457](https://github.com/feathersjs/authentication/issues/457) - -**Merged pull requests:** - -- Always prevent publishing of authentication events [\#614](https://github.com/feathersjs/authentication/pull/614) ([daffl](https://github.com/daffl)) -- Update feathers-memory to the latest version 🚀 [\#613](https://github.com/feathersjs/authentication/pull/613) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.0.1](https://github.com/feathersjs/authentication/tree/v2.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.0.0...v2.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#605](https://github.com/feathersjs/authentication/pull/605) ([daffl](https://github.com/daffl)) - -## [v2.0.0](https://github.com/feathersjs/authentication/tree/v2.0.0) (2017-11-09) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.3.1...v2.0.0) - -**Closed issues:** - -- is there a way to detect if the token used is correct or not ? [\#601](https://github.com/feathersjs/authentication/issues/601) -- option for non-JWT based session [\#597](https://github.com/feathersjs/authentication/issues/597) - -**Merged pull requests:** - -- Update nsp to the latest version 🚀 [\#603](https://github.com/feathersjs/authentication/pull/603) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.1](https://github.com/feathersjs/authentication/tree/v1.3.1) (2017-11-03) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.4.1...v1.3.1) - -**Merged pull requests:** - -- Only set the JWT UUID if it is not already set [\#600](https://github.com/feathersjs/authentication/pull/600) ([daffl](https://github.com/daffl)) - -## [v1.4.1](https://github.com/feathersjs/authentication/tree/v1.4.1) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.4.0...v1.4.1) - -**Merged pull requests:** - -- Update dependencies for release [\#598](https://github.com/feathersjs/authentication/pull/598) ([daffl](https://github.com/daffl)) -- Finalize v3 dependency updates [\#596](https://github.com/feathersjs/authentication/pull/596) ([daffl](https://github.com/daffl)) -- Update Codeclimate coverage token [\#595](https://github.com/feathersjs/authentication/pull/595) ([daffl](https://github.com/daffl)) - -## [v1.4.0](https://github.com/feathersjs/authentication/tree/v1.4.0) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.3.0...v1.4.0) - -**Closed issues:** - -- An in-range update of socket.io-client is breaking the build 🚨 [\#588](https://github.com/feathersjs/authentication/issues/588) -- An in-range update of feathers-hooks is breaking the build 🚨 [\#587](https://github.com/feathersjs/authentication/issues/587) - -**Merged pull requests:** - -- Move to npm scope [\#594](https://github.com/feathersjs/authentication/pull/594) ([daffl](https://github.com/daffl)) -- Update to Feathers v3 \(Buzzard\) [\#592](https://github.com/feathersjs/authentication/pull/592) ([daffl](https://github.com/daffl)) -- Update to new plugin infrastructure [\#591](https://github.com/feathersjs/authentication/pull/591) ([daffl](https://github.com/daffl)) - -## [v1.3.0](https://github.com/feathersjs/authentication/tree/v1.3.0) (2017-10-24) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.13...v1.3.0) - -**Merged pull requests:** - -- updating the codeclimate setup [\#589](https://github.com/feathersjs/authentication/pull/589) ([ekryski](https://github.com/ekryski)) - -## [v0.7.13](https://github.com/feathersjs/authentication/tree/v0.7.13) (2017-10-23) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.7...v0.7.13) - -**Closed issues:** - -- Error authenticating! Error: Token provided to verifyJWT is missing or not a string ? [\#584](https://github.com/feathersjs/authentication/issues/584) -- Visual Studio Code Debug no authentication [\#583](https://github.com/feathersjs/authentication/issues/583) -- \[Feature Request\] Cloud DB's [\#581](https://github.com/feathersjs/authentication/issues/581) -- Request doesn't contain any headers when user service requested [\#578](https://github.com/feathersjs/authentication/issues/578) -- No way to pass Options to auth.express.authenticate. Needed for Google API refreshToken [\#576](https://github.com/feathersjs/authentication/issues/576) -- /auth/google 404 Not Found [\#574](https://github.com/feathersjs/authentication/issues/574) -- unique email not working while create [\#572](https://github.com/feathersjs/authentication/issues/572) -- authentication service not return token jwt [\#571](https://github.com/feathersjs/authentication/issues/571) -- typo in jwt default options [\#570](https://github.com/feathersjs/authentication/issues/570) -- Generate new app, Google-only auth, throws error [\#568](https://github.com/feathersjs/authentication/issues/568) -- An in-range update of feathers is breaking the build 🚨 [\#565](https://github.com/feathersjs/authentication/issues/565) -- Documentation not understanding [\#563](https://github.com/feathersjs/authentication/issues/563) -- Checking hook.params.headers.authorization [\#552](https://github.com/feathersjs/authentication/issues/552) -- Ability to send token as part of URL [\#546](https://github.com/feathersjs/authentication/issues/546) -- Anonymous Authentication [\#544](https://github.com/feathersjs/authentication/issues/544) -- Quote Error [\#519](https://github.com/feathersjs/authentication/issues/519) -- \[example\] CustomStrategy using passport-custom [\#516](https://github.com/feathersjs/authentication/issues/516) -- \[Epic\] Auth 2.0.0 [\#513](https://github.com/feathersjs/authentication/issues/513) -- ID set to null - Unable to delete with customer ID field. [\#422](https://github.com/feathersjs/authentication/issues/422) -- Prefixing socket events [\#418](https://github.com/feathersjs/authentication/issues/418) -- Passwordless auth [\#409](https://github.com/feathersjs/authentication/issues/409) -- How to authenticate the application client? not only the users [\#405](https://github.com/feathersjs/authentication/issues/405) -- Multi-factor Local Auth [\#5](https://github.com/feathersjs/authentication/issues/5) - -**Merged pull requests:** - -- Features/typescript fix [\#585](https://github.com/feathersjs/authentication/pull/585) ([TimMensch](https://github.com/TimMensch)) -- Update mocha to the latest version 🚀 [\#582](https://github.com/feathersjs/authentication/pull/582) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update sinon to the latest version 🚀 [\#580](https://github.com/feathersjs/authentication/pull/580) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update jsonwebtoken to the latest version 🚀 [\#567](https://github.com/feathersjs/authentication/pull/567) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Include Babel Polyfill for Node 4 [\#566](https://github.com/feathersjs/authentication/pull/566) ([daffl](https://github.com/daffl)) -- Update passport to the latest version 🚀 [\#558](https://github.com/feathersjs/authentication/pull/558) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Revert "Make feathers-authentication match security documents" [\#556](https://github.com/feathersjs/authentication/pull/556) ([ekryski](https://github.com/ekryski)) -- Update debug to the latest version 🚀 [\#555](https://github.com/feathersjs/authentication/pull/555) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Make feathers-authentication match security documents [\#554](https://github.com/feathersjs/authentication/pull/554) ([micaksica2](https://github.com/micaksica2)) -- Update sinon to the latest version 🚀 [\#551](https://github.com/feathersjs/authentication/pull/551) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update ws to the latest version 🚀 [\#549](https://github.com/feathersjs/authentication/pull/549) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update chai to the latest version 🚀 [\#543](https://github.com/feathersjs/authentication/pull/543) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- adding a default jwt uuid. Refs \#513 [\#539](https://github.com/feathersjs/authentication/pull/539) ([ekryski](https://github.com/ekryski)) -- Refresh token must have a user ID [\#419](https://github.com/feathersjs/authentication/pull/419) ([francisco-sanchez-molina](https://github.com/francisco-sanchez-molina)) - -## [v1.2.7](https://github.com/feathersjs/authentication/tree/v1.2.7) (2017-07-11) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.6...v1.2.7) - -**Closed issues:** - -- Connection without password [\#541](https://github.com/feathersjs/authentication/issues/541) -- email in lower case ? [\#538](https://github.com/feathersjs/authentication/issues/538) -- Im unable to ping feathers server from react native. [\#537](https://github.com/feathersjs/authentication/issues/537) -- whats the official way to open cors in feather ? [\#536](https://github.com/feathersjs/authentication/issues/536) -- Error options.service does not exist after initial auth setup [\#535](https://github.com/feathersjs/authentication/issues/535) -- LogoutTimer not being cleared correctly [\#532](https://github.com/feathersjs/authentication/issues/532) -- logoutTimer causing early logouts [\#404](https://github.com/feathersjs/authentication/issues/404) - -**Merged pull requests:** - -- fixed meta undefined error [\#542](https://github.com/feathersjs/authentication/pull/542) ([markacola](https://github.com/markacola)) - -## [v1.2.6](https://github.com/feathersjs/authentication/tree/v1.2.6) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.5...v1.2.6) - -**Closed issues:** - -- OAuth 2 login for cordova [\#530](https://github.com/feathersjs/authentication/issues/530) - -**Merged pull requests:** - -- Change cleartimeout\(\) to lt.clearTimeout\(\) [\#534](https://github.com/feathersjs/authentication/pull/534) ([wnxhaja](https://github.com/wnxhaja)) -- Update feathers-authentication-local to the latest version 🚀 [\#533](https://github.com/feathersjs/authentication/pull/533) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.2.5](https://github.com/feathersjs/authentication/tree/v1.2.5) (2017-06-21) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.4...v1.2.5) - -**Closed issues:** - -- Cannot read property 'user' of undefined - lib\socket\update-entity.js:26:104 [\#529](https://github.com/feathersjs/authentication/issues/529) -- Provider is undefined when using restrictToRoles [\#525](https://github.com/feathersjs/authentication/issues/525) -- How to make a request to an Endpoint that requires authentication from nodejs? [\#523](https://github.com/feathersjs/authentication/issues/523) - -**Merged pull requests:** - -- fixes several issues with update-entity w/ test cases [\#531](https://github.com/feathersjs/authentication/pull/531) ([jerfowler](https://github.com/jerfowler)) - -## [v1.2.4](https://github.com/feathersjs/authentication/tree/v1.2.4) (2017-06-08) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.3...v1.2.4) - -**Fixed bugs:** - -- User \(Entity\) needs to be updated on the socket after authentication [\#293](https://github.com/feathersjs/authentication/issues/293) - -**Closed issues:** - -- Express Middleware local -\> jwt does not authorize on redirect [\#518](https://github.com/feathersjs/authentication/issues/518) -- Issue with feathers-authentication [\#512](https://github.com/feathersjs/authentication/issues/512) -- User Authentication Missing Credentials error \(and subsequent nav authorization\) [\#508](https://github.com/feathersjs/authentication/issues/508) -- passport log failure [\#505](https://github.com/feathersjs/authentication/issues/505) -- authenticate with a custom username field \(rather than email\) [\#502](https://github.com/feathersjs/authentication/issues/502) -- app.get\('auth'\) vs app.get\('authentication'\) [\#497](https://github.com/feathersjs/authentication/issues/497) -- Can't get success authorization with pure feathers server [\#491](https://github.com/feathersjs/authentication/issues/491) - -**Merged pull requests:** - -- Test and fix for authenticate event with invalid data [\#524](https://github.com/feathersjs/authentication/pull/524) ([daffl](https://github.com/daffl)) -- Remove hook.data.payload [\#522](https://github.com/feathersjs/authentication/pull/522) ([marshallswain](https://github.com/marshallswain)) -- Update socket entity [\#521](https://github.com/feathersjs/authentication/pull/521) ([marshallswain](https://github.com/marshallswain)) -- Made each option, optional [\#515](https://github.com/feathersjs/authentication/pull/515) ([cranesandcaff](https://github.com/cranesandcaff)) -- Add feathers-authentication-hooks in readme [\#510](https://github.com/feathersjs/authentication/pull/510) ([bertho-zero](https://github.com/bertho-zero)) -- Update ms to the latest version 🚀 [\#509](https://github.com/feathersjs/authentication/pull/509) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Fix default authentication config keys [\#506](https://github.com/feathersjs/authentication/pull/506) ([ekryski](https://github.com/ekryski)) - -## [v1.2.3](https://github.com/feathersjs/authentication/tree/v1.2.3) (2017-05-10) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.2...v1.2.3) - -**Closed issues:** - -- Validating custom express routes [\#498](https://github.com/feathersjs/authentication/issues/498) -- Payload won't include userId when logging in with stored localStorage token [\#496](https://github.com/feathersjs/authentication/issues/496) -- How to send oauth token authentication to another client server [\#493](https://github.com/feathersjs/authentication/issues/493) -- Unhandled Promise Rejection error. [\#489](https://github.com/feathersjs/authentication/issues/489) -- No Auth token on authentication resource [\#488](https://github.com/feathersjs/authentication/issues/488) -- How to verify JWT in feathers issued by another feathers instance ? [\#484](https://github.com/feathersjs/authentication/issues/484) -- hook.params.user [\#483](https://github.com/feathersjs/authentication/issues/483) -- Overriding JWT's expiresIn with a value more than 20d prevents users from signing in [\#458](https://github.com/feathersjs/authentication/issues/458) - -**Merged pull requests:** - -- Update feathers-socketio to the latest version 🚀 [\#503](https://github.com/feathersjs/authentication/pull/503) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update socket.io-client to the latest version 🚀 [\#501](https://github.com/feathersjs/authentication/pull/501) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Fix issue with very large token timeout. [\#499](https://github.com/feathersjs/authentication/pull/499) ([asdacap](https://github.com/asdacap)) -- Typo [\#492](https://github.com/feathersjs/authentication/pull/492) ([wdmtech](https://github.com/wdmtech)) -- Update migrating.md [\#490](https://github.com/feathersjs/authentication/pull/490) ([MichaelErmer](https://github.com/MichaelErmer)) -- Update semistandard to the latest version 🚀 [\#487](https://github.com/feathersjs/authentication/pull/487) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#485](https://github.com/feathersjs/authentication/pull/485) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#482](https://github.com/feathersjs/authentication/pull/482) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.2.2](https://github.com/feathersjs/authentication/tree/v1.2.2) (2017-04-12) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.1...v1.2.2) - -**Fixed bugs:** - -- accessToken not being used when provided by client over socketio [\#400](https://github.com/feathersjs/authentication/issues/400) - -**Closed issues:** - -- Incompatible old client dependency [\#479](https://github.com/feathersjs/authentication/issues/479) -- Using feathers-authentication-client for an existing API? [\#478](https://github.com/feathersjs/authentication/issues/478) -- app.authenticate error : UnhandledPromiseRejectionWarning: Unhandled promise rejection \(rejection id: 2\): \* Error \* [\#476](https://github.com/feathersjs/authentication/issues/476) -- Make `socket.feathers` data available in authentication hooks [\#475](https://github.com/feathersjs/authentication/issues/475) -- Allow the authenticate hook to be called with no parameters [\#473](https://github.com/feathersjs/authentication/issues/473) -- Authenticate : How to return more infos ? [\#471](https://github.com/feathersjs/authentication/issues/471) - -**Merged pull requests:** - -- Use latest version of feathers-authentication-client [\#480](https://github.com/feathersjs/authentication/pull/480) ([daffl](https://github.com/daffl)) -- Resolves \#475 - Socket params are made available to authentication hooks [\#477](https://github.com/feathersjs/authentication/pull/477) ([thomas-p-wilson](https://github.com/thomas-p-wilson)) - -## [v1.2.1](https://github.com/feathersjs/authentication/tree/v1.2.1) (2017-04-07) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.0...v1.2.1) - -**Fixed bugs:** - -- failureRedirect is never used when using with oauth2 [\#387](https://github.com/feathersjs/authentication/issues/387) - -**Closed issues:** - -- OAuth guides [\#470](https://github.com/feathersjs/authentication/issues/470) -- app.authenticate not working [\#466](https://github.com/feathersjs/authentication/issues/466) -- how can I logout using local authentication? [\#465](https://github.com/feathersjs/authentication/issues/465) -- How to do Socket.io Authentication [\#462](https://github.com/feathersjs/authentication/issues/462) -- Add event filtering by default \(socket.io\) [\#460](https://github.com/feathersjs/authentication/issues/460) -- Add ability to control if socket is marked as authenticated. [\#448](https://github.com/feathersjs/authentication/issues/448) -- Auth redirect issue [\#425](https://github.com/feathersjs/authentication/issues/425) -- E-mail verification step can be bypassed using Postman or Curl [\#391](https://github.com/feathersjs/authentication/issues/391) -- Example app [\#386](https://github.com/feathersjs/authentication/issues/386) - -**Merged pull requests:** - -- Allow the cookie to be set if action is not `remove` [\#474](https://github.com/feathersjs/authentication/pull/474) ([marshallswain](https://github.com/marshallswain)) - -## [v1.2.0](https://github.com/feathersjs/authentication/tree/v1.2.0) (2017-03-23) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.1.1...v1.2.0) - -**Fixed bugs:** - -- 1.0 authentication service hooks don't run when client uses feathers-socketio [\#455](https://github.com/feathersjs/authentication/issues/455) -- `hook.params.provider` is not set when calling `client.authenticate\(\)` [\#432](https://github.com/feathersjs/authentication/issues/432) -- remove method failed with JsonWebTokenError: invalid token [\#388](https://github.com/feathersjs/authentication/issues/388) - -**Closed issues:** - -- Token creation has side effect [\#454](https://github.com/feathersjs/authentication/issues/454) -- Question: When is userId set? [\#453](https://github.com/feathersjs/authentication/issues/453) -- How to authenticate SPA? More precisely how does the redirect works? [\#451](https://github.com/feathersjs/authentication/issues/451) -- POST to auth/facebook for FacebookTokenStrategy 404? [\#447](https://github.com/feathersjs/authentication/issues/447) -- feathers-authentication 1.1.1 `No auth token` [\#445](https://github.com/feathersjs/authentication/issues/445) -- Another readme incorrect and maybe docs to [\#441](https://github.com/feathersjs/authentication/issues/441) -- Readme incorrect and maybe docs to [\#440](https://github.com/feathersjs/authentication/issues/440) -- npm version issue? [\#439](https://github.com/feathersjs/authentication/issues/439) -- setCookie express middleware only works inside hooks [\#438](https://github.com/feathersjs/authentication/issues/438) -- createJWT throws 'secret must provided' [\#437](https://github.com/feathersjs/authentication/issues/437) -- Not useful error message on NotAuthenticated error [\#436](https://github.com/feathersjs/authentication/issues/436) -- Passwordfeld in auth.local does not work as expected [\#435](https://github.com/feathersjs/authentication/issues/435) -- Authentication via REST returns token without finding user on db [\#430](https://github.com/feathersjs/authentication/issues/430) - -**Merged pull requests:** - -- Filter out all events [\#461](https://github.com/feathersjs/authentication/pull/461) ([daffl](https://github.com/daffl)) -- Fix socket auth [\#459](https://github.com/feathersjs/authentication/pull/459) ([marshallswain](https://github.com/marshallswain)) -- Fix \#454 Token create has side effect [\#456](https://github.com/feathersjs/authentication/pull/456) ([whollacsek](https://github.com/whollacsek)) -- Windows compatible version of the original compile comand with public folder support. [\#442](https://github.com/feathersjs/authentication/pull/442) ([appurist](https://github.com/appurist)) -- Add client.js back for consistency [\#433](https://github.com/feathersjs/authentication/pull/433) ([daffl](https://github.com/daffl)) -- add string to authenticate \(typescript\) [\#431](https://github.com/feathersjs/authentication/pull/431) ([superbarne](https://github.com/superbarne)) -- Add support for Bearer scheme in remove method [\#403](https://github.com/feathersjs/authentication/pull/403) ([boybundit](https://github.com/boybundit)) - -## [v1.1.1](https://github.com/feathersjs/authentication/tree/v1.1.1) (2017-03-02) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.1.0...v1.1.1) - -**Closed issues:** - -- Authentication over socket.io never answers [\#428](https://github.com/feathersjs/authentication/issues/428) - -**Merged pull requests:** - -- Remove lots of hardcoded values for config, and adds the `authenticate` hook [\#427](https://github.com/feathersjs/authentication/pull/427) ([myknbani](https://github.com/myknbani)) - -## [v1.1.0](https://github.com/feathersjs/authentication/tree/v1.1.0) (2017-03-01) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.2...v1.1.0) - -**Fixed bugs:** - -- Mongo update error after logging into Facebook [\#244](https://github.com/feathersjs/authentication/issues/244) - -**Closed issues:** - -- Feature Request: Anonymous Authentication Strategy Support [\#423](https://github.com/feathersjs/authentication/issues/423) -- Error is not thrown if token that is provided is invalid [\#421](https://github.com/feathersjs/authentication/issues/421) -- Request body 'token' parameter disappears [\#420](https://github.com/feathersjs/authentication/issues/420) -- Auth2 issue getting JWT token from server when different ports [\#416](https://github.com/feathersjs/authentication/issues/416) -- Cookie-based authentication with XHR is not possible [\#413](https://github.com/feathersjs/authentication/issues/413) -- JWT Authentication setup failing [\#411](https://github.com/feathersjs/authentication/issues/411) -- how to disable service for external usage in version 1.0 [\#410](https://github.com/feathersjs/authentication/issues/410) -- v1.0 is removed from npm? [\#408](https://github.com/feathersjs/authentication/issues/408) -- Make JWT data more configurable [\#407](https://github.com/feathersjs/authentication/issues/407) -- Possible typo [\#406](https://github.com/feathersjs/authentication/issues/406) -- Authentication with an existing database with existing hashed \(md5\) passwords [\#398](https://github.com/feathersjs/authentication/issues/398) -- can modify selected fields only [\#397](https://github.com/feathersjs/authentication/issues/397) -- \[Discussion\] Migrating to 1.0 - hook changes [\#396](https://github.com/feathersjs/authentication/issues/396) -- feathers-authentication 'local' strategy requires token? [\#394](https://github.com/feathersjs/authentication/issues/394) -- JWT for local auth. [\#390](https://github.com/feathersjs/authentication/issues/390) -- Feathers 'Twitter API' style [\#385](https://github.com/feathersjs/authentication/issues/385) -- Missing code in example app [\#383](https://github.com/feathersjs/authentication/issues/383) -- feathers-authentication errors with any view error, and redirects to /auth/failure [\#381](https://github.com/feathersjs/authentication/issues/381) -- what does app.service\('authentication'\).remove\(...\) mean? [\#379](https://github.com/feathersjs/authentication/issues/379) -- Rest Endpoints. [\#375](https://github.com/feathersjs/authentication/issues/375) -- cordova google-plus signUp with id_token [\#373](https://github.com/feathersjs/authentication/issues/373) -- How to reconnect socket with cookie after page refresh ? [\#372](https://github.com/feathersjs/authentication/issues/372) -- Error: Could not find stored JWT and no authentication strategy was given [\#367](https://github.com/feathersjs/authentication/issues/367) -- "No auth token" using authenticate strategy: 'jwt' \(v.1.0.0-beta-2\) [\#366](https://github.com/feathersjs/authentication/issues/366) -- Navigating to /auth/\ twice redirects to /auth/failed [\#344](https://github.com/feathersjs/authentication/issues/344) -- Meteor auth migration guide [\#334](https://github.com/feathersjs/authentication/issues/334) -- Auth 1.0 [\#330](https://github.com/feathersjs/authentication/issues/330) -- RSA token secret [\#309](https://github.com/feathersjs/authentication/issues/309) -- Add option to use bcrypt [\#300](https://github.com/feathersjs/authentication/issues/300) -- Better example of how to change hashing algorithm? \[Question\] [\#289](https://github.com/feathersjs/authentication/issues/289) -- issuer doesn't work [\#284](https://github.com/feathersjs/authentication/issues/284) -- passport auth question [\#274](https://github.com/feathersjs/authentication/issues/274) -- Add support for authenticating active users only [\#259](https://github.com/feathersjs/authentication/issues/259) -- 404 response from populateUser\(\) hook [\#258](https://github.com/feathersjs/authentication/issues/258) -- Responses hang when token.secret is undefined for local authentication [\#249](https://github.com/feathersjs/authentication/issues/249) -- Authentication without password [\#246](https://github.com/feathersjs/authentication/issues/246) -- Fix successRedirect to not override cookie path [\#243](https://github.com/feathersjs/authentication/issues/243) -- Deprecate verifyToken and populateUser hooks in favour of middleware [\#227](https://github.com/feathersjs/authentication/issues/227) -- Authenticating and creating [\#100](https://github.com/feathersjs/authentication/issues/100) -- Add a password service [\#83](https://github.com/feathersjs/authentication/issues/83) - -**Merged pull requests:** - -- Fix JWT options typo [\#415](https://github.com/feathersjs/authentication/pull/415) ([daffl](https://github.com/daffl)) -- Prevent setCookie from mutating authOptions [\#414](https://github.com/feathersjs/authentication/pull/414) ([adrien-k](https://github.com/adrien-k)) -- Typescript Definitions [\#412](https://github.com/feathersjs/authentication/pull/412) ([AbraaoAlves](https://github.com/AbraaoAlves)) -- Docs for migrating to auth.hooks.authenticate hook [\#399](https://github.com/feathersjs/authentication/pull/399) ([petermikitsh](https://github.com/petermikitsh)) -- Typo 'cookie.enable' should be 'cookie.enabled' [\#380](https://github.com/feathersjs/authentication/pull/380) ([whollacsek](https://github.com/whollacsek)) -- Docs: Equalize usage of feathers-authenticate [\#378](https://github.com/feathersjs/authentication/pull/378) ([eikaramba](https://github.com/eikaramba)) - -## [v1.0.2](https://github.com/feathersjs/authentication/tree/v1.0.2) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.1...v1.0.2) - -**Closed issues:** - -- successRedirect not redirecting [\#364](https://github.com/feathersjs/authentication/issues/364) - -## [v1.0.1](https://github.com/feathersjs/authentication/tree/v1.0.1) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.0...v1.0.1) - -## [v1.0.0](https://github.com/feathersjs/authentication/tree/v1.0.0) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.12...v1.0.0) - -**Fixed bugs:** - -- restrictToOwner does not support multi patch, update and remove [\#228](https://github.com/feathersjs/authentication/issues/228) - -**Closed issues:** - -- auth.express.authenticate got undefined [\#363](https://github.com/feathersjs/authentication/issues/363) -- Non-standard header structure [\#361](https://github.com/feathersjs/authentication/issues/361) -- localEndpoint without local strategy [\#359](https://github.com/feathersjs/authentication/issues/359) -- Using custom passport strategies [\#356](https://github.com/feathersjs/authentication/issues/356) -- Client-side app.on\('login'\) [\#355](https://github.com/feathersjs/authentication/issues/355) -- Payload limiting on `app.get\('user'\)`? [\#354](https://github.com/feathersjs/authentication/issues/354) -- Authentication token is missing [\#352](https://github.com/feathersjs/authentication/issues/352) -- \[1.0\] The entity on the socket should pull from the strategy options. [\#348](https://github.com/feathersjs/authentication/issues/348) -- \[1.0\] Only the first failure is returned on auth failure when chaining multiple strategies [\#346](https://github.com/feathersjs/authentication/issues/346) -- Build 0.7.11 does not contain current code on NPMJS [\#342](https://github.com/feathersjs/authentication/issues/342) -- feathers-authentication branch 0.8 did not work with payload \(tested on socket\) [\#264](https://github.com/feathersjs/authentication/issues/264) -- Add method for updating JWT [\#260](https://github.com/feathersjs/authentication/issues/260) -- 1.0 architecture considerations [\#226](https://github.com/feathersjs/authentication/issues/226) -- Features/RFC [\#213](https://github.com/feathersjs/authentication/issues/213) -- Support access_token based OAuth2 providers [\#169](https://github.com/feathersjs/authentication/issues/169) -- Support openID [\#154](https://github.com/feathersjs/authentication/issues/154) -- Disable cookie by default if not using OAuth [\#152](https://github.com/feathersjs/authentication/issues/152) -- Add token service tests [\#144](https://github.com/feathersjs/authentication/issues/144) -- Add local service tests [\#143](https://github.com/feathersjs/authentication/issues/143) -- Add OAuth2 service tests [\#142](https://github.com/feathersjs/authentication/issues/142) -- Add OAuth2 integration tests [\#141](https://github.com/feathersjs/authentication/issues/141) -- Add integration tests for custom redirects [\#125](https://github.com/feathersjs/authentication/issues/125) -- Support mobile authentication via OAuth1 [\#47](https://github.com/feathersjs/authentication/issues/47) -- Support OAuth1 [\#42](https://github.com/feathersjs/authentication/issues/42) -- Password-less Local Auth with Email / SMS [\#7](https://github.com/feathersjs/authentication/issues/7) - -**Merged pull requests:** - -- migrating to semistandard [\#371](https://github.com/feathersjs/authentication/pull/371) ([ekryski](https://github.com/ekryski)) -- Logout should always give a response. [\#369](https://github.com/feathersjs/authentication/pull/369) ([marshallswain](https://github.com/marshallswain)) -- Clarify that the authenticate hook is required. [\#368](https://github.com/feathersjs/authentication/pull/368) ([marshallswain](https://github.com/marshallswain)) -- Fix README example [\#365](https://github.com/feathersjs/authentication/pull/365) ([saiberz](https://github.com/saiberz)) -- Remove additional deprecation notice [\#362](https://github.com/feathersjs/authentication/pull/362) ([porsager](https://github.com/porsager)) -- fix typo [\#360](https://github.com/feathersjs/authentication/pull/360) ([osenvosem](https://github.com/osenvosem)) -- Update feathers-primus to version 2.0.0 🚀 [\#358](https://github.com/feathersjs/authentication/pull/358) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Create .codeclimate.yml [\#357](https://github.com/feathersjs/authentication/pull/357) ([larkinscott](https://github.com/larkinscott)) -- fixing redirect middleware [\#353](https://github.com/feathersjs/authentication/pull/353) ([ekryski](https://github.com/ekryski)) -- Remove useless quotes [\#351](https://github.com/feathersjs/authentication/pull/351) ([bertho-zero](https://github.com/bertho-zero)) -- A bunch of bug fixes [\#349](https://github.com/feathersjs/authentication/pull/349) ([ekryski](https://github.com/ekryski)) -- fix\(docs/new-features\): syntax highlighting [\#347](https://github.com/feathersjs/authentication/pull/347) ([justingreenberg](https://github.com/justingreenberg)) -- Update superagent to version 3.0.0 🚀 [\#345](https://github.com/feathersjs/authentication/pull/345) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-memory to version 1.0.0 🚀 [\#343](https://github.com/feathersjs/authentication/pull/343) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- 1.0 Pre-release [\#336](https://github.com/feathersjs/authentication/pull/336) ([ekryski](https://github.com/ekryski)) - -## [v0.7.12](https://github.com/feathersjs/authentication/tree/v0.7.12) (2016-11-11) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.11...v0.7.12) - -**Closed issues:** - -- App.authenticate uses wrong `this` reference [\#341](https://github.com/feathersjs/authentication/issues/341) -- Getting more done in GitHub with ZenHub [\#331](https://github.com/feathersjs/authentication/issues/331) -- Need help to use feathers authentication storage in vue vuex [\#329](https://github.com/feathersjs/authentication/issues/329) -- How to get user id in hooks? [\#322](https://github.com/feathersjs/authentication/issues/322) -- I checked out my new feathersjs app in another machine, created a new user but I can't log in! [\#320](https://github.com/feathersjs/authentication/issues/320) -- restrict-to-owner throws error when user id is 0 [\#319](https://github.com/feathersjs/authentication/issues/319) -- Not providing sufficient details for an auth provider should not be an error. [\#318](https://github.com/feathersjs/authentication/issues/318) -- \[Question\] Is there a way to verify a user with password? [\#316](https://github.com/feathersjs/authentication/issues/316) -- 0.8.0 beta 1 bug - this is not defined [\#315](https://github.com/feathersjs/authentication/issues/315) -- Client: Document getJWT & verifyJWT [\#313](https://github.com/feathersjs/authentication/issues/313) -- Socket client should automatically auth on reconnect [\#310](https://github.com/feathersjs/authentication/issues/310) -- app.get\('token'\) doesn't work after a browser refresh. [\#303](https://github.com/feathersjs/authentication/issues/303) -- Problem issuing multiple jwt's for the same user [\#302](https://github.com/feathersjs/authentication/issues/302) -- restrict-to-owner does not allow Service.remove\(null\) from internal systems [\#301](https://github.com/feathersjs/authentication/issues/301) -- How to migrate from restrictToOwner to checkPermissions [\#299](https://github.com/feathersjs/authentication/issues/299) -- "username" cannot be used as local strategy usernameField [\#294](https://github.com/feathersjs/authentication/issues/294) -- Bad Hook API Design: Hooks are inconsistent and impure functions [\#288](https://github.com/feathersjs/authentication/issues/288) -- Mutliple 'user' models for authentication [\#282](https://github.com/feathersjs/authentication/issues/282) -- Client should ensure socket.io upgrade is complete before authenticating [\#275](https://github.com/feathersjs/authentication/issues/275) -- JWT is not sent after socket reconnection [\#272](https://github.com/feathersjs/authentication/issues/272) -- 401 after service is moved/refactored [\#270](https://github.com/feathersjs/authentication/issues/270) -- Client side auth should subscribe to user updates so that app.get\('user'\) is fresh [\#195](https://github.com/feathersjs/authentication/issues/195) -- Make oauth2 more general [\#179](https://github.com/feathersjs/authentication/issues/179) -- Add integration tests for custom service endpoints [\#145](https://github.com/feathersjs/authentication/issues/145) -- Create a `requireAuth` wrapper for `verifyToken`, `populateUser`, `restrictToAuth` [\#118](https://github.com/feathersjs/authentication/issues/118) - -**Merged pull requests:** - -- babel-core@6.18.2 breaks build 🚨 [\#339](https://github.com/feathersjs/authentication/pull/339) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- 👻😱 Node.js 0.10 is unmaintained 😱👻 [\#337](https://github.com/feathersjs/authentication/pull/337) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- restrictToOwner -Fix check for methodNotAllowed [\#335](https://github.com/feathersjs/authentication/pull/335) ([daffl](https://github.com/daffl)) -- Implement login and logout events for REST authentication [\#325](https://github.com/feathersjs/authentication/pull/325) ([daffl](https://github.com/daffl)) -- Socket.io authentication tests and login logout event [\#324](https://github.com/feathersjs/authentication/pull/324) ([daffl](https://github.com/daffl)) -- Reorganization [\#321](https://github.com/feathersjs/authentication/pull/321) ([ekryski](https://github.com/ekryski)) -- client: use Authentication class, make `getJWT` and `verifyJWT` async [\#317](https://github.com/feathersjs/authentication/pull/317) ([marshallswain](https://github.com/marshallswain)) -- 0.8 client decode jwt [\#314](https://github.com/feathersjs/authentication/pull/314) ([marshallswain](https://github.com/marshallswain)) -- Store config at `app.config` [\#312](https://github.com/feathersjs/authentication/pull/312) ([marshallswain](https://github.com/marshallswain)) -- Cookies will match jwt expiry by default. [\#308](https://github.com/feathersjs/authentication/pull/308) ([marshallswain](https://github.com/marshallswain)) -- Remove permissions hooks and middleware [\#307](https://github.com/feathersjs/authentication/pull/307) ([daffl](https://github.com/daffl)) -- First cut for authentication middleware [\#305](https://github.com/feathersjs/authentication/pull/305) ([daffl](https://github.com/daffl)) -- 0.8 - OAuth fixes [\#304](https://github.com/feathersjs/authentication/pull/304) ([marshallswain](https://github.com/marshallswain)) - -## [v0.7.11](https://github.com/feathersjs/authentication/tree/v0.7.11) (2016-09-28) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.10...v0.7.11) - -**Closed issues:** - -- Unable to authenticate with passport-google-oauth20 [\#295](https://github.com/feathersjs/authentication/issues/295) -- "Unauthorized" Response with Hook Data [\#291](https://github.com/feathersjs/authentication/issues/291) -- hashPassword in patch [\#286](https://github.com/feathersjs/authentication/issues/286) -- Mobile App Facebook Login [\#276](https://github.com/feathersjs/authentication/issues/276) -- Socket user should update automatically [\#266](https://github.com/feathersjs/authentication/issues/266) -- Get user outside a service [\#261](https://github.com/feathersjs/authentication/issues/261) - -**Merged pull requests:** - -- hashPassword fall-through if there's no password [\#287](https://github.com/feathersjs/authentication/pull/287) ([marshallswain](https://github.com/marshallswain)) -- Update feathers-memory to version 0.8.0 🚀 [\#285](https://github.com/feathersjs/authentication/pull/285) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Allow multiple username fields for local auth [\#283](https://github.com/feathersjs/authentication/pull/283) ([sdbondi](https://github.com/sdbondi)) - -## [v0.7.10](https://github.com/feathersjs/authentication/tree/v0.7.10) (2016-08-31) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.9...v0.7.10) - -**Fixed bugs:** - -- restrictToOwner should not throw an error on mass deletions [\#175](https://github.com/feathersjs/authentication/issues/175) - -**Closed issues:** - -- Duplicate Email should be rejected by Default [\#281](https://github.com/feathersjs/authentication/issues/281) -- Auth0 & featherjs authorization only [\#277](https://github.com/feathersjs/authentication/issues/277) -- Cannot read property 'scope' of undefined [\#273](https://github.com/feathersjs/authentication/issues/273) -- Socker.js | Custom successHandler [\#271](https://github.com/feathersjs/authentication/issues/271) -- Use feathers-socketio? and rest&socket share session maybe? [\#269](https://github.com/feathersjs/authentication/issues/269) -- Ability to invalidate old token/session when user login with another machine. [\#267](https://github.com/feathersjs/authentication/issues/267) -- 0.8 authentication before hooks - only ever getting a 401 Unauthorised [\#263](https://github.com/feathersjs/authentication/issues/263) -- REST Middleware breaks local auth [\#262](https://github.com/feathersjs/authentication/issues/262) -- 0.8: Token Service errors on token auth using client [\#254](https://github.com/feathersjs/authentication/issues/254) -- 0.8: Cookies, turning off feathers-session cookie also turns off feathers-jwt cookie. [\#253](https://github.com/feathersjs/authentication/issues/253) -- Any example of how to do refresh token? [\#248](https://github.com/feathersjs/authentication/issues/248) -- Custom Authentication Hooks [\#236](https://github.com/feathersjs/authentication/issues/236) -- Is there an Authenticated Event [\#235](https://github.com/feathersjs/authentication/issues/235) -- Error while using /auth/local [\#233](https://github.com/feathersjs/authentication/issues/233) -- Providing token to feathers.authentication doesn't work [\#230](https://github.com/feathersjs/authentication/issues/230) -- bundled hooks customize errors [\#215](https://github.com/feathersjs/authentication/issues/215) -- Hooks should support a callback for conditionally running [\#210](https://github.com/feathersjs/authentication/issues/210) -- restrictToRoles hook: More complex determination of "owner". [\#205](https://github.com/feathersjs/authentication/issues/205) -- verifyToken hook option to error [\#200](https://github.com/feathersjs/authentication/issues/200) -- Allow using restrictToOwner as an after hook [\#123](https://github.com/feathersjs/authentication/issues/123) - -**Merged pull requests:** - -- Manually supply an endpoint to the Client authenticate\(\) method [\#278](https://github.com/feathersjs/authentication/pull/278) ([mcnamee](https://github.com/mcnamee)) -- Update mocha to version 3.0.0 🚀 [\#257](https://github.com/feathersjs/authentication/pull/257) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Don’t mix options when signing tokens [\#255](https://github.com/feathersjs/authentication/pull/255) ([marshallswain](https://github.com/marshallswain)) -- Attempt to get token right away. [\#252](https://github.com/feathersjs/authentication/pull/252) ([marshallswain](https://github.com/marshallswain)) -- Update async to version 2.0.0 🚀 [\#240](https://github.com/feathersjs/authentication/pull/240) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Creates better way or returning data in a familiar format [\#234](https://github.com/feathersjs/authentication/pull/234) ([codingfriend1](https://github.com/codingfriend1)) -- Throws an error if restriction methods are used outside of a find or get hook [\#232](https://github.com/feathersjs/authentication/pull/232) ([codingfriend1](https://github.com/codingfriend1)) -- RestrictToOwner now takes an array [\#231](https://github.com/feathersjs/authentication/pull/231) ([sscaff1](https://github.com/sscaff1)) -- Adds ability to limit queries unless authenticated and authorized [\#229](https://github.com/feathersjs/authentication/pull/229) ([codingfriend1](https://github.com/codingfriend1)) - -## [v0.7.9](https://github.com/feathersjs/authentication/tree/v0.7.9) (2016-06-20) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.8...v0.7.9) - -**Fixed bugs:** - -- Calling logout should revoke/blacklist a JWT [\#133](https://github.com/feathersjs/authentication/issues/133) - -**Closed issues:** - -- Query email rather than oauth provider id on /auth/\ [\#223](https://github.com/feathersjs/authentication/issues/223) -- Cannot read property \'service\' of undefined [\#222](https://github.com/feathersjs/authentication/issues/222) - -**Merged pull requests:** - -- added support for hashing passwords when hook.data is an array [\#225](https://github.com/feathersjs/authentication/pull/225) ([eblin](https://github.com/eblin)) -- jwt ssl warning [\#214](https://github.com/feathersjs/authentication/pull/214) ([aboutlo](https://github.com/aboutlo)) - -## [v0.7.8](https://github.com/feathersjs/authentication/tree/v0.7.8) (2016-06-09) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.7...v0.7.8) - -**Closed issues:** - -- Feathers-authentication assumptions [\#220](https://github.com/feathersjs/authentication/issues/220) -- Server-side header option does not accept capital letters [\#218](https://github.com/feathersjs/authentication/issues/218) -- How to figure out why redirect to /auth/failure? [\#217](https://github.com/feathersjs/authentication/issues/217) -- Getting token via REST is not documented [\#216](https://github.com/feathersjs/authentication/issues/216) -- How to use Feathers Client to Authenticate Facebook/Instagram credentials [\#204](https://github.com/feathersjs/authentication/issues/204) -- Remove token from localstorage [\#203](https://github.com/feathersjs/authentication/issues/203) -- Check user password [\#193](https://github.com/feathersjs/authentication/issues/193) -- app.authenticate\(\): Warning: a promise was rejected with a non-error: \[object Object\] [\#191](https://github.com/feathersjs/authentication/issues/191) -- Authentication provider for Facebook Account Kit [\#189](https://github.com/feathersjs/authentication/issues/189) - -**Merged pull requests:** - -- Lowercase custom header [\#219](https://github.com/feathersjs/authentication/pull/219) ([mmwtsn](https://github.com/mmwtsn)) -- mocha@2.5.0 breaks build 🚨 [\#212](https://github.com/feathersjs/authentication/pull/212) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Small refactoring to simplify structure and remove code duplication [\#209](https://github.com/feathersjs/authentication/pull/209) ([daffl](https://github.com/daffl)) -- Use removeItem in the storage on logout [\#208](https://github.com/feathersjs/authentication/pull/208) ([daffl](https://github.com/daffl)) -- Misspelled in a comment [\#201](https://github.com/feathersjs/authentication/pull/201) ([tryy3](https://github.com/tryy3)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#199](https://github.com/feathersjs/authentication/pull/199) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.7](https://github.com/feathersjs/authentication/tree/v0.7.7) (2016-05-05) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.6...v0.7.7) - -**Fixed bugs:** - -- OAuth2 authentication callback failing due to missing property [\#196](https://github.com/feathersjs/authentication/issues/196) - -**Merged pull requests:** - -- properly handle optional `\_json` property [\#197](https://github.com/feathersjs/authentication/pull/197) ([nyaaao](https://github.com/nyaaao)) - -## [v0.7.6](https://github.com/feathersjs/authentication/tree/v0.7.6) (2016-05-03) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.5...v0.7.6) - -**Fixed bugs:** - -- Facebook Authentication should do a patch not an update. [\#174](https://github.com/feathersjs/authentication/issues/174) - -**Closed issues:** - -- Authenticated user [\#192](https://github.com/feathersjs/authentication/issues/192) -- REST token revoke [\#185](https://github.com/feathersjs/authentication/issues/185) -- TypeError: Cannot read property 'service' of undefined [\#173](https://github.com/feathersjs/authentication/issues/173) -- Optionally Include password in the params.query object passed to User.find\(\) [\#171](https://github.com/feathersjs/authentication/issues/171) -- Pass more to local authentication params [\#165](https://github.com/feathersjs/authentication/issues/165) -- Support custom authentication strategies [\#157](https://github.com/feathersjs/authentication/issues/157) - -**Merged pull requests:** - -- Allow manipulation of params before checking credentials [\#186](https://github.com/feathersjs/authentication/pull/186) ([saiichihashimoto](https://github.com/saiichihashimoto)) -- Update feathers to version 2.0.1 🚀 [\#184](https://github.com/feathersjs/authentication/pull/184) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- fix\(oauth2\): Use patch to update user in oauthCallback [\#183](https://github.com/feathersjs/authentication/pull/183) ([beevelop](https://github.com/beevelop)) - -## [v0.7.5](https://github.com/feathersjs/authentication/tree/v0.7.5) (2016-04-23) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.4...v0.7.5) - -**Fixed bugs:** - -- restrictToOwner and restrictToRoles have invalid type checking [\#172](https://github.com/feathersjs/authentication/issues/172) - -**Closed issues:** - -- user fails to signup with facebook if there is also local auth [\#168](https://github.com/feathersjs/authentication/issues/168) -- Unable to authenticate requests when using vanilla Socket.IO [\#166](https://github.com/feathersjs/authentication/issues/166) - -## [v0.7.4](https://github.com/feathersjs/authentication/tree/v0.7.4) (2016-04-18) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.3...v0.7.4) - -**Fixed bugs:** - -- restrictToOwner and restrictToRoles hooks don't work with nested models [\#163](https://github.com/feathersjs/authentication/issues/163) -- Change restrictToOwner error when a request does not contain ID [\#160](https://github.com/feathersjs/authentication/issues/160) - -**Closed issues:** - -- authenticate\(\) can leak sensetive user data via token service [\#162](https://github.com/feathersjs/authentication/issues/162) -- onBeforeLogin Hook [\#161](https://github.com/feathersjs/authentication/issues/161) - -**Merged pull requests:** - -- Hook fixes [\#164](https://github.com/feathersjs/authentication/pull/164) ([ekryski](https://github.com/ekryski)) - -## [v0.7.3](https://github.com/feathersjs/authentication/tree/v0.7.3) (2016-04-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.2...v0.7.3) - -## [v0.7.2](https://github.com/feathersjs/authentication/tree/v0.7.2) (2016-04-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.1...v0.7.2) - -**Closed issues:** - -- Auth doesn't work with non default local.userEndpoint [\#159](https://github.com/feathersjs/authentication/issues/159) -- Automatically add the hashPassword hook to local.userEndpoint [\#158](https://github.com/feathersjs/authentication/issues/158) -- Client authentication\(\) storage option not documented [\#155](https://github.com/feathersjs/authentication/issues/155) -- restrictToRoles availability inconsistency [\#153](https://github.com/feathersjs/authentication/issues/153) -- Does not populate user for other services [\#150](https://github.com/feathersjs/authentication/issues/150) - -**Merged pull requests:** - -- Steal Compatibility [\#156](https://github.com/feathersjs/authentication/pull/156) ([marshallswain](https://github.com/marshallswain)) - -## [v0.7.1](https://github.com/feathersjs/authentication/tree/v0.7.1) (2016-04-08) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.0...v0.7.1) - -**Closed issues:** - -- Documentation discrepancies [\#148](https://github.com/feathersjs/authentication/issues/148) -- bcrypt is hardcoded [\#146](https://github.com/feathersjs/authentication/issues/146) -- Update Docs, Guides, Examples for v0.7 [\#129](https://github.com/feathersjs/authentication/issues/129) -- populateUser: allow option to populate without db call. [\#92](https://github.com/feathersjs/authentication/issues/92) - -**Merged pull requests:** - -- Update feathers-memory to version 0.7.0 🚀 [\#149](https://github.com/feathersjs/authentication/pull/149) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- fix a typo [\#147](https://github.com/feathersjs/authentication/pull/147) ([chrjean](https://github.com/chrjean)) -- Fix copy paste typo in queryWithCurrentUser hook. [\#140](https://github.com/feathersjs/authentication/pull/140) ([juodumas](https://github.com/juodumas)) - -## [v0.7.0](https://github.com/feathersjs/authentication/tree/v0.7.0) (2016-03-30) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.6.0...v0.7.0) - -**Fixed bugs:** - -- logout should de-authenticate a socket [\#136](https://github.com/feathersjs/authentication/issues/136) -- \[Security\] JsonWebToken Lifecycle Concerns; Set HttpOnly = true in JWT cookie [\#132](https://github.com/feathersjs/authentication/issues/132) -- restrictToRoles hook needs to throw an error and not scope the query [\#128](https://github.com/feathersjs/authentication/issues/128) -- restrictToOwner hook needs to throw an error and not scope the query [\#127](https://github.com/feathersjs/authentication/issues/127) -- \[security\] Generated tokens are broadcast to all socket clients \(by default\) [\#126](https://github.com/feathersjs/authentication/issues/126) -- \[oAuth\] User profile should be updated every time they are authenticated [\#124](https://github.com/feathersjs/authentication/issues/124) -- Logout should clear the cookie [\#122](https://github.com/feathersjs/authentication/issues/122) -- Want the default success/fail routes, not the sendFile [\#121](https://github.com/feathersjs/authentication/issues/121) - -**Closed issues:** - -- Make all hooks optional if used internally [\#138](https://github.com/feathersjs/authentication/issues/138) -- Throw errors for deprecated hooks and update documentation [\#134](https://github.com/feathersjs/authentication/issues/134) -- v6.0.0: How can I return the user object along with the token ? [\#131](https://github.com/feathersjs/authentication/issues/131) -- user field not getting populated [\#119](https://github.com/feathersjs/authentication/issues/119) -- Move to bcryptjs [\#112](https://github.com/feathersjs/authentication/issues/112) -- Bundled hooks should pull from auth config to avoid having to pass duplicate props. [\#93](https://github.com/feathersjs/authentication/issues/93) -- Customize the JWT payload [\#78](https://github.com/feathersjs/authentication/issues/78) -- Needs a test for verifying that a custom tokenEndpoint works. [\#59](https://github.com/feathersjs/authentication/issues/59) -- Finish test coverage for existing features. [\#9](https://github.com/feathersjs/authentication/issues/9) - -**Merged pull requests:** - -- 0.7 Release [\#139](https://github.com/feathersjs/authentication/pull/139) ([ekryski](https://github.com/ekryski)) - -## [v0.6.0](https://github.com/feathersjs/authentication/tree/v0.6.0) (2016-03-24) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.5.1...v0.6.0) - -**Fixed bugs:** - -- Token encoding is not using the idField option. [\#107](https://github.com/feathersjs/authentication/issues/107) -- Logging out breaks in React Native [\#105](https://github.com/feathersjs/authentication/issues/105) -- Updating User Attached to Params in Client [\#102](https://github.com/feathersjs/authentication/issues/102) -- local auth should not redirect by default [\#89](https://github.com/feathersjs/authentication/issues/89) - -**Closed issues:** - -- Id of user can't be 0 for auth [\#116](https://github.com/feathersjs/authentication/issues/116) -- how to authenticate user in the socket.io? [\#111](https://github.com/feathersjs/authentication/issues/111) -- Wrong Status Error [\#110](https://github.com/feathersjs/authentication/issues/110) -- TypeError: Cannot read property 'service' of undefined \(continued\) [\#108](https://github.com/feathersjs/authentication/issues/108) -- `idField` breaks from `tokenService.create\(\)` to `populateUser\(\)` after hook [\#103](https://github.com/feathersjs/authentication/issues/103) - -**Merged pull requests:** - -- Bcryptjs [\#137](https://github.com/feathersjs/authentication/pull/137) ([ekryski](https://github.com/ekryski)) -- Allow user.id to be 0. Fixes \#116 [\#117](https://github.com/feathersjs/authentication/pull/117) ([marshallswain](https://github.com/marshallswain)) -- client should return a 401 error code when no token is provided [\#115](https://github.com/feathersjs/authentication/pull/115) ([ccummings](https://github.com/ccummings)) -- v0.6 - Bugs fixes, new hooks, and hook tests [\#109](https://github.com/feathersjs/authentication/pull/109) ([ekryski](https://github.com/ekryski)) -- primus client connect event is 'open' [\#106](https://github.com/feathersjs/authentication/pull/106) ([ahdinosaur](https://github.com/ahdinosaur)) - -## [v0.5.1](https://github.com/feathersjs/authentication/tree/v0.5.1) (2016-03-15) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.5.0...v0.5.1) - -## [v0.5.0](https://github.com/feathersjs/authentication/tree/v0.5.0) (2016-03-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.4.1...v0.5.0) - -**Fixed bugs:** - -- Client should store token string and not the token object [\#95](https://github.com/feathersjs/authentication/issues/95) - -**Closed issues:** - -- using feathers-rest/client with feathers-authentication/client [\#94](https://github.com/feathersjs/authentication/issues/94) -- populateUser can pull defaults from config, if available. [\#91](https://github.com/feathersjs/authentication/issues/91) -- App level auth routes for multiple sub-routes [\#90](https://github.com/feathersjs/authentication/issues/90) -- POST to /auth/local never gets response [\#88](https://github.com/feathersjs/authentication/issues/88) -- populate-user.js do not get settings [\#86](https://github.com/feathersjs/authentication/issues/86) -- Add rate limiting [\#81](https://github.com/feathersjs/authentication/issues/81) - -**Merged pull requests:** - -- Finalizing client side authentication module [\#101](https://github.com/feathersjs/authentication/pull/101) ([daffl](https://github.com/daffl)) -- Ten hours is only 36 seconds [\#99](https://github.com/feathersjs/authentication/pull/99) ([mileswilson](https://github.com/mileswilson)) -- Fix examples [\#98](https://github.com/feathersjs/authentication/pull/98) ([mastertinner](https://github.com/mastertinner)) -- fix html in templates [\#97](https://github.com/feathersjs/authentication/pull/97) ([mastertinner](https://github.com/mastertinner)) -- update populateUser\(\) hook [\#87](https://github.com/feathersjs/authentication/pull/87) ([kulakowka](https://github.com/kulakowka)) -- Customize the JWT payload [\#80](https://github.com/feathersjs/authentication/pull/80) ([enten](https://github.com/enten)) - -## [v0.4.1](https://github.com/feathersjs/authentication/tree/v0.4.1) (2016-02-28) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.4.0...v0.4.1) - -**Fixed bugs:** - -- app.logout\(\) fails [\#85](https://github.com/feathersjs/authentication/issues/85) - -**Closed issues:** - -- Username response ? [\#84](https://github.com/feathersjs/authentication/issues/84) -- User doesn't get populated after authentication with databases that don't use \_id [\#71](https://github.com/feathersjs/authentication/issues/71) -- Support client usage in NodeJS [\#52](https://github.com/feathersjs/authentication/issues/52) -- Support async storage for React Native [\#51](https://github.com/feathersjs/authentication/issues/51) -- RequireAdmin on userService [\#36](https://github.com/feathersjs/authentication/issues/36) -- Create test for changing the `usernameField` [\#1](https://github.com/feathersjs/authentication/issues/1) - -## [v0.4.0](https://github.com/feathersjs/authentication/tree/v0.4.0) (2016-02-27) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.5...v0.4.0) - -**Closed issues:** - -- Authentication not worked with hooks.remove\('password'\) [\#82](https://github.com/feathersjs/authentication/issues/82) - -**Merged pull requests:** - -- Refactoring for storage service [\#76](https://github.com/feathersjs/authentication/pull/76) ([ekryski](https://github.com/ekryski)) - -## [v0.3.5](https://github.com/feathersjs/authentication/tree/v0.3.5) (2016-02-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.4...v0.3.5) - -**Merged pull requests:** - -- Adding support for OAuth2 token based auth strategies. Closes \#46. [\#77](https://github.com/feathersjs/authentication/pull/77) ([ekryski](https://github.com/ekryski)) - -## [v0.3.4](https://github.com/feathersjs/authentication/tree/v0.3.4) (2016-02-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.3...v0.3.4) - -## [v0.3.3](https://github.com/feathersjs/authentication/tree/v0.3.3) (2016-02-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.2...v0.3.3) - -## [v0.3.2](https://github.com/feathersjs/authentication/tree/v0.3.2) (2016-02-24) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.1...v0.3.2) - -**Merged pull requests:** - -- bumping feathers-errors version [\#79](https://github.com/feathersjs/authentication/pull/79) ([ekryski](https://github.com/ekryski)) - -## [v0.3.1](https://github.com/feathersjs/authentication/tree/v0.3.1) (2016-02-23) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.0...v0.3.1) - -**Closed issues:** - -- Fix toLowerCase hook [\#74](https://github.com/feathersjs/authentication/issues/74) -- REST auth/local not working if socketio\(\) not set [\#72](https://github.com/feathersjs/authentication/issues/72) -- Support mobile authentication via OAuth2 [\#46](https://github.com/feathersjs/authentication/issues/46) - -**Merged pull requests:** - -- Fix toLowerCase hook [\#75](https://github.com/feathersjs/authentication/pull/75) ([enten](https://github.com/enten)) - -## [v0.3.0](https://github.com/feathersjs/authentication/tree/v0.3.0) (2016-02-19) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.4...v0.3.0) - -**Fixed bugs:** - -- Don't register successRedirect route if custom one is passed in [\#61](https://github.com/feathersjs/authentication/issues/61) - -**Closed issues:** - -- Specify the secret in one place instead of two [\#69](https://github.com/feathersjs/authentication/issues/69) -- support a failRedirect [\#62](https://github.com/feathersjs/authentication/issues/62) -- Document authentication updates [\#50](https://github.com/feathersjs/authentication/issues/50) - -**Merged pull requests:** - -- Config options [\#70](https://github.com/feathersjs/authentication/pull/70) ([ekryski](https://github.com/ekryski)) - -## [v0.2.4](https://github.com/feathersjs/authentication/tree/v0.2.4) (2016-02-17) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.3...v0.2.4) - -**Closed issues:** - -- Find "query" is replaced by token [\#64](https://github.com/feathersjs/authentication/issues/64) - -**Merged pull requests:** - -- Add module exports Babel module and test CommonJS compatibility [\#68](https://github.com/feathersjs/authentication/pull/68) ([daffl](https://github.com/daffl)) - -## [v0.2.3](https://github.com/feathersjs/authentication/tree/v0.2.3) (2016-02-15) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.2...v0.2.3) - -**Closed issues:** - -- How to forbid get and find on the userEndpoint? [\#66](https://github.com/feathersjs/authentication/issues/66) -- userEndpoint problem in sub-app [\#63](https://github.com/feathersjs/authentication/issues/63) -- How to modify successRedirect in local authentication? [\#60](https://github.com/feathersjs/authentication/issues/60) - -**Merged pull requests:** - -- Removing assigning token to params.query for sockets. [\#67](https://github.com/feathersjs/authentication/pull/67) ([ekryski](https://github.com/ekryski)) -- Fixing client query [\#65](https://github.com/feathersjs/authentication/pull/65) ([fastlorenzo](https://github.com/fastlorenzo)) - -## [v0.2.2](https://github.com/feathersjs/authentication/tree/v0.2.2) (2016-02-13) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.1...v0.2.2) - -**Closed issues:** - -- Custom tokenEndpoint failing [\#57](https://github.com/feathersjs/authentication/issues/57) -- TypeError: Cannot read property 'service' of undefined [\#56](https://github.com/feathersjs/authentication/issues/56) -- Login returns 500: Internal server error [\#54](https://github.com/feathersjs/authentication/issues/54) - -**Merged pull requests:** - -- Fixing token endpoint [\#58](https://github.com/feathersjs/authentication/pull/58) ([marshallswain](https://github.com/marshallswain)) - -## [v0.2.1](https://github.com/feathersjs/authentication/tree/v0.2.1) (2016-02-12) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.0...v0.2.1) - -**Closed issues:** - -- Custom local options not being respected. [\#55](https://github.com/feathersjs/authentication/issues/55) -- node can not require\("feathers-authentication"\).default [\#53](https://github.com/feathersjs/authentication/issues/53) - -## [v0.2.0](https://github.com/feathersjs/authentication/tree/v0.2.0) (2016-02-12) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.1.2...v0.2.0) - -**Closed issues:** - -- Support graceful fallback to cookies [\#45](https://github.com/feathersjs/authentication/issues/45) -- Add a client side component for authentication [\#44](https://github.com/feathersjs/authentication/issues/44) -- Support OAuth2 [\#43](https://github.com/feathersjs/authentication/issues/43) -- Support token based authentication [\#41](https://github.com/feathersjs/authentication/issues/41) -- Support local authentication [\#40](https://github.com/feathersjs/authentication/issues/40) -- Only sign the JWT with user id. Not the whole user object [\#38](https://github.com/feathersjs/authentication/issues/38) -- Discussion: Securing token for socket.io auth [\#33](https://github.com/feathersjs/authentication/issues/33) -- Handling expired tokens [\#25](https://github.com/feathersjs/authentication/issues/25) -- Support multiple auth providers [\#6](https://github.com/feathersjs/authentication/issues/6) - -**Merged pull requests:** - -- Decoupling [\#49](https://github.com/feathersjs/authentication/pull/49) ([ekryski](https://github.com/ekryski)) -- Adding an auth client [\#48](https://github.com/feathersjs/authentication/pull/48) ([ekryski](https://github.com/ekryski)) -- Validate if provider [\#39](https://github.com/feathersjs/authentication/pull/39) ([mastertinner](https://github.com/mastertinner)) - -## [v0.1.2](https://github.com/feathersjs/authentication/tree/v0.1.2) (2016-02-04) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.1.1...v0.1.2) - -**Closed issues:** - -- Hooks should support incoming data as arrays of objects. [\#34](https://github.com/feathersjs/authentication/issues/34) -- Support authenticating with Username and Password via sockets [\#32](https://github.com/feathersjs/authentication/issues/32) - -**Merged pull requests:** - -- Check for params.provider in requireAuth hook [\#37](https://github.com/feathersjs/authentication/pull/37) ([marshallswain](https://github.com/marshallswain)) -- safety check for data [\#35](https://github.com/feathersjs/authentication/pull/35) ([deanmcpherson](https://github.com/deanmcpherson)) - -## [v0.1.1](https://github.com/feathersjs/authentication/tree/v0.1.1) (2016-01-30) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.1.0...v0.1.1) - -## [v0.1.0](https://github.com/feathersjs/authentication/tree/v0.1.0) (2016-01-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.8...v0.1.0) - -**Closed issues:** - -- Get the Travis build to work. [\#27](https://github.com/feathersjs/authentication/issues/27) -- Login not working [\#24](https://github.com/feathersjs/authentication/issues/24) -- Hooks should be configurable \(they should be functions\) [\#11](https://github.com/feathersjs/authentication/issues/11) -- Document the bundled hooks. [\#10](https://github.com/feathersjs/authentication/issues/10) - -**Merged pull requests:** - -- Migrate docs to book [\#31](https://github.com/feathersjs/authentication/pull/31) ([marshallswain](https://github.com/marshallswain)) -- hashPassword: Async bcrypt usage needs a promise [\#30](https://github.com/feathersjs/authentication/pull/30) ([marshallswain](https://github.com/marshallswain)) -- Removing extras from travis.yml [\#29](https://github.com/feathersjs/authentication/pull/29) ([marshallswain](https://github.com/marshallswain)) -- Fixing build [\#28](https://github.com/feathersjs/authentication/pull/28) ([marshallswain](https://github.com/marshallswain)) -- Adding nsp check [\#26](https://github.com/feathersjs/authentication/pull/26) ([marshallswain](https://github.com/marshallswain)) - -## [v0.0.8](https://github.com/feathersjs/authentication/tree/v0.0.8) (2016-01-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.7...v0.0.8) - -**Merged pull requests:** - -- Support services that use pagination. [\#23](https://github.com/feathersjs/authentication/pull/23) ([marshallswain](https://github.com/marshallswain)) - -## [v0.0.7](https://github.com/feathersjs/authentication/tree/v0.0.7) (2016-01-07) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.6...v0.0.7) - -**Closed issues:** - -- Password isn't removed from responses when using a mongoose service for users endpoint [\#19](https://github.com/feathersjs/authentication/issues/19) -- next called twice using socket.io and using an unauthenticated service [\#17](https://github.com/feathersjs/authentication/issues/17) -- Switch to a callback-based field configuration? [\#15](https://github.com/feathersjs/authentication/issues/15) -- Cannot authenticate [\#14](https://github.com/feathersjs/authentication/issues/14) -- Allow require without `.default` [\#13](https://github.com/feathersjs/authentication/issues/13) -- Login validation [\#2](https://github.com/feathersjs/authentication/issues/2) - -**Merged pull requests:** - -- Adding separate route for refreshing a login token. [\#21](https://github.com/feathersjs/authentication/pull/21) ([corymsmith](https://github.com/corymsmith)) -- Converting user model to object when using mongoose service [\#20](https://github.com/feathersjs/authentication/pull/20) ([corymsmith](https://github.com/corymsmith)) -- Fixing issue where next is called twice when hitting an unauthenticated service via socket.io [\#18](https://github.com/feathersjs/authentication/pull/18) ([corymsmith](https://github.com/corymsmith)) -- Fixing usage of mongoose service [\#16](https://github.com/feathersjs/authentication/pull/16) ([corymsmith](https://github.com/corymsmith)) - -## [v0.0.6](https://github.com/feathersjs/authentication/tree/v0.0.6) (2015-11-22) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.5...v0.0.6) - -**Closed issues:** - -- Feathers Auth Configuration Error [\#12](https://github.com/feathersjs/authentication/issues/12) -- Make sure we're returning proper error responses. [\#8](https://github.com/feathersjs/authentication/issues/8) - -## [v0.0.5](https://github.com/feathersjs/authentication/tree/v0.0.5) (2015-11-19) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.4...v0.0.5) - -## [v0.0.4](https://github.com/feathersjs/authentication/tree/v0.0.4) (2015-11-19) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.3...v0.0.4) - -## [v0.0.3](https://github.com/feathersjs/authentication/tree/v0.0.3) (2015-11-18) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.6...v0.0.3) - -**Merged pull requests:** - -- allow runtime auth via socket.io [\#4](https://github.com/feathersjs/authentication/pull/4) ([randomnerd](https://github.com/randomnerd)) - -## [v1.0.6](https://github.com/feathersjs/authentication/tree/v1.0.6) (2015-11-02) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.5...v1.0.6) - -## [v1.0.5](https://github.com/feathersjs/authentication/tree/v1.0.5) (2015-11-02) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.4...v1.0.5) - -## [v1.0.4](https://github.com/feathersjs/authentication/tree/v1.0.4) (2015-11-02) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.3...v1.0.4) - -## [v1.0.3](https://github.com/feathersjs/authentication/tree/v1.0.3) (2015-10-12) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/authentication/LICENSE b/packages/authentication/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/authentication/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/authentication/README.md b/packages/authentication/README.md deleted file mode 100644 index c669c7c280..0000000000 --- a/packages/authentication/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/authentication - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/authentication.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Add Authentication to your FeathersJS app. - -## Installation - -``` -npm install @feathersjs/authentication --save -``` - -## Documentation - -Refer to the [Feathers authentication API documentation](https://feathersjs.com/api/authentication/) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication/package.json b/packages/authentication/package.json deleted file mode 100644 index 77e3e6a1da..0000000000 --- a/packages/authentication/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "@feathersjs/authentication", - "description": "Add Authentication to your FeathersJS app.", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/authentication" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/hooks": "^0.9.0", - "@feathersjs/schema": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@types/jsonwebtoken": "^9.0.6", - "jsonwebtoken": "^9.0.2", - "lodash": "^4.17.21", - "long-timeout": "^0.1.1", - "uuid": "^10.0.0" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.30", - "@types/lodash": "^4.17.7", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "@types/uuid": "^10.0.0", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/authentication/src/core.ts b/packages/authentication/src/core.ts deleted file mode 100644 index 623bc56d40..0000000000 --- a/packages/authentication/src/core.ts +++ /dev/null @@ -1,318 +0,0 @@ -import merge from 'lodash/merge' -import jsonwebtoken, { SignOptions, Secret, VerifyOptions, Algorithm } from 'jsonwebtoken' -import { v4 as uuidv4 } from 'uuid' -import { NotAuthenticated } from '@feathersjs/errors' -import { createDebug } from '@feathersjs/commons' -import { Application, Params } from '@feathersjs/feathers' -import { IncomingMessage, ServerResponse } from 'http' -import { AuthenticationConfiguration, defaultOptions } from './options' - -const debug = createDebug('@feathersjs/authentication/base') - -export interface AuthenticationResult { - [key: string]: any -} - -export interface AuthenticationRequest { - strategy?: string - [key: string]: any -} - -export interface AuthenticationParams extends Params { - payload?: { [key: string]: any } - jwtOptions?: SignOptions - authStrategies?: string[] - secret?: string - [key: string]: any -} - -export type ConnectionEvent = 'login' | 'logout' | 'disconnect' - -export interface AuthenticationStrategy { - /** - * Implement this method to get access to the AuthenticationService - * - * @param auth The AuthenticationService - */ - setAuthentication?(auth: AuthenticationBase): void - /** - * Implement this method to get access to the Feathers application - * - * @param app The Feathers application instance - */ - setApplication?(app: Application): void - /** - * Implement this method to get access to the strategy name - * - * @param name The name of the strategy - */ - setName?(name: string): void - /** - * Implement this method to verify the current configuration - * and throw an error if it is invalid. - */ - verifyConfiguration?(): void - /** - * Implement this method to setup this strategy - * @param auth The AuthenticationService - * @param name The name of the strategy - */ - setup?(auth: AuthenticationBase, name: string): Promise - /** - * Authenticate an authentication request with this strategy. - * Should throw an error if the strategy did not succeed. - * - * @param authentication The authentication request - * @param params The service call parameters - */ - authenticate?( - authentication: AuthenticationRequest, - params: AuthenticationParams - ): Promise - /** - * Update a real-time connection according to this strategy. - * - * @param connection The real-time connection - * @param context The hook context - */ - handleConnection?(event: ConnectionEvent, connection: any, authResult?: AuthenticationResult): Promise - /** - * Parse a basic HTTP request and response for authentication request information. - * - * @param req The HTTP request - * @param res The HTTP response - */ - parse?(req: IncomingMessage, res: ServerResponse): Promise -} - -export interface JwtVerifyOptions extends VerifyOptions { - algorithm?: string | string[] -} - -/** - * A base class for managing authentication strategies and creating and verifying JWTs - */ -export class AuthenticationBase { - app: Application - strategies: { [key: string]: AuthenticationStrategy } - configKey: string - isReady: boolean - - /** - * Create a new authentication service. - * - * @param app The Feathers application instance - * @param configKey The configuration key name in `app.get` (default: `authentication`) - * @param options Optional initial options - */ - constructor(app: Application, configKey = 'authentication', options = {}) { - if (!app || typeof app.use !== 'function') { - throw new Error('An application instance has to be passed to the authentication service') - } - - this.app = app - this.strategies = {} - this.configKey = configKey - this.isReady = false - - app.set('defaultAuthentication', app.get('defaultAuthentication') || configKey) - app.set(configKey, merge({}, app.get(configKey), options)) - } - - /** - * Return the current configuration from the application - */ - get configuration(): AuthenticationConfiguration { - // Always returns a copy of the authentication configuration - return Object.assign({}, defaultOptions, this.app.get(this.configKey)) - } - - /** - * A list of all registered strategy names - */ - get strategyNames() { - return Object.keys(this.strategies) - } - - /** - * Register a new authentication strategy under a given name. - * - * @param name The name to register the strategy under - * @param strategy The authentication strategy instance - */ - register(name: string, strategy: AuthenticationStrategy) { - // Call the functions a strategy can implement - if (typeof strategy.setName === 'function') { - strategy.setName(name) - } - - if (typeof strategy.setApplication === 'function') { - strategy.setApplication(this.app) - } - - if (typeof strategy.setAuthentication === 'function') { - strategy.setAuthentication(this) - } - - if (typeof strategy.verifyConfiguration === 'function') { - strategy.verifyConfiguration() - } - - // Register strategy as name - this.strategies[name] = strategy - - if (this.isReady) { - strategy.setup?.(this, name) - } - } - - /** - * Get the registered authentication strategies for a list of names. - * - * @param names The list or strategy names - */ - getStrategies(...names: string[]) { - return names.map((name) => this.strategies[name]).filter((current) => !!current) - } - - /** - * Returns a single strategy by name - * - * @param name The strategy name - * @returns The authentication strategy or undefined - */ - getStrategy(name: string) { - return this.strategies[name] - } - - /** - * Create a new access token with payload and options. - * - * @param payload The JWT payload - * @param optsOverride The options to extend the defaults (`configuration.jwtOptions`) with - * @param secretOverride Use a different secret instead - */ - async createAccessToken( - payload: string | Buffer | object, - optsOverride?: SignOptions, - secretOverride?: Secret - ) { - const { secret, jwtOptions } = this.configuration - // Use configuration by default but allow overriding the secret - const jwtSecret = secretOverride || secret - // Default jwt options merged with additional options - const options = merge({}, jwtOptions, optsOverride) - - if (!options.jwtid) { - // Generate a UUID as JWT ID by default - options.jwtid = uuidv4() - } - - return jsonwebtoken.sign(payload, jwtSecret, options) - } - - /** - * Verifies an access token. - * - * @param accessToken The token to verify - * @param optsOverride The options to extend the defaults (`configuration.jwtOptions`) with - * @param secretOverride Use a different secret instead - */ - async verifyAccessToken(accessToken: string, optsOverride?: JwtVerifyOptions, secretOverride?: Secret) { - const { secret, jwtOptions } = this.configuration - const jwtSecret = secretOverride || secret - const options = merge({}, jwtOptions, optsOverride) - const { algorithm } = options - - // Normalize the `algorithm` setting into the algorithms array - if (algorithm && !options.algorithms) { - options.algorithms = (Array.isArray(algorithm) ? algorithm : [algorithm]) as Algorithm[] - delete options.algorithm - } - - try { - const verified = jsonwebtoken.verify(accessToken, jwtSecret, options) - - return verified as any - } catch (error: any) { - throw new NotAuthenticated(error.message, error) - } - } - - /** - * Authenticate a given authentication request against a list of strategies. - * - * @param authentication The authentication request - * @param params Service call parameters - * @param allowed A list of allowed strategy names - */ - async authenticate( - authentication: AuthenticationRequest, - params: AuthenticationParams, - ...allowed: string[] - ) { - const { strategy } = authentication || {} - const [authStrategy] = this.getStrategies(strategy) - const strategyAllowed = allowed.includes(strategy) - - debug('Running authenticate for strategy', strategy, allowed) - - if (!authentication || !authStrategy || !strategyAllowed) { - const additionalInfo = - (!strategy && ' (no `strategy` set)') || - (!strategyAllowed && ' (strategy not allowed in authStrategies)') || - '' - - // If there are no valid strategies or `authentication` is not an object - throw new NotAuthenticated('Invalid authentication information' + additionalInfo) - } - - return authStrategy.authenticate(authentication, { - ...params, - authenticated: true - }) - } - - async handleConnection(event: ConnectionEvent, connection: any, authResult?: AuthenticationResult) { - const strategies = this.getStrategies(...Object.keys(this.strategies)).filter( - (current) => typeof current.handleConnection === 'function' - ) - - for (const strategy of strategies) { - await strategy.handleConnection(event, connection, authResult) - } - } - - /** - * Parse an HTTP request and response for authentication request information. - * - * @param req The HTTP request - * @param res The HTTP response - * @param names A list of strategies to use - */ - async parse(req: IncomingMessage, res: ServerResponse, ...names: string[]) { - const strategies = this.getStrategies(...names).filter((current) => typeof current.parse === 'function') - - debug('Strategies parsing HTTP header for authentication information', names) - - for (const authStrategy of strategies) { - const value = await authStrategy.parse(req, res) - - if (value !== null) { - return value - } - } - - return null - } - - async setup() { - this.isReady = true - - for (const name of Object.keys(this.strategies)) { - const strategy = this.strategies[name] - - await strategy.setup?.(this, name) - } - } -} diff --git a/packages/authentication/src/hooks/authenticate.ts b/packages/authentication/src/hooks/authenticate.ts deleted file mode 100644 index ad3cdf4c11..0000000000 --- a/packages/authentication/src/hooks/authenticate.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { NotAuthenticated } from '@feathersjs/errors' -import { createDebug } from '@feathersjs/commons' - -const debug = createDebug('@feathersjs/authentication/hooks/authenticate') - -export interface AuthenticateHookSettings { - service?: string - strategies?: string[] -} - -export default (originalSettings: string | AuthenticateHookSettings, ...originalStrategies: string[]) => { - const settings = - typeof originalSettings === 'string' - ? { strategies: [originalSettings, ...originalStrategies] } - : originalSettings - - if (!originalSettings || settings.strategies.length === 0) { - throw new Error('The authenticate hook needs at least one allowed strategy') - } - - return async (context: HookContext, _next?: NextFunction) => { - const next = typeof _next === 'function' ? _next : async () => context - const { app, params, type, path, service } = context - const { strategies } = settings - const { provider, authentication } = params - const authService = app.defaultAuthentication(settings.service) - - debug(`Running authenticate hook on '${path}'`) - - if (type && type !== 'before' && type !== 'around') { - throw new NotAuthenticated('The authenticate hook must be used as a before hook') - } - - if (!authService || typeof authService.authenticate !== 'function') { - throw new NotAuthenticated('Could not find a valid authentication service') - } - - if (service === authService) { - throw new NotAuthenticated( - 'The authenticate hook does not need to be used on the authentication service' - ) - } - - if (params.authenticated === true) { - return next() - } - - if (authentication) { - const { provider, authentication, ...authParams } = params - - debug('Authenticating with', authentication, strategies) - - const authResult = await authService.authenticate(authentication, authParams, ...strategies) - - const { accessToken, ...authResultWithoutToken } = authResult - - context.params = { - ...params, - ...authResultWithoutToken, - authenticated: true - } - } else if (provider) { - throw new NotAuthenticated('Not authenticated') - } - - return next() - } -} diff --git a/packages/authentication/src/hooks/connection.ts b/packages/authentication/src/hooks/connection.ts deleted file mode 100644 index 4cf06c12d6..0000000000 --- a/packages/authentication/src/hooks/connection.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { AuthenticationBase, ConnectionEvent } from '../core' - -export default (event: ConnectionEvent) => async (context: HookContext, next: NextFunction) => { - await next() - - const { - result, - params: { connection } - } = context - - if (connection) { - const service = context.service as unknown as AuthenticationBase - - await service.handleConnection(event, connection, result) - } -} diff --git a/packages/authentication/src/hooks/event.ts b/packages/authentication/src/hooks/event.ts deleted file mode 100644 index 44b6953b91..0000000000 --- a/packages/authentication/src/hooks/event.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { ConnectionEvent } from '../core' - -const debug = createDebug('@feathersjs/authentication/hooks/connection') - -export default (event: ConnectionEvent) => async (context: HookContext, next: NextFunction) => { - await next() - - const { app, result, params } = context - - if (params.provider && result) { - debug(`Sending authentication event '${event}'`) - app.emit(event, result, params, context) - } -} diff --git a/packages/authentication/src/hooks/index.ts b/packages/authentication/src/hooks/index.ts deleted file mode 100644 index 4c9a354cfa..0000000000 --- a/packages/authentication/src/hooks/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as authenticate } from './authenticate' -export { default as connection } from './connection' -export { default as event } from './event' diff --git a/packages/authentication/src/index.ts b/packages/authentication/src/index.ts deleted file mode 100644 index f7ea82a173..0000000000 --- a/packages/authentication/src/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export * as hooks from './hooks' -export { authenticate } from './hooks' -export { - AuthenticationBase, - AuthenticationRequest, - AuthenticationResult, - AuthenticationStrategy, - AuthenticationParams, - ConnectionEvent, - JwtVerifyOptions -} from './core' -export { AuthenticationBaseStrategy } from './strategy' -export { AuthenticationService } from './service' -export { JWTStrategy } from './jwt' -export { authenticationSettingsSchema, AuthenticationConfiguration } from './options' diff --git a/packages/authentication/src/jwt.ts b/packages/authentication/src/jwt.ts deleted file mode 100644 index 0724760b12..0000000000 --- a/packages/authentication/src/jwt.ts +++ /dev/null @@ -1,190 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/ban-ts-comment */ -import { IncomingMessage } from 'http' -import { NotAuthenticated } from '@feathersjs/errors' -import { Params } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -// @ts-ignore -import lt from 'long-timeout' - -import { AuthenticationBaseStrategy } from './strategy' -import { AuthenticationParams, AuthenticationRequest, AuthenticationResult, ConnectionEvent } from './core' - -const debug = createDebug('@feathersjs/authentication/jwt') -const SPLIT_HEADER = /(\S+)\s+(\S+)/ - -export class JWTStrategy extends AuthenticationBaseStrategy { - expirationTimers = new WeakMap() - - get configuration() { - const authConfig = this.authentication.configuration - const config = super.configuration - - return { - service: authConfig.service, - entity: authConfig.entity, - entityId: authConfig.entityId, - header: 'Authorization', - schemes: ['Bearer', 'JWT'], - ...config - } - } - - async handleConnection( - event: ConnectionEvent, - connection: any, - authResult?: AuthenticationResult - ): Promise { - const isValidLogout = - event === 'logout' && - connection.authentication && - authResult && - connection.authentication.accessToken === authResult.accessToken - - const { accessToken } = authResult || {} - const { entity } = this.configuration - - if (accessToken && event === 'login') { - debug('Adding authentication information to connection') - const { exp } = - authResult?.authentication?.payload || (await this.authentication.verifyAccessToken(accessToken)) - // The time (in ms) until the token expires - const duration = exp * 1000 - Date.now() - const timer = lt.setTimeout(() => this.app.emit('disconnect', connection), duration) - - debug(`Registering connection expiration timer for ${duration}ms`) - lt.clearTimeout(this.expirationTimers.get(connection)) - this.expirationTimers.set(connection, timer) - - debug('Adding authentication information to connection') - connection.authentication = { - strategy: this.name, - accessToken - } - connection[entity] = authResult[entity] - } else if (event === 'disconnect' || isValidLogout) { - debug('Removing authentication information and expiration timer from connection') - - await new Promise((resolve) => - process.nextTick(() => { - delete connection[entity] - delete connection.authentication - resolve(connection) - }) - ) - - lt.clearTimeout(this.expirationTimers.get(connection)) - this.expirationTimers.delete(connection) - } - } - - verifyConfiguration() { - const allowedKeys = ['entity', 'entityId', 'service', 'header', 'schemes'] - - for (const key of Object.keys(this.configuration)) { - if (!allowedKeys.includes(key)) { - throw new Error( - `Invalid JwtStrategy option 'authentication.${this.name}.${key}'. Did you mean to set it in 'authentication.jwtOptions'?` - ) - } - } - - if (typeof this.configuration.header !== 'string') { - throw new Error(`The 'header' option for the ${this.name} strategy must be a string`) - } - } - - async getEntityQuery(_params: Params) { - return {} - } - - /** - * Return the entity for a given id - * - * @param id The id to use - * @param params Service call parameters - */ - async getEntity(id: string, params: Params) { - const entityService = this.entityService - const { entity } = this.configuration - - debug('Getting entity', id) - - if (entityService === null) { - throw new NotAuthenticated('Could not find entity service') - } - - const query = await this.getEntityQuery(params) - const { provider, ...paramsWithoutProvider } = params - const result = await entityService.get(id, { - ...paramsWithoutProvider, - query - }) - - if (!params.provider) { - return result - } - - return entityService.get(id, { ...params, [entity]: result }) - } - - async getEntityId(authResult: AuthenticationResult, _params: Params) { - return authResult.authentication.payload.sub - } - - async authenticate(authentication: AuthenticationRequest, params: AuthenticationParams) { - const { accessToken } = authentication - const { entity } = this.configuration - - if (!accessToken) { - throw new NotAuthenticated('No access token') - } - - const payload = await this.authentication.verifyAccessToken(accessToken, params.jwt) - const result = { - accessToken, - authentication: { - strategy: 'jwt', - accessToken, - payload - } - } - - if (entity === null) { - return result - } - - const entityId = await this.getEntityId(result, params) - const value = await this.getEntity(entityId, params) - - return { - ...result, - [entity]: value - } - } - - async parse(req: IncomingMessage): Promise<{ - strategy: string - accessToken: string - } | null> { - const { header, schemes }: { header: string; schemes: string[] } = this.configuration - const headerValue = req.headers && req.headers[header.toLowerCase()] - - if (!headerValue || typeof headerValue !== 'string') { - return null - } - - debug('Found parsed header value') - - const [, scheme, schemeValue] = headerValue.match(SPLIT_HEADER) || [] - const hasScheme = scheme && schemes.some((current) => new RegExp(current, 'i').test(scheme)) - - if (scheme && !hasScheme) { - return null - } - - return { - strategy: this.name, - accessToken: hasScheme ? schemeValue : headerValue - } - } -} diff --git a/packages/authentication/src/options.ts b/packages/authentication/src/options.ts deleted file mode 100644 index 2176889087..0000000000 --- a/packages/authentication/src/options.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { FromSchema, authenticationSettingsSchema } from '@feathersjs/schema' - -export const defaultOptions = { - authStrategies: [] as string[], - jwtOptions: { - header: { typ: 'access' }, // by default is an access token but can be any type - audience: 'https://yourdomain.com', // The resource server where the token is processed - issuer: 'feathers', // The issuing server, application or resource - algorithm: 'HS256', - expiresIn: '1d' - } -} - -export { authenticationSettingsSchema } - -export type AuthenticationConfiguration = FromSchema diff --git a/packages/authentication/src/service.ts b/packages/authentication/src/service.ts deleted file mode 100644 index cba07330a1..0000000000 --- a/packages/authentication/src/service.ts +++ /dev/null @@ -1,203 +0,0 @@ -import merge from 'lodash/merge' -import { NotAuthenticated } from '@feathersjs/errors' -import '@feathersjs/transport-commons' -import { createDebug } from '@feathersjs/commons' -import { ServiceMethods } from '@feathersjs/feathers' -import { resolveDispatch } from '@feathersjs/schema' -import jsonwebtoken from 'jsonwebtoken' -import { hooks } from '@feathersjs/hooks' - -import { AuthenticationBase, AuthenticationResult, AuthenticationRequest, AuthenticationParams } from './core' -import { connection, event } from './hooks' -import { RealTimeConnection } from '@feathersjs/feathers' - -const debug = createDebug('@feathersjs/authentication/service') - -declare module '@feathersjs/feathers/lib/declarations' { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface FeathersApplication { - // eslint-disable-line - /** - * Returns the default authentication service or the - * authentication service for a given path. - * - * @param location The service path to use (optional) - */ - defaultAuthentication?(location?: string): AuthenticationService - } - - interface Params { - authenticated?: boolean - authentication?: AuthenticationRequest - } -} - -export class AuthenticationService - extends AuthenticationBase - implements Partial> -{ - constructor(app: any, configKey = 'authentication', options = {}) { - super(app, configKey, options) - - hooks(this, { - create: [resolveDispatch(), event('login'), connection('login')], - remove: [resolveDispatch(), event('logout'), connection('logout')] - }) - - this.app.on('disconnect', async (connection: RealTimeConnection) => { - await this.handleConnection('disconnect', connection) - }) - - if (typeof app.defaultAuthentication !== 'function') { - app.defaultAuthentication = function (location?: string) { - const configKey = app.get('defaultAuthentication') - const path = - location || - Object.keys(this.services).find((current) => this.service(current).configKey === configKey) - - return path ? this.service(path) : null - } - } - } - /** - * Return the payload for a JWT based on the authentication result. - * Called internally by the `create` method. - * - * @param _authResult The current authentication result - * @param params The service call parameters - */ - async getPayload(_authResult: AuthenticationResult, params: AuthenticationParams) { - // Uses `params.payload` or returns an empty payload - const { payload = {} } = params - - return payload - } - - /** - * Returns the JWT options based on an authentication result. - * By default sets the JWT subject to the entity id. - * - * @param authResult The authentication result - * @param params Service call parameters - */ - async getTokenOptions(authResult: AuthenticationResult, params: AuthenticationParams) { - const { service, entity, entityId } = this.configuration - const jwtOptions = merge({}, params.jwtOptions, params.jwt) - const value = service && entity && authResult[entity] - - // Set the subject to the entity id if it is available - if (value && !jwtOptions.subject) { - const idProperty = entityId || this.app.service(service).id - const subject = value[idProperty] - - if (subject === undefined) { - throw new NotAuthenticated(`Can not set subject from ${entity}.${idProperty}`) - } - - jwtOptions.subject = `${subject}` - } - - return jwtOptions - } - - /** - * Create and return a new JWT for a given authentication request. - * Will trigger the `login` event. - * - * @param data The authentication request (should include `strategy` key) - * @param params Service call parameters - */ - async create(data: AuthenticationRequest, params?: AuthenticationParams) { - const authStrategies = params.authStrategies || this.configuration.authStrategies - - if (!authStrategies.length) { - throw new NotAuthenticated('No authentication strategies allowed for creating a JWT (`authStrategies`)') - } - - const authResult = await this.authenticate(data, params, ...authStrategies) - - debug('Got authentication result', authResult) - - if (authResult.accessToken) { - return authResult - } - - const [payload, jwtOptions] = await Promise.all([ - this.getPayload(authResult, params), - this.getTokenOptions(authResult, params) - ]) - - debug('Creating JWT with', payload, jwtOptions) - - const accessToken = await this.createAccessToken(payload, jwtOptions, params.secret) - - return { - accessToken, - ...authResult, - authentication: { - ...authResult.authentication, - payload: jsonwebtoken.decode(accessToken) - } - } - } - - /** - * Mark a JWT as removed. By default only verifies the JWT and returns the result. - * Triggers the `logout` event. - * - * @param id The JWT to remove or null - * @param params Service call parameters - */ - async remove(id: string | null, params?: AuthenticationParams) { - const { authentication } = params - const { authStrategies } = this.configuration - - // When an id is passed it is expected to be the authentication `accessToken` - if (id !== null && id !== authentication.accessToken) { - throw new NotAuthenticated('Invalid access token') - } - - debug('Verifying authentication strategy in remove') - - return this.authenticate(authentication, params, ...authStrategies) - } - - /** - * Validates the service configuration. - */ - async setup() { - await super.setup() - - // The setup method checks for valid settings and registers the - // connection and event (login, logout) hooks - const { secret, service, entity, entityId } = this.configuration - - if (typeof secret !== 'string') { - throw new Error("A 'secret' must be provided in your authentication configuration") - } - - if (entity !== null) { - if (service === undefined) { - throw new Error("The 'service' option is not set in the authentication configuration") - } - - if (this.app.service(service) === undefined) { - throw new Error( - `The '${service}' entity service does not exist (set to 'null' if it is not required)` - ) - } - - if (this.app.service(service).id === undefined && entityId === undefined) { - throw new Error( - `The '${service}' service does not have an 'id' property and no 'entityId' option is set.` - ) - } - } - - const publishable = this as any - - if (typeof publishable.publish === 'function') { - publishable.publish((): any => null) - } - } -} diff --git a/packages/authentication/src/strategy.ts b/packages/authentication/src/strategy.ts deleted file mode 100644 index 99a1ec9c58..0000000000 --- a/packages/authentication/src/strategy.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AuthenticationStrategy, AuthenticationBase } from './core' -import { Application, Service } from '@feathersjs/feathers' - -export class AuthenticationBaseStrategy implements AuthenticationStrategy { - authentication?: AuthenticationBase - app?: Application - name?: string - - setAuthentication(auth: AuthenticationBase) { - this.authentication = auth - } - - setApplication(app: Application) { - this.app = app - } - - setName(name: string) { - this.name = name - } - - get configuration(): any { - return this.authentication.configuration[this.name] - } - - get entityService(): Service { - const { service } = this.configuration - - if (!service) { - return null - } - - return this.app.service(service) || null - } -} diff --git a/packages/authentication/test/core.test.ts b/packages/authentication/test/core.test.ts deleted file mode 100644 index 3ffcf97ec3..0000000000 --- a/packages/authentication/test/core.test.ts +++ /dev/null @@ -1,445 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' -import jwt from 'jsonwebtoken' -import { Infer, schema } from '@feathersjs/schema' - -import { AuthenticationBase, AuthenticationRequest } from '../src/core' -import { authenticationSettingsSchema } from '../src/options' -import { Strategy1, Strategy2, MockRequest } from './fixtures' -import { ServerResponse } from 'http' - -const UUID = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ - -describe('authentication/core', () => { - let app: Application - let auth: AuthenticationBase - - beforeEach(() => { - app = feathers() - auth = new AuthenticationBase(app, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - first: { hello: 'test' } - }) - - auth.register('first', new Strategy1()) - auth.register('second', new Strategy2()) - auth.register('dummy', { - async authenticate(data: AuthenticationRequest) { - return data - } - }) - }) - - describe('configuration', () => { - it('infers configuration from settings schema', async () => { - const settingsSchema = schema({ - $id: 'AuthSettingsSchema', - ...authenticationSettingsSchema - } as const) - type Settings = Infer - const config: Settings = { - entity: 'user', - secret: 'supersecret', - authStrategies: ['some', 'thing'] - } - - await settingsSchema.validate(config) - }) - - it('throws an error when app is not provided', () => { - try { - // @ts-ignore - const otherAuth = new AuthenticationBase() - assert.fail('Should never get here') - assert.ok(otherAuth) - } catch (error: any) { - assert.strictEqual( - error.message, - 'An application instance has to be passed to the authentication service' - ) - } - }) - - it('sets defaults', () => { - // Getting configuration twice returns a copy - assert.notStrictEqual(auth.configuration, auth.configuration) - assert.strictEqual(auth.configuration.entity, 'user') - }) - - it('allows to override jwtOptions, does not merge', () => { - const { jwtOptions } = auth.configuration - const auth2options = { - jwtOptions: { - expiresIn: '1w' - } - } - - app.set('auth2', auth2options) - - const auth2 = new AuthenticationBase(app, 'auth2') - - assert.ok(jwtOptions) - assert.strictEqual(jwtOptions.expiresIn, '1d') - assert.strictEqual(jwtOptions.issuer, 'feathers') - - assert.deepStrictEqual(auth2.configuration.jwtOptions, auth2options.jwtOptions) - }) - - it('sets configKey and defaultAuthentication', () => { - assert.strictEqual(app.get('defaultAuthentication'), 'authentication') - }) - - it('uses default configKey', () => { - const otherApp = feathers() - const otherAuth = new AuthenticationBase(otherApp) - - assert.ok(otherAuth) - assert.strictEqual(otherApp.get('defaultAuthentication'), 'authentication') - assert.deepStrictEqual(otherApp.get('authentication'), {}) - }) - }) - - describe('strategies', () => { - it('strategyNames', () => { - assert.deepStrictEqual(auth.strategyNames, ['first', 'second', 'dummy']) - }) - - it('getStrategies', () => { - const first = auth.getStrategies('first') - const invalid = auth.getStrategies('first', 'invalid', 'second') - - assert.strictEqual(first.length, 1) - assert.strictEqual(invalid.length, 2, 'Filtered out invalid strategies') - }) - - it('getStrategy', () => { - const first = auth.getStrategy('first') - - assert.ok(first) - }) - - it('calls setName, setApplication and setAuthentication if available', () => { - const [first] = auth.getStrategies('first') as [Strategy1] - - assert.strictEqual(first.name, 'first') - assert.strictEqual(first.app, app) - assert.strictEqual(first.authentication, auth) - }) - - it('strategy configuration getter', () => { - const [first] = auth.getStrategies('first') as [Strategy1] - - assert.deepStrictEqual(first.configuration, { hello: 'test' }) - }) - - it('strategy configuration getter', () => { - const [first] = auth.getStrategies('first') as [Strategy1] - const oldService = auth.configuration.service - - delete auth.configuration.service - - assert.strictEqual(first.entityService, null) - - auth.configuration.service = oldService - }) - }) - - describe('authenticate', () => { - describe('with strategy set in params', () => { - it('returns first success', async () => { - const result = await auth.authenticate( - { - strategy: 'first', - username: 'David' - }, - {}, - 'first', - 'second' - ) - - assert.deepStrictEqual(result, Strategy1.result) - }) - - it('returns error when failed', async () => { - try { - await auth.authenticate( - { - strategy: 'first', - username: 'Steve' - }, - {}, - 'first', - 'second' - ) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid Dave') - } - }) - - it('returns second success', async () => { - const authentication = { - strategy: 'second', - v2: true, - password: 'supersecret' - } - - const result = await auth.authenticate(authentication, {}, 'first', 'second') - - assert.deepStrictEqual( - result, - Object.assign({}, Strategy2.result, { - authentication, - params: { authenticated: true } - }) - ) - }) - - it('passes params', async () => { - const params = { - some: 'thing' - } - const authentication = { - strategy: 'second', - v2: true, - password: 'supersecret' - } - - const result = await auth.authenticate(authentication, params, 'first', 'second') - - assert.deepStrictEqual( - result, - Object.assign( - { - params: Object.assign(params, { - authenticated: true - }), - authentication - }, - Strategy2.result - ) - ) - }) - - it('throws error when allowed and passed strategy does not match', async () => { - try { - await auth.authenticate( - { - strategy: 'first', - username: 'Dummy' - }, - {}, - 'second' - ) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual( - error.message, - 'Invalid authentication information (strategy not allowed in authStrategies)' - ) - } - }) - - it('throws error when strategy is not set', async () => { - try { - await auth.authenticate( - { - username: 'Dummy' - }, - {}, - 'second' - ) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Invalid authentication information (no `strategy` set)') - } - }) - }) - }) - - describe('parse', () => { - const res = {} as ServerResponse - - it('returns null when no names are given', async () => { - const req = {} as MockRequest - - assert.strictEqual(await auth.parse(req, res), null) - }) - - it('successfully parses a request (first)', async () => { - const req = { isDave: true } as MockRequest - - const result = await auth.parse(req, res, 'first', 'second') - - assert.deepStrictEqual(result, Strategy1.result) - }) - - it('successfully parses a request (second)', async () => { - const req = { isV2: true } as MockRequest - - const result = await auth.parse(req, res, 'first', 'second') - - assert.deepStrictEqual(result, Strategy2.result) - }) - - it('null when no success', async () => { - const req = {} as MockRequest - - const result = await auth.parse(req, res, 'first', 'second') - - assert.strictEqual(result, null) - }) - }) - - describe('jwt', () => { - const message = 'Some payload' - - describe('createAccessToken', () => { - // it('errors with no payload', () => { - // try { - // // @ts-ignore - // await auth.createAccessToken(); - // assert.fail('Should never get here'); - // } catch (error: any) { - // assert.strictEqual(error.message, 'payload is required'); - // } - // }); - - it('with default options', async () => { - const msg = 'Some payload' - - const accessToken = await auth.createAccessToken({ message: msg }) - const decoded = jwt.decode(accessToken) - const settings = auth.configuration.jwtOptions - - if (decoded === null || typeof decoded === 'string') { - throw new Error('Not encoded properly') - } - - assert.ok(typeof accessToken === 'string') - assert.strictEqual(decoded.message, msg, 'Set payload') - assert.ok(UUID.test(decoded.jti), 'Set `jti` to default UUID') - assert.strictEqual(decoded.aud, settings.audience) - assert.strictEqual(decoded.iss, settings.issuer) - }) - - it('with default and overriden options', async () => { - const overrides = { - issuer: 'someoneelse', - audience: 'people', - jwtid: 'something' - } - - const accessToken = await auth.createAccessToken({ message }, overrides) - - assert.ok(typeof accessToken === 'string') - - const decoded = jwt.decode(accessToken) - - if (decoded === null || typeof decoded === 'string') { - throw new Error('Not encoded properly') - } - - assert.strictEqual(decoded.message, message, 'Set payload') - assert.strictEqual(decoded.jti, 'something') - assert.strictEqual(decoded.aud, overrides.audience) - assert.strictEqual(decoded.iss, overrides.issuer) - }) - - it('errors with invalid options', async () => { - const overrides = { - algorithm: 'fdjsklfsndkl' - } - - try { - // @ts-ignore - await auth.createAccessToken({}, overrides) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, '"algorithm" must be a valid string enum value') - } - }) - }) - - describe('verifyAccessToken', () => { - let validToken: string - let expiredToken: string - - beforeEach(async () => { - validToken = await auth.createAccessToken({ message }) - expiredToken = await auth.createAccessToken( - {}, - { - expiresIn: '1ms' - } - ) - }) - - it('returns payload when token is valid', async () => { - const payload = await auth.verifyAccessToken(validToken) - - assert.strictEqual(payload.message, message) - }) - - it('errors when custom algorithm property does not match', async () => { - try { - await auth.verifyAccessToken(validToken, { - algorithm: ['HS512'] - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'invalid algorithm') - } - }) - - it('errors when algorithms property does not match', async () => { - try { - await auth.verifyAccessToken(validToken, { - algorithms: ['HS512'] - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'invalid algorithm') - } - }) - - it('errors when secret is different', async () => { - try { - await auth.verifyAccessToken(validToken, {}, 'fdjskl') - - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'invalid signature') - } - }) - - it('errors when other custom options do not match', async () => { - try { - await auth.verifyAccessToken(validToken, { issuer: 'someonelse' }) - - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.ok(/jwt issuer invalid/.test(error.message)) - } - }) - - it('errors when token is expired', async () => { - try { - await auth.verifyAccessToken(expiredToken) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'jwt expired') - assert.strictEqual(error.data.name, 'TokenExpiredError') - assert.ok(error.data.expiredAt) - } - }) - }) - }) -}) diff --git a/packages/authentication/test/fixtures.ts b/packages/authentication/test/fixtures.ts deleted file mode 100644 index aba18afde3..0000000000 --- a/packages/authentication/test/fixtures.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { NotAuthenticated } from '@feathersjs/errors' -import { Params } from '@feathersjs/feathers' - -import { AuthenticationRequest } from '../src/core' -import { IncomingMessage } from 'http' -import { AuthenticationBaseStrategy } from '../src/strategy' - -export interface MockRequest extends IncomingMessage { - isDave?: boolean - isV2?: boolean -} - -export class Strategy1 extends AuthenticationBaseStrategy { - static result = { - user: { - id: 123, - name: 'Dave' - }, - authenticated: true - } - - async authenticate(authentication: AuthenticationRequest) { - if (authentication.username === 'David' || authentication.both) { - return { ...Strategy1.result } - } - - throw new NotAuthenticated('Invalid Dave') - } - - async parse(req: MockRequest) { - if (req.isDave) { - return { ...Strategy1.result } - } - - return null - } -} - -export class Strategy2 extends AuthenticationBaseStrategy { - static result = { - user: { - name: 'V2', - version: 2 - }, - authenticated: true - } - - authenticate(authentication: AuthenticationRequest, params: Params) { - const isV2 = authentication.v2 === true && authentication.password === 'supersecret' - - if (isV2 || authentication.both) { - return Promise.resolve(Object.assign({ params, authentication }, Strategy2.result)) - } - - return Promise.reject(new NotAuthenticated('Invalid v2 user')) - } - - async parse(req: MockRequest) { - if (req.isV2) { - return Strategy2.result - } - - return null - } -} diff --git a/packages/authentication/test/hooks/authenticate.test.ts b/packages/authentication/test/hooks/authenticate.test.ts deleted file mode 100644 index 89b7bad514..0000000000 --- a/packages/authentication/test/hooks/authenticate.test.ts +++ /dev/null @@ -1,256 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import assert from 'assert' -import { feathers, Application, Params, ServiceMethods } from '@feathersjs/feathers' - -import { Strategy1, Strategy2 } from '../fixtures' -import { AuthenticationService, hooks } from '../../src' - -const { authenticate } = hooks - -describe('authentication/hooks/authenticate', () => { - let app: Application<{ - authentication: AuthenticationService - 'auth-v2': AuthenticationService - users: Partial & { id: string } - }> - - beforeEach(() => { - app = feathers() - app.use( - 'authentication', - new AuthenticationService(app, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['first'] - }) - ) - app.use( - 'auth-v2', - new AuthenticationService(app, 'auth-v2', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['test'] - }) - ) - app.use('users', { - id: 'id', - - async find() { - return [] - }, - - async get(_id: string | number, params: Params) { - return params - } - }) - - const service = app.service('authentication') - - service.register('first', new Strategy1()) - service.register('second', new Strategy2()) - - app.service('auth-v2').register('test', new Strategy1()) - - app.service('users').hooks({ - get: [authenticate('first', 'second')] - }) - - app.service('users').id = 'name' - app.setup() - }) - - it('throws an error when no strategies are passed', () => { - try { - // @ts-ignore - authenticate() - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'The authenticate hook needs at least one allowed strategy') - } - }) - - it('throws an error when not a before hook', async () => { - const users = app.service('users') - - users.hooks({ - after: { - all: [authenticate('first')] - } - }) - - try { - await users.find() - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'The authenticate hook must be used as a before hook') - } - }) - - it('throws an error if authentication service is gone', async () => { - delete app.services.authentication - - try { - await app.service('users').get(1, { - authentication: { - some: 'thing' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Could not find a valid authentication service') - } - }) - - it('authenticates with first strategy, merges params', async () => { - const params = { - authentication: { - strategy: 'first', - username: 'David' - } - } - - const result = await app.service('users').get(1, params) - - assert.deepStrictEqual(result, Object.assign({}, params, Strategy1.result)) - }) - - it('authenticates with first strategy, keeps references alive (#1629)', async () => { - const connection = {} - const params = { - connection, - authentication: { - strategy: 'first', - username: 'David' - } - } - - app.service('users').hooks({ - after: { - get: (context) => { - context.result.params = context.params - } - } - }) - - const result = await app.service('users').get(1, params) - - assert.ok(result.params.connection === connection) - }) - - it('authenticates with different authentication service', async () => { - const params = { - authentication: { - strategy: 'test', - username: 'David' - } - } - - app.service('users').hooks({ - before: { - find: [ - authenticate({ - service: 'auth-v2', - strategies: ['test'] - }) - ] - } - }) - - const result = await app.service('users').find(params) - - assert.deepStrictEqual(result, []) - }) - - it('authenticates with second strategy', async () => { - const params = { - authentication: { - strategy: 'second', - v2: true, - password: 'supersecret' - } - } - - const result = await app.service('users').get(1, params) - - assert.deepStrictEqual( - result, - Object.assign( - { - authentication: params.authentication, - params: { authenticated: true } - }, - Strategy2.result - ) - ) - }) - - it('passes for internal calls without authentication', async () => { - const result = await app.service('users').get(1) - - assert.deepStrictEqual(result, {}) - }) - - it('fails for invalid params.authentication', async () => { - try { - await app.service('users').get(1, { - authentication: { - strategy: 'first', - some: 'thing' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid Dave') - } - }) - - it('fails for external calls without authentication', async () => { - try { - await app.service('users').get(1, { - provider: 'rest' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Not authenticated') - } - }) - - it('passes with authenticated: true but external call', async () => { - const params = { - provider: 'rest', - authenticated: true - } - const result = await app.service('users').get(1, params) - - assert.deepStrictEqual(result, params) - }) - - it('errors when used on the authentication service', async () => { - const auth = app.service('authentication') - - auth.hooks({ - before: { - create: authenticate('first') - } - }) - - try { - await auth.create({ - strategy: 'first', - username: 'David' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.message, - 'The authenticate hook does not need to be used on the authentication service' - ) - } - }) -}) diff --git a/packages/authentication/test/hooks/event.test.ts b/packages/authentication/test/hooks/event.test.ts deleted file mode 100644 index e602febdff..0000000000 --- a/packages/authentication/test/hooks/event.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import assert from 'assert' -import { feathers, HookContext } from '@feathersjs/feathers' - -import hook from '../../src/hooks/event' -import { AuthenticationParams, AuthenticationRequest, AuthenticationResult } from '../../src/core' - -describe('authentication/hooks/events', () => { - const app = feathers().use('authentication', { - async create(data: AuthenticationRequest) { - return data - }, - - async remove(id: string) { - return { id } - } - }) - - const service = app.service('authentication') - - service.hooks({ - create: [hook('login')], - remove: [hook('logout')] - }) - - it('login', (done) => { - const data = { - message: 'test' - } - - app.once('login', (result: AuthenticationResult, params: AuthenticationParams, context: HookContext) => { - try { - assert.deepStrictEqual(result, data) - assert.ok(params.testParam) - assert.ok(context.method, 'create') - done() - } catch (error: any) { - done(error) - } - }) - - service.create(data, { - testParam: true, - provider: 'test' - } as any) - }) - - it('logout', (done) => { - app.once('logout', (result: AuthenticationResult, params: AuthenticationParams, context: HookContext) => { - try { - assert.deepStrictEqual(result, { - id: 'test' - }) - assert.ok(params.testParam) - assert.ok(context.method, 'remove') - done() - } catch (error: any) { - done(error) - } - }) - - service.remove('test', { - testParam: true, - provider: 'test' - } as any) - }) - - it('does nothing when provider is not set', (done) => { - const handler = () => { - done(new Error('Should never get here')) - } - - app.on('logout', handler) - service.once('removed', (result: AuthenticationResult) => { - app.removeListener('logout', handler) - assert.deepStrictEqual(result, { - id: 'test' - }) - done() - }) - - service.remove('test') - }) -}) diff --git a/packages/authentication/test/jwt.test.ts b/packages/authentication/test/jwt.test.ts deleted file mode 100644 index 8120d3cb9f..0000000000 --- a/packages/authentication/test/jwt.test.ts +++ /dev/null @@ -1,492 +0,0 @@ -import assert from 'assert' -import merge from 'lodash/merge' -import { feathers, Application, Service } from '@feathersjs/feathers' -import { memory } from '@feathersjs/memory' -import { getDispatch, resolve, resolveDispatch } from '@feathersjs/schema' - -import { AuthenticationService, JWTStrategy, hooks } from '../src' -import { ServerResponse } from 'http' -import { MockRequest } from './fixtures' - -const { authenticate } = hooks - -describe('authentication/jwt', () => { - let app: Application<{ - authentication: AuthenticationService - users: Partial - protected: Partial - }> - let user: any - let accessToken: string - let payload: any - - const userDispatchResolver = resolve({ - converter: async () => { - return { - dispatch: true, - message: 'Hello world' - } - }, - properties: {} - }) - - beforeEach(async () => { - app = feathers() - - const authService = new AuthenticationService(app, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['jwt'] - }) - - authService.register('jwt', new JWTStrategy()) - - app.use('users', memory()) - app.use('protected', { - async get(id, params) { - return { - id, - params - } - } - }) - app.use('authentication', authService) - - const service = app.service('authentication') - - app.service('protected').hooks({ - before: { - all: [authenticate('jwt')] - } - }) - - app.service('users').hooks({ - around: { - all: [resolveDispatch(userDispatchResolver)] - }, - after: { - get: [ - (context) => { - if (context.params.provider) { - context.result.isExternal = true - } - - return context - } - ] - } - }) - - user = await app.service('users').create({ - name: 'David' - }) - - accessToken = await service.createAccessToken( - {}, - { - subject: `${user.id}` - } - ) - - payload = await service.verifyAccessToken(accessToken) - app.setup() - }) - - it('getEntity', async () => { - const [strategy] = app.service('authentication').getStrategies('jwt') as JWTStrategy[] - - let entity = await strategy.getEntity(user.id, { - query: { - name: 'Dave' - } - }) - - assert.deepStrictEqual(entity, user) - - entity = await strategy.getEntity(user.id, { - provider: 'rest' - }) - - assert.deepStrictEqual(entity, { - ...user, - isExternal: true - }) - }) - - describe('handleConnection', () => { - it('adds entity and authentication information on create', async () => { - const connection: any = {} - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection } - ) - - assert.deepStrictEqual(connection.user, user) - assert.deepStrictEqual(connection.authentication, { - strategy: 'jwt', - accessToken - }) - }) - - it('login event connection has authentication information (#2908)', async () => { - const connection: any = {} - const onLogin = new Promise((resolve, reject) => - app.once('login', (data, { connection }) => { - try { - assert.deepStrictEqual(connection.user, { - ...user, - isExternal: true - }) - resolve(data) - } catch (error) { - reject(error) - } - }) - ) - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection, provider: 'test' } - ) - - await onLogin - }) - - it('resolves safe dispatch data in authentication result', async () => { - const authResult = await app.service('authentication').create({ - strategy: 'jwt', - accessToken - }) - - const dispatch = getDispatch(authResult) - - assert.deepStrictEqual(dispatch.user, { dispatch: true, message: 'Hello world' }) - }) - - it('sends disconnect event when connection token expires and removes all connection information', async () => { - const connection: any = {} - const token: string = await app.service('authentication').createAccessToken( - {}, - { - subject: `${user.id}`, - expiresIn: '1s' - } - ) - - const result = await app.service('authentication').create( - { - strategy: 'jwt', - accessToken: token - }, - { connection } - ) - - assert.ok(connection.authentication) - - assert.strictEqual(result.accessToken, token) - - const disconnection = await new Promise((resolve) => app.once('disconnect', resolve)) - - assert.strictEqual(disconnection, connection) - - assert.ok(!connection.authentication) - assert.ok(!connection.user) - assert.strictEqual(Object.keys(connection).length, 0) - }) - - it('deletes authentication information on remove', async () => { - const connection: any = {} - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection } - ) - - assert.ok(connection.authentication) - - await app.service('authentication').remove(null, { - authentication: connection.authentication, - connection - }) - - assert.ok(!connection.authentication) - assert.ok(!connection.user) - }) - - it('deletes authentication information on disconnect but maintains it in event handler', async () => { - const connection: any = {} - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection } - ) - - assert.ok(connection.authentication) - assert.ok(connection.user) - - const disconnectPromise = new Promise((resolve, reject) => - app.once('disconnect', (connection) => { - try { - assert.ok(connection.authentication) - assert.ok(connection.user) - resolve(connection) - } catch (error) { - reject(error) - } - }) - ) - app.emit('disconnect', connection) - - await disconnectPromise - await new Promise((resolve) => process.nextTick(resolve)) - - assert.ok(!connection.authentication) - assert.ok(!connection.user) - }) - - it('does not remove if accessToken does not match', async () => { - const connection: any = {} - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection } - ) - - assert.ok(connection.authentication) - - await app.service('authentication').remove(null, { - authentication: { - strategy: 'jwt', - accessToken: await app.service('authentication').createAccessToken( - {}, - { - subject: `${user.id}` - } - ) - }, - connection - }) - - assert.ok(connection.authentication) - }) - }) - - describe('with authenticate hook', () => { - it('fails for protected service and external call when not set', async () => { - try { - await app.service('protected').get('test', { - provider: 'rest' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Not authenticated') - } - }) - - it('fails for protected service and external call when not strategy', async () => { - try { - await app.service('protected').get('test', { - provider: 'rest', - authentication: { - username: 'Dave' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid authentication information (no `strategy` set)') - } - }) - - it('fails when entity service was not found', async () => { - delete app.services.users - - await assert.rejects( - () => - app.service('protected').get('test', { - provider: 'rest', - authentication: { - strategy: 'jwt', - accessToken - } - }), - { - message: "Can not find service 'users'" - } - ) - }) - - it('fails when accessToken is not set', async () => { - try { - await app.service('protected').get('test', { - provider: 'rest', - authentication: { - strategy: 'jwt' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'No access token') - } - }) - - it('passes when authentication is set and merges params', async () => { - const params = { - provider: 'rest', - authentication: { - strategy: 'jwt', - accessToken - } - } - - const result = await app.service('protected').get('test', params) - - assert.strictEqual(Object.keys(result.params).length, 4) - assert.ok(!result.params.accessToken, 'Did not merge accessToken') - assert.deepStrictEqual(result, { - id: 'test', - params: merge({}, params, { - user, - authentication: { payload }, - authenticated: true - }) - }) - }) - - it('works with entity set to null', async () => { - const params = { - provider: 'rest', - authentication: { - strategy: 'jwt', - accessToken - } - } - - app.get('authentication').entity = null - - const result = await app.service('protected').get('test', params) - - assert.strictEqual(Object.keys(result.params).length, 3) - assert.ok(!result.params.accessToken, 'Did not merge accessToken') - assert.deepStrictEqual(result, { - id: 'test', - params: merge({}, params, { - authentication: { payload }, - authenticated: true - }) - }) - }) - }) - - describe('on authentication service', () => { - it('authenticates but does not return a new accessToken', async () => { - const authResult = await app.service('authentication').create({ - strategy: 'jwt', - accessToken - }) - - assert.strictEqual(authResult.accessToken, accessToken) - assert.deepStrictEqual(authResult.user, user) - assert.deepStrictEqual(authResult.authentication.payload, payload) - }) - - it('errors when trying to set invalid option', () => { - app.get('authentication').otherJwt = { - expiresIn: 'something' - } - - try { - app.service('authentication').register('otherJwt', new JWTStrategy()) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.message, - "Invalid JwtStrategy option 'authentication.otherJwt.expiresIn'. Did you mean to set it in 'authentication.jwtOptions'?" - ) - } - }) - - it('errors when `header` option is an object`', () => { - app.get('authentication').otherJwt = { - header: { message: 'This is wrong' } - } - - assert.throws(() => app.service('authentication').register('otherJwt', new JWTStrategy()), { - message: "The 'header' option for the otherJwt strategy must be a string" - }) - }) - }) - - describe('parse', () => { - const res = {} as ServerResponse - - it('returns null when header not set', async () => { - const req = {} as MockRequest - - const result = await app.service('authentication').parse(req, res, 'jwt') - - assert.strictEqual(result, null) - }) - - it('parses plain Authorization header', async () => { - const req = { - headers: { - authorization: accessToken - } - } as MockRequest - - const result = await app.service('authentication').parse(req, res, 'jwt') - - assert.deepStrictEqual(result, { - strategy: 'jwt', - accessToken - }) - }) - - it('parses Authorization header with Bearer scheme', async () => { - const req = { - headers: { - authorization: ` Bearer ${accessToken} ` - } - } as MockRequest - - const result = await app.service('authentication').parse(req, res, 'jwt') - - assert.deepStrictEqual(result, { - strategy: 'jwt', - accessToken - }) - }) - - it('return null when scheme does not match', async () => { - const req = { - headers: { - authorization: ' Basic something' - } - } as MockRequest - - const result = await app.service('authentication').parse(req, res, 'jwt') - - assert.strictEqual(result, null) - }) - }) -}) diff --git a/packages/authentication/test/service.test.ts b/packages/authentication/test/service.test.ts deleted file mode 100644 index 3594822bba..0000000000 --- a/packages/authentication/test/service.test.ts +++ /dev/null @@ -1,322 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import assert from 'assert' -import omit from 'lodash/omit' -import jwt from 'jsonwebtoken' -import { feathers, Application } from '@feathersjs/feathers' -import { memory, MemoryService } from '@feathersjs/memory' - -import { defaultOptions } from '../src/options' -import { AuthenticationService } from '../src' - -import { Strategy1 } from './fixtures' - -const UUID = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ - -describe('authentication/service', () => { - const message = 'Some payload' - - let app: Application<{ - authentication: AuthenticationService - users: MemoryService - }> - - beforeEach(() => { - app = feathers() - app.use( - 'authentication', - new AuthenticationService(app, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['first'] - }) - ) - app.use('users', memory()) - - app.service('authentication').register('first', new Strategy1()) - }) - - it('settings returns authentication options', () => { - assert.deepStrictEqual( - app.service('authentication').configuration, - Object.assign({}, defaultOptions, app.get('authentication')) - ) - }) - - it('app.defaultAuthentication()', () => { - assert.strictEqual(app.defaultAuthentication(), app.service('authentication')) - assert.throws(() => app.defaultAuthentication('dummy'), { - message: "Can not find service 'dummy'" - }) - }) - - describe('create', () => { - it('creates a valid accessToken and includes strategy result', async () => { - const service = app.service('authentication') - const result = await service.create({ - strategy: 'first', - username: 'David' - }) - - const settings = service.configuration.jwtOptions - const decoded = jwt.decode(result.accessToken) - - if (typeof decoded === 'string') { - throw new Error('Unexpected decoded JWT type') - } - - assert.ok(result.accessToken) - assert.deepStrictEqual(omit(result, 'accessToken', 'authentication'), Strategy1.result) - assert.deepStrictEqual(result.authentication.payload, decoded) - assert.ok(UUID.test(decoded.jti), 'Set `jti` to default UUID') - assert.strictEqual(decoded.aud, settings.audience) - assert.strictEqual(decoded.iss, settings.issuer) - }) - - it('fails when strategy fails', async () => { - try { - await app.service('authentication').create({ - strategy: 'first', - username: 'Dave' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid Dave') - } - }) - - it('creates a valid accessToken with strategy and params.payload', async () => { - const result = await app.service('authentication').create( - { - strategy: 'first', - username: 'David' - }, - { - payload: { message } - } - ) - - const decoded = jwt.decode(result.accessToken) - - if (typeof decoded === 'string') { - throw new Error('Unexpected decoded JWT type') - } - - assert.strictEqual(decoded.message, message) - }) - - it('sets the subject authResult[entity][entityService.id]', async () => { - const { accessToken } = await app.service('authentication').create({ - strategy: 'first', - username: 'David' - }) - - const decoded = jwt.decode(accessToken) - - assert.strictEqual(decoded.sub, Strategy1.result.user.id.toString()) - }) - - it('sets the subject authResult[entity][entityId]', async () => { - app.get('authentication').entityId = 'name' - - const { accessToken } = await app.service('authentication').create({ - strategy: 'first', - username: 'David' - }) - - const decoded = jwt.decode(accessToken) - - assert.strictEqual(decoded.sub, Strategy1.result.user.name.toString()) - }) - - it('does not override the subject if already set', async () => { - const subject = 'Davester' - - const { accessToken } = await app.service('authentication').create( - { - strategy: 'first', - username: 'David' - }, - { - jwt: { subject } - } - ) - - const decoded = jwt.decode(accessToken) - - assert.strictEqual(decoded.sub, subject) - }) - - it('errors when subject can not be found', async () => { - // @ts-ignore - app.service('users').options.id = 'somethingElse' - - try { - await app.service('authentication').create({ - strategy: 'first', - username: 'David' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Can not set subject from user.somethingElse') - } - }) - - it('errors when no allowed strategies are set', async () => { - const service = app.service('authentication') - const configuration = service.configuration - - delete configuration.authStrategies - - app.set('authentication', configuration) - - try { - await service.create({ - strategy: 'first', - username: 'Dave' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual( - error.message, - 'No authentication strategies allowed for creating a JWT (`authStrategies`)' - ) - } - }) - }) - - describe('remove', () => { - it('can remove with authentication strategy set', async () => { - const authResult = await app.service('authentication').remove(null, { - authentication: { - strategy: 'first', - username: 'David' - } - }) - - assert.deepStrictEqual(authResult, Strategy1.result) - }) - - it('passes when id is set and matches accessToken', async () => { - const authResult = await app.service('authentication').remove('test', { - authentication: { - strategy: 'first', - username: 'David', - accessToken: 'test' - } - }) - - assert.deepStrictEqual(authResult, Strategy1.result) - }) - - it('fails when id is set and does not match accessToken', async () => { - await assert.rejects( - () => - app.service('authentication').remove('test', { - authentication: { - strategy: 'first', - username: 'David', - accessToken: 'testing' - } - }), - { - name: 'NotAuthenticated', - message: 'Invalid access token' - } - ) - }) - - it('errors when trying to remove with nothing', async () => { - try { - await app.service('authentication').remove(null) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Invalid authentication information (no `strategy` set)') - } - }) - }) - - describe('setup', () => { - it('errors when there is no secret', async () => { - delete app.get('authentication').secret - - await assert.rejects(() => app.setup(), { - message: "A 'secret' must be provided in your authentication configuration" - }) - }) - - it('throws an error if service name is not set', async () => { - const otherApp = feathers() - - otherApp.use( - '/authentication', - new AuthenticationService(otherApp, 'authentication', { - secret: 'supersecret', - authStrategies: ['first'] - }) - ) - - await assert.rejects(() => otherApp.setup(), { - message: "The 'service' option is not set in the authentication configuration" - }) - }) - - it('throws an error if entity service does not exist', async () => { - const otherApp = feathers() - - otherApp.use( - '/authentication', - new AuthenticationService(otherApp, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['first'] - }) - ) - - await assert.rejects(() => otherApp.setup(), { - message: "Can not find service 'users'" - }) - }) - - it('throws an error if entity service exists but has no `id`', async () => { - const otherApp = feathers() - - otherApp.use( - '/authentication', - new AuthenticationService(otherApp, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - strategies: ['first'] - }) - ) - - otherApp.use('/users', { - async get() { - return {} - } - }) - - await assert.rejects(() => otherApp.setup(), { - message: "The 'users' service does not have an 'id' property and no 'entityId' option is set." - }) - }) - - it('passes when entity service exists and `entityId` property is set', () => { - app.get('authentication').entityId = 'id' - app.use('users', memory()) - - app.setup() - }) - - it('does nothing when `entity` is explicitly `null`', () => { - app.get('authentication').entity = null - - app.setup() - }) - }) -}) diff --git a/packages/authentication/tsconfig.json b/packages/authentication/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/authentication/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/cli/package.json b/packages/cli/package.json index 15f08ee83b..fa988c3c9a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -58,27 +58,6 @@ "commander": "^12.1.0" }, "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/authentication-client": "^5.0.30", - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/authentication-oauth": "^5.0.30", - "@feathersjs/configuration": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/express": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/knex": "^5.0.30", - "@feathersjs/koa": "^5.0.30", - "@feathersjs/mongodb": "^5.0.30", - "@feathersjs/rest-client": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@feathersjs/socketio": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@feathersjs/typebox": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "@types/prettier": "^2.7.3", - "axios": "^1.7.7", "mocha": "^10.7.3", "shx": "^0.3.4", "ts-node": "^10.9.2", @@ -86,4 +65,4 @@ "typescript": "^5.5.4" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} +} \ No newline at end of file diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 50263fc9f9..421167aecb 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,27 +1,11 @@ import chalk from 'chalk' import { Command } from 'commander' -import { dirname } from 'path' -import { runGenerator, getContext, FeathersBaseContext, version } from '@feathersjs/generators' -import { createRequire } from 'node:module' export * from 'commander' export { chalk } -const require = createRequire(import.meta.url) - export const commandRunner = (name: string) => async (options: any) => { - const folder = dirname(require.resolve('@feathersjs/generators')) - const ctx = getContext({ - ...options - }) - - await Promise.resolve(ctx) - .then(runGenerator(folder, name, 'index.js')) - .catch((error) => { - const { logger } = ctx.pinion - - logger.error(`Error: ${chalk.white(error.message)}`) - }) + console.log('TO DO', name, options) } export const program = new Command() @@ -29,7 +13,7 @@ export const program = new Command() program .name('feathers') .description('The Feathers command line interface 🕊️') - .version(version) + .version('6.0.0') .showHelpAfterError() const generate = program.command('generate').alias('g') diff --git a/packages/commons/package.json b/packages/commons/package.json index 81dff1bb65..7361eb0f0a 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -41,8 +41,7 @@ ], "scripts": { "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", + "compile": "shx rm -rf lib/ && tsc", "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { @@ -60,4 +59,4 @@ "typescript": "^5.5.4" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} +} \ No newline at end of file diff --git a/packages/configuration/CHANGELOG.md b/packages/configuration/CHANGELOG.md deleted file mode 100644 index c3b5ffe2fc..0000000000 --- a/packages/configuration/CHANGELOG.md +++ /dev/null @@ -1,713 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/configuration - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) -- **schema:** Make schemas validation library independent and add TypeBox support ([#2772](https://github.com/feathersjs/feathers/issues/2772)) ([44172d9](https://github.com/feathersjs/feathers/commit/44172d99b566d11d9ceda04f1d0bf72b6d05ce76)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **configuration:** Only validate the initial configuration against the schema ([#2622](https://github.com/feathersjs/feathers/issues/2622)) ([386c5e2](https://github.com/feathersjs/feathers/commit/386c5e2e67bfad4fb4333f2e3e17f7d7e09ac27e)) -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **configuration:** Allow app configuration to be validated against a schema ([#2590](https://github.com/feathersjs/feathers/issues/2590)) ([a268f86](https://github.com/feathersjs/feathers/commit/a268f86da92a8ada14ed11ab456aac0a4bba5bb0)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -**Note:** Version bump only for package @feathersjs/configuration - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### chore - -- **configuration:** Remove environment variable substitution ([#1942](https://github.com/feathersjs/feathers/issues/1942)) ([caaa21f](https://github.com/feathersjs/feathers/commit/caaa21ffdc6a8dcac82fb403c91d9d4b781a6c0a)) - -### BREAKING CHANGES - -- **configuration:** Falls back to node-config instead of adding additional - functionality like path replacements and automatic environment variable insertion. - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### chore - -- **configuration:** Remove environment variable substitution ([#1942](https://github.com/feathersjs/feathers/issues/1942)) ([caaa21f](https://github.com/feathersjs/feathers/commit/caaa21ffdc6a8dcac82fb403c91d9d4b781a6c0a)) - -### BREAKING CHANGES - -- **configuration:** Falls back to node-config instead of adding additional - functionality like path replacements and automatic environment variable insertion. - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -### Bug Fixes - -- **configuration:** Fix handling of config values that start with . or .. but are not actually relative paths; e.g. ".foo" or "..bar" ([#2065](https://github.com/feathersjs/feathers/issues/2065)) ([d07bf59](https://github.com/feathersjs/feathers/commit/d07bf5902e9c8c606f16b9523472972d3d2e9b49)) - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/configuration - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Bug Fixes - -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **package:** update config to version 3.0.0 ([#1100](https://github.com/feathersjs/feathers/issues/1100)) ([c9f4b42](https://github.com/feathersjs/feathers/commit/c9f4b42)) -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- **package:** update debug to version 3.0.0 ([#45](https://github.com/feathersjs/feathers/issues/45)) ([2391434](https://github.com/feathersjs/feathers/commit/2391434)) -- **package:** update debug to version 3.0.1 ([#46](https://github.com/feathersjs/feathers/issues/46)) ([f8ada69](https://github.com/feathersjs/feathers/commit/f8ada69)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) - -## [2.0.6](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.5...@feathersjs/configuration@2.0.6) (2019-01-02) - -**Note:** Version bump only for package @feathersjs/configuration - - - -## [2.0.5](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.4...@feathersjs/configuration@2.0.5) (2018-12-16) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- **package:** update config to version 3.0.0 ([#1100](https://github.com/feathersjs/feathers/issues/1100)) ([c9f4b42](https://github.com/feathersjs/feathers/commit/c9f4b42)) - - - -## [2.0.4](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.3...@feathersjs/configuration@2.0.4) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/configuration - - - -## [2.0.3](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.2...@feathersjs/configuration@2.0.3) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/configuration - - - -## [2.0.2](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.1...@feathersjs/configuration@2.0.2) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/configuration - - - -## 2.0.1 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v2.0.0](https://github.com/feathersjs/configuration/tree/v2.0.0) (2018-07-30) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v1.0.2...v2.0.0) - -**Closed issues:** - -- Config adding a value of userName in runtime its overwritten to the OS name [\#58](https://github.com/feathersjs/configuration/issues/58) -- Configuration Management [\#26](https://github.com/feathersjs/configuration/issues/26) - -**Merged pull requests:** - -- Update config to the latest version 🚀 [\#59](https://github.com/feathersjs/configuration/pull/59) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- misspelling [\#57](https://github.com/feathersjs/configuration/pull/57) ([chaintng](https://github.com/chaintng)) -- Update mocha to the latest version 🚀 [\#56](https://github.com/feathersjs/configuration/pull/56) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.2](https://github.com/feathersjs/configuration/tree/v1.0.2) (2018-01-02) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v1.0.1...v1.0.2) - -**Merged pull requests:** - -- Remove example and update Readme to point directly to the Feathers docs [\#55](https://github.com/feathersjs/configuration/pull/55) ([daffl](https://github.com/daffl)) - -## [v1.0.1](https://github.com/feathersjs/configuration/tree/v1.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#53](https://github.com/feathersjs/configuration/pull/53) ([daffl](https://github.com/daffl)) -- Update nsp to the latest version 🚀 [\#52](https://github.com/feathersjs/configuration/pull/52) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0](https://github.com/feathersjs/configuration/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v1.0.0-pre.1...v1.0.0) - -## [v1.0.0-pre.1](https://github.com/feathersjs/configuration/tree/v1.0.0-pre.1) (2017-10-23) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.4.2...v1.0.0-pre.1) - -**Closed issues:** - -- Move config options to app.config instead of the Express app object. [\#31](https://github.com/feathersjs/configuration/issues/31) - -**Merged pull requests:** - -- Update to new plugin infrastructure and npm scopes [\#51](https://github.com/feathersjs/configuration/pull/51) ([daffl](https://github.com/daffl)) - -## [v0.4.2](https://github.com/feathersjs/configuration/tree/v0.4.2) (2017-10-15) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.4.1...v0.4.2) - -**Closed issues:** - -- Missing TypeScript declaration file [\#48](https://github.com/feathersjs/configuration/issues/48) -- Feathers writing in typescript fails to boot on configuration [\#47](https://github.com/feathersjs/configuration/issues/47) -- Prevent automatic expansion of environment variables [\#42](https://github.com/feathersjs/configuration/issues/42) -- Getting Env name [\#41](https://github.com/feathersjs/configuration/issues/41) -- Nested configuration [\#38](https://github.com/feathersjs/configuration/issues/38) -- Stuck in configuration loophole... [\#37](https://github.com/feathersjs/configuration/issues/37) -- Docs are wrong [\#36](https://github.com/feathersjs/configuration/issues/36) -- Why use "NODE_ENV=development" with default.json? [\#33](https://github.com/feathersjs/configuration/issues/33) - -**Merged pull requests:** - -- Create TypeScript definitions [\#50](https://github.com/feathersjs/configuration/pull/50) ([jhanschoo](https://github.com/jhanschoo)) -- Update mocha to the latest version 🚀 [\#49](https://github.com/feathersjs/configuration/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update debug to the latest version 🚀 [\#46](https://github.com/feathersjs/configuration/pull/46) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update debug to the latest version 🚀 [\#45](https://github.com/feathersjs/configuration/pull/45) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Grammatical change [\#44](https://github.com/feathersjs/configuration/pull/44) ([eugeniaguerrero](https://github.com/eugeniaguerrero)) -- More documentation on using and escaping environment variables [\#43](https://github.com/feathersjs/configuration/pull/43) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#40](https://github.com/feathersjs/configuration/pull/40) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#39](https://github.com/feathersjs/configuration/pull/39) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Fix first example [\#35](https://github.com/feathersjs/configuration/pull/35) ([elfey](https://github.com/elfey)) -- 👻😱 Node.js 0.10 is unmaintained 😱👻 [\#30](https://github.com/feathersjs/configuration/pull/30) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.4.1](https://github.com/feathersjs/configuration/tree/v0.4.1) (2016-10-24) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.4.0...v0.4.1) - -**Closed issues:** - -- Investigate node-config [\#8](https://github.com/feathersjs/configuration/issues/8) - -**Merged pull requests:** - -- update readme [\#29](https://github.com/feathersjs/configuration/pull/29) ([slajax](https://github.com/slajax)) -- jshint —\> semistandard [\#28](https://github.com/feathersjs/configuration/pull/28) ([corymsmith](https://github.com/corymsmith)) - -## [v0.4.0](https://github.com/feathersjs/configuration/tree/v0.4.0) (2016-10-22) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.3.3...v0.4.0) - -**Implemented enhancements:** - -- implement node-config [\#27](https://github.com/feathersjs/configuration/pull/27) ([slajax](https://github.com/slajax)) - -**Closed issues:** - -- Deprecate v1 in favour of node-config [\#25](https://github.com/feathersjs/configuration/issues/25) -- Make this repo more about managing configuration [\#24](https://github.com/feathersjs/configuration/issues/24) - -## [v0.3.3](https://github.com/feathersjs/configuration/tree/v0.3.3) (2016-09-12) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.3.2...v0.3.3) - -## [v0.3.2](https://github.com/feathersjs/configuration/tree/v0.3.2) (2016-09-12) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.3.1...v0.3.2) - -**Closed issues:** - -- A way to have local override [\#20](https://github.com/feathersjs/configuration/issues/20) - -**Merged pull requests:** - -- Remove check for development mode [\#21](https://github.com/feathersjs/configuration/pull/21) ([daffl](https://github.com/daffl)) - -## [v0.3.1](https://github.com/feathersjs/configuration/tree/v0.3.1) (2016-08-15) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.3.0...v0.3.1) - -**Merged pull requests:** - -- Support `null` values [\#19](https://github.com/feathersjs/configuration/pull/19) ([KenanY](https://github.com/KenanY)) -- Update mocha to version 3.0.0 🚀 [\#18](https://github.com/feathersjs/configuration/pull/18) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.3.0](https://github.com/feathersjs/configuration/tree/v0.3.0) (2016-05-22) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.2.3...v0.3.0) - -**Closed issues:** - -- \.json config need deep merge options [\#16](https://github.com/feathersjs/configuration/issues/16) - -**Merged pull requests:** - -- Add functionality for deeply extending configuration [\#17](https://github.com/feathersjs/configuration/pull/17) ([daffl](https://github.com/daffl)) - -## [v0.2.3](https://github.com/feathersjs/configuration/tree/v0.2.3) (2016-04-24) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.2.2...v0.2.3) - -**Closed issues:** - -- PR: Support modules in config [\#12](https://github.com/feathersjs/configuration/issues/12) - -**Merged pull requests:** - -- Support modules as configuration files. [\#13](https://github.com/feathersjs/configuration/pull/13) ([wkw](https://github.com/wkw)) -- Update all dependencies 🌴 [\#10](https://github.com/feathersjs/configuration/pull/10) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.2.2](https://github.com/feathersjs/configuration/tree/v0.2.2) (2016-03-27) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.2.1...v0.2.2) - -**Merged pull requests:** - -- Expanding environment variables in \.json [\#9](https://github.com/feathersjs/configuration/pull/9) ([derek-watson](https://github.com/derek-watson)) - -## [v0.2.1](https://github.com/feathersjs/configuration/tree/v0.2.1) (2016-03-12) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.2.0...v0.2.1) - -**Merged pull requests:** - -- Makes sure that arrays get converted properly [\#7](https://github.com/feathersjs/configuration/pull/7) ([daffl](https://github.com/daffl)) - -## [v0.2.0](https://github.com/feathersjs/configuration/tree/v0.2.0) (2016-03-09) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.1.1...v0.2.0) - -**Closed issues:** - -- Needs an escape character [\#4](https://github.com/feathersjs/configuration/issues/4) - -**Merged pull requests:** - -- Implement an escape character [\#6](https://github.com/feathersjs/configuration/pull/6) ([daffl](https://github.com/daffl)) - -## [v0.1.1](https://github.com/feathersjs/configuration/tree/v0.1.1) (2016-03-09) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.1.0...v0.1.1) - -**Closed issues:** - -- Configuration should recursively go through the values [\#2](https://github.com/feathersjs/configuration/issues/2) - -**Merged pull requests:** - -- Replace slashes in paths with the separator [\#5](https://github.com/feathersjs/configuration/pull/5) ([daffl](https://github.com/daffl)) -- Allow to convert deeply nested environment variables [\#3](https://github.com/feathersjs/configuration/pull/3) ([daffl](https://github.com/daffl)) -- Adding nsp check [\#1](https://github.com/feathersjs/configuration/pull/1) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.0](https://github.com/feathersjs/configuration/tree/v0.1.0) (2015-11-14) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/configuration/LICENSE b/packages/configuration/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/configuration/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/configuration/README.md b/packages/configuration/README.md deleted file mode 100644 index 6e81d7cdb5..0000000000 --- a/packages/configuration/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/configuration - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/configuration.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/configuration) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> A small configuration module for your Feathers application. - -## Installation - -``` -npm install @feathersjs/configuration --save -``` - -## Documentation - -Refer to the [Feathers configuration API documentation](https://feathersjs.com/api/configuration.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/configuration/package.json b/packages/configuration/package.json deleted file mode 100644 index d81f37a2d6..0000000000 --- a/packages/configuration/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "@feathersjs/configuration", - "description": "A small configuration module for your Feathers application.", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/configuration" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "NODE_CONFIG_DIR=./test/config mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "semistandard": { - "env": [ - "mocha" - ] - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@types/config": "^3.3.4", - "config": "^3.3.12" - }, - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/configuration/src/index.ts b/packages/configuration/src/index.ts deleted file mode 100644 index a34606d679..0000000000 --- a/packages/configuration/src/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Application, ApplicationHookContext, NextFunction } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { Schema, Validator } from '@feathersjs/schema' -import config from 'config' - -const debug = createDebug('@feathersjs/configuration') - -export = function init(schema?: Schema | Validator) { - const validator: Validator = typeof schema === 'function' ? schema : schema?.validate.bind(schema) - - return (app?: Application) => { - if (!app) { - return config - } - - const configuration: { [key: string]: unknown } = { ...config } - - debug(`Initializing configuration for ${config.util.getEnv('NODE_ENV')} environment`) - - Object.keys(configuration).forEach((name) => { - const value = configuration[name] - debug(`Setting ${name} configuration value to`, value) - app.set(name, value) - }) - - if (validator) { - app.hooks({ - setup: [ - async (_context: ApplicationHookContext, next: NextFunction) => { - await validator(configuration) - await next() - } - ] - }) - } - - return config - } -} diff --git a/packages/configuration/test/config/default.json b/packages/configuration/test/config/default.json deleted file mode 100644 index 8e3ede2021..0000000000 --- a/packages/configuration/test/config/default.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "port": 3030, - "array": ["one", "two", "three"], - "deep": { "base": false }, - "nullish": null -} diff --git a/packages/configuration/test/index.test.ts b/packages/configuration/test/index.test.ts deleted file mode 100644 index 65fc1c8d14..0000000000 --- a/packages/configuration/test/index.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { strict as assert } from 'assert' -import { feathers, Application } from '@feathersjs/feathers' -import { Ajv, schema } from '@feathersjs/schema' -import configuration from '../src' - -describe('@feathersjs/configuration', () => { - const app: Application = feathers().configure(configuration()) - - it('initialized app with default.json', () => { - assert.equal(app.get('port'), 3030) - assert.deepEqual(app.get('array'), ['one', 'two', 'three']) - assert.deepEqual(app.get('deep'), { base: false }) - assert.deepEqual(app.get('nullish'), null) - }) - - it('works when called directly', () => { - const fn = configuration() - const conf = fn() as any - - assert.strictEqual(conf.port, 3030) - }) - - it('errors on .setup when a schema is passed and the configuration is invalid', async () => { - const configurationSchema = schema( - { - $id: 'ConfigurationSchema', - additionalProperties: false, - type: 'object', - properties: { - port: { type: 'number' }, - deep: { - type: 'object', - properties: { - base: { - type: 'boolean' - } - } - }, - array: { - type: 'array', - items: { type: 'string' } - }, - nullish: { - type: 'string' - } - } - } as const, - new Ajv() - ) - - const schemaApp = feathers().configure(configuration(configurationSchema)) - - await assert.rejects(() => schemaApp.setup(), { - data: [ - { - instancePath: '/nullish', - keyword: 'type', - message: 'must be string', - params: { - type: 'string' - }, - schemaPath: '#/properties/nullish/type' - } - ] - }) - }) -}) diff --git a/packages/configuration/tsconfig.json b/packages/configuration/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/configuration/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/errors/package.json b/packages/errors/package.json index b156955284..2647a07eb8 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -32,8 +32,7 @@ }, "scripts": { "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", + "compile": "shx rm -rf lib/ && tsc", "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "publishConfig": { @@ -58,4 +57,4 @@ "typescript": "^5.5.4" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} +} \ No newline at end of file diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md deleted file mode 100644 index 7ba7ed5274..0000000000 --- a/packages/express/CHANGELOG.md +++ /dev/null @@ -1,738 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **express:** Re-export Router ([#3349](https://github.com/feathersjs/feathers/issues/3349)) ([0cbdb03](https://github.com/feathersjs/feathers/commit/0cbdb03a2d810f4855da9b21602c96e4fed7fce5)) - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/express - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **core:** `context.type` for around hooks ([#2890](https://github.com/feathersjs/feathers/issues/2890)) ([d606ac6](https://github.com/feathersjs/feathers/commit/d606ac660fd5335c95206784fea36530dd2e851a)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **docs:** Review transport API docs and update Express middleware setup ([#2811](https://github.com/feathersjs/feathers/issues/2811)) ([1b97f14](https://github.com/feathersjs/feathers/commit/1b97f14d474f5613482f259eeaa585c24fcfab43)) -- **transports:** Add remaining middleware for generated apps to Koa and Express ([#2796](https://github.com/feathersjs/feathers/issues/2796)) ([0d5781a](https://github.com/feathersjs/feathers/commit/0d5781a5c72a0cbb2ec8211bfa099f0aefe115a2)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Bug Fixes - -- **core:** Ensure setup and teardown can be overriden and maintain hook functionality ([#2779](https://github.com/feathersjs/feathers/issues/2779)) ([ab580cb](https://github.com/feathersjs/feathers/commit/ab580cbcaa68d19144d86798c13bf564f9d424a6)) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Features - -- Add CORS support to oAuth, Express, Koa and generated application ([#2744](https://github.com/feathersjs/feathers/issues/2744)) ([fd218f2](https://github.com/feathersjs/feathers/commit/fd218f289f8ca4c101e9938e8683e2efef6e8131)) -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Bug Fixes - -- **authentication:** Add safe dispatch data for authentication requests ([#2662](https://github.com/feathersjs/feathers/issues/2662)) ([d8104a1](https://github.com/feathersjs/feathers/commit/d8104a19ee9181e6a5ea81014af29ff9a3c28a8a)) - -### Features - -- **cli:** Add support for JavaScript to the new CLI ([#2668](https://github.com/feathersjs/feathers/issues/2668)) ([ebac587](https://github.com/feathersjs/feathers/commit/ebac587f7d00dc7607c3f546352d79f79b89a5d4)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -### Bug Fixes - -- **express:** Ensure Express options can be set before configuring REST transport ([#2655](https://github.com/feathersjs/feathers/issues/2655)) ([c9b8f74](https://github.com/feathersjs/feathers/commit/c9b8f74a0196acb99be44ac5e0fff3f1128288cd)) - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Bug Fixes - -- **express:** Fix typo in types reference in package.json ([#2613](https://github.com/feathersjs/feathers/issues/2613)) ([eacf1b3](https://github.com/feathersjs/feathers/commit/eacf1b3474e6d9da69b8671244c23a75cff87d95)) - -### Features - -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **core:** Add app.teardown functionality ([#2570](https://github.com/feathersjs/feathers/issues/2570)) ([fcdf524](https://github.com/feathersjs/feathers/commit/fcdf524ae1995bb59265d39f12e98b7794bed023)) -- **core:** Finalize app.teardown() functionality ([#2584](https://github.com/feathersjs/feathers/issues/2584)) ([1a166f3](https://github.com/feathersjs/feathers/commit/1a166f3ded811ecacf0ae8cb67880bc9fa2eeafa)) -- **transport-commons:** add `context.http.response` ([#2524](https://github.com/feathersjs/feathers/issues/2524)) ([5bc9d44](https://github.com/feathersjs/feathers/commit/5bc9d447043c2e2b742c73ed28ecf3b3264dd9e5)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -### Bug Fixes - -- **express:** Fix application typings to work with typed configuration ([#2539](https://github.com/feathersjs/feathers/issues/2539)) ([b9dfaee](https://github.com/feathersjs/feathers/commit/b9dfaee834b13864c1ed4f2f6a244eb5bb70395b)) - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- missing express types for Request, Response ([#2498](https://github.com/feathersjs/feathers/issues/2498)) ([ee67131](https://github.com/feathersjs/feathers/commit/ee67131bbaa24c54d3d781bdf8820015759ac488)) -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -### Features - -- **core:** add `context.http` and move `statusCode` there ([#2496](https://github.com/feathersjs/feathers/issues/2496)) ([b701bf7](https://github.com/feathersjs/feathers/commit/b701bf77fb83048aa1dffa492b3d77dd53f7b72b)) -- **core:** Improve legacy hooks integration ([08c8b40](https://github.com/feathersjs/feathers/commit/08c8b40999bf3889c61a4d4fad97a2c4f78bafc9)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Features - -- **koa:** KoaJS transport adapter ([#2315](https://github.com/feathersjs/feathers/issues/2315)) ([2554b57](https://github.com/feathersjs/feathers/commit/2554b57cf05731df58feeba9c12faab18e442107)) - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -**Note:** Version bump only for package @feathersjs/express - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- Resolve some type problems ([#2260](https://github.com/feathersjs/feathers/issues/2260)) ([a3d75fa](https://github.com/feathersjs/feathers/commit/a3d75fa29490e8a19412a12bc993ee7bb573068f)) -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) - -### Features - -- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) -- Application service types default to any ([#1566](https://github.com/feathersjs/feathers/issues/1566)) ([d93ba9a](https://github.com/feathersjs/feathers/commit/d93ba9a17edd20d3397bb00f4f6e82e804e42ed6)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) -- **core:** Remove Uberproto ([#2178](https://github.com/feathersjs/feathers/issues/2178)) ([ddf8821](https://github.com/feathersjs/feathers/commit/ddf8821f53317e6a378657f7d66acb03a037ee47)) - -### BREAKING CHANGES - -- **core:** Services no longer extend Uberproto objects and - `service.mixin()` is no longer available. - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### Features - -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### Features - -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -### Bug Fixes - -- **authentication:** consistent response return between local and jwt strategy ([#2042](https://github.com/feathersjs/feathers/issues/2042)) ([8d25be1](https://github.com/feathersjs/feathers/commit/8d25be101a2593a9e789375c928a07780b9e28cf)) - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -### Bug Fixes - -- Updated typings for express middleware ([#1839](https://github.com/feathersjs/feathers/issues/1839)) ([6b8e897](https://github.com/feathersjs/feathers/commit/6b8e8971a9dbb08913edd1be48826624645d9dc1)) - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/express - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/express - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/express - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/express - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Features - -- **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/express - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/express - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -### Bug Fixes - -- Small type improvements ([#1624](https://github.com/feathersjs/feathers/issues/1624)) ([50162c6](https://github.com/feathersjs/feathers/commit/50162c6e562f0a47c6a280c4f01fff7c3afee293)) - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -### Bug Fixes - -- Typings for express request and response properties ([#1609](https://github.com/feathersjs/feathers/issues/1609)) ([38cf8c9](https://github.com/feathersjs/feathers/commit/38cf8c950c1a4fb4a6d78d68d70e7fdd63b71c3c)) - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/express - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -**Note:** Version bump only for package @feathersjs/express - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -**Note:** Version bump only for package @feathersjs/express - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -### Bug Fixes - -- Add info to express error handler logger type ([#1557](https://github.com/feathersjs/feathers/issues/1557)) ([3e1d26c](https://github.com/feathersjs/feathers/commit/3e1d26c)) - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/express - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/express - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/express - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/express - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -### Bug Fixes - -- Remove unnecessary top level export files in @feathersjs/express ([#1442](https://github.com/feathersjs/feathers/issues/1442)) ([73c3fb2](https://github.com/feathersjs/feathers/commit/73c3fb2)) - -### Features - -- @feathersjs/express allow to pass an existing Express application instance ([#1446](https://github.com/feathersjs/feathers/issues/1446)) ([853a6b0](https://github.com/feathersjs/feathers/commit/853a6b0)) - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -### Bug Fixes - -- @feathersjs/express: allow middleware arrays ([#1421](https://github.com/feathersjs/feathers/issues/1421)) ([b605ab8](https://github.com/feathersjs/feathers/commit/b605ab8)) -- @feathersjs/express: replace `reduce` with `map` ([#1429](https://github.com/feathersjs/feathers/issues/1429)) ([44542e9](https://github.com/feathersjs/feathers/commit/44542e9)) -- Clean up hooks code ([#1407](https://github.com/feathersjs/feathers/issues/1407)) ([f25c88b](https://github.com/feathersjs/feathers/commit/f25c88b)) - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -### Bug Fixes - -- Use `export =` in TypeScript definitions ([#1285](https://github.com/feathersjs/feathers/issues/1285)) ([12d0f4b](https://github.com/feathersjs/feathers/commit/12d0f4b)) - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -### Bug Fixes - -- Always require strategy parameter in authentication ([#1327](https://github.com/feathersjs/feathers/issues/1327)) ([d4a8021](https://github.com/feathersjs/feathers/commit/d4a8021)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) - -### Features - -- Add params.headers to all transports when available ([#1303](https://github.com/feathersjs/feathers/issues/1303)) ([ebce79b](https://github.com/feathersjs/feathers/commit/ebce79b)) -- express use service.methods ([#945](https://github.com/feathersjs/feathers/issues/945)) ([3f0b1c3](https://github.com/feathersjs/feathers/commit/3f0b1c3)) - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **chore:** Properly configure and run code linter ([#1092](https://github.com/feathersjs/feathers/issues/1092)) ([fd3fc34](https://github.com/feathersjs/feathers/commit/fd3fc34)) -- **package:** update @feathersjs/commons to version 2.0.0 ([#31](https://github.com/feathersjs/feathers/issues/31)) ([c1ef5b1](https://github.com/feathersjs/feathers/commit/c1ef5b1)) -- **package:** update debug to version 3.0.0 ([#2](https://github.com/feathersjs/feathers/issues/2)) ([7e19603](https://github.com/feathersjs/feathers/commit/7e19603)) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) -- Add AuthenticationBaseStrategy and make authentication option handling more explicit ([#1284](https://github.com/feathersjs/feathers/issues/1284)) ([2667d92](https://github.com/feathersjs/feathers/commit/2667d92)) -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) -- Authentication v3 client ([#1240](https://github.com/feathersjs/feathers/issues/1240)) ([65b43bd](https://github.com/feathersjs/feathers/commit/65b43bd)) -- Authentication v3 Express integration ([#1218](https://github.com/feathersjs/feathers/issues/1218)) ([82bcfbe](https://github.com/feathersjs/feathers/commit/82bcfbe)) - -### BREAKING CHANGES - -- Rewrite for authentication v3 - -## [1.3.1](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.3.0...@feathersjs/express@1.3.1) (2019-01-02) - -### Bug Fixes - -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) - - - -# [1.3.0](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.2.7...@feathersjs/express@1.3.0) (2018-12-16) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- **chore:** Properly configure and run code linter ([#1092](https://github.com/feathersjs/feathers/issues/1092)) ([fd3fc34](https://github.com/feathersjs/feathers/commit/fd3fc34)) - -### Features - -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) - - - -## [1.2.7](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.2.6...@feathersjs/express@1.2.7) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/express - - - -## [1.2.6](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.2.5...@feathersjs/express@1.2.6) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/express - - - -## [1.2.5](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.2.4...@feathersjs/express@1.2.5) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/express - - - -## 1.2.4 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.2.3](https://github.com/feathersjs/express/tree/v1.2.3) (2018-06-03) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.2.2...v1.2.3) - -**Closed issues:** - -- Question: How to handle JSON:API [\#26](https://github.com/feathersjs/express/issues/26) -- \[Proposal\] Allow multiple express middleware functions to be passed into `app.use` [\#24](https://github.com/feathersjs/express/issues/24) - -**Merged pull requests:** - -- Update uberproto to the latest version [\#28](https://github.com/feathersjs/express/pull/28) ([bertho-zero](https://github.com/bertho-zero)) - -## [v1.2.2](https://github.com/feathersjs/express/tree/v1.2.2) (2018-04-16) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.2.1...v1.2.2) - -**Merged pull requests:** - -- Allow multiple express middleware functions to be passed into `app.use` [\#25](https://github.com/feathersjs/express/pull/25) ([eXigentCoder](https://github.com/eXigentCoder)) - -## [v1.2.1](https://github.com/feathersjs/express/tree/v1.2.1) (2018-03-29) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.2.0...v1.2.1) - -**Closed issues:** - -- Error in error hook results in unhandled rejection [\#21](https://github.com/feathersjs/express/issues/21) -- Error handler in wrapper hides breaks and hides real error [\#13](https://github.com/feathersjs/express/issues/13) - -**Merged pull requests:** - -- Allow to set HTTP status code in a hook [\#23](https://github.com/feathersjs/express/pull/23) ([daffl](https://github.com/daffl)) -- Update axios to the latest version 🚀 [\#22](https://github.com/feathersjs/express/pull/22) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.2.0](https://github.com/feathersjs/express/tree/v1.2.0) (2018-02-09) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.1.2...v1.2.0) - -**Closed issues:** - -- Error in `create` method results in unhandled rejection [\#19](https://github.com/feathersjs/express/issues/19) -- @feathersjs/express call without paramaters could returns an instance of express [\#18](https://github.com/feathersjs/express/issues/18) -- Feathers-express blows up the feathers application version property and the example doesn't work [\#16](https://github.com/feathersjs/express/issues/16) - -**Merged pull requests:** - -- Return an instance of the original Express application when nothing i… [\#20](https://github.com/feathersjs/express/pull/20) ([daffl](https://github.com/daffl)) -- Fix README example [\#17](https://github.com/feathersjs/express/pull/17) ([bertho-zero](https://github.com/bertho-zero)) -- Update mocha to the latest version 🚀 [\#15](https://github.com/feathersjs/express/pull/15) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#14](https://github.com/feathersjs/express/pull/14) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.1.2](https://github.com/feathersjs/express/tree/v1.1.2) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.1.1...v1.1.2) - -**Merged pull requests:** - -- Export default and original Express object [\#12](https://github.com/feathersjs/express/pull/12) ([daffl](https://github.com/daffl)) - -## [v1.1.1](https://github.com/feathersjs/express/tree/v1.1.1) (2017-11-06) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.1.0...v1.1.1) - -**Merged pull requests:** - -- Also add notFound to export [\#11](https://github.com/feathersjs/express/pull/11) ([daffl](https://github.com/daffl)) - -## [v1.1.0](https://github.com/feathersjs/express/tree/v1.1.0) (2017-11-05) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0...v1.1.0) - -**Merged pull requests:** - -- Re-export Express error handler [\#10](https://github.com/feathersjs/express/pull/10) ([daffl](https://github.com/daffl)) - -## [v1.0.0](https://github.com/feathersjs/express/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0-pre.4...v1.0.0) - -## [v1.0.0-pre.4](https://github.com/feathersjs/express/tree/v1.0.0-pre.4) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0-pre.3...v1.0.0-pre.4) - -**Merged pull requests:** - -- Update to better returnHook handling [\#9](https://github.com/feathersjs/express/pull/9) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.3](https://github.com/feathersjs/express/tree/v1.0.0-pre.3) (2017-10-21) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0-pre.2...v1.0.0-pre.3) - -**Merged pull requests:** - -- Add REST provider to Express framework bindings [\#8](https://github.com/feathersjs/express/pull/8) ([daffl](https://github.com/daffl)) -- Update repository name and move to npm scope [\#7](https://github.com/feathersjs/express/pull/7) ([daffl](https://github.com/daffl)) -- Update axios to the latest version 🚀 [\#6](https://github.com/feathersjs/express/pull/6) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0-pre.2](https://github.com/feathersjs/express/tree/v1.0.0-pre.2) (2017-10-18) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0-pre.1...v1.0.0-pre.2) - -**Merged pull requests:** - -- Also export Express top level functionality [\#5](https://github.com/feathersjs/express/pull/5) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#4](https://github.com/feathersjs/express/pull/4) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update debug to the latest version 🚀 [\#2](https://github.com/feathersjs/express/pull/2) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/express/tree/v1.0.0-pre.1) (2017-07-19) - -**Merged pull requests:** - -- Update dependencies to enable Greenkeeper 🌴 [\#1](https://github.com/feathersjs/express/pull/1) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/express/LICENSE b/packages/express/LICENSE deleted file mode 100644 index 7839c824d7..0000000000 --- a/packages/express/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/express/README.md b/packages/express/README.md deleted file mode 100644 index 9c6a221843..0000000000 --- a/packages/express/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/express - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/express.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/express) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers Express framework bindings and REST provider - -## Installation - -``` -npm install @feathersjs/client --save -``` - -## Documentation - -Refer to the [Feathers Express API documentation](https://feathersjs.com/api/express.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/express/package.json b/packages/express/package.json deleted file mode 100644 index 6dce7ebda9..0000000000 --- a/packages/express/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "@feathersjs/express", - "description": "Feathers Express framework bindings and REST provider", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/express" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "public/**" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@types/compression": "^1.7.5", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.19.5", - "compression": "^1.7.4", - "cors": "^2.8.5", - "express": "^4.19.2" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/tests": "^5.0.30", - "@types/lodash": "^4.17.7", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "axios": "^1.7.7", - "lodash": "^4.17.21", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/express/public/401.html b/packages/express/public/401.html deleted file mode 100644 index aee84d738a..0000000000 --- a/packages/express/public/401.html +++ /dev/null @@ -1,67 +0,0 @@ - - - Not Authorized - - - -
-

401

-

Not Authorized

- -
-

Powered by

-
-
- - diff --git a/packages/express/public/404.html b/packages/express/public/404.html deleted file mode 100644 index c781afec05..0000000000 --- a/packages/express/public/404.html +++ /dev/null @@ -1,66 +0,0 @@ - - - Page Not Found - - - -
-

404

-

Page Not Found

-
-

Powered by

-
-
- - diff --git a/packages/express/public/default.html b/packages/express/public/default.html deleted file mode 100644 index 175122a006..0000000000 --- a/packages/express/public/default.html +++ /dev/null @@ -1,66 +0,0 @@ - - - Internal Server Error - - - -
-

Oh no!

-

Something went wrong

-
-

Powered by

-
-
- - diff --git a/packages/express/src/authentication.ts b/packages/express/src/authentication.ts deleted file mode 100644 index 519e7e32e2..0000000000 --- a/packages/express/src/authentication.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { RequestHandler, Request, Response } from 'express' -import { HookContext } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { authenticate as AuthenticateHook } from '@feathersjs/authentication' - -import { Application } from './declarations' - -const debug = createDebug('@feathersjs/express/authentication') - -const toHandler = ( - func: (req: Request, res: Response, next: () => void) => Promise -): RequestHandler => { - return (req, res, next) => func(req, res, next).catch((error) => next(error)) -} - -export type AuthenticationSettings = { - service?: string - strategies?: string[] -} - -export function parseAuthentication(settings: AuthenticationSettings = {}): RequestHandler { - return toHandler(async (req, res, next) => { - const app = req.app as any as Application - const service = app.defaultAuthentication?.(settings.service) - - if (!service) { - return next() - } - - const config = service.configuration - const authStrategies = settings.strategies || config.parseStrategies || config.authStrategies || [] - - if (authStrategies.length === 0) { - debug('No `authStrategies` or `parseStrategies` found in authentication configuration') - return next() - } - - const authentication = await service.parse(req, res, ...authStrategies) - - if (authentication) { - debug('Parsed authentication from HTTP header', authentication) - req.feathers = { ...req.feathers, authentication } - } - - return next() - }) -} - -export function authenticate( - settings: string | AuthenticationSettings, - ...strategies: string[] -): RequestHandler { - const hook = AuthenticateHook(settings, ...strategies) - - return toHandler(async (req, _res, next) => { - const app = req.app as any as Application - const params = req.feathers - const context = { app, params } as any as HookContext - - await hook(context) - - req.feathers = context.params - - return next() - }) -} diff --git a/packages/express/src/declarations.ts b/packages/express/src/declarations.ts deleted file mode 100644 index d4f7a34afd..0000000000 --- a/packages/express/src/declarations.ts +++ /dev/null @@ -1,68 +0,0 @@ -import http from 'http' -import express, { Express } from 'express' -import { - Application as FeathersApplication, - Params as FeathersParams, - HookContext, - ServiceMethods, - ServiceInterface, - RouteLookup -} from '@feathersjs/feathers' - -interface ExpressUseHandler { - ( - path: L, - ...middlewareOrService: ( - | Express - | express.RequestHandler - | express.RequestHandler[] - | (keyof any extends keyof Services ? ServiceInterface : Services[L]) - )[] - ): T - (path: string | RegExp, ...expressHandlers: express.RequestHandler[]): T - (...expressHandlers: express.RequestHandler[]): T - (handler: Express | express.ErrorRequestHandler): T -} - -export interface ExpressOverrides { - listen(port: number, hostname: string, backlog: number, callback?: () => void): Promise - listen(port: number, hostname: string, callback?: () => void): Promise - listen(port: number | string | any, callback?: () => void): Promise - listen(callback?: () => void): Promise - use: ExpressUseHandler - server?: http.Server -} - -export type Application = Omit & - FeathersApplication & - ExpressOverrides - -declare module '@feathersjs/feathers/lib/declarations' { - interface ServiceOptions { - express?: { - before?: express.RequestHandler[] - after?: express.RequestHandler[] - composed?: express.RequestHandler - } - } -} - -declare module 'express-serve-static-core' { - interface Request { - feathers: Partial & { [key: string]: any } - lookup?: RouteLookup - } - - interface Response { - data?: any - hook?: HookContext - } - - interface IRouterMatcher { - // eslint-disable-next-line -

( - path: PathParams, - ...handlers: (RequestHandler | Partial | Application)[] - ): T - } -} diff --git a/packages/express/src/handlers.ts b/packages/express/src/handlers.ts deleted file mode 100644 index 73c162759c..0000000000 --- a/packages/express/src/handlers.ts +++ /dev/null @@ -1,132 +0,0 @@ -import path from 'path' -import { NotFound, GeneralError } from '@feathersjs/errors' -import { Request, Response, NextFunction, ErrorRequestHandler, RequestHandler } from 'express' - -const defaults = { - public: path.resolve(__dirname, '..', 'public'), - logger: console -} -const defaultHtmlError = path.resolve(defaults.public, 'default.html') - -export function notFound({ verbose = false } = {}): RequestHandler { - return function (req: Request, _res: Response, next: NextFunction) { - const url = `${req.url}` - const message = `Page not found${verbose ? ': ' + url : ''}` - - next(new NotFound(message, { url })) - } -} - -export type ErrorHandlerOptions = { - public?: string - logger?: boolean | { error?: (msg: any) => void; info?: (msg: any) => void } - html?: any - json?: any -} - -export function errorHandler(_options: ErrorHandlerOptions = {}): ErrorRequestHandler { - const options = Object.assign({}, defaults, _options) - - if (typeof options.html === 'undefined') { - options.html = { - 401: path.resolve(options.public, '401.html'), - 404: path.resolve(options.public, '404.html'), - default: defaultHtmlError - } - } - - if (typeof options.json === 'undefined') { - options.json = {} - } - - return function (error: any, req: Request, res: Response, next: NextFunction) { - // Set the error code for HTTP processing semantics - error.code = !isNaN(parseInt(error.code, 10)) ? parseInt(error.code, 10) : 500 - - // Log the error if it didn't come from a service method call - if (options.logger && typeof options.logger.error === 'function' && !res.hook) { - if (error.code >= 500) { - options.logger.error(error) - } else { - options.logger.info(error) - } - } - - if (error.type !== 'FeathersError') { - const oldError = error - - error = oldError.errors - ? new GeneralError(oldError.message, { - errors: oldError.errors - }) - : new GeneralError(oldError.message) - - if (oldError.stack) { - error.stack = oldError.stack - } - } - - const formatter: { [key: string]: any } = {} - - // If the developer passed a custom function for ALL html errors - if (typeof options.html === 'function') { - formatter['text/html'] = options.html - } else { - let file = options.html[error.code] - if (!file) { - file = options.html.default || defaultHtmlError - } - // If the developer passed a custom function for individual html errors - if (typeof file === 'function') { - formatter['text/html'] = file - } else { - formatter['text/html'] = function () { - res.set('Content-Type', 'text/html') - res.sendFile(file) - } - } - } - - // If the developer passed a custom function for ALL json errors - if (typeof options.json === 'function') { - formatter['application/json'] = options.json - } else { - const handler = options.json[error.code] || options.json.default - // If the developer passed a custom function for individual json errors - if (typeof handler === 'function') { - formatter['application/json'] = handler - } else { - // Don't show stack trace if it is a 404 error - if (error.code === 404) { - error.stack = null - } - - formatter['application/json'] = function () { - const output = Object.assign({}, error.toJSON()) - - if (process.env.NODE_ENV === 'production') { - delete output.stack - } - - res.set('Content-Type', 'application/json') - res.json(output) - } - } - } - - res.status(error.code) - - const contentType = req.headers['content-type'] || '' - const accepts = req.headers.accept || '' - - // by default just send back json - if (contentType.indexOf('json') !== -1 || accepts.indexOf('json') !== -1) { - formatter['application/json'](error, req, res, next) - } else if (options.html && (contentType.indexOf('html') !== -1 || accepts.indexOf('html') !== -1)) { - formatter['text/html'](error, req, res, next) - } else { - // TODO (EK): Maybe just return plain text - formatter['application/json'](error, req, res, next) - } - } -} diff --git a/packages/express/src/index.ts b/packages/express/src/index.ts deleted file mode 100644 index 675ae253d3..0000000000 --- a/packages/express/src/index.ts +++ /dev/null @@ -1,166 +0,0 @@ -import express, { Express } from 'express' -import { Application as FeathersApplication, defaultServiceMethods } from '@feathersjs/feathers' -import { routing } from '@feathersjs/transport-commons' -import { createDebug } from '@feathersjs/commons' -import cors from 'cors' -import compression from 'compression' - -import { rest, RestOptions, formatter } from './rest' -import { errorHandler, notFound, ErrorHandlerOptions } from './handlers' -import { Application, ExpressOverrides } from './declarations' -import { AuthenticationSettings, authenticate, parseAuthentication } from './authentication' -import { - default as original, - static as serveStatic, - json, - raw, - text, - urlencoded, - query, - Router -} from 'express' - -export { - original, - serveStatic, - serveStatic as static, - json, - raw, - text, - urlencoded, - query, - rest, - Router, - RestOptions, - formatter, - errorHandler, - notFound, - Application, - ErrorHandlerOptions, - ExpressOverrides, - AuthenticationSettings, - parseAuthentication, - authenticate, - cors, - compression -} - -const debug = createDebug('@feathersjs/express') - -export default function feathersExpress( - feathersApp?: FeathersApplication, - expressApp: Express = express() -): Application { - if (!feathersApp) { - return expressApp as any - } - - if (typeof feathersApp.setup !== 'function') { - throw new Error('@feathersjs/express requires a valid Feathers application instance') - } - - const app = expressApp as any as Application - const { use: expressUse, listen: expressListen } = expressApp as any - const { use: feathersUse, teardown: feathersTeardown } = feathersApp - - Object.assign(app, { - use(location: string & keyof S, ...rest: any[]) { - let service: any - let options = {} - - const middleware = rest.reduce( - function (middleware, arg) { - if (typeof arg === 'function' || Array.isArray(arg)) { - middleware[service ? 'after' : 'before'].push(arg) - } else if (!service) { - service = arg - } else if (arg.methods || arg.events || arg.express || arg.koa) { - options = arg - } else { - throw new Error('Invalid options passed to app.use') - } - return middleware - }, - { - before: [], - after: [] - } - ) - - const hasMethod = (methods: string[]) => - methods.some((name) => service && typeof service[name] === 'function') - - // Check for service (any object with at least one service method) - if (hasMethod(['handle', 'set']) || !hasMethod(defaultServiceMethods)) { - debug('Passing app.use call to Express app') - return expressUse.call(this, location, ...rest) - } - - debug('Registering service with middleware', middleware) - // Since this is a service, call Feathers `.use` - feathersUse.call(this, location, service, { - express: middleware, - ...options - }) - - return this - }, - - async listen(...args: any[]) { - const server = expressListen.call(this, ...args) - - this.server = server - await this.setup(server) - debug('Feathers application listening') - - return server - } - } as Application) - - const appDescriptors = { - ...Object.getOwnPropertyDescriptors(Object.getPrototypeOf(app)), - ...Object.getOwnPropertyDescriptors(app) - } - const newDescriptors = { - ...Object.getOwnPropertyDescriptors(Object.getPrototypeOf(feathersApp)), - ...Object.getOwnPropertyDescriptors(feathersApp) - } - - // Copy all non-existing properties (including non-enumerables) - // that don't already exist on the Express app - Object.keys(newDescriptors).forEach((prop) => { - const appProp = appDescriptors[prop] - const newProp = newDescriptors[prop] - - if (appProp === undefined && newProp !== undefined) { - Object.defineProperty(expressApp, prop, newProp) - } - }) - - // Assign teardown and setup which will also make sure that hooks are initialized - app.setup = feathersApp.setup as any - app.teardown = async function teardown(server?: any) { - return feathersTeardown.call(this, server).then( - () => - new Promise((resolve, reject) => { - if (this.server) { - this.server.close((e) => (e ? reject(e) : resolve(this))) - } else { - resolve(this) - } - }) - ) - } - - app.configure(routing() as any) - app.use((req, _res, next) => { - req.feathers = { ...req.feathers, provider: 'rest' } - return next() - }) - - return app -} - -if (typeof module !== 'undefined') { - module.exports = Object.assign(feathersExpress, module.exports) -} diff --git a/packages/express/src/rest.ts b/packages/express/src/rest.ts deleted file mode 100644 index 6b4cc1c9d9..0000000000 --- a/packages/express/src/rest.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Request, Response, RequestHandler, Router } from 'express' -import { MethodNotAllowed } from '@feathersjs/errors' -import { createDebug } from '@feathersjs/commons' -import { http } from '@feathersjs/transport-commons' -import { createContext, defaultServiceMethods, getServiceOptions } from '@feathersjs/feathers' - -import { AuthenticationSettings, parseAuthentication } from './authentication' -import { Application } from './declarations' - -const debug = createDebug('@feathersjs/express/rest') - -const toHandler = ( - func: (req: Request, res: Response, next: () => void) => Promise -): RequestHandler => { - return (req, res, next) => func(req, res, next).catch((error) => next(error)) -} - -const serviceMiddleware = (): RequestHandler => { - return toHandler(async (req, res, next) => { - const { query, headers, path, body: data, method: httpMethod } = req - const methodOverride = req.headers[http.METHOD_HEADER] as string | undefined - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const { service, params: { __id: id = null, ...route } = {} } = req.lookup! - const method = http.getServiceMethod(httpMethod, id, methodOverride) - const { methods } = getServiceOptions(service) - - debug(`Found service for path ${path}, attempting to run '${method}' service method`) - - if (!methods.includes(method) || defaultServiceMethods.includes(methodOverride)) { - const error = new MethodNotAllowed(`Method \`${method}\` is not supported by this endpoint.`) - res.statusCode = error.code - throw error - } - - const createArguments = http.argumentsFor[method as 'get'] || http.argumentsFor.default - const params = { query, headers, route, ...req.feathers } - const args = createArguments({ id, data, params }) - const contextBase = createContext(service, method, { http: {} }) - res.hook = contextBase - - const context = await (service as any)[method](...args, contextBase) - res.hook = context - - const response = http.getResponse(context) - res.statusCode = response.status - res.set(response.headers) - res.data = response.body - - return next() - }) -} - -const servicesMiddleware = (): RequestHandler => { - return toHandler(async (req, res, next) => { - const app = req.app as any as Application - const lookup = app.lookup(req.path) - - if (!lookup) { - return next() - } - - req.lookup = lookup - - const options = getServiceOptions(lookup.service) - const middleware = options.express.composed - - return middleware(req, res, next) - }) -} - -export const formatter: RequestHandler = (_req, res, next) => { - if (res.data === undefined) { - return next() - } - - res.format({ - 'application/json'() { - res.json(res.data) - } - }) -} - -export type RestOptions = { - formatter?: RequestHandler - authentication?: AuthenticationSettings -} - -export const rest = (options?: RestOptions | RequestHandler) => { - options = typeof options === 'function' ? { formatter: options } : options || {} - - const formatterMiddleware = options.formatter || formatter - const authenticationOptions = options.authentication - - return (app: Application) => { - if (typeof app.route !== 'function') { - throw new Error('@feathersjs/express/rest needs an Express compatible app.') - } - - app.use(parseAuthentication(authenticationOptions)) - app.use(servicesMiddleware()) - - app.mixins.push((_service, _path, options) => { - const { express: { before = [], after = [] } = {} } = options - - const middlewares = [].concat(before, serviceMiddleware(), after, formatterMiddleware) - const middleware = Router().use(middlewares) - - options.express ||= {} - options.express.composed = middleware - }) - } -} diff --git a/packages/express/test/authentication.test.ts b/packages/express/test/authentication.test.ts deleted file mode 100644 index a821c1517a..0000000000 --- a/packages/express/test/authentication.test.ts +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import omit from 'lodash/omit' -import { strict as assert } from 'assert' -import { default as _axios } from 'axios' -import { feathers } from '@feathersjs/feathers' -import { createApplication } from '@feathersjs/authentication-local/test/fixture' -import { authenticate, AuthenticationResult } from '@feathersjs/authentication' -import * as express from '../src' - -const expressify = express.default -const axios = _axios.create({ - baseURL: 'http://localhost:9876/' -}) - -describe('@feathersjs/express/authentication', () => { - const email = 'expresstest@authentication.com' - const password = 'superexpress' - - let app: express.Application - let user: any - let authResult: AuthenticationResult - - before(async () => { - const expressApp = expressify(feathers()).use(express.json()).configure(express.rest()) - - app = createApplication(expressApp as any) as unknown as express.Application - - await app.listen(9876) - - app.use('/dummy', { - get(id, params) { - return Promise.resolve({ id, params }) - } - }) - - // @ts-ignore - app.use('/protected', express.authenticate('jwt'), (req, res) => { - res.json(req.feathers.user) - }) - - app.use( - express.errorHandler({ - logger: false - }) - ) - - app.service('dummy').hooks({ - before: [authenticate('jwt')] - }) - - const result = await app.service('users').create({ email, password }) - - user = result - - const res = await axios.post('/authentication', { - strategy: 'local', - password, - email - }) - - authResult = res.data - }) - - after(() => app.teardown()) - - describe('service authentication', () => { - it('successful local authentication', () => { - assert.ok(authResult.accessToken) - assert.deepStrictEqual(omit(authResult.authentication, 'payload'), { - strategy: 'local' - }) - assert.strictEqual(authResult.user.email, email) - assert.strictEqual(authResult.user.password, undefined) - }) - - it('local authentication with wrong password fails', async () => { - try { - await axios.post('/authentication', { - strategy: 'local', - password: 'wrong', - email - }) - assert.fail('Should never get here') - } catch (error: any) { - const { data } = error.response - assert.strictEqual(data.name, 'NotAuthenticated') - assert.strictEqual(data.message, 'Invalid login') - } - }) - - it('authenticating with JWT works but returns same accessToken', async () => { - const { accessToken } = authResult - const { data } = await axios.post('/authentication', { - strategy: 'jwt', - accessToken - }) - - assert.strictEqual(data.accessToken, accessToken) - assert.strictEqual(data.authentication.strategy, 'jwt') - assert.strictEqual(data.authentication.payload.sub, user.id.toString()) - assert.strictEqual(data.user.email, email) - }) - - it('can make a protected request with Authorization header', async () => { - const { accessToken } = authResult - - const { - data, - data: { params } - } = await axios.get('/dummy/dave', { - headers: { - Authorization: accessToken - } - }) - - assert.strictEqual(data.id, 'dave') - assert.deepStrictEqual(params.user, user) - assert.strictEqual(params.authentication.accessToken, accessToken) - }) - - it('errors when there are no authStrategies and parseStrategies', async () => { - const { accessToken } = authResult - app.get('authentication').authStrategies = [] - delete app.get('authentication').parseStrategies - - try { - await axios.get('/dummy/dave', { - headers: { - Authorization: accessToken - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.response.data.name, 'NotAuthenticated') - app.get('authentication').authStrategies = ['jwt', 'local'] - } - }) - - it('can make a protected request with Authorization header and bearer scheme', async () => { - const { accessToken } = authResult - - const { - data, - data: { params } - } = await axios.get('/dummy/dave', { - headers: { - Authorization: ` Bearer: ${accessToken}` - } - }) - - assert.strictEqual(data.id, 'dave') - assert.deepStrictEqual(params.user, user) - assert.strictEqual(params.authentication.accessToken, accessToken) - }) - }) - - describe('authenticate middleware', () => { - it('errors without valid strategies', () => { - try { - // @ts-ignore - authenticate() - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'The authenticate hook needs at least one allowed strategy') - } - }) - - it('protected endpoint fails when JWT is not present', () => { - return axios - .get('/protected') - .then(() => { - assert.fail('Should never get here') - }) - .catch((error) => { - const { data } = error.response - - assert.strictEqual(data.name, 'NotAuthenticated') - assert.strictEqual(data.message, 'Not authenticated') - }) - }) - - it.skip('protected endpoint fails with invalid Authorization header', async () => { - try { - await axios.get('/protected', { - headers: { - Authorization: 'Bearer: something wrong' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - const { data } = error.response - - assert.strictEqual(data.name, 'NotAuthenticated') - assert.strictEqual(data.message, 'Not authenticated') - } - }) - - it('can request protected endpoint with JWT present', async () => { - const { data } = await axios.get('/protected', { - headers: { - Authorization: `Bearer ${authResult.accessToken}` - } - }) - - assert.strictEqual(data.email, user.email) - assert.strictEqual(data.id, user.id) - assert.strictEqual(data.password, user.password) - }) - }) -}) diff --git a/packages/express/test/error-handler.test.ts b/packages/express/test/error-handler.test.ts deleted file mode 100644 index e12b653d88..0000000000 --- a/packages/express/test/error-handler.test.ts +++ /dev/null @@ -1,399 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function */ -import { strict as assert } from 'assert' -import express, { Request, Response, NextFunction } from 'express' -import axios from 'axios' -import fs from 'fs' -import { join } from 'path' -import { BadRequest, NotAcceptable, NotAuthenticated, NotFound, PaymentError } from '@feathersjs/errors' - -import { errorHandler } from '../src' - -const content = 'Error' - -const htmlHandler = function (_error: Error, _req: Request, res: Response, _next: NextFunction) { - res.send(content) -} - -const jsonHandler = function (error: Error, _req: Request, res: Response, _next: NextFunction) { - res.json(error) -} - -describe('error-handler', () => { - describe('supports catch-all custom handlers', function () { - before(function () { - this.app = express() - .get('/error', function (_req: Request, _res: Response, next: NextFunction) { - next(new Error('Something went wrong')) - }) - .use( - errorHandler({ - html: htmlHandler, - json: jsonHandler - }) - ) - - this.server = this.app.listen(5050) - }) - - after(function (done) { - this.server.close(done) - }) - - describe('JSON handler', () => { - const options = { - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' - } - } - - it('can send a custom response', async () => { - try { - await axios(options) - assert.fail('Should never get here') - } catch (error: any) { - assert.deepEqual(error.response.data, { - name: 'GeneralError', - message: 'Something went wrong', - code: 500, - className: 'general-error' - }) - } - }) - }) - }) - - describe('supports error-code specific custom handlers', () => { - describe('HTML handler', () => { - const req = { - headers: { 'content-type': 'text/html' } - } - const makeRes = (errCode: number, props?: any) => { - return Object.assign( - { - set() {}, - status(code: number) { - assert.equal(code, errCode) - } - }, - props - ) - } - - it('if the value is a string, calls res.sendFile', (done) => { - const err = new NotAuthenticated() - const middleware = errorHandler({ - logger: null, - html: { 401: 'path/to/401.html' } - }) - const res = makeRes(401, { - sendFile(f: any) { - assert.equal(f, 'path/to/401.html') - done() - } - }) - ;(middleware as any)(err, req, res) - }) - - it('if the value is a function, calls as middleware ', (done) => { - const err = new PaymentError() - const res = makeRes(402) - const middleware = errorHandler({ - logger: null, - html: { - 402: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() - } - } - }) - ;(middleware as any)(err, req, res) - }) - - it('falls back to default if error code config is available', (done) => { - const err = new NotAcceptable() - const res = makeRes(406) - const middleware = errorHandler({ - logger: null, - html: { - default: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() - } - } - }) - ;(middleware as any)(err, req, res) - }) - }) - - describe('JSON handler', () => { - const req = { - headers: { 'content-type': 'application/json' } - } - const makeRes = (errCode: number, props?: any) => { - return Object.assign( - { - set() {}, - status(code: number) { - assert.equal(code, errCode) - } - }, - props - ) - } - - it('calls res.json by default', (done) => { - const err = new NotAuthenticated() - const middleware = errorHandler({ - logger: null, - json: {} - }) - const res = makeRes(401, { - json(obj: any) { - assert.deepEqual(obj, err.toJSON()) - done() - } - }) - ;(middleware as any)(err, req, res) - }) - - it('if the value is a function, calls as middleware ', (done) => { - const err = new PaymentError() - const res = makeRes(402) - const middleware = errorHandler({ - logger: null, - json: { - 402: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() - } - } - }) - ;(middleware as any)(err, req, res) - }) - - it('falls back to default if error code config is available', (done) => { - const err = new NotAcceptable() - const res = makeRes(406) - const middleware = errorHandler({ - logger: null, - json: { - default: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() - } - } - }) - ;(middleware as any)(err, req, res) - }) - }) - }) - - describe('use as app error handler', function () { - before(function () { - this.app = express() - .get('/error', function (_req: Request, _res: Response, next: NextFunction) { - next(new Error('Something went wrong')) - }) - .get('/string-error', function (_req: Request, _res: Response, next: NextFunction) { - const e: any = new Error('Something was not found') - e.code = '404' - - next(e) - }) - .get('/bad-request', function (_req: Request, _res: Response, next: NextFunction) { - next( - new BadRequest({ - message: 'Invalid Password', - errors: [ - { - path: 'password', - value: null, - message: "'password' cannot be 'null'" - } - ] - }) - ) - }) - .use(function (_req: Request, _res: Response, next: NextFunction) { - next(new NotFound('File not found')) - }) - .use( - errorHandler({ - logger: null - }) - ) - - this.server = this.app.listen(5050) - }) - - after(function (done) { - this.server.close(done) - }) - - describe('converts an non-feathers error', () => { - it('is an instance of GeneralError', async () => { - try { - await axios({ - url: 'http://localhost:5050/error', - responseType: 'json' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 500) - assert.deepEqual(error.response.data, { - name: 'GeneralError', - message: 'Something went wrong', - code: 500, - className: 'general-error' - }) - } - }) - }) - - describe('text/html format', () => { - it('serves a 404.html', (done) => { - fs.readFile(join(__dirname, '..', 'public', '404.html'), async function (_err, html) { - try { - await axios({ - url: 'http://localhost:5050/path/to/nowhere', - headers: { - 'Content-Type': 'text/html', - Accept: 'text/html' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 404) - assert.equal(error.response.data, html.toString()) - done() - } - }) - }) - - it('serves a 500.html', (done) => { - fs.readFile(join(__dirname, '..', 'public', 'default.html'), async function (_err, html) { - try { - await axios({ - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'text/html', - Accept: 'text/html' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 500) - assert.equal(error.response.data, html.toString()) - done() - } - }) - }) - }) - - describe('application/json format', () => { - it('500', async () => { - try { - await axios({ - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 500) - assert.deepEqual(error.response.data, { - name: 'GeneralError', - message: 'Something went wrong', - code: 500, - className: 'general-error' - }) - } - }) - - it('404', async () => { - try { - await axios({ - url: 'http://localhost:5050/path/to/nowhere', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 404) - assert.deepEqual(error.response.data, { - name: 'NotFound', - message: 'File not found', - code: 404, - className: 'not-found' - }) - } - }) - - it('400', async () => { - try { - await axios({ - url: 'http://localhost:5050/bad-request', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 400) - assert.deepEqual(error.response.data, { - name: 'BadRequest', - message: 'Invalid Password', - code: 400, - className: 'bad-request', - data: {}, - errors: [ - { - path: 'password', - value: null, - message: "'password' cannot be 'null'" - } - ] - }) - } - }) - }) - - it('returns JSON by default', async () => { - try { - await axios('http://localhost:5050/bad-request') - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 400) - assert.deepEqual(error.response.data, { - name: 'BadRequest', - message: 'Invalid Password', - code: 400, - className: 'bad-request', - data: {}, - errors: [ - { - path: 'password', - value: null, - message: "'password' cannot be 'null'" - } - ] - }) - } - }) - }) -}) diff --git a/packages/express/test/index.test.ts b/packages/express/test/index.test.ts deleted file mode 100644 index b22566f22d..0000000000 --- a/packages/express/test/index.test.ts +++ /dev/null @@ -1,291 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import { strict as assert } from 'assert' -import express, { Request, Response, NextFunction } from 'express' -import axios from 'axios' -import fs from 'fs' -import path from 'path' -import https from 'https' -import { feathers, HookContext, Id } from '@feathersjs/feathers' - -import { default as feathersExpress, rest, notFound, errorHandler, original, serveStatic } from '../src' -import { RequestListener } from 'http' - -describe('@feathersjs/express', () => { - const service = { - async get(id: Id) { - return { id } - } - } - - it('exports .default, .original .rest, .notFound and .errorHandler', () => { - assert.strictEqual(original, express) - assert.strictEqual(typeof rest, 'function') - assert.ok(notFound) - assert.ok(errorHandler) - }) - - it('returns an Express application, keeps Feathers service and configuration typings typings', () => { - type Config = { - hostname: string - port: number - } - - const app = feathersExpress, Config>(feathers()) - - app.set('hostname', 'test.com') - - const hostname = app.get('hostname') - - assert.strictEqual(hostname, 'test.com') - assert.strictEqual(typeof app, 'function') - }) - - it('allows to use an existing Express instance', () => { - const expressApp = express() - const app = feathersExpress(feathers(), expressApp) - - assert.strictEqual(app, expressApp) - }) - - it('exports `express.rest`', () => { - assert.ok(typeof rest === 'function') - }) - - it('returns a plain express app when no app is provided', () => { - const app = feathersExpress() - - assert.strictEqual(typeof app.use, 'function') - assert.strictEqual(typeof app.service, 'undefined') - assert.strictEqual(typeof app.services, 'undefined') - }) - - it('errors when app with wrong version is provided', () => { - try { - // @ts-ignore - feathersExpress({}) - } catch (e: any) { - assert.strictEqual(e.message, '@feathersjs/express requires a valid Feathers application instance') - } - - try { - const app = feathers() - app.version = '2.9.9' - - feathersExpress(app) - } catch (e: any) { - assert.strictEqual( - e.message, - '@feathersjs/express requires an instance of a Feathers application version 3.x or later (got 2.9.9)' - ) - } - - try { - const app = feathers() - delete app.version - - feathersExpress(app) - } catch (e: any) { - assert.strictEqual( - e.message, - '@feathersjs/express requires an instance of a Feathers application version 3.x or later (got unknown)' - ) - } - }) - - it('Can use Express sub-apps', () => { - const typedApp = feathers>() - const app = feathersExpress(typedApp) - const child = express() - - app.use('/path', child) - assert.strictEqual((child as any).parent, app) - }) - - it('Can use express.static', () => { - const app = feathersExpress(feathers()) - - app.use('/path', serveStatic(__dirname)) - }) - - it('has Feathers functionality', async () => { - const app = feathersExpress(feathers()) - - app.use('/myservice', service) - - app.hooks({ - after: { - get(hook: HookContext) { - hook.result.fromAppHook = true - } - } - }) - - app.service('myservice').hooks({ - after: { - get(hook: HookContext) { - hook.result.fromHook = true - } - } - }) - - const data = await app.service('myservice').get(10) - - assert.deepStrictEqual(data, { - id: 10, - fromHook: true, - fromAppHook: true - }) - }) - - it('can register a service and start an Express server', async () => { - const app = feathersExpress(feathers()) - const response = { - message: 'Hello world' - } - - app.use('/myservice', service) - app.use((_req: Request, res: Response) => res.json(response)) - - const server = await app.listen(8787) - const data = await app.service('myservice').get(10) - - assert.deepStrictEqual(data, { id: 10 }) - - const res = await axios.get('http://localhost:8787') - assert.deepStrictEqual(res.data, response) - - await new Promise((resolve) => server.close(() => resolve(server))) - }) - - it('.listen calls .setup', async () => { - const app = feathersExpress(feathers()) - let called = false - - app.use('/myservice', { - async get(id: Id) { - return { id } - }, - - async setup(appParam, path) { - assert.strictEqual(appParam, app) - assert.strictEqual(path, 'myservice') - called = true - } - }) - - const server = await app.listen(8787) - - assert.ok(called) - await new Promise((resolve) => server.close(() => resolve(server))) - }) - - it('.teardown closes http server', async () => { - const app = feathersExpress(feathers()) - let called = false - - const server = await app.listen(8787) - server.on('close', () => { - called = true - }) - - await app.teardown() - assert.ok(called) - }) - - it('passes middleware as options', () => { - const feathersApp = feathers() - const app = feathersExpress(feathersApp) - const oldUse = feathersApp.use - const a = (_req: Request, _res: Response, next: NextFunction) => next() - const b = (_req: Request, _res: Response, next: NextFunction) => next() - const c = (_req: Request, _res: Response, next: NextFunction) => next() - const service = { - async get(id: Id) { - return { id } - } - } - - feathersApp.use = function (path, serviceArg, options) { - assert.strictEqual(path, '/myservice') - assert.strictEqual(serviceArg, service) - assert.deepStrictEqual(options.express, { - before: [a, b], - after: [c] - }) - // eslint-disable-next-line prefer-rest-params - return (oldUse as any).apply(this, arguments) - } - - app.use('/myservice', a, b, service, c) - }) - - it('Express wrapped and context.app are the same', async () => { - const app = feathersExpress(feathers()) - - app.use('/test', { - async get(id: Id) { - return { id } - } - }) - - app.service('test').hooks({ - before: { - get: [ - (context) => { - assert.ok(context.app === app) - } - ] - } - }) - - assert.deepStrictEqual(await app.service('test').get('testing'), { - id: 'testing' - }) - }) - - it('Works with HTTPS', (done) => { - const todoService = { - async get(name: Id) { - return { - id: name, - description: `You have to do ${name}!` - } - } - } - - const app = feathersExpress(feathers()).configure(rest()) - - app.use('/secureTodos', todoService) - - const httpsServer = https - .createServer( - { - key: fs.readFileSync(path.join(__dirname, '..', '..', 'tests', 'resources', 'privatekey.pem')), - cert: fs.readFileSync(path.join(__dirname, '..', '..', 'tests', 'resources', 'certificate.pem')), - rejectUnauthorized: false, - requestCert: false - }, - app as unknown as RequestListener - ) - .listen(7889) - - app.setup(httpsServer) - - httpsServer.on('listening', function () { - const instance = axios.create({ - httpsAgent: new https.Agent({ - rejectUnauthorized: false - }) - }) - - instance - .get('https://localhost:7889/secureTodos/dishes') - .then((response) => { - assert.ok(response.status === 200, 'Got OK status code') - assert.strictEqual(response.data.description, 'You have to do dishes!') - httpsServer.close(() => done()) - }) - .catch(done) - }) - }) -}) diff --git a/packages/express/test/not-found-handler.test.ts b/packages/express/test/not-found-handler.test.ts deleted file mode 100644 index 89db3cf1bd..0000000000 --- a/packages/express/test/not-found-handler.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { strict as assert } from 'assert' -import { NotFound } from '@feathersjs/errors' - -import { notFound } from '../src' - -const handler = notFound as any - -describe('not-found-handler', () => { - it('returns NotFound error', (done) => { - handler()( - { - url: 'some/where', - headers: {} - }, - {}, - function (error: any) { - assert.ok(error instanceof NotFound) - assert.equal(error.message, 'Page not found') - assert.deepEqual(error.data, { - url: 'some/where' - }) - done() - } - ) - }) - - it('returns NotFound error with URL when verbose', (done) => { - handler({ verbose: true })( - { - url: 'some/where', - headers: {} - }, - {}, - function (error: any) { - assert.ok(error instanceof NotFound) - assert.equal(error.message, 'Page not found: some/where') - assert.deepEqual(error.data, { - url: 'some/where' - }) - done() - } - ) - }) -}) diff --git a/packages/express/test/rest.test.ts b/packages/express/test/rest.test.ts deleted file mode 100644 index ddc9ff8574..0000000000 --- a/packages/express/test/rest.test.ts +++ /dev/null @@ -1,715 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { strict as assert } from 'assert' -import axios, { AxiosRequestConfig } from 'axios' - -import { Server } from 'http' -import { Request, Response, NextFunction } from 'express' -import { ApplicationHookMap, feathers, HookContext, Id, Params } from '@feathersjs/feathers' -import { Service, restTests } from '@feathersjs/tests' -import { BadRequest } from '@feathersjs/errors' - -import * as express from '../src' - -const expressify = express.default -const { rest } = express -const errorHandler = express.errorHandler({ - logger: false -}) - -describe('@feathersjs/express/rest provider', () => { - describe('base functionality', () => { - it('throws an error if you did not expressify', () => { - const app = feathers() - - try { - app.configure(rest() as any) - assert.ok(false, 'Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, '@feathersjs/express/rest needs an Express compatible app.') - } - }) - - it('lets you set the handler manually', async () => { - const app = expressify(feathers()) - - app - .configure( - rest(function (_req, res) { - res.format({ - 'text/plain'() { - res.end(`The todo is: ${res.data.description}`) - } - }) - }) - ) - .use('/todo', { - async get(id: Id) { - return { - description: `You have to do ${id}` - } - } - }) - - const server = await app.listen(4776) - - const res = await axios.get('http://localhost:4776/todo/dishes') - - assert.strictEqual(res.data, 'The todo is: You have to do dishes') - server.close() - }) - - it('lets you set no handler', async () => { - const app = expressify(feathers()) - const data = { fromHandler: true } - - app - .configure(rest(null)) - .use('/todo', { - async get(id: Id) { - return { - description: `You have to do ${id}` - } - } - }) - .use((_req: Request, res: Response) => res.json(data)) - - const server = await app.listen(5775) - const res = await axios.get('http://localhost:5775/todo-handler/dishes') - - assert.deepStrictEqual(res.data, data) - - server.close() - }) - }) - - describe('CRUD', () => { - let app: express.Application - - before(async () => { - app = expressify(feathers()) - .use(express.cors()) - .use(express.json()) - .configure(rest(express.formatter)) - .use('codes', { - async get(id: Id) { - return { id } - }, - - async create(data: any) { - return data - } - }) - .use('/', new Service()) - .use('todo', new Service()) - - app.hooks({ - setup: [ - async (context, next) => { - assert.ok(context.app) - await next() - } - ], - teardown: [ - async (context, next) => { - assert.ok(context.app) - await next() - } - ] - } as ApplicationHookMap) - - await app.listen(4777, () => app.use('tasks', new Service())) - }) - - after(() => app.teardown()) - - restTests('Services', 'todo', 4777) - restTests('Root Service', '/', 4777) - restTests('Dynamic Services', 'tasks', 4777) - - describe('res.hook', () => { - const convertHook = (hook: HookContext) => { - const result: any = Object.assign({}, hook.toJSON()) - - delete result.self - delete result.service - delete result.app - delete result.error - - return result - } - - it('sets the actual hook object in res.hook', async () => { - const params = { - route: {}, - query: { test: 'param' }, - provider: 'rest' - } - - app.use( - '/hook', - { - async get(id) { - return { - description: `You have to do ${id}` - } - } - }, - function (_req: Request, res: Response, next: NextFunction) { - res.data = convertHook(res.hook) - - next() - } - ) - - app.service('hook').hooks({ - after(hook: HookContext) { - hook.addedProperty = true - } - }) - - const res = await axios.get('http://localhost:4777/hook/dishes?test=param') - const paramsWithHeaders = { - ...params, - headers: res.data.params.headers - } - - assert.deepStrictEqual(res.data, { - id: 'dishes', - params: paramsWithHeaders, - arguments: ['dishes', paramsWithHeaders], - type: 'around', - method: 'get', - path: 'hook', - http: {}, - event: null, - result: { description: 'You have to do dishes' }, - addedProperty: true - }) - }) - - it('can use hook.dispatch', async () => { - app.use('/hook-dispatch', { - async get() { - return {} - } - }) - - app.service('hook-dispatch').hooks({ - after(hook: HookContext) { - hook.dispatch = { - id: hook.id, - fromDispatch: true - } - } - }) - - const res = await axios.get('http://localhost:4777/hook-dispatch/dishes') - assert.deepStrictEqual(res.data, { - id: 'dishes', - fromDispatch: true - }) - }) - - it('allows to set statusCode in a hook', async () => { - app.use('/hook-status', { - async get() { - return {} - } - }) - - app.service('hook-status').hooks({ - after(hook: HookContext) { - hook.http.status = 206 - } - }) - - const res = await axios.get('http://localhost:4777/hook-status/dishes') - - assert.strictEqual(res.status, 206) - }) - - it('allows to set response headers in a hook', async () => { - app.use('/hook-headers', { - async get() { - return {} - } - }) - - app.service('hook-headers').hooks({ - after(hook: HookContext) { - hook.http.headers = { foo: 'first', bar: ['second', 'third'] } - } - }) - - const res = await axios.get('http://localhost:4777/hook-headers/dishes') - - assert.strictEqual(res.headers.foo, 'first') - assert.strictEqual(res.headers.bar, 'second, third') - }) - - it('sets the hook object in res.hook on error', async () => { - const params = { - route: {}, - query: {}, - provider: 'rest' - } - - app.use('/hook-error', { - async get() { - throw new Error('I blew up') - } - }) - app.use(function (error: Error, _req: Request, res: Response, _next: NextFunction) { - res.status(500) - res.json({ - hook: convertHook(res.hook), - error: { - message: error.message - } - }) - }) - - try { - await axios('http://localhost:4777/hook-error/dishes') - assert.fail('Should never get here') - } catch (error: any) { - const { data } = error.response - const paramsWithHeaders = { - ...params, - headers: data.hook.params.headers - } - assert.deepStrictEqual(error.response.data, { - hook: { - id: 'dishes', - params: paramsWithHeaders, - arguments: ['dishes', paramsWithHeaders], - type: 'around', - event: null, - method: 'get', - path: 'hook-error', - http: {} - }, - error: { message: 'I blew up' } - }) - } - }) - }) - }) - - describe('middleware', () => { - it('sets service parameters and provider type', async () => { - const service = { - async get(_id: Id, params: Params) { - return params - } - } - - const app = expressify(feathers()) - .use(function (req: Request, _res: Response, next: NextFunction) { - req.feathers.test = 'Happy' - next() - }) - .configure(rest(express.formatter)) - .use('service', service) - const server = await app.listen(4778) - - const res = await axios.get('http://localhost:4778/service/bla?some=param&another=thing') - const expected = { - headers: res.data.headers, - test: 'Happy', - provider: 'rest', - route: {}, - query: { - some: 'param', - another: 'thing' - } - } - - assert.ok(res.status === 200, 'Got OK status code') - assert.deepStrictEqual(res.data, expected, 'Got params object back') - server.close() - }) - - it('Lets you configure your own middleware before the handler (#40)', async () => { - const data = { - description: 'Do dishes!', - id: 'dishes' - } - const app = expressify(feathers()) - - app - .use(function defaultContentTypeMiddleware(req, _res, next) { - req.headers['content-type'] = req.headers['content-type'] || 'application/json' - next() - }) - .use(express.json()) - .configure(rest(express.formatter)) - .use('/todo', { - async create(data: any) { - return data - } - }) - - const server = await app.listen(4775) - const res = await axios({ - url: 'http://localhost:4775/todo', - method: 'post', - data, - headers: { - 'content-type': '' - } - }) - - assert.deepStrictEqual(res.data, data) - server.close() - }) - - it('allows middleware before and after a service', async () => { - const app = expressify(feathers()) - - app - .use(express.json()) - .configure(rest()) - .use( - '/todo', - function (req, _res, next) { - req.body.before = ['before first'] - next() - }, - function (req, _res, next) { - req.body.before.push('before second') - next() - }, - { - async create(data: any) { - return data - } - }, - function (_req, res, next) { - res.data.after = ['after first'] - next() - }, - function (_req, res, next) { - res.data.after.push('after second') - next() - } - ) - - const server = await app.listen(4776) - const res = await axios.post('http://localhost:4776/todo', { - text: 'Do dishes' - }) - - assert.deepStrictEqual(res.data, { - text: 'Do dishes', - before: ['before first', 'before second'], - after: ['after first', 'after second'] - }) - - server.close() - }) - - it('allows middleware arrays before and after a service', async () => { - const app = expressify(feathers()) - - app.use(express.json()) - app.configure(rest()) - app.use( - '/todo', - [ - function (req: Request, _res: Response, next: NextFunction) { - req.body.before = ['before first'] - next() - }, - function (req: Request, _res: Response, next: NextFunction) { - req.body.before.push('before second') - next() - } - ], - { - async create(data) { - return data - } - }, - [ - function (_req: Request, res: Response, next: NextFunction) { - res.data.after = ['after first'] - next() - } - ], - function (_req: Request, res: Response, next: NextFunction) { - res.data.after.push('after second') - next() - } - ) - - const server = await app.listen(4776) - const res = await axios.post('http://localhost:4776/todo', { - text: 'Do dishes' - }) - - assert.deepStrictEqual(res.data, { - text: 'Do dishes', - before: ['before first', 'before second'], - after: ['after first', 'after second'] - }) - server.close() - }) - - it('allows an array of middleware without a service', async () => { - const app = expressify(feathers()) - const middlewareArray = [ - function (_req: Request, res: Response, next: NextFunction) { - res.data = ['first'] - next() - }, - function (_req: Request, res: Response, next: NextFunction) { - res.data.push('second') - next() - }, - function (req: Request, res: Response) { - res.data.push(req.body.text) - res.status(200).json(res.data) - } - ] - app.use(express.json()).configure(rest()).use('/array-middleware', middlewareArray) - - const server = await app.listen(4776) - const res = await axios.post('http://localhost:4776/array-middleware', { - text: 'Do dishes' - }) - - assert.deepStrictEqual(res.data, ['first', 'second', 'Do dishes']) - server.close() - }) - - it('formatter does nothing when there is no res.data', async () => { - const data = { message: 'It worked' } - const app = expressify(feathers()).use('/test', express.formatter, (_req: Request, res: Response) => - res.json(data) - ) - - const server = await app.listen(7988) - const res = await axios.get('http://localhost:7988/test') - - assert.deepStrictEqual(res.data, data) - server.close() - }) - }) - - describe('HTTP status codes', () => { - let app: express.Application - let server: Server - - before(async () => { - app = expressify(feathers()) - .configure(rest(express.formatter)) - .use('todo', { - async get(id: Id) { - return { - description: `You have to do ${id}` - } - }, - - async patch() { - throw new Error('Not implemented') - }, - - async find() { - return null - } - }) - - app.use(function (_req, res, next) { - if (typeof res.data !== 'undefined') { - next(new Error('Should never get here')) - } else { - next() - } - }) - - // Error handler - app.use(function (error: Error, _req: Request, res: Response, _next: NextFunction) { - if (res.statusCode < 400) { - res.status(500) - } - - res.json({ message: error.message }) - }) - - server = await app.listen(4780) - }) - - after((done) => server.close(done)) - - it('throws a 405 for undefined service methods (#99)', async () => { - const res = await axios.get('http://localhost:4780/todo/dishes') - - assert.ok(res.status === 200, 'Got OK status code for .get') - assert.deepStrictEqual( - res.data, - { - description: 'You have to do dishes' - }, - 'Got expected object' - ) - - try { - await axios.post('http://localhost:4780/todo') - assert.fail('Should never get here') - } catch (error: any) { - assert.ok(error.response.status === 405, 'Got 405 for .create') - assert.deepStrictEqual( - error.response.data, - { - message: 'Method `create` is not supported by this endpoint.' - }, - 'Error serialized as expected' - ) - } - }) - - it('throws a 404 for undefined route', async () => { - try { - await axios.get('http://localhost:4780/todo/foo/bar') - assert.fail('Should never get here') - } catch (error: any) { - assert.ok(error.response.status === 404, 'Got Not Found code') - } - }) - - it('empty response sets 204 status codes, does not run other middleware (#391)', async () => { - const res = await axios.get('http://localhost:4780/todo') - - assert.ok(res.status === 204, 'Got empty status code') - }) - }) - - describe('route parameters', () => { - let server: Server - let app: express.Application - - before(async () => { - app = expressify(feathers()) - .configure(rest()) - .use('/:appId/:id/todo', { - async get(id: Id, params: Params) { - if (params.query.error) { - throw new BadRequest('Not good') - } - - return { - id, - route: params.route - } - } - }) - .use(errorHandler) - - server = await app.listen(6880) - }) - - after((done) => server.close(done)) - - it('adds route params as `params.route` and allows id property (#76, #407)', async () => { - const expected = { - id: 'dishes', - route: { - appId: 'theApp', - id: 'myId' - } - } - - const res = await axios.get(`http://localhost:6880/theApp/myId/todo/${expected.id}`) - - assert.ok(res.status === 200, 'Got OK status code') - assert.deepStrictEqual(expected, res.data) - }) - - it('properly serializes error for nested routes (#1096)', async () => { - try { - await axios.get('http://localhost:6880/theApp/myId/todo/test?error=true') - assert.fail('Should never het here') - } catch (error: any) { - const { response } = error - - assert.strictEqual(response.status, 400) - assert.deepStrictEqual(response.data, { - name: 'BadRequest', - message: 'Not good', - code: 400, - className: 'bad-request' - }) - } - }) - }) - - describe('Custom methods', () => { - let server: Server - let app: express.Application - - before(async () => { - app = expressify(feathers()) - .use(express.json()) - .configure(rest()) - .use('/todo', new Service(), { - methods: ['find', 'customMethod'] - }) - .use(errorHandler) - - server = await app.listen(4781) - }) - - after((done) => server.close(done)) - - it('calls .customMethod with X-Service-Method header', async () => { - const payload = { text: 'Do dishes' } - const res = await axios.post('http://localhost:4781/todo', payload, { - headers: { - 'X-Service-Method': 'customMethod' - } - }) - - assert.deepEqual(res.data, { - data: payload, - method: 'customMethod', - provider: 'rest' - }) - }) - - it('throws MethodNotImplement for .setup, non option and default methods', async () => { - const options: AxiosRequestConfig = { - method: 'POST', - url: 'http://localhost:4781/todo', - data: { text: 'Do dishes' } - } - const testMethod = (name: string) => { - return assert.rejects( - () => - axios({ - ...options, - headers: { - 'X-Service-Method': name - } - }), - (error: any) => { - assert.deepEqual(error.response.data, { - name: 'MethodNotAllowed', - message: `Method \`${name}\` is not supported by this endpoint.`, - code: 405, - className: 'method-not-allowed' - }) - - return true - } - ) - } - - await testMethod('setup') - await testMethod('internalMethod') - await testMethod('nonExisting') - await testMethod('create') - await testMethod('find') - }) - }) -}) diff --git a/packages/express/tsconfig.json b/packages/express/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/express/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/feathers/package.json b/packages/feathers/package.json index 20691feef0..5628d167cd 100644 --- a/packages/feathers/package.json +++ b/packages/feathers/package.json @@ -47,8 +47,7 @@ "prepublish": "npm run compile", "version": "npm run write-version", "publish": "npm run reset-version", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", + "compile": "shx rm -rf lib/ && tsc", "test": "mocha --config ../../.mocharc.json --recursive test/" }, "engines": { @@ -71,4 +70,4 @@ "typescript": "^5.5.4" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} +} \ No newline at end of file diff --git a/packages/generators/CHANGELOG.md b/packages/generators/CHANGELOG.md deleted file mode 100644 index 2ef59bfba1..0000000000 --- a/packages/generators/CHANGELOG.md +++ /dev/null @@ -1,206 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -### Bug Fixes - -- **generators:** Fix generating of gitignore ([#3514](https://github.com/feathersjs/feathers/issues/3514)) ([cabc397](https://github.com/feathersjs/feathers/commit/cabc397d2e4378c4bce79a60f2d196713cce4d8c)) - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **generators:** Fix migrate:make script in generated app ([#3490](https://github.com/feathersjs/feathers/issues/3490)) ([c7b0111](https://github.com/feathersjs/feathers/commit/c7b011150152e62a35f3f8ab04d6dde6d6727583)) - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- **generators:** better types for enabled methods ([#3474](https://github.com/feathersjs/feathers/issues/3474)) ([bdb3d3a](https://github.com/feathersjs/feathers/commit/bdb3d3a308322bfed3caa4214e4b6a72f1a84944)) - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -### Bug Fixes - -- **generators:** Use module format for JS Knex migrations ([#3444](https://github.com/feathersjs/feathers/issues/3444)) ([3feaa71](https://github.com/feathersjs/feathers/commit/3feaa719443aa30b1121d928ba5b7b8f43837ffb)) - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -### Bug Fixes - -- **generators:** Use cross-platform ES module \_\_dirname ([#3402](https://github.com/feathersjs/feathers/issues/3402)) ([0ac4882](https://github.com/feathersjs/feathers/commit/0ac4882663bb6a78622be0d903ae6508ecb516ad)) - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -### Bug Fixes - -- **cli:** Another fix for CLI ES module loading ([#3397](https://github.com/feathersjs/feathers/issues/3397)) ([3cb3bc9](https://github.com/feathersjs/feathers/commit/3cb3bc9a32602d82193b781b583ed0f37044e778)) - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -### Bug Fixes - -- **generators:** Move generators and CLI to featherscloud/pinion ([#3386](https://github.com/feathersjs/feathers/issues/3386)) ([eb87c99](https://github.com/feathersjs/feathers/commit/eb87c9922db56c5610e5b808f3ffe033c830e2b2)) - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -### Bug Fixes - -- **generators:** Harden mongodb.js to reliably extract database from any connection string ([#3264](https://github.com/feathersjs/feathers/issues/3264)) ([7b0f82c](https://github.com/feathersjs/feathers/commit/7b0f82c631ff5549cdc9a8e0ffcc705d067c2157)) - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **generators:** use `export type` vs `export` ([#3246](https://github.com/feathersjs/feathers/issues/3246)) ([82d30fd](https://github.com/feathersjs/feathers/commit/82d30fd37914e61935e068e89fc389f6bf47aaad)) - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) -- **schema:** HookContext is now typed in schema ([#3306](https://github.com/feathersjs/feathers/issues/3306)) ([65fab86](https://github.com/feathersjs/feathers/commit/65fab86407b813122f24db928a59986c7286f270)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -### Bug Fixes - -- **generators:** Fix configure channels when not real-time app ([#3271](https://github.com/feathersjs/feathers/issues/3271)) ([c619ab2](https://github.com/feathersjs/feathers/commit/c619ab2c57f692c419fee610c269c1502b124852)) - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -### Bug Fixes - -- **generators:** Fix channel/service configuration order for Koa based apps ([580344e](https://github.com/feathersjs/feathers/commit/580344e96fe8a2f17fd53476af5a0c7ddefac0b6)) - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/generators - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **generators:** Add sourceMap to tsconfig.json template ([#3166](https://github.com/feathersjs/feathers/issues/3166)) ([3049b7a](https://github.com/feathersjs/feathers/commit/3049b7a425d01cdd3058442c7183307a06cfc87a)) - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) -- **generators:** Properly log unhandled rejection ([#3149](https://github.com/feathersjs/feathers/issues/3149)) ([eda8f78](https://github.com/feathersjs/feathers/commit/eda8f78fa5084c3247ad10b051610b3c51a13d24)) - -## [5.0.2](https://github.com/feathersjs/feathers/compare/v5.0.1...v5.0.2) (2023-03-23) - -### Bug Fixes - -- **generators:** Make sure TypeScript version in generated app matches ([#3122](https://github.com/feathersjs/feathers/issues/3122)) ([f0acfdf](https://github.com/feathersjs/feathers/commit/f0acfdf9d33337bf40ca12126c2550f56e31fa3b)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **generators:** Conditionally import channels in Express app ([#3106](https://github.com/feathersjs/feathers/issues/3106)) ([c2dbaaa](https://github.com/feathersjs/feathers/commit/c2dbaaa4d1d5a5675b5812a7ed2317076ac414fe)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -### Bug Fixes - -- **generators:** Fix typo in service client generator ([#3068](https://github.com/feathersjs/feathers/issues/3068)) ([612032e](https://github.com/feathersjs/feathers/commit/612032eced24ecbcf255d51ff0d537d74227cfd7)) - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -### Features - -- **generators:** Final tweaks to the generators ([#3060](https://github.com/feathersjs/feathers/issues/3060)) ([1bf1544](https://github.com/feathersjs/feathers/commit/1bf1544fa8deeaa44ba354fb539dc3f1fd187767)) -- **schema:** Add schema helper for handling Object ids ([#3058](https://github.com/feathersjs/feathers/issues/3058)) ([1393bed](https://github.com/feathersjs/feathers/commit/1393bed81a9ee814de6aab0e537af83e667591a2)) - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Bug Fixes - -- **generators:** Add schema selection to CI test matrix ([#3035](https://github.com/feathersjs/feathers/issues/3035)) ([7484b16](https://github.com/feathersjs/feathers/commit/7484b164fba4ac2ee379dc5c6363f964f45e94d3)) -- **generators:** Fix Knex migration generated filename ([#3033](https://github.com/feathersjs/feathers/issues/3033)) ([1ac18a7](https://github.com/feathersjs/feathers/commit/1ac18a7143173d973af982772678834f7a7334f7)) -- **generators:** Generated app does not start when choosing JSON schema ([#3034](https://github.com/feathersjs/feathers/issues/3034)) ([7b8250b](https://github.com/feathersjs/feathers/commit/7b8250bd535c3c5ec7429a65139335ad43616ae0)) - -### Features - -- **mongodb:** Add Object ID keyword converter and update MongoDB CLI & docs ([#3041](https://github.com/feathersjs/feathers/issues/3041)) ([ca0994e](https://github.com/feathersjs/feathers/commit/ca0994eaecb5a31f310bc980d106834e11f24f41)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **generators:** Add main schema to all validators ([#2997](https://github.com/feathersjs/feathers/issues/2997)) ([5854dea](https://github.com/feathersjs/feathers/commit/5854dea7f610262121a49623ec5bbd474dcd3ef3)) -- **generators:** Add TypeScript as normal instead of dev dependency ([#3011](https://github.com/feathersjs/feathers/issues/3011)) ([2f67398](https://github.com/feathersjs/feathers/commit/2f673987f38b199e75aff629b7cdfcaebfd69c4c)) -- **generators:** Do not removeAdditional in queries ([#3000](https://github.com/feathersjs/feathers/issues/3000)) ([ef501bc](https://github.com/feathersjs/feathers/commit/ef501bcfa528119168787e9d857f1bb90e0c3114)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -### Features - -- **generators:** Add service file for shared information ([#3008](https://github.com/feathersjs/feathers/issues/3008)) ([0a1665d](https://github.com/feathersjs/feathers/commit/0a1665d23e002afadb40ed99bf0168f0fceb0054)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) diff --git a/packages/generators/README.md b/packages/generators/README.md deleted file mode 100644 index eca4bc0a6e..0000000000 --- a/packages/generators/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# @feathersjs/generators - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/generators.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/cli) - -> Feathers core code generators used by the CLI powered by [Pinion](https://github.com/feathershq/pinion/) - -## Installation - -``` -npm install @feathersjs/generators --save-dev -``` - -## Documentation - -Refer to the [Feathers CLI guide](https://feathersjs.com/guides/cli/) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/generators/package.json b/packages/generators/package.json deleted file mode 100644 index 03cde3b14b..0000000000 --- a/packages/generators/package.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "name": "@feathersjs/generators", - "version": "5.0.30", - "description": "Feathers CLI core generators, powered by Pinion", - "homepage": "https://feathersjs.com", - "keywords": [ - "feathers", - "pinion" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/commons" - }, - "author": { - "name": "Feathers contributor", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 16" - }, - "main": "lib/index.js", - "types": "lib/", - "type": "module", - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "compile": "shx rm -rf lib/ && tsc", - "test": "npm run compile && mocha --config ../../.mocharc.json --require tsx --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@featherscloud/pinion": "^0.5.4", - "chalk": "^5.3.0", - "lodash": "^4.17.21", - "prettier": "^3.3.3", - "typescript": "^5.5.4" - }, - "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/authentication-client": "^5.0.30", - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/authentication-oauth": "^5.0.30", - "@feathersjs/configuration": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/express": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/knex": "^5.0.30", - "@feathersjs/koa": "^5.0.30", - "@feathersjs/mongodb": "^5.0.30", - "@feathersjs/rest-client": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@feathersjs/socketio": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@feathersjs/typebox": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "@types/prettier": "^2.7.3", - "axios": "^1.7.7", - "knex": "^3.1.0", - "mocha": "^10.7.3", - "mongodb": "^6.8.0", - "mssql": "^11.0.1", - "mysql": "^2.18.1", - "pg": "^8.12.0", - "shx": "^0.3.4", - "sqlite3": "^5.1.7", - "tsx": "^4.19.0", - "type-fest": "^4.26.0", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/generators/src/app/index.ts b/packages/generators/src/app/index.ts deleted file mode 100644 index 64f9597c15..0000000000 --- a/packages/generators/src/app/index.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { sep, dirname } from 'path' -import chalk from 'chalk' -import { prompt, runGenerators } from '@featherscloud/pinion' -import { fileURLToPath } from 'url' -import { - FeathersBaseContext, - FeathersAppInfo, - initializeBaseContext, - addVersions, - install -} from '../commons.js' -import { generate as connectionGenerator, prompts as connectionPrompts } from '../connection/index.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface AppGeneratorData extends FeathersAppInfo { - /** - * The application name - */ - name: string - /** - * A short description of the app - */ - description: string - /** - * The database connection string - */ - connectionString: string - /** - * The source folder where files are put - */ - lib: string - /** - * Generate a client - */ - client: boolean -} - -export type AppGeneratorContext = FeathersBaseContext & - AppGeneratorData & { - dependencies: string[] - devDependencies: string[] - } - -export type AppGeneratorArguments = FeathersBaseContext & Partial - -export const generate = (ctx: AppGeneratorArguments) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then((ctx) => ({ - ...ctx, - dependencies: [], - devDependencies: [] - })) - .then( - prompt((ctx) => [ - { - name: 'language', - type: 'list', - message: 'Do you want to use JavaScript or TypeScript?', - when: !ctx.language, - choices: [ - { name: 'TypeScript', value: 'ts' }, - { name: 'JavaScript', value: 'js' } - ] - }, - { - name: 'name', - type: 'input', - when: !ctx.name, - message: 'What is the name of your application?', - default: ctx.cwd.split(sep).pop(), - validate: (input) => { - if (ctx.dependencyVersions[input]) { - return `Application can not have the same name as a dependency` - } - - return true - } - }, - { - name: 'description', - type: 'input', - when: !ctx.description, - message: 'Write a short description' - }, - { - type: 'list', - name: 'framework', - when: !ctx.framework, - message: 'Which HTTP framework do you want to use?', - choices: [ - { value: 'koa', name: `KoaJS ${chalk.grey('(recommended)')}` }, - { value: 'express', name: 'Express' } - ] - }, - { - type: 'checkbox', - name: 'transports', - when: !ctx.transports, - message: 'What APIs do you want to offer?', - choices: [ - { value: 'rest', name: 'HTTP (REST)', checked: true }, - { value: 'websockets', name: 'Real-time', checked: true } - ] - }, - { - name: 'packager', - type: 'list', - when: !ctx.packager, - message: 'Which package manager are you using?', - choices: [ - { value: 'npm', name: 'npm' }, - { value: 'yarn', name: 'Yarn' }, - { value: 'pnpm', name: 'pnpm' } - ] - }, - { - name: 'client', - type: 'confirm', - when: ctx.client === undefined, - message: (answers) => `Generate ${answers.language === 'ts' ? 'end-to-end typed ' : ''}client?`, - suffix: chalk.grey(' Can be used with React, Angular, Vue, React Native, Node.js etc.') - }, - { - type: 'list', - name: 'schema', - when: !ctx.schema, - message: 'What is your preferred schema (model) definition format?', - suffix: chalk.grey( - ' Schemas allow to type, validate, secure and populate your data and configuration' - ), - choices: [ - { value: 'typebox', name: `TypeBox ${chalk.grey('(recommended)')}` }, - { value: 'json', name: 'JSON schema' }, - { value: false, name: `No schema ${chalk.grey('(not recommended)')}` } - ] - }, - ...connectionPrompts(ctx) - ]) - ) - .then(runGenerators(__dirname, 'templates')) - .then(initializeBaseContext()) - .then(async (ctx) => { - const { dependencies } = await connectionGenerator(ctx) - - return { - ...ctx, - dependencies - } - }) - .then( - install( - ({ transports, framework, dependencyVersions, dependencies, schema }) => { - const hasSocketio = transports.includes('websockets') - - dependencies.push( - '@feathersjs/feathers', - '@feathersjs/errors', - '@feathersjs/schema', - '@feathersjs/configuration', - '@feathersjs/transport-commons', - '@feathersjs/adapter-commons', - '@feathersjs/authentication', - '@feathersjs/authentication-client', - 'winston' - ) - - if (hasSocketio) { - dependencies.push('@feathersjs/socketio') - } - - if (framework === 'koa') { - dependencies.push('@feathersjs/koa') - } - - if (framework === 'express') { - dependencies.push('@feathersjs/express', 'compression') - } - - if (schema === 'typebox') { - dependencies.push('@feathersjs/typebox') - } - - return addVersions(dependencies, dependencyVersions) - }, - false, - ({ packager }) => packager - ) - ) - .then( - install( - ({ language, devDependencies, dependencyVersions }) => { - devDependencies.push( - 'nodemon', - 'axios', - 'mocha', - 'cross-env', - 'prettier', - '@feathersjs/cli', - '@feathersjs/rest-client' - ) - - if (language === 'ts') { - devDependencies.push('@types/mocha', '@types/node', 'nodemon', 'ts-node', 'typescript', 'shx') - } - - return addVersions(devDependencies, dependencyVersions) - }, - true, - ({ packager }) => packager - ) - ) diff --git a/packages/generators/src/app/templates/app.test.tpl.ts b/packages/generators/src/app/templates/app.test.tpl.ts deleted file mode 100644 index d0da71a985..0000000000 --- a/packages/generators/src/app/templates/app.test.tpl.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({ - lib -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/app.test.html -import assert from 'assert' -import axios from 'axios' -import type { Server } from 'http' -import { app } from '../${lib}/app' - -const port = app.get('port') -const appUrl = \`http://\${app.get('host')}:\${port}\` - -describe('Feathers application tests', () => { - let server: Server - - before(async () => { - server = await app.listen(port) - }) - - after(async () => { - await app.teardown() - }) - - it('starts and shows the index page', async () => { - const { data } = await axios.get(appUrl) - - assert.ok(data.indexOf('') !== -1) - }) - - it('shows a 404 JSON error', async () => { - try { - await axios.get(\`\${appUrl}/path/to/nowhere\`, { - responseType: 'json' - }) - assert.fail('should never get here') - } catch (error: any) { - const { response } = error - assert.strictEqual(response?.status, 404) - assert.strictEqual(response?.data?.code, 404) - assert.strictEqual(response?.data?.name, 'NotFound') - } - }) -}) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(renderSource(template, toFile('test', 'app.test'))) diff --git a/packages/generators/src/app/templates/app.tpl.ts b/packages/generators/src/app/templates/app.tpl.ts deleted file mode 100644 index a1c36a933b..0000000000 --- a/packages/generators/src/app/templates/app.tpl.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const tsKoaApp = ({ - transports, - schema -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/application.html -import { feathers } from '@feathersjs/feathers' -import configuration from '@feathersjs/configuration' -import { - koa, rest, bodyParser, errorHandler, parseAuthentication, cors, serveStatic -} from '@feathersjs/koa' -${transports.includes('websockets') ? "import socketio from '@feathersjs/socketio'" : ''} - -${schema !== false ? `import { configurationValidator } from './configuration'` : ''} -import type { Application } from './declarations' -import { logError } from './hooks/log-error' -import { services } from './services/index' -${transports.includes('websockets') ? `import { channels } from './channels'` : ''} - -const app: Application = koa(feathers()) - -// Load our app configuration (see config/ folder) -app.configure(configuration(${schema !== false ? 'configurationValidator' : ''})) - -// Set up Koa middleware -app.use(cors()) -app.use(serveStatic(app.get('public'))) -app.use(errorHandler()) -app.use(parseAuthentication()) -app.use(bodyParser()) - -// Configure services and transports -app.configure(rest()) -${ - transports.includes('websockets') - ? `app.configure(socketio({ - cors: { - origin: app.get('origins') - } -}))` - : '' -} -app.configure(services) -${transports.includes('websockets') ? 'app.configure(channels)' : ''} - - -// Register hooks that run on all service methods -app.hooks({ - around: { - all: [ logError ] - }, - before: {}, - after: {}, - error: {} -}) -// Register application setup and teardown hooks here -app.hooks({ - setup: [], - teardown: [] -}) - -export { app } -` - -const tsExpressApp = ({ - transports, - schema -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/application.html -import { feathers } from '@feathersjs/feathers' -import express, { - rest, json, urlencoded, cors, - serveStatic, notFound, errorHandler -} from '@feathersjs/express' -import configuration from '@feathersjs/configuration' -${transports.includes('websockets') ? "import socketio from '@feathersjs/socketio'" : ''} - -import type { Application } from './declarations' -${schema !== false ? `import { configurationValidator } from './configuration'` : ''} -import { logger } from './logger' -import { logError } from './hooks/log-error' -import { services } from './services/index' -${transports.includes('websockets') ? `import { channels } from './channels'` : ''} - -const app: Application = express(feathers()) - -// Load app configuration -app.configure(configuration(${schema !== false ? 'configurationValidator' : ''})) -app.use(cors()) -app.use(json()) -app.use(urlencoded({ extended: true })) -// Host the public folder -app.use('/', serveStatic(app.get('public'))) - -// Configure services and real-time functionality -app.configure(rest()) -${ - transports.includes('websockets') - ? `app.configure(socketio({ - cors: { - origin: app.get('origins') - } -}))` - : '' -} -app.configure(services) -${transports.includes('websockets') ? 'app.configure(channels)' : ''} - -// Configure a middleware for 404s and the error handler -app.use(notFound()) -app.use(errorHandler({ logger })) - -// Register hooks that run on all service methods -app.hooks({ - around: { - all: [ logError ] - }, - before: {}, - after: {}, - error: {} -}) -// Register application setup and teardown hooks here -app.hooks({ - setup: [], - teardown: [] -}) - -export { app } -` - -const template = (ctx: AppGeneratorContext) => - ctx.framework === 'express' ? tsExpressApp(ctx) : tsKoaApp(ctx) - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib }) => lib, 'app') - ) - ) diff --git a/packages/generators/src/app/templates/channels.tpl.ts b/packages/generators/src/app/templates/channels.tpl.ts deleted file mode 100644 index 30d2aa7419..0000000000 --- a/packages/generators/src/app/templates/channels.tpl.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({ - language -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/channels.html -import type { RealTimeConnection, Params } from '@feathersjs/feathers' -import type { AuthenticationResult } from '@feathersjs/authentication' -import '@feathersjs/transport-commons' -import type { Application, HookContext } from './declarations' -import { logger } from './logger' - -export const channels = (app: Application) => { - logger.warn('Publishing all events to all authenticated users. See \`channels.${language}\` and https://dove.feathersjs.com/api/channels.html for more information.') - - app.on('connection', (connection: RealTimeConnection) => { - // On a new real-time connection, add it to the anonymous channel - app.channel('anonymous').join(connection) - }) - - app.on('login', (authResult: AuthenticationResult, { connection }: Params) => { - // connection can be undefined if there is no - // real-time connection, e.g. when logging in via REST - if(connection) { - // The connection is no longer anonymous, remove it - app.channel('anonymous').leave(connection) - - // Add it to the authenticated user channel - app.channel('authenticated').join(connection) - } - }) - - // eslint-disable-next-line no-unused-vars - app.publish((data: any, context: HookContext) => { - // Here you can add event publishers to channels set up in \`channels.js\` - // To publish only for a specific event use \`app.publish(eventname, () => {})\` - - // e.g. to publish all service events to all authenticated users use - return app.channel('authenticated') - }) -} -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ transports }) => transports.includes('websockets'), - renderSource( - template, - toFile(({ lib }) => lib, 'channels') - ) - ) - ) diff --git a/packages/generators/src/app/templates/client.test.tpl.ts b/packages/generators/src/app/templates/client.test.tpl.ts deleted file mode 100644 index 062156d2d1..0000000000 --- a/packages/generators/src/app/templates/client.test.tpl.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({ lib }: AppGeneratorContext) => /* ts */ `import assert from 'assert' -import axios from 'axios' -import type { Server } from 'http' -import { app } from '../${lib}/app' -import { createClient } from '../${lib}/client' - -import rest from '@feathersjs/rest-client' - -const port = app.get('port') -const appUrl = \`http://\${app.get('host')}:\${port}\` - -describe('client tests', () => { - const client = createClient(rest(appUrl).axios(axios)) - - it('initialized the client', () => { - assert.ok(client) - }) -}) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when((ctx) => ctx.client, renderSource(template, toFile('test', 'client.test'))) - ) diff --git a/packages/generators/src/app/templates/client.tpl.ts b/packages/generators/src/app/templates/client.tpl.ts deleted file mode 100644 index 101c617aa8..0000000000 --- a/packages/generators/src/app/templates/client.tpl.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({ - name, - language -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/client.html -import { feathers } from '@feathersjs/feathers' -import type { TransportConnection, Application } from '@feathersjs/feathers' -import authenticationClient from '@feathersjs/authentication-client' -import type { AuthenticationClientOptions } from '@feathersjs/authentication-client' - -export interface Configuration { - connection: TransportConnection -} - -export interface ServiceTypes {} - -export type ClientApplication = Application - -/** - * Returns a ${language === 'ts' ? 'typed' : ''} client for the ${name} app. - * - * @param connection The REST or Socket.io Feathers client connection - * @param authenticationOptions Additional settings for the authentication client - * @see https://dove.feathersjs.com/api/client.html - * @returns The Feathers client application - */ -export const createClient = ( - connection: TransportConnection, - authenticationOptions: Partial = {} -) => { - const client: ClientApplication = feathers() - - client.configure(connection) - client.configure(authenticationClient(authenticationOptions)) - client.set('connection', connection) - - return client -} -` - -export const generate = async (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when( - (ctx) => ctx.client, - renderSource( - template, - toFile(({ lib }) => lib, 'client') - ) - ) - ) diff --git a/packages/generators/src/app/templates/configuration.tpl.ts b/packages/generators/src/app/templates/configuration.tpl.ts deleted file mode 100644 index 85eed1dd49..0000000000 --- a/packages/generators/src/app/templates/configuration.tpl.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { toFile, when, writeJSON } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const defaultConfig = ({}: AppGeneratorContext) => ({ - host: 'localhost', - port: 3030, - public: './public/', - origins: ['http://localhost:3030'], - paginate: { - default: 10, - max: 50 - } -}) - -const customEnvironment = { - port: { - __name: 'PORT', - __format: 'number' - }, - host: 'HOSTNAME', - authentication: { - secret: 'FEATHERS_SECRET' - } -} - -const testConfig = { - port: 8998 -} - -const configurationJsonTemplate = - ({}: AppGeneratorContext) => `import { defaultAppSettings, getValidator } from '@feathersjs/schema' -import type { FromSchema } from '@feathersjs/schema' - -import { dataValidator } from './validators' - -export const configurationSchema = { - $id: 'configuration', - type: 'object', - additionalProperties: false, - required: [ 'host', 'port', 'public' ], - properties: { - ...defaultAppSettings, - host: { type: 'string' }, - port: { type: 'number' }, - public: { type: 'string' } - } -} as const - -export const configurationValidator = getValidator(configurationSchema, dataValidator) - -export type ApplicationConfiguration = FromSchema -` - -const configurationTypeboxTemplate = - ({}: AppGeneratorContext) => `import { Type, getValidator, defaultAppConfiguration } from '@feathersjs/typebox' -import type { Static } from '@feathersjs/typebox' - -import { dataValidator } from './validators' - -export const configurationSchema = Type.Intersect([ - defaultAppConfiguration, - Type.Object({ - host: Type.String(), - port: Type.Number(), - public: Type.String() - }) -]) - -export type ApplicationConfiguration = Static - -export const configurationValidator = getValidator(configurationSchema, dataValidator) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx) - .then(writeJSON(defaultConfig, toFile('config', 'default.json'))) - .then(writeJSON(testConfig, toFile('config', 'test.json'))) - .then(writeJSON(customEnvironment, toFile('config', 'custom-environment-variables.json'))) - .then( - when( - (ctx) => ctx.schema !== false, - renderSource( - async (ctx) => - ctx.schema === 'typebox' ? configurationTypeboxTemplate(ctx) : configurationJsonTemplate(ctx), - toFile(({ lib }) => lib, 'configuration') - ) - ) - ) diff --git a/packages/generators/src/app/templates/declarations.tpl.ts b/packages/generators/src/app/templates/declarations.tpl.ts deleted file mode 100644 index 5224842e5e..0000000000 --- a/packages/generators/src/app/templates/declarations.tpl.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { toFile, when, renderTemplate } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -const template = ({ - framework, - schema -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/typescript.html -import { HookContext as FeathersHookContext, NextFunction } from '@feathersjs/feathers' -import { Application as FeathersApplication } from '@feathersjs/${framework}' -${ - schema === false - ? `type ApplicationConfiguration = any` - : `import { ApplicationConfiguration } from './configuration'` -} - -export type { NextFunction } - -// The types for app.get(name) and app.set(name) -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface Configuration extends ApplicationConfiguration {} - -// A mapping of service names to types. Will be extended in service files. -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ServiceTypes {} - -// The application instance type that will be used everywhere else -export type Application = FeathersApplication - -// The context for hook functions - can be typed with a service class -export type HookContext = FeathersHookContext -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ language }) => language === 'ts', - renderTemplate( - template, - toFile(({ lib }) => lib, 'declarations.ts') - ) - ) - ) diff --git a/packages/generators/src/app/templates/gitignore.tpl.ts b/packages/generators/src/app/templates/gitignore.tpl.ts deleted file mode 100644 index 03aed1b74c..0000000000 --- a/packages/generators/src/app/templates/gitignore.tpl.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { renderTemplate, toFile } from '@featherscloud/pinion' -import { AppGeneratorContext } from '..' - -const template = `# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test -.env.production - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* -.sqlite - -lib/ -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(renderTemplate(template, toFile('.gitignore'))) diff --git a/packages/generators/src/app/templates/index.html.tpl.ts b/packages/generators/src/app/templates/index.html.tpl.ts deleted file mode 100644 index 9369e7fe08..0000000000 --- a/packages/generators/src/app/templates/index.html.tpl.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { renderTemplate, toFile } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -const template = ({ name, description }: AppGeneratorContext) => /* html */ ` - - - ${name} - - - - - - - - - -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(renderTemplate(template, toFile('public', 'index.html'))) diff --git a/packages/generators/src/app/templates/index.tpl.ts b/packages/generators/src/app/templates/index.tpl.ts deleted file mode 100644 index db82b0d154..0000000000 --- a/packages/generators/src/app/templates/index.tpl.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({}: AppGeneratorContext) => /* ts */ `import { app } from './app' -import { logger } from './logger' - -const port = app.get('port') -const host = app.get('host') - -process.on('unhandledRejection', (reason) => - logger.error('Unhandled Rejection %O', reason) -) - -app.listen(port).then(() => { - logger.info(\`Feathers app listening on http://\${host}:\${port}\`) -}) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib }) => lib, 'index') - ) - ) diff --git a/packages/generators/src/app/templates/logger.tpl.ts b/packages/generators/src/app/templates/logger.tpl.ts deleted file mode 100644 index 0f72ef9d8a..0000000000 --- a/packages/generators/src/app/templates/logger.tpl.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = - ({}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/logging.html -import { createLogger, format, transports } from 'winston' - -// Configure the Winston logger. For the complete documentation see https://github.com/winstonjs/winston -export const logger = createLogger({ - // To see more detailed errors, change this to 'debug' - level: 'info', - format: format.combine( - format.splat(), - format.simple() - ), - transports: [ - new transports.Console() - ] -}) -` - -export const logErrorTemplate = /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/log-error.html -import type { HookContext, NextFunction } from '../declarations' -import { logger } from '../logger' - -export const logError = async (context: HookContext, next: NextFunction) => { - try { - await next() - } catch (error: any) { - logger.error(error.stack) - - // Log validation errors - if (error.data) { - logger.error('Data: %O', error.data) - } - - throw error - } -} -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib }) => lib, 'logger') - ) - ) - .then( - renderSource( - logErrorTemplate, - toFile(({ lib }) => lib, 'hooks', 'log-error') - ) - ) diff --git a/packages/generators/src/app/templates/package.json.tpl.ts b/packages/generators/src/app/templates/package.json.tpl.ts deleted file mode 100644 index 9717859a94..0000000000 --- a/packages/generators/src/app/templates/package.json.tpl.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { toFile, writeJSON } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -const jsPackageJson = (lib: string) => ({ - type: 'module', - scripts: { - start: `node ${lib}`, - dev: `nodemon ${lib}/`, - prettier: 'npx prettier "**/*.js" --write', - mocha: 'cross-env NODE_ENV=test mocha test/ --recursive --exit', - test: 'npm run mocha', - 'bundle:client': 'npm pack --pack-destination ./public' - } -}) - -const tsPackageJson = (lib: string) => ({ - scripts: { - dev: `nodemon -x ts-node ${lib}/index.ts`, - compile: 'shx rm -rf lib/ && tsc', - start: 'node lib/', - prettier: 'npx prettier "**/*.ts" --write', - mocha: - 'cross-env NODE_ENV=test mocha test/ --require ts-node/register --recursive --extension .ts --exit', - test: 'npm run mocha', - 'bundle:client': 'npm run compile && npm pack --pack-destination ./public' - } -}) - -const packageJson = ({ - name, - description, - client, - language, - packager, - database, - framework, - transports, - lib, - test, - schema -}: AppGeneratorContext) => ({ - name, - description, - version: '0.0.0', - homepage: '', - private: true, - keywords: ['feathers'], - author: {}, - contributors: [] as string[], - bugs: {}, - engines: { - node: `>= ${process.version.substring(1)}` - }, - feathers: { - language, - packager, - database, - framework, - transports, - schema - }, - directories: { - lib, - test - }, - ...(client - ? { - files: ['lib/client.js', 'lib/**/*.d.ts', 'lib/**/*.shared.js'], - main: language === 'ts' ? 'lib/client' : `${lib}/client` - } - : { - main: 'lib/index' - }), - ...(language === 'ts' ? tsPackageJson(lib) : jsPackageJson(lib)) -}) - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(writeJSON(packageJson, toFile('package.json'))) diff --git a/packages/generators/src/app/templates/prettierrc.tpl.ts b/packages/generators/src/app/templates/prettierrc.tpl.ts deleted file mode 100644 index a9805ce09c..0000000000 --- a/packages/generators/src/app/templates/prettierrc.tpl.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { toFile, writeJSON } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' -import { PRETTIERRC } from '../../commons.js' - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - writeJSON( - (ctx) => ({ - ...PRETTIERRC, - parser: ctx.language === 'ts' ? 'typescript' : 'babel' - }), - toFile('.prettierrc') - ) - ) diff --git a/packages/generators/src/app/templates/readme.md.tpl.ts b/packages/generators/src/app/templates/readme.md.tpl.ts deleted file mode 100644 index f691952a4a..0000000000 --- a/packages/generators/src/app/templates/readme.md.tpl.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { renderTemplate, toFile } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -const template = ({ name, description, language, database }: AppGeneratorContext) => /* md */ `# ${name} - -> ${description} - -## About - -This project uses [Feathers](http://feathersjs.com). An open source framework for building APIs and real-time applications. - -## Getting Started - -1. Make sure you have [NodeJS](https://nodejs.org/) and [npm](https://www.npmjs.com/) installed. -2. Install your dependencies - - \`\`\` - cd path/to/${name} - npm install - \`\`\` - -3. Start your app - - \`\`\`${ - language === 'ts' - ? ` - npm run compile # Compile TypeScript source` - : '' - }${ - database !== 'mongodb' - ? ` - npm run migrate # Run migrations to set up the database` - : '' - } - npm start - \`\`\` - -## Testing - -Run \`npm test\` and all your tests in the \`test/\` directory will be run. - -## Scaffolding - -This app comes with a powerful command line interface for Feathers. Here are a few things it can do: - -\`\`\` -$ npx feathers help # Show all commands -$ npx feathers generate service # Generate a new Service -\`\`\` - -## Help - -For more information on all the things you can do with Feathers visit [docs.feathersjs.com](http://docs.feathersjs.com). -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(renderTemplate(template, toFile('readme.md'))) diff --git a/packages/generators/src/app/templates/services.tpl.ts b/packages/generators/src/app/templates/services.tpl.ts deleted file mode 100644 index 6e0d8a4718..0000000000 --- a/packages/generators/src/app/templates/services.tpl.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = - ({}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/application.html#configure-functions -import type { Application } from '../declarations' - -export const services = (app: Application) => { - // All services will be registered here -} -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib }) => lib, 'services', 'index') - ) - ) diff --git a/packages/generators/src/app/templates/tsconfig.json.tpl.ts b/packages/generators/src/app/templates/tsconfig.json.tpl.ts deleted file mode 100644 index 72cf2af85c..0000000000 --- a/packages/generators/src/app/templates/tsconfig.json.tpl.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { toFile, when, writeJSON } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when( - (ctx) => ctx.language === 'ts', - writeJSON( - ({ lib }) => ({ - 'ts-node': { - files: true - }, - compilerOptions: { - target: 'es2020', - module: 'commonjs', - outDir: './lib', - rootDir: `./${lib}`, - declaration: true, - strict: true, - esModuleInterop: true, - sourceMap: true - }, - include: [lib], - exclude: ['test'] - }), - toFile('tsconfig.json') - ) - ) - ) diff --git a/packages/generators/src/app/templates/validators.tpl.ts b/packages/generators/src/app/templates/validators.tpl.ts deleted file mode 100644 index 2647cdaf09..0000000000 --- a/packages/generators/src/app/templates/validators.tpl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const validatorTemplate = /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/validators.html -import { Ajv, addFormats } from '@feathersjs/schema' -import type { FormatsPluginOptions } from '@feathersjs/schema' - -const formats: FormatsPluginOptions = [ - 'date-time', - 'time', - 'date', - 'email', - 'hostname', - 'ipv4', - 'ipv6', - 'uri', - 'uri-reference', - 'uuid', - 'uri-template', - 'json-pointer', - 'relative-json-pointer', - 'regex' -] - -export const dataValidator: Ajv = addFormats(new Ajv({}), formats) - -export const queryValidator: Ajv = addFormats(new Ajv({ - coerceTypes: true -}), formats) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - validatorTemplate, - toFile(({ lib }) => lib, 'validators') - ) - ) diff --git a/packages/generators/src/authentication/index.ts b/packages/generators/src/authentication/index.ts deleted file mode 100644 index 12cea73aa2..0000000000 --- a/packages/generators/src/authentication/index.ts +++ /dev/null @@ -1,119 +0,0 @@ -import chalk from 'chalk' -import { dirname } from 'path' -import { runGenerators, prompt } from '@featherscloud/pinion' -import { fileURLToPath } from 'url' -import { - addVersions, - checkPreconditions, - FeathersBaseContext, - initializeBaseContext, - install -} from '../commons.js' -import { generate as serviceGenerator, ServiceGeneratorContext } from '../service/index.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface AuthenticationGeneratorContext extends ServiceGeneratorContext { - service: string - entity: string - authStrategies: string[] - dependencies: string[] -} - -export type AuthenticationGeneratorArguments = FeathersBaseContext & - Partial> - -export const generate = (ctx: AuthenticationGeneratorArguments) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then(checkPreconditions()) - .then( - prompt((ctx: AuthenticationGeneratorArguments) => [ - { - type: 'checkbox', - name: 'authStrategies', - when: !ctx.authStrategies, - message: 'Which authentication methods do you want to use?', - suffix: chalk.grey(' Other methods and providers can be added at any time.'), - choices: [ - { - name: 'Email + Password', - value: 'local', - checked: true - }, - { - name: 'Google', - value: 'google' - }, - { - name: 'Facebook', - value: 'facebook' - }, - { - name: 'Twitter', - value: 'twitter' - }, - { - name: 'GitHub', - value: 'github' - }, - { - name: 'Auth0', - value: 'auth0' - } - ] - }, - { - name: 'service', - type: 'input', - when: !ctx.service, - message: 'What is your authentication service name?', - default: 'user' - }, - { - name: 'path', - type: 'input', - when: !ctx.path, - message: 'What path should the service be registered on?', - default: 'users' - } - ]) - ) - .then(async (ctx) => { - const serviceContext = await serviceGenerator({ - ...ctx, - name: ctx.service, - isEntityService: true - }) - - return { - ...ctx, - entity: ctx.service, - ...serviceContext - } - }) - .then(runGenerators(__dirname, 'templates')) - .then((ctx) => ctx as AuthenticationGeneratorContext) - .then((ctx) => { - const dependencies: string[] = [] - - dependencies.push('@feathersjs/authentication-oauth') - - if (ctx.authStrategies.includes('local')) { - dependencies.push('@feathersjs/authentication-local') - } - - if (ctx.dependencies) { - return { - ...ctx, - dependencies: [...ctx.dependencies, ...dependencies] - } - } - - return install( - addVersions(dependencies, ctx.dependencyVersions), - false, - ctx.feathers.packager - )(ctx) - }) diff --git a/packages/generators/src/authentication/templates/authentication.tpl.ts b/packages/generators/src/authentication/templates/authentication.tpl.ts deleted file mode 100644 index 304f8d5f0e..0000000000 --- a/packages/generators/src/authentication/templates/authentication.tpl.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { before, toFile } from '@featherscloud/pinion' -import { injectSource, renderSource } from '../../commons.js' -import { AuthenticationGeneratorContext } from '../index.js' -import { localTemplate, oauthTemplate } from '../../commons.js' - -const template = ({ - authStrategies -}: AuthenticationGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/authentication.html -import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' -${localTemplate(authStrategies, `import { LocalStrategy } from '@feathersjs/authentication-local'`)} -${oauthTemplate(authStrategies, `import { oauth, OAuthStrategy } from '@feathersjs/authentication-oauth'`)} - -import type { Application } from './declarations' - -declare module './declarations' { - interface ServiceTypes { - 'authentication': AuthenticationService - } -} - -export const authentication = (app: Application) => { - const authentication = new AuthenticationService(app) - - authentication.register('jwt', new JWTStrategy()) - ${authStrategies - .map( - (strategy) => - ` authentication.register('${strategy}', ${ - strategy === 'local' ? `new LocalStrategy()` : `new OAuthStrategy()` - })` - ) - .join('\n')} - - app.use('authentication', authentication) - ${oauthTemplate(authStrategies, `app.configure(oauth())`)} -} -` - -const importTemplate = "import { authentication } from './authentication'" -const configureTemplate = 'app.configure(authentication)' -const toAppFile = toFile(({ lib }) => [lib, 'app']) - -export const generate = (ctx: AuthenticationGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib }) => lib, 'authentication') - ) - ) - .then(injectSource(importTemplate, before('import { services } from'), toAppFile)) - .then(injectSource(configureTemplate, before('app.configure(services)'), toAppFile)) diff --git a/packages/generators/src/authentication/templates/client.test.tpl.ts b/packages/generators/src/authentication/templates/client.test.tpl.ts deleted file mode 100644 index 7b4e648faa..0000000000 --- a/packages/generators/src/authentication/templates/client.test.tpl.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { fileExists, renderSource } from '../../commons.js' -import { AuthenticationGeneratorContext } from '../index.js' -import { localTemplate } from '../../commons.js' - -const template = ({ - authStrategies, - upperName, - type, - lib -}: AuthenticationGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/client.test.html -import assert from 'assert' -import axios from 'axios' - -import rest from '@feathersjs/rest-client' -${localTemplate(authStrategies, `import authenticationClient from '@feathersjs/authentication-client'`)} -import { app } from '../${lib}/app' -import { createClient } from '../${lib}/client' -${localTemplate(authStrategies, `import type { ${upperName}Data } from '../${lib}/client'`)} - -const port = app.get('port') -const appUrl = \`http://\${app.get('host')}:\${port}\` - -describe('application client tests', () => { - const client = createClient(rest(appUrl).axios(axios)) - - before(async () => { - await app.listen(port) - }) - - after(async () => { - await app.teardown() - }) - - it('initialized the client', () => { - assert.ok(client) - }) - - ${localTemplate( - authStrategies, - ` - it('creates and authenticates a user with email and password', async () => { - const userData: ${upperName}Data = { - email: 'someone@example.com', - password: 'supersecret' - } - - await client.service('users').create(userData) - - const { user, accessToken } = await client.authenticate({ - strategy: 'local', - ...userData - }) - - assert.ok(accessToken, 'Created access token for user') - assert.ok(user, 'Includes user in authentication data') - assert.strictEqual(user.password, undefined, 'Password is hidden to clients') - - await client.logout() - - // Remove the test user on the server - await app.service('users').remove(user.${type === 'mongodb' ? '_id' : 'id'}) - })` - )} -}) -` - -export const generate = (ctx: AuthenticationGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ lib, language }) => fileExists(lib, `client.${language}`), - renderSource( - template, - toFile(({ test }) => test, 'client.test'), - { force: true } - ) - ) - ) diff --git a/packages/generators/src/authentication/templates/config.tpl.ts b/packages/generators/src/authentication/templates/config.tpl.ts deleted file mode 100644 index 2fdbaf3eab..0000000000 --- a/packages/generators/src/authentication/templates/config.tpl.ts +++ /dev/null @@ -1,60 +0,0 @@ -import crypto from 'crypto' -import { toFile, mergeJSON } from '@featherscloud/pinion' -import { AuthenticationGeneratorContext } from '../index.js' - -export const generate = (ctx: AuthenticationGeneratorContext) => - Promise.resolve(ctx) - .then( - mergeJSON( - ({ authStrategies }) => { - const authentication: any = { - entity: ctx.entity, - service: ctx.path, - secret: crypto.randomBytes(24).toString('base64'), - authStrategies: ['jwt'], - jwtOptions: { - header: { - typ: 'access' - }, - audience: 'https://yourdomain.com', - algorithm: 'HS256', - expiresIn: '1d' - } - } - - if (authStrategies.includes('local')) { - authentication.authStrategies.push('local') - authentication.local = { - usernameField: 'email', - passwordField: 'password' - } - } - - const oauthStrategies = authStrategies.filter((name) => name !== 'local') - - if (oauthStrategies.length) { - authentication.oauth = oauthStrategies.reduce((oauth, name) => { - oauth[name] = { - key: '', - secret: '' - } - - return oauth - }, {} as any) - } - - return { authentication } - }, - toFile('config', 'default.json') - ) - ) - .then( - mergeJSON( - { - authentication: { - secret: 'FEATHERS_SECRET' - } - }, - toFile('config', 'custom-environment-variables.json') - ) - ) diff --git a/packages/generators/src/authentication/templates/declarations.tpl.ts b/packages/generators/src/authentication/templates/declarations.tpl.ts deleted file mode 100644 index b9a264bb1f..0000000000 --- a/packages/generators/src/authentication/templates/declarations.tpl.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { inject, before, toFile, when, append } from '@featherscloud/pinion' -import { AuthenticationGeneratorContext } from '../index.js' - -const importTemplate = ({ - upperName, - folder, - fileName -}: AuthenticationGeneratorContext) => /* ts */ `import { ${upperName} } from './services/${folder.join( - '/' -)}/${fileName}' -` - -const paramsTemplate = ({ - entity, - upperName -}: AuthenticationGeneratorContext) => /* ts */ `// Add the ${entity} as an optional property to all params -declare module '@feathersjs/feathers' { - interface Params { - ${entity}?: ${upperName} - } -} -` - -const toDeclarationFile = toFile(({ lib }) => lib, 'declarations.ts') - -export const generate = (ctx: AuthenticationGeneratorContext) => - Promise.resolve(ctx) - .then( - when( - (ctx) => ctx.language === 'ts', - inject( - importTemplate, - before(/export \{ NextFunction \}|export type \{ NextFunction \}/), - toDeclarationFile - ) - ) - ) - .then(when((ctx) => ctx.language === 'ts', inject(paramsTemplate, append(), toDeclarationFile))) diff --git a/packages/generators/src/commons.ts b/packages/generators/src/commons.ts deleted file mode 100644 index ce5cadfafe..0000000000 --- a/packages/generators/src/commons.ts +++ /dev/null @@ -1,346 +0,0 @@ -import fs from 'fs' -import { join, dirname } from 'path' -import { PackageJson } from 'type-fest' -import { readFile, writeFile } from 'fs/promises' -import { - Callable, - PinionContext, - loadJSON, - fromFile, - getCallable, - renderTemplate, - inject, - Location, - exec -} from '@featherscloud/pinion' -import ts from 'typescript' -import prettier, { Options as PrettierOptions } from 'prettier' -import path from 'path' -import { fileURLToPath } from 'url' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export const { version } = JSON.parse(fs.readFileSync(join(__dirname, '..', 'package.json')).toString()) - -export type DependencyVersions = { [key: string]: string } - -export const DATABASE_TYPES = ['mongodb', 'mysql', 'postgresql', 'sqlite', 'mssql', 'other'] as const - -/** - * The database types supported by this generator - */ -export type DatabaseType = (typeof DATABASE_TYPES)[number] - -/** - * Returns the name of the Feathers database adapter for a supported database type - * - * @param database The type of the database - * @returns The name of the adapter - */ -export const getDatabaseAdapter = (database: DatabaseType) => (database === 'mongodb' ? 'mongodb' : 'knex') - -export type FeathersAppInfo = { - /** - * The application language - */ - language: 'ts' | 'js' - /** - * The main database - */ - database: DatabaseType - /** - * The package manager used - */ - packager: 'yarn' | 'npm' | 'pnpm' - /** - * A list of all chosen transports - */ - transports: ('rest' | 'websockets')[] - /** - * The HTTP framework used - */ - framework: 'koa' | 'express' - /** - * The main schema definition format - */ - schema: 'typebox' | 'json' | false -} - -export interface AppPackageJson extends PackageJson { - feathers?: FeathersAppInfo -} - -export interface FeathersBaseContext extends PinionContext { - /** - * Information about the Feathers application (like chosen language, database etc.) - * usually taken from `package.json` - */ - feathers: FeathersAppInfo - /** - * The package.json file - */ - pkg: AppPackageJson - /** - * The folder where source files are put - */ - lib: string - /** - * The folder where test files are put - */ - test: string - /** - * The language the app is generated in - */ - language: 'js' | 'ts' - /** - * A list dependencies that should be installed with a certain version. - * Used for installing development dependencies during testing. - */ - dependencyVersions?: DependencyVersions -} - -/** - * Returns dependencies with the versions from the context attached (if available) - * - * @param dependencies The dependencies to install - * @param versions The dependency version list - * @returns A list of dependencies with their versions - */ -export const addVersions = (dependencies: string[], versions: DependencyVersions) => - dependencies.map((dep) => `${dep}@${versions[dep] ? versions[dep] : 'latest'}`) - -/** - * Loads the application package.json and populates information like the library and test directory - * and Feathers app specific information. - * - * @returns The updated context - */ -export const initializeBaseContext = - () => - (ctx: C) => - Promise.resolve(ctx) - .then(loadJSON(fromFile('package.json'), (pkg) => ({ pkg }), {})) - .then( - loadJSON(path.join(__dirname, '..', 'package.json'), (pkg: PackageJson) => ({ - dependencyVersions: { - ...pkg.devDependencies, - ...ctx.dependencyVersions, - '@feathersjs/cli': version - } - })) - ) - .then((ctx) => ({ - ...ctx, - lib: ctx.pkg?.directories?.lib || 'src', - test: ctx.pkg?.directories?.test || 'test', - language: ctx.language || ctx.pkg?.feathers?.language, - feathers: ctx.pkg?.feathers - })) - -/** - * Checks if the current context contains a valid generated application. This is necesary for most - * generators (besides the app generator). - * - * @param ctx The context to check against - * @returns Throws an error or returns the original context - */ -export const checkPreconditions = - () => - async (ctx: T) => { - if (!ctx.feathers) { - throw new Error(`Can not run generator since the current folder does not appear to be a Feathers application. -Either your package.json is missing or it does not have \`feathers\` property. -`) - } - - return ctx - } - -const importRegex = /from '(\..*)'/g -const escapeNewLines = (code: string) => code.replace(/\n\n/g, '\n/* :newline: */') -const restoreNewLines = (code: string) => code.replace(/\/\* :newline: \*\//g, '\n') -const fixLocalImports = (code: string) => code.replace(importRegex, "from '$1.js'") - -/** - * Returns the transpiled and prettified JavaScript for a TypeScript source code - * - * @param typescript The TypeScript source code - * @param options TypeScript transpilation options - * @returns The formatted JavaScript source code - */ -export const getJavaScript = (typescript: string, options: ts.TranspileOptions = {}) => { - const source = escapeNewLines(typescript) - const transpiled = ts.transpileModule(source, { - ...options, - compilerOptions: { - module: ts.ModuleKind.ESNext, - target: ts.ScriptTarget.ES2020, - preserveValueImports: true, - ...options.compilerOptions - } - }) - const { outputText } = transpiled - - if (outputText.startsWith('export {}') && typescript.startsWith('import')) { - return fixLocalImports(typescript) - } - - return fixLocalImports(restoreNewLines(transpiled.outputText)) -} - -const getFileName = async ( - target: Callable, - ctx: C -) => `${await getCallable(target, ctx)}.${ctx.language}` - -/** - * The default configuration for prettifying files - */ -export const PRETTIERRC: PrettierOptions = { - tabWidth: 2, - useTabs: false, - printWidth: 110, - semi: false, - trailingComma: 'none', - singleQuote: true -} - -/* - * Format a source file using Prettier. Will use the local configuration, the settings set in - * `options` or a default configuration - * - * @param target The file to prettify - * @param options The Prettier options - * @returns The updated context - */ -export const prettify = - ( - target: Callable, - options: PrettierOptions = PRETTIERRC - ) => - async (ctx: C) => { - const fileName = await getFileName(target, ctx) - const config = (await prettier.resolveConfig(ctx.cwd)) || options - const content = (await readFile(fileName)).toString() - - try { - await writeFile( - fileName, - await prettier.format(content, { - parser: ctx.language === 'ts' ? 'typescript' : 'babel', - ...config - }) - ) - } catch (error: any) { - throw new Error(`Error prettifying ${fileName}: ${error.message}`) - } - - return ctx - } - -/** - * Render a source file template for the language set in the context. - * - * @param templates The JavaScript and TypeScript template to render - * @param target The target filename without extension (will be added based on language) - * @returns The updated context - */ -export const renderSource = - ( - template: Callable, - target: Callable, - options?: { force: boolean } - ) => - async (ctx: C) => { - const { language } = ctx - const fileName = await getFileName(target, ctx) - const content = language === 'js' ? getJavaScript(await getCallable(template, ctx)) : template - const renderer = renderTemplate(content, fileName, options) - - return renderer(ctx).then(prettify(target)) - } - -export const install = - ( - dependencies: Callable, - dev: Callable, - packager: Callable - ) => - async (ctx: C) => { - const dependencyList = await getCallable(dependencies, ctx) - const packageManager = await getCallable(packager, ctx) - const flags = dev ? [packageManager === 'yarn' ? '--dev' : '--save-dev'] : [] - - return exec(packager, [packageManager === 'yarn' ? 'add' : 'install', ...dependencyList, ...flags])(ctx) - } - -/** - * Inject a source template as the language set in the context. - * - * @param template The source template to render - * @param location The location to inject the code to. Must use the target language. - * @param target The target file name - * @param transpile Set to `false` if the code should not be transpiled to JavaScript - * @returns - */ -export const injectSource = - ( - template: Callable, - location: Location, - target: Callable, - transpile = true - ) => - async (ctx: C) => { - const { language } = ctx - const source = - language === 'js' && transpile ? getJavaScript(await getCallable(template, ctx)) : template - const fileName = await getFileName(target, ctx) - const injector = inject(source, location, fileName) - - return injector(ctx).then(prettify(target)) - } - -/** - * Synchronously checks if a file exits - * @param context The base context - * @param filenames The filenames to check - * @returns Wether the file exists or not - */ -export const fileExists = (...filenames: string[]) => fs.existsSync(join(...filenames)) - -/** - * The helper used by Knex to create migration names - * @returns The current date and time in the format `YYYYMMDDHHMMSS` - */ -export const yyyymmddhhmmss = (offset = 0) => { - const now = new Date(Date.now() + offset) - - return ( - now.getUTCFullYear().toString() + - (now.getUTCMonth() + 1).toString().padStart(2, '0') + - now.getUTCDate().toString().padStart(2, '0') + - now.getUTCHours().toString().padStart(2, '0') + - now.getUTCMinutes().toString().padStart(2, '0') + - now.getUTCSeconds().toString().padStart(2, '0') - ) -} - -/** - * Render a template if `local` authentication strategy has been selected - * @param authStrategies The list of selected authentication strategies - * @param content The content to render if `local` is selected - * @param alt The content to render if `local` is not selected - * @returns - */ -export const localTemplate = (authStrategies: string[], content: string, alt = '') => - authStrategies.includes('local') ? content : alt - -/** - * Render a template if an `oauth` authentication strategy has been selected - * @param authStrategies - * @param content - * @returns - */ -export const oauthTemplate = (authStrategies: string[], content: string) => - authStrategies.filter((s) => s !== 'local').length > 0 ? content : '' diff --git a/packages/generators/src/connection/index.ts b/packages/generators/src/connection/index.ts deleted file mode 100644 index faffdd6d14..0000000000 --- a/packages/generators/src/connection/index.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { dirname } from 'path' -import { runGenerator, prompt, mergeJSON, toFile, when } from '@featherscloud/pinion' -import { fileURLToPath } from 'url' -import chalk from 'chalk' -import { - install, - FeathersBaseContext, - DatabaseType, - getDatabaseAdapter, - addVersions, - checkPreconditions, - initializeBaseContext -} from '../commons.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface ConnectionGeneratorContext extends FeathersBaseContext { - name?: string - database: DatabaseType - connectionString: string - dependencies: string[] -} - -export type ConnectionGeneratorArguments = FeathersBaseContext & - Partial> - -export const defaultConnectionString = (type: DatabaseType, name: string) => { - const connectionStrings = { - mongodb: `mongodb://127.0.0.1:27017/${name}`, - mysql: `mysql://root:@localhost:3306/${name}`, - postgresql: `postgres://postgres:@localhost:5432/${name}`, - sqlite: `${name}.sqlite`, - mssql: `mssql://root:password@localhost:1433/${name}`, - other: '' - } - - return connectionStrings[type] -} - -export const prompts = ({ database, connectionString, pkg, name }: ConnectionGeneratorArguments) => [ - { - name: 'database', - type: 'list', - when: !database, - message: 'Which database are you connecting to?', - suffix: chalk.grey(' Databases can be added at any time'), - choices: [ - { value: 'sqlite', name: 'SQLite' }, - { value: 'mongodb', name: 'MongoDB' }, - { value: 'postgresql', name: 'PostgreSQL' }, - { value: 'mysql', name: 'MySQL/MariaDB' }, - { value: 'mssql', name: 'Microsoft SQL' }, - { - value: 'other', - name: `Another database ${chalk.grey('(not configured automatically, use with custom services)')}` - } - ] - }, - { - name: 'connectionString', - type: 'input', - when: (answers: ConnectionGeneratorContext) => - !connectionString && database !== 'other' && answers.database !== 'other', - message: 'Enter your database connection string', - default: (answers: ConnectionGeneratorContext) => - defaultConnectionString(answers.database, answers.name || name || pkg.name) - } -] - -export const DATABASE_CLIENTS = { - mongodb: 'mongodb', - sqlite: 'sqlite3', - postgresql: 'pg', - mysql: 'mysql', - mssql: 'mssql' -} - -export const getDatabaseClient = (database: DatabaseType) => - database === 'other' ? null : DATABASE_CLIENTS[database] - -export const generate = (ctx: ConnectionGeneratorArguments) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then(checkPreconditions()) - .then(prompt(prompts)) - .then((ctx) => ctx as ConnectionGeneratorContext) - .then( - when( - (ctx) => ctx.database !== 'other', - runGenerator( - __dirname, - 'templates', - ({ database }) => `${getDatabaseAdapter(database)}.tpl.js` - ), - mergeJSON( - ({ connectionString, database }) => - getDatabaseAdapter(database) === 'knex' - ? { - [database]: { - client: getDatabaseClient(database), - connection: connectionString, - ...(database === 'sqlite' ? { useNullAsDefault: true } : {}) - } - } - : { - [database]: connectionString - }, - toFile('config', 'default.json') - ), - async (ctx: ConnectionGeneratorContext) => { - const dependencies: string[] = [] - const adapter = getDatabaseAdapter(ctx.database) - const dbClient = getDatabaseClient(ctx.database) - - dependencies.push(`@feathersjs/${adapter}`) - - if (adapter === 'knex') { - dependencies.push('knex') - } - - dependencies.push(dbClient) - - if (ctx.dependencies) { - return { - ...ctx, - dependencies: [...ctx.dependencies, ...dependencies] - } - } - - return install( - addVersions(dependencies, ctx.dependencyVersions), - false, - ctx.feathers.packager - )(ctx) - } - ) - ) diff --git a/packages/generators/src/connection/templates/knex.tpl.ts b/packages/generators/src/connection/templates/knex.tpl.ts deleted file mode 100644 index afa6ef6d79..0000000000 --- a/packages/generators/src/connection/templates/knex.tpl.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { toFile, before, mergeJSON } from '@featherscloud/pinion' -import { ConnectionGeneratorContext } from '../index.js' -import { injectSource, renderSource } from '../../commons.js' -import { mkdir } from 'fs/promises' -import path from 'path' - -const template = ({ - database -}: ConnectionGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/databases.html -import knex from 'knex' -import type { Knex } from 'knex' -import type { Application } from './declarations' - -declare module './declarations' { - interface Configuration { - ${database}Client: Knex - } -} - -export const ${database} = (app: Application) => { - const config = app.get('${database}') - const db = knex(config!) - - app.set('${database}Client', db) -} -` - -const knexfile = ({ - lib, - language, - database -}: ConnectionGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/databases.html -import { app } from './${lib}/app' - -// Load our database connection info from the app configuration -const config = app.get('${database}') - -${language === 'js' ? 'export default config' : 'module.exports = config'} -` - -const importTemplate = ({ database }: ConnectionGeneratorContext) => - `import { ${database} } from './${database}'` -const configureTemplate = ({ database }: ConnectionGeneratorContext) => `app.configure(${database})` - -const toAppFile = toFile(({ lib }) => [lib, 'app']) - -export const generate = (ctx: ConnectionGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib, database }) => [lib, database]) - ) - ) - .then(renderSource(knexfile, toFile('knexfile'))) - .then( - mergeJSON( - (ctx) => ({ - scripts: { - migrate: 'knex migrate:latest', - 'migrate:make': 'knex migrate:make' + (ctx.language === 'js' ? ' -x mjs' : ''), - test: 'cross-env NODE_ENV=test npm run migrate && npm run mocha' - } - }), - toFile('package.json') - ) - ) - .then(injectSource(importTemplate, before('import { services } from'), toAppFile)) - .then(injectSource(configureTemplate, before('app.configure(services)'), toAppFile)) - .then(async (ctx) => { - await mkdir(path.join(ctx.cwd, 'migrations')) - return ctx - }) diff --git a/packages/generators/src/connection/templates/mongodb.tpl.ts b/packages/generators/src/connection/templates/mongodb.tpl.ts deleted file mode 100644 index 87d765fc96..0000000000 --- a/packages/generators/src/connection/templates/mongodb.tpl.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { toFile, before, prepend, append } from '@featherscloud/pinion' -import { ConnectionGeneratorContext } from '../index.js' -import { injectSource, renderSource } from '../../commons.js' - -const template = ({ - database -}: ConnectionGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/databases.html -import { MongoClient } from 'mongodb' -import type { Db } from 'mongodb' -import type { Application } from './declarations' - -declare module './declarations' { - interface Configuration { - ${database}Client: Promise - } -} - -export const ${database} = (app: Application) => { - const connection = app.get('${database}') as string - const database = new URL(connection).pathname.substring(1) - const mongoClient = MongoClient.connect(connection) - .then(client => client.db(database)) - - app.set('${database}Client', mongoClient) -} -` - -const keywordImport = `import { keywordObjectId } from '@feathersjs/mongodb'` - -const keywordTemplate = `dataValidator.addKeyword(keywordObjectId) -queryValidator.addKeyword(keywordObjectId)` - -const importTemplate = ({ database }: ConnectionGeneratorContext) => - `import { ${database} } from './${database}'` -const configureTemplate = ({ database }: ConnectionGeneratorContext) => `app.configure(${database})` -const toAppFile = toFile(({ lib }) => [lib, 'app']) -const toValidatorFile = toFile(({ lib }) => [lib, 'validators']) - -export const generate = (ctx: ConnectionGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib, database }) => [lib, database]) - ) - ) - .then(injectSource(importTemplate, before('import { services } from'), toAppFile)) - .then(injectSource(configureTemplate, before('app.configure(services)'), toAppFile)) - .then(injectSource(keywordImport, prepend(), toValidatorFile)) - .then(injectSource(keywordTemplate, append(), toValidatorFile)) diff --git a/packages/generators/src/hook/index.ts b/packages/generators/src/hook/index.ts deleted file mode 100644 index fb4976b5ef..0000000000 --- a/packages/generators/src/hook/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { dirname } from 'path' -import { fileURLToPath } from 'url' -import { prompt, runGenerators } from '@featherscloud/pinion' -import _ from 'lodash' -import { checkPreconditions, FeathersBaseContext, initializeBaseContext } from '../commons.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface HookGeneratorContext extends FeathersBaseContext { - name: string - camelName: string - kebabName: string - type: 'regular' | 'around' -} - -export const generate = (ctx: HookGeneratorContext) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then(checkPreconditions()) - .then( - prompt(({ type, name }) => [ - { - type: 'input', - name: 'name', - message: 'What is the name of the hook?', - when: !name - }, - { - name: 'type', - type: 'list', - when: !type, - message: 'What kind of hook is it?', - choices: [ - { value: 'around', name: 'Around' }, - { value: 'regular', name: 'Before, After or Error' } - ] - } - ]) - ) - .then((ctx) => { - const { name } = ctx - const kebabName = _.kebabCase(name) - const camelName = _.camelCase(name) - - return { - ...ctx, - kebabName, - camelName - } - }) - .then(runGenerators(__dirname, 'templates')) diff --git a/packages/generators/src/hook/templates/hook.tpl.ts b/packages/generators/src/hook/templates/hook.tpl.ts deleted file mode 100644 index 3eac00ded0..0000000000 --- a/packages/generators/src/hook/templates/hook.tpl.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { HookGeneratorContext } from '../index.js' -import { renderSource } from '../../commons.js' - -const aroundTemplate = ({ - camelName, - name -}: HookGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/hook.html -import type { HookContext, NextFunction } from '../declarations' - -export const ${camelName} = async (context: HookContext, next: NextFunction) => { - console.log(\`Running hook ${name} on \${context.path}\.\${context.method}\`) - await next() -} -` - -const regularTemplate = ({ - camelName, - name -}: HookGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/hook.html -import type { HookContext } from '../declarations' - -export const ${camelName} = async (context: HookContext) => { - console.log(\`Running hook ${name} on \${context.path}\.\${context.method}\`) -}` - -export const generate = (ctx: HookGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - (ctx) => (ctx.type === 'around' ? aroundTemplate(ctx) : regularTemplate(ctx)), - toFile(({ lib, kebabName }) => [lib, 'hooks', kebabName]) - ) - ) diff --git a/packages/generators/src/index.ts b/packages/generators/src/index.ts deleted file mode 100644 index 3c28c6732f..0000000000 --- a/packages/generators/src/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from '@featherscloud/pinion' - -export * from './commons.js' -export * as app from './app/index.js' -export * as authentication from './authentication/index.js' -export * as connection from './connection/index.js' -export * as hook from './hook/index.js' -export * as service from './service/index.js' diff --git a/packages/generators/src/service/index.ts b/packages/generators/src/service/index.ts deleted file mode 100644 index f3268fde5b..0000000000 --- a/packages/generators/src/service/index.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { dirname } from 'path' -import _ from 'lodash' -import { runGenerator, runGenerators, prompt } from '@featherscloud/pinion' -import { fileURLToPath } from 'url' -import chalk from 'chalk' - -import { - checkPreconditions, - DATABASE_TYPES, - FeathersBaseContext, - fileExists, - getDatabaseAdapter, - initializeBaseContext -} from '../commons.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface ServiceGeneratorContext extends FeathersBaseContext { - /** - * The chosen service name - */ - name: string - /** - * The path the service is registered on - */ - path: string - /** - * The list of subfolders this service is in - */ - folder: string[] - /** - * The `camelCase` service name starting with a lowercase letter - */ - camelName: string - /** - * The `CamelCase` service name starting with an uppercase letter - */ - upperName: string - /** - * The service class name combined as `CamelCaseService` - */ - className: string - /** - * A kebab-cased (filename friendly) version of the service name - */ - kebabName: string - /** - * The actual filename (the last element of the path) - */ - fileName: string - /** - * The kebab-cased name of the path. Will be used for e.g. database names - */ - kebabPath: string - /** - * Indicates how many file paths we should go up to import other things (e.g. `../../`) - */ - relative: string - /** - * The chosen service type - */ - type: 'knex' | 'mongodb' | 'custom' - /** - * Which schema definition format to use - */ - schema: 'typebox' | 'json' | false - /** - * Wether this service uses authentication - */ - authentication: boolean - /** - * Set to true if this service is for an authentication entity - */ - isEntityService?: boolean - /** - * The authentication strategies (if it is an entity service) - */ - authStrategies: string[] -} - -/** - * Parameters the generator is called with - */ -export type ServiceGeneratorArguments = FeathersBaseContext & - Partial< - Pick - > - -export const generate = (ctx: ServiceGeneratorArguments) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then(checkPreconditions()) - .then( - prompt(({ name, path, type, schema, authentication, isEntityService, feathers, lib, language }) => { - const sqlDisabled = DATABASE_TYPES.every( - (name) => name === 'mongodb' || name === 'other' || !fileExists(lib, `${name}.${language}`) - ) - const mongodbDisabled = !fileExists(lib, `mongodb.${language}`) - - return [ - { - name: 'name', - type: 'input', - when: !name, - message: 'What is the name of your service?', - validate: (input: any) => { - if (!input || input === 'authentication') { - return 'Invalid service name' - } - - return true - } - }, - { - name: 'path', - type: 'input', - when: !path, - message: 'Which path should the service be registered on?', - default: (answers: ServiceGeneratorArguments) => `${_.kebabCase(answers.name)}`, - validate: (input: any) => { - if (!input || input === 'authentication') { - return 'Invalid service path' - } - - return true - } - }, - { - name: 'authentication', - type: 'confirm', - when: authentication === undefined && !isEntityService, - message: 'Does this service require authentication?' - }, - { - name: 'type', - type: 'list', - when: !type, - message: 'What database is the service using?', - default: getDatabaseAdapter(feathers?.database), - choices: [ - { - value: 'knex', - name: `SQL${sqlDisabled ? chalk.gray(' (connection not available)') : ''}`, - disabled: sqlDisabled - }, - { - value: 'mongodb', - name: `MongoDB${mongodbDisabled ? chalk.gray(' (connection not available)') : ''}`, - disabled: mongodbDisabled - }, - { - value: 'custom', - name: 'A custom service' - } - ] - }, - { - name: 'schema', - type: 'list', - when: schema === undefined, - message: 'Which schema definition format do you want to use?', - suffix: chalk.grey(' Schemas allow to type, validate, secure and populate data'), - default: feathers?.schema, - choices: (answers: ServiceGeneratorContext) => [ - { - value: 'typebox', - name: `TypeBox ${chalk.gray(' (recommended)')}` - }, - { - value: 'json', - name: 'JSON schema' - }, - { - value: false, - name: `No schema${ - answers.type !== 'custom' ? chalk.gray(' (not recommended with a database)') : '' - }` - } - ] - } - ] - }) - ) - .then(async (ctx): Promise => { - const { name, path, type, authStrategies = [] } = ctx as any as ServiceGeneratorContext - const kebabName = _.kebabCase(name) - const camelName = _.camelCase(name) - const upperName = _.upperFirst(camelName) - const className = `${upperName}Service` - - const folder = path.split('/').filter((el) => el !== '') - const relative = ['', ...folder].map(() => '..').join('/') - const fileName = _.last(folder) - const kebabPath = _.kebabCase(path) - - return { - name, - type, - path, - folder, - fileName, - upperName, - className, - kebabName, - camelName, - kebabPath, - relative, - authStrategies, - ...ctx - } as ServiceGeneratorContext - }) - .then(runGenerators(__dirname, 'templates')) - .then(runGenerator(__dirname, 'type', ({ type }) => `${type}.tpl.js`)) diff --git a/packages/generators/src/service/templates/client.tpl.ts b/packages/generators/src/service/templates/client.tpl.ts deleted file mode 100644 index 8e3891b575..0000000000 --- a/packages/generators/src/service/templates/client.tpl.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { toFile, after, before, when } from '@featherscloud/pinion' -import { fileExists, injectSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const importTemplate = ({ upperName, folder, fileName, camelName }: ServiceGeneratorContext) => /* ts */ ` -import { ${camelName}Client } from './services/${folder.join('/')}/${fileName}.shared' -export type { - ${upperName}, - ${upperName}Data, - ${upperName}Query, - ${upperName}Patch -} from './services/${folder.join('/')}/${fileName}.shared' -` - -const registrationTemplate = ({ camelName }: ServiceGeneratorContext) => - ` client.configure(${camelName}Client)` - -const toClientFile = toFile(({ lib }) => [lib, 'client']) - -export const generate = async (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ lib, language }) => fileExists(lib, `client.${language}`), - injectSource(registrationTemplate, before('return client'), toClientFile), - injectSource( - importTemplate, - after(({ language }) => - language === 'ts' ? 'import type { AuthenticationClientOptions }' : 'import authenticationClient' - ), - toClientFile - ) - ) - ) diff --git a/packages/generators/src/service/templates/schema.json.tpl.ts b/packages/generators/src/service/templates/schema.json.tpl.ts deleted file mode 100644 index 18143fc273..0000000000 --- a/packages/generators/src/service/templates/schema.json.tpl.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { fileExists, localTemplate, renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const authFieldsTemplate = (authStrategies: string[]) => - authStrategies - .map((name) => - name === 'local' - ? ` email: { type: 'string' }, - password: { type: 'string' }` - : ` ${name}Id: { type: 'string' }` - ) - .join(',\n') - -const template = ({ - camelName, - upperName, - fileName, - relative, - authStrategies, - isEntityService, - type, - cwd, - lib -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html -import { resolve, getValidator, querySyntax } from '@feathersjs/schema'${ - type === 'mongodb' - ? ` -import { ObjectIdSchema } from '@feathersjs/schema'` - : '' -} -import type { FromSchema } from '@feathersjs/schema' -${localTemplate(authStrategies, `import { passwordHash } from '@feathersjs/authentication-local'`)} - -import type { HookContext } from '${relative}/declarations' -import { dataValidator, queryValidator } from '${relative}/${ - fileExists(cwd, lib, 'schemas') ? 'schemas/' : '' // This is for legacy backwards compatibility -}validators' -import type { ${upperName}Service } from './${fileName}.class' - -// Main data model schema -export const ${camelName}Schema = { - $id: '${upperName}', - type: 'object', - additionalProperties: false, - required: [ '${type === 'mongodb' ? '_id' : 'id'}', ${localTemplate(authStrategies, `'email'`, `'text'`)} ], - properties: { - ${type === 'mongodb' ? `_id: ObjectIdSchema(),` : `id: { type: 'number' },`} - ${ - isEntityService - ? authFieldsTemplate(authStrategies) - : ` - text: { type: 'string' }` - } - } -} as const -export type ${upperName} = FromSchema -export const ${camelName}Validator = getValidator(${camelName}Schema, dataValidator) -export const ${camelName}Resolver = resolve<${upperName}, HookContext<${upperName}Service>>({}) - -export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext<${upperName}Service>>({ - ${localTemplate( - authStrategies, - `// The password should never be visible externally - password: async () => undefined` - )} -}) - -// Schema for creating new data -export const ${camelName}DataSchema = { - $id: '${upperName}Data', - type: 'object', - additionalProperties: false, - required: [ ${localTemplate(authStrategies, `'email'`, `'text'`)} ], - properties: { - ...${camelName}Schema.properties - } -} as const -export type ${upperName}Data = FromSchema -export const ${camelName}DataValidator = getValidator(${camelName}DataSchema, dataValidator) -export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext<${upperName}Service>>({ - ${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)} -}) - -// Schema for updating existing data -export const ${camelName}PatchSchema = { - $id: '${upperName}Patch', - type: 'object', - additionalProperties: false, - required: [], - properties: { - ...${camelName}Schema.properties - } -} as const -export type ${upperName}Patch = FromSchema -export const ${camelName}PatchValidator = getValidator(${camelName}PatchSchema, dataValidator) -export const ${camelName}PatchResolver = resolve<${upperName}Patch, HookContext<${upperName}Service>>({ - ${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)} -}) - -// Schema for allowed query properties -export const ${camelName}QuerySchema = { - $id: '${upperName}Query', - type: 'object', - additionalProperties: false, - properties: { - ...querySyntax(${camelName}Schema.properties) - } -} as const -export type ${upperName}Query = FromSchema -export const ${camelName}QueryValidator = getValidator(${camelName}QuerySchema, queryValidator) -export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext<${upperName}Service>>({ - ${ - isEntityService - ? ` - // If there is a user (e.g. with authentication), they are only allowed to see their own data - ${type === 'mongodb' ? '_id' : 'id'}: async (value, user, context) => { - if (context.params.user) { - return context.params.user.${type === 'mongodb' ? '_id' : 'id'} - } - - return value - }` - : '' - } -}) -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ schema }) => schema === 'json', - renderSource( - template, - toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.schema` - ]) - ) - ) - ) diff --git a/packages/generators/src/service/templates/schema.typebox.tpl.ts b/packages/generators/src/service/templates/schema.typebox.tpl.ts deleted file mode 100644 index 3f7203f5c3..0000000000 --- a/packages/generators/src/service/templates/schema.typebox.tpl.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { fileExists, localTemplate, renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const authFieldsTemplate = (authStrategies: string[]) => - authStrategies - .map((name) => - name === 'local' - ? ` email: Type.String(), - password: Type.Optional(Type.String())` - : ` ${name}Id: Type.Optional(Type.String())` - ) - .join(',\n') - -const template = ({ - camelName, - upperName, - fileName, - relative, - authStrategies, - isEntityService, - type, - cwd, - lib -}: ServiceGeneratorContext) => /* ts */ `// // For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html -import { resolve } from '@feathersjs/schema' -import { Type, getValidator, querySyntax } from '@feathersjs/typebox'${ - type === 'mongodb' - ? ` -import { ObjectIdSchema } from '@feathersjs/typebox'` - : '' -} -import type { Static } from '@feathersjs/typebox' -${localTemplate(authStrategies, `import { passwordHash } from '@feathersjs/authentication-local'`)} - -import type { HookContext } from '${relative}/declarations' -import { dataValidator, queryValidator } from '${relative}/${ - fileExists(cwd, lib, 'schemas') ? 'schemas/' : '' // This is for legacy backwards compatibility -}validators' -import type { ${upperName}Service } from './${fileName}.class' - -// Main data model schema -export const ${camelName}Schema = Type.Object({ - ${type === 'mongodb' ? '_id: ObjectIdSchema()' : 'id: Type.Number()'}, - ${isEntityService ? authFieldsTemplate(authStrategies) : `text: Type.String()`} - }, { $id: '${upperName}', additionalProperties: false }) -export type ${upperName} = Static -export const ${camelName}Validator = getValidator(${camelName}Schema, dataValidator) -export const ${camelName}Resolver = resolve<${upperName}, HookContext<${upperName}Service>>({}) - -export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext<${upperName}Service>>({ - ${localTemplate( - authStrategies, - `// The password should never be visible externally - password: async () => undefined` - )} -}) - -// Schema for creating new entries -export const ${camelName}DataSchema = Type.Pick(${camelName}Schema, [ - ${ - isEntityService - ? authStrategies.map((name) => (name === 'local' ? `'email', 'password'` : `'${name}Id'`)).join(', ') - : `'text'` - } -], { - $id: '${upperName}Data' -}) -export type ${upperName}Data = Static -export const ${camelName}DataValidator = getValidator(${camelName}DataSchema, dataValidator) -export const ${camelName}DataResolver = resolve<${upperName}, HookContext<${upperName}Service>>({ - ${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)} -}) - -// Schema for updating existing entries -export const ${camelName}PatchSchema = Type.Partial(${camelName}Schema, { - $id: '${upperName}Patch' -}) -export type ${upperName}Patch = Static -export const ${camelName}PatchValidator = getValidator(${camelName}PatchSchema, dataValidator) -export const ${camelName}PatchResolver = resolve<${upperName}, HookContext<${upperName}Service>>({ - ${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)} -}) - -// Schema for allowed query properties -export const ${camelName}QueryProperties = Type.Pick(${camelName}Schema, [ - '${type === 'mongodb' ? '_id' : 'id'}', ${ - isEntityService - ? authStrategies.map((name) => (name === 'local' ? `'email'` : `'${name}Id'`)).join(', ') - : `'text'` - } -]) -export const ${camelName}QuerySchema = Type.Intersect([ - querySyntax(${camelName}QueryProperties), - // Add additional query properties here - Type.Object({}, { additionalProperties: false }) -], { additionalProperties: false }) -export type ${upperName}Query = Static -export const ${camelName}QueryValidator = getValidator(${camelName}QuerySchema, queryValidator) -export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext<${upperName}Service>>({ - ${ - isEntityService - ? ` - // If there is a user (e.g. with authentication), they are only allowed to see their own data - ${type === 'mongodb' ? '_id' : 'id'}: async (value, user, context) => { - if (context.params.user) { - return context.params.user.${type === 'mongodb' ? '_id' : 'id'} - } - - return value - }` - : '' - } -}) -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ schema }) => schema === 'typebox', - renderSource( - template, - toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.schema` - ]) - ) - ) - ) diff --git a/packages/generators/src/service/templates/service.tpl.ts b/packages/generators/src/service/templates/service.tpl.ts deleted file mode 100644 index e0be40e1e0..0000000000 --- a/packages/generators/src/service/templates/service.tpl.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { toFile, after, prepend } from '@featherscloud/pinion' -import { fileExists, injectSource, renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -export const template = ({ - camelName, - authentication, - isEntityService, - path, - lib, - language, - className, - relative, - schema, - fileName -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.html -${authentication || isEntityService ? `import { authenticate } from '@feathersjs/authentication'` : ''} -${ - schema - ? ` -import { hooks as schemaHooks } from '@feathersjs/schema' - -import { - ${camelName}DataValidator, - ${camelName}PatchValidator, - ${camelName}QueryValidator, - ${camelName}Resolver, - ${camelName}ExternalResolver, - ${camelName}DataResolver, - ${camelName}PatchResolver, - ${camelName}QueryResolver -} from './${fileName}.schema' -` - : '' -} - -import type { Application } from '${relative}/declarations' -import { ${className}, getOptions } from './${fileName}.class' -${ - fileExists(lib, `client.${language}`) - ? `import { ${camelName}Path, ${camelName}Methods } from './${fileName}.shared'` - : ` -export const ${camelName}Path = '${path}' -export const ${camelName}Methods: Array = ['find', 'get', 'create', 'patch', 'remove']` -} - -export * from './${fileName}.class' -${schema ? `export * from './${fileName}.schema'` : ''} - -// A configure function that registers the service and its hooks via \`app.configure\` -export const ${camelName} = (app: Application) => { - // Register our service on the Feathers application - app.use(${camelName}Path, new ${className}(getOptions(app)), { - // A list of all methods this service exposes externally - methods: ${camelName}Methods, - // You can add additional custom events to be sent to clients here - events: [] - }) - // Initialize hooks - app.service(${camelName}Path).hooks({ - around: { - all: [${ - authentication - ? ` - authenticate('jwt'),` - : '' - } ${ - schema - ? ` - schemaHooks.resolveExternal(${camelName}ExternalResolver), - schemaHooks.resolveResult(${camelName}Resolver),` - : '' - } - ],${ - isEntityService - ? ` - find: [authenticate('jwt')], - get: [authenticate('jwt')], - create: [], - update: [authenticate('jwt')], - patch: [authenticate('jwt')], - remove: [authenticate('jwt')]` - : '' - } - }, - before: { - all: [${ - schema - ? ` - schemaHooks.validateQuery(${camelName}QueryValidator), - schemaHooks.resolveQuery(${camelName}QueryResolver) - ` - : '' - }], - find: [], - get: [], - create: [${ - schema - ? ` - schemaHooks.validateData(${camelName}DataValidator), - schemaHooks.resolveData(${camelName}DataResolver) - ` - : '' - }], - patch: [${ - schema - ? ` - schemaHooks.validateData(${camelName}PatchValidator), - schemaHooks.resolveData(${camelName}PatchResolver) - ` - : '' - }], - remove: [] - }, - after: { - all: [] - }, - error: { - all: [] - } - }) -} - -// Add this service to the service type index -declare module '${relative}/declarations' { - interface ServiceTypes { - [${camelName}Path]: ${className} - } -} -` - -const toServiceIndex = toFile(({ lib }: ServiceGeneratorContext) => [lib, 'services', `index`]) - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib, fileName, folder }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}` - ]) - ) - ) - .then( - injectSource( - ({ camelName, folder, fileName }) => - `import { ${camelName} } from './${folder.join('/')}/${fileName}'`, - prepend(), - toServiceIndex - ) - ) - .then( - injectSource( - ({ camelName }) => ` app.configure(${camelName})`, - after('export const services'), - toServiceIndex - ) - ) diff --git a/packages/generators/src/service/templates/shared.tpl.ts b/packages/generators/src/service/templates/shared.tpl.ts deleted file mode 100644 index e01192b906..0000000000 --- a/packages/generators/src/service/templates/shared.tpl.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { fileExists, renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const sharedTemplate = ({ - camelName, - upperName, - className, - fileName, - relative, - path -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.shared.html -import type { Params } from '@feathersjs/feathers' -import type { ClientApplication } from '${relative}/client' -import type { - ${upperName}, - ${upperName}Data, - ${upperName}Patch, - ${upperName}Query, - ${className} -} from './${fileName}.class' - -export type { ${upperName}, ${upperName}Data, ${upperName}Patch, ${upperName}Query } - -export type ${upperName}ClientService = Pick< - ${className}>, - typeof ${camelName}Methods[number] -> - -export const ${camelName}Path = '${path}' - -export const ${camelName}Methods: Array = ['find', 'get', 'create', 'patch', 'remove'] - -export const ${camelName}Client = (client: ClientApplication) => { - const connection = client.get('connection') - - client.use(${camelName}Path, connection.service(${camelName}Path), { - methods: ${camelName}Methods - }) -} - -// Add this service to the client service type index -declare module '${relative}/client' { - interface ServiceTypes { - [${camelName}Path]: ${upperName}ClientService - } -} -` - -export const generate = async (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ lib, language }) => fileExists(lib, `client.${language}`), - renderSource( - sharedTemplate, - toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.shared` - ]) - ) - ) - ) diff --git a/packages/generators/src/service/templates/test.tpl.ts b/packages/generators/src/service/templates/test.tpl.ts deleted file mode 100644 index bc79589278..0000000000 --- a/packages/generators/src/service/templates/test.tpl.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const template = ({ - relative, - lib, - path -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.test.html -import assert from 'assert' -import { app } from '../${relative}/${lib}/app' - -describe('${path} service', () => { - it('registered the service', () => { - const service = app.service('${path}') - - assert.ok(service, 'Registered the service') - }) -}) -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ test, folder, fileName }) => [ - test, - 'services', - ...folder, - `${fileName}.test` - ]) - ) - ) diff --git a/packages/generators/src/service/type/custom.tpl.ts b/packages/generators/src/service/type/custom.tpl.ts deleted file mode 100644 index 87fe14cd84..0000000000 --- a/packages/generators/src/service/type/custom.tpl.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -export const template = ({ - className, - upperName, - schema, - fileName, - relative -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.class.html#custom-services -import type { Id, NullableId, Params, ServiceInterface } from '@feathersjs/feathers' - -import type { Application } from '${relative}/declarations' -${ - schema - ? `import type { - ${upperName}, - ${upperName}Data, - ${upperName}Patch, - ${upperName}Query -} from './${fileName}.schema' -` - : ` -type ${upperName} = any -type ${upperName}Data = any -type ${upperName}Patch = any -type ${upperName}Query = any -` -} - -export type { ${upperName}, ${upperName}Data, ${upperName}Patch, ${upperName}Query } - -export interface ${className}Options { - app: Application -} - -export interface ${upperName}Params extends Params<${upperName}Query> { - -} - -// This is a skeleton for a custom service class. Remove or add the methods you need here -export class ${className} - implements ServiceInterface<${upperName}, ${upperName}Data, ServiceParams, ${upperName}Patch> { - constructor (public options: ${className}Options) { - } - - async find (_params?: ServiceParams): Promise<${upperName}[]> { - return [] - } - - async get (id: Id, _params?: ServiceParams): Promise<${upperName}> { - return { - id: 0, - text: \`A new message with ID: \${id}!\` - } - } - - async create (data: ${upperName}Data, params?: ServiceParams): Promise<${upperName}> - async create (data: ${upperName}Data[], params?: ServiceParams): Promise<${upperName}[]> - async create (data: ${upperName}Data|${upperName}Data[], params?: ServiceParams): Promise<${upperName}|${upperName}[]> { - if (Array.isArray(data)) { - return Promise.all(data.map(current => this.create(current, params))); - } - - return { - id: 0, - ...data - } - } - - // This method has to be added to the 'methods' option to make it available to clients - async update (id: NullableId, data: ${upperName}Data, _params?: ServiceParams): Promise<${upperName}> { - return { - id: 0, - ...data - } - } - - async patch (id: NullableId, data: ${upperName}Patch, _params?: ServiceParams): Promise<${upperName}> { - return { - id: 0, - text: \`Fallback for \${id}\`, - ...data - } - } - - async remove (id: NullableId, _params?: ServiceParams): Promise<${upperName}> { - return { - id: 0, - text: 'removed' - } - } -} - -export const getOptions = (app: Application) => { - return { app } -} -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` - ]) - ) - ) diff --git a/packages/generators/src/service/type/knex.tpl.ts b/packages/generators/src/service/type/knex.tpl.ts deleted file mode 100644 index aec6ca4407..0000000000 --- a/packages/generators/src/service/type/knex.tpl.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource, yyyymmddhhmmss } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const migrationTemplate = ({ - kebabPath, - authStrategies, - isEntityService -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/knexfile.html -import type { Knex } from 'knex' - -export async function up(knex: Knex): Promise { - await knex.schema.createTable('${kebabPath}', table => { - table.increments('id') - ${ - isEntityService - ? authStrategies - .map((name) => - name === 'local' - ? ` - table.string('email').unique() - table.string('password')` - : ` - table.string('${name}Id')` - ) - .join('\n') - : ` - table.string('text')` - } - }) -} - -export async function down(knex: Knex): Promise { - await knex.schema.dropTable('${kebabPath}') -} -` - -export const template = ({ - className, - upperName, - feathers, - schema, - fileName, - relative -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.class.html#database-services -import type { Params } from '@feathersjs/feathers' -import { KnexService } from '@feathersjs/knex' -import type { KnexAdapterParams, KnexAdapterOptions } from '@feathersjs/knex' - -import type { Application } from '${relative}/declarations' -${ - schema - ? `import type { - ${upperName}, - ${upperName}Data, - ${upperName}Patch, - ${upperName}Query -} from './${fileName}.schema' -` - : ` -type ${upperName} = any -type ${upperName}Data = any -type ${upperName}Patch = any -type ${upperName}Query = any -` -} - -export type { ${upperName}, ${upperName}Data, ${upperName}Patch, ${upperName}Query } - -export interface ${upperName}Params extends KnexAdapterParams<${upperName}Query> { -} - -// By default calls the standard Knex adapter service methods but can be customized with your own functionality. -export class ${className} - extends KnexService<${upperName}, ${upperName}Data, ${upperName}Params, ${upperName}Patch> { -} - -export const getOptions = (app: Application): KnexAdapterOptions => { - return { - paginate: app.get('paginate'), - Model: app.get('${feathers.database}Client'), - name: '${fileName}' - } -} -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` - ]) - ) - ) - .then( - renderSource( - migrationTemplate, - toFile('migrations', ({ kebabName }) => `${yyyymmddhhmmss()}_${kebabName}`) - ) - ) diff --git a/packages/generators/src/service/type/mongodb.tpl.ts b/packages/generators/src/service/type/mongodb.tpl.ts deleted file mode 100644 index 1a5d967a37..0000000000 --- a/packages/generators/src/service/type/mongodb.tpl.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -export const template = ({ - className, - upperName, - schema, - fileName, - kebabPath, - relative -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.class.html#database-services -import type { Params } from '@feathersjs/feathers' -import { MongoDBService } from \'@feathersjs/mongodb\' -import type { MongoDBAdapterParams, MongoDBAdapterOptions } from \'@feathersjs/mongodb\' - -import type { Application } from '${relative}/declarations' -${ - schema - ? `import type { - ${upperName}, - ${upperName}Data, - ${upperName}Patch, - ${upperName}Query -} from './${fileName}.schema' -` - : ` -type ${upperName} = any -type ${upperName}Data = any -type ${upperName}Patch = any -type ${upperName}Query = any -` -} - -export type { ${upperName}, ${upperName}Data, ${upperName}Patch, ${upperName}Query } - -export interface ${upperName}Params extends MongoDBAdapterParams<${upperName}Query> { -} - -// By default calls the standard MongoDB adapter service methods but can be customized with your own functionality. -export class ${className} - extends MongoDBService<${upperName}, ${upperName}Data, ${upperName}Params, ${upperName}Patch> { -} - -export const getOptions = (app: Application): MongoDBAdapterOptions => { - return { - paginate: app.get('paginate'), - Model: app.get('mongodbClient').then(db => db.collection('${kebabPath}')) - } -} -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` - ]) - ) - ) diff --git a/packages/generators/test/build/.gitkeep b/packages/generators/test/build/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/generators/test/commons.test.ts b/packages/generators/test/commons.test.ts deleted file mode 100644 index 86a74df146..0000000000 --- a/packages/generators/test/commons.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { strictEqual } from 'assert' -import { getJavaScript } from '../lib/commons' - -describe('common tests', () => { - it('getJavaScript returns transpiled JavaScript', () => { - const transpiled = getJavaScript( - `import bla from 'bla' -import something from './file' - -type X = { name: string } - -function test (arg: X) { - bla(something) -} - -// This is a comment -const otherThing: string = "Hello" -` - ) - - strictEqual( - transpiled, - `import bla from 'bla'; -import something from './file.js'; - - function test(arg) { - bla(something); -} - - // This is a comment -const otherThing = "Hello"; -` - ) - - strictEqual( - getJavaScript(`import { authentication } from './authentication'`), - `import { authentication } from './authentication.js'` - ) - }) -}) diff --git a/packages/generators/test/generators.test.ts b/packages/generators/test/generators.test.ts deleted file mode 100644 index 40aa06c8d2..0000000000 --- a/packages/generators/test/generators.test.ts +++ /dev/null @@ -1,176 +0,0 @@ -/* eslint-disable @typescript-eslint/prefer-for-of */ -import os from 'os' -import path from 'path' -import { mkdtemp } from 'fs/promises' -import assert from 'assert' -import { getContext } from '@featherscloud/pinion' - -import { AppGeneratorContext } from '../src/app' -import { FeathersBaseContext } from '../src/commons' -import { ConnectionGeneratorArguments } from '../src/connection' -import { ServiceGeneratorArguments } from '../src/service' -import { combinate, dependencyVersions } from './utils' - -import { generate as generateApp } from '../lib/app' -import { generate as generateConnection } from '../lib/connection' -import { generate as generateAuthentication } from '../lib/authentication' -import { generate as generateService } from '../lib/service' -import { listAllFiles } from '@featherscloud/pinion/lib/utils' -import { AuthenticationGeneratorArguments } from '../lib/authentication' - -const matrix = { - language: ['js', 'ts'] as const, - framework: ['koa', 'express'] as const, - schema: ['typebox', 'json'] as const -} - -const defaultCombination = { - language: process.env.FEATHERS_LANGUAGE || 'ts', - framework: process.env.FEATHERS_FRAMEWORK || 'koa', - schema: process.env.FEATHERS_SCHEMA || 'typebox' -} - -const combinations = - process.version > 'v16.0.0' ? (process.env.CI ? combinate(matrix as any) : [defaultCombination]) : [] - -describe('@feathersjs/generators', () => { - for (const { language, framework, schema } of combinations) { - describe(`${language} ${framework} app`, () => { - const name = `feathers_${language}_${framework}_${schema}` - - let context: FeathersBaseContext - let cwd: string - - before(async () => { - cwd = await mkdtemp(path.join(os.tmpdir(), name + '-')) - console.log(`\nGenerating test application to\n${cwd}\n\n`) - - try { - context = await generateApp( - getContext( - { - name, - framework, - language, - dependencyVersions, - client: true, - lib: 'src', - description: 'A Feathers test app', - packager: 'npm', - database: 'sqlite', - connectionString: `${name}.sqlite`, - transports: ['rest', 'websockets'], - schema - }, - { cwd } - ) - ) - } catch (error: any) { - console.error(error.stack) - console.error((await listAllFiles(cwd)).join('\n')) - throw error - } - }) - - it('generated app with SQLite and passes tests', async () => { - const testResult = await context.pinion.exec('npm', ['test'], { cwd }) - - assert.ok(context) - assert.strictEqual(testResult, 0) - }) - - it('generates authentication with SQLite and passes tests', async () => { - const authContext = await generateAuthentication( - getContext( - { - dependencyVersions, - authStrategies: ['local', 'github'], - service: 'user', - path: 'users', - type: 'knex', - schema - }, - { cwd } - ) - ) - const testResult = await context.pinion.exec('npm', ['test'], { cwd }) - - assert.ok(authContext) - assert.strictEqual(testResult, 0) - }) - - it('generates a MongoDB connection and service and passes tests', async () => { - const connectionContext = await generateConnection( - getContext( - { - dependencyVersions, - database: 'mongodb' as const, - connectionString: `mongodb://127.0.0.1:27017/${name}` - }, - { cwd } - ) - ) - const mongoService1Context = await generateService( - getContext( - { - dependencyVersions, - name: 'testing', - path: 'path/to/test', - authentication: true, - type: 'mongodb', - schema: false - }, - { cwd } - ) - ) - const messageServiceContext = await generateService( - getContext( - { - dependencyVersions, - name: 'message', - path: 'messages', - authentication: true, - type: 'mongodb', - schema - }, - { cwd } - ) - ) - const testResult = await context.pinion.exec('npm', ['test'], { cwd }) - - assert.ok(connectionContext) - assert.ok(mongoService1Context) - assert.ok(messageServiceContext) - assert.strictEqual(testResult, 0) - }) - - it('generates a custom service and passes tests', async () => { - const customServiceContext = await generateService( - getContext( - { - dependencyVersions, - name: 'Custom', - path: 'customized', - authentication: false, - type: 'custom', - schema - }, - { cwd } - ) - ) - const testResult = await context.pinion.exec('npm', ['test'], { cwd }) - - assert.ok(customServiceContext) - assert.strictEqual(testResult, 0) - }) - - it('compiles successfully', async () => { - if (language === 'ts' && framework === 'koa') { - const testResult = await context.pinion.exec('npm', ['run', 'compile'], { cwd }) - - assert.strictEqual(testResult, 0) - } - }) - }) - } -}) diff --git a/packages/generators/test/utils.ts b/packages/generators/test/utils.ts deleted file mode 100644 index 36a196c328..0000000000 --- a/packages/generators/test/utils.ts +++ /dev/null @@ -1,36 +0,0 @@ -import path from 'path' -import pkg from '../package.json' -import { DependencyVersions } from '../src/commons' -import { readFileSync } from 'fs' - -// Set __dirname in es module -const __dirname = path.dirname(new URL(import.meta.url).pathname) - -export function combinate>(obj: O) { - let combos: { [k in keyof O]: O[k][number] }[] = [] - for (const key of Object.keys(obj)) { - const values = obj[key] - const all: any[] = [] - for (let i = 0; i < values.length; i++) { - for (let j = 0; j < (combos.length || 1); j++) { - const newCombo = { ...combos[j], [key]: values[i] } - all.push(newCombo) - } - } - combos = all - } - return combos -} - -export const dependencyVersions = Object.keys(pkg.devDependencies as any) - .filter((dep) => dep.startsWith('@feathersjs/')) - .reduce((acc, dep) => { - const [, name] = dep.split('/') - const { version } = JSON.parse( - readFileSync(path.join(__dirname, '..', '..', name, 'package.json'), 'utf8').toString() - ) - - acc[dep] = path.join(__dirname, 'build', `feathersjs-${name}-${version}.tgz`) - - return acc - }, {} as DependencyVersions) diff --git a/packages/generators/tsconfig.json b/packages/generators/tsconfig.json deleted file mode 100644 index e7a844ccb1..0000000000 --- a/packages/generators/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib", - "module": "ESNext", - "moduleResolution": "Node" - } -} diff --git a/packages/knex/CHANGELOG.md b/packages/knex/CHANGELOG.md deleted file mode 100644 index fb800835de..0000000000 --- a/packages/knex/CHANGELOG.md +++ /dev/null @@ -1,243 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -### Bug Fixes - -- **knex:** use driver name to identify client ([#3527](https://github.com/feathersjs/feathers/issues/3527)) ([bb075ec](https://github.com/feathersjs/feathers/commit/bb075ec8beb3ac9b0a1a8aebc3c3756d970cc6a4)) - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- **knex:** Update commited to boolean type ([#3458](https://github.com/feathersjs/feathers/issues/3458)) ([5fa4dbc](https://github.com/feathersjs/feathers/commit/5fa4dbc06d0126ac18f5643562d0b74f03502caa)) - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -### Bug Fixes - -- **knex:** Fix Knex adapter date comparison queries ([#3429](https://github.com/feathersjs/feathers/issues/3429)) ([23bafe1](https://github.com/feathersjs/feathers/commit/23bafe1204f79ce2ab0eaaa5544fab1a3ffb5f41)) - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -### Bug Fixes - -- **generators:** Move generators and CLI to featherscloud/pinion ([#3386](https://github.com/feathersjs/feathers/issues/3386)) ([eb87c99](https://github.com/feathersjs/feathers/commit/eb87c9922db56c5610e5b808f3ffe033c830e2b2)) -- **knex:** Add sqlite to returning clients ([#3389](https://github.com/feathersjs/feathers/issues/3389)) ([59fb40b](https://github.com/feathersjs/feathers/commit/59fb40b9eb34950ef2dd35b7de4762f224a171f1)) - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -### Bug Fixes - -- **knex:** Add Error Handler to knex \_update function ([#3371](https://github.com/feathersjs/feathers/issues/3371)) ([210f103](https://github.com/feathersjs/feathers/commit/210f1037bf69c641d4fd335cd4f084cbbac0a922)) - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- allow \_patch to modify the entire base schema ([#3300](https://github.com/feathersjs/feathers/issues/3300)) ([0f41622](https://github.com/feathersjs/feathers/commit/0f41622307589b3a0b62ac411a73e6a601bda171)) -- **knex:** Add includeTriggerModifications for MSSQL support ([#3355](https://github.com/feathersjs/feathers/issues/3355)) ([cbe44b0](https://github.com/feathersjs/feathers/commit/cbe44b0e91506ab06c86355af67f83d5197bd896)) - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/knex - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) -- **knex:** Ensure that columns are selected unambigiously and avoid duplicate id selection ([#3144](https://github.com/feathersjs/feathers/issues/3144)) ([3eb7428](https://github.com/feathersjs/feathers/commit/3eb7428f888f0e8a0fbc09f5261bff3e68a0ed63)) -- **knex:** Get by id and transactions should work with params.knex ([#3146](https://github.com/feathersjs/feathers/issues/3146)) ([b172b5e](https://github.com/feathersjs/feathers/commit/b172b5ea9b461642874eb7d2ba01dc4cfc275155)) -- **knex:** Only apply default order for MSSQL ([#3145](https://github.com/feathersjs/feathers/issues/3145)) ([28c2627](https://github.com/feathersjs/feathers/commit/28c26279befea6cf43cedd3af628234b170b8c91)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **core:** Use Symbol.for to instantiate shared symbols ([#3087](https://github.com/feathersjs/feathers/issues/3087)) ([7f3fc21](https://github.com/feathersjs/feathers/commit/7f3fc2167576f228f8183568eb52b077160e8d65)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/knex - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/knex - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Bug Fixes - -- **knex:** The method getModel in the knex adapter ([#3043](https://github.com/feathersjs/feathers/issues/3043)) ([77e14dd](https://github.com/feathersjs/feathers/commit/77e14dd3f4a29adff8beb805d0e6186ead59e4fe)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **databases:** Ensure that query sanitization is not necessary when using query schemas ([#3022](https://github.com/feathersjs/feathers/issues/3022)) ([dbf514e](https://github.com/feathersjs/feathers/commit/dbf514e85d1508b95c007462a39b3cadd4ff391d)) -- **databases:** Improve documentation for adapters and allow dynamic Knex adapter options ([#3019](https://github.com/feathersjs/feathers/issues/3019)) ([66c4b5e](https://github.com/feathersjs/feathers/commit/66c4b5e72000dd03acb57fca1cad4737c85c9c9e)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -### Features - -- **database:** Add and to the query syntax ([#3021](https://github.com/feathersjs/feathers/issues/3021)) ([00cb0d9](https://github.com/feathersjs/feathers/commit/00cb0d9c302ae951ae007d3d6ceba33e254edd9c)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Bug Fixes - -- **databases:** Make sure adapter method signatures are exported properly ([#2943](https://github.com/feathersjs/feathers/issues/2943)) ([458d668](https://github.com/feathersjs/feathers/commit/458d66859e256c5854e7590f0b4a11b233fe0374)) -- **knex:** Ensure custom ids are returned on create ([#2934](https://github.com/feathersjs/feathers/issues/2934)) ([c4fa3cf](https://github.com/feathersjs/feathers/commit/c4fa3cf812d59e6e8e3831ab098bb8768c92e8f4)) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) -- **cli:** Use separate patch schema and types ([#2916](https://github.com/feathersjs/feathers/issues/2916)) ([7088af6](https://github.com/feathersjs/feathers/commit/7088af64a539dc7f1a016d832b77b98aaaf92603)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/knex - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/knex - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) -- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6)) - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -**Note:** Version bump only for package @feathersjs/knex - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) -- **knex:** Fix PostgreSQL integration issues and run CI tests against pg ([#2698](https://github.com/feathersjs/feathers/issues/2698)) ([1f71d78](https://github.com/feathersjs/feathers/commit/1f71d7884656c1494004931f4979ad59d23e4ee6)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/knex - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/knex - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -### Bug Fixes - -- **cli:** Generator fixes to work with the new guide ([#2674](https://github.com/feathersjs/feathers/issues/2674)) ([b773fa5](https://github.com/feathersjs/feathers/commit/b773fa5dbd7ff450cfb2f7b93e64882592262712)) - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **knex:** Add KnexJS SQL database adapter to core ([#2671](https://github.com/feathersjs/feathers/issues/2671)) ([9380fff](https://github.com/feathersjs/feathers/commit/9380fff58596e8bb90b8bb098d2795b7eadfec20)) diff --git a/packages/knex/LICENSE b/packages/knex/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/knex/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/knex/README.md b/packages/knex/README.md deleted file mode 100644 index 61a9eb209d..0000000000 --- a/packages/knex/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/knex - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/mongodb.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/mongodb) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers SQL service adapter using KnexJS - -## Installation - -``` -npm install @feathersjs/knex --save -``` - -## Documentation - -Refer to the [Feathers Knex adapter documentation](https://feathersjs.com/api/databases/knex.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/knex/package.json b/packages/knex/package.json deleted file mode 100644 index 2fc94433bf..0000000000 --- a/packages/knex/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "@feathersjs/knex", - "description": "Feathers SQL service adapter using KnexJS", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 14" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30" - }, - "peerDependencies": { - "knex": ">=3.1.0" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "knex": "^3.1.0", - "mocha": "^10.7.3", - "pg": "^8.12.0", - "shx": "^0.3.4", - "sqlite3": "^5.1.7", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/knex/src/adapter.ts b/packages/knex/src/adapter.ts deleted file mode 100644 index 7e559f53c2..0000000000 --- a/packages/knex/src/adapter.ts +++ /dev/null @@ -1,363 +0,0 @@ -import { Id, NullableId, Paginated, Query } from '@feathersjs/feathers' -import { _ } from '@feathersjs/commons' -import { AdapterBase, PaginationOptions, AdapterQuery, getLimit } from '@feathersjs/adapter-commons' -import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors' -import { Knex } from 'knex' - -import { errorHandler } from './error-handler' -import { KnexAdapterOptions, KnexAdapterParams } from './declarations' -const METHODS = { - $ne: 'whereNot', - $in: 'whereIn', - $nin: 'whereNotIn', - $or: 'orWhere', - $and: 'andWhere' -} - -const OPERATORS = { - $lt: '<', - $lte: '<=', - $gt: '>', - $gte: '>=', - $like: 'like', - $notlike: 'not like', - $ilike: 'ilike' -} - -const RETURNING_CLIENTS = ['postgresql', 'pg', 'oracledb', 'mssql', 'sqlite3'] - -export class KnexAdapter< - Result, - Data = Partial, - ServiceParams extends KnexAdapterParams = KnexAdapterParams, - PatchData = Partial -> extends AdapterBase { - schema?: string - - constructor(options: KnexAdapterOptions) { - if (!options || !options.Model) { - throw new Error('You must provide a Model (the initialized knex object)') - } - - if (typeof options.name !== 'string') { - throw new Error('No table name specified.') - } - - super({ - id: 'id', - ...options, - filters: { - ...options.filters, - $and: (value: any) => value - }, - operators: [...(options.operators || []), '$like', '$notlike', '$ilike'] - }) - } - - get fullName() { - const { name, schema } = this.getOptions({} as ServiceParams) - return schema ? `${schema}.${name}` : name - } - - get Model() { - return this.getModel() - } - - getModel(params: ServiceParams = {} as ServiceParams) { - const { Model } = this.getOptions(params) - return Model - } - - db(params?: ServiceParams) { - const { Model, name, schema } = this.getOptions(params) - - if (params && params.transaction && params.transaction.trx) { - const { trx } = params.transaction - // debug('ran %s with transaction %s', fullName, id) - return schema ? (trx.withSchema(schema).table(name) as Knex.QueryBuilder) : trx(name) - } - - return schema ? (Model.withSchema(schema).table(name) as Knex.QueryBuilder) : Model(name) - } - - knexify(knexQuery: Knex.QueryBuilder, query: Query = {}, parentKey?: string): Knex.QueryBuilder { - const knexify = this.knexify.bind(this) - - return Object.keys(query || {}).reduce((currentQuery, key) => { - const value = query[key] - - if (_.isObject(value) && !(value instanceof Date)) { - return knexify(currentQuery, value, key) - } - - const column = parentKey || key - const method = METHODS[key as keyof typeof METHODS] - - if (method) { - if (key === '$or' || key === '$and') { - // This will create a nested query - currentQuery.where(function (this: any) { - for (const condition of value) { - this[method](function (this: Knex.QueryBuilder) { - knexify(this, condition) - }) - } - }) - - return currentQuery - } - - return (currentQuery as any)[method](column, value) - } - - const operator = OPERATORS[key as keyof typeof OPERATORS] || '=' - - return operator === '=' - ? currentQuery.where(column, value) - : currentQuery.where(column, operator, value) - }, knexQuery) - } - - createQuery(params: ServiceParams = {} as ServiceParams) { - const { name, id } = this.getOptions(params) - const { filters, query } = this.filterQuery(params) - const builder = this.db(params) - - // $select uses a specific find syntax, so it has to come first. - if (filters.$select) { - const select = filters.$select.map((column) => (column.includes('.') ? column : `${name}.${column}`)) - // always select the id field, but make sure we only select it once - builder.select(...new Set([...select, `${name}.${id}`])) - } else { - builder.select(`${name}.*`) - } - - // build up the knex query out of the query params, include $and and $or filters - this.knexify(builder, { - ...query, - ..._.pick(filters, '$and', '$or') - }) - - // Handle $sort - if (filters.$sort) { - return Object.keys(filters.$sort).reduce( - (currentQuery, key) => currentQuery.orderBy(key, filters.$sort[key] === 1 ? 'asc' : 'desc'), - builder - ) - } - - return builder - } - - filterQuery(params: ServiceParams) { - const options = this.getOptions(params) - const { $select, $sort, $limit: _limit, $skip = 0, ...query } = (params.query || {}) as AdapterQuery - const $limit = getLimit(_limit, options.paginate) - - return { - paginate: options.paginate, - filters: { $select, $sort, $limit, $skip }, - query - } - } - - async _find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async _find(params?: ServiceParams & { paginate: false }): Promise - async _find(params?: ServiceParams): Promise | Result[]> - async _find(params: ServiceParams = {} as ServiceParams): Promise | Result[]> { - const { filters, paginate } = this.filterQuery(params) - const { name, id } = this.getOptions(params) - const builder = params.knex ? params.knex.clone() : this.createQuery(params) - const countBuilder = builder.clone().clearSelect().clearOrder().count(`${name}.${id} as total`) - - // Handle $limit - if (filters.$limit) { - builder.limit(filters.$limit) - } - - // Handle $skip - if (filters.$skip) { - builder.offset(filters.$skip) - } - - // provide default sorting if its not set - if (!filters.$sort && builder.client.driverName === 'mssql') { - builder.orderBy(`${name}.${id}`, 'asc') - } - - const data = filters.$limit === 0 ? [] : await builder.catch(errorHandler) - - if (paginate && paginate.default) { - const total = await countBuilder.then((count) => parseInt(count[0] ? count[0].total : 0)) - - return { - total, - limit: filters.$limit, - skip: filters.$skip || 0, - data - } - } - - return data - } - - async _findOrGet(id: NullableId, params?: ServiceParams) { - if (id !== null) { - const { name, id: idField } = this.getOptions(params) - const builder = params.knex ? params.knex.clone() : this.createQuery(params) - const idQuery = builder.andWhere(`${name}.${idField}`, '=', id).catch(errorHandler) - - return idQuery as Promise - } - - return this._find({ - ...params, - paginate: false - }) - } - - async _get(id: Id, params: ServiceParams = {} as ServiceParams): Promise { - const data = await this._findOrGet(id, params) - - if (data.length !== 1) { - throw new NotFound(`No record found for id '${id}'`) - } - - return data[0] - } - - async _create(data: Data, params?: ServiceParams): Promise - async _create(data: Data[], params?: ServiceParams): Promise - async _create(data: Data | Data[], _params?: ServiceParams): Promise - async _create( - _data: Data | Data[], - params: ServiceParams = {} as ServiceParams - ): Promise { - const data = _data as any - - if (Array.isArray(data)) { - return Promise.all(data.map((current) => this._create(current, params))) - } - - const { client } = this.db(params) - const returning = RETURNING_CLIENTS.includes(client.driverName) ? [this.id] : [] - const rows: any = await this.db(params) - .insert(data, returning, { includeTriggerModifications: true }) - .catch(errorHandler) - const id = data[this.id] || rows[0][this.id] || rows[0] - - if (!id) { - return rows as Result[] - } - - return this._get(id, { - ...params, - query: _.pick(params?.query || {}, '$select') - }) - } - - async _patch(id: null, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch(id: Id, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch( - id: NullableId, - data: PatchData | Partial, - _params?: ServiceParams - ): Promise - async _patch( - id: NullableId, - raw: PatchData | Partial, - params: ServiceParams = {} as ServiceParams - ): Promise { - if (id === null && !this.allowsMulti('patch', params)) { - throw new MethodNotAllowed('Can not patch multiple entries') - } - - const { name, id: idField } = this.getOptions(params) - const data = _.omit(raw, this.id) - const results = await this._findOrGet(id, { - ...params, - query: { - ...params?.query, - $select: [`${name}.${idField}`] - } - }) - const idList = results.map((current: any) => current[idField]) - const updateParams = { - ...params, - query: { - [`${name}.${idField}`]: { $in: idList }, - ...(params?.query?.$select ? { $select: params?.query?.$select } : {}) - } - } - const builder = this.createQuery(updateParams) - - await builder.update(data, [], { includeTriggerModifications: true }) - - const items = await this._findOrGet(null, updateParams) - - if (id !== null) { - if (items.length === 1) { - return items[0] - } else { - throw new NotFound(`No record found for id '${id}'`) - } - } - - return items - } - - async _update(id: Id, _data: Data, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null || Array.isArray(_data)) { - throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?") - } - - const data = _.omit(_data, this.id) - const oldData = await this._get(id, params) - const newObject = Object.keys(oldData).reduce((result: any, key) => { - if (key !== this.id) { - // We don't want the id field to be changed - result[key] = data[key] === undefined ? null : data[key] - } - - return result - }, {}) - - await this.db(params) - .update(newObject, '*', { includeTriggerModifications: true }) - .where(this.id, id) - .catch(errorHandler) - - return this._get(id, params) - } - - async _remove(id: null, params?: ServiceParams): Promise - async _remove(id: Id, params?: ServiceParams): Promise - async _remove(id: NullableId, _params?: ServiceParams): Promise - async _remove(id: NullableId, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null && !this.allowsMulti('remove', params)) { - throw new MethodNotAllowed('Can not remove multiple entries') - } - - const items = await this._findOrGet(id, params) - const { query } = this.filterQuery(params) - const q = this.db(params) - const idList = items.map((current: any) => current[this.id]) - - query[this.id] = { $in: idList } - - // build up the knex query out of the query params - this.knexify(q, query) - - await q.delete([], { includeTriggerModifications: true }).catch(errorHandler) - - if (id !== null) { - if (items.length === 1) { - return items[0] - } - - throw new NotFound(`No record found for id '${id}'`) - } - - return items - } -} diff --git a/packages/knex/src/declarations.ts b/packages/knex/src/declarations.ts deleted file mode 100644 index 70ad267dca..0000000000 --- a/packages/knex/src/declarations.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Knex } from 'knex' -import { AdapterServiceOptions, AdapterParams, AdapterQuery } from '@feathersjs/adapter-commons' - -export interface KnexAdapterOptions extends AdapterServiceOptions { - Model: Knex - name: string - schema?: string -} - -export interface KnexAdapterTransaction { - starting: boolean - parent?: KnexAdapterTransaction - committed?: Promise - resolve?: any - trx?: Knex.Transaction - id?: number - promise?: Promise -} - -export interface KnexAdapterParams extends AdapterParams> { - knex?: Knex.QueryBuilder - transaction?: KnexAdapterTransaction -} diff --git a/packages/knex/src/error-handler.ts b/packages/knex/src/error-handler.ts deleted file mode 100644 index 6f4e7dcdc7..0000000000 --- a/packages/knex/src/error-handler.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { errors } from '@feathersjs/errors' - -export const ERROR = Symbol.for('@feathersjs/knex/error') - -export function errorHandler(error: any) { - const { message } = error - let feathersError = error - - if (error.sqlState && error.sqlState.length) { - // remove SQLSTATE marker (#) and pad/truncate SQLSTATE to 5 chars - const sqlState = ('00000' + error.sqlState.replace('#', '')).slice(-5) - - switch (sqlState.slice(0, 2)) { - case '02': - feathersError = new errors.NotFound(message) - break - case '28': - feathersError = new errors.Forbidden(message) - break - case '08': - case '0A': - case '0K': - feathersError = new errors.Unavailable(message) - break - case '20': - case '21': - case '22': - case '23': - case '24': - case '25': - case '40': - case '42': - case '70': - feathersError = new errors.BadRequest(message) - break - default: - feathersError = new errors.GeneralError(message) - } - } else if (error.code === 'SQLITE_ERROR') { - // NOTE (EK): Error codes taken from - // https://www.sqlite.org/c3ref/c_abort.html - switch (error.errno) { - case 1: - case 8: - case 18: - case 19: - case 20: - feathersError = new errors.BadRequest(message) - break - case 2: - feathersError = new errors.Unavailable(message) - break - case 3: - case 23: - feathersError = new errors.Forbidden(message) - break - case 12: - feathersError = new errors.NotFound(message) - break - default: - feathersError = new errors.GeneralError(message) - break - } - } else if (typeof error.code === 'string' && error.severity && error.routine) { - // NOTE: Error codes taken from - // https://www.postgresql.org/docs/9.6/static/errcodes-appendix.html - // Omit query information - const messages = (error.message || '').split('-') - - error.message = messages[messages.length - 1] - - switch (error.code.slice(0, 2)) { - case '22': - feathersError = new errors.NotFound(message) - break - case '23': - feathersError = new errors.BadRequest(message) - break - case '28': - feathersError = new errors.Forbidden(message) - break - case '3D': - case '3F': - case '42': - feathersError = new errors.Unprocessable(message) - break - default: - feathersError = new errors.GeneralError(message) - break - } - } else if (!(error instanceof errors.FeathersError)) { - feathersError = new errors.GeneralError(message) - } - - feathersError[ERROR] = error - - throw feathersError -} diff --git a/packages/knex/src/hooks.ts b/packages/knex/src/hooks.ts deleted file mode 100644 index fe91519c2a..0000000000 --- a/packages/knex/src/hooks.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { createDebug } from '@feathersjs/commons' -import { HookContext } from '@feathersjs/feathers' -import { Knex } from 'knex' -import { KnexAdapterTransaction } from './declarations' - -const debug = createDebug('feathers-knex-transaction') - -const ROLLBACK = { rollback: true } - -export const getKnex = (context: HookContext): Knex => { - const knex = context.params?.knex - ? context.params.knex - : typeof context.service.getModel === 'function' && context.service.getModel(context.params) - - return knex && typeof knex.transaction === 'function' ? knex : undefined -} - -export const start = - () => - async (context: HookContext): Promise => { - const { transaction } = context.params - const parent = transaction - const knex: Knex = transaction ? transaction.trx : getKnex(context) - - if (!knex) { - return - } - - return new Promise((resolve, reject) => { - const transaction: KnexAdapterTransaction = { - starting: true - } - - if (parent) { - transaction.parent = parent - transaction.committed = parent.committed - } else { - transaction.committed = new Promise((resolve) => { - transaction.resolve = resolve - }) - } - - transaction.starting = true - transaction.promise = knex - .transaction((trx) => { - transaction.trx = trx - transaction.id = Date.now() - - context.params = { ...context.params, transaction } - debug('started a new transaction %s', transaction.id) - - resolve() - }) - .catch((error) => { - if (transaction.starting) { - reject(error) - } else if (error !== ROLLBACK) { - throw error - } - }) - }) - } - -export const end = () => (context: HookContext) => { - const { transaction } = context.params - - if (!transaction) { - return - } - - const { trx, id, promise, parent } = transaction - - context.params = { ...context.params, transaction: parent } - transaction.starting = false - - return trx - .commit() - .then(() => promise) - .then(() => transaction.resolve && transaction.resolve(true)) - .then(() => debug('ended transaction %s', id)) - .then(() => context) -} - -export const rollback = () => (context: HookContext) => { - const { transaction } = context.params - - if (!transaction) { - return - } - - const { trx, id, promise, parent } = transaction - - context.params = { ...context.params, transaction: parent } - transaction.starting = false - - return trx - .rollback(ROLLBACK) - .then(() => promise) - .then(() => transaction.resolve && transaction.resolve(false)) - .then(() => debug('rolled back transaction %s', id)) - .then(() => context) -} diff --git a/packages/knex/src/index.ts b/packages/knex/src/index.ts deleted file mode 100644 index 7f2c347302..0000000000 --- a/packages/knex/src/index.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { PaginationOptions } from '@feathersjs/adapter-commons' -import { MethodNotAllowed } from '@feathersjs/errors/lib' -import { Paginated, ServiceMethods, Id, NullableId, Params } from '@feathersjs/feathers' -import { KnexAdapter } from './adapter' -import { KnexAdapterParams } from './declarations' - -export * from './declarations' -export * from './adapter' -export * from './error-handler' -export * as transaction from './hooks' - -export class KnexService< - Result = any, - Data = Partial, - ServiceParams extends Params = KnexAdapterParams, - PatchData = Partial - > - extends KnexAdapter - implements ServiceMethods, Data, ServiceParams, PatchData> -{ - async find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async find(params?: ServiceParams & { paginate: false }): Promise - async find(params?: ServiceParams): Promise | Result[]> - async find(params?: ServiceParams): Promise | Result[]> { - return this._find({ - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async get(id: Id, params?: ServiceParams): Promise { - return this._get(id, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async create(data: Data, params?: ServiceParams): Promise - async create(data: Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - return this._create(data, params) - } - - async update(id: Id, data: Data, params?: ServiceParams): Promise { - return this._update(id, data, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async patch(id: Id, data: PatchData, params?: ServiceParams): Promise - async patch(id: null, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableId, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableId, data: PatchData, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._patch(id, data, { - ...params, - query - }) - } - - async remove(id: Id, params?: ServiceParams): Promise - async remove(id: null, params?: ServiceParams): Promise - async remove(id: NullableId, params?: ServiceParams): Promise - async remove(id: NullableId, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._remove(id, { - ...params, - query - }) - } -} diff --git a/packages/knex/test/connection.ts b/packages/knex/test/connection.ts deleted file mode 100644 index a471fa235b..0000000000 --- a/packages/knex/test/connection.ts +++ /dev/null @@ -1,32 +0,0 @@ -export default (DB: string) => { - if (DB === 'mysql') { - return { - client: 'mysql', - connection: { - host: '127.0.0.1', - user: 'root', - password: '', - database: 'feathers_knex' - } - } - } - - if (DB === 'postgres') { - return { - client: 'postgresql', - connection: { - host: 'localhost', - database: 'feathers', - user: 'postgres', - password: 'postgres' - } - } - } - - return { - client: 'sqlite3', - connection: { - filename: './db.sqlite' - } - } -} diff --git a/packages/knex/test/error-handler.test.ts b/packages/knex/test/error-handler.test.ts deleted file mode 100644 index 04723a45d1..0000000000 --- a/packages/knex/test/error-handler.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import assert from 'assert' -import { errorHandler } from '../src' - -describe('Knex Error handler', () => { - it('sqlState', () => { - assert.throws( - () => - errorHandler({ - sqlState: '#23503' - }), - { - name: 'BadRequest' - } - ) - }) - - it('sqliteError', () => { - assert.throws( - () => - errorHandler({ - code: 'SQLITE_ERROR', - errno: 1 - }), - { - name: 'BadRequest' - } - ) - assert.throws(() => errorHandler({ code: 'SQLITE_ERROR', errno: 2 }), { name: 'Unavailable' }) - assert.throws(() => errorHandler({ code: 'SQLITE_ERROR', errno: 3 }), { name: 'Forbidden' }) - assert.throws(() => errorHandler({ code: 'SQLITE_ERROR', errno: 12 }), { name: 'NotFound' }) - assert.throws(() => errorHandler({ code: 'SQLITE_ERROR', errno: 13 }), { name: 'GeneralError' }) - }) - - it('postgresqlError', () => { - assert.throws( - () => - errorHandler({ - code: '22P02', - message: 'Key (id)=(1) is not present in table "users".', - severity: 'ERROR', - routine: 'ExecConstraints' - }), - { - name: 'NotFound' - } - ) - assert.throws( - () => - errorHandler({ code: '2874', message: 'Something', severity: 'ERROR', routine: 'ExecConstraints' }), - { - name: 'Forbidden' - } - ) - assert.throws( - () => - errorHandler({ code: '3D74', message: 'Something', severity: 'ERROR', routine: 'ExecConstraints' }), - { - name: 'Unprocessable' - } - ) - assert.throws(() => errorHandler({ code: 'XYZ', severity: 'ERROR', routine: 'ExecConstraints' }), { - name: 'GeneralError' - }) - }) -}) diff --git a/packages/knex/test/index.test.ts b/packages/knex/test/index.test.ts deleted file mode 100644 index 7dbb736c38..0000000000 --- a/packages/knex/test/index.test.ts +++ /dev/null @@ -1,728 +0,0 @@ -import knex, { Knex } from 'knex' -import assert from 'assert' -import { feathers, HookContext, Service } from '@feathersjs/feathers' -import adapterTests from '@feathersjs/adapter-tests' -import { errors } from '@feathersjs/errors' -import { Ajv, getValidator, querySyntax, hooks } from '@feathersjs/schema' - -import connection from './connection' -import { ERROR, KnexAdapterParams, KnexService, transaction } from '../src/index' -import { AdapterQuery } from '@feathersjs/adapter-commons/lib' - -const testSuite = adapterTests([ - '.options', - '.events', - '._get', - '._find', - '._create', - '._update', - '._patch', - '._remove', - '.get', - '.get + $select', - '.get + id + query', - '.get + NotFound', - '.get + id + query id', - '.find', - '.remove', - '.remove + $select', - '.remove + id + query', - '.remove + multi', - '.remove + multi no pagination', - '.remove + id + query id', - '.update', - '.update + $select', - '.update + id + query', - '.update + NotFound', - '.update + query + NotFound', - '.update + id + query id', - '.patch', - '.patch + $select', - '.patch + id + query', - '.patch multiple', - '.patch multiple no pagination', - '.patch multi query same', - '.patch multi query changed', - '.patch + NotFound', - '.patch + query + NotFound', - '.patch + id + query id', - '.create', - '.create ignores query', - '.create + $select', - '.create multi', - 'internal .find', - 'internal .get', - 'internal .create', - 'internal .update', - 'internal .patch', - 'internal .remove', - '.find + equal', - '.find + equal multiple', - '.find + $sort', - '.find + $sort + string', - '.find + $limit', - '.find + $limit 0', - '.find + $skip', - '.find + $select', - '.find + $or', - '.find + $and', - '.find + $in', - '.find + $nin', - '.find + $lt', - '.find + $lte', - '.find + $gt', - '.find + $gte', - '.find + $ne', - '.find + $gt + $lt + $sort', - '.find + $or nested + $sort', - '.find + $and + $or', - 'params.adapter + paginate', - 'params.adapter + multi', - '.find + paginate', - '.find + paginate + query', - '.find + paginate + $limit + $skip', - '.find + paginate + $limit 0', - '.find + paginate + params' -]) - -const TYPE = process.env.TEST_DB || 'sqlite' -const db = knex(connection(TYPE) as any) - -// Create a public database to mimic a "schema" -const schemaName = 'public' - -const clean = async () => { - await db.schema.dropTableIfExists('todos') - await db.schema.dropTableIfExists(people.fullName) - await db.schema.createTable(people.fullName, (table) => { - table.increments('id') - table.string('name').notNullable() - table.integer('age') - table.integer('time') - table.boolean('created') - return table - }) - await db.schema.createTable('todos', (table) => { - table.increments('id') - table.string('text') - table.integer('personId') - return table - }) - await db.schema.dropTableIfExists(peopleId.fullName) - await db.schema.createTable(peopleId.fullName, (table) => { - table.increments('customid') - table.string('name') - table.integer('age') - table.integer('time') - table.boolean('created') - return table - }) - - await db.schema.dropTableIfExists(users.fullName) - await db.schema.createTable(users.fullName, (table) => { - table.increments('id') - table.string('name') - table.integer('age') - table.integer('time') - table.boolean('created') - return table - }) -} - -const personSchema = { - $id: 'Person', - type: 'object', - additionalProperties: false, - required: ['_id', 'name', 'age'], - properties: { - id: { type: 'number' }, - name: { type: 'string' }, - age: { type: ['number', 'null'] }, - time: { type: 'string' }, - create: { type: 'boolean' } - } -} as const -const personQuery = { - $id: 'PersonQuery', - type: 'object', - additionalProperties: false, - properties: { - ...querySyntax(personSchema.properties, { - name: { - $like: { type: 'string' }, - $ilike: { type: 'string' }, - $notlike: { type: 'string' } - } - }) - } -} as const -const validator = new Ajv({ - coerceTypes: true -}) -const personQueryValidator = getValidator(personQuery, validator) - -type Person = { - id: number - name: string - age: number | null - time: string - create: boolean -} - -type Todo = { - id: number - text: string - personId: number - personName: string -} - -type ServiceTypes = { - people: KnexService - 'people-customid': KnexService - users: KnexService - todos: KnexService -} - -class TodoService extends KnexService { - createQuery(params: KnexAdapterParams) { - const query = super.createQuery(params) - - query.join('people as person', 'todos.personId', 'person.id').select('person.name as personName') - - return query - } -} - -const people = new KnexService({ - Model: db, - name: 'people', - events: ['testing'] -}) - -const peopleId = new KnexService({ - Model: db, - id: 'customid', - name: 'people-customid', - events: ['testing'] -}) - -const users = new KnexService({ - Model: db, - name: 'users', - events: ['testing'] -}) - -const todos = new TodoService({ - Model: db, - name: 'todos' -}) - -describe('Feathers Knex Service', () => { - const app = feathers() - .hooks({ - before: [transaction.start()], - after: [transaction.end()], - error: [transaction.rollback()] - }) - .use('people', people) - .use('people-customid', peopleId) - .use('users', users) - .use('todos', todos) - const peopleService = app.service('people') - - peopleService.hooks({ - before: { - find: [hooks.validateQuery(personQueryValidator)] - } - }) - before(() => { - if (TYPE === 'sqlite') { - // Attach the public database to mimic a "schema" - db.schema.raw(`attach database '${schemaName}.sqlite' as ${schemaName}`) - } - }) - before(clean) - after(clean) - - describe('$like method', () => { - let charlie: Person - - beforeEach(async () => { - charlie = await peopleService.create({ - name: 'Charlie Brown', - age: 10 - }) - }) - - afterEach(() => peopleService.remove(charlie.id)) - - it('$like in query', async () => { - const data = await peopleService.find({ - paginate: false, - query: { name: { $like: '%lie%' } } - }) - - assert.strictEqual(data[0].name, 'Charlie Brown') - }) - }) - - describe('$notlike method', () => { - let hasMatch: Person - let hasNoMatch: Person - - beforeEach(async () => { - hasMatch = await peopleService.create({ - name: 'XYZabcZYX' - }) - hasNoMatch = await peopleService.create({ - name: 'XYZZYX' - }) - }) - - afterEach(() => { - peopleService.remove(hasMatch.id) - peopleService.remove(hasNoMatch.id) - }) - - it('$notlike in query', async () => { - const data = await peopleService.find({ - paginate: false, - query: { name: { $notlike: '%abc%' } } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'XYZZYX') - }) - }) - - describe('adapter specifics', () => { - let daves: Person[] - - beforeEach(async () => { - daves = await Promise.all([ - peopleService.create({ - name: 'Ageless', - age: null - }), - peopleService.create({ - name: 'Dave', - age: 32 - }), - peopleService.create({ - name: 'Dada', - age: 1 - }) - ]) - }) - - afterEach(async () => { - try { - await peopleService.remove(daves[0].id) - await peopleService.remove(daves[1].id) - await peopleService.remove(daves[2].id) - } catch (error: unknown) {} - }) - - it('$or works properly (#120)', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - name: 'Dave', - $or: [ - { - age: 1 - }, - { - age: 32 - } - ] - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Dave') - assert.strictEqual(data[0].age, 32) - }) - - it('$and works properly', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - $and: [ - { - $or: [{ name: 'Dave' }, { name: 'Dada' }] - }, - { - age: { $lt: 23 } - } - ] - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Dada') - assert.strictEqual(data[0].age, 1) - }) - - it('where conditions support NULL values properly', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - age: null - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Ageless') - assert.strictEqual(data[0].age, null) - }) - - it('where conditions support NOT NULL case properly', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - age: { $ne: null } - } - }) - - assert.strictEqual(data.length, 2) - assert.notStrictEqual(data[0].name, 'Ageless') - assert.notStrictEqual(data[0].age, null) - assert.notStrictEqual(data[1].name, 'Ageless') - assert.notStrictEqual(data[1].age, null) - }) - - it('where conditions support NULL values within AND conditions', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - age: null, - name: 'Ageless' - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Ageless') - assert.strictEqual(data[0].age, null) - }) - - it('where conditions support NULL values within OR conditions', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - $or: [ - { - age: null - }, - { - name: 'Dada' - } - ] - } - }) - - assert.strictEqual(data.length, 2) - assert.notStrictEqual(data[0].name, 'Dave') - assert.notStrictEqual(data[0].age, 32) - assert.notStrictEqual(data[1].name, 'Dave') - assert.notStrictEqual(data[1].age, 32) - }) - - it('attaches the SQL error', async () => { - await assert.rejects( - () => peopleService.create({}), - (error: any) => { - assert.ok(error[ERROR]) - return true - } - ) - }) - - it('get by id works with `createQuery` as params.knex', async () => { - const knex = peopleService.createQuery() - const dave = await peopleService.get(daves[0].id, { knex }) - - assert.deepStrictEqual(dave, daves[0]) - }) - }) - - describe('hooks', () => { - type ModelStub = { getModel: () => Knex } - - afterEach(async () => { - await db('people').truncate() - }) - - it('does reject on problem with commit', async () => { - const app = feathers() - - app.hooks({ - before: transaction.start(), - after: [ - (context: HookContext) => { - const client = context.params.transaction.trx.client - const query = client.query - - client.query = (conn: any, sql: any) => { - let result = query.call(client, conn, sql) - - if (sql === 'COMMIT;') { - result = result.then(() => { - throw new TypeError('Deliberate') - }) - } - - return result - } - }, - transaction.end() - ], - error: transaction.rollback() - }) - - app.use('/people', people) - - await assert.rejects(() => app.service('/people').create({ name: 'Foo' }), { - message: 'Deliberate' - }) - }) - - it('does commit, rollback, nesting', async () => { - const app = feathers<{ - people: typeof people - test: Pick & ModelStub - }>() - - app.hooks({ - before: transaction.start(), - after: transaction.end(), - error: transaction.rollback() - }) - - app.use('people', people) - - app.use('test', { - getModel: () => db, - create: async (data: any, params) => { - const created = await app.service('people').create({ name: 'Foo' }, { ...params }) - - if (data.throw) { - throw new TypeError('Deliberate') - } - - return created - } - }) - - await assert.rejects(() => app.service('test').create({ throw: true }), { - message: 'Deliberate' - }) - - assert.strictEqual((await app.service('people').find({ paginate: false })).length, 0) - - await app.service('test').create({}) - - assert.strictEqual((await app.service('people').find({ paginate: false })).length, 1) - }) - - it('does use savepoints for nested calls', async () => { - const app = feathers<{ - people: typeof people - success: Pick & ModelStub - fail: Pick & ModelStub - test: Pick & ModelStub - }>() - - app.hooks({ - before: transaction.start(), - after: transaction.end(), - error: transaction.rollback() - }) - - app.use('people', people) - - app.use('success', { - getModel: () => db, - create: async (_data, params) => { - return app.service('people').create({ name: 'Success' }, { ...params }) - } - }) - - app.use('fail', { - getModel: () => db, - create: async (_data, params) => { - await app.service('people').create({ name: 'Fail' }, { ...params }) - throw new TypeError('Deliberate') - } - }) - - app.use('test', { - getModel: () => db, - create: async (_data, params) => { - await app.service('success').create({}, { ...params }) - await app - .service('fail') - .create({}, { ...params }) - // eslint-disable-next-line @typescript-eslint/no-empty-function - .catch(() => {}) - return [] - } - }) - - await app.service('test').create({}) - - const created = await app.service('people').find({ paginate: false }) - - assert.strictEqual(created.length, 1) - assert.ok(created[0].name) - }) - - it('allows waiting for transaction to complete', async () => { - const app = feathers<{ - people: typeof people - test: Pick & ModelStub - }>() - - let seq: string[] = [] - - app.hooks({ - before: [ - transaction.start(), - (context: HookContext) => { - seq.push(`${context.path}: waiting for trx to be committed`) - context.params.transaction.committed.then((success: any) => { - seq.push(`${context.path}: committed ${success}`) - }) - }, - async (context: HookContext) => { - seq.push(`${context.path}: another hook`) - } - ], - after: [ - transaction.end(), - (context: HookContext) => { - seq.push(`${context.path}: trx ended`) - } - ], - error: [ - transaction.rollback(), - (context: HookContext) => { - seq.push(`${context.path}: trx rolled back`) - } - ] - }) - - app.use('people', people) - - app.use('test', { - getModel: () => db, - create: async (data: any, params) => { - const peeps = await app.service('people').create({ name: 'Foo' }, { ...params }) - - if (data.throw) { - throw new TypeError('Deliberate') - } - return peeps - } - }) - - assert.deepStrictEqual(seq, []) - - await assert.rejects(() => app.service('test').create({ throw: true }), { - message: 'Deliberate' - }) - - assert.deepStrictEqual(seq, [ - 'test: waiting for trx to be committed', - 'test: another hook', - 'people: waiting for trx to be committed', - 'people: another hook', - 'people: trx ended', - 'test: committed false', - 'people: committed false', - 'test: trx rolled back' - ]) - - seq = [] - - assert.strictEqual((await app.service('people').find({ paginate: false })).length, 0) - - assert.deepStrictEqual(seq, [ - 'people: waiting for trx to be committed', - 'people: another hook', - 'people: committed true', - 'people: trx ended' - ]) - - seq = [] - - await app.service('test').create({}) - - assert.deepStrictEqual(seq, [ - 'test: waiting for trx to be committed', - 'test: another hook', - 'people: waiting for trx to be committed', - 'people: another hook', - 'people: trx ended', - 'test: committed true', - 'people: committed true', - 'test: trx ended' - ]) - - seq = [] - - assert.strictEqual((await app.service('people').find({ paginate: false })).length, 1) - - assert.deepStrictEqual(seq, [ - 'people: waiting for trx to be committed', - 'people: another hook', - 'people: committed true', - 'people: trx ended' - ]) - }) - }) - - describe('associations', () => { - const todoService = app.service('todos') - - it('create, query and get with associations, can unambigiously $select', async () => { - const dave = await peopleService.create({ - name: 'Dave', - age: 133 - }) - const todo = await todoService.create({ - text: 'Do dishes', - personId: dave.id - }) - - const [found] = await todoService.find({ - paginate: false, - query: { - 'person.age': { $gt: 100 } - } - }) - const got = await todoService.get(todo.id) - - assert.deepStrictEqual( - await todoService.get(todo.id, { - query: { $select: ['id', 'text'] } - }), - { - id: todo.id, - text: todo.text, - personName: 'Dave' - } - ) - assert.strictEqual(got.personName, dave.name) - assert.deepStrictEqual(got, todo) - assert.deepStrictEqual(found, todo) - - peopleService.remove(dave.id) - todoService.remove(todo.id) - }) - }) - - testSuite(app, errors, 'users') - testSuite(app, errors, 'people') - testSuite(app, errors, 'people-customid', 'customid') -}) diff --git a/packages/knex/test/overrides.test.ts b/packages/knex/test/overrides.test.ts deleted file mode 100644 index dcd0f1fad5..0000000000 --- a/packages/knex/test/overrides.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -import knex from 'knex' -import assert from 'assert' -import { feathers, Paginated } from '@feathersjs/feathers' -import { KnexAdapterParams, KnexService, transaction } from '../src' -import { PaginationOptions } from '@feathersjs/adapter-commons' - -// const { transaction } = service.hooks - -const db = knex({ - client: 'sqlite3', - connection: { - filename: './db.sqlite' - } -}) - -const schemaName = 'overrides' - -knex({ - client: 'sqlite3', - connection: { - filename: `./${schemaName}.sqlite` - } -}) - -type Animal = { - id: number - ancestor_id: number - ancestor_name: string - name: string -} - -/** - * Override the _find() method to manipulate the knex query, and - * introduce ambiguity by the table to itself. - */ -class AnimalService extends KnexService { - async _find(params?: P & { paginate?: PaginationOptions }): Promise> - async _find(params?: P & { paginate: false }): Promise - async _find(params?: P): Promise | T[]> - async _find(params: P = {} as P): Promise | T[]> { - const knexQuery = this.createQuery(params) - knexQuery - .select('ancestors.name as ancestor_name') - .leftJoin('animals as ancestors', 'ancestors.id', '=', 'animals.ancestor_id') - params.knex = knexQuery - return super._find(params) - } -} - -const animals = new AnimalService({ - Model: db, - name: 'animals', - events: ['testing'] -}) - -function clean() { - return db.schema.dropTableIfExists(animals.fullName).then(() => { - return db.schema.createTable(animals.fullName, (table) => { - table.increments('id') - table.integer('ancestor_id') - table.string('name').notNullable() - return table - }) - }) -} - -describe('Feathers Knex Overridden Method With Self-Join', () => { - let ancestor: Animal - let animal: Animal - - const app = feathers<{ animals: AnimalService }>() - .hooks({ - before: [transaction.start()], - after: [transaction.end()], - error: [transaction.rollback()] - }) - .use('animals', animals) - const animalService = app.service('animals') - - before(() => { - return db.schema.raw(`attach database '${schemaName}.sqlite' as ${schemaName}`) - }) - before(clean) - after(clean) - - beforeEach(async () => { - ancestor = await animalService.create({ - name: 'Ape' - }) - animal = await animalService.create({ - ancestor_id: ancestor.id, - name: 'Human' - }) - }) - - it('finds properly', async () => { - const foundAnimals = await animalService.find({ - paginate: false, - query: { - $limit: 1, - ancestor_name: 'Ape' - } - }) - assert.strictEqual(foundAnimals[0].id, animal.id) - assert.strictEqual(foundAnimals[0].name, 'Human') - assert.strictEqual(foundAnimals[0].ancestor_name, 'Ape') - }) - - /** - * Previously, any query modified to include joins with ambiguous primary keys - * would yield an ambiguous column errors: - * BadRequest: select `animals`.* - * from `animals` - * left join `animals` as `ancestors` on `ancestors`.`id` = `animals`.`ancestor_id` - * where `id` in (2) - SQLITE_ERROR: ambiguous column name: id - * - * The fix involves explicitly specifying the table to query in the _patch() method - */ - it('patches without ambiguous query', async () => { - const newName = 'Homo Sapiens' - const patchedAnimal = await animalService.patch(animal.id, { name: newName }) - - assert.strictEqual(patchedAnimal.name, newName) - }) - - it('get the service model (getModel)', async () => { - const model = animalService.Model - const options = animalService.options - - assert.strictEqual(model, options.Model) - }) -}) diff --git a/packages/knex/tsconfig.json b/packages/knex/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/knex/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/koa/CHANGELOG.md b/packages/koa/CHANGELOG.md deleted file mode 100644 index 5cd24964f0..0000000000 --- a/packages/koa/CHANGELOG.md +++ /dev/null @@ -1,329 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -### Bug Fixes - -- **koa:** Ensure .teardown works without a server ([#3234](https://github.com/feathersjs/feathers/issues/3234)) ([818572d](https://github.com/feathersjs/feathers/commit/818572df98456bc3e1a300e879329aa8f849be64)) - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/koa - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **koa:** Replace koa-bodyparser with koa-body ([#3093](https://github.com/feathersjs/feathers/issues/3093)) ([2456bf8](https://github.com/feathersjs/feathers/commit/2456bf882c99ae2cddd1a39bffba7e61217fc055)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -### Bug Fixes - -- **koa:** Make Koa app inspectable ([#3069](https://github.com/feathersjs/feathers/issues/3069)) ([4fbbfff](https://github.com/feathersjs/feathers/commit/4fbbfff2a3c625f8e6929e5a09e2cf7b739ffe11)) - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -### Bug Fixes - -- **koa:** Fix missing dependency on feathers ([#3061](https://github.com/feathersjs/feathers/issues/3061)) ([80dc95f](https://github.com/feathersjs/feathers/commit/80dc95ff85c9074b8f70e3ff71562f18863ef2be)) - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **transports:** Add remaining middleware for generated apps to Koa and Express ([#2796](https://github.com/feathersjs/feathers/issues/2796)) ([0d5781a](https://github.com/feathersjs/feathers/commit/0d5781a5c72a0cbb2ec8211bfa099f0aefe115a2)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Bug Fixes - -- **koa:** Only set error code for Feathers errors ([#2793](https://github.com/feathersjs/feathers/issues/2793)) ([d3ee41e](https://github.com/feathersjs/feathers/commit/d3ee41e27b0ea5d29b344d6584ab03e48d16e2b4)) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Bug Fixes - -- **core:** Ensure setup and teardown can be overriden and maintain hook functionality ([#2779](https://github.com/feathersjs/feathers/issues/2779)) ([ab580cb](https://github.com/feathersjs/feathers/commit/ab580cbcaa68d19144d86798c13bf564f9d424a6)) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Features - -- Add CORS support to oAuth, Express, Koa and generated application ([#2744](https://github.com/feathersjs/feathers/issues/2744)) ([fd218f2](https://github.com/feathersjs/feathers/commit/fd218f289f8ca4c101e9938e8683e2efef6e8131)) - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **cli:** Add support for JavaScript to the new CLI ([#2668](https://github.com/feathersjs/feathers/issues/2668)) ([ebac587](https://github.com/feathersjs/feathers/commit/ebac587f7d00dc7607c3f546352d79f79b89a5d4)) -- **cli:** Initial Feathers v5 CLI and Pinion generator ([#2578](https://github.com/feathersjs/feathers/issues/2578)) ([7f59ae7](https://github.com/feathersjs/feathers/commit/7f59ae7f1471895ba8a82aa4702f1a23f71b7682)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **core:** Add app.teardown functionality ([#2570](https://github.com/feathersjs/feathers/issues/2570)) ([fcdf524](https://github.com/feathersjs/feathers/commit/fcdf524ae1995bb59265d39f12e98b7794bed023)) -- **core:** Finalize app.teardown() functionality ([#2584](https://github.com/feathersjs/feathers/issues/2584)) ([1a166f3](https://github.com/feathersjs/feathers/commit/1a166f3ded811ecacf0ae8cb67880bc9fa2eeafa)) -- **transport-commons:** add `context.http.response` ([#2524](https://github.com/feathersjs/feathers/issues/2524)) ([5bc9d44](https://github.com/feathersjs/feathers/commit/5bc9d447043c2e2b742c73ed28ecf3b3264dd9e5)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -### Features - -- **core:** add `context.http` and move `statusCode` there ([#2496](https://github.com/feathersjs/feathers/issues/2496)) ([b701bf7](https://github.com/feathersjs/feathers/commit/b701bf77fb83048aa1dffa492b3d77dd53f7b72b)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/koa - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -### Bug Fixes - -- **koa:** Throw a NotFound Feathers error on missing paths ([#2415](https://github.com/feathersjs/feathers/issues/2415)) ([e013f98](https://github.com/feathersjs/feathers/commit/e013f98315d550ced6eacffd615c61bb0912b4ba)) - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Features - -- **koa:** KoaJS transport adapter ([#2315](https://github.com/feathersjs/feathers/issues/2315)) ([2554b57](https://github.com/feathersjs/feathers/commit/2554b57cf05731df58feeba9c12faab18e442107)) diff --git a/packages/koa/LICENSE b/packages/koa/LICENSE deleted file mode 100644 index 6bfc0adefc..0000000000 --- a/packages/koa/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Feathers - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/koa/README.md b/packages/koa/README.md deleted file mode 100644 index 3f0fba26dc..0000000000 --- a/packages/koa/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/koa - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/koa.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/koa) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers KoaJS framework bindings and REST provider - -## Installation - -``` -npm install @feathersjs/koa --save -``` - -## Documentation - -Refer to the [Feathers Koa API documentation](https://feathersjs.com/api/koa.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/koa/package.json b/packages/koa/package.json deleted file mode 100644 index 36b6d65fd6..0000000000 --- a/packages/koa/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "@feathersjs/koa", - "description": "Feathers KoaJS framework bindings and REST provider", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "koajs" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/koa" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 14" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "@koa/cors": "^5.0.0", - "@types/koa": "^2.15.0", - "@types/koa-qs": "^2.0.3", - "@types/koa-static": "^4.0.4", - "@types/koa__cors": "^5.0.0", - "koa": "^2.15.3", - "koa-body": "^6.0.1", - "koa-compose": "^4.1.0", - "koa-qs": "^3.0.0", - "koa-static": "^5.0.0" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.30", - "@feathersjs/memory": "^5.0.30", - "@feathersjs/tests": "^5.0.30", - "@types/koa-compose": "^3.2.8", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "axios": "^1.7.7", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/koa/src/authentication.ts b/packages/koa/src/authentication.ts deleted file mode 100644 index a84e99cdb2..0000000000 --- a/packages/koa/src/authentication.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Application, HookContext } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { authenticate as AuthenticateHook } from '@feathersjs/authentication' - -import { Middleware } from './declarations' - -const debug = createDebug('@feathersjs/koa/authentication') - -export type AuthenticationSettings = { - service?: string - strategies?: string[] -} - -export function parseAuthentication(settings: AuthenticationSettings = {}): Middleware { - return async (ctx, next) => { - const app = ctx.app - const service = app.defaultAuthentication?.(settings.service) - - if (!service) { - return next() - } - - const config = service.configuration - const authStrategies = settings.strategies || config.parseStrategies || config.authStrategies || [] - - if (authStrategies.length === 0) { - debug('No `authStrategies` or `parseStrategies` found in authentication configuration') - return next() - } - - const authentication = await service.parse(ctx.req, ctx.res, ...authStrategies) - - if (authentication) { - debug('Parsed authentication from HTTP header', authentication) - ctx.feathers = { ...ctx.feathers, authentication } - } - - return next() - } -} - -export function authenticate(settings: string | AuthenticationSettings, ...strategies: string[]): Middleware { - const hook = AuthenticateHook(settings, ...strategies) - - return async (ctx, next) => { - const app = ctx.app as Application - const params = ctx.feathers - const context = { app, params } as HookContext - - await hook(context) - - ctx.feathers = context.params - - return next() - } -} diff --git a/packages/koa/src/declarations.ts b/packages/koa/src/declarations.ts deleted file mode 100644 index 7ae1ff50f7..0000000000 --- a/packages/koa/src/declarations.ts +++ /dev/null @@ -1,37 +0,0 @@ -import Koa, { Next } from 'koa' -import { Server } from 'http' -import { Application as FeathersApplication, HookContext, Params, RouteLookup } from '@feathersjs/feathers' -import '@feathersjs/authentication' - -export type ApplicationAddons = { - server: Server - listen(port?: number, ...args: any[]): Promise -} - -export type Application = Omit & - FeathersApplication & - ApplicationAddons - -export type FeathersKoaContext = Koa.Context & { - app: A -} - -export type Middleware = (context: FeathersKoaContext, next: Next) => any - -declare module '@feathersjs/feathers/lib/declarations' { - interface ServiceOptions { - koa?: { - before?: Middleware[] - after?: Middleware[] - composed?: Middleware - } - } -} - -declare module 'koa' { - interface ExtendableContext { - feathers?: Partial - lookup?: RouteLookup - hook?: HookContext - } -} diff --git a/packages/koa/src/handlers.ts b/packages/koa/src/handlers.ts deleted file mode 100644 index 3c1a1aa216..0000000000 --- a/packages/koa/src/handlers.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { FeathersError, NotFound } from '@feathersjs/errors' -import { FeathersKoaContext } from './declarations' - -export const errorHandler = () => async (ctx: FeathersKoaContext, next: () => Promise) => { - try { - await next() - - if (ctx.body === undefined) { - throw new NotFound(`Path ${ctx.path} not found`) - } - } catch (error: any) { - ctx.response.status = error instanceof FeathersError ? error.code : 500 - ctx.body = - typeof error.toJSON === 'function' - ? error.toJSON() - : { - message: error.message - } - } -} diff --git a/packages/koa/src/index.ts b/packages/koa/src/index.ts deleted file mode 100644 index 8969ec7ebc..0000000000 --- a/packages/koa/src/index.ts +++ /dev/null @@ -1,109 +0,0 @@ -import Koa from 'koa' -import koaQs from 'koa-qs' -import { Application as FeathersApplication } from '@feathersjs/feathers' -import { routing } from '@feathersjs/transport-commons' -import { createDebug } from '@feathersjs/commons' -import { koaBody as bodyParser } from 'koa-body' -import cors from '@koa/cors' -import serveStatic from 'koa-static' - -import { Application } from './declarations' - -export { Koa, bodyParser, cors, serveStatic } -export * from './authentication' -export * from './declarations' -export * from './handlers' -export * from './rest' - -const debug = createDebug('@feathersjs/koa') - -export function koa( - feathersApp?: FeathersApplication, - koaApp: Koa = new Koa() -): Application { - if (!feathersApp) { - return koaApp as any - } - - if (typeof feathersApp.setup !== 'function') { - throw new Error('@feathersjs/koa requires a valid Feathers application instance') - } - - const app = feathersApp as any as Application - const { listen: koaListen, use: koaUse } = koaApp - const { use: feathersUse, teardown: feathersTeardown } = feathersApp - - Object.assign(app, { - use(location: string | Koa.Middleware, ...args: any[]) { - if (typeof location === 'string') { - return (feathersUse as any).call(this, location, ...args) - } - - return koaUse.call(this, location) - }, - - async listen(port?: number, ...args: any[]) { - const server = koaListen.call(this, port, ...args) - - this.server = server - await this.setup(server) - debug('Feathers application listening') - - return server - }, - - async teardown(server?: any) { - return feathersTeardown.call(this, server).then( - () => - new Promise((resolve, reject) => { - if (this.server) { - this.server.close((e) => (e ? reject(e) : resolve(this))) - } else { - resolve(this) - } - }) - ) - } - } as Application) - - const appDescriptors = { - ...Object.getOwnPropertyDescriptors(Object.getPrototypeOf(app)), - ...Object.getOwnPropertyDescriptors(app) - } - const newDescriptors = { - ...Object.getOwnPropertyDescriptors(Object.getPrototypeOf(koaApp)), - ...Object.getOwnPropertyDescriptors(koaApp) - } - - // Copy all non-existing properties (including non-enumerables) - // that don't already exist on the Express app - Object.keys(newDescriptors).forEach((prop) => { - const appProp = appDescriptors[prop] - const newProp = newDescriptors[prop] - - if (appProp === undefined && newProp !== undefined) { - Object.defineProperty(app, prop, newProp) - } - }) - - koaQs(app as any) - - Object.getOwnPropertySymbols(koaApp).forEach((symbol) => { - const target = app as any - const source = koaApp as any - - target[symbol] = source[symbol] - }) - - // This reinitializes hooks - app.setup = feathersApp.setup as any - app.teardown = feathersApp.teardown as any - - app.configure(routing() as any) - app.use((ctx, next) => { - ctx.feathers = { ...ctx.feathers, provider: 'rest' } - return next() - }) - - return app -} diff --git a/packages/koa/src/rest.ts b/packages/koa/src/rest.ts deleted file mode 100644 index 8bd08dd339..0000000000 --- a/packages/koa/src/rest.ts +++ /dev/null @@ -1,94 +0,0 @@ -import compose from 'koa-compose' -import { http } from '@feathersjs/transport-commons' -import { createDebug } from '@feathersjs/commons' -import { getServiceOptions, defaultServiceMethods, createContext } from '@feathersjs/feathers' -import { MethodNotAllowed } from '@feathersjs/errors' - -import { Application, Middleware } from './declarations' -import { AuthenticationSettings, parseAuthentication } from './authentication' - -const debug = createDebug('@feathersjs/koa/rest') - -const serviceMiddleware = (): Middleware => { - return async (ctx, next) => { - const { query, headers, path, body: data, method: httpMethod } = ctx.request - const methodOverride = ctx.request.headers[http.METHOD_HEADER] as string | undefined - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const { service, params: { __id: id = null, ...route } = {} } = ctx.lookup! - const method = http.getServiceMethod(httpMethod, id, methodOverride) - const { methods } = getServiceOptions(service) - - debug(`Found service for path ${path}, attempting to run '${method}' service method`) - - if (!methods.includes(method) || defaultServiceMethods.includes(methodOverride)) { - const error = new MethodNotAllowed(`Method \`${method}\` is not supported by this endpoint.`) - ctx.response.status = error.code - throw error - } - - const createArguments = http.argumentsFor[method as 'get'] || http.argumentsFor.default - const params = { query, headers, route, ...ctx.feathers } - const args = createArguments({ id, data, params }) - const contextBase = createContext(service, method, { http: {} }) - ctx.hook = contextBase - - const context = await (service as any)[method](...args, contextBase) - ctx.hook = context - - const response = http.getResponse(context) - ctx.status = response.status - ctx.set(response.headers) - ctx.body = response.body - - return next() - } -} - -const servicesMiddleware = (): Middleware => { - return async (ctx, next) => { - const app = ctx.app - const lookup = app.lookup(ctx.request.path) - - if (!lookup) { - return next() - } - - ctx.lookup = lookup - - const options = getServiceOptions(lookup.service) - const middleware = options.koa.composed - - return middleware(ctx, next) - } -} - -// eslint-disable-next-line @typescript-eslint/no-empty-function -export const formatter: Middleware = (_ctx, _next) => {} - -export type RestOptions = { - formatter?: Middleware - authentication?: AuthenticationSettings -} - -export const rest = (options?: RestOptions | Middleware) => { - options = typeof options === 'function' ? { formatter: options } : options || {} - - const formatterMiddleware = options.formatter || formatter - const authenticationOptions = options.authentication - - return (app: Application) => { - app.use(parseAuthentication(authenticationOptions)) - app.use(servicesMiddleware()) - - app.mixins.push((_service, _path, options) => { - const { koa: { before = [], after = [] } = {} } = options - - const middlewares = [].concat(before, serviceMiddleware(), after, formatterMiddleware) - const middleware = compose(middlewares) - - options.koa ||= {} - options.koa.composed = middleware - }) - } -} diff --git a/packages/koa/test/app.fixture.ts b/packages/koa/test/app.fixture.ts deleted file mode 100644 index c6427fb49c..0000000000 --- a/packages/koa/test/app.fixture.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { memory } from '@feathersjs/memory' -import { feathers, Params, HookContext } from '@feathersjs/feathers' -import { authenticate, AuthenticationService, JWTStrategy } from '@feathersjs/authentication' -import { LocalStrategy, hooks } from '@feathersjs/authentication-local' - -import { koa, rest, bodyParser, errorHandler, cors } from '../src' - -const { protect, hashPassword } = hooks -const app = koa(feathers()) -const authService = new AuthenticationService(app) - -app.use(errorHandler()) -app.use(cors()) -app.use(bodyParser()) -app.configure(rest()) -app.set('authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['local', 'jwt'], - parseStrategies: ['jwt'], - local: { - usernameField: 'email', - passwordField: 'password' - } -}) - -authService.register('jwt', new JWTStrategy()) -authService.register('local', new LocalStrategy()) - -app.use('/authentication', authService) -app.use( - '/users', - memory({ - paginate: { - default: 10, - max: 20 - } - }) -) - -app.service('users').hooks({ - before: { - create: [hashPassword('password')] - }, - after: { - all: [protect('password')], - get: [ - (context: HookContext) => { - if (context.params.provider) { - context.result.fromGet = true - } - - return context - } - ] - } -}) - -app.use('/dummy', { - async get(id: string, params: Params) { - return { id, params } - } -}) - -app.service('dummy').hooks({ - before: [authenticate('jwt')] -}) - -export default app diff --git a/packages/koa/test/authentication.test.ts b/packages/koa/test/authentication.test.ts deleted file mode 100644 index ffdf374bf2..0000000000 --- a/packages/koa/test/authentication.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { strict as assert } from 'assert' -import _axios from 'axios' -import { AuthenticationResult } from '@feathersjs/authentication' - -import app from './app.fixture' - -const axios = _axios.create({ - baseURL: 'http://localhost:9776/' -}) - -describe('@feathersjs/koa/authentication', () => { - const email = 'koatest@authentication.com' - const password = 'superkoa' - - let authResult: AuthenticationResult - let user: any - - before(async () => { - await app.listen(9776) - user = await app.service('users').create({ email, password }) - authResult = ( - await axios.post('/authentication', { - strategy: 'local', - password, - email - }) - ).data - }) - - after(() => app.teardown()) - - describe('service authentication', () => { - it('successful local authentication', () => { - assert.ok(authResult.accessToken) - assert.strictEqual(authResult.user.email, email) - assert.strictEqual(authResult.user.password, undefined) - }) - - it('local authentication with wrong password fails', async () => { - try { - await axios.post('/authentication', { - strategy: 'local', - password: 'wrong', - email - }) - assert.fail('Should never get here') - } catch (error: any) { - const { data } = error.response - assert.strictEqual(data.name, 'NotAuthenticated') - assert.strictEqual(data.message, 'Invalid login') - } - }) - - it('authenticating with JWT works but returns same accessToken', async () => { - const { accessToken } = authResult - - const { data } = await axios.post('/authentication', { - strategy: 'jwt', - accessToken - }) - - assert.strictEqual(data.accessToken, accessToken) - assert.strictEqual(data.authentication.strategy, 'jwt') - assert.strictEqual(data.authentication.payload.sub, user.id.toString()) - assert.strictEqual(data.user.email, email) - }) - - it('can make a protected request with Authorization header', async () => { - const { accessToken } = authResult - - const { data } = await axios.get('/dummy/dave?user[name]=thing&user[message]=hi', { - headers: { - Authorization: accessToken - } - }) - - assert.strictEqual(data.id, 'dave') - assert.deepStrictEqual(data.params.query, { - user: { - name: 'thing', - message: 'hi' - } - }) - assert.deepStrictEqual(data.params.user, user) - assert.strictEqual(data.params.authentication.accessToken, accessToken) - }) - - it('errors when there are no authStrategies and parseStrategies', async () => { - const { accessToken } = authResult - - app.get('authentication').authStrategies = [] - delete app.get('authentication').parseStrategies - - try { - await axios.get('/dummy/dave', { - headers: { - Authorization: accessToken - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.response.data.name, 'NotAuthenticated') - app.get('authentication').authStrategies = ['jwt', 'local'] - } - }) - - it('can make a protected request with Authorization header and bearer scheme', () => { - const { accessToken } = authResult - - return axios - .get('/dummy/dave', { - headers: { - Authorization: ` Bearer: ${accessToken}` - } - }) - .then((res) => { - const { - data, - data: { params } - } = res - - assert.strictEqual(data.id, 'dave') - assert.deepStrictEqual(params.user, user) - assert.strictEqual(params.authentication.accessToken, accessToken) - }) - }) - }) -}) diff --git a/packages/koa/test/index.test.ts b/packages/koa/test/index.test.ts deleted file mode 100644 index 445b140230..0000000000 --- a/packages/koa/test/index.test.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { strict as assert } from 'assert' -import Koa from 'koa' -import axios from 'axios' -import { ApplicationHookMap, feathers, Id } from '@feathersjs/feathers' -import { Service, restTests } from '@feathersjs/tests' -import { koa, rest, Application, bodyParser, errorHandler } from '../src' - -describe('@feathersjs/koa', () => { - let app: Application - - before(async () => { - app = koa(feathers()) - app.use(errorHandler()) - app.use(bodyParser()) - app.use(async (ctx, next) => { - if (ctx.request.path === '/middleware') { - ctx.body = { - feathers: ctx.feathers, - message: 'Hello from middleware' - } - } else { - await next() - } - }) - app.configure(rest()) - app.use('/', new Service()) - app.use('todo', new Service(), { - koa: { - after: [ - async (ctx, next) => { - const body = ctx.body as any - - if (body.id === 'custom-middleware') { - body.description = 'Description from custom middleware' - } - - await next() - } - ] - }, - methods: ['get', 'find', 'create', 'update', 'patch', 'remove', 'customMethod'] - }) - - app.hooks({ - setup: [ - async (context, next) => { - assert.ok(context.app) - await next() - } - ], - teardown: [ - async (context, next) => { - assert.ok(context.app) - await next() - } - ] - } as ApplicationHookMap) - - await app.listen(8465) - }) - - after(() => app.teardown()) - - it('throws an error when initialized with invalid application', () => { - try { - koa({} as Application) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.message, '@feathersjs/koa requires a valid Feathers application instance') - } - }) - - it('returns Koa instance when no Feathers app is passed', () => { - assert.ok(koa() instanceof Koa) - }) - - it('Koa wrapped and context.app are the same', async () => { - const app = koa(feathers()) - - app.use('/test', { - async get(id: Id) { - return { id } - } - }) - - app.service('test').hooks({ - before: { - get: [ - (context) => { - assert.ok(context.app === app) - } - ] - } - }) - - assert.deepStrictEqual(await app.service('test').get('testing'), { - id: 'testing' - }) - }) - - it('starts as a Koa and Feathers application', async () => { - const { data } = await axios.get('http://localhost:8465/middleware') - const todo = await app.service('todo').get('dishes', { - query: {} - }) - - assert.deepEqual(data, { - message: 'Hello from middleware', - feathers: { - provider: 'rest' - } - }) - assert.deepEqual(todo, { - id: 'dishes', - description: 'You have to do dishes!' - }) - }) - - it('supports custom service middleware', async () => { - const { data } = await axios.get('http://localhost:8465/todo/custom-middleware') - - assert.deepStrictEqual(data, { - id: 'custom-middleware', - description: 'Description from custom middleware' - }) - }) - - it('works with custom methods that are allowed', async () => { - const { data } = await axios.post( - 'http://localhost:8465/todo', - { - message: 'Custom hello' - }, - { - headers: { - 'X-Service-Method': 'customMethod' - } - } - ) - - assert.deepStrictEqual(data, { - data: { message: 'Custom hello' }, - method: 'customMethod', - provider: 'rest' - }) - - await assert.rejects( - () => - axios.post( - 'http://localhost:8465/todo', - {}, - { - headers: { - 'X-Service-Method': 'internalMethod' - } - } - ), - (error: any) => { - const { data } = error.response - - assert.strictEqual(data.code, 405) - assert.strictEqual(data.message, 'Method `internalMethod` is not supported by this endpoint.') - - return true - } - ) - }) - - it('throws a 404 NotFound JSON error', async () => { - await assert.rejects( - () => - axios.post( - 'http://localhost:8465/no/where', - {}, - { - headers: { - 'X-Service-Method': 'internalMethod', - Accept: 'application/json' - } - } - ), - (error: any) => { - const { data } = error.response - - assert.deepStrictEqual(data, { - name: 'NotFound', - message: 'Path /no/where not found', - code: 404, - className: 'not-found' - }) - - return true - } - ) - }) - - it('.teardown closes http server', async () => { - const app = koa(feathers()) - let called = false - - const server = await app.listen(8787) - - server.on('close', () => { - called = true - }) - - await app.teardown() - assert.ok(called) - }) - - it('.teardown works without server (#3224)', async () => { - const app = koa(feathers()) - - await app.teardown() - }) - - restTests('Services', 'todo', 8465) - restTests('Root service', '/', 8465) -}) diff --git a/packages/koa/tsconfig.json b/packages/koa/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/koa/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/memory/CHANGELOG.md b/packages/memory/CHANGELOG.md deleted file mode 100644 index 565190b148..0000000000 --- a/packages/memory/CHANGELOG.md +++ /dev/null @@ -1,762 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- allow \_patch to modify the entire base schema ([#3300](https://github.com/feathersjs/feathers/issues/3300)) ([0f41622](https://github.com/feathersjs/feathers/commit/0f41622307589b3a0b62ac411a73e6a601bda171)) - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) -- **memory:** Ensure correct pagination totals ([#3307](https://github.com/feathersjs/feathers/issues/3307)) ([c59e1b8](https://github.com/feathersjs/feathers/commit/c59e1b80cb43571077b035ab2bf0b44f9daa5ab8)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/memory - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) -- **memory:** Fix memory adapter readme ([#3153](https://github.com/feathersjs/feathers/issues/3153)) ([a9d826a](https://github.com/feathersjs/feathers/commit/a9d826a7dbe7df4501fbf82a47d2c3a77ca9e0c0)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **memory/mongodb:** $select as only property & force 'id' in '$select' ([#3081](https://github.com/feathersjs/feathers/issues/3081)) ([fbe3cf5](https://github.com/feathersjs/feathers/commit/fbe3cf5199e102b5aeda2ae33828d5034df3d105)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -### Bug Fixes - -- **memory:** Use for loop in \_find() for better performance ([#2844](https://github.com/feathersjs/feathers/issues/2844)) ([d6ee5f1](https://github.com/feathersjs/feathers/commit/d6ee5f1c869f0c65cb470130f35956a52356e5c3)) - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **cli:** Initial Feathers v5 CLI and Pinion generator ([#2578](https://github.com/feathersjs/feathers/issues/2578)) ([7f59ae7](https://github.com/feathersjs/feathers/commit/7f59ae7f1471895ba8a82aa4702f1a23f71b7682)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Bug Fixes - -- **adapter-commons:** Clarify adapter query filtering ([#2607](https://github.com/feathersjs/feathers/issues/2607)) ([2dac771](https://github.com/feathersjs/feathers/commit/2dac771b0a3298d6dd25994d05186701b0617718)) - -### Features - -- **mongodb:** Add feathers-mongodb adapter as @feathersjs/mongodb ([#2610](https://github.com/feathersjs/feathers/issues/2610)) ([6d43734](https://github.com/feathersjs/feathers/commit/6d43734a53db02c435cafc52a22dca414e5d0940)) -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -### BREAKING CHANGES - -- **adapter-commons:** Changes the common adapter base class to use `sanitizeQuery` and `sanitizeData` - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Bug Fixes - -- **adapter-tests:** Add tests for pagination in multi updates ([#2472](https://github.com/feathersjs/feathers/issues/2472)) ([98a811a](https://github.com/feathersjs/feathers/commit/98a811ac605575ff812a08d0504729a5efe7a69c)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -### Features - -- **schema:** Initial version of schema definitions and resolvers ([#2441](https://github.com/feathersjs/feathers/issues/2441)) ([c57a5cd](https://github.com/feathersjs/feathers/commit/c57a5cd56699a121647be4506d8f967e6d72ecae)) - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- Update database adapter common repository urls ([#2380](https://github.com/feathersjs/feathers/issues/2380)) ([3f4db68](https://github.com/feathersjs/feathers/commit/3f4db68d6700c7d9023ecd17d0d39893f75a19fd)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) -- **typescript:** Allow to pass generic service options to adapter services ([#2392](https://github.com/feathersjs/feathers/issues/2392)) ([f9431f2](https://github.com/feathersjs/feathers/commit/f9431f242354f804cafb835519f98dd405ac4f0b)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Features - -- **koa:** KoaJS transport adapter ([#2315](https://github.com/feathersjs/feathers/issues/2315)) ([2554b57](https://github.com/feathersjs/feathers/commit/2554b57cf05731df58feeba9c12faab18e442107)) - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -**Note:** Version bump only for package @feathersjs/memory - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -### Features - -- **memory:** Move feathers-memory into @feathersjs/memory ([#2153](https://github.com/feathersjs/feathers/issues/2153)) ([dd61fe3](https://github.com/feathersjs/feathers/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) - -# Change Log - -## [v4.1.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v4.1.0) (2019-10-07) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v4.0.1...v4.1.0) - -**Merged pull requests:** - -- Update all dependencies [\#104](https://github.com/feathersjs-ecosystem/feathers-memory/pull/104) ([daffl](https://github.com/daffl)) - -## [v4.0.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v4.0.1) (2019-09-29) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v4.0.0...v4.0.1) - -**Closed issues:** - -- An in-range update of @types/node is breaking the build 🚨 [\#101](https://github.com/feathersjs-ecosystem/feathers-memory/issues/101) -- An in-range update of webpack is breaking the build 🚨 [\#98](https://github.com/feathersjs-ecosystem/feathers-memory/issues/98) - -**Merged pull requests:** - -- Pass entity type to AdapterService\ [\#103](https://github.com/feathersjs-ecosystem/feathers-memory/pull/103) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#102](https://github.com/feathersjs-ecosystem/feathers-memory/pull/102) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dtslint to the latest version 🚀 [\#100](https://github.com/feathersjs-ecosystem/feathers-memory/pull/100) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Greenkeeper/webpack 4.36.1 [\#99](https://github.com/feathersjs-ecosystem/feathers-memory/pull/99) ([daffl](https://github.com/daffl)) - -## [v4.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v4.0.0) (2019-07-05) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v3.0.2...v4.0.0) - -**Merged pull requests:** - -- Add TypeScript definitions and upgrade to Feathers 4 [\#97](https://github.com/feathersjs-ecosystem/feathers-memory/pull/97) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#94](https://github.com/feathersjs-ecosystem/feathers-memory/pull/94) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v3.0.2) (2019-01-24) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v3.0.1...v3.0.2) - -**Closed issues:** - -- Multiple patch records [\#92](https://github.com/feathersjs-ecosystem/feathers-memory/issues/92) - -**Merged pull requests:** - -- Allow patch to update prop that is within the query [\#93](https://github.com/feathersjs-ecosystem/feathers-memory/pull/93) ([Mattchewone](https://github.com/Mattchewone)) -- Add new tests [\#91](https://github.com/feathersjs-ecosystem/feathers-memory/pull/91) ([daffl](https://github.com/daffl)) -- Update @feathersjs/adapter-commons to the latest version 🚀 [\#90](https://github.com/feathersjs-ecosystem/feathers-memory/pull/90) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v3.0.1) (2018-12-29) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v3.0.0...v3.0.1) - -**Merged pull requests:** - -- Add default params to hook-less methods [\#89](https://github.com/feathersjs-ecosystem/feathers-memory/pull/89) ([daffl](https://github.com/daffl)) - -## [v3.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v3.0.0) (2018-12-17) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.2.0...v3.0.0) - -**Closed issues:** - -- An in-range update of webpack is breaking the build 🚨 [\#84](https://github.com/feathersjs-ecosystem/feathers-memory/issues/84) -- An in-range update of @feathersjs/errors is breaking the build 🚨 [\#83](https://github.com/feathersjs-ecosystem/feathers-memory/issues/83) - -**Merged pull requests:** - -- Update to @feathersjs/adapter-commons and drop Node 6 [\#88](https://github.com/feathersjs-ecosystem/feathers-memory/pull/88) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#87](https://github.com/feathersjs-ecosystem/feathers-memory/pull/87) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update all dependencies and Webpack build [\#85](https://github.com/feathersjs-ecosystem/feathers-memory/pull/85) ([daffl](https://github.com/daffl)) -- Update babel-loader to the latest version 🚀 [\#81](https://github.com/feathersjs-ecosystem/feathers-memory/pull/81) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.2.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.2.0) (2018-08-26) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.3...v2.2.0) - -**Closed issues:** - -- Previously functional batch service no longer works when creating in-memory service [\#77](https://github.com/feathersjs-ecosystem/feathers-memory/issues/77) - -**Merged pull requests:** - -- Remove cloneDeep dependency [\#80](https://github.com/feathersjs-ecosystem/feathers-memory/pull/80) ([daffl](https://github.com/daffl)) -- Fix cloning of instances [\#79](https://github.com/feathersjs-ecosystem/feathers-memory/pull/79) ([homerjam](https://github.com/homerjam)) -- Update sift to the latest version 🚀 [\#76](https://github.com/feathersjs-ecosystem/feathers-memory/pull/76) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.3) (2018-06-11) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.2...v2.1.3) - -**Closed issues:** - -- Use with create-react-app [\#74](https://github.com/feathersjs-ecosystem/feathers-memory/issues/74) - -**Merged pull requests:** - -- Transpile all Feathers modules for distributable [\#75](https://github.com/feathersjs-ecosystem/feathers-memory/pull/75) ([saiichihashimoto](https://github.com/saiichihashimoto)) -- Update shx to the latest version 🚀 [\#73](https://github.com/feathersjs-ecosystem/feathers-memory/pull/73) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.2) (2018-06-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.1...v2.1.2) - -**Merged pull requests:** - -- Update uberproto to the latest version 🚀 [\#72](https://github.com/feathersjs-ecosystem/feathers-memory/pull/72) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update clone-deep to the latest version 🚀 [\#70](https://github.com/feathersjs-ecosystem/feathers-memory/pull/70) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.1) (2018-03-07) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.0...v2.1.1) - -**Closed issues:** - -- Why are all the data deleted after the server is rebooted? [\#68](https://github.com/feathersjs-ecosystem/feathers-memory/issues/68) - -**Merged pull requests:** - -- Update webpack to the latest version 🚀 [\#69](https://github.com/feathersjs-ecosystem/feathers-memory/pull/69) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update clone-deep to the latest version 🚀 [\#67](https://github.com/feathersjs-ecosystem/feathers-memory/pull/67) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update mocha to the latest version 🚀 [\#66](https://github.com/feathersjs-ecosystem/feathers-memory/pull/66) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#65](https://github.com/feathersjs-ecosystem/feathers-memory/pull/65) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.0) (2017-12-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.0.0...v2.1.0) - -**Merged pull requests:** - -- Use namespaced module name for exporting [\#64](https://github.com/feathersjs-ecosystem/feathers-memory/pull/64) ([daffl](https://github.com/daffl)) - -## [v2.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.0.0) (2017-12-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.3.1...v2.0.0) - -**Merged pull requests:** - -- Client build [\#63](https://github.com/feathersjs-ecosystem/feathers-memory/pull/63) ([daffl](https://github.com/daffl)) -- Upgrade to Feathers Buzzard \(v3\) [\#62](https://github.com/feathersjs-ecosystem/feathers-memory/pull/62) ([daffl](https://github.com/daffl)) -- Update to new plugin infrastructure [\#61](https://github.com/feathersjs-ecosystem/feathers-memory/pull/61) ([daffl](https://github.com/daffl)) -- Update clone-deep to the latest version 🚀 [\#60](https://github.com/feathersjs-ecosystem/feathers-memory/pull/60) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.3.1) (2017-10-20) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.3.0...v1.3.1) - -**Closed issues:** - -- Custom $select returning `id` [\#58](https://github.com/feathersjs-ecosystem/feathers-memory/issues/58) -- Best practice for $search [\#51](https://github.com/feathersjs-ecosystem/feathers-memory/issues/51) - -**Merged pull requests:** - -- Do not select the id by default [\#59](https://github.com/feathersjs-ecosystem/feathers-memory/pull/59) ([daffl](https://github.com/daffl)) - -## [v1.3.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.3.0) (2017-10-19) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.2.1...v1.3.0) - -**Merged pull requests:** - -- Modified matcher to use new sift package [\#57](https://github.com/feathersjs-ecosystem/feathers-memory/pull/57) ([Mattchewone](https://github.com/Mattchewone)) -- Update mocha to the latest version 🚀 [\#56](https://github.com/feathersjs-ecosystem/feathers-memory/pull/56) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.2.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.2.1) (2017-09-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.2.0...v1.2.1) - -## [v1.2.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.2.0) (2017-09-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.1.0...v1.2.0) - -**Closed issues:** - -- \[RFE\] An option to set the type of the id field to String [\#54](https://github.com/feathersjs-ecosystem/feathers-memory/issues/54) - -**Merged pull requests:** - -- Deep clone objects before returning [\#55](https://github.com/feathersjs-ecosystem/feathers-memory/pull/55) ([daffl](https://github.com/daffl)) -- Update feathers-socketio to the latest version 🚀 [\#52](https://github.com/feathersjs-ecosystem/feathers-memory/pull/52) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-service-tests to the latest version 🚀 [\#50](https://github.com/feathersjs-ecosystem/feathers-memory/pull/50) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#49](https://github.com/feathersjs-ecosystem/feathers-memory/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#48](https://github.com/feathersjs-ecosystem/feathers-memory/pull/48) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.1.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.1.0) (2017-01-31) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.0.1...v1.1.0) - -**Merged pull requests:** - -- Allow to pass a custom matcher and sorter in the options [\#47](https://github.com/feathersjs-ecosystem/feathers-memory/pull/47) ([daffl](https://github.com/daffl)) -- Change `var` to `const`, fix a mistake with `feathers-memory` requiring [\#46](https://github.com/feathersjs-ecosystem/feathers-memory/pull/46) ([osenvosem](https://github.com/osenvosem)) - -## [v1.0.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.0.1) (2016-11-15) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- feathers-service-tests@0.9.1 breaks build 🚨 [\#45](https://github.com/feathersjs-ecosystem/feathers-memory/pull/45) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.0.0) (2016-11-11) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.8.1...v1.0.0) - -**Closed issues:** - -- Support $select for gets [\#35](https://github.com/feathersjs-ecosystem/feathers-memory/issues/35) - -**Merged pull requests:** - -- Update feathers-service-tests to version 0.9.0 🚀 [\#44](https://github.com/feathersjs-ecosystem/feathers-memory/pull/44) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-commons to version 0.8.0 🚀 [\#43](https://github.com/feathersjs-ecosystem/feathers-memory/pull/43) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.8.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.8.1) (2016-11-02) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.8.0...v0.8.1) - -**Merged pull requests:** - -- fix $select with more than one field [\#42](https://github.com/feathersjs-ecosystem/feathers-memory/pull/42) ([t2t2](https://github.com/t2t2)) -- babel-preset-es2015@6.18.0 breaks build 🚨 [\#41](https://github.com/feathersjs-ecosystem/feathers-memory/pull/41) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Two tweaks for clean build and tests on Windows [\#38](https://github.com/feathersjs-ecosystem/feathers-memory/pull/38) ([ghost](https://github.com/ghost)) -- jshint —\> semistandard [\#37](https://github.com/feathersjs-ecosystem/feathers-memory/pull/37) ([marshallswain](https://github.com/marshallswain)) -- adding code coverage reporting [\#36](https://github.com/feathersjs-ecosystem/feathers-memory/pull/36) ([ekryski](https://github.com/ekryski)) -- Update feathers-service-tests to version 0.8.0 🚀 [\#32](https://github.com/feathersjs-ecosystem/feathers-memory/pull/32) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.8.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.8.0) (2016-09-08) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.5...v0.8.0) - -**Closed issues:** - -- Remove object from memory once sent? [\#30](https://github.com/feathersjs-ecosystem/feathers-memory/issues/30) - -**Merged pull requests:** - -- Update service tests, id and events option [\#31](https://github.com/feathersjs-ecosystem/feathers-memory/pull/31) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update mocha to version 3.0.0 🚀 [\#29](https://github.com/feathersjs-ecosystem/feathers-memory/pull/29) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.5](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.5) (2016-07-25) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.4...v0.7.5) - -## [v0.7.4](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.4) (2016-07-21) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.3...v0.7.4) - -**Merged pull requests:** - -- Update feathers-query-filters to version 2.0.0 🚀 [\#28](https://github.com/feathersjs-ecosystem/feathers-memory/pull/28) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.3) (2016-06-16) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.2...v0.7.3) - -**Merged pull requests:** - -- Update feathers-service-tests to version 0.6.0 🚀 [\#27](https://github.com/feathersjs-ecosystem/feathers-memory/pull/27) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.2) (2016-06-14) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.1...v0.7.2) - -**Closed issues:** - -- Support $search [\#14](https://github.com/feathersjs-ecosystem/feathers-memory/issues/14) - -**Merged pull requests:** - -- Use the original id if it can be coerced [\#26](https://github.com/feathersjs-ecosystem/feathers-memory/pull/26) ([daffl](https://github.com/daffl)) -- mocha@2.5.0 breaks build 🚨 [\#25](https://github.com/feathersjs-ecosystem/feathers-memory/pull/25) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#24](https://github.com/feathersjs-ecosystem/feathers-memory/pull/24) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.1) (2016-04-05) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.0...v0.7.1) - -## [v0.7.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.0) (2016-04-04) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.3...v0.7.0) - -**Merged pull requests:** - -- Move to feathers-commons utilities [\#20](https://github.com/feathersjs-ecosystem/feathers-memory/pull/20) ([daffl](https://github.com/daffl)) - -## [v0.6.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.3) (2016-02-25) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.2...v0.6.3) - -**Closed issues:** - -- Upgrade to lodash 4 [\#17](https://github.com/feathersjs-ecosystem/feathers-memory/issues/17) - -**Merged pull requests:** - -- Use individual Lodash methods [\#19](https://github.com/feathersjs-ecosystem/feathers-memory/pull/19) ([daffl](https://github.com/daffl)) - -## [v0.6.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.2) (2016-02-24) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.1...v0.6.2) - -**Merged pull requests:** - -- bumping feathers-errors version [\#16](https://github.com/feathersjs-ecosystem/feathers-memory/pull/16) ([ekryski](https://github.com/ekryski)) - -## [v0.6.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.1) (2016-02-22) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.0...v0.6.1) - -**Merged pull requests:** - -- Exmaple update [\#15](https://github.com/feathersjs-ecosystem/feathers-memory/pull/15) ([ekryski](https://github.com/ekryski)) - -## [v0.6.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.0) (2016-01-30) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.3...v0.6.0) - -**Merged pull requests:** - -- Use internal methods instead of service methods directly [\#13](https://github.com/feathersjs-ecosystem/feathers-memory/pull/13) ([daffl](https://github.com/daffl)) - -## [v0.5.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.3) (2016-01-23) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.2...v0.5.3) - -## [v0.5.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.2) (2016-01-23) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.1...v0.5.2) - -**Merged pull requests:** - -- Adding nsp check [\#12](https://github.com/feathersjs-ecosystem/feathers-memory/pull/12) ([marshallswain](https://github.com/marshallswain)) - -## [v0.5.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.1) (2015-12-19) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.0...v0.5.1) - -## [v0.5.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.0) (2015-12-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.4.1...v0.5.0) - -## [v0.4.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.4.1) (2015-12-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.4.0...v0.4.1) - -**Merged pull requests:** - -- Use ES6 classes, Promises and support pagination [\#11](https://github.com/feathersjs-ecosystem/feathers-memory/pull/11) ([daffl](https://github.com/daffl)) - -## [v0.4.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.4.0) (2015-11-07) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.4...v0.4.0) - -**Closed issues:** - -- How properly append values to an existing memory element [\#9](https://github.com/feathersjs-ecosystem/feathers-memory/issues/9) -- how to initialize memory on app startup [\#8](https://github.com/feathersjs-ecosystem/feathers-memory/issues/8) -- Add query-filter support [\#7](https://github.com/feathersjs-ecosystem/feathers-memory/issues/7) -- Remove sorting and other processing from core service [\#4](https://github.com/feathersjs-ecosystem/feathers-memory/issues/4) - -**Merged pull requests:** - -- Migrate to ES6 plugin infrastructure and shared feathers-service-tests [\#10](https://github.com/feathersjs-ecosystem/feathers-memory/pull/10) ([daffl](https://github.com/daffl)) -- Added support for simple query in find [\#6](https://github.com/feathersjs-ecosystem/feathers-memory/pull/6) ([ruimgoncalves](https://github.com/ruimgoncalves)) - -## [0.3.4](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.4) (2014-09-25) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.3...0.3.4) - -**Closed issues:** - -- Query and persisting Data [\#5](https://github.com/feathersjs-ecosystem/feathers-memory/issues/5) - -## [0.3.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.3) (2014-06-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.2...0.3.3) - -## [0.3.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.2) (2014-06-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.1...0.3.2) - -## [0.3.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.1) (2014-06-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.0...0.3.1) - -**Closed issues:** - -- Fix peer dependency [\#3](https://github.com/feathersjs-ecosystem/feathers-memory/issues/3) -- Should support `patch` service method [\#2](https://github.com/feathersjs-ecosystem/feathers-memory/issues/2) -- Need to return proper errors [\#1](https://github.com/feathersjs-ecosystem/feathers-memory/issues/1) - -## [0.3.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.0) (2014-06-05) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.2.1...0.3.0) - -## [0.2.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.2.1) (2014-06-04) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.2.0...0.2.1) - -## [0.2.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.2.0) (2014-04-22) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.1.2...0.2.0) - -## [0.1.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.1.2) (2014-04-11) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.1.1...0.1.2) - -## [0.1.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.1.1) (2014-04-11) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/memory/LICENSE b/packages/memory/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/memory/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/memory/README.md b/packages/memory/README.md deleted file mode 100644 index c694686789..0000000000 --- a/packages/memory/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/memory - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/memory.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/memory) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> A Feathers service adapter for in-memory data storage that works on all platforms. - -## Installation - -```bash -$ npm install --save @feathersjs/memory -``` - -## Documentation - -See [FeathersJS Memory Adapter API documentation](https://feathersjs.com/api/databases/memory.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/memory/package.json b/packages/memory/package.json deleted file mode 100644 index 1481567454..0000000000 --- a/packages/memory/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "@feathersjs/memory", - "description": "An in memory service store", - "version": "5.0.30", - "homepage": "https://github.com/feathersjs/feathers", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/memory" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "_templates/**", - "src/**", - "lib/**", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**/*.test.ts" - }, - "publishConfig": { - "access": "public" - }, - "directories": { - "lib": "lib" - }, - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "sift": "^17.1.3" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/memory/src/index.ts b/packages/memory/src/index.ts deleted file mode 100644 index 543592aec1..0000000000 --- a/packages/memory/src/index.ts +++ /dev/null @@ -1,328 +0,0 @@ -import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors' -import { _ } from '@feathersjs/commons' -import { - sorter, - select, - AdapterBase, - AdapterServiceOptions, - PaginationOptions, - AdapterParams -} from '@feathersjs/adapter-commons' -import sift from 'sift' -import { NullableId, Id, Params, Paginated } from '@feathersjs/feathers' - -export interface MemoryServiceStore { - [key: string]: T -} - -export interface MemoryServiceOptions extends AdapterServiceOptions { - store?: MemoryServiceStore - startId?: number - matcher?: (query: any) => any - sorter?: (sort: any) => any -} - -const _select = (data: any, params: any, ...args: string[]) => { - const base = select(params, ...args) - - return base(JSON.parse(JSON.stringify(data))) -} - -export class MemoryAdapter< - Result = any, - Data = Partial, - ServiceParams extends Params = Params, - PatchData = Partial -> extends AdapterBase> { - store: MemoryServiceStore - _uId: number - - constructor(options: MemoryServiceOptions = {}) { - super({ - id: 'id', - matcher: sift, - sorter, - store: {}, - startId: 0, - ...options - }) - this._uId = this.options.startId - this.store = { ...this.options.store } - } - - async getEntries(_params?: ServiceParams) { - const params = _params || ({} as ServiceParams) - - return this._find({ - ...params, - paginate: false - }) - } - - getQuery(params: ServiceParams) { - const { $skip, $sort, $limit, $select, ...query } = params.query || {} - - return { - query, - filters: { $skip, $sort, $limit, $select } - } - } - - async _find(_params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async _find(_params?: ServiceParams & { paginate: false }): Promise - async _find(_params?: ServiceParams): Promise | Result[]> - async _find(params: ServiceParams = {} as ServiceParams): Promise | Result[]> { - const { paginate } = this.getOptions(params) - const { query, filters } = this.getQuery(params) - - let values = _.values(this.store) - const hasSkip = filters.$skip !== undefined - const hasSort = filters.$sort !== undefined - const hasLimit = filters.$limit !== undefined - const hasQuery = _.keys(query).length > 0 - - if (hasSort) { - values.sort(this.options.sorter(filters.$sort)) - } - - if (paginate) { - if (hasQuery) { - values = values.filter(this.options.matcher(query)) - } - - const total = values.length - - if (hasSkip) { - values = values.slice(filters.$skip) - } - - if (hasLimit) { - values = values.slice(0, filters.$limit) - } - - const result: Paginated = { - total, - limit: filters.$limit, - skip: filters.$skip || 0, - data: values.map((value) => _select(value, params, this.id)) - } - - return result - } - - /* Without pagination, we don't have to match every result and gain considerable performance improvements with a breaking for loop. */ - if (hasQuery || hasLimit || hasSkip) { - let skipped = 0 - const matcher = this.options.matcher(query) - const matched = [] - - if (hasLimit && filters.$limit === 0) { - return [] - } - - for (let index = 0, length = values.length; index < length; index++) { - const value = values[index] - - if (hasQuery && !matcher(value, index, values)) { - continue - } - - if (hasSkip && filters.$skip > skipped) { - skipped++ - continue - } - - matched.push(_select(value, params, this.id)) - - if (hasLimit && filters.$limit === matched.length) { - break - } - } - - return matched - } - - return values.map((value) => _select(value, params, this.id)) - } - - async _get(id: Id, params: ServiceParams = {} as ServiceParams): Promise { - const { query } = this.getQuery(params) - - if (id in this.store) { - const value = this.store[id] - - if (this.options.matcher(query)(value)) { - return _select(value, params, this.id) - } - } - - throw new NotFound(`No record found for id '${id}'`) - } - - async _create(data: Partial, params?: ServiceParams): Promise - async _create(data: Partial[], params?: ServiceParams): Promise - async _create(data: Partial | Partial[], _params?: ServiceParams): Promise - async _create( - data: Partial | Partial[], - params: ServiceParams = {} as ServiceParams - ): Promise { - if (Array.isArray(data)) { - return Promise.all(data.map((current) => this._create(current, params))) - } - - const id = (data as any)[this.id] || this._uId++ - const current = _.extend({}, data, { [this.id]: id }) - const result = (this.store[id] = current) - - return _select(result, params, this.id) as Result - } - - async _update(id: Id, data: Data, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null || Array.isArray(data)) { - throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?") - } - - const oldEntry = await this._get(id) - // We don't want our id to change type if it can be coerced - const oldId = (oldEntry as any)[this.id] - - // eslint-disable-next-line eqeqeq - id = oldId == id ? oldId : id - - this.store[id] = _.extend({}, data, { [this.id]: id }) - - return this._get(id, params) - } - - async _patch(id: null, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch(id: Id, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch( - id: NullableId, - data: PatchData | Partial, - _params?: ServiceParams - ): Promise - async _patch( - id: NullableId, - data: PatchData | Partial, - params: ServiceParams = {} as ServiceParams - ): Promise { - if (id === null && !this.allowsMulti('patch', params)) { - throw new MethodNotAllowed('Can not patch multiple entries') - } - - const { query } = this.getQuery(params) - const patchEntry = (entry: Result) => { - const currentId = (entry as any)[this.id] - - this.store[currentId] = _.extend(this.store[currentId], _.omit(data, this.id)) - - return _select(this.store[currentId], params, this.id) - } - - if (id === null) { - const entries = await this.getEntries({ - ...params, - query - }) - - return entries.map(patchEntry) - } - - return patchEntry(await this._get(id, params)) // Will throw an error if not found - } - - async _remove(id: null, params?: ServiceParams): Promise - async _remove(id: Id, params?: ServiceParams): Promise - async _remove(id: NullableId, _params?: ServiceParams): Promise - async _remove(id: NullableId, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null && !this.allowsMulti('remove', params)) { - throw new MethodNotAllowed('Can not remove multiple entries') - } - - const { query } = this.getQuery(params) - - if (id === null) { - const entries = await this.getEntries({ - ...params, - query - }) - - return Promise.all(entries.map((current: any) => this._remove(current[this.id] as Id, params))) - } - - const entry = await this._get(id, params) - - delete this.store[id] - - return entry - } -} - -export class MemoryService< - Result = any, - Data = Partial, - ServiceParams extends AdapterParams = AdapterParams, - PatchData = Partial -> extends MemoryAdapter { - async find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async find(params?: ServiceParams & { paginate: false }): Promise - async find(params?: ServiceParams): Promise | Result[]> - async find(params?: ServiceParams): Promise | Result[]> { - return this._find({ - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async get(id: Id, params?: ServiceParams): Promise { - return this._get(id, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async create(data: Data, params?: ServiceParams): Promise - async create(data: Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - return this._create(data, params) - } - - async update(id: Id, data: Data, params?: ServiceParams): Promise { - return this._update(id, data, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async patch(id: Id, data: PatchData, params?: ServiceParams): Promise - async patch(id: null, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableId, data: PatchData, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._patch(id, data, { - ...params, - query - }) - } - - async remove(id: Id, params?: ServiceParams): Promise - async remove(id: null, params?: ServiceParams): Promise - async remove(id: NullableId, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._remove(id, { - ...params, - query - }) - } -} - -export function memory, P extends Params = Params>( - options: Partial> = {} -) { - return new MemoryService(options) -} diff --git a/packages/memory/test/index.test.ts b/packages/memory/test/index.test.ts deleted file mode 100644 index 1b25ba59a0..0000000000 --- a/packages/memory/test/index.test.ts +++ /dev/null @@ -1,280 +0,0 @@ -import assert from 'assert' -import adapterTests from '@feathersjs/adapter-tests' -import errors from '@feathersjs/errors' -import { feathers } from '@feathersjs/feathers' - -import { MemoryService } from '../src' - -const testSuite = adapterTests([ - '.options', - '.events', - '._get', - '._find', - '._create', - '._update', - '._patch', - '._remove', - '.get', - '.get + $select', - '.get + id + query', - '.get + NotFound', - '.get + id + query id', - '.find', - '.find + paginate + query', - '.remove', - '.remove + $select', - '.remove + id + query', - '.remove + multi', - '.remove + multi no pagination', - '.remove + id + query id', - '.update', - '.update + $select', - '.update + id + query', - '.update + NotFound', - '.update + id + query id', - '.update + query + NotFound', - '.patch', - '.patch + $select', - '.patch + id + query', - '.patch multiple', - '.patch multiple no pagination', - '.patch multi query same', - '.patch multi query changed', - '.patch + query + NotFound', - '.patch + NotFound', - '.patch + id + query id', - '.create', - '.create + $select', - '.create multi', - 'internal .find', - 'internal .get', - 'internal .create', - 'internal .update', - 'internal .patch', - 'internal .remove', - '.find + equal', - '.find + equal multiple', - '.find + $sort', - '.find + $sort + string', - '.find + $limit', - '.find + $limit 0', - '.find + $skip', - '.find + $select', - '.find + $or', - '.find + $in', - '.find + $nin', - '.find + $lt', - '.find + $lte', - '.find + $gt', - '.find + $gte', - '.find + $ne', - '.find + $gt + $lt + $sort', - '.find + $or nested + $sort', - '.find + paginate', - '.find + paginate + $limit + $skip', - '.find + paginate + $limit 0', - '.find + paginate + params', - 'params.adapter + paginate', - 'params.adapter + multi' -]) - -describe('Feathers Memory Service', () => { - type Person = { - id: number - name: string - age: number - } - - type Animal = { - type: string - age: number - } - - const events = ['testing'] - const app = feathers<{ - people: MemoryService - 'people-paginate': MemoryService - 'people-customid': MemoryService - animals: MemoryService - matcher: MemoryService - }>() - - app.use( - 'people', - new MemoryService({ - events - }) - ) - - app.use( - 'people-paginate', - new MemoryService({ - events, - multi: true, - paginate: { - default: 10, - max: 100 - } - }) - ) - - app.use( - 'people-customid', - new MemoryService({ - id: 'customid', - events - }) - ) - - it('update with string id works', async () => { - const people = app.service('people') - const person = await people.create({ - name: 'Tester', - age: 33 - }) - - const updatedPerson: any = await people.update(person.id.toString(), person) - - assert.strictEqual(typeof updatedPerson.id, 'number') - - await people.remove(person.id.toString()) - }) - - it('patch record with prop also in query', async () => { - app.use('animals', new MemoryService({ multi: true })) - const animals = app.service('animals') - await animals.create([ - { - type: 'cat', - age: 30 - }, - { - type: 'dog', - age: 10 - } - ]) - - const [updated] = await animals.patch(null, { age: 40 }, { query: { age: 30 } }) - - assert.strictEqual(updated.age, 40) - - await animals.remove(null, {}) - }) - - it('allows to pass custom find and sort matcher', async () => { - let sorterCalled = false - let matcherCalled = false - - app.use( - 'matcher', - new MemoryService({ - matcher() { - matcherCalled = true - return function () { - return true - } - }, - - sorter() { - sorterCalled = true - return function () { - return 0 - } - } - }) - ) - - await app.service('matcher').find({ - query: { something: 1, $sort: { something: 1 } } - }) - - assert.ok(sorterCalled, 'sorter called') - assert.ok(matcherCalled, 'matcher called') - }) - - it('does not modify the original data', async () => { - const people = app.service('people') - - const person = await people.create({ - name: 'Delete tester', - age: 33 - }) - - delete person.age - - const otherPerson = await people.get(person.id) - - assert.strictEqual(otherPerson.age, 33) - - await people.remove(person.id) - }) - - it('update with null throws error', async () => { - try { - await app.service('people').update(null, {}) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, "You can not replace multiple instances. Did you mean 'patch'?") - } - }) - - it('use $select as only query property', async () => { - const people = app.service('people') - const person = await people.create({ - name: 'Tester', - age: 42 - }) - - const results = await people.find({ - paginate: false, - query: { - $select: ['name'] - } - }) - - assert.deepStrictEqual(results[0], { id: person.id, name: 'Tester' }) - - await people.remove(person.id) - }) - - it('using $limit still returns correct total', async () => { - const service = app.service('people-paginate') - - for (let i = 0; i < 10; i++) { - await service.create({ - name: `Tester ${i}`, - age: 19 - }) - - await service.create({ - name: `Tester ${i}`, - age: 20 - }) - } - - try { - const results = await service.find({ - query: { - $skip: 3, - $limit: 5, - age: 19 - } - }) - - assert.strictEqual(results.total, 10) - assert.strictEqual(results.skip, 3) - assert.strictEqual(results.limit, 5) - } finally { - await service.remove(null, { - query: { - age: { - $in: [19, 20] - } - } - }) - } - }) - - testSuite(app, errors, 'people') - testSuite(app, errors, 'people-customid', 'customid') -}) diff --git a/packages/memory/tsconfig.json b/packages/memory/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/memory/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/mongodb/CHANGELOG.md b/packages/mongodb/CHANGELOG.md deleted file mode 100644 index 17eed4e524..0000000000 --- a/packages/mongodb/CHANGELOG.md +++ /dev/null @@ -1,263 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **mongodb:** Added Update Method Prototype to MongoDBService Class ([#3494](https://github.com/feathersjs/feathers/issues/3494)) ([428f23a](https://github.com/feathersjs/feathers/commit/428f23a8c622cd8bc4d06253206aadd514267846)) -- **mongodb:** MongoDB Aggregation improvements ([#3366](https://github.com/feathersjs/feathers/issues/3366)) ([f2829b1](https://github.com/feathersjs/feathers/commit/f2829b1f8e33d13caae3557d37225d990467fb39)) - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- allow \_patch to modify the entire base schema ([#3300](https://github.com/feathersjs/feathers/issues/3300)) ([0f41622](https://github.com/feathersjs/feathers/commit/0f41622307589b3a0b62ac411a73e6a601bda171)) - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/mongodb - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **mongodb:** Speed up multi create ([#3171](https://github.com/feathersjs/feathers/issues/3171)) ([e34f728](https://github.com/feathersjs/feathers/commit/e34f728139a1008503aa440f1b7cf6395719417b)) - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) -- **mongodb:** Add MongoDB as peerDependency ([#3148](https://github.com/feathersjs/feathers/issues/3148)) ([0137b40](https://github.com/feathersjs/feathers/commit/0137b40fb694fa95e3b7b7ad41504831b894d977)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **memory/mongodb:** $select as only property & force 'id' in '$select' ([#3081](https://github.com/feathersjs/feathers/issues/3081)) ([fbe3cf5](https://github.com/feathersjs/feathers/commit/fbe3cf5199e102b5aeda2ae33828d5034df3d105)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/mongodb - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/mongodb - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Features - -- **mongodb:** Add Object ID keyword converter and update MongoDB CLI & docs ([#3041](https://github.com/feathersjs/feathers/issues/3041)) ([ca0994e](https://github.com/feathersjs/feathers/commit/ca0994eaecb5a31f310bc980d106834e11f24f41)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **databases:** Ensure that query sanitization is not necessary when using query schemas ([#3022](https://github.com/feathersjs/feathers/issues/3022)) ([dbf514e](https://github.com/feathersjs/feathers/commit/dbf514e85d1508b95c007462a39b3cadd4ff391d)) -- **databases:** Improve documentation for adapters and allow dynamic Knex adapter options ([#3019](https://github.com/feathersjs/feathers/issues/3019)) ([66c4b5e](https://github.com/feathersjs/feathers/commit/66c4b5e72000dd03acb57fca1cad4737c85c9c9e)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -### Features - -- **database:** Add and to the query syntax ([#3021](https://github.com/feathersjs/feathers/issues/3021)) ([00cb0d9](https://github.com/feathersjs/feathers/commit/00cb0d9c302ae951ae007d3d6ceba33e254edd9c)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Bug Fixes - -- **databases:** Make sure adapter method signatures are exported properly ([#2943](https://github.com/feathersjs/feathers/issues/2943)) ([458d668](https://github.com/feathersjs/feathers/commit/458d66859e256c5854e7590f0b4a11b233fe0374)) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **schema:** Check for undefined value in resolveQueryObjectId resolver ([#2914](https://github.com/feathersjs/feathers/issues/2914)) ([d9449fa](https://github.com/feathersjs/feathers/commit/d9449fa835f58fc9cec5f7254c50219494129140)) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -### Features - -- **mongodb:** Add ObjectId resolvers and MongoDB option in the guide ([#2847](https://github.com/feathersjs/feathers/issues/2847)) ([c5c1fba](https://github.com/feathersjs/feathers/commit/c5c1fba5718a63412075cd3838b86b889eb0bd48)) - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/mongodb - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) -- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6)) - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -**Note:** Version bump only for package @feathersjs/mongodb - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) -- **mongodb:** Ensure transactions are used properly in create ([#2699](https://github.com/feathersjs/feathers/issues/2699)) ([fe22615](https://github.com/feathersjs/feathers/commit/fe22615b7fa17d3c20ac26d6f82097917c9b63f6)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/mongodb - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/mongodb - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/mongodb - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **authentication-local:** Add passwordHash property resolver ([#2660](https://github.com/feathersjs/feathers/issues/2660)) ([b41279b](https://github.com/feathersjs/feathers/commit/b41279b55eea3771a6fa4983a37be2413287bbc6)) -- **knex:** Add KnexJS SQL database adapter to core ([#2671](https://github.com/feathersjs/feathers/issues/2671)) ([9380fff](https://github.com/feathersjs/feathers/commit/9380fff58596e8bb90b8bb098d2795b7eadfec20)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/mongodb - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/mongodb - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -### Bug Fixes - -- **typescript:** Make additional types generic to work with extended types ([#2625](https://github.com/feathersjs/feathers/issues/2625)) ([269fdec](https://github.com/feathersjs/feathers/commit/269fdecc5961092dc8608b3cbe16f433c80bfa96)) - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Features - -- **mongodb:** Add feathers-mongodb adapter as @feathersjs/mongodb ([#2610](https://github.com/feathersjs/feathers/issues/2610)) ([6d43734](https://github.com/feathersjs/feathers/commit/6d43734a53db02c435cafc52a22dca414e5d0940)) diff --git a/packages/mongodb/LICENSE b/packages/mongodb/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/mongodb/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/mongodb/README.md b/packages/mongodb/README.md deleted file mode 100644 index 4cfca9afeb..0000000000 --- a/packages/mongodb/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/mongodb - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/mongodb.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/mongodb) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers MongoDB service adapter - -## Installation - -``` -npm install @feathersjs/mongodb --save -``` - -## Documentation - -Refer to the [Feathers MongoDB adapter documentation](https://feathersjs.com/api/databases/mongodb.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/mongodb/package.json b/packages/mongodb/package.json deleted file mode 100644 index 3da066a16b..0000000000 --- a/packages/mongodb/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "@feathersjs/mongodb", - "description": "Feathers MongoDB service adapter", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 14" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30" - }, - "peerDependencies": { - "mongodb": "^6.8.0" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.30", - "@feathersjs/schema": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "mongodb-memory-server": "^10.0.0", - "shx": "^0.3.4", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/mongodb/src/adapter.ts b/packages/mongodb/src/adapter.ts deleted file mode 100644 index b640bf395d..0000000000 --- a/packages/mongodb/src/adapter.ts +++ /dev/null @@ -1,582 +0,0 @@ -import { - ObjectId, - Collection, - FindOptions, - BulkWriteOptions, - InsertOneOptions, - DeleteOptions, - CountDocumentsOptions, - ReplaceOptions, - FindOneAndReplaceOptions, - FindOneAndUpdateOptions, - Document, - FindOneAndDeleteOptions -} from 'mongodb' -import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors' -import { _ } from '@feathersjs/commons' -import { - AdapterBase, - AdapterParams, - AdapterServiceOptions, - PaginationOptions, - AdapterQuery, - getLimit -} from '@feathersjs/adapter-commons' -import { Id, Paginated } from '@feathersjs/feathers' -import { errorHandler } from './error-handler' - -export interface MongoDBAdapterOptions extends AdapterServiceOptions { - Model: Collection | Promise - disableObjectify?: boolean - useEstimatedDocumentCount?: boolean -} - -export interface MongoDBAdapterParams - extends AdapterParams> { - pipeline?: Document[] - mongodb?: - | BulkWriteOptions - | FindOptions - | InsertOneOptions - | DeleteOptions - | CountDocumentsOptions - | ReplaceOptions - | FindOneAndReplaceOptions - | FindOneAndDeleteOptions -} - -export type AdapterId = Id | ObjectId - -export type NullableAdapterId = AdapterId | null - -// Create the service. -export class MongoDbAdapter< - Result, - Data = Partial, - ServiceParams extends MongoDBAdapterParams = MongoDBAdapterParams, - PatchData = Partial -> extends AdapterBase { - constructor(options: MongoDBAdapterOptions) { - if (!options) { - throw new Error('MongoDB options have to be provided') - } - - super({ - id: '_id', - ...options - }) - } - - getObjectId(id: AdapterId) { - if (this.options.disableObjectify) { - return id - } - - if (this.id === '_id' && ObjectId.isValid(id)) { - id = new ObjectId(id.toString()) - } - - return id - } - - filterQuery(id: NullableAdapterId, params: ServiceParams) { - const options = this.getOptions(params) - const { $select, $sort, $limit: _limit, $skip = 0, ...query } = (params.query || {}) as AdapterQuery - const $limit = getLimit(_limit, options.paginate) - if (id !== null) { - query.$and = (query.$and || []).concat({ - [this.id]: this.getObjectId(id) - }) - } - - if (query[this.id]) { - query[this.id] = this.getObjectId(query[this.id]) - } - - return { - filters: { $select, $sort, $limit, $skip }, - query - } - } - - getModel(params: ServiceParams = {} as ServiceParams) { - const { Model } = this.getOptions(params) - return Promise.resolve(Model) - } - - async findRaw(params: ServiceParams) { - const { filters, query } = this.filterQuery(null, params) - const model = await this.getModel(params) - const q = model.find(query, params.mongodb) - - if (filters.$sort !== undefined) { - q.sort(filters.$sort) - } - - if (filters.$select !== undefined) { - q.project(this.getProjection(filters.$select)) - } - - if (filters.$skip !== undefined) { - q.skip(filters.$skip) - } - - if (filters.$limit !== undefined) { - q.limit(filters.$limit) - } - - return q - } - - /* TODO: Remove $out and $merge stages, else it returns an empty cursor. I think its safe to assume this is primarily for querying. */ - async aggregateRaw(params: ServiceParams) { - const model = await this.getModel(params) - const pipeline = params.pipeline || [] - const index = pipeline.findIndex((stage: Document) => stage.$feathers) - const before = index >= 0 ? pipeline.slice(0, index) : [] - const feathersPipeline = this.makeFeathersPipeline(params) - const after = index >= 0 ? pipeline.slice(index + 1) : pipeline - - return model.aggregate([...before, ...feathersPipeline, ...after], params.mongodb) - } - - makeFeathersPipeline(params: ServiceParams) { - const { filters, query } = this.filterQuery(null, params) - const pipeline: Document[] = [{ $match: query }] - - if (filters.$sort !== undefined) { - pipeline.push({ $sort: filters.$sort }) - } - - if (filters.$select !== undefined) { - pipeline.push({ $project: this.getProjection(filters.$select) }) - } - - if (filters.$skip !== undefined) { - pipeline.push({ $skip: filters.$skip }) - } - - if (filters.$limit !== undefined) { - pipeline.push({ $limit: filters.$limit }) - } - - return pipeline - } - - getProjection(select?: string[] | { [key: string]: number }) { - if (!select) { - return undefined - } - if (Array.isArray(select)) { - if (!select.includes(this.id)) { - select = [this.id, ...select] - } - return select.reduce<{ [key: string]: number }>( - (value, name) => ({ - ...value, - [name]: 1 - }), - {} - ) - } - - if (!select[this.id]) { - return { - ...select, - [this.id]: 1 - } - } - - return select - } - - normalizeId(id: NullableAdapterId, data: D): D { - if (this.id === '_id') { - // Default Mongo IDs cannot be updated. The Mongo library handles - // this automatically. - return _.omit(data, this.id) - } else if (id !== null) { - // If not using the default Mongo _id field set the ID to its - // previous value. This prevents orphaned documents. - return { - ...data, - [this.id]: id - } - } - return data - } - - async countDocuments(params: ServiceParams) { - const { useEstimatedDocumentCount } = this.getOptions(params) - const { query } = this.filterQuery(null, params) - - if (params.pipeline) { - const aggregateParams = { - ...params, - query: { - ...params.query, - $select: [this.id], - $sort: undefined, - $skip: undefined, - $limit: undefined - } - } - const result = await this.aggregateRaw(aggregateParams).then((result) => result.toArray()) - return result.length - } - - const model = await this.getModel(params) - - if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') { - return model.estimatedDocumentCount() - } - - return model.countDocuments(query, params.mongodb) - } - - async _get(id: AdapterId, params: ServiceParams = {} as ServiceParams): Promise { - const { - query, - filters: { $select } - } = this.filterQuery(id, params) - - if (params.pipeline) { - const aggregateParams = { - ...params, - query: { - ...params.query, - $limit: 1, - $and: (params.query.$and || []).concat({ - [this.id]: this.getObjectId(id) - }) - } - } - - return this.aggregateRaw(aggregateParams) - .then((result) => result.toArray()) - .then(([result]) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - - return result - }) - .catch(errorHandler) - } - - const findOptions: FindOptions = { - projection: this.getProjection($select), - ...params.mongodb - } - - return this.getModel(params) - .then((model) => model.findOne(query, findOptions)) - .then((result) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - - return result - }) - .catch(errorHandler) - } - - async _find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async _find(params?: ServiceParams & { paginate: false }): Promise - async _find(params?: ServiceParams): Promise | Result[]> - async _find(params: ServiceParams = {} as ServiceParams): Promise | Result[]> { - const { paginate } = this.getOptions(params) - const { filters } = this.filterQuery(null, params) - const paginationDisabled = params.paginate === false || !paginate || !paginate.default - - const getData = () => { - const result = params.pipeline ? this.aggregateRaw(params) : this.findRaw(params) - return result.then((result) => result.toArray()) - } - - if (paginationDisabled) { - if (filters.$limit === 0) { - return [] as Result[] - } - const data = await getData() - return data as Result[] - } - - if (filters.$limit === 0) { - return { - total: await this.countDocuments(params), - data: [] as Result[], - limit: filters.$limit, - skip: filters.$skip || 0 - } - } - - const [data, total] = await Promise.all([getData(), this.countDocuments(params)]) - - return { - total, - data: data as Result[], - limit: filters.$limit, - skip: filters.$skip || 0 - } - } - - async _create(data: Data, params?: ServiceParams): Promise - async _create(data: Data[], params?: ServiceParams): Promise - async _create(data: Data | Data[], _params?: ServiceParams): Promise - async _create( - data: Data | Data[], - params: ServiceParams = {} as ServiceParams - ): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - const model = await this.getModel(params) - const setId = (item: any) => { - const entry = Object.assign({}, item) - - if (this.id !== '_id' && typeof entry[this.id] === 'undefined') { - return { - [this.id]: new ObjectId().toHexString(), - ...entry - } - } - - return entry - } - - if (Array.isArray(data)) { - const created = await model.insertMany(data.map(setId), params.mongodb).catch(errorHandler) - return this._find({ - ...params, - paginate: false, - query: { - _id: { $in: Object.values(created.insertedIds) }, - $select: params.query?.$select - } - }) - } - - const created = await model.insertOne(setId(data), params.mongodb).catch(errorHandler) - const result = await this._find({ - ...params, - paginate: false, - query: { - _id: created.insertedId, - $select: params.query?.$select, - $limit: 1 - } - }) - return result[0] - } - - async _patch(id: null, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch(id: AdapterId, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch( - id: NullableAdapterId, - data: PatchData | Partial, - _params?: ServiceParams - ): Promise - async _patch( - id: NullableAdapterId, - _data: PatchData | Partial, - params: ServiceParams = {} as ServiceParams - ): Promise { - if (id === null && !this.allowsMulti('patch', params)) { - throw new MethodNotAllowed('Can not patch multiple entries') - } - - const data = this.normalizeId(id, _data) - const model = await this.getModel(params) - const { - query, - filters: { $sort, $select } - } = this.filterQuery(id, params) - - const replacement = Object.keys(data).reduce( - (current, key) => { - const value = (data as any)[key] - - if (key.charAt(0) !== '$') { - current.$set[key] = value - } else if (key === '$set') { - current.$set = { - ...current.$set, - ...value - } - } else { - current[key] = value - } - - return current - }, - { $set: {} } as any - ) - - if (id === null) { - const findParams = { - ...params, - paginate: false, - query: { - ...params.query, - $select: [this.id] - } - } - - return this._find(findParams) - .then(async (result) => { - const idList = (result as Result[]).map((item: any) => item[this.id]) - await model.updateMany({ [this.id]: { $in: idList } }, replacement, params.mongodb) - return this._find({ - ...params, - paginate: false, - query: { - [this.id]: { $in: idList }, - $sort, - $select - } - }) - }) - .catch(errorHandler) - } - - if (params.pipeline) { - const getParams = { - ...params, - query: { - ...params.query, - $select: [this.id] - } - } - - return this._get(id, getParams) - .then(async () => { - await model.updateOne({ [this.id]: id }, replacement, params.mongodb) - return this._get(id, { - ...params, - query: { $select } - }) - }) - .catch(errorHandler) - } - - const updateOptions: FindOneAndUpdateOptions = { - projection: this.getProjection($select), - ...(params.mongodb as FindOneAndUpdateOptions), - returnDocument: 'after' - } - - return model - .findOneAndUpdate(query, replacement, updateOptions) - .then((result) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - return result as Result - }) - .catch(errorHandler) - } - - async _update(id: AdapterId, data: Data, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null || Array.isArray(data)) { - throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?") - } - - const { - query, - filters: { $select } - } = this.filterQuery(id, params) - const model = await this.getModel(params) - const replacement = this.normalizeId(id, data) - - if (params.pipeline) { - const getParams = { - ...params, - query: { - ...params.query, - $select: [this.id] - } - } - - return this._get(id, getParams) - .then(async () => { - await model.replaceOne({ [this.id]: id }, replacement, params.mongodb) - return this._get(id, { - ...params, - query: { $select } - }) - }) - .catch(errorHandler) - } - - const replaceOptions: FindOneAndReplaceOptions = { - projection: this.getProjection($select), - ...(params.mongodb as FindOneAndReplaceOptions), - returnDocument: 'after' - } - - return model - .findOneAndReplace(query, replacement, replaceOptions) - .then((result) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - return result as Result - }) - .catch(errorHandler) - } - - async _remove(id: null, params?: ServiceParams): Promise - async _remove(id: AdapterId, params?: ServiceParams): Promise - async _remove(id: NullableAdapterId, _params?: ServiceParams): Promise - async _remove( - id: NullableAdapterId | ObjectId, - params: ServiceParams = {} as ServiceParams - ): Promise { - if (id === null && !this.allowsMulti('remove', params)) { - throw new MethodNotAllowed('Can not remove multiple entries') - } - - const model = await this.getModel(params) - const { query } = this.filterQuery(id, params) - const findParams = { - ...params, - paginate: false - } - - if (id === null) { - return this._find(findParams) - .then(async (result) => { - const idList = (result as Result[]).map((item: any) => item[this.id]) - await model.deleteMany({ [this.id]: { $in: idList } }, params.mongodb) - return result - }) - .catch(errorHandler) - } - - if (params.pipeline) { - return this._get(id, params) - .then(async (result) => { - await model.deleteOne({ [this.id]: id }, params.mongodb) - return result - }) - .catch(errorHandler) - } - - const deleteOptions: FindOneAndDeleteOptions = { - ...(params.mongodb as FindOneAndDeleteOptions), - projection: this.getProjection(params.query?.$select) - } - - return model - .findOneAndDelete(query, deleteOptions) - .then((result) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - return result as Result - }) - .catch(errorHandler) - } -} diff --git a/packages/mongodb/src/converters.ts b/packages/mongodb/src/converters.ts deleted file mode 100644 index d4e8c47727..0000000000 --- a/packages/mongodb/src/converters.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { ObjectId } from 'mongodb' - -export type ObjectIdParam = string | number | ObjectId - -export type IdQueryObject = { - $in?: T[] - $nin?: T[] - $ne?: T -} - -const toObjectId = (value: ObjectIdParam) => new ObjectId(value) - -export async function resolveObjectId(value: ObjectIdParam) { - return toObjectId(value) -} - -export async function resolveQueryObjectId( - value: IdQueryObject -): Promise> -export async function resolveQueryObjectId(value: ObjectIdParam): Promise -export async function resolveQueryObjectId(value: ObjectIdParam | IdQueryObject) { - if (!value) { - return undefined - } - - if (typeof value === 'string' || typeof value === 'number' || value instanceof ObjectId) { - return toObjectId(value) - } - - const convertedObject: IdQueryObject = {} - - if (Array.isArray(value.$in)) { - convertedObject.$in = value.$in.map(toObjectId) - } - - if (Array.isArray(value.$nin)) { - convertedObject.$nin = value.$nin.map(toObjectId) - } - - if (value.$ne !== undefined) { - convertedObject.$ne = toObjectId(value.$ne) - } - - return convertedObject -} - -export const keywordObjectId = { - keyword: 'objectid', - type: 'string', - modifying: true, - compile(schemaVal: boolean) { - if (!schemaVal) return () => true - - return function (value: string, obj: any) { - const { parentData, parentDataProperty } = obj - try { - parentData[parentDataProperty] = new ObjectId(value) - return true - } catch (error) { - throw new Error(`invalid objectid for property "${parentDataProperty}"`) - } - } - } -} as const diff --git a/packages/mongodb/src/error-handler.ts b/packages/mongodb/src/error-handler.ts deleted file mode 100644 index e485b00f75..0000000000 --- a/packages/mongodb/src/error-handler.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { GeneralError } from '@feathersjs/errors' -import { MongoError } from 'mongodb' - -export function errorHandler(error: MongoError): any { - // See https://github.com/mongodb/mongo/blob/master/docs/errors.md - if (error && error.name && error.name.startsWith('Mongo')) { - throw new GeneralError(error, { - name: error.name, - code: error.code - }) - } - - throw error -} diff --git a/packages/mongodb/src/index.ts b/packages/mongodb/src/index.ts deleted file mode 100644 index 04e8d31676..0000000000 --- a/packages/mongodb/src/index.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { PaginationOptions } from '@feathersjs/adapter-commons' -import { MethodNotAllowed } from '@feathersjs/errors/lib' -import { Paginated, Params } from '@feathersjs/feathers' -import { AdapterId, MongoDbAdapter, MongoDBAdapterParams, NullableAdapterId } from './adapter' - -export * from './adapter' -export * from './error-handler' -export * from './converters' - -export class MongoDBService< - Result = any, - Data = Partial, - ServiceParams extends Params = MongoDBAdapterParams, - PatchData = Partial -> extends MongoDbAdapter { - async find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async find(params?: ServiceParams & { paginate: false }): Promise - async find(params?: ServiceParams): Promise | Result[]> - async find(params?: ServiceParams): Promise | Result[]> { - return this._find({ - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async get(id: AdapterId, params?: ServiceParams): Promise { - return this._get(id, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async create(data: Data, params?: ServiceParams): Promise - async create(data: Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - return this._create(data, params) - } - - async update(id: NullableAdapterId, data: Data, params?: ServiceParams): Promise - async update(id: AdapterId, data: Data, params?: ServiceParams): Promise { - return this._update(id, data, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async patch(id: null, data: PatchData, params?: ServiceParams): Promise - async patch(id: AdapterId, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableAdapterId, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableAdapterId, data: PatchData, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._patch(id, data, { - ...params, - query - }) - } - - async remove(id: AdapterId, params?: ServiceParams): Promise - async remove(id: null, params?: ServiceParams): Promise - async remove(id: NullableAdapterId, params?: ServiceParams): Promise - async remove(id: NullableAdapterId, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._remove(id, { - ...params, - query - }) - } -} diff --git a/packages/mongodb/test/converters.test.ts b/packages/mongodb/test/converters.test.ts deleted file mode 100644 index f8d965e8c4..0000000000 --- a/packages/mongodb/test/converters.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Ajv } from '@feathersjs/schema' -import assert from 'assert' -import { ObjectId } from 'mongodb' -import { keywordObjectId, resolveObjectId, resolveQueryObjectId } from '../src' - -describe('ObjectId resolvers', () => { - it('resolveObjectId', async () => { - const oid = await resolveObjectId('5f9e3c1b9b9b9b9b9b9b9b9b') - - assert.ok(oid instanceof ObjectId) - }) - - it('resolveQueryObjectId', async () => { - const oid = await resolveQueryObjectId('5f9e3c1b9b9b9b9b9b9b9b9b') - - assert.ok(oid instanceof ObjectId) - }) - - it('resolveQueryObjectId with object', async () => { - const oids = await resolveQueryObjectId({ - $in: ['5f9e3c1b9b9b9b9b9b9b9b9b'], - $ne: '5f9e3c1b9b9b9b9b9b9b9b9a' - }) - - assert.ok(oids.$in && oids.$in[0] instanceof ObjectId) - assert.ok(oids.$ne instanceof ObjectId) - }) - - it('resolveQueryObjectId with falsey value', async () => { - await resolveQueryObjectId(undefined) - await resolveQueryObjectId(null) - await resolveQueryObjectId(0) - - assert.ok('Falsey value does not throw exception') - }) -}) - -const validator = new Ajv({ coerceTypes: true }) -validator.addKeyword(keywordObjectId) - -describe('objectid keyword', () => { - it('converts objectid strings when keyword is used', async () => { - const schema = { - type: 'object', - properties: { - _id: { type: 'string', objectid: true }, - otherId: { type: 'string', objectid: true } - }, - additionalProperties: false - } - const validate = validator.compile(schema) - - const data = { - _id: '622585621f3996763f1e4444', - otherId: '622585621f3996763f1e5555' - } - assert.equal(typeof data._id, 'string') - assert.equal(typeof data.otherId, 'string') - - // runs converters - validate(data) - - assert.ok((data._id as any) instanceof ObjectId) - assert.equal(typeof data.otherId, 'object') - }) - - it('does not convert objectid strings without keyword', async () => { - const schema = { - type: 'object', - properties: { - _id: { type: 'string' }, - otherId: { type: 'string' } - }, - additionalProperties: false - } - const validate = validator.compile(schema) - - const data = { - _id: '622585621f3996763f1e4444', - otherId: '622585621f3996763f1e5555' - } - assert.equal(typeof data._id, 'string') - assert.equal(typeof data.otherId, 'string') - - // runs converters - validate(data) - - assert.equal(typeof data._id, 'string') - assert.equal(typeof data.otherId, 'string') - }) - - it('fails on invalid objectids', async () => { - const schema = { - type: 'object', - properties: { - _id: { type: 'string', objectid: true } - }, - additionalProperties: false - } - const validate = validator.compile(schema) - - const data = { - _id: '622585621f3996763f1e444' - } - assert.equal(typeof data._id, 'string') - - assert.throws(() => validate(data), /invalid objectid for property "_id"/) - }) -}) diff --git a/packages/mongodb/test/index.test.ts b/packages/mongodb/test/index.test.ts deleted file mode 100644 index 7aec6e887d..0000000000 --- a/packages/mongodb/test/index.test.ts +++ /dev/null @@ -1,841 +0,0 @@ -import { Db, MongoClient, ObjectId } from 'mongodb' -import adapterTests from '@feathersjs/adapter-tests' -import assert from 'assert' -import { MongoMemoryServer } from 'mongodb-memory-server' -import { Ajv, FromSchema, getValidator, hooks, querySyntax } from '@feathersjs/schema' -import { feathers } from '@feathersjs/feathers' -import errors from '@feathersjs/errors' -import { MongoDBService, AdapterId } from '../src' - -const testSuite = adapterTests([ - '.options', - '.events', - '._get', - '._find', - '._create', - '._update', - '._patch', - '._remove', - '.get', - '.get + $select', - '.get + id + query', - '.get + NotFound', - '.get + id + query id', - '.find', - '.find + paginate + query', - '.remove', - '.remove + $select', - '.remove + id + query', - '.remove + multi', - '.remove + multi no pagination', - '.remove + id + query id', - '.update', - '.update + $select', - '.update + id + query', - '.update + NotFound', - '.update + id + query id', - '.update + query + NotFound', - '.patch', - '.patch + $select', - '.patch + id + query', - '.patch multiple', - '.patch multiple no pagination', - '.patch multi query same', - '.patch multi query changed', - '.patch + query + NotFound', - '.patch + NotFound', - '.patch + id + query id', - '.create', - '.create ignores query', - '.create + $select', - '.create multi', - 'internal .find', - 'internal .get', - 'internal .create', - 'internal .update', - 'internal .patch', - 'internal .remove', - '.find + equal', - '.find + equal multiple', - '.find + $sort', - '.find + $sort + string', - '.find + $limit', - '.find + $limit 0', - '.find + $skip', - '.find + $select', - '.find + $or', - '.find + $and', - '.find + $in', - '.find + $nin', - '.find + $lt', - '.find + $lte', - '.find + $gt', - '.find + $gte', - '.find + $ne', - '.find + $gt + $lt + $sort', - '.find + $or nested + $sort', - '.find + $and + $or', - '.find + paginate', - '.find + paginate + $limit + $skip', - '.find + paginate + $limit 0', - '.find + paginate + params', - 'params.adapter + paginate', - 'params.adapter + multi' -]) - -const defaultPaginate = { - default: 10, - max: 50 -} - -describe('Feathers MongoDB Service', () => { - const personSchema = { - $id: 'Person', - type: 'object', - additionalProperties: false, - required: ['_id', 'name', 'age'], - properties: { - _id: { oneOf: [{ type: 'string' }, { type: 'object' }] }, - name: { type: 'string' }, - age: { type: 'number' }, - friends: { type: 'array', items: { type: 'string' } }, - team: { type: 'string' }, - $push: { - type: 'object', - properties: { - friends: { type: 'string' } - } - } - } - } as const - const personQuery = { - $id: 'PersonQuery', - type: 'object', - additionalProperties: false, - properties: { - ...querySyntax(personSchema.properties, { - name: { - $regex: { type: 'string' } - } - }) - } - } as const - const validator = new Ajv({ - coerceTypes: true - }) - const personQueryValidator = getValidator(personQuery, validator) - - type Person = Omit, '_id'> & { _id: AdapterId } - type Todo = { - _id: string - name: string - userId: string - person?: Person - } - - type ServiceTypes = { - people: MongoDBService - 'people-customid': MongoDBService - todos: MongoDBService - } - - const app = feathers() - - let db: Db - let mongoClient: MongoClient - let mongod: MongoMemoryServer - - before(async () => { - mongod = await MongoMemoryServer.create() - - const client = await MongoClient.connect(mongod.getUri()) - - mongoClient = client - db = client.db('feathers-test') - - app.use( - 'people', - new MongoDBService({ - Model: db.collection('people'), - events: ['testing'] - }) - ) - app.use( - 'people-customid', - new MongoDBService({ - Model: db.collection('people-customid'), - id: 'customid', - events: ['testing'] - }) - ) - - app.service('people').hooks({ - before: { - find: [hooks.validateQuery(personQueryValidator)] - } - }) - - db.collection('people-customid').deleteMany({}) - db.collection('people').deleteMany({}) - db.collection('todos').deleteMany({}) - - db.collection('people').createIndex({ name: 1 }, { partialFilterExpression: { team: 'blue' } }) - }) - - after(async () => { - await db.dropDatabase() - await mongoClient.close() - await mongod.stop() - }) - - describe('Service utility functions', () => { - describe('getObjectId', () => { - it('returns an ObjectID instance for a valid ID', () => { - const id = new ObjectId() - const objectify = app.service('people').getObjectId(id.toString()) - - assert.ok(objectify instanceof ObjectId) - assert.strictEqual(objectify.toString(), id.toString()) - }) - - it('returns an ObjectID instance for a valid ID', () => { - const id = 'non-valid object id' - const objectify = app.service('people').getObjectId(id.toString()) - - assert.ok(!(objectify instanceof ObjectId)) - assert.strictEqual(objectify, id) - }) - }) - }) - - // For some bizarre reason this test is flaky - describe.skip('works with ObjectIds', () => { - it('can call methods with ObjectId instance', async () => { - const person = await app.service('people').create({ - name: 'David' - }) - - const withId = await app.service('people').get(person._id.toString()) - - assert.strictEqual(withId.name, 'David') - - await app.service('people').remove(new ObjectId(person._id.toString())) - }) - }) - - describe('Special collation param', () => { - let peopleService: MongoDBService - let people: Person[] - - function indexOfName(results: Person[], name: string) { - let index = 0 - - for (const person of results) { - if (person.name === name) { - return index - } - index++ - } - - return -1 - } - - beforeEach(async () => { - peopleService = app.service('people') - peopleService.options.multi = true - peopleService.options.disableObjectify = true - people = await peopleService.create([{ name: 'AAA' }, { name: 'aaa' }, { name: 'ccc' }]) - }) - - afterEach(async () => { - peopleService.options.multi = false - - try { - await Promise.all([ - peopleService.remove(people[0]._id), - peopleService.remove(people[1]._id), - peopleService.remove(people[2]._id) - ]) - } catch (error: unknown) {} - }) - - it('queries for ObjectId in find', async () => { - const person = await peopleService.create({ name: 'Coerce' }) - const results = await peopleService.find({ - paginate: false, - query: { - _id: new ObjectId(person._id) - } - }) - - assert.strictEqual(results.length, 1) - - await peopleService.remove(person._id) - }) - - it('works with normal string _id', async () => { - const person = await peopleService.create({ - _id: 'lessonKTDA08', - name: 'Coerce' - }) - const result = await peopleService.get(person._id) - - assert.strictEqual(result.name, 'Coerce') - - await peopleService.remove(person._id) - }) - - it('sorts with default behavior without collation param', async () => { - const results = await peopleService.find({ - paginate: false, - query: { $sort: { name: -1 } } - }) - - assert.ok(indexOfName(results, 'aaa') < indexOfName(results, 'AAA')) - }) - - it('sorts using collation param if present', async () => { - const results = await peopleService.find({ - paginate: false, - query: { $sort: { name: -1 } }, - mongodb: { collation: { locale: 'en', strength: 1 } } - }) - - assert.ok(indexOfName(results, 'aaa') > indexOfName(results, 'AAA')) - }) - - it('removes with default behavior without collation param', async () => { - await peopleService.remove(null, { query: { name: { $gt: 'AAA' } } }) - - const results = await peopleService.find({ paginate: false }) - - assert.strictEqual(results.length, 1) - assert.strictEqual(results[0].name, 'AAA') - }) - - it('removes using collation param if present', async () => { - const removed = await peopleService.remove(null, { - query: { name: 'AAA' }, - mongodb: { collation: { locale: 'en', strength: 1 } } - }) - const results = await peopleService.find({ paginate: false }) - - assert.strictEqual(removed.length, 2) - assert.strictEqual(results[0].name, 'ccc') - assert.strictEqual(results.length, 1) - }) - - it('handles errors', async () => { - await assert.rejects( - () => - peopleService.create( - { - name: 'Dave' - }, - { - mongodb: { collation: { locale: 'fdsfdsfds', strength: 1 } } - } - ), - { - name: 'GeneralError' - } - ) - }) - - it('updates with default behavior without collation param', async () => { - const query = { name: { $gt: 'AAA' } } - - const result = await peopleService.patch(null, { age: 99 }, { query }) - - assert.strictEqual(result.length, 2) - result.forEach((person) => { - assert.strictEqual(person.age, 99) - }) - }) - - it('updates using collation param if present', async () => { - const result = await peopleService.patch( - null, - { age: 110 }, - { - query: { name: { $gt: 'AAA' } }, - mongodb: { collation: { locale: 'en', strength: 1 } } - } - ) - - assert.strictEqual(result.length, 1) - assert.strictEqual(result[0].name, 'ccc') - }) - - it('pushes to an array using patch', async () => { - const result = await peopleService.patch( - null, - { $push: { friends: 'Adam' } }, - { - query: { name: { $gt: 'AAA' } } - } - ) - - assert.strictEqual(result[0].friends?.length, 1) - - const patched = await peopleService.patch( - null, - { - $push: { friends: 'Bell' } - }, - { query: { name: { $gt: 'AAA' } } } - ) - - assert.strictEqual(patched[0].friends?.length, 2) - }) - - it('can use $limit in patch', async () => { - const data = { name: 'ddd' } - const query = { $limit: 1 } - - const result = await peopleService._patch(null, data, { - query - }) - - assert.strictEqual(result.length, 1) - assert.strictEqual(result[0].name, 'ddd') - - const pipelineResult = await peopleService._patch(null, data, { - pipeline: [], - query - }) - - assert.strictEqual(pipelineResult.length, 1) - assert.strictEqual(pipelineResult[0].name, 'ddd') - }) - - it('can use $limit in remove', async () => { - const query = { $limit: 1 } - - const result = await peopleService._remove(null, { - query - }) - - assert.strictEqual(result.length, 1) - - const pipelineResult = await peopleService._remove(null, { - pipeline: [], - query - }) - - assert.strictEqual(pipelineResult.length, 1) - }) - - it('can use $sort in patch', async () => { - const updated = await peopleService._patch( - null, - { name: 'ddd' }, - { - query: { $limit: 1, $sort: { name: -1 } } - } - ) - - const result = await peopleService.find({ - paginate: false, - query: { $limit: 1, $sort: { name: -1 } } - }) - - assert.strictEqual(updated.length, 1) - assert.strictEqual(result[0].name, 'ddd') - - const pipelineUpdated = await peopleService._patch( - null, - { name: 'eee' }, - { - pipeline: [], - query: { $limit: 1, $sort: { name: -1 } } - } - ) - - const pipelineResult = await peopleService.find({ - paginate: false, - pipeline: [], - query: { $limit: 1, $sort: { name: -1 } } - }) - - assert.strictEqual(pipelineUpdated.length, 1) - assert.strictEqual(pipelineResult[0].name, 'eee') - }) - - it('can use $sort in remove', async () => { - const removed = await peopleService._remove(null, { - query: { $limit: 1, $sort: { name: -1 } } - }) - - assert.strictEqual(removed.length, 1) - assert.strictEqual(removed[0].name, 'ccc') - - const pipelineRemoved = await peopleService._remove(null, { - pipeline: [], - query: { $limit: 1, $sort: { name: -1 } } - }) - - assert.strictEqual(pipelineRemoved.length, 1) - assert.strictEqual(pipelineRemoved[0].name, 'aaa') - }) - - it('overrides default index selection using hint param if present', async () => { - const indexed = await peopleService.create({ - name: 'Indexed', - team: 'blue' - }) - - const result = await peopleService.find({ - paginate: false, - query: {}, - mongodb: { hint: { name: 1 } } - }) - - assert.strictEqual(result[0].name, 'Indexed') - assert.strictEqual(result.length, 1) - - await peopleService.remove(indexed._id) - }) - }) - - describe('Aggregation', () => { - let bob: any - let alice: any - let doug: any - - before(async () => { - app.use( - 'todos', - new MongoDBService({ - Model: db.collection('todos'), - events: ['testing'] - }) - ) - bob = await app.service('people').create({ name: 'Bob', age: 25 }) - alice = await app.service('people').create({ name: 'Alice', age: 19 }) - doug = await app.service('people').create({ name: 'Doug', age: 32 }) - - // Create a task for each person - await app.service('todos').create({ name: 'Bob do dishes', userId: bob._id }) - await app.service('todos').create({ name: 'Bob do laundry', userId: bob._id }) - await app.service('todos').create({ name: 'Alice do dishes', userId: alice._id }) - await app.service('todos').create({ name: 'Doug do dishes', userId: doug._id }) - }) - - after(async () => { - db.collection('people').deleteMany({}) - db.collection('todos').deleteMany({}) - }) - - it('assumes the feathers stage runs before all if it is not explicitly provided in pipeline', async () => { - const result = await app.service('todos').find({ - query: { name: /dishes/, $sort: { name: 1 } }, - pipeline: [ - { - $lookup: { - from: 'people', - localField: 'userId', - foreignField: '_id', - as: 'person' - } - }, - { $unwind: { path: '$person' } } - ], - paginate: false - }) - assert.deepEqual(result[0].person, alice) - assert.deepEqual(result[1].person, bob) - assert.deepEqual(result[2].person, doug) - }) - - it('can prepend stages by explicitly placing the feathers stage', async () => { - const result = await app.service('todos').find({ - query: { $sort: { name: 1 } }, - pipeline: [ - { $match: { name: 'Bob do dishes' } }, - { $feathers: {} }, - { - $lookup: { - from: 'people', - localField: 'userId', - foreignField: '_id', - as: 'person' - } - }, - { $unwind: { path: '$person' } } - ], - paginate: false - }) - assert.deepEqual(result[0].person, bob) - assert.equal(result.length, 1) - }) - - it('can count documents with aggregation', async () => { - const service = app.service('people') - const paginateBefore = service.options.paginate - service.options.paginate = defaultPaginate - const query = { age: { $gte: 25 } } - const findResult = await app.service('people').find({ query }) - const aggregationResult = await app.service('people').find({ query, pipeline: [] }) - - assert.deepStrictEqual(findResult.total, aggregationResult.total) - - service.options.paginate = paginateBefore - }) - - it('can use aggregation in _get', async () => { - const dave = await app.service('people').create({ name: 'Dave', age: 25 }) - const result = await app.service('people').get(dave._id, { - pipeline: [{ $addFields: { aggregation: true } }] - }) - - assert.deepStrictEqual(result, { ...dave, aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in _create', async () => { - const dave = (await app.service('people').create( - { name: 'Dave' }, - { - pipeline: [{ $addFields: { aggregation: true } }] - } - )) as any - - assert.deepStrictEqual(dave.aggregation, true) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in multi _create', async () => { - app.service('people').options.multi = true - const dave = (await app.service('people').create([{ name: 'Dave' }], { - pipeline: [{ $addFields: { aggregation: true } }] - })) as any - - assert.deepStrictEqual(dave[0].aggregation, true) - - app.service('people').options.multi = false - app.service('people').remove(dave[0]._id) - }) - - it('can use aggregation in _update', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').update( - dave._id, - { - name: 'Marshal' - }, - { - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result, { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in _patch', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').patch( - dave._id, - { - name: 'Marshal' - }, - { - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result, { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in multi _patch', async () => { - app.service('people').options.multi = true - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').patch( - null, - { - name: 'Marshal' - }, - { - query: { _id: dave._id }, - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result[0], { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').options.multi = false - app.service('people').remove(dave._id) - }) - - it('can use aggregation and query in _update', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').update( - dave._id, - { - name: 'Marshal' - }, - { - query: { name: 'Dave' }, - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result, { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation and query in _patch', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').patch( - dave._id, - { - name: 'Marshal' - }, - { - query: { name: 'Dave' }, - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result, { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in _remove', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').remove(dave._id, { - pipeline: [{ $addFields: { aggregation: true } }] - }) - - assert.deepStrictEqual(result, { ...dave, aggregation: true }) - - try { - await await app.service('people').get(dave._id) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - it('can use aggregation in multi _remove', async () => { - app.service('people').options.multi = true - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').remove(null, { - query: { _id: dave._id }, - pipeline: [{ $addFields: { aggregation: true } }] - }) - - assert.deepStrictEqual(result[0], { ...dave, aggregation: true }) - - app.service('people').options.multi = false - // app.service('people').remove(dave._id) - }) - }) - - describe('query validation', () => { - it('validated queries are not sanitized', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').find({ - query: { - name: { - $regex: 'Da.*' - } - } - }) - assert.deepStrictEqual(result, [dave]) - - app.service('people').remove(dave._id) - }) - }) - - // TODO: Should this test be part of the adapterTests? - describe('Updates mutated query', () => { - it('Can re-query mutated data', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const dave2 = await app.service('people').create({ name: 'Dave' }) - app.service('people').options.multi = true - - const updated = await app - .service('people') - .update(dave._id, { name: 'Marshal' }, { query: { name: 'Dave' } }) - - assert.deepStrictEqual(updated, { - ...dave, - name: 'Marshal' - }) - - const patched = await app - .service('people') - .patch(dave._id, { name: 'Dave' }, { query: { name: 'Marshal' } }) - - assert.deepStrictEqual(patched, { - ...dave, - name: 'Dave' - }) - - const updatedPipeline = await app - .service('people') - .update(dave._id, { name: 'Marshal' }, { query: { name: 'Dave' }, pipeline: [] }) - - assert.deepStrictEqual(updatedPipeline, { - ...dave, - name: 'Marshal' - }) - - const patchedPipeline = await app - .service('people') - .patch(dave._id, { name: 'Dave' }, { query: { name: 'Marshal' }, pipeline: [] }) - - assert.deepStrictEqual(patchedPipeline, { - ...dave, - name: 'Dave' - }) - - const multiPatch = await app - .service('people') - .patch(null, { name: 'Marshal' }, { query: { name: 'Dave' } }) - - assert.deepStrictEqual(multiPatch, [ - { - ...dave, - name: 'Marshal' - }, - { - ...dave2, - name: 'Marshal' - } - ]) - - const multiPatchPipeline = await app - .service('people') - .patch(null, { name: 'Dave' }, { query: { name: 'Marshal' }, pipeline: [] }) - - assert.deepStrictEqual(multiPatchPipeline, [ - { - ...dave, - name: 'Dave' - }, - { - ...dave2, - name: 'Dave' - } - ]) - - app.service('people').options.multi = false - - app.service('people').remove(dave._id) - app.service('people').remove(dave2._id) - }) - }) - - testSuite(app, errors, 'people', '_id') - testSuite(app, errors, 'people-customid', 'customid') -}) diff --git a/packages/mongodb/tsconfig.json b/packages/mongodb/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/mongodb/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/rest-client/package.json b/packages/rest-client/package.json index 1e32c1d3dd..120399c598 100644 --- a/packages/rest-client/package.json +++ b/packages/rest-client/package.json @@ -42,8 +42,7 @@ ], "scripts": { "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", + "compile": "shx rm -rf lib/ && tsc", "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { @@ -77,4 +76,4 @@ "typescript": "^5.5.4" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} +} \ No newline at end of file diff --git a/packages/schema/CHANGELOG.md b/packages/schema/CHANGELOG.md deleted file mode 100644 index c04c180abe..0000000000 --- a/packages/schema/CHANGELOG.md +++ /dev/null @@ -1,368 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **schema:** Allow regular functions in resolvers ([#3487](https://github.com/feathersjs/feathers/issues/3487)) ([187868e](https://github.com/feathersjs/feathers/commit/187868edd9c0c9d885c482b85be7a90655c86ca2)) - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -### Bug Fixes - -- **schema:** Fix setting dispatch on existing nested objects ([#3380](https://github.com/feathersjs/feathers/issues/3380)) ([04efd5a](https://github.com/feathersjs/feathers/commit/04efd5ab3339beafa0e1a9ef851483a387c6ec96)) - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **schema:** Allow $in and $nin queries to work for arrays ([#3352](https://github.com/feathersjs/feathers/issues/3352)) ([677c214](https://github.com/feathersjs/feathers/commit/677c214a353a7f9a1f90649b9bbec4d0d6517a6f)) -- **schema:** Remove undefined $select when using resolveResult hook ([#3354](https://github.com/feathersjs/feathers/issues/3354)) ([c43e009](https://github.com/feathersjs/feathers/commit/c43e009188eb84f98e3f5f29ac4444e6967afc1f)) - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -### Bug Fixes - -- **schema:** Add typescript as peerDependency ([#3287](https://github.com/feathersjs/feathers/issues/3287)) ([cb562ee](https://github.com/feathersjs/feathers/commit/cb562eeddfa88e34fe5727d4000fa037746b0249)) - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/schema - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **schema:** Exclude json-schema-to-ts@2.8.0 ([#3180](https://github.com/feathersjs/feathers/issues/3180)) ([aee8531](https://github.com/feathersjs/feathers/commit/aee8531b5f0578f11e43b19a469b96e6f4b170ce)) - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **core:** Use Symbol.for to instantiate shared symbols ([#3087](https://github.com/feathersjs/feathers/issues/3087)) ([7f3fc21](https://github.com/feathersjs/feathers/commit/7f3fc2167576f228f8183568eb52b077160e8d65)) -- **memory/mongodb:** $select as only property & force 'id' in '$select' ([#3081](https://github.com/feathersjs/feathers/issues/3081)) ([fbe3cf5](https://github.com/feathersjs/feathers/commit/fbe3cf5199e102b5aeda2ae33828d5034df3d105)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/schema - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -### Bug Fixes - -- **schema:** validateQuery - move next function outside of try-catch ([#3053](https://github.com/feathersjs/feathers/issues/3053)) ([37fe5c4](https://github.com/feathersjs/feathers/commit/37fe5c4a4d813867f6d02098b7c77d08786248c7)) - -### Features - -- **schema:** Add schema helper for handling Object ids ([#3058](https://github.com/feathersjs/feathers/issues/3058)) ([1393bed](https://github.com/feathersjs/feathers/commit/1393bed81a9ee814de6aab0e537af83e667591a2)) - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Bug Fixes - -- **schema:** Do not change the hook context in resolvers ([#3048](https://github.com/feathersjs/feathers/issues/3048)) ([bfd8c04](https://github.com/feathersjs/feathers/commit/bfd8c04c15279063a0d4b70771715c656dda5f7c)) -- **schema:** Ensure that resolveResult and resolveExternal are run as around hooks ([#3032](https://github.com/feathersjs/feathers/issues/3032)) ([71942f4](https://github.com/feathersjs/feathers/commit/71942f418e3afe167aef4f98b1a97356dae7625c)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **configuration:** Add pool and connection object to SQL database default configuration ([#3023](https://github.com/feathersjs/feathers/issues/3023)) ([092c749](https://github.com/feathersjs/feathers/commit/092c749d43f7da4d019576d1210fe7d3719a44a2)) -- **databases:** Ensure that query sanitization is not necessary when using query schemas ([#3022](https://github.com/feathersjs/feathers/issues/3022)) ([dbf514e](https://github.com/feathersjs/feathers/commit/dbf514e85d1508b95c007462a39b3cadd4ff391d)) -- **schema:** Allow any type in resolver hooks ([#3006](https://github.com/feathersjs/feathers/issues/3006)) ([f01281f](https://github.com/feathersjs/feathers/commit/f01281f7d83262738459585fc3f53f56c0a0deb8)) -- **schema:** Ensure all types of nested data are securely dispatched ([#3005](https://github.com/feathersjs/feathers/issues/3005)) ([e4a9da5](https://github.com/feathersjs/feathers/commit/e4a9da5f3288e8e9f02087754473c7a9dfda6cb1)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) -- **schema:** Allow to add additional operators to the query syntax ([#2941](https://github.com/feathersjs/feathers/issues/2941)) ([f324940](https://github.com/feathersjs/feathers/commit/f324940d5795b41e8c6fc113defb0beb7ab03a0a)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **core:** `context.type` for around hooks ([#2890](https://github.com/feathersjs/feathers/issues/2890)) ([d606ac6](https://github.com/feathersjs/feathers/commit/d606ac660fd5335c95206784fea36530dd2e851a)) -- **core:** Improve service option usage and method option typings ([#2902](https://github.com/feathersjs/feathers/issues/2902)) ([164d75c](https://github.com/feathersjs/feathers/commit/164d75c0f11139a316baa91f1762de8f8eb7da2d)) -- **schema:** Allow query schemas with no properties, error on unsupported types ([#2904](https://github.com/feathersjs/feathers/issues/2904)) ([b66c734](https://github.com/feathersjs/feathers/commit/b66c734357478f51b2d38fa7f3eee08640cea26e)) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) -- **cli:** Use separate patch schema and types ([#2916](https://github.com/feathersjs/feathers/issues/2916)) ([7088af6](https://github.com/feathersjs/feathers/commit/7088af64a539dc7f1a016d832b77b98aaaf92603)) -- **schema:** Split resolver options and property resolvers ([#2889](https://github.com/feathersjs/feathers/issues/2889)) ([4822c94](https://github.com/feathersjs/feathers/commit/4822c949812e5a1dceff3c62b2f9de4781b4d601)) -- **schema:** Virtual property resolvers ([#2900](https://github.com/feathersjs/feathers/issues/2900)) ([7d03b57](https://github.com/feathersjs/feathers/commit/7d03b57ae2f633bdd4a368e0d5955011fbd6c329)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/schema - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **schema:** Improve resolver performance ([#2822](https://github.com/feathersjs/feathers/issues/2822)) ([5fa900f](https://github.com/feathersjs/feathers/commit/5fa900f90d55859332c90283dddddab26ae3759c)) -- **schema:** Use the same options for resolveData hook ([#2833](https://github.com/feathersjs/feathers/issues/2833)) ([ed3b050](https://github.com/feathersjs/feathers/commit/ed3b05051db6886729d4824825ca8f00c2459af7)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) -- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6)) - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) -- **schema:** Make schemas validation library independent and add TypeBox support ([#2772](https://github.com/feathersjs/feathers/issues/2772)) ([44172d9](https://github.com/feathersjs/feathers/commit/44172d99b566d11d9ceda04f1d0bf72b6d05ce76)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Bug Fixes - -- **schema:** Fix for Ajv global collision bug [#2681](https://github.com/feathersjs/feathers/issues/2681) ([#2702](https://github.com/feathersjs/feathers/issues/2702)) ([0b2def6](https://github.com/feathersjs/feathers/commit/0b2def6ca483fad6ca22fcc4ea9873bc027925d8)) - -### Features - -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -### Bug Fixes - -- Freeze the resolver context ([#2685](https://github.com/feathersjs/feathers/issues/2685)) ([247dccb](https://github.com/feathersjs/feathers/commit/247dccb2eb72551962030321cb1c0ecb11b0181e)) - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/schema - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/schema - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Bug Fixes - -- **schema:** Fix dispatch resovler hook to convert actually resolved data ([#2663](https://github.com/feathersjs/feathers/issues/2663)) ([f7e87db](https://github.com/feathersjs/feathers/commit/f7e87dbb9a0bc8d89aee47318dddbaa4d6ba5b91)) - -### Features - -- **cli:** Add typed client to a generated app ([#2669](https://github.com/feathersjs/feathers/issues/2669)) ([5b801b5](https://github.com/feathersjs/feathers/commit/5b801b5017ddc3eaa95622b539f51d605916bc86)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -### Bug Fixes - -- **schema:** Always resolve dispatch in resolveAll and add getDispatch method ([#2645](https://github.com/feathersjs/feathers/issues/2645)) ([145b366](https://github.com/feathersjs/feathers/commit/145b366435695438fbc8db9fdb161162ca9049ad)) -- **schema:** remove `default` from queryProperty schemas ([#2646](https://github.com/feathersjs/feathers/issues/2646)) ([940a2b6](https://github.com/feathersjs/feathers/commit/940a2b6868d2f77f81edb1661f6417ec2ea6e372)) - -### Features - -- **core:** Rename async hooks to around hooks, allow usual registration format ([#2652](https://github.com/feathersjs/feathers/issues/2652)) ([2a485a0](https://github.com/feathersjs/feathers/commit/2a485a07929184261f27437fc0fdfe5a44694834)) - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -### Bug Fixes - -- **schema:** Allows resolveData with different resolvers based on method ([#2644](https://github.com/feathersjs/feathers/issues/2644)) ([be71fa2](https://github.com/feathersjs/feathers/commit/be71fa2fe260e05b7dcc0d5f439e33f2e9ec2434)) - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -### Bug Fixes - -- **schema:** Add Combine helper to allow merging schema types that use ([#2637](https://github.com/feathersjs/feathers/issues/2637)) ([06d03e9](https://github.com/feathersjs/feathers/commit/06d03e91abb1347576c2351c12322d01c58473e5)) -- **typescript:** Make additional types generic to work with extended types ([#2625](https://github.com/feathersjs/feathers/issues/2625)) ([269fdec](https://github.com/feathersjs/feathers/commit/269fdecc5961092dc8608b3cbe16f433c80bfa96)) - -### Features - -- **schema:** Add resolveAll hook ([#2643](https://github.com/feathersjs/feathers/issues/2643)) ([85527d7](https://github.com/feathersjs/feathers/commit/85527d71cb78852880696e5d96abdcdf24593934)) -- **schema:** Add resolver for safe external data dispatching ([#2641](https://github.com/feathersjs/feathers/issues/2641)) ([72b980e](https://github.com/feathersjs/feathers/commit/72b980e05631136d30c8f1468dee45ec6a8d2503)) -- **schema:** Add schema resolver converter functionality ([#2640](https://github.com/feathersjs/feathers/issues/2640)) ([26d9e05](https://github.com/feathersjs/feathers/commit/26d9e05327d6e0144466cd57d6fcc11ac7ecb06a)) - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -### Features - -- **schema:** Add querySyntax helper to create full query schemas ([#2621](https://github.com/feathersjs/feathers/issues/2621)) ([2bbb103](https://github.com/feathersjs/feathers/commit/2bbb103b2f3e30fb0fff935f92ad3276a1a67e41)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Features - -- **schema:** Allow hooks to run resolvers in sequence ([#2609](https://github.com/feathersjs/feathers/issues/2609)) ([d85c507](https://github.com/feathersjs/feathers/commit/d85c507c76d07e48fc8e7e28ff7de0ef435e0ef8)) -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Bug Fixes - -- **schema:** result resolver correctly resolves paginated find result ([#2594](https://github.com/feathersjs/feathers/issues/2594)) ([6511e45](https://github.com/feathersjs/feathers/commit/6511e45bd0624f1a629530719709f4b27fecbe0b)) - -### Features - -- **configuration:** Allow app configuration to be validated against a schema ([#2590](https://github.com/feathersjs/feathers/issues/2590)) ([a268f86](https://github.com/feathersjs/feathers/commit/a268f86da92a8ada14ed11ab456aac0a4bba5bb0)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -### Bug Fixes - -- **hooks:** Allow all built-in hooks to be used the async and regular way ([#2559](https://github.com/feathersjs/feathers/issues/2559)) ([8f9f631](https://github.com/feathersjs/feathers/commit/8f9f631e0ce89de349207db72def84e7ab496a4a)) -- **queryProperty:** allow compound oneOf ([#2545](https://github.com/feathersjs/feathers/issues/2545)) ([3077d2d](https://github.com/feathersjs/feathers/commit/3077d2d896a38d579ce4d5b530e21ad332bcf221)) -- **schema:** Properly handle resolver errors ([#2540](https://github.com/feathersjs/feathers/issues/2540)) ([31fbdff](https://github.com/feathersjs/feathers/commit/31fbdff8bd848ac7e0eda56e307ac34b1bfcf17f)) - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Bug Fixes - -- **schema:** Do not error for schemas without properties ([#2519](https://github.com/feathersjs/feathers/issues/2519)) ([96fdb47](https://github.com/feathersjs/feathers/commit/96fdb47d45fd88a8039aa9cc9ec8aebd98672b95)) -- **schema:** Fix resolver data type and use new validation feature in test fixture ([#2523](https://github.com/feathersjs/feathers/issues/2523)) ([1093f12](https://github.com/feathersjs/feathers/commit/1093f124b60524cbd9050fcf07ddaf1d558973da)) - -### Features - -- **schema:** Allow to use custom AJV and test with ajv-formats ([#2513](https://github.com/feathersjs/feathers/issues/2513)) ([ecfa4df](https://github.com/feathersjs/feathers/commit/ecfa4df29f029f6ca8517cacf518c14b46ffeb4e)) -- **schema:** Improve schema typing, validation and extensibility ([#2521](https://github.com/feathersjs/feathers/issues/2521)) ([8c1b350](https://github.com/feathersjs/feathers/commit/8c1b35052792e82d13be03c06583534284fbae82)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/schema - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/schema - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/schema - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -### Features - -- **schema:** Allow resolvers to validate a schema ([#2465](https://github.com/feathersjs/feathers/issues/2465)) ([7d9590b](https://github.com/feathersjs/feathers/commit/7d9590bbe12b94b8b5a7987684f5d4968e426481)) - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -### Features - -- **schema:** Initial version of schema definitions and resolvers ([#2441](https://github.com/feathersjs/feathers/issues/2441)) ([c57a5cd](https://github.com/feathersjs/feathers/commit/c57a5cd56699a121647be4506d8f967e6d72ecae)) diff --git a/packages/schema/LICENSE b/packages/schema/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/schema/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/schema/README.md b/packages/schema/README.md deleted file mode 100644 index 8a893572ef..0000000000 --- a/packages/schema/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/schema - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/schema.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/schema) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> A common data schema definition format - -## Installation - -``` -npm install @feathersjs/schema --save -``` - -## Documentation - -Refer to the [Feathers schema API documentation](https://feathersjs.com/api/schema/) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/schema/package.json b/packages/schema/package.json deleted file mode 100644 index 2f61912328..0000000000 --- a/packages/schema/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "@feathersjs/schema", - "description": "A common data schema definition format", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/schema" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run compile && npm run mocha" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.30", - "@feathersjs/commons": "^5.0.30", - "@feathersjs/errors": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/hooks": "^0.9.0", - "@types/json-schema": "^7.0.15", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "json-schema-to-ts": "^3.1.1" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "ajv-formats": "^3.0.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "typescript": "^5.5.4" - }, - "peerDependencies": { - "typescript": ">=5.5" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/schema/src/default-schemas.ts b/packages/schema/src/default-schemas.ts deleted file mode 100644 index 810af0677a..0000000000 --- a/packages/schema/src/default-schemas.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { FromSchema } from 'json-schema-to-ts' - -export const authenticationSettingsSchema = { - type: 'object', - required: ['secret', 'entity', 'authStrategies'], - properties: { - secret: { - type: 'string', - description: 'The JWT signing secret' - }, - entity: { - oneOf: [ - { - type: 'null' - }, - { - type: 'string' - } - ], - description: 'The name of the authentication entity (e.g. user)' - }, - entityId: { - type: 'string', - description: 'The name of the authentication entity id property' - }, - service: { - type: 'string', - description: 'The path of the entity service' - }, - authStrategies: { - type: 'array', - items: { type: 'string' }, - description: 'A list of authentication strategy names that are allowed to create JWT access tokens' - }, - parseStrategies: { - type: 'array', - items: { type: 'string' }, - description: - 'A list of authentication strategy names that should parse HTTP headers for authentication information (defaults to `authStrategies`)' - }, - jwtOptions: { - type: 'object' - }, - jwt: { - type: 'object', - properties: { - header: { - type: 'string', - default: 'Authorization', - description: 'The HTTP header containing the JWT' - }, - schemes: { - type: 'array', - items: { type: 'string' }, - description: 'An array of schemes to support' - } - } - }, - local: { - type: 'object', - required: ['usernameField', 'passwordField'], - properties: { - usernameField: { - type: 'string', - description: 'Name of the username field (e.g. `email`)' - }, - passwordField: { - type: 'string', - description: 'Name of the password field (e.g. `password`)' - }, - hashSize: { - type: 'number', - description: 'The BCrypt salt length' - }, - errorMessage: { - type: 'string', - default: 'Invalid login', - description: 'The error message to return on errors' - }, - entityUsernameField: { - type: 'string', - description: - 'Name of the username field on the entity if authentication request data and entity field names are different' - }, - entityPasswordField: { - type: 'string', - description: - 'Name of the password field on the entity if authentication request data and entity field names are different' - } - } - }, - oauth: { - type: 'object', - properties: { - redirect: { - type: 'string' - }, - origins: { - type: 'array', - items: { type: 'string' } - }, - defaults: { - type: 'object', - properties: { - key: { type: 'string' }, - secret: { type: 'string' } - } - } - } - } - } -} as const - -export type AuthenticationConfiguration = FromSchema - -export const sqlSettingsSchema = { - type: 'object', - properties: { - client: { type: 'string' }, - pool: { - type: 'object', - properties: { - min: { type: 'number' }, - max: { type: 'number' } - } - }, - connection: { - oneOf: [ - { type: 'string' }, - { - type: 'object', - properties: { - host: { type: 'string' }, - port: { type: 'number' }, - user: { type: 'string' }, - password: { type: 'string' }, - database: { type: 'string' } - } - } - ] - } - } -} as const - -/** - * Schema for properties that are available in a standard Feathers application. - */ -export const defaultAppSettings = { - authentication: authenticationSettingsSchema, - origins: { - type: 'array', - items: { - type: 'string' - } - }, - paginate: { - type: 'object', - additionalProperties: false, - required: ['default', 'max'], - properties: { - default: { type: 'number' }, - max: { type: 'number' } - } - }, - mongodb: { type: 'string' }, - mysql: sqlSettingsSchema, - postgresql: sqlSettingsSchema, - sqlite: sqlSettingsSchema, - mssql: sqlSettingsSchema -} as const - -export const defaultAppConfiguration = { - type: 'object', - additionalProperties: false, - properties: defaultAppSettings -} as const - -export type DefaultAppConfiguration = FromSchema diff --git a/packages/schema/src/hooks/index.ts b/packages/schema/src/hooks/index.ts deleted file mode 100644 index 935ab76328..0000000000 --- a/packages/schema/src/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './resolve' -export * from './validate' diff --git a/packages/schema/src/hooks/resolve.ts b/packages/schema/src/hooks/resolve.ts deleted file mode 100644 index b61bbcb110..0000000000 --- a/packages/schema/src/hooks/resolve.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { compose } from '@feathersjs/hooks' -import { Resolver, ResolverStatus } from '../resolver' - -const getResult = (context: H) => { - const isPaginated = context.method === 'find' && context.result.data - const data = isPaginated ? context.result.data : context.result - - return { isPaginated, data } -} - -const runResolvers = async ( - resolvers: Resolver[], - data: any, - ctx: H, - status?: Partial> -) => { - let current: any = data - - for (const resolver of resolvers) { - if (resolver && typeof resolver.resolve === 'function') { - current = await resolver.resolve(current, ctx, status) - } - } - - return current as T -} - -export type ResolverSetting = Resolver | Resolver[] - -export const resolveQuery = - (...resolvers: Resolver[]) => - async (context: H, next?: NextFunction) => { - const data = context?.params?.query || {} - const query = await runResolvers(resolvers, data, context) - - context.params = { - ...context.params, - query - } - - if (typeof next === 'function') { - return next() - } - } - -export const resolveData = - (...resolvers: Resolver[]) => - async (context: H, next?: NextFunction) => { - if (context.data !== undefined) { - const data = context.data - - const status = { - originalContext: context - } - - if (Array.isArray(data)) { - context.data = await Promise.all( - data.map((current) => runResolvers(resolvers, current, context, status)) - ) - } else { - context.data = await runResolvers(resolvers, data, context, status) - } - } - - if (typeof next === 'function') { - return next() - } - } - -export const resolveResult = (...resolvers: Resolver[]) => { - const virtualProperties = new Set(resolvers.reduce((acc, current) => acc.concat(current.virtualNames), [])) - - return async (context: H, next: NextFunction) => { - if (typeof next !== 'function') { - throw new Error('The resolveResult hook must be used as an around hook') - } - - const { $resolve, $select, ...query } = context.params?.query || {} - const hasVirtualSelects = Array.isArray($select) && $select.some((name) => virtualProperties.has(name)) - - const resolve = { - originalContext: context, - ...context.params.resolve, - properties: $resolve || $select - } - - context.params = { - ...context.params, - resolve, - query: { - ...query, - ...(!!$select && !hasVirtualSelects ? { $select } : {}) - } - } - - await next() - - const status = context.params.resolve - const { isPaginated, data } = getResult(context) - - const result = Array.isArray(data) - ? await Promise.all(data.map(async (current) => runResolvers(resolvers, current, context, status))) - : await runResolvers(resolvers, data, context, status) - - if (isPaginated) { - context.result.data = result - } else { - context.result = result - } - } -} - -export const DISPATCH = Symbol.for('@feathersjs/schema/dispatch') - -export const getDispatchValue = (value: any): any => { - if (typeof value === 'object' && value !== null) { - if (value[DISPATCH] !== undefined) { - return value[DISPATCH] - } - - if (Array.isArray(value)) { - return value.map((item) => getDispatchValue(item)) - } - } - - return value -} - -export const getDispatch = (value: any): any => - typeof value === 'object' && value !== null && value[DISPATCH] ? value[DISPATCH] : null - -export const setDispatch = (current: any, dispatch: any) => { - Object.defineProperty(current, DISPATCH, { - value: dispatch, - enumerable: false, - configurable: false - }) - - return dispatch -} - -export const resolveExternal = - (...resolvers: Resolver[]) => - async (context: H, next: NextFunction) => { - if (typeof next !== 'function') { - throw new Error('The resolveExternal hook must be used as an around hook') - } - - await next() - - const existingDispatch = getDispatch(context.result) - - if (existingDispatch !== null) { - context.dispatch = existingDispatch - } else { - const status = context.params.resolve - const { isPaginated, data } = getResult(context) - const resolveAndGetDispatch = async (current: any) => { - const currentExistingDispatch = getDispatch(current) - - if (currentExistingDispatch !== null) { - return currentExistingDispatch - } - - const resolved = await runResolvers(resolvers, current, context, status) - const currentDispatch = Object.keys(resolved).reduce( - (res, key) => { - res[key] = getDispatchValue(resolved[key]) - - return res - }, - {} as Record - ) - - return setDispatch(current, currentDispatch) - } - - const result = await (Array.isArray(data) - ? Promise.all(data.map(resolveAndGetDispatch)) - : resolveAndGetDispatch(data)) - const dispatch = isPaginated - ? { - ...context.result, - data: result - } - : result - - context.dispatch = setDispatch(context.result, dispatch) - } - } - -export const resolveDispatch = resolveExternal - -type ResolveAllSettings = { - data?: { - create: Resolver - patch: Resolver - update: Resolver - } - query?: Resolver - result?: Resolver - dispatch?: Resolver -} - -const dataMethods = ['create', 'update', 'patch'] as const - -/** - * Resolve all resolvers at once. - * - * @param map The individual resolvers - * @returns A combined resolver middleware - * @deprecated Use individual data, query and external resolvers and hooks instead. - * @see https://dove.feathersjs.com/guides/cli/service.schemas.html - */ -export const resolveAll = (map: ResolveAllSettings) => { - const middleware = [] - - middleware.push(resolveDispatch(map.dispatch)) - - if (map.result) { - middleware.push(resolveResult(map.result)) - } - - if (map.query) { - middleware.push(resolveQuery(map.query)) - } - - if (map.data) { - dataMethods.forEach((name) => { - if (map.data[name]) { - const resolver = resolveData(map.data[name]) - - middleware.push(async (context: H, next: NextFunction) => - context.method === name ? resolver(context, next) : next() - ) - } - }) - } - - return compose(middleware) -} diff --git a/packages/schema/src/hooks/validate.ts b/packages/schema/src/hooks/validate.ts deleted file mode 100644 index 37bcfb0a60..0000000000 --- a/packages/schema/src/hooks/validate.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { BadRequest } from '@feathersjs/errors' -import { VALIDATED } from '@feathersjs/adapter-commons' -import { Schema, Validator } from '../schema' -import { DataValidatorMap } from '../json-schema' - -export const validateQuery = (schema: Schema | Validator) => { - const validator: Validator = typeof schema === 'function' ? schema : schema.validate.bind(schema) - - return async (context: H, next?: NextFunction) => { - const data = context?.params?.query || {} - - try { - const query = await validator(data) - - Object.defineProperty(query, VALIDATED, { value: true }) - - context.params = { - ...context.params, - query - } - } catch (error: any) { - throw error.ajv ? new BadRequest(error.message, error.errors) : error - } - - if (typeof next === 'function') { - return next() - } - } -} - -export const validateData = (schema: Schema | DataValidatorMap | Validator) => { - return async (context: H, next?: NextFunction) => { - const data = context.data - const validator = - typeof (schema as Schema).validate === 'function' - ? (schema as Schema).validate.bind(schema) - : typeof schema === 'function' - ? schema - : (schema as any)[context.method] - - if (validator) { - try { - if (Array.isArray(data)) { - context.data = await Promise.all(data.map((current) => validator(current))) - } else { - context.data = await validator(data) - } - - Object.defineProperty(context.data, VALIDATED, { value: true }) - } catch (error: any) { - throw error.ajv ? new BadRequest(error.message, error.errors) : error - } - } - - if (typeof next === 'function') { - return next() - } - } -} diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts deleted file mode 100644 index 6e5e2ba8fa..0000000000 --- a/packages/schema/src/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import addFormats, { FormatName, FormatOptions, FormatsPluginOptions } from 'ajv-formats' -import { ResolverStatus } from './resolver' - -export type { FromSchema } from 'json-schema-to-ts' -export { addFormats, FormatName, FormatOptions, FormatsPluginOptions } - -export * from './schema' -export * from './resolver' -export * from './hooks' -export * from './json-schema' -export * from './default-schemas' - -export * as hooks from './hooks' -export * as jsonSchema from './json-schema' - -export type Infer = S['_type'] - -export type Combine = Pick, Exclude, keyof U>> & U - -declare module '@feathersjs/feathers/lib/declarations' { - interface Params { - resolve?: ResolverStatus - } -} diff --git a/packages/schema/src/json-schema.ts b/packages/schema/src/json-schema.ts deleted file mode 100644 index 0d0739b49b..0000000000 --- a/packages/schema/src/json-schema.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { _ } from '@feathersjs/commons' -import { JSONSchema } from 'json-schema-to-ts' -import { JSONSchemaDefinition, Ajv, Validator } from './schema' - -export type DataSchemaMap = { - create: JSONSchemaDefinition - update?: JSONSchemaDefinition - patch?: JSONSchemaDefinition -} - -export type DataValidatorMap = { - create: Validator - update: Validator - patch: Validator -} - -/** - * Returns a compiled validation function for a schema and AJV validator instance. - * - * @param schema The JSON schema definition - * @param validator The AJV validation instance - * @returns A compiled validation function - */ -export const getValidator = (schema: JSONSchemaDefinition, validator: Ajv): Validator => - validator.compile({ - $async: true, - ...(schema as any) - }) as any as Validator - -/** - * Returns compiled validation functions to validate data for the `create`, `update` and `patch` - * service methods. If not passed explicitly, the `update` validator will be the same as the `create` - * and `patch` will be the `create` validator with no required fields. - * - * @param def Either general JSON schema definition or a mapping of `create`, `update` and `patch` - * to their respecitve JSON schema - * @param validator The Ajv instance to use as the validator - * @returns A map of validator functions - */ -export const getDataValidator = ( - def: JSONSchemaDefinition | DataSchemaMap, - validator: Ajv -): DataValidatorMap => { - const schema = ((def as any).create ? def : { create: def }) as DataSchemaMap - - return { - create: getValidator(schema.create, validator), - update: getValidator( - schema.update || { - ...(schema.create as any), - $id: `${schema.create.$id}Update` - }, - validator - ), - patch: getValidator( - schema.patch || { - ...(schema.create as any), - $id: `${schema.create.$id}Patch`, - required: [] - }, - validator - ) - } -} - -export type PropertyQuery = { - anyOf: [ - D, - { - type: 'object' - additionalProperties: false - properties: { - $gt: D - $gte: D - $lt: D - $lte: D - $ne: D - $in: { - type: 'array' - items: D - } - $nin: { - type: 'array' - items: D - } - } & X - } - ] -} - -/** - * Create a Feathers query syntax compatible JSON schema definition for a property definition. - * - * @param def The property definition (e.g. `{ type: 'string' }`) - * @param extensions Additional properties to add to the query property schema - * @returns A JSON schema definition for the Feathers query syntax for this property. - */ -export const queryProperty = ( - def: T, - extensions: X = {} as X -) => { - const definition = _.omit(def, 'default') - return { - anyOf: [ - definition, - { - type: 'object', - additionalProperties: false, - properties: { - $gt: definition, - $gte: definition, - $lt: definition, - $lte: definition, - $ne: definition, - $in: - definition.type === 'array' - ? definition - : { - type: 'array', - items: definition - }, - $nin: - definition.type === 'array' - ? definition - : { - type: 'array', - items: definition - }, - ...extensions - } - } - ] - } as const -} - -/** - * Creates Feathers a query syntax compatible JSON schema for multiple properties. - * - * @param definitions A map of property definitions - * @param extensions Additional properties to add to the query property schema - * @returns The JSON schema definition for the Feathers query syntax for multiple properties - */ -export const queryProperties = < - T extends { [key: string]: JSONSchema }, - X extends { [K in keyof T]?: { [key: string]: JSONSchema } } ->( - definitions: T, - extensions: X = {} as X -) => - Object.keys(definitions).reduce( - (res, key) => { - const result = res as any - const definition = definitions[key] - - result[key] = queryProperty(definition as JSONSchemaDefinition, extensions[key as keyof T]) - - return result - }, - {} as { [K in keyof T]: PropertyQuery } - ) - -/** - * Creates a JSON schema for the complete Feathers query syntax including `$limit`, $skip` - * and `$sort` and `$select` for the allowed properties. - * - * @param definition The property definitions to create the query syntax schema for - * @param extensions Additional properties to add to the query property schema - * @returns A JSON schema for the complete query syntax - */ -export const querySyntax = < - T extends { [key: string]: JSONSchema }, - X extends { [K in keyof T]?: { [key: string]: JSONSchema } } ->( - definition: T, - extensions: X = {} as X -) => { - const keys = Object.keys(definition) - const props = queryProperties(definition, extensions) - const $or = { - type: 'array', - items: { - type: 'object', - additionalProperties: false, - properties: props - } - } as const - const $and = { - type: 'array', - items: { - type: 'object', - additionalProperties: false, - properties: { - ...props, - $or - } - } - } as const - - return { - $limit: { - type: 'number', - minimum: 0 - }, - $skip: { - type: 'number', - minimum: 0 - }, - $sort: { - type: 'object', - properties: keys.reduce( - (res, key) => { - const result = res as any - - result[key] = { - type: 'number', - enum: [1, -1] - } - - return result - }, - {} as { [K in keyof T]: { readonly type: 'number'; readonly enum: [1, -1] } } - ) - }, - $select: { - type: 'array', - maxItems: keys.length, - items: { - type: 'string', - ...(keys.length > 0 ? { enum: keys as any as (keyof T)[] } : {}) - } - }, - $or, - $and, - ...props - } as const -} - -export const ObjectIdSchema = () => - ({ - anyOf: [ - { type: 'string', objectid: true }, - { type: 'object', properties: {}, additionalProperties: true } - ] - }) as const diff --git a/packages/schema/src/resolver.ts b/packages/schema/src/resolver.ts deleted file mode 100644 index 4c191ca79d..0000000000 --- a/packages/schema/src/resolver.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { BadRequest } from '@feathersjs/errors' -import { Schema } from './schema' - -type PromiseOrLiteral = Promise | V - -export type PropertyResolver = (( - value: V | undefined, - obj: T, - context: C, - status: ResolverStatus -) => PromiseOrLiteral) & { [IS_VIRTUAL]?: boolean } - -export type VirtualResolver = ( - obj: T, - context: C, - status: ResolverStatus -) => PromiseOrLiteral - -export const IS_VIRTUAL = Symbol.for('@feathersjs/schema/virtual') - -/** - * Create a resolver for a virtual property. A virtual property is a property that - * is computed and never has an initial value. - * - * @param virtualResolver The virtual resolver function - * @returns The property resolver function - */ -export const virtual = (virtualResolver: VirtualResolver) => { - const propertyResolver: PropertyResolver = async (_value, obj, context, status) => - virtualResolver(obj, context, status) - - propertyResolver[IS_VIRTUAL] = true - - return propertyResolver -} - -export type PropertyResolverMap = { - [key in keyof T]?: PropertyResolver | ReturnType> -} - -export type ResolverConverter = ( - obj: any, - context: C, - status: ResolverStatus -) => PromiseOrLiteral - -export interface ResolverOptions { - schema?: Schema - /** - * A converter function that is run before property resolvers - * to transform the initial data into a different format. - */ - converter?: ResolverConverter -} - -export interface ResolverConfig extends ResolverOptions { - /** - * @deprecated Use the `validateData` and `validateQuery` hooks explicitly instead - */ - validate?: 'before' | 'after' | false - /** - * The properties to resolve - */ - properties: PropertyResolverMap -} - -export interface ResolverStatus { - path: string[] - originalContext?: C - properties?: (keyof T)[] - stack: PropertyResolver[] -} - -export class Resolver { - readonly _type!: T - public propertyNames: (keyof T)[] - public virtualNames: (keyof T)[] - - constructor(public readonly options: ResolverConfig) { - this.propertyNames = Object.keys(options.properties) as any as (keyof T)[] - this.virtualNames = this.propertyNames.filter((name) => options.properties[name][IS_VIRTUAL]) - } - - /** - * Resolve a single property - * - * @param name The name of the property - * @param data The current data - * @param context The current resolver context - * @param status The current resolver status - * @returns The resolver property - */ - async resolveProperty( - name: K, - data: D, - context: C, - status: Partial> = {} - ): Promise { - const resolver = this.options.properties[name] - const value = (data as any)[name] - const { path = [], stack = [] } = status || {} - - // This prevents circular dependencies - if (stack.includes(resolver)) { - return undefined - } - - const resolverStatus = { - ...status, - path: [...path, name as string], - stack: [...stack, resolver] - } - - return resolver(value, data as any, context, resolverStatus) - } - - async convert(data: D, context: C, status?: Partial>) { - if (this.options.converter) { - const { path = [], stack = [] } = status || {} - - return this.options.converter(data, context, { ...status, path, stack }) - } - - return data - } - - async resolve(_data: D, context: C, status?: Partial>): Promise { - const { properties: resolvers, schema, validate } = this.options - const payload = await this.convert(_data, context, status) - - if (!Array.isArray(status?.properties) && this.propertyNames.length === 0) { - return payload as T - } - - const data = schema && validate === 'before' ? await schema.validate(payload) : payload - const propertyList = ( - Array.isArray(status?.properties) - ? status?.properties - : // By default get all data and resolver keys but remove duplicates - [...new Set(Object.keys(data).concat(this.propertyNames as string[]))] - ) as (keyof T)[] - - const result: any = {} - const errors: any = {} - let hasErrors = false - - // Not the most elegant but better performance - await Promise.all( - propertyList.map(async (name) => { - const value = (data as any)[name] - - if (resolvers[name]) { - try { - const resolved = await this.resolveProperty(name, data, context, status) - - if (resolved !== undefined) { - result[name] = resolved - } - } catch (error: any) { - // TODO add error stacks - const convertedError = - typeof error.toJSON === 'function' ? error.toJSON() : { message: error.message || error } - - errors[name] = convertedError - hasErrors = true - } - } else if (value !== undefined) { - result[name] = value - } - }) - ) - - if (hasErrors) { - const propertyName = status?.properties ? ` ${status.properties.join('.')}` : '' - - throw new BadRequest('Error resolving data' + (propertyName ? ` ${propertyName}` : ''), errors) - } - - return schema && validate === 'after' ? await schema.validate(result) : result - } -} - -/** - * Create a new resolver with ``. - * - * @param options The configuration for the returned resolver - * @returns A new resolver instance - */ -export function resolve( - properties: PropertyResolverMap, - options?: ResolverOptions -): Resolver -export function resolve(options: ResolverConfig): Resolver -export function resolve( - properties: PropertyResolverMap | ResolverConfig, - options?: ResolverOptions -) { - const settings = ( - (properties as ResolverConfig).properties ? properties : { properties, ...options } - ) as ResolverConfig - - return new Resolver(settings) -} diff --git a/packages/schema/src/schema.ts b/packages/schema/src/schema.ts deleted file mode 100644 index d59396f566..0000000000 --- a/packages/schema/src/schema.ts +++ /dev/null @@ -1,70 +0,0 @@ -import Ajv, { AsyncValidateFunction, ValidateFunction } from 'ajv' -import { FromSchema, JSONSchema } from 'json-schema-to-ts' -import { BadRequest } from '@feathersjs/errors' - -export const DEFAULT_AJV = new Ajv({ - coerceTypes: true, - addUsedSchema: false -}) - -export { Ajv } - -/** - * A validation function that takes data and returns the (possibly coerced) - * data or throws a validation error. - */ -export type Validator = (data: T) => Promise - -export type JSONSchemaDefinition = JSONSchema & { - $id: string - $async?: true - properties?: { [key: string]: JSONSchema } - required?: readonly string[] -} - -export interface Schema { - validate(...args: Parameters>): Promise -} - -export class SchemaWrapper implements Schema> { - ajv: Ajv - validator: AsyncValidateFunction - readonly _type!: FromSchema - - constructor( - public definition: S, - ajv: Ajv = DEFAULT_AJV - ) { - this.ajv = ajv - this.validator = this.ajv.compile({ - $async: true, - ...(this.definition as any) - }) as AsyncValidateFunction - } - - get properties() { - return this.definition.properties as S['properties'] - } - - get required() { - return this.definition.required as S['required'] - } - - async validate>(...args: Parameters>) { - try { - const validated = (await this.validator(...args)) as T - - return validated - } catch (error: any) { - throw new BadRequest(error.message, error.errors) - } - } - - toJSON() { - return this.definition - } -} - -export function schema(definition: S, ajv: Ajv = DEFAULT_AJV) { - return new SchemaWrapper(definition, ajv) -} diff --git a/packages/schema/test/fixture.ts b/packages/schema/test/fixture.ts deleted file mode 100644 index 4456d6aad5..0000000000 --- a/packages/schema/test/fixture.ts +++ /dev/null @@ -1,285 +0,0 @@ -import { feathers, HookContext, Application as FeathersApplication } from '@feathersjs/feathers' -import { memory, MemoryService } from '@feathersjs/memory' -import { GeneralError } from '@feathersjs/errors' -import { AdapterParams } from '@feathersjs/adapter-commons' - -import { - resolve, - resolveResult, - resolveQuery, - resolveData, - validateData, - validateQuery, - querySyntax, - resolveDispatch, - resolveAll, - Ajv, - FromSchema, - getValidator, - getDataValidator, - virtual, - resolveExternal -} from '../src' - -const fixtureAjv = new Ajv({ - coerceTypes: true, - addUsedSchema: false -}) - -export const userDataSchema = { - $id: 'UserData', - type: 'object', - additionalProperties: false, - required: ['email'], - properties: { - email: { type: 'string' }, - password: { type: 'string' } - } -} as const - -export const userDataValidator = getValidator(userDataSchema, fixtureAjv) - -export const userDataValidatorMap = getDataValidator(userDataSchema, fixtureAjv) - -export type UserData = FromSchema - -export const userDataResolver = resolve>({ - properties: { - password: async () => { - return 'hashed' - } - } -}) - -export const userSchema = { - $id: 'User', - type: 'object', - additionalProperties: false, - required: ['id', ...userDataSchema.required], - properties: { - ...userDataSchema.properties, - id: { type: 'number' }, - name: { type: 'string' } - } -} as const - -export type User = FromSchema - -export const userResolver = resolve>({ - name: async (_value, user) => user.email.split('@')[0] -}) - -export const userExternalResolver = resolve>({ - properties: { - password: async (): Promise => undefined, - email: async () => '[redacted]' - } -}) - -export const secondUserResolver = resolve>({ - name: async (value, user) => `${value} (${user.email})` -}) - -export const messageDataSchema = { - $id: 'MessageData', - type: 'object', - additionalProperties: false, - required: ['text', 'userId'], - properties: { - text: { type: 'string' }, - userId: { type: 'number' } - } -} as const - -export type MessageData = FromSchema - -export const messageSchema = { - $id: 'MessageResult', - type: 'object', - additionalProperties: false, - required: ['id', ...messageDataSchema.required], - properties: { - ...messageDataSchema.properties, - id: { type: 'number' }, - user: { $ref: 'User' }, - userList: { type: 'array', items: { $ref: 'User' } }, - userPage: { type: 'object' } - } -} as const - -export type Message = FromSchema< - typeof messageSchema, - { - references: [typeof userSchema] - } -> - -export const messageResolver = resolve>({ - user: virtual(async (message, context) => { - const { userId } = message - - if (context.params.error === true) { - throw new GeneralError('This is an error') - } - - const { - data: [user] - } = (await context.app.service('users').find({ - ...context.params, - paginate: { default: 2 }, - query: { - id: userId - } - })) as any - - return user as Message['user'] - }), - userList: virtual(async (_message, context) => { - const users = await context.app.service('users').find({ - paginate: false - }) - - return users.map((user) => user) as any - }), - userPage: virtual(async (_message, context) => { - const users = await context.app.service('users').find({ - adapter: { - paginate: { - default: 2 - } - } - }) - - return users as any - }) -}) - -export const otherMessageResolver = resolve<{ text: string }, HookContext>({}) - -export const messageQuerySchema = { - $id: 'MessageQuery', - type: 'object', - additionalProperties: false, - required: [], - properties: { - ...querySyntax(messageDataSchema.properties), - $select: { - type: 'array', - items: { type: 'string' } - }, - $resolve: { - type: 'array', - items: { type: 'string' } - } - } -} as const - -export type MessageQuery = FromSchema - -export const messageQueryValidator = getValidator(messageQuerySchema, fixtureAjv) - -export const messageQueryResolver = resolve>({ - userId: async (value, _query, context) => { - if (context.params?.user) { - return context.params.user.id - } - - return value - } -}) - -interface ServiceParams extends AdapterParams { - user?: User - error?: boolean -} - -class MessageService extends MemoryService { - async customMethod(data: any) { - return data - } -} - -const findResult = { message: 'Hello' } -class CustomService { - async find() { - return [findResult] - } -} - -const customMethodDataResolver = resolve>({ - properties: { - userId: async () => 0, - additionalData: async () => 'additional data' - } -}) - -type ServiceTypes = { - users: MemoryService - messages: MessageService - paginatedMessages: MemoryService - custom: CustomService -} -type Application = FeathersApplication - -const app = feathers() - -app.use( - 'users', - memory({ - multi: ['create'] - }) -) -app.use('messages', new MessageService(), { - methods: ['find', 'get', 'create', 'update', 'patch', 'remove', 'customMethod'] -}) -app.use('custom', new CustomService()) - -app.service('custom').hooks({ - around: { - all: [resolveExternal(resolve>({}))] - } -}) - -app.use('paginatedMessages', memory({ paginate: { default: 10 } })) - -app.service('messages').hooks({ - around: { - all: [ - resolveAll({ - result: messageResolver, - query: messageQueryResolver - }), - validateQuery(messageQueryValidator) - ], - customMethod: [resolveData(customMethodDataResolver)], - find: [ - async (context, next) => { - // A hook that makes sure that virtual properties are not passed to the adapter as `$select` - // An SQL adapter would throw an error if it received a query like this - if (context.params?.query?.$select && context.params?.query?.$select.includes('user')) { - throw new Error('Invalid $select') - } - await next() - } - ] - } -}) - -app - .service('paginatedMessages') - .hooks([ - resolveDispatch(), - resolveResult(messageResolver, otherMessageResolver), - validateQuery(messageQueryValidator), - resolveQuery(messageQueryResolver) - ]) - -app - .service('users') - .hooks([resolveDispatch(userExternalResolver), resolveResult(userResolver, secondUserResolver)]) - -app.service('users').hooks({ - create: [validateData(userDataValidator), validateData(userDataValidatorMap), resolveData(userDataResolver)] -}) - -export { app } diff --git a/packages/schema/test/hooks.test.ts b/packages/schema/test/hooks.test.ts deleted file mode 100644 index b7a5b1c8a0..0000000000 --- a/packages/schema/test/hooks.test.ts +++ /dev/null @@ -1,276 +0,0 @@ -import { createContext } from '@feathersjs/feathers' -import assert from 'assert' -import { app, Message, User } from './fixture' - -describe('@feathersjs/schema/hooks', () => { - const text = 'Hi there' - let message: Message - let messageOnPaginatedService: Message - let user: User - - const userProps = (user: User) => ({ - user, - userList: [user], - userPage: { - limit: 2, - skip: 0, - total: 1, - data: [user] - } - }) - - before(async () => { - user = ( - await app.service('users').create([ - { - email: 'hello@feathersjs.com', - password: 'supersecret' - } - ]) - )[0] - message = await app.service('messages').create({ - text, - userId: user.id - }) - messageOnPaginatedService = await app.service('paginatedMessages').create({ - text, - userId: user.id - }) - }) - - it('ran resolvers in sequence', async () => { - assert.strictEqual(user.name, 'hello (hello@feathersjs.com)') - }) - - it('validates data', async () => { - assert.rejects(() => app.service('users').create({ password: 'failing' } as any), { - name: 'BadRequest' - }) - }) - - it('resolves results and handles resolver errors (#2534)', async () => { - const payload = { - userId: user.id, - text - } - - assert.ok(user) - assert.strictEqual(user.password, 'hashed', 'Resolved data') - assert.deepStrictEqual(message, { - id: 0, - ...userProps(user), - ...payload - }) - - const messages = await app.service('messages').find({ - provider: 'external' - }) - - assert.deepStrictEqual(messages, [ - { - id: 0, - ...userProps(user), - ...payload - } - ]) - - await assert.rejects( - () => - app.service('messages').find({ - provider: 'external', - error: true - }), - { - name: 'BadRequest', - message: 'Error resolving data', - code: 400, - className: 'bad-request', - data: { - user: { - name: 'GeneralError', - message: 'This is an error', - code: 500, - className: 'general-error' - } - } - } - ) - }) - - it('resolves get result with the object on result', async () => { - const payload = { - userId: user.id, - text - } - - assert.ok(user) - assert.strictEqual(user.password, 'hashed', 'Resolved data') - assert.deepStrictEqual(message, { - id: 0, - ...userProps(user), - ...payload - }) - - const result = await app.service('messages').get(0, { - provider: 'external' - }) - - assert.deepStrictEqual(result, { - id: 0, - ...userProps(user), - ...payload - }) - }) - - it('resolves with $select and virtual properties', async () => { - const messages = await app.service('messages').find({ - paginate: false, - query: { - $select: ['user', 'text'] - } - }) - assert.deepStrictEqual(Object.keys(messages[0]), ['text', 'user']) - }) - - it('resolves find results with paginated result object', async () => { - const payload = { - userId: user.id, - text - } - - assert.ok(user) - assert.strictEqual(user.password, 'hashed', 'Resolved data') - assert.deepStrictEqual(messageOnPaginatedService, { - id: 0, - ...userProps(user), - ...payload - }) - - const messages = await app.service('paginatedMessages').find({ - provider: 'external', - query: { - $limit: 1, - $skip: 0 - } - }) - - assert.deepStrictEqual(messages, { - limit: 1, - skip: 0, - total: 1, - data: [ - { - id: 0, - ...userProps(user), - ...payload - } - ] - }) - }) - - it('resolves safe dispatch data recursively and with arrays and pages', async () => { - const service = app.service('messages') - const context = await service.get(0, {}, createContext(service as any, 'get')) - const user = { - id: 0, - email: '[redacted]', - name: 'hello (hello@feathersjs.com)' - } - - assert.strictEqual(context.result.user.password, 'hashed') - - assert.deepStrictEqual(context.dispatch, { - text: 'Hi there', - userId: 0, - id: 0, - ...userProps(user) - }) - }) - - it('resolves safe dispatch with static data', async () => { - const service = app.service('custom') - - await service.find() - assert.deepStrictEqual(await service.find(), [{ message: 'Hello' }]) - }) - - it('resolves data for custom methods', async () => { - const result = await app.service('messages').customMethod({ message: 'Hello' }) - const user = { - email: 'hello@feathersjs.com', - password: 'hashed', - id: 0, - name: 'hello (hello@feathersjs.com)' - } - - assert.deepStrictEqual(result, { - message: 'Hello', - userId: 0, - additionalData: 'additional data', - ...userProps(user) - }) - }) - - it('validates and converts the query', async () => { - const otherUser = await app.service('users').create({ - email: 'helloagain@feathersjs.com', - password: 'supersecret' - }) - - await app.service('messages').create({ - text, - userId: otherUser.id - }) - - const messages = await app.service('messages').find({ - paginate: false, - query: { - userId: `${user.id}` - } - }) - - assert.strictEqual(messages.length, 1) - - const userMessages = await app.service('messages').find({ - paginate: false, - user - }) - - assert.strictEqual(userMessages.length, 1) - assert.strictEqual(userMessages[0].userId, user.id) - - const msg = await app.service('messages').get(userMessages[0].id, { - query: { - $resolve: ['user'] - } - }) - - assert.deepStrictEqual(msg, { - user - }) - - assert.rejects( - () => - app.service('messages').find({ - query: { - thing: 'me' - } - }), - { - name: 'BadRequest', - message: 'validation failed', - code: 400, - className: 'bad-request', - data: [ - { - instancePath: '', - schemaPath: '#/additionalProperties', - keyword: 'additionalProperties', - params: { additionalProperty: 'thing' }, - message: 'must NOT have additional properties' - } - ] - } - ) - }) -}) diff --git a/packages/schema/test/json-schema.test.ts b/packages/schema/test/json-schema.test.ts deleted file mode 100644 index d927f8f5a4..0000000000 --- a/packages/schema/test/json-schema.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import Ajv from 'ajv' -import assert from 'assert' -import { ObjectId as MongoObjectId } from 'mongodb' -import { FromSchema } from '../src' -import { querySyntax, ObjectIdSchema } from '../src/json-schema' - -describe('@feathersjs/schema/json-schema', () => { - it('querySyntax works with no properties', async () => { - const schema = { - type: 'object', - properties: querySyntax({}) - } - - new Ajv().compile(schema) - }) - - it('querySyntax with extensions', async () => { - const schema = { - name: { - type: 'string' - }, - age: { - type: 'number' - } - } as const - - const querySchema = { - type: 'object', - properties: querySyntax(schema, { - name: { - $ilike: { - type: 'string' - } - }, - age: { - $value: { - type: 'null' - } - } - } as const) - } as const - - type Query = FromSchema - - const q: Query = { - name: { - $ilike: 'hello' - }, - age: { - $value: null, - $gte: 42 - } - } - - const validator = new Ajv({ strict: false }).compile(querySchema) - - assert.ok(validator(q)) - }) - - it('$in and $nin works with array definitions', async () => { - const schema = { - things: { - type: 'array', - items: { type: 'number' } - } - } as const - - const querySchema = { - type: 'object', - properties: querySyntax(schema) - } as const - - type Query = FromSchema - - const q: Query = { - things: { - $in: [10, 20], - $nin: [30] - } - } - - const validator = new Ajv({ strict: false }).compile(querySchema) - - assert.ok(validator(q)) - }) - - // Test ObjectId validation - it('ObjectId', async () => { - const schema = { - type: 'object', - properties: { - _id: ObjectIdSchema() - } - } - - const validator = new Ajv({ - strict: false - }).compile(schema) - const validated = await validator({ - _id: '507f191e810c19729de860ea' - }) - assert.ok(validated) - - const validated2 = await validator({ - _id: new MongoObjectId() - }) - assert.ok(validated2) - }) -}) diff --git a/packages/schema/test/resolver.test.ts b/packages/schema/test/resolver.test.ts deleted file mode 100644 index 748c3e0650..0000000000 --- a/packages/schema/test/resolver.test.ts +++ /dev/null @@ -1,220 +0,0 @@ -import assert from 'assert' -import { BadRequest } from '@feathersjs/errors' - -import { FromSchema, schema, resolve, virtual } from '../src' - -describe('@feathersjs/schema/resolver', () => { - const userSchema = { - $id: 'simple-user', - type: 'object', - required: ['firstName', 'lastName'], - additionalProperties: false, - properties: { - firstName: { type: 'string' }, - lastName: { type: 'string' }, - password: { type: 'string' } - } - } as const - const context = { - isContext: true - } - - type User = FromSchema & { - name: string - } - - it('simple resolver', async () => { - const userResolver = resolve({ - password: async (): Promise => undefined, - - name: async (_value, user, ctx, status) => { - assert.deepStrictEqual(ctx, context) - assert.deepStrictEqual(status.path, ['name']) - assert.strictEqual(typeof status.stack[0], 'function') - - return `${user.firstName} ${user.lastName}` - } - }) - - const u = await userResolver.resolve( - { - firstName: 'Dave', - lastName: 'L.' - }, - context - ) - - assert.deepStrictEqual(u, { - firstName: 'Dave', - lastName: 'L.', - name: 'Dave L.' - }) - - const withProps = await userResolver.resolve( - { - firstName: 'David', - lastName: 'L' - }, - context, - { - properties: ['name', 'lastName'] - } - ) - - assert.deepStrictEqual(withProps, { - name: 'David L', - lastName: 'L' - }) - }) - - it('simple resolver with virtual', async () => { - const userResolver = resolve({ - password: async (): Promise => undefined, - - name: virtual(async (user, ctx, status) => { - assert.deepStrictEqual(ctx, context) - assert.deepStrictEqual(status.path, ['name']) - assert.strictEqual(typeof status.stack[0], 'function') - - return `${user.firstName} ${user.lastName}` - }) - }) - - const u = await userResolver.resolve( - { - firstName: 'Dave', - lastName: 'L.' - }, - context - ) - - assert.deepStrictEqual(u, { - firstName: 'Dave', - lastName: 'L.', - name: 'Dave L.' - }) - }) - - it('simple resolver with schema and validation', async () => { - const userFeathersSchema = schema(userSchema) - const userBeforeResolver = resolve({ - schema: userFeathersSchema, - validate: 'before', - properties: { - name: async (_name, user) => `${user.firstName} ${user.lastName}` - } - }) - const userAfterResolver = resolve({ - schema: userFeathersSchema, - validate: 'after', - properties: { - firstName: async (): Promise => undefined - } - }) - - await assert.rejects(() => userBeforeResolver.resolve({}, context), { - message: 'validation failed' - }) - await assert.rejects( - () => - userAfterResolver.resolve( - { - firstName: 'Test', - lastName: 'Me' - }, - context - ), - { - message: 'validation failed' - } - ) - }) - - it('simple resolver with converter', async () => { - const userConverterResolver = resolve({ - converter: async (data) => ({ - firstName: 'Default', - lastName: 'Name', - ...data - }), - properties: { - name: async (_name, user) => `${user.firstName} ${user.lastName}` - } - }) - - const u = await userConverterResolver.resolve({}, context) - - assert.deepStrictEqual(u, { - firstName: 'Default', - lastName: 'Name', - name: 'Default Name' - }) - }) - - it('resolving with errors', async () => { - const dummyResolver = resolve<{ name: string; age: number }, Record>({ - properties: { - name: async (value) => { - if (value === 'Dave') { - throw new Error(`No ${value}s allowed`) - } - - return value - }, - age: async (value) => { - if (value && value < 18) { - throw new BadRequest('Invalid age') - } - - return value - } - } - }) - - assert.rejects( - () => - dummyResolver.resolve( - { - name: 'Dave', - age: 16 - }, - {} - ), - { - name: 'BadRequest', - message: 'Error resolving data', - code: 400, - className: 'bad-request', - data: { - name: { message: 'No Daves allowed' }, - age: { - name: 'BadRequest', - message: 'Invalid age', - code: 400, - className: 'bad-request' - } - } - } - ) - }) - - it('empty resolver returns original data', async () => { - const resolver = resolve({ - properties: {} - }) - const data = { message: 'Hello' } - const resolved = await resolver.resolve(data, {}) - - assert.strictEqual(data, resolved) - }) - - it('empty resolver still allows to select properties', async () => { - const data = { message: 'Hello', name: 'David' } - const resolver = resolve({ - properties: {} - }) - const resolved = await resolver.resolve(data, {}, { properties: ['message'] }) - - assert.deepStrictEqual(resolved, { message: 'Hello' }) - }) -}) diff --git a/packages/schema/test/schema.test.ts b/packages/schema/test/schema.test.ts deleted file mode 100644 index a9358dd4a2..0000000000 --- a/packages/schema/test/schema.test.ts +++ /dev/null @@ -1,341 +0,0 @@ -import assert from 'assert' - -import { schema, Infer, queryProperty } from '../src' -import Ajv, { AnySchemaObject } from 'ajv' -import addFormats from 'ajv-formats' - -const customAjv = new Ajv({ - coerceTypes: true -}) -addFormats(customAjv) - -// Utility for converting "date" and "date-time" string formats into Dates. -customAjv.addKeyword({ - keyword: 'convert', - type: 'string', - compile(schemaVal: boolean, parentSchema: AnySchemaObject) { - return ['date-time', 'date'].includes(parentSchema.format) && schemaVal - ? function (value: string, obj: any) { - const { parentData, parentDataProperty } = obj - // Update date-time string to Date object - parentData[parentDataProperty] = new Date(value) - return true - } - : () => true - } -}) - -describe('@feathersjs/schema/schema', () => { - it('type inference and validation', async () => { - const messageSchema = schema({ - $id: 'message-test', - type: 'object', - required: ['text', 'read'], - additionalProperties: false, - properties: { - text: { - type: 'string' - }, - read: { - type: 'boolean' - }, - upvotes: { - type: 'number' - } - } - } as const) - type Message = Infer - - const message = await messageSchema.validate({ - text: 'hi', - read: 0, - upvotes: '10' - }) - - assert.deepStrictEqual(messageSchema.toJSON(), messageSchema.definition) - assert.deepStrictEqual(message, { - text: 'hi', - read: false, - upvotes: 10 - }) - - await assert.rejects(() => messageSchema.validate({ text: 'failing' }), { - name: 'BadRequest', - data: [ - { - instancePath: '', - keyword: 'required', - message: "must have required property 'read'", - params: { - missingProperty: 'read' - }, - schemaPath: '#/required' - } - ] - }) - }) - - it('uses custom AJV with format validation', async () => { - const formatsSchema = schema( - { - $id: 'formats-test', - type: 'object', - required: [], - additionalProperties: false, - properties: { - dobString: { - type: 'string', - format: 'date' - }, - createdAt: { - type: 'string', - format: 'date-time' - } - } - } as const, - customAjv - ) - - await formatsSchema.validate({ - createdAt: '2021-12-22T23:59:59.999Z' - }) - - try { - await formatsSchema.validate({ - createdAt: '2021-12-22T23:59:59.bbb' - }) - } catch (error: any) { - assert.equal(error.data[0].message, 'must match format "date-time"') - } - }) - - it('custom AJV can convert dates', async () => { - const definition = { - $id: 'converts-formats-test', - type: 'object', - required: [], - additionalProperties: false, - properties: { - dobString: queryProperty({ - type: 'string', - format: 'date', - convert: true - }), - createdAt: { - type: 'string', - format: 'date-time', - convert: true - } - } - } as const - - const formatsSchema = schema(definition, customAjv) - - const validated: any = await formatsSchema.validate({ - dobString: { $gt: '2025-04-25' }, - createdAt: '2021-12-22T23:59:59.999Z' - }) - - assert.ok(validated.dobString.$gt instanceof Date) - assert.ok(validated.createdAt instanceof Date) - }) - - it('schema extension and type inference', async () => { - const messageSchema = schema({ - $id: 'message-ext', - type: 'object', - required: ['text', 'read'], - additionalProperties: false, - properties: { - text: { - type: 'string' - }, - read: { - type: 'boolean' - } - } - } as const) - - const messageResultSchema = schema({ - $id: 'message-ext-vote', - type: 'object', - required: ['upvotes', ...messageSchema.definition.required], - additionalProperties: false, - properties: { - ...messageSchema.definition.properties, - upvotes: { - type: 'number' - } - } - } as const) - - type MessageResult = Infer - - const m = await messageResultSchema.validate({ - text: 'Hi', - read: 'false', - upvotes: '23' - }) - - assert.deepStrictEqual(m, { - text: 'Hi', - read: false, - upvotes: 23 - }) - }) - - it('with references', async () => { - const userSchema = schema( - { - $id: 'ref-user', - type: 'object', - required: ['email'], - additionalProperties: false, - properties: { - email: { type: 'string' }, - age: { type: 'number' } - } - } as const, - customAjv - ) - const messageSchema = schema( - { - $id: 'ref-message', - type: 'object', - required: ['text', 'user'], - additionalProperties: false, - properties: { - text: { - type: 'string' - }, - user: { - $ref: 'ref-user' - } - } - } as const, - customAjv - ) - - type User = Infer - type Message = Infer & { - user: User - } - - const res = await messageSchema.validate({ - text: 'Hello', - user: { - email: 'hello@feathersjs.com', - age: '42' - } - }) - - assert.ok(userSchema) - assert.deepStrictEqual(res, { - text: 'Hello', - user: { email: 'hello@feathersjs.com', age: 42 } - }) - }) - - it('works with oneOf properties (#2508)', async () => { - const oneOfSchema = schema({ - $id: 'schemaA', - oneOf: [ - { - type: 'object', - additionalProperties: false, - required: ['x'], - properties: { - x: { type: 'number' } - } - }, - { - type: 'object', - additionalProperties: false, - required: ['y'], - properties: { - y: { type: 'number' } - } - } - ] - } as const) - - const res = await oneOfSchema.validate({ - x: '3' - }) - - assert.deepStrictEqual(res, { x: 3 }) - }) - - it('can handle compound queryProperty', async () => { - const formatsSchema = schema( - { - $id: 'compoundQueryProperty', - type: 'object', - required: [], - additionalProperties: false, - properties: { - dobString: queryProperty({ - oneOf: [ - { type: 'string', format: 'date', convert: true }, - { type: 'string', format: 'date-time', convert: true }, - { type: 'object' } - ] - }) - } - } as const, - customAjv - ) - - const validated = await formatsSchema.validate({ - dobString: { $gt: '2025-04-25', $lte: new Date('2027-04-25') } - }) - - assert.ok(validated) - }) - - it('can still fail queryProperty validation', async () => { - const formatsSchema = schema( - { - $id: 'compoundQueryPropertyFail', - type: 'object', - required: [], - additionalProperties: false, - properties: { - dobString: queryProperty({ type: 'string' }) - } - } as const, - customAjv - ) - - try { - const validated = await formatsSchema.validate({ - dobString: { $moose: 'test' } - }) - assert(!validated, 'should not have gotten here') - } catch (error: any) { - assert.ok(error.data?.length > 0) - } - }) - - it('removes default from queryProperty schemas like $gt', async () => { - const validator = schema( - { - $id: 'noDefault$gt', - type: 'object', - required: [], - additionalProperties: false, - properties: { - someDate: queryProperty({ default: '0000-00-00', type: 'string' }) - } - } as const, - customAjv - ) - - assert.equal( - validator.definition.properties.someDate.anyOf[1].properties.$gt.type, - 'string', - 'type is found under $gt' - ) - assert(!validator.definition.properties.someDate.anyOf[1].properties.$gt.default, 'no default under $gt') - }) -}) diff --git a/packages/schema/tsconfig.json b/packages/schema/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/schema/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/socketio-client/CHANGELOG.md b/packages/socketio-client/CHANGELOG.md deleted file mode 100644 index 985e9709da..0000000000 --- a/packages/socketio-client/CHANGELOG.md +++ /dev/null @@ -1,609 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.2](https://github.com/feathersjs/feathers/compare/v5.0.1...v5.0.2) (2023-03-23) - -### Bug Fixes - -- **socketio-client:** Move core dependency to the right spot ([#3117](https://github.com/feathersjs/feathers/issues/3117)) ([6cd66f1](https://github.com/feathersjs/feathers/commit/6cd66f13e4e668defb57074413846550b147a51d)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -### Bug Fixes - -- **socketio-client:** Make Socket.io client event target compatible ([#2686](https://github.com/feathersjs/feathers/issues/2686)) ([716c49a](https://github.com/feathersjs/feathers/commit/716c49a270e4be5e5276192092c292f72ffcfa19)) - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **cli:** Add typed client to a generated app ([#2669](https://github.com/feathersjs/feathers/issues/2669)) ([5b801b5](https://github.com/feathersjs/feathers/commit/5b801b5017ddc3eaa95622b539f51d605916bc86)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -### Features - -- **client:** Improve client side custom method support ([#2654](https://github.com/feathersjs/feathers/issues/2654)) ([c138acf](https://github.com/feathersjs/feathers/commit/c138acf50affbe6b66177d084d3c7a3e9220f09f)) - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Features - -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **dependencies:** Fix transport-commons dependency and update other dependencies ([#2284](https://github.com/feathersjs/feathers/issues/2284)) ([05b03b2](https://github.com/feathersjs/feathers/commit/05b03b27b40604d956047e3021d8053c3a137616)) - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) -- **socketio-client:** Fix client transport-commons reference ([#2164](https://github.com/feathersjs/feathers/issues/2164)) ([3a42c54](https://github.com/feathersjs/feathers/commit/3a42c544058456b19c7e21827226541bfa6ad621)) - -### Features - -- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) -- **transport-commons:** New built-in high performance radix router ([#2177](https://github.com/feathersjs/feathers/issues/2177)) ([6d18065](https://github.com/feathersjs/feathers/commit/6d180651b4eb40289ecea3df3575f207aa6c5d1f)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -### Bug Fixes - -- **socketio-client:** Throw an error and show a warning if someone tries to use socket.io-client v3 ([#2135](https://github.com/feathersjs/feathers/issues/2135)) ([cc3521c](https://github.com/feathersjs/feathers/commit/cc3521c935a1cbd690e29b7057998e3898f282db)) - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -### Bug Fixes - -- Change this reference in client libraries to explicitly passed app ([#1597](https://github.com/feathersjs/feathers/issues/1597)) ([4e4d10a](https://github.com/feathersjs/feathers/commit/4e4d10a)) - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -### Bug Fixes - -- Use `export =` in TypeScript definitions ([#1285](https://github.com/feathersjs/feathers/issues/1285)) ([12d0f4b](https://github.com/feathersjs/feathers/commit/12d0f4b)) - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) -- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) - -## [1.2.1](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.2.0...@feathersjs/socketio-client@1.2.1) (2019-01-02) - -### Bug Fixes - -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) - - - -# [1.2.0](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.5...@feathersjs/socketio-client@1.2.0) (2018-12-16) - -### Features - -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) - - - -## [1.1.5](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.4...@feathersjs/socketio-client@1.1.5) (2018-10-25) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) - - - -## [1.1.4](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.3...@feathersjs/socketio-client@1.1.4) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/socketio-client - - - -## [1.1.3](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.2...@feathersjs/socketio-client@1.1.3) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/socketio-client - - - -## [1.1.2](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.1...@feathersjs/socketio-client@1.1.2) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/socketio-client - - - -## 1.1.1 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.1.0](https://github.com/feathersjs/socketio-client/tree/v1.1.0) (2018-02-09) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.3...v1.1.0) - -**Closed issues:** - -- Non compatible with SSR [\#11](https://github.com/feathersjs/socketio-client/issues/11) -- Timeout error, why? [\#9](https://github.com/feathersjs/socketio-client/issues/9) - -**Merged pull requests:** - -- Update @feathersjs/transport-commons to the latest version 🚀 [\#12](https://github.com/feathersjs/socketio-client/pull/12) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.3](https://github.com/feathersjs/socketio-client/tree/v1.0.3) (2018-02-05) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.2...v1.0.3) - -**Merged pull requests:** - -- Move to use transport-commons [\#10](https://github.com/feathersjs/socketio-client/pull/10) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#8](https://github.com/feathersjs/socketio-client/pull/8) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.2](https://github.com/feathersjs/socketio-client/tree/v1.0.2) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.1...v1.0.2) - -**Merged pull requests:** - -- Update documentation to correspond with latest release [\#7](https://github.com/feathersjs/socketio-client/pull/7) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#6](https://github.com/feathersjs/socketio-client/pull/6) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#5](https://github.com/feathersjs/socketio-client/pull/5) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.1](https://github.com/feathersjs/socketio-client/tree/v1.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#4](https://github.com/feathersjs/socketio-client/pull/4) ([daffl](https://github.com/daffl)) - -## [v1.0.0](https://github.com/feathersjs/socketio-client/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.0-pre.3...v1.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#3](https://github.com/feathersjs/socketio-client/pull/3) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.3](https://github.com/feathersjs/socketio-client/tree/v1.0.0-pre.3) (2017-10-23) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.0-pre.2...v1.0.0-pre.3) - -**Merged pull requests:** - -- Use scoped npm packages [\#2](https://github.com/feathersjs/socketio-client/pull/2) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.2](https://github.com/feathersjs/socketio-client/tree/v1.0.0-pre.2) (2017-10-19) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.0-pre.1...v1.0.0-pre.2) - -**Merged pull requests:** - -- Update dependencies to enable Greenkeeper 🌴 [\#1](https://github.com/feathersjs/socketio-client/pull/1) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/socketio-client/tree/v1.0.0-pre.1) (2017-10-18) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/socketio-client/LICENSE b/packages/socketio-client/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/socketio-client/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/socketio-client/README.md b/packages/socketio-client/README.md deleted file mode 100644 index 7bb103c6b6..0000000000 --- a/packages/socketio-client/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/socketio-client - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/socketio-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/socketio-client) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Client for Socket.io Feathers connections - -## Installation - -``` -npm install @feathersjs/socketio-client --save -``` - -## Documentation - -Refer to the [Feathers SocketIO API documentation](https://feathersjs.com/api/client/socketio.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/socketio-client/package.json b/packages/socketio-client/package.json deleted file mode 100644 index 16db0131e8..0000000000 --- a/packages/socketio-client/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "@feathersjs/socketio-client", - "description": "The client for Socket.io through feathers-socketio", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/socketio-client" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run mocha" - }, - "directories": { - "lib": "lib" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30" - }, - "devDependencies": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/memory": "^5.0.30", - "@feathersjs/socketio": "^5.0.30", - "@feathersjs/tests": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "socket.io-client": "^4.7.5", - "ts-node": "^10.9.2", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/socketio-client/src/index.ts b/packages/socketio-client/src/index.ts deleted file mode 100644 index af4000a1ec..0000000000 --- a/packages/socketio-client/src/index.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Service, SocketService } from '@feathersjs/transport-commons/client' -import { Socket } from 'socket.io-client' -import { - Application, - TransportConnection, - defaultEventMap, - defaultServiceMethods -} from '@feathersjs/feathers' - -export { SocketService } - -declare module '@feathersjs/feathers/lib/declarations' { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface FeathersApplication { - /** - * The Socket.io client instance. Usually does not need - * to be accessed directly. - */ - io?: Socket - } -} - -export default function socketioClient(connection: Socket, options?: any) { - if (!connection) { - throw new Error('Socket.io connection needs to be provided') - } - - const defaultService = function (this: any, name: string) { - const events = Object.values(defaultEventMap) - const settings = Object.assign({}, options, { - events, - name, - connection, - method: 'emit' - }) - - return new Service(settings) as any - } - - const initialize = function (app: Application) { - if (app.io !== undefined) { - throw new Error('Only one default client provider can be configured') - } - - app.io = connection as any - app.defaultService = defaultService - app.mixins.unshift((service, _location, options) => { - if (options && options.methods && service instanceof Service) { - const customMethods = options.methods.filter((name) => !defaultServiceMethods.includes(name)) - - service.methods(...customMethods) - } - }) - } - - initialize.Service = Service - initialize.service = defaultService - - return initialize as TransportConnection -} - -if (typeof module !== 'undefined') { - module.exports = Object.assign(socketioClient, module.exports) -} diff --git a/packages/socketio-client/test/index.test.ts b/packages/socketio-client/test/index.test.ts deleted file mode 100644 index a39f8f84e6..0000000000 --- a/packages/socketio-client/test/index.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import { strict as assert } from 'assert' -import { Server } from 'http' -import { CustomMethod, feathers } from '@feathersjs/feathers' -import { io, Socket } from 'socket.io-client' -import { clientTests } from '@feathersjs/tests' - -import { createServer } from './server' -import socketio, { SocketService } from '../src' - -type ServiceTypes = { - '/': SocketService - todos: SocketService & { - customMethod: CustomMethod<{ message: string }> - } - [key: string]: any -} - -describe('@feathersjs/socketio-client', () => { - const app = feathers() - - let socket: Socket - let server: Server - - before(async () => { - server = await createServer().listen(9988) - socket = io('http://localhost:9988') - - const connection = socketio(socket) - - app.configure(connection) - app.use('todos', connection.service('todos'), { - methods: ['find', 'get', 'create', 'patch', 'customMethod'] - }) - }) - - after((done) => { - socket.disconnect() - server.close(done) - }) - - it('throws an error with no connection', () => { - try { - // @ts-ignore - feathers().configure(socketio()) - assert.ok(false) - } catch (e: any) { - assert.strictEqual(e.message, 'Socket.io connection needs to be provided') - } - }) - - it('app has the io attribute', () => { - assert.ok((app as any).io) - }) - - it('throws an error when configured twice', () => { - try { - app.configure(socketio(socket)) - assert.ok(false, 'Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, 'Only one default client provider can be configured') - } - }) - - it('can initialize a client instance', async () => { - const init = socketio(socket) - const totoService = init.service('todos') - - assert.ok(totoService instanceof init.Service, 'Returned service is a client') - - const todos = await totoService.find() - - assert.deepEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - }) - - it('return 404 for non-existent service', async () => { - try { - await app.service('not/me').create({}) - assert.fail('Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, "Service 'not/me' not found") - } - }) - - it('is event target compatible', async () => { - app.service('todo').addEventListener('created', (data: any) => assert.ok(data)) - }) - - it('calls .customMethod', async () => { - const service = app.service('todos') - const result = await service.customMethod({ message: 'hi' }) - - assert.deepStrictEqual(result, { - data: { message: 'hi' }, - provider: 'socketio', - type: 'customMethod' - }) - }) - - clientTests(app, 'todos') - clientTests(app, '/') -}) diff --git a/packages/socketio-client/test/server.ts b/packages/socketio-client/test/server.ts deleted file mode 100644 index 8d579a7998..0000000000 --- a/packages/socketio-client/test/server.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { feathers, Id, Params } from '@feathersjs/feathers' -import socketio from '@feathersjs/socketio' -import '@feathersjs/transport-commons' -import { MemoryService } from '@feathersjs/memory' - -// eslint-disable-next-line no-extend-native -Object.defineProperty(Error.prototype, 'toJSON', { - value() { - const alt: any = {} - - Object.getOwnPropertyNames(this).forEach((key: string) => { - alt[key] = this[key] - }, this) - - return alt - }, - configurable: true, - writable: true -}) - -// Create an in-memory CRUD service for our Todos -class TodoService extends MemoryService { - async get(id: Id, params: Params) { - if (params.query.error) { - throw new Error('Something went wrong') - } - - const data = await super.get(id) - - return Object.assign({ query: params.query }, data) - } - - async customMethod(data: any, { provider }: Params) { - return { - data, - provider, - type: 'customMethod' - } - } -} - -export function createServer() { - const app = feathers() - .configure(socketio()) - .use('/', new TodoService()) - .use('/todos', new TodoService(), { - methods: ['find', 'get', 'create', 'update', 'patch', 'remove', 'customMethod'] - }) - const service = app.service('todos') - const rootService = app.service('/') - const publisher = () => app.channel('general') - const data = { - text: 'some todo', - complete: false - } - - app.on('connection', (connection) => app.channel('general').join(connection)) - - rootService.create(data) - rootService.publish(publisher) - - service.create(data) - service.publish(publisher) - - return app -} diff --git a/packages/socketio-client/tsconfig.json b/packages/socketio-client/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/socketio-client/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/socketio/CHANGELOG.md b/packages/socketio/CHANGELOG.md deleted file mode 100644 index f2ed7e81ad..0000000000 --- a/packages/socketio/CHANGELOG.md +++ /dev/null @@ -1,913 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package @feathersjs/socketio - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **socketio:** Disconnect socket on app disconnect event ([#2896](https://github.com/feathersjs/feathers/issues/2896)) ([4ba0039](https://github.com/feathersjs/feathers/commit/4ba003907843cfc2655798a568b16f07ff8adb1b)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **authentication:** Improve logout and disconnect connection handling ([#2813](https://github.com/feathersjs/feathers/issues/2813)) ([dd77379](https://github.com/feathersjs/feathers/commit/dd77379d8bdcd32d529bef912e672639e4899823)) -- **docs:** Review transport API docs and update Express middleware setup ([#2811](https://github.com/feathersjs/feathers/issues/2811)) ([1b97f14](https://github.com/feathersjs/feathers/commit/1b97f14d474f5613482f259eeaa585c24fcfab43)) - -### Features - -- **cli:** Add authentication client to generated client ([#2801](https://github.com/feathersjs/feathers/issues/2801)) ([bd59f91](https://github.com/feathersjs/feathers/commit/bd59f91b45a01c2eea0c4386e567f4de5aa6ad99)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Bug Fixes - -- **core:** Ensure setup and teardown can be overriden and maintain hook functionality ([#2779](https://github.com/feathersjs/feathers/issues/2779)) ([ab580cb](https://github.com/feathersjs/feathers/commit/ab580cbcaa68d19144d86798c13bf564f9d424a6)) - -### Features - -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Bug Fixes - -- **socketio:** Reinitialize hooks on overriden setup method ([#2722](https://github.com/feathersjs/feathers/issues/2722)) ([5e8e7c4](https://github.com/feathersjs/feathers/commit/5e8e7c442238fdc929a0a36b8b8ca2b230ce761f)) - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -### Bug Fixes - -- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) - -# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -### Bug Fixes - -- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Features - -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) - -### Bug Fixes - -- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) - -**Note:** Version bump only for package @feathersjs/socketio - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **dependencies:** Fix transport-commons dependency and update other dependencies ([#2284](https://github.com/feathersjs/feathers/issues/2284)) ([05b03b2](https://github.com/feathersjs/feathers/commit/05b03b27b40604d956047e3021d8053c3a137616)) - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Bug Fixes - -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) - -### Features - -- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) -- Application service types default to any ([#1566](https://github.com/feathersjs/feathers/issues/1566)) ([d93ba9a](https://github.com/feathersjs/feathers/commit/d93ba9a17edd20d3397bb00f4f6e82e804e42ed6)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) -- **core:** Remove Uberproto ([#2178](https://github.com/feathersjs/feathers/issues/2178)) ([ddf8821](https://github.com/feathersjs/feathers/commit/ddf8821f53317e6a378657f7d66acb03a037ee47)) - -### BREAKING CHANGES - -- **core:** Services no longer extend Uberproto objects and - `service.mixin()` is no longer available. - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### Features - -- **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) - -### BREAKING CHANGES - -- **transport-commons:** Removes the old message format and client service timeout - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### Features - -- **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) - -### BREAKING CHANGES - -- **transport-commons:** Removes the old message format and client service timeout - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) - -**Note:** Version bump only for package @feathersjs/socketio - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -**Note:** Version bump only for package @feathersjs/socketio - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Features - -- **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -### Bug Fixes - -- Typing improvements ([#1580](https://github.com/feathersjs/feathers/issues/1580)) ([7818aec](https://github.com/feathersjs/feathers/commit/7818aec)) - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -**Note:** Version bump only for package @feathersjs/socketio - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -**Note:** Version bump only for package @feathersjs/socketio - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -**Note:** Version bump only for package @feathersjs/socketio - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Expire and remove authenticated real-time connections ([#1512](https://github.com/feathersjs/feathers/issues/1512)) ([2707c33](https://github.com/feathersjs/feathers/commit/2707c33)) -- Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -**Note:** Version bump only for package @feathersjs/socketio - -# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) - -**Note:** Version bump only for package @feathersjs/socketio - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -**Note:** Version bump only for package @feathersjs/socketio - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -**Note:** Version bump only for package @feathersjs/socketio - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - -### Bug Fixes - -- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -### Bug Fixes - -- Use `export =` in TypeScript definitions ([#1285](https://github.com/feathersjs/feathers/issues/1285)) ([12d0f4b](https://github.com/feathersjs/feathers/commit/12d0f4b)) - -### Features - -- Add global disconnect event ([#1355](https://github.com/feathersjs/feathers/issues/1355)) ([85afcca](https://github.com/feathersjs/feathers/commit/85afcca)) - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -### Features - -- Add params.headers to all transports when available ([#1303](https://github.com/feathersjs/feathers/issues/1303)) ([ebce79b](https://github.com/feathersjs/feathers/commit/ebce79b)) - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **package:** update debug to version 3.0.0 ([#83](https://github.com/feathersjs/feathers/issues/83)) ([49f1de9](https://github.com/feathersjs/feathers/commit/49f1de9)) -- **package:** update socket.io to version 2.0.0 ([#75](https://github.com/feathersjs/feathers/issues/75)) ([d4a4b71](https://github.com/feathersjs/feathers/commit/d4a4b71)) - -### chore - -- drop support for Node.js 0.10 ([#48](https://github.com/feathersjs/feathers/issues/48)) ([3f7555a](https://github.com/feathersjs/feathers/commit/3f7555a)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) - -### BREAKING CHANGES - -- This module no longer supports Node.js 0.10 - -## [3.2.9](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.8...@feathersjs/socketio@3.2.9) (2019-01-02) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## [3.2.8](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.7...@feathersjs/socketio@3.2.8) (2018-12-16) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## [3.2.7](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.6...@feathersjs/socketio@3.2.7) (2018-10-25) - -### Bug Fixes - -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) - - - -## [3.2.6](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.5...@feathersjs/socketio@3.2.6) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## [3.2.5](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.4...@feathersjs/socketio@3.2.5) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## [3.2.4](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.3...@feathersjs/socketio@3.2.4) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## 3.2.3 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v3.2.2](https://github.com/feathersjs/socketio/tree/v3.2.2) (2018-06-03) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.2.1...v3.2.2) - -**Merged pull requests:** - -- Update uberproto to the latest version 🚀 [\#117](https://github.com/feathersjs/socketio/pull/117) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.2.1](https://github.com/feathersjs/socketio/tree/v3.2.1) (2018-04-04) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.2.0...v3.2.1) - -**Closed issues:** - -- Connection closed before receiving a handshake response [\#113](https://github.com/feathersjs/socketio/issues/113) -- `yarn add @feathersjs/socketio` gets stuck [\#112](https://github.com/feathersjs/socketio/issues/112) - -**Merged pull requests:** - -- Use latest version of Socket.io \(2.1.0\) [\#115](https://github.com/feathersjs/socketio/pull/115) ([daffl](https://github.com/daffl)) - -## [v3.2.0](https://github.com/feathersjs/socketio/tree/v3.2.0) (2018-02-09) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.1.0...v3.2.0) - -**Closed issues:** - -- My chat room sometimes the user's text has become????? [\#109](https://github.com/feathersjs/socketio/issues/109) - -**Merged pull requests:** - -- Update @feathersjs/transport-commons to the latest version 🚀 [\#111](https://github.com/feathersjs/socketio/pull/111) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.1.0](https://github.com/feathersjs/socketio/tree/v3.1.0) (2018-01-30) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.2...v3.1.0) - -**Closed issues:** - -- How to change 5000ms timeout? [\#107](https://github.com/feathersjs/socketio/issues/107) - -**Merged pull requests:** - -- Change dependency to @feathersjs/transport-commons [\#110](https://github.com/feathersjs/socketio/pull/110) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#108](https://github.com/feathersjs/socketio/pull/108) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.2](https://github.com/feathersjs/socketio/tree/v3.0.2) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.1...v3.0.2) - -**Closed issues:** - -- Updated from feathers-socketio to @feathersjs/socketio; error message [\#104](https://github.com/feathersjs/socketio/issues/104) -- How to stop listening to socket server from client service [\#103](https://github.com/feathersjs/socketio/issues/103) -- Options are not passed to socket-io [\#101](https://github.com/feathersjs/socketio/issues/101) -- feathers / graphql using REST / Sockets [\#97](https://github.com/feathersjs/socketio/issues/97) - -**Merged pull requests:** - -- Update Readme to correspond with latest release [\#106](https://github.com/feathersjs/socketio/pull/106) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#105](https://github.com/feathersjs/socketio/pull/105) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#102](https://github.com/feathersjs/socketio/pull/102) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.1](https://github.com/feathersjs/socketio/tree/v3.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0...v3.0.1) - -**Closed issues:** - -- Remote address IP is always undefined [\#96](https://github.com/feathersjs/socketio/issues/96) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#100](https://github.com/feathersjs/socketio/pull/100) ([daffl](https://github.com/daffl)) -- Updating client use example to fix imports [\#99](https://github.com/feathersjs/socketio/pull/99) ([corymsmith](https://github.com/corymsmith)) - -## [v3.0.0](https://github.com/feathersjs/socketio/tree/v3.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v2.0.1...v3.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#95](https://github.com/feathersjs/socketio/pull/95) ([daffl](https://github.com/daffl)) -- Throw an error when using an incompatible version of Feathers [\#94](https://github.com/feathersjs/socketio/pull/94) ([daffl](https://github.com/daffl)) - -## [v2.0.1](https://github.com/feathersjs/socketio/tree/v2.0.1) (2017-10-31) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0-pre.4...v2.0.1) - -**Merged pull requests:** - -- Add an error when trying to use earlier versions with Feathers v3 [\#93](https://github.com/feathersjs/socketio/pull/93) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.4](https://github.com/feathersjs/socketio/tree/v3.0.0-pre.4) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0-pre.3...v3.0.0-pre.4) - -## [v3.0.0-pre.3](https://github.com/feathersjs/socketio/tree/v3.0.0-pre.3) (2017-10-22) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0-pre.2...v3.0.0-pre.3) - -**Merged pull requests:** - -- Rename repository and update to using npm scopes [\#92](https://github.com/feathersjs/socketio/pull/92) ([daffl](https://github.com/daffl)) -- Updates for Feathers v3 \(Buzzard\) [\#91](https://github.com/feathersjs/socketio/pull/91) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.2](https://github.com/feathersjs/socketio/tree/v3.0.0-pre.2) (2017-10-18) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0-pre.1...v3.0.0-pre.2) - -**Merged pull requests:** - -- Some finishing touches for v3 [\#90](https://github.com/feathersjs/socketio/pull/90) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.1](https://github.com/feathersjs/socketio/tree/v3.0.0-pre.1) (2017-10-17) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v2.0.0...v3.0.0-pre.1) - -**Closed issues:** - -- Filter service updates by ID [\#87](https://github.com/feathersjs/socketio/issues/87) -- An in-range update of mocha is breaking the build 🚨 [\#86](https://github.com/feathersjs/socketio/issues/86) -- An in-range update of babel-cli is breaking the build 🚨 [\#85](https://github.com/feathersjs/socketio/issues/85) -- Connection closed before receiving a handshake response [\#84](https://github.com/feathersjs/socketio/issues/84) -- Maybe acting wrong please look into my test app [\#81](https://github.com/feathersjs/socketio/issues/81) -- Connecting to sockets on a path [\#80](https://github.com/feathersjs/socketio/issues/80) -- An in-range update of babel-core is breaking the build 🚨 [\#79](https://github.com/feathersjs/socketio/issues/79) -- An in-range update of mocha is breaking the build 🚨 [\#78](https://github.com/feathersjs/socketio/issues/78) -- Add Socket.io v2 support [\#77](https://github.com/feathersjs/socketio/issues/77) -- Any chance for socket.io-p2p support? [\#37](https://github.com/feathersjs/socketio/issues/37) - -**Merged pull requests:** - -- Finalizing updates for Feathers v3 [\#89](https://github.com/feathersjs/socketio/pull/89) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#88](https://github.com/feathersjs/socketio/pull/88) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update debug to the latest version 🚀 [\#83](https://github.com/feathersjs/socketio/pull/83) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update to latest plugin infrastructure [\#82](https://github.com/feathersjs/socketio/pull/82) ([daffl](https://github.com/daffl)) - -## [v2.0.0](https://github.com/feathersjs/socketio/tree/v2.0.0) (2017-05-10) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.6.0...v2.0.0) - -**Closed issues:** - -- An in-range update of feathers-hooks is breaking the build 🚨 [\#74](https://github.com/feathersjs/socketio/issues/74) -- An in-range update of debug is breaking the build 🚨 [\#73](https://github.com/feathersjs/socketio/issues/73) -- An in-range update of debug is breaking the build 🚨 [\#71](https://github.com/feathersjs/socketio/issues/71) - -**Merged pull requests:** - -- Update socket.io-client to the latest version 🚀 [\#76](https://github.com/feathersjs/socketio/pull/76) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update socket.io to the latest version 🚀 [\#75](https://github.com/feathersjs/socketio/pull/75) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#72](https://github.com/feathersjs/socketio/pull/72) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.6.0](https://github.com/feathersjs/socketio/tree/v1.6.0) (2017-04-18) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.5.2...v1.6.0) - -**Closed issues:** - -- Add headers and remote ip address to socket.feathers [\#67](https://github.com/feathersjs/socketio/issues/67) - -**Merged pull requests:** - -- Update feathers-hooks to the latest version 🚀 [\#70](https://github.com/feathersjs/socketio/pull/70) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Add port argument [\#69](https://github.com/feathersjs/socketio/pull/69) ([kozzztya](https://github.com/kozzztya)) -- Update dependencies to enable Greenkeeper 🌴 [\#68](https://github.com/feathersjs/socketio/pull/68) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.5.2](https://github.com/feathersjs/socketio/tree/v1.5.2) (2017-03-03) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.5.1...v1.5.2) - -**Merged pull requests:** - -- Server-side socketio typedef to allow `import \* as` syntax when importing [\#65](https://github.com/feathersjs/socketio/pull/65) ([myknbani](https://github.com/myknbani)) - -## [v1.5.1](https://github.com/feathersjs/socketio/tree/v1.5.1) (2017-03-02) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.5.0...v1.5.1) - -**Closed issues:** - -- Typescript definition bug [\#63](https://github.com/feathersjs/socketio/issues/63) - -**Merged pull requests:** - -- fix Typescript issue \(\#63\) [\#64](https://github.com/feathersjs/socketio/pull/64) ([superbarne](https://github.com/superbarne)) -- feathers-hooks@1.8.0 breaks build 🚨 [\#62](https://github.com/feathersjs/socketio/pull/62) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.5.0](https://github.com/feathersjs/socketio/tree/v1.5.0) (2017-03-01) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.4.3...v1.5.0) - -**Merged pull requests:** - -- Typescript Definitions [\#60](https://github.com/feathersjs/socketio/pull/60) ([AbraaoAlves](https://github.com/AbraaoAlves)) - -## [v1.4.3](https://github.com/feathersjs/socketio/tree/v1.4.3) (2017-02-24) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.4.2...v1.4.3) - -**Closed issues:** - -- Get data after connection established [\#59](https://github.com/feathersjs/socketio/issues/59) -- Unable to use feathers from within React \(Feathers vs SocketIO implementation setup issue\) [\#51](https://github.com/feathersjs/socketio/issues/51) - -**Merged pull requests:** - -- Add option to set the maxListeners [\#61](https://github.com/feathersjs/socketio/pull/61) ([Faianca](https://github.com/Faianca)) -- Create .codeclimate.yml [\#56](https://github.com/feathersjs/socketio/pull/56) ([larkinscott](https://github.com/larkinscott)) -- socket.io@1.7.1 breaks build 🚨 [\#54](https://github.com/feathersjs/socketio/pull/54) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-memory to version 1.0.0 🚀 [\#50](https://github.com/feathersjs/socketio/pull/50) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-commons to version 0.8.0 🚀 [\#49](https://github.com/feathersjs/socketio/pull/49) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.4.2](https://github.com/feathersjs/socketio/tree/v1.4.2) (2016-11-02) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.4.1...v1.4.2) - -**Closed issues:** - -- Upgrade to socket.io 1.4 [\#39](https://github.com/feathersjs/socketio/issues/39) -- Disable/restrict failed request queue? [\#38](https://github.com/feathersjs/socketio/issues/38) -- Uncaught \(in promise\) Error: Timeout of 5000ms exceeded calling sites::find\(…\) [\#36](https://github.com/feathersjs/socketio/issues/36) -- Regarding plain websockets [\#34](https://github.com/feathersjs/socketio/issues/34) -- Clean way to subscribe to a filtered set of events [\#32](https://github.com/feathersjs/socketio/issues/32) -- "Can't find variable: Reflect" on bad requests/authentication token missing; react-native [\#31](https://github.com/feathersjs/socketio/issues/31) -- Client should convert error objects to feathers-errors [\#30](https://github.com/feathersjs/socketio/issues/30) - -**Merged pull requests:** - -- 👻😱 Node.js 0.10 is unmaintained 😱👻 [\#48](https://github.com/feathersjs/socketio/pull/48) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Swapping rm to rifraf and using relative path to \_mocha for windows support [\#47](https://github.com/feathersjs/socketio/pull/47) ([corymsmith](https://github.com/corymsmith)) -- jshint —\> semistandard [\#46](https://github.com/feathersjs/socketio/pull/46) ([corymsmith](https://github.com/corymsmith)) -- update feathers dev dependency [\#45](https://github.com/feathersjs/socketio/pull/45) ([ekryski](https://github.com/ekryski)) -- adding code coverage [\#44](https://github.com/feathersjs/socketio/pull/44) ([ekryski](https://github.com/ekryski)) -- socket.io-client@1.5.0 breaks build 🚨 [\#43](https://github.com/feathersjs/socketio/pull/43) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-memory to version 0.8.0 🚀 [\#35](https://github.com/feathersjs/socketio/pull/35) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update mocha to version 3.0.0 🚀 [\#33](https://github.com/feathersjs/socketio/pull/33) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.4.1](https://github.com/feathersjs/socketio/tree/v1.4.1) (2016-05-23) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.4.0...v1.4.1) - -**Closed issues:** - -- README.md broken link to provider documentation [\#23](https://github.com/feathersjs/socketio/issues/23) -- Insecure Defaults Allow MITM Over TLS [\#22](https://github.com/feathersjs/socketio/issues/22) - -**Merged pull requests:** - -- mocha@2.5.0 breaks build 🚨 [\#28](https://github.com/feathersjs/socketio/pull/28) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-socket-commons to version 2.0.0 🚀 [\#27](https://github.com/feathersjs/socketio/pull/27) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#26](https://github.com/feathersjs/socketio/pull/26) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- fix link in README.md to feathers-socketio API docs [\#24](https://github.com/feathersjs/socketio/pull/24) ([ElliotPsyIT](https://github.com/ElliotPsyIT)) - -## [v1.4.0](https://github.com/feathersjs/socketio/tree/v1.4.0) (2016-04-28) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.4...v1.4.0) - -**Merged pull requests:** - -- Client timeout [\#21](https://github.com/feathersjs/socketio/pull/21) ([daffl](https://github.com/daffl)) -- Update feathers-socket-commons to version 1.0.0 🚀 [\#20](https://github.com/feathersjs/socketio/pull/20) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- nsp@2.3.2 breaks build 🚨 [\#18](https://github.com/feathersjs/socketio/pull/18) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- More tests for error cases [\#16](https://github.com/feathersjs/socketio/pull/16) ([daffl](https://github.com/daffl)) - -## [v1.3.4](https://github.com/feathersjs/socketio/tree/v1.3.4) (2016-04-16) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.3...v1.3.4) - -**Merged pull requests:** - -- Increase the default number of maximum event listeners [\#15](https://github.com/feathersjs/socketio/pull/15) ([daffl](https://github.com/daffl)) -- Update feathers-memory to version 0.7.0 🚀 [\#14](https://github.com/feathersjs/socketio/pull/14) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.3.3](https://github.com/feathersjs/socketio/tree/v1.3.3) (2016-02-18) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.2...v1.3.3) - -**Closed issues:** - -- Needs possibility to pass options to io.listen\(\) [\#12](https://github.com/feathersjs/socketio/issues/12) - -**Merged pull requests:** - -- Allow to pass Socket.io options [\#13](https://github.com/feathersjs/socketio/pull/13) ([daffl](https://github.com/daffl)) - -## [v1.3.2](https://github.com/feathersjs/socketio/tree/v1.3.2) (2016-02-11) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.1...v1.3.2) - -**Merged pull requests:** - -- Allow to instantiate a client instance [\#11](https://github.com/feathersjs/socketio/pull/11) ([daffl](https://github.com/daffl)) - -## [v1.3.1](https://github.com/feathersjs/socketio/tree/v1.3.1) (2016-02-09) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.0...v1.3.1) - -## [v1.3.0](https://github.com/feathersjs/socketio/tree/v1.3.0) (2016-02-09) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.2.0...v1.3.0) - -**Merged pull requests:** - -- Update feathers-memory to version 0.6.0 🚀 [\#8](https://github.com/feathersjs/socketio/pull/8) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update lodash to version 4.0.1 🚀 [\#7](https://github.com/feathersjs/socketio/pull/7) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Adding nsp check [\#6](https://github.com/feathersjs/socketio/pull/6) ([marshallswain](https://github.com/marshallswain)) - -## [v1.2.0](https://github.com/feathersjs/socketio/tree/v1.2.0) (2016-01-21) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.1.0...v1.2.0) - -**Closed issues:** - -- Better event filtering [\#2](https://github.com/feathersjs/socketio/issues/2) - -**Merged pull requests:** - -- Refactoring to use feathers-socket-commons that support event filtering [\#5](https://github.com/feathersjs/socketio/pull/5) ([daffl](https://github.com/daffl)) -- Fixing .npmignore entries [\#3](https://github.com/feathersjs/socketio/pull/3) ([corymsmith](https://github.com/corymsmith)) - -## [v1.1.0](https://github.com/feathersjs/socketio/tree/v1.1.0) (2016-01-10) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.0.0...v1.1.0) - -**Merged pull requests:** - -- feathers-socketio/client service and tests [\#1](https://github.com/feathersjs/socketio/pull/1) ([daffl](https://github.com/daffl)) - -## [v1.0.0](https://github.com/feathersjs/socketio/tree/v1.0.0) (2016-01-03) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/socketio/LICENSE b/packages/socketio/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/socketio/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/packages/socketio/README.md b/packages/socketio/README.md deleted file mode 100644 index 2ba5ebaee2..0000000000 --- a/packages/socketio/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/socketio - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/socketio.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/socketio) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> The Feathers Socket.io real-time API provider - -## Installation - -``` -npm install @feathersjs/socketio --save -``` - -## Documentation - -Refer to the [Feathers SocketIO API documentation](https://feathersjs.com/api/socketio.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/socketio/package.json b/packages/socketio/package.json deleted file mode 100644 index f0368b2e28..0000000000 --- a/packages/socketio/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "@feathersjs/socketio", - "description": "The Feathers Socket.io real-time API provider", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/socketio" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/commons": "^5.0.30", - "@feathersjs/feathers": "^5.0.30", - "@feathersjs/transport-commons": "^5.0.30", - "socket.io": "^4.7.5" - }, - "devDependencies": { - "@feathersjs/express": "^5.0.30", - "@feathersjs/memory": "^5.0.30", - "@feathersjs/tests": "^5.0.30", - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "lodash": "^4.17.21", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "socket.io-client": "^4.7.5", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/socketio/src/index.ts b/packages/socketio/src/index.ts deleted file mode 100644 index d502cade9f..0000000000 --- a/packages/socketio/src/index.ts +++ /dev/null @@ -1,103 +0,0 @@ -import http from 'http' -import { Server, ServerOptions } from 'socket.io' -import { createDebug } from '@feathersjs/commons' -import { Application, RealTimeConnection } from '@feathersjs/feathers' -import { socket } from '@feathersjs/transport-commons' - -import { disconnect, params, authentication, FeathersSocket } from './middleware' - -const debug = createDebug('@feathersjs/socketio') - -declare module '@feathersjs/feathers/lib/declarations' { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface Application { - io: any - listen(options: any): Promise - } -} - -function configureSocketio(callback?: (io: Server) => void): (app: Application) => void -function configureSocketio( - options: number | Partial, - callback?: (io: Server) => void -): (app: Application) => void -function configureSocketio( - port: number, - options?: Partial, - callback?: (io: Server) => void -): (app: Application) => void -function configureSocketio(port?: any, options?: any, config?: any) { - if (typeof port !== 'number') { - config = options - options = port - port = null - } - - if (typeof options !== 'object') { - config = options - options = {} - } - - return (app: Application) => { - // Function that gets the connection - const getParams = (socket: FeathersSocket) => socket.feathers - // A mapping from connection to socket instance - const socketMap = new WeakMap() - // Promise that resolves with the Socket.io `io` instance - // when `setup` has been called (with a server) - const done = new Promise((resolve) => { - const { listen, setup } = app as any - - Object.assign(app, { - async listen(this: any, ...args: any[]) { - if (typeof listen === 'function') { - // If `listen` already exists - // usually the case when the app has been expressified - return listen.call(this, ...args) - } - - const server = http.createServer() - - await this.setup(server) - - return server.listen(...args) - }, - - async setup(this: any, server: http.Server, ...rest: any[]) { - if (!this.io) { - const io = (this.io = new Server(port || server, options)) - - io.use(disconnect(app, getParams, socketMap)) - io.use(params(app, socketMap)) - io.use(authentication(app, getParams)) - - // In Feathers it is easy to hit the standard Node warning limit - // of event listeners (e.g. by registering 10 services). - // So we set it to a higher number. 64 should be enough for everyone. - io.sockets.setMaxListeners(64) - } - - if (typeof config === 'function') { - debug('Calling SocketIO configuration function') - config.call(this, this.io) - } - - resolve(this.io) - - return setup.call(this, server, ...rest) - } - }) - }) - - app.configure( - socket({ - done, - socketMap, - getParams, - emit: 'emit' - }) - ) - } -} - -export = configureSocketio diff --git a/packages/socketio/src/middleware.ts b/packages/socketio/src/middleware.ts deleted file mode 100644 index a16fdc8339..0000000000 --- a/packages/socketio/src/middleware.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Application, Params, RealTimeConnection } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { Socket } from 'socket.io' - -const debug = createDebug('@feathersjs/socketio/middleware') - -export type ParamsGetter = (socket: Socket) => any -export type NextFunction = (err?: any) => void -export interface FeathersSocket extends Socket { - feathers?: Params & { [key: string]: any } -} - -export const disconnect = ( - app: Application, - getParams: ParamsGetter, - socketMap: WeakMap -) => { - app.on('disconnect', (connection: RealTimeConnection) => { - const socket = socketMap.get(connection) - if (socket && socket.connected) { - socket.disconnect() - } - }) - - return (socket: FeathersSocket, next: NextFunction) => { - socket.on('disconnect', () => app.emit('disconnect', getParams(socket))) - next() - } -} - -export const params = - (_app: Application, socketMap: WeakMap) => - (socket: FeathersSocket, next: NextFunction) => { - socket.feathers = { - provider: 'socketio', - headers: socket.handshake.headers - } - - socketMap.set(socket.feathers, socket) - - next() - } - -export const authentication = - (app: Application, getParams: ParamsGetter, settings: any = {}) => - (socket: FeathersSocket, next: NextFunction) => { - const service = (app as any).defaultAuthentication - ? (app as any).defaultAuthentication(settings.service) - : null - - if (service === null) { - return next() - } - - const config = service.configuration - const authStrategies = config.parseStrategies || config.authStrategies || [] - - if (authStrategies.length === 0) { - return next() - } - - service - .parse(socket.handshake, null, ...authStrategies) - .then(async (authentication: any) => { - if (authentication) { - debug('Parsed authentication from HTTP header', authentication) - socket.feathers.authentication = authentication - await service.create(authentication, { - provider: 'socketio', - connection: getParams(socket) - }) - } - - next() - }) - .catch(next) - } diff --git a/packages/socketio/test/events.ts b/packages/socketio/test/events.ts deleted file mode 100644 index 52b94e8944..0000000000 --- a/packages/socketio/test/events.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { strict as assert } from 'assert' -import { io, Socket } from 'socket.io-client' -import { verify } from '@feathersjs/tests' -import { RealTimeConnection } from '@feathersjs/feathers' - -export default (name: string, options: any) => { - const call = (method: string, ...args: any[]) => { - return new Promise((resolve, reject) => { - const { socket } = options - const emitArgs = [method, name].concat(args) - - socket.emit(...emitArgs, (error: any, result: any) => (error ? reject(error) : resolve(result))) - }) - } - - const verifyEvent = (done: (err?: any) => void, callback: (data: any) => void) => { - return function (data: any) { - try { - callback(data) - done() - } catch (error: any) { - done(error) - } - } - } - - describe('Basic service events', () => { - let socket: Socket - let connection: RealTimeConnection - - before((done) => { - options.app.once('connection', (conn: RealTimeConnection) => { - connection = conn - - options.app.channel('default').join(connection) - options.app.publish(() => options.app.channel('default')) - done() - }) - socket = io('http://localhost:7886') - }) - - after((done) => { - socket.once('disconnect', () => done()) - socket.disconnect() - }) - - it(`${name} created`, (done) => { - const original = { - name: 'created event' - } - - socket.once( - `${name} created`, - verifyEvent(done, (data) => verify.create(original, data)) - ) - - call('create', original) - }) - - it(`${name} updated`, (done) => { - const original = { - name: 'updated event' - } - - socket.once( - `${name} updated`, - verifyEvent(done, (data: any) => verify.update(10, original, data)) - ) - - call('update', 10, original) - }) - - it(`${name} patched`, (done) => { - const original = { - name: 'patched event' - } - - socket.once( - `${name} patched`, - verifyEvent(done, (data: any) => verify.patch(12, original, data)) - ) - - call('patch', 12, original) - }) - - it(`${name} removed`, (done) => { - socket.once( - `${name} removed`, - verifyEvent(done, (data: any) => verify.remove(333, data)) - ) - - call('remove', 333) - }) - - it(`${name} custom events`, (done) => { - const service = options.app.service(name) - const original = { - name: 'created event' - } - - socket.once( - `${name} log`, - verifyEvent(done, (data: any) => { - assert.deepStrictEqual(data, { - message: 'Custom log event', - data: original - }) - }) - ) - - service.emit('log', { - data: original, - message: 'Custom log event' - }) - }) - }) - - describe('Event channels', () => { - const eventName = `${name} created` - - let connections: RealTimeConnection[] - let sockets: any[] - - before((done) => { - let counter = 0 - const handler = (connection: RealTimeConnection) => { - counter++ - - options.app.channel(connection.channel).join(connection) - - connections.push(connection) - - if (counter === 3) { - done() - options.app.removeListener('connection', handler) - } - } - - connections = [] - sockets = [] - - options.app.on('connection', handler) - - sockets.push( - io('http://localhost:7886', { - query: { channel: 'first' } - }), - - io('http://localhost:7886', { - query: { channel: 'second' } - }), - - io('http://localhost:7886', { - query: { channel: 'second' } - }) - ) - }) - - after(() => { - sockets.forEach((socket) => socket.disconnect()) - }) - - it(`filters '${eventName}' event for a single channel`, (done) => { - const service = options.app.service(name) - const [socket, otherSocket] = sockets - const onError = () => { - done(new Error('Should not get this event')) - } - - service.publish('created', (data: any) => options.app.channel(data.room)) - - socket.once(eventName, (data: any) => { - assert.strictEqual(data.room, 'first') - otherSocket.removeEventListener(eventName, onError) - done() - }) - - otherSocket.once(eventName, onError) - - service.create({ - text: 'Event dispatching test', - room: 'first' - }) - }) - - it(`filters '${name} created' event for a channel with multiple connections`, (done) => { - let counter = 0 - - const service = options.app.service(name) - const [otherSocket, socketOne, socketTwo] = sockets - const onError = () => { - done(new Error('Should not get this event')) - } - const onEvent = (data: any) => { - counter++ - assert.strictEqual(data.room, 'second') - - if (++counter === 2) { - otherSocket.removeEventListener(eventName, onError) - done() - } - } - - service.publish('created', (data: any) => options.app.channel(data.room)) - - socketOne.once(eventName, onEvent) - socketTwo.once(eventName, onEvent) - otherSocket.once(eventName, onError) - - service.create({ - text: 'Event dispatching test', - room: 'second' - }) - }) - }) -} diff --git a/packages/socketio/test/index.test.ts b/packages/socketio/test/index.test.ts deleted file mode 100644 index 8ed7dc4944..0000000000 --- a/packages/socketio/test/index.test.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { strict as assert } from 'assert' -import { - feathers, - Application, - HookContext, - NullableId, - Params, - ApplicationHookContext -} from '@feathersjs/feathers' -import express from '@feathersjs/express' -import { Request, Response } from 'express' -import omit from 'lodash/omit' -import extend from 'lodash/extend' -import { io } from 'socket.io-client' -import axios from 'axios' -import { Server } from 'http' -import { Service } from '@feathersjs/tests' -import { Socket } from 'socket.io-client' - -import methodTests from './methods' -import eventTests from './events' -import socketio from '../src' -import { FeathersSocket, NextFunction } from '../src/middleware.js' - -class VerifierService { - async find(params: Params) { - return { params } - } - - async create(data: any, params: Params) { - return { data, params } - } - - async update(id: NullableId, data: any, params: Params) { - return { id, data, params } - } -} - -describe('@feathersjs/socketio', () => { - let app: Application - let server: Server - let socket: Socket - - const socketParams: any = { - user: { name: 'David' }, - provider: 'socketio' - } - const options = { - get app() { - return app - }, - - get socket() { - return socket - } - } - - before((done) => { - const errorHook = (hook: HookContext) => { - if (hook.params.query.hookError) { - throw new Error(`Error from ${hook.method}, ${hook.type} hook`) - } - } - - app = feathers() - .configure( - socketio((io) => { - io.use(function (socket: FeathersSocket, next: NextFunction) { - socket.feathers.user = { name: 'David' } - socketParams.headers = socket.feathers.headers - - const { channel } = socket.handshake.query as any - - if (channel) { - socket.feathers.channel = channel - } - - next() - }) - }) - ) - .use('/todo', new Service()) - .use('/verify', new VerifierService()) - - app.service('todo').hooks({ - before: { - get: errorHook - } - }) - - app.hooks({ - setup: [ - async (context: ApplicationHookContext, next: NextFunction) => { - assert.notStrictEqual(context.app, undefined) - await next() - } - ] - }) - - app - .listen(7886) - .then((srv) => { - server = srv - server.once('listening', () => { - app.use('/tasks', new Service()) - app.service('tasks').hooks({ - before: { - get: errorHook - } - }) - }) - }) - .catch(done) - - socket = io('http://localhost:7886') - socket.on('connect', () => done()) - }) - - after((done) => { - socket.disconnect() - server.close(done) - }) - - it('runs io before setup (#131)', (done) => { - let counter = 0 - const app = feathers().configure( - socketio(() => { - assert.strictEqual(counter, 0) - counter++ - }) - ) - - app.listen(8887).then((srv) => { - srv.on('listening', () => srv.close(done)) - }) - }) - - it('can set MaxListeners', (done) => { - const app = feathers().configure(socketio((io) => io.sockets.setMaxListeners(100))) - - app.listen(8987).then((srv) => { - srv.on('listening', () => { - assert.strictEqual(app.io.sockets.getMaxListeners(), 100) - srv.close(done) - }) - }) - }) - - it('expressified app works', async () => { - const data = { message: 'Hello world' } - const app = express(feathers()) - .configure(socketio()) - .use('/test', (_req: Request, res: Response) => res.json(data)) - - const srv = await app.listen(8992) - const response = await axios({ - url: 'http://localhost:8992/socket.io/socket.io.js' - }) - - assert.strictEqual(response.status, 200) - - const res = await axios({ - url: 'http://localhost:8992/test' - }) - - assert.deepStrictEqual(res.data, data) - - await new Promise((resolve) => srv.close(() => resolve(srv))) - }) - - it('can set options (#12)', (done) => { - const application = feathers().configure( - socketio( - { - path: '/test/' - }, - (ioInstance) => assert.ok(ioInstance) - ) - ) - - application.listen(8987).then((srv) => { - srv.on('listening', async () => { - const { status } = await axios('http://localhost:8987/test/socket.io.js') - - assert.strictEqual(status, 200) - srv.close(done) - }) - }) - }) - - it('passes handshake as service parameters', (done) => { - socket.emit('create', 'verify', {}, (error: any, data: any) => { - assert.ok(!error) - assert.deepStrictEqual( - omit(data.params, 'query', 'route', 'connection'), - socketParams, - 'Passed handshake parameters' - ) - - socket.emit( - 'update', - 'verify', - 1, - {}, - { - test: 'param' - }, - (error: any, data: any) => { - assert.ok(!error) - assert.deepStrictEqual( - data.params, - extend( - { - route: {}, - connection: socketParams, - query: { - test: 'param' - } - }, - socketParams - ), - 'Passed handshake parameters as query' - ) - done() - } - ) - }) - }) - - it('connection and disconnect events (#1243, #1238)', (done) => { - const mySocket = io('http://localhost:7886?channel=dctest') - - app.once('connection', (connection) => { - assert.strictEqual(connection.channel, 'dctest') - app.once('disconnect', (disconnection) => { - assert.strictEqual(disconnection.channel, 'dctest') - done() - }) - setTimeout(() => mySocket.close(), 100) - }) - - assert.ok(mySocket) - }) - - it('app `disconnect` event disconnects socket (#2754)', (done) => { - const mySocket = io('http://localhost:7886?channel=dctest') - - app.once('connection', (connection) => { - assert.strictEqual(connection.channel, 'dctest') - mySocket.once('disconnect', () => done()) - app.emit('disconnect', connection) - }) - - assert.ok(mySocket) - }) - - it('missing parameters in socket call works (#88)', (done) => { - socket.emit('find', 'verify', (error: any, data: any) => { - assert.ok(!error) - assert.deepStrictEqual( - omit(data.params, 'query', 'route', 'connection'), - socketParams, - 'Handshake parameters passed on proper position' - ) - done() - }) - }) - - describe('Service method calls', () => { - describe("('method', 'service') event format", () => { - describe('Service', () => methodTests('todo', options)) - describe('Dynamic Service', () => methodTests('todo', options)) - }) - }) - - describe('Service events', () => { - describe('Service', () => eventTests('todo', options)) - describe('Dynamic Service', () => eventTests('tasks', options)) - }) -}) diff --git a/packages/socketio/test/methods.ts b/packages/socketio/test/methods.ts deleted file mode 100644 index e376682256..0000000000 --- a/packages/socketio/test/methods.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { strict as assert } from 'assert' -import { verify } from '@feathersjs/tests' - -export default (name: string, options: any) => { - const call = (method: string, ...args: any[]) => - new Promise((resolve, reject) => { - const { socket } = options - const prefix = [method, name] - const emitArgs = prefix.concat(args) - - socket.emit(...emitArgs, (error: any, result: any) => (error ? reject(error) : resolve(result))) - }) - - it('invalid arguments cause an error', async () => { - await assert.rejects(() => call('find', 1, {}), { - message: "Too many arguments for 'find' method" - }) - }) - - it('.find', () => async () => { - await call('find', {}).then((data) => verify.find(data)) - }) - - it('.get', () => async () => { - await call('get', 'laundry').then((data) => verify.get('laundry', data)) - }) - - it('.get with error', () => async () => { - try { - await call('get', 'laundry', { error: true }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Something for laundry went wrong') - } - }) - - it('.get with runtime error', () => async () => { - try { - await call('get', 'laundry', { runtimeError: true }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'thingThatDoesNotExist is not defined') - } - }) - - it('.get with error in hook', () => async () => { - try { - await call('get', 'laundry', { hookError: true }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Error from get, before hook') - } - }) - - it('.create', async () => { - const original = { - name: 'creating' - } - - const data = await call('create', original, {}) - - verify.create(original, data) - }) - - it('.create without parameters', async () => { - const original = { - name: 'creating again' - } - - const data = await call('create', original) - - verify.create(original, data) - }) - - it('.update', async () => { - const original = { - name: 'updating' - } - - const data = await call('update', 23, original, {}) - - verify.update(23, original, data) - }) - - it('.update many', async () => { - const original = { - name: 'updating', - many: true - } - - const data = await call('update', null, original) - - verify.update(null, original, data) - }) - - it('.patch', async () => { - const original = { - name: 'patching' - } - - const data = await call('patch', 25, original) - - verify.patch(25, original, data) - }) - - it('.patch many', async () => { - const original = { - name: 'patching', - many: true - } - - const data = await call('patch', null, original) - - verify.patch(null, original, data) - }) - - it('.remove', () => async () => { - const data = await call('remove', 11) - - verify.remove(11, data) - }) - - it('.remove many', async () => { - const data = await call('remove', null) - - verify.remove(null, data) - }) -} diff --git a/packages/socketio/tsconfig.json b/packages/socketio/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/socketio/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/tests/package.json b/packages/tests/package.json index 4b13e58f56..6cedb2f8d7 100644 --- a/packages/tests/package.json +++ b/packages/tests/package.json @@ -33,7 +33,6 @@ }, "scripts": { "prepublish": "npm run compile", - "pack": "echo \"not necessary\"", "test": "echo \"not necessary\"", "compile": "shx rm -rf lib/ && tsc" }, @@ -57,4 +56,4 @@ "ts-node": "^10.9.2", "typescript": "^5.5.4" } -} +} \ No newline at end of file diff --git a/packages/transport-commons/package.json b/packages/transport-commons/package.json index ef9b080dbf..84d08fae25 100644 --- a/packages/transport-commons/package.json +++ b/packages/transport-commons/package.json @@ -33,8 +33,7 @@ }, "scripts": { "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", + "compile": "shx rm -rf lib/ && tsc", "test": "npm run mocha", "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" }, @@ -71,4 +70,4 @@ "typescript": "^5.5.4" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} +} \ No newline at end of file diff --git a/packages/typebox/CHANGELOG.md b/packages/typebox/CHANGELOG.md deleted file mode 100644 index e43e37530f..0000000000 --- a/packages/typebox/CHANGELOG.md +++ /dev/null @@ -1,202 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **typebox:** Add TRecord to getValidator arg1 type ([#3488](https://github.com/feathersjs/feathers/issues/3488)) ([ffbcc0a](https://github.com/feathersjs/feathers/commit/ffbcc0ad0c361f77171f9ad6224006727644433a)) - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -### Bug Fixes - -- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **schema:** Allow $in and $nin queries to work for arrays ([#3352](https://github.com/feathersjs/feathers/issues/3352)) ([677c214](https://github.com/feathersjs/feathers/commit/677c214a353a7f9a1f90649b9bbec4d0d6517a6f)) - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -### Bug Fixes - -- **typebox:** Allow default value in StringEnum ([#3281](https://github.com/feathersjs/feathers/issues/3281)) ([25af09a](https://github.com/feathersjs/feathers/commit/25af09ad065e72768bf88bc8b529b68f2ca4da17)) - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -### Bug Fixes - -- **typebox:** allow TUnion inside getValidator ([#3262](https://github.com/feathersjs/feathers/issues/3262)) ([cf9df96](https://github.com/feathersjs/feathers/commit/cf9df96c1011fcf13e9c6d652b06036bb0aac1c3)) - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package @feathersjs/typebox - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **typebox:** Revert to TypeBox 0.25 ([#3183](https://github.com/feathersjs/feathers/issues/3183)) ([cacedf5](https://github.com/feathersjs/feathers/commit/cacedf59e3d2df836777f0cd06ab1b2484ed87c5)) - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) -- **typebox:** Implement custom TypeBuilder for backwards compatibility ([#3150](https://github.com/feathersjs/feathers/issues/3150)) ([962bd87](https://github.com/feathersjs/feathers/commit/962bd87217212320b1a68f6556a16b8a6b8f757c)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **authentication:** Ensure authentication.entity configuration can be null ([#3136](https://github.com/feathersjs/feathers/issues/3136)) ([c47349b](https://github.com/feathersjs/feathers/commit/c47349b9dcf2067b7b572c5463b15b2a8fbda972)) -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) -- **knex:** Get by id and transactions should work with params.knex ([#3146](https://github.com/feathersjs/feathers/issues/3146)) ([b172b5e](https://github.com/feathersjs/feathers/commit/b172b5ea9b461642874eb7d2ba01dc4cfc275155)) -- **typebox:** Upgrade to TypeBox 0.26.0 ([#3113](https://github.com/feathersjs/feathers/issues/3113)) ([d1d9598](https://github.com/feathersjs/feathers/commit/d1d95984dd94d2b9305e7338421f84f9c4f733fd)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package @feathersjs/typebox - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package @feathersjs/typebox - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -### Features - -- **schema:** Add schema helper for handling Object ids ([#3058](https://github.com/feathersjs/feathers/issues/3058)) ([1393bed](https://github.com/feathersjs/feathers/commit/1393bed81a9ee814de6aab0e537af83e667591a2)) - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Bug Fixes - -- **typebox:** Allow nested or in and queries ([#3029](https://github.com/feathersjs/feathers/issues/3029)) ([39e0b78](https://github.com/feathersjs/feathers/commit/39e0b785238b809aa9b4dea9b95efc3c188c9baa)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **configuration:** Add pool and connection object to SQL database default configuration ([#3023](https://github.com/feathersjs/feathers/issues/3023)) ([092c749](https://github.com/feathersjs/feathers/commit/092c749d43f7da4d019576d1210fe7d3719a44a2)) -- **schema:** Fix TypeBox extension value query syntax inference ([#3010](https://github.com/feathersjs/feathers/issues/3010)) ([f1c7a76](https://github.com/feathersjs/feathers/commit/f1c7a76586bbb8aed66ef866c3dcd666d79f3a24)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Features - -- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) -- **schema:** Allow to add additional operators to the query syntax ([#2941](https://github.com/feathersjs/feathers/issues/2941)) ([f324940](https://github.com/feathersjs/feathers/commit/f324940d5795b41e8c6fc113defb0beb7ab03a0a)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **schema:** Allow query schemas with no properties, error on unsupported types ([#2904](https://github.com/feathersjs/feathers/issues/2904)) ([b66c734](https://github.com/feathersjs/feathers/commit/b66c734357478f51b2d38fa7f3eee08640cea26e)) -- **typebox:** Improve query syntax defaults ([#2888](https://github.com/feathersjs/feathers/issues/2888)) ([59f3cdc](https://github.com/feathersjs/feathers/commit/59f3cdca6376e34fe39a7b91db837d0325aeb5db)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -### Features - -- **schema:** Add StringEnum to TypeBox module ([#2827](https://github.com/feathersjs/feathers/issues/2827)) ([65d3665](https://github.com/feathersjs/feathers/commit/65d36656f50a48f633fa3fcabaea10521d04bf1c)) - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package @feathersjs/typebox - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6)) - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **schema:** Make schemas validation library independent and add TypeBox support ([#2772](https://github.com/feathersjs/feathers/issues/2772)) ([44172d9](https://github.com/feathersjs/feathers/commit/44172d99b566d11d9ceda04f1d0bf72b6d05ce76)) diff --git a/packages/typebox/LICENSE b/packages/typebox/LICENSE deleted file mode 100644 index 7839c824d7..0000000000 --- a/packages/typebox/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 Feathers Contributors - -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: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/typebox/README.md b/packages/typebox/README.md deleted file mode 100644 index b1b3db74f6..0000000000 --- a/packages/typebox/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/typebox - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/typebox.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/typebox) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> [TypeBox](https://github.com/sinclairzx81/typebox) integration for @feathersjs/schema - -## Installation - -``` -npm install @feathersjs/typebox --save -``` - -## Documentation - -Refer to the [Feathers TypeBox documentation](https://feathersjs.com/api/schema/typebox.html) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/typebox/package.json b/packages/typebox/package.json deleted file mode 100644 index 2b97de9893..0000000000 --- a/packages/typebox/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "@feathersjs/typebox", - "description": "TypeBox integration for @feathersjs/schema", - "version": "5.0.30", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/schema" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run compile && npm run mocha" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/schema": "^5.0.30", - "@sinclair/typebox": "^0.25.0" - }, - "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "^22.5.1", - "mocha": "^10.7.3", - "shx": "^0.3.4", - "typescript": "^5.5.4" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/typebox/src/default-schemas.ts b/packages/typebox/src/default-schemas.ts deleted file mode 100644 index e9fae9167a..0000000000 --- a/packages/typebox/src/default-schemas.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Type, Static } from '@sinclair/typebox' - -export const authenticationSettingsSchema = Type.Object({ - secret: Type.String({ description: 'The JWT signing secret' }), - entity: Type.Optional( - Type.Union([ - Type.String({ description: 'The name of the authentication entity (e.g. user)' }), - Type.Null() - ]) - ), - entityId: Type.Optional(Type.String({ description: 'The name of the authentication entity id property' })), - service: Type.Optional(Type.String({ description: 'The path of the entity service' })), - authStrategies: Type.Array(Type.String(), { - description: 'A list of authentication strategy names that are allowed to create JWT access tokens' - }), - parseStrategies: Type.Optional( - Type.Array(Type.String(), { - description: - 'A list of authentication strategy names that should parse HTTP headers for authentication information (defaults to `authStrategies`)' - }) - ), - jwtOptions: Type.Optional(Type.Object({})), - jwt: Type.Optional( - Type.Object({ - header: Type.String({ default: 'Authorization', description: 'The HTTP header containing the JWT' }), - schemes: Type.String({ description: 'An array of schemes to support' }) - }) - ), - local: Type.Optional( - Type.Object({ - usernameField: Type.String({ description: 'Name of the username field (e.g. `email`)' }), - passwordField: Type.String({ description: 'Name of the password field (e.g. `password`)' }), - hashSize: Type.Optional(Type.Number({ description: 'The BCrypt salt length' })), - errorMessage: Type.Optional(Type.String({ description: 'The error message to return on errors' })), - entityUsernameField: Type.Optional( - Type.String({ - description: - 'Name of the username field on the entity if authentication request data and entity field names are different' - }) - ), - entityPasswordField: Type.Optional( - Type.String({ - description: - 'Name of the password field on the entity if authentication request data and entity field names are different' - }) - ) - }) - ), - oauth: Type.Optional( - Type.Object({ - redirect: Type.Optional(Type.String()), - origins: Type.Optional(Type.Array(Type.String())), - defaults: Type.Optional( - Type.Object({ - key: Type.Optional(Type.String()), - secret: Type.Optional(Type.String()) - }) - ) - }) - ) -}) - -export const sqlSettingsSchema = Type.Optional( - Type.Object({ - client: Type.String(), - connection: Type.Union([ - Type.String(), - Type.Partial( - Type.Object({ - host: Type.String(), - port: Type.Number(), - user: Type.String(), - password: Type.String(), - database: Type.String() - }) - ) - ]), - pool: Type.Optional( - Type.Object({ - min: Type.Number(), - max: Type.Number() - }) - ) - }) -) - -export const defaultAppConfiguration = Type.Object( - { - authentication: Type.Optional(authenticationSettingsSchema), - paginate: Type.Optional( - Type.Object( - { - default: Type.Number(), - max: Type.Number() - }, - { additionalProperties: false } - ) - ), - origins: Type.Optional(Type.Array(Type.String())), - mongodb: Type.Optional(Type.String()), - mysql: sqlSettingsSchema, - postgresql: sqlSettingsSchema, - sqlite: sqlSettingsSchema, - mssql: sqlSettingsSchema - }, - { $id: 'ApplicationConfiguration', additionalProperties: false } -) - -export type DefaultAppConfiguration = Static diff --git a/packages/typebox/src/index.ts b/packages/typebox/src/index.ts deleted file mode 100644 index 098cf22a90..0000000000 --- a/packages/typebox/src/index.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { - Type, - TObject, - TInteger, - TOptional, - TSchema, - ObjectOptions, - TIntersect, - TUnion, - type TRecord -} from '@sinclair/typebox' -import { jsonSchema, Validator, DataValidatorMap, Ajv } from '@feathersjs/schema' - -export * from '@sinclair/typebox' -export * from './default-schemas' - -export type TDataSchemaMap = { - create: TObject - update?: TObject - patch?: TObject -} - -/** - * Returns a compiled validation function for a TypeBox object and AJV validator instance. - * - * @param schema The JSON schema definition - * @param validator The AJV validation instance - * @returns A compiled validation function - */ -export const getValidator = ( - schema: TObject | TIntersect | TUnion | TRecord, - validator: Ajv -): Validator => jsonSchema.getValidator(schema as any, validator) - -/** - * Returns compiled validation functions to validate data for the `create`, `update` and `patch` - * service methods. If not passed explicitly, the `update` validator will be the same as the `create` - * and `patch` will be the `create` validator with no required fields. - * - * @param def Either general TypeBox object definition or a mapping of `create`, `update` and `patch` - * to their respective type object - * @param validator The Ajv instance to use as the validator - * @returns A map of validator functions - */ -export const getDataValidator = (def: TObject | TDataSchemaMap, validator: Ajv): DataValidatorMap => - jsonSchema.getDataValidator(def as any, validator) - -/** - * A TypeBox utility that converts an array of provided strings into a string enum. - * @param allowedValues array of strings for the enum - * @returns TypeBox.Type - */ -export function StringEnum(allowedValues: [...T], options?: { default: T[number] }) { - return Type.Unsafe({ type: 'string', enum: allowedValues, ...options }) -} - -const arrayOfKeys = (type: T) => { - const keys = Object.keys(type.properties) - return Type.Unsafe<(keyof T['properties'])[]>({ - type: 'array', - maxItems: keys.length, - items: { - type: 'string', - ...(keys.length > 0 ? { enum: keys } : {}) - } - }) -} - -/** - * Creates the `$sort` Feathers query syntax schema for an object schema - * - * @param schema The TypeBox object schema - * @returns The `$sort` syntax schema - */ -export function sortDefinition(schema: T) { - const properties = Object.keys(schema.properties).reduce( - (res, key) => { - const result = res as any - - result[key] = Type.Optional(Type.Integer({ minimum: -1, maximum: 1 })) - - return result - }, - {} as { [K in keyof T['properties']]: TOptional } - ) - - return Type.Object(properties, { additionalProperties: false }) -} - -/** - * Returns the standard Feathers query syntax for a property schema, - * including operators like `$gt`, `$lt` etc. for a single property - * - * @param def The property definition - * @param extension Additional properties to add to the property query - * @returns The Feathers query syntax schema - */ -export const queryProperty = ( - def: T, - extension: X = {} as X -) => - Type.Optional( - Type.Union([ - def, - Type.Partial( - Type.Intersect( - [ - Type.Object({ - $gt: def, - $gte: def, - $lt: def, - $lte: def, - $ne: def, - $in: def.type === 'array' ? def : Type.Array(def), - $nin: def.type === 'array' ? def : Type.Array(def) - }), - Type.Object(extension) - ], - { additionalProperties: false } - ) - ) - ]) - ) - -type QueryProperty = ReturnType< - typeof queryProperty -> - -/** - * Creates a Feathers query syntax schema for the properties defined in `definition`. - * - * @param definition The properties to create the Feathers query syntax schema for - * @param extensions Additional properties to add to a property query - * @returns The Feathers query syntax schema - */ -export const queryProperties = < - T extends TObject, - X extends { [K in keyof T['properties']]?: { [key: string]: TSchema } } ->( - definition: T, - extensions: X = {} as X -) => { - const properties = Object.keys(definition.properties).reduce( - (res, key) => { - const result = res as any - const value = definition.properties[key] - - result[key] = queryProperty(value, extensions[key]) - - return result - }, - {} as { [K in keyof T['properties']]: QueryProperty } - ) - - return Type.Optional(Type.Object(properties, { additionalProperties: false })) -} - -/** - * Creates a TypeBox schema for the complete Feathers query syntax including `$limit`, $skip`, `$or` - * and `$sort` and `$select` for the allowed properties. - * - * @param type The properties to create the query syntax for - * @param extensions Additional properties to add to the query syntax - * @param options Options for the TypeBox object schema - * @returns A TypeBox object representing the complete Feathers query syntax for the given properties - */ -export const querySyntax = < - T extends TObject, - X extends { [K in keyof T['properties']]?: { [key: string]: TSchema } } ->( - type: T, - extensions: X = {} as X, - options: ObjectOptions = { additionalProperties: false } -) => { - const propertySchema = queryProperties(type, extensions) - const $or = Type.Array(propertySchema) - const $and = Type.Array(Type.Union([propertySchema, Type.Object({ $or })])) - - return Type.Intersect( - [ - Type.Partial( - Type.Object( - { - $limit: Type.Number({ minimum: 0 }), - $skip: Type.Number({ minimum: 0 }), - $sort: sortDefinition(type), - $select: arrayOfKeys(type), - $and, - $or - }, - { additionalProperties: false } - ) - ), - propertySchema - ], - options - ) -} - -export const ObjectIdSchema = () => - Type.Union([Type.String({ objectid: true }), Type.Object({}, { additionalProperties: true })]) diff --git a/packages/typebox/test/index.test.ts b/packages/typebox/test/index.test.ts deleted file mode 100644 index bfb82718db..0000000000 --- a/packages/typebox/test/index.test.ts +++ /dev/null @@ -1,152 +0,0 @@ -import assert from 'assert' -import { ObjectId as MongoObjectId } from 'mongodb' -import { Ajv } from '@feathersjs/schema' -import { - querySyntax, - Type, - Static, - defaultAppConfiguration, - getDataValidator, - getValidator, - ObjectIdSchema -} from '../src' - -describe('@feathersjs/schema/typebox', () => { - describe('querySyntax', () => { - it('basics', async () => { - const schema = Type.Object({ - name: Type.String(), - age: Type.Number() - }) - const querySchema = querySyntax(schema) - - type Query = Static - - const query: Query = { - name: 'Dave', - age: { $gt: 42, $in: [50, 51] }, - $select: ['age', 'name'], - $sort: { - age: 1 - } - } - - const validator = new Ajv().compile(querySchema) - let validated = (await validator(query)) as any as Query - - assert.ok(validated) - - validated = (await validator({ ...query, something: 'wrong' })) as any as Query - assert.ok(!validated) - }) - - it('querySyntax works with no properties', async () => { - const schema = querySyntax(Type.Object({})) - - new Ajv().compile(schema) - }) - - it('query syntax can include additional extensions', async () => { - const schema = Type.Object({ - name: Type.String(), - age: Type.Number() - }) - const querySchema = querySyntax(schema, { - age: { - $notNull: Type.Boolean() - }, - name: { - $ilike: Type.String() - } - }) - const validator = new Ajv().compile(querySchema) - - type Query = Static - - const query: Query = { - age: { - $gt: 10, - $notNull: true - }, - name: { - $gt: 'David', - $ilike: 'Dave' - } - } - - const validated = (await validator(query)) as any as Query - - assert.ok(validated) - }) - }) - - it('$in and $nin works with array type', async () => { - const schema = Type.Object({ - things: Type.Array(Type.Number()) - }) - const querySchema = querySyntax(schema) - const validator = new Ajv().compile(querySchema) - - type Query = Static - - const query: Query = { - things: { - $in: [10, 20], - $nin: [30] - } - } - - const validated = (await validator(query)) as any as Query - - assert.ok(validated) - }) - - it('defaultAppConfiguration', async () => { - const configSchema = Type.Intersect([ - defaultAppConfiguration, - Type.Object({ - host: Type.String(), - port: Type.Number(), - public: Type.String() - }) - ]) - - const validator = new Ajv().compile(configSchema) - const validated = await validator({ - host: 'something', - port: 3030, - public: './' - }) - - assert.ok(validated) - }) - - // Test ObjectId validation - it('ObjectId', async () => { - const schema = Type.Object({ - _id: ObjectIdSchema() - }) - - const validator = new Ajv({ - strict: false - }).compile(schema) - const validated = await validator({ - _id: '507f191e810c19729de860ea' - }) - assert.ok(validated) - - const validated2 = await validator({ - _id: new MongoObjectId() - }) - assert.ok(validated2) - }) - - it('validators', () => { - assert.strictEqual(typeof getDataValidator(Type.Object({}), new Ajv()), 'object') - assert.strictEqual(typeof getValidator(Type.Object({}), new Ajv()), 'function') - assert.strictEqual( - typeof getValidator(Type.Intersect([Type.Object({}), Type.Object({})]), new Ajv()), - 'function' - ) - }) -}) diff --git a/packages/typebox/tsconfig.json b/packages/typebox/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/typebox/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -}