diff --git a/.env b/.env new file mode 100644 index 0000000..4938f28 --- /dev/null +++ b/.env @@ -0,0 +1,43 @@ +################################################### +# +# UPNEXT SERVER ENVIRONMENT CONFIG +# +################################################### +# General config +PRODUCTION=false +LOG_LEVEL=info + +# App config +APP_SCHEMA=http +APP_HOST=localhost +APP_PORT=8443 +APP_BANNER=true +APP_KEY=MHcCAQEEILZbt5q1ImZfg5DQ+lolN34p1xKwB5jI+uiC0QSyWnkFoAoGCCqGSM49AwEHoUQDQgAEU5Rio4lC6uBYINUvvcpb1X4vczTZCgop2r3zXvq/WTyqQlgfQq2J35f0zE4kuwYbg4c9dKpA/91PvrvHcmDiXA== + +# Front config +FRONT_URL=https://upnext.cool +FRONT_VERSION=6 + +# API config +API_ROUTE=api + +# Database config +DATABASE_TYPE=postgres +DATABASE_HOST=ep-divine-resonance-378201.us-east-2.aws.neon.tech +DATABASE_PORT=5432 +DATABASE_USERNAME=ethanelliott +DATABASE_PASSWORD=RCGy7k0fJjgE +DATABASE_DATABASE=neondb + +# Graphql API config +GRAPHQL_ENABLED=true +GRAPHQL_ROUTE=graphql + +#Swagger API config +SWAGGER_ENABLED=true +SWAGGER_ROUTE=swagger + +# Spotify config +SPOTIFY_CLIENT_ID=b25a0c871cc84048a113780ef01d3927 +SPOTIFY_CLIENT_SECRET=5c6f4e78666a4efdadba49ea8171ee44 +SPOTIFY_REDIRECT_URI=http://localhost:8443/api/auth/callback diff --git a/.yarn/cache/@apollo-protobufjs-npm-1.2.2-306a5b4ea3-3f3ec1f428.zip b/.yarn/cache/@apollo-protobufjs-npm-1.2.2-306a5b4ea3-3f3ec1f428.zip new file mode 100644 index 0000000..a5c63fc Binary files /dev/null and b/.yarn/cache/@apollo-protobufjs-npm-1.2.2-306a5b4ea3-3f3ec1f428.zip differ diff --git a/.yarn/cache/@apollographql-apollo-tools-npm-0.5.4-61303be2a9-673eaaf371.zip b/.yarn/cache/@apollographql-apollo-tools-npm-0.5.4-61303be2a9-673eaaf371.zip new file mode 100644 index 0000000..3162434 Binary files /dev/null and b/.yarn/cache/@apollographql-apollo-tools-npm-0.5.4-61303be2a9-673eaaf371.zip differ diff --git a/.yarn/cache/@apollographql-graphql-playground-html-npm-1.6.27-167b01da2f-a345e8c7d1.zip b/.yarn/cache/@apollographql-graphql-playground-html-npm-1.6.27-167b01da2f-a345e8c7d1.zip new file mode 100644 index 0000000..089c9a9 Binary files /dev/null and b/.yarn/cache/@apollographql-graphql-playground-html-npm-1.6.27-167b01da2f-a345e8c7d1.zip differ diff --git a/.yarn/cache/@apollographql-graphql-upload-8-fork-npm-8.1.4-fa8b42ad9f-0d8db5afe8.zip b/.yarn/cache/@apollographql-graphql-upload-8-fork-npm-8.1.4-fa8b42ad9f-0d8db5afe8.zip new file mode 100644 index 0000000..833dcba Binary files /dev/null and b/.yarn/cache/@apollographql-graphql-upload-8-fork-npm-8.1.4-fa8b42ad9f-0d8db5afe8.zip differ diff --git a/.yarn/cache/@babel-eslint-parser-npm-7.19.1-8f22f07e44-6d5360f62f.zip b/.yarn/cache/@babel-eslint-parser-npm-7.19.1-8f22f07e44-6d5360f62f.zip new file mode 100644 index 0000000..19b3c95 Binary files /dev/null and b/.yarn/cache/@babel-eslint-parser-npm-7.19.1-8f22f07e44-6d5360f62f.zip differ diff --git a/.yarn/cache/@babel-generator-npm-7.18.2-0f6d05ed9c-d0661e9553.zip b/.yarn/cache/@babel-generator-npm-7.18.2-0f6d05ed9c-d0661e9553.zip new file mode 100644 index 0000000..2ee8955 Binary files /dev/null and b/.yarn/cache/@babel-generator-npm-7.18.2-0f6d05ed9c-d0661e9553.zip differ diff --git a/.yarn/cache/@babel-parser-npm-7.18.4-63fd355e07-e05b2dc720.zip b/.yarn/cache/@babel-parser-npm-7.18.4-63fd355e07-e05b2dc720.zip new file mode 100644 index 0000000..492df27 Binary files /dev/null and b/.yarn/cache/@babel-parser-npm-7.18.4-63fd355e07-e05b2dc720.zip differ diff --git a/.yarn/cache/@babel-runtime-npm-7.20.13-45eeb6d8ad-09b7a97a05.zip b/.yarn/cache/@babel-runtime-npm-7.20.13-45eeb6d8ad-09b7a97a05.zip new file mode 100644 index 0000000..1f68f79 Binary files /dev/null and b/.yarn/cache/@babel-runtime-npm-7.20.13-45eeb6d8ad-09b7a97a05.zip differ diff --git a/.yarn/cache/@babel-types-npm-7.18.4-758c2695f8-85df59beb9.zip b/.yarn/cache/@babel-types-npm-7.18.4-758c2695f8-85df59beb9.zip new file mode 100644 index 0000000..f88d1e6 Binary files /dev/null and b/.yarn/cache/@babel-types-npm-7.18.4-758c2695f8-85df59beb9.zip differ diff --git a/.yarn/cache/@colors-colors-npm-1.5.0-875af3a8b4-d64d5260be.zip b/.yarn/cache/@colors-colors-npm-1.5.0-875af3a8b4-d64d5260be.zip new file mode 100644 index 0000000..c1edd32 Binary files /dev/null and b/.yarn/cache/@colors-colors-npm-1.5.0-875af3a8b4-d64d5260be.zip differ diff --git a/.yarn/cache/@dabh-diagnostics-npm-2.0.3-0f2cd64f24-4879600c55.zip b/.yarn/cache/@dabh-diagnostics-npm-2.0.3-0f2cd64f24-4879600c55.zip new file mode 100644 index 0000000..43db318 Binary files /dev/null and b/.yarn/cache/@dabh-diagnostics-npm-2.0.3-0f2cd64f24-4879600c55.zip differ diff --git a/.yarn/cache/@discoveryjs-json-ext-npm-0.5.7-fe04af1f31-2176d301cc.zip b/.yarn/cache/@discoveryjs-json-ext-npm-0.5.7-fe04af1f31-2176d301cc.zip new file mode 100644 index 0000000..9502ae7 Binary files /dev/null and b/.yarn/cache/@discoveryjs-json-ext-npm-0.5.7-fe04af1f31-2176d301cc.zip differ diff --git a/.yarn/cache/@es-joy-jsdoccomment-npm-0.9.0-alpha.1-13e9f653bb-b178379056.zip b/.yarn/cache/@es-joy-jsdoccomment-npm-0.9.0-alpha.1-13e9f653bb-b178379056.zip new file mode 100644 index 0000000..50f28be Binary files /dev/null and b/.yarn/cache/@es-joy-jsdoccomment-npm-0.9.0-alpha.1-13e9f653bb-b178379056.zip differ diff --git a/.yarn/cache/@jimp-bmp-npm-0.16.2-dfc8dc8414-e52d2f77d5.zip b/.yarn/cache/@jimp-bmp-npm-0.16.2-dfc8dc8414-e52d2f77d5.zip new file mode 100644 index 0000000..7f78060 Binary files /dev/null and b/.yarn/cache/@jimp-bmp-npm-0.16.2-dfc8dc8414-e52d2f77d5.zip differ diff --git a/.yarn/cache/@jimp-core-npm-0.16.2-240819bdf1-16bcc2be91.zip b/.yarn/cache/@jimp-core-npm-0.16.2-240819bdf1-16bcc2be91.zip new file mode 100644 index 0000000..0006ac2 Binary files /dev/null and b/.yarn/cache/@jimp-core-npm-0.16.2-240819bdf1-16bcc2be91.zip differ diff --git a/.yarn/cache/@jimp-custom-npm-0.16.2-e0de91039c-2edca54cc8.zip b/.yarn/cache/@jimp-custom-npm-0.16.2-e0de91039c-2edca54cc8.zip new file mode 100644 index 0000000..4ed25b7 Binary files /dev/null and b/.yarn/cache/@jimp-custom-npm-0.16.2-e0de91039c-2edca54cc8.zip differ diff --git a/.yarn/cache/@jimp-gif-npm-0.16.2-a645e3f4b2-0699df7170.zip b/.yarn/cache/@jimp-gif-npm-0.16.2-a645e3f4b2-0699df7170.zip new file mode 100644 index 0000000..5bf8d34 Binary files /dev/null and b/.yarn/cache/@jimp-gif-npm-0.16.2-a645e3f4b2-0699df7170.zip differ diff --git a/.yarn/cache/@jimp-jpeg-npm-0.16.2-4b53f48593-cae9d8fc32.zip b/.yarn/cache/@jimp-jpeg-npm-0.16.2-4b53f48593-cae9d8fc32.zip new file mode 100644 index 0000000..5dc8b58 Binary files /dev/null and b/.yarn/cache/@jimp-jpeg-npm-0.16.2-4b53f48593-cae9d8fc32.zip differ diff --git a/.yarn/cache/@jimp-plugin-resize-npm-0.16.2-8cf184075a-f8fdf9de6f.zip b/.yarn/cache/@jimp-plugin-resize-npm-0.16.2-8cf184075a-f8fdf9de6f.zip new file mode 100644 index 0000000..f79758f Binary files /dev/null and b/.yarn/cache/@jimp-plugin-resize-npm-0.16.2-8cf184075a-f8fdf9de6f.zip differ diff --git a/.yarn/cache/@jimp-png-npm-0.16.2-1ca1111424-c25e0fdd3b.zip b/.yarn/cache/@jimp-png-npm-0.16.2-1ca1111424-c25e0fdd3b.zip new file mode 100644 index 0000000..0237305 Binary files /dev/null and b/.yarn/cache/@jimp-png-npm-0.16.2-1ca1111424-c25e0fdd3b.zip differ diff --git a/.yarn/cache/@jimp-tiff-npm-0.16.2-092d9857c1-7fc11c13c1.zip b/.yarn/cache/@jimp-tiff-npm-0.16.2-092d9857c1-7fc11c13c1.zip new file mode 100644 index 0000000..e4141bc Binary files /dev/null and b/.yarn/cache/@jimp-tiff-npm-0.16.2-092d9857c1-7fc11c13c1.zip differ diff --git a/.yarn/cache/@jimp-types-npm-0.16.2-57bff72cff-529e234a4c.zip b/.yarn/cache/@jimp-types-npm-0.16.2-57bff72cff-529e234a4c.zip new file mode 100644 index 0000000..99359df Binary files /dev/null and b/.yarn/cache/@jimp-types-npm-0.16.2-57bff72cff-529e234a4c.zip differ diff --git a/.yarn/cache/@jimp-utils-npm-0.16.2-a90a847301-96f3c815f3.zip b/.yarn/cache/@jimp-utils-npm-0.16.2-a90a847301-96f3c815f3.zip new file mode 100644 index 0000000..447853e Binary files /dev/null and b/.yarn/cache/@jimp-utils-npm-0.16.2-a90a847301-96f3c815f3.zip differ diff --git a/.yarn/cache/@josephg-resolvable-npm-1.0.1-bbe8e9d8e8-64eb763b51.zip b/.yarn/cache/@josephg-resolvable-npm-1.0.1-bbe8e9d8e8-64eb763b51.zip new file mode 100644 index 0000000..e510769 Binary files /dev/null and b/.yarn/cache/@josephg-resolvable-npm-1.0.1-bbe8e9d8e8-64eb763b51.zip differ diff --git a/.yarn/cache/@nicolo-ribaudo-eslint-scope-5-internals-npm-5.1.1-v1-87df86be4b-f2e3b2d6a6.zip b/.yarn/cache/@nicolo-ribaudo-eslint-scope-5-internals-npm-5.1.1-v1-87df86be4b-f2e3b2d6a6.zip new file mode 100644 index 0000000..93ca0c3 Binary files /dev/null and b/.yarn/cache/@nicolo-ribaudo-eslint-scope-5-internals-npm-5.1.1-v1-87df86be4b-f2e3b2d6a6.zip differ diff --git a/.yarn/cache/@protobufjs-aspromise-npm-1.1.2-71d00b938f-011fe7ef08.zip b/.yarn/cache/@protobufjs-aspromise-npm-1.1.2-71d00b938f-011fe7ef08.zip new file mode 100644 index 0000000..fc9081b Binary files /dev/null and b/.yarn/cache/@protobufjs-aspromise-npm-1.1.2-71d00b938f-011fe7ef08.zip differ diff --git a/.yarn/cache/@protobufjs-base64-npm-1.1.2-cd8ca6814a-67173ac34d.zip b/.yarn/cache/@protobufjs-base64-npm-1.1.2-cd8ca6814a-67173ac34d.zip new file mode 100644 index 0000000..cdc42f1 Binary files /dev/null and b/.yarn/cache/@protobufjs-base64-npm-1.1.2-cd8ca6814a-67173ac34d.zip differ diff --git a/.yarn/cache/@protobufjs-codegen-npm-2.0.4-36e188bbe6-59240c850b.zip b/.yarn/cache/@protobufjs-codegen-npm-2.0.4-36e188bbe6-59240c850b.zip new file mode 100644 index 0000000..2217a81 Binary files /dev/null and b/.yarn/cache/@protobufjs-codegen-npm-2.0.4-36e188bbe6-59240c850b.zip differ diff --git a/.yarn/cache/@protobufjs-eventemitter-npm-1.1.0-029cc7d431-0369163a3d.zip b/.yarn/cache/@protobufjs-eventemitter-npm-1.1.0-029cc7d431-0369163a3d.zip new file mode 100644 index 0000000..9172981 Binary files /dev/null and b/.yarn/cache/@protobufjs-eventemitter-npm-1.1.0-029cc7d431-0369163a3d.zip differ diff --git a/.yarn/cache/@protobufjs-fetch-npm-1.1.0-ca857b7df4-3fce7e09eb.zip b/.yarn/cache/@protobufjs-fetch-npm-1.1.0-ca857b7df4-3fce7e09eb.zip new file mode 100644 index 0000000..3f687b0 Binary files /dev/null and b/.yarn/cache/@protobufjs-fetch-npm-1.1.0-ca857b7df4-3fce7e09eb.zip differ diff --git a/.yarn/cache/@protobufjs-float-npm-1.0.2-5678f64d08-5781e12412.zip b/.yarn/cache/@protobufjs-float-npm-1.0.2-5678f64d08-5781e12412.zip new file mode 100644 index 0000000..d7027a9 Binary files /dev/null and b/.yarn/cache/@protobufjs-float-npm-1.0.2-5678f64d08-5781e12412.zip differ diff --git a/.yarn/cache/@protobufjs-inquire-npm-1.1.0-3c7759e9ce-ca06f02eaf.zip b/.yarn/cache/@protobufjs-inquire-npm-1.1.0-3c7759e9ce-ca06f02eaf.zip new file mode 100644 index 0000000..c7a6b3d Binary files /dev/null and b/.yarn/cache/@protobufjs-inquire-npm-1.1.0-3c7759e9ce-ca06f02eaf.zip differ diff --git a/.yarn/cache/@protobufjs-path-npm-1.1.2-641d08de76-856eeb532b.zip b/.yarn/cache/@protobufjs-path-npm-1.1.2-641d08de76-856eeb532b.zip new file mode 100644 index 0000000..27b166d Binary files /dev/null and b/.yarn/cache/@protobufjs-path-npm-1.1.2-641d08de76-856eeb532b.zip differ diff --git a/.yarn/cache/@protobufjs-pool-npm-1.1.0-47a76f96a1-d6a34fbbd2.zip b/.yarn/cache/@protobufjs-pool-npm-1.1.0-47a76f96a1-d6a34fbbd2.zip new file mode 100644 index 0000000..14babc2 Binary files /dev/null and b/.yarn/cache/@protobufjs-pool-npm-1.1.0-47a76f96a1-d6a34fbbd2.zip differ diff --git a/.yarn/cache/@protobufjs-utf8-npm-1.1.0-02c590807c-f9bf3163d1.zip b/.yarn/cache/@protobufjs-utf8-npm-1.1.0-02c590807c-f9bf3163d1.zip new file mode 100644 index 0000000..6e9fdd4 Binary files /dev/null and b/.yarn/cache/@protobufjs-utf8-npm-1.1.0-02c590807c-f9bf3163d1.zip differ diff --git a/.yarn/cache/@sqltools-formatter-npm-1.2.5-709e7c0ab8-9b8354e715.zip b/.yarn/cache/@sqltools-formatter-npm-1.2.5-709e7c0ab8-9b8354e715.zip new file mode 100644 index 0000000..44e0dbb Binary files /dev/null and b/.yarn/cache/@sqltools-formatter-npm-1.2.5-709e7c0ab8-9b8354e715.zip differ diff --git a/.yarn/cache/@types-accepts-npm-1.3.5-1d59cd2a7a-590b758057.zip b/.yarn/cache/@types-accepts-npm-1.3.5-1d59cd2a7a-590b758057.zip new file mode 100644 index 0000000..b425b80 Binary files /dev/null and b/.yarn/cache/@types-accepts-npm-1.3.5-1d59cd2a7a-590b758057.zip differ diff --git a/.yarn/cache/@types-body-parser-npm-1.19.0-3ca4d08a60-15043566f1.zip b/.yarn/cache/@types-body-parser-npm-1.19.0-3ca4d08a60-15043566f1.zip new file mode 100644 index 0000000..7f62d13 Binary files /dev/null and b/.yarn/cache/@types-body-parser-npm-1.19.0-3ca4d08a60-15043566f1.zip differ diff --git a/.yarn/cache/@types-content-disposition-npm-0.5.5-2219aba782-fdf7379db1.zip b/.yarn/cache/@types-content-disposition-npm-0.5.5-2219aba782-fdf7379db1.zip new file mode 100644 index 0000000..aeb11c3 Binary files /dev/null and b/.yarn/cache/@types-content-disposition-npm-0.5.5-2219aba782-fdf7379db1.zip differ diff --git a/.yarn/cache/@types-cookies-npm-0.7.7-0fbdd53be5-d3759efc11.zip b/.yarn/cache/@types-cookies-npm-0.7.7-0fbdd53be5-d3759efc11.zip new file mode 100644 index 0000000..764d964 Binary files /dev/null and b/.yarn/cache/@types-cookies-npm-0.7.7-0fbdd53be5-d3759efc11.zip differ diff --git a/.yarn/cache/@types-cors-npm-2.8.10-53b686e0da-f87e2f7bb6.zip b/.yarn/cache/@types-cors-npm-2.8.10-53b686e0da-f87e2f7bb6.zip new file mode 100644 index 0000000..0ca5204 Binary files /dev/null and b/.yarn/cache/@types-cors-npm-2.8.10-53b686e0da-f87e2f7bb6.zip differ diff --git a/.yarn/cache/@types-fs-capacitor-npm-2.0.0-4f20eba973-367079834d.zip b/.yarn/cache/@types-fs-capacitor-npm-2.0.0-4f20eba973-367079834d.zip new file mode 100644 index 0000000..a95b89c Binary files /dev/null and b/.yarn/cache/@types-fs-capacitor-npm-2.0.0-4f20eba973-367079834d.zip differ diff --git a/.yarn/cache/@types-glob-npm-7.2.0-772334bf9a-6ae717fedf.zip b/.yarn/cache/@types-glob-npm-7.2.0-772334bf9a-6ae717fedf.zip new file mode 100644 index 0000000..f3ad9ae Binary files /dev/null and b/.yarn/cache/@types-glob-npm-7.2.0-772334bf9a-6ae717fedf.zip differ diff --git a/.yarn/cache/@types-http-assert-npm-1.5.3-d45bf58309-9553e5a0b8.zip b/.yarn/cache/@types-http-assert-npm-1.5.3-d45bf58309-9553e5a0b8.zip new file mode 100644 index 0000000..ffdfe63 Binary files /dev/null and b/.yarn/cache/@types-http-assert-npm-1.5.3-d45bf58309-9553e5a0b8.zip differ diff --git a/.yarn/cache/@types-http-errors-npm-2.0.1-c59d5079a7-3bb0c50b0a.zip b/.yarn/cache/@types-http-errors-npm-2.0.1-c59d5079a7-3bb0c50b0a.zip new file mode 100644 index 0000000..791142d Binary files /dev/null and b/.yarn/cache/@types-http-errors-npm-2.0.1-c59d5079a7-3bb0c50b0a.zip differ diff --git a/.yarn/cache/@types-json5-npm-0.0.29-f63a7916bd-e60b153664.zip b/.yarn/cache/@types-json5-npm-0.0.29-f63a7916bd-e60b153664.zip new file mode 100644 index 0000000..82bfbc8 Binary files /dev/null and b/.yarn/cache/@types-json5-npm-0.0.29-f63a7916bd-e60b153664.zip differ diff --git a/.yarn/cache/@types-keygrip-npm-1.0.2-2e57be51bc-60bc2738a4.zip b/.yarn/cache/@types-keygrip-npm-1.0.2-2e57be51bc-60bc2738a4.zip new file mode 100644 index 0000000..4176bd1 Binary files /dev/null and b/.yarn/cache/@types-keygrip-npm-1.0.2-2e57be51bc-60bc2738a4.zip differ diff --git a/.yarn/cache/@types-koa-compose-npm-3.2.5-b9ab25d904-5d1147c4b0.zip b/.yarn/cache/@types-koa-compose-npm-3.2.5-b9ab25d904-5d1147c4b0.zip new file mode 100644 index 0000000..5d7b3b1 Binary files /dev/null and b/.yarn/cache/@types-koa-compose-npm-3.2.5-b9ab25d904-5d1147c4b0.zip differ diff --git a/.yarn/cache/@types-koa-npm-2.13.5-ee6d93204c-e3b634d934.zip b/.yarn/cache/@types-koa-npm-2.13.5-ee6d93204c-e3b634d934.zip new file mode 100644 index 0000000..80dbae5 Binary files /dev/null and b/.yarn/cache/@types-koa-npm-2.13.5-ee6d93204c-e3b634d934.zip differ diff --git a/.yarn/cache/@types-long-npm-4.0.2-e7bdc00dd4-d16cde7240.zip b/.yarn/cache/@types-long-npm-4.0.2-e7bdc00dd4-d16cde7240.zip new file mode 100644 index 0000000..677817d Binary files /dev/null and b/.yarn/cache/@types-long-npm-4.0.2-e7bdc00dd4-d16cde7240.zip differ diff --git a/.yarn/cache/@types-minimatch-npm-5.1.2-aab9c394d3-0391a28286.zip b/.yarn/cache/@types-minimatch-npm-5.1.2-aab9c394d3-0391a28286.zip new file mode 100644 index 0000000..2d74cce Binary files /dev/null and b/.yarn/cache/@types-minimatch-npm-5.1.2-aab9c394d3-0391a28286.zip differ diff --git a/.yarn/cache/@types-node-npm-10.17.60-63ac1f669f-2cdb3a77d0.zip b/.yarn/cache/@types-node-npm-10.17.60-63ac1f669f-2cdb3a77d0.zip new file mode 100644 index 0000000..3f12044 Binary files /dev/null and b/.yarn/cache/@types-node-npm-10.17.60-63ac1f669f-2cdb3a77d0.zip differ diff --git a/.yarn/cache/@types-node-npm-16.9.1-bde6d3b0c9-41afcf183a.zip b/.yarn/cache/@types-node-npm-16.9.1-bde6d3b0c9-41afcf183a.zip new file mode 100644 index 0000000..b506ae0 Binary files /dev/null and b/.yarn/cache/@types-node-npm-16.9.1-bde6d3b0c9-41afcf183a.zip differ diff --git a/.yarn/cache/@types-validator-npm-13.7.10-80d6b32ae6-7b142c0801.zip b/.yarn/cache/@types-validator-npm-13.7.10-80d6b32ae6-7b142c0801.zip new file mode 100644 index 0000000..fcaddd3 Binary files /dev/null and b/.yarn/cache/@types-validator-npm-13.7.10-80d6b32ae6-7b142c0801.zip differ diff --git a/.yarn/cache/@types-ws-npm-7.4.7-d0c95c0958-b4c9b8ad20.zip b/.yarn/cache/@types-ws-npm-7.4.7-d0c95c0958-b4c9b8ad20.zip new file mode 100644 index 0000000..d397de8 Binary files /dev/null and b/.yarn/cache/@types-ws-npm-7.4.7-d0c95c0958-b4c9b8ad20.zip differ diff --git a/.yarn/cache/@typescript-eslint-experimental-utils-npm-4.33.0-f10f287886-f859800ada.zip b/.yarn/cache/@typescript-eslint-experimental-utils-npm-4.33.0-f10f287886-f859800ada.zip new file mode 100644 index 0000000..ce83053 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-experimental-utils-npm-4.33.0-f10f287886-f859800ada.zip differ diff --git a/.yarn/cache/@typescript-eslint-experimental-utils-npm-5.48.2-2a4bd5130b-eabb776b1a.zip b/.yarn/cache/@typescript-eslint-experimental-utils-npm-5.48.2-2a4bd5130b-eabb776b1a.zip new file mode 100644 index 0000000..a908f30 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-experimental-utils-npm-5.48.2-2a4bd5130b-eabb776b1a.zip differ diff --git a/.yarn/cache/@typescript-eslint-scope-manager-npm-4.33.0-28014c179d-9a25fb7ba7.zip b/.yarn/cache/@typescript-eslint-scope-manager-npm-4.33.0-28014c179d-9a25fb7ba7.zip new file mode 100644 index 0000000..ada83ac Binary files /dev/null and b/.yarn/cache/@typescript-eslint-scope-manager-npm-4.33.0-28014c179d-9a25fb7ba7.zip differ diff --git a/.yarn/cache/@typescript-eslint-scope-manager-npm-5.48.2-9a72dae708-d18a9016b7.zip b/.yarn/cache/@typescript-eslint-scope-manager-npm-5.48.2-9a72dae708-d18a9016b7.zip new file mode 100644 index 0000000..d8443f1 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-scope-manager-npm-5.48.2-9a72dae708-d18a9016b7.zip differ diff --git a/.yarn/cache/@typescript-eslint-types-npm-4.33.0-9e9b956afa-3baae1ca35.zip b/.yarn/cache/@typescript-eslint-types-npm-4.33.0-9e9b956afa-3baae1ca35.zip new file mode 100644 index 0000000..a790352 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-types-npm-4.33.0-9e9b956afa-3baae1ca35.zip differ diff --git a/.yarn/cache/@typescript-eslint-types-npm-5.48.2-bdebd4d2d7-9c5e860a01.zip b/.yarn/cache/@typescript-eslint-types-npm-5.48.2-bdebd4d2d7-9c5e860a01.zip new file mode 100644 index 0000000..d6cc6da Binary files /dev/null and b/.yarn/cache/@typescript-eslint-types-npm-5.48.2-bdebd4d2d7-9c5e860a01.zip differ diff --git a/.yarn/cache/@typescript-eslint-typescript-estree-npm-4.33.0-b6b79c10d0-2566984390.zip b/.yarn/cache/@typescript-eslint-typescript-estree-npm-4.33.0-b6b79c10d0-2566984390.zip new file mode 100644 index 0000000..7cc21ee Binary files /dev/null and b/.yarn/cache/@typescript-eslint-typescript-estree-npm-4.33.0-b6b79c10d0-2566984390.zip differ diff --git a/.yarn/cache/@typescript-eslint-typescript-estree-npm-5.48.2-2166870a0a-3ae06c5972.zip b/.yarn/cache/@typescript-eslint-typescript-estree-npm-5.48.2-2166870a0a-3ae06c5972.zip new file mode 100644 index 0000000..8a09b44 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-typescript-estree-npm-5.48.2-2166870a0a-3ae06c5972.zip differ diff --git a/.yarn/cache/@typescript-eslint-utils-npm-5.48.2-0126c67a53-d363dbf577.zip b/.yarn/cache/@typescript-eslint-utils-npm-5.48.2-0126c67a53-d363dbf577.zip new file mode 100644 index 0000000..63ad430 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-utils-npm-5.48.2-0126c67a53-d363dbf577.zip differ diff --git a/.yarn/cache/@typescript-eslint-visitor-keys-npm-4.33.0-8b7e72a3c9-59953e474a.zip b/.yarn/cache/@typescript-eslint-visitor-keys-npm-4.33.0-8b7e72a3c9-59953e474a.zip new file mode 100644 index 0000000..80d6a78 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-visitor-keys-npm-4.33.0-8b7e72a3c9-59953e474a.zip differ diff --git a/.yarn/cache/@typescript-eslint-visitor-keys-npm-5.48.2-b644f53ee6-4d83d1e4b3.zip b/.yarn/cache/@typescript-eslint-visitor-keys-npm-5.48.2-b644f53ee6-4d83d1e4b3.zip new file mode 100644 index 0000000..4446d71 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-visitor-keys-npm-5.48.2-b644f53ee6-4d83d1e4b3.zip differ diff --git a/.yarn/cache/@vibrant-color-npm-3.2.1-alpha.1-4f3dad5483-d175ba75dd.zip b/.yarn/cache/@vibrant-color-npm-3.2.1-alpha.1-4f3dad5483-d175ba75dd.zip new file mode 100644 index 0000000..52f9c9f Binary files /dev/null and b/.yarn/cache/@vibrant-color-npm-3.2.1-alpha.1-4f3dad5483-d175ba75dd.zip differ diff --git a/.yarn/cache/@vibrant-core-npm-3.2.1-alpha.1-ea22d4147a-b08b22dfda.zip b/.yarn/cache/@vibrant-core-npm-3.2.1-alpha.1-ea22d4147a-b08b22dfda.zip new file mode 100644 index 0000000..a876af5 Binary files /dev/null and b/.yarn/cache/@vibrant-core-npm-3.2.1-alpha.1-ea22d4147a-b08b22dfda.zip differ diff --git a/.yarn/cache/@vibrant-generator-default-npm-3.2.1-alpha.1-19ffaec5b8-83b0eba7b9.zip b/.yarn/cache/@vibrant-generator-default-npm-3.2.1-alpha.1-19ffaec5b8-83b0eba7b9.zip new file mode 100644 index 0000000..559098f Binary files /dev/null and b/.yarn/cache/@vibrant-generator-default-npm-3.2.1-alpha.1-19ffaec5b8-83b0eba7b9.zip differ diff --git a/.yarn/cache/@vibrant-generator-npm-3.2.1-alpha.1-88cb616d5e-57ea34d8cc.zip b/.yarn/cache/@vibrant-generator-npm-3.2.1-alpha.1-88cb616d5e-57ea34d8cc.zip new file mode 100644 index 0000000..068d6c8 Binary files /dev/null and b/.yarn/cache/@vibrant-generator-npm-3.2.1-alpha.1-88cb616d5e-57ea34d8cc.zip differ diff --git a/.yarn/cache/@vibrant-image-browser-npm-3.2.1-alpha.1-82622ac322-937495f9bd.zip b/.yarn/cache/@vibrant-image-browser-npm-3.2.1-alpha.1-82622ac322-937495f9bd.zip new file mode 100644 index 0000000..38f0bda Binary files /dev/null and b/.yarn/cache/@vibrant-image-browser-npm-3.2.1-alpha.1-82622ac322-937495f9bd.zip differ diff --git a/.yarn/cache/@vibrant-image-node-npm-3.2.1-alpha.1-440cd963f3-0f718a7ca6.zip b/.yarn/cache/@vibrant-image-node-npm-3.2.1-alpha.1-440cd963f3-0f718a7ca6.zip new file mode 100644 index 0000000..d25a6f7 Binary files /dev/null and b/.yarn/cache/@vibrant-image-node-npm-3.2.1-alpha.1-440cd963f3-0f718a7ca6.zip differ diff --git a/.yarn/cache/@vibrant-image-npm-3.2.1-alpha.1-eb8b249a87-dee9383c55.zip b/.yarn/cache/@vibrant-image-npm-3.2.1-alpha.1-eb8b249a87-dee9383c55.zip new file mode 100644 index 0000000..ffe6ac9 Binary files /dev/null and b/.yarn/cache/@vibrant-image-npm-3.2.1-alpha.1-eb8b249a87-dee9383c55.zip differ diff --git a/.yarn/cache/@vibrant-quantizer-mmcq-npm-3.2.1-alpha.1-625f3ebe70-26dd56112b.zip b/.yarn/cache/@vibrant-quantizer-mmcq-npm-3.2.1-alpha.1-625f3ebe70-26dd56112b.zip new file mode 100644 index 0000000..3c47867 Binary files /dev/null and b/.yarn/cache/@vibrant-quantizer-mmcq-npm-3.2.1-alpha.1-625f3ebe70-26dd56112b.zip differ diff --git a/.yarn/cache/@vibrant-quantizer-npm-3.2.1-alpha.1-33939b800a-bbd991d474.zip b/.yarn/cache/@vibrant-quantizer-npm-3.2.1-alpha.1-33939b800a-bbd991d474.zip new file mode 100644 index 0000000..a90fbea Binary files /dev/null and b/.yarn/cache/@vibrant-quantizer-npm-3.2.1-alpha.1-33939b800a-bbd991d474.zip differ diff --git a/.yarn/cache/@vibrant-types-npm-3.2.1-alpha.1-d60f387733-260d4b3bdd.zip b/.yarn/cache/@vibrant-types-npm-3.2.1-alpha.1-d60f387733-260d4b3bdd.zip new file mode 100644 index 0000000..b3ac21f Binary files /dev/null and b/.yarn/cache/@vibrant-types-npm-3.2.1-alpha.1-d60f387733-260d4b3bdd.zip differ diff --git a/.yarn/cache/@vibrant-worker-npm-3.2.1-alpha.1-09bdfddcb6-6eaec03904.zip b/.yarn/cache/@vibrant-worker-npm-3.2.1-alpha.1-09bdfddcb6-6eaec03904.zip new file mode 100644 index 0000000..0cef676 Binary files /dev/null and b/.yarn/cache/@vibrant-worker-npm-3.2.1-alpha.1-09bdfddcb6-6eaec03904.zip differ diff --git a/.yarn/cache/@webpack-cli-configtest-npm-1.2.0-728a6bf8bd-a2726cd9ec.zip b/.yarn/cache/@webpack-cli-configtest-npm-1.2.0-728a6bf8bd-a2726cd9ec.zip new file mode 100644 index 0000000..ab6e74d Binary files /dev/null and b/.yarn/cache/@webpack-cli-configtest-npm-1.2.0-728a6bf8bd-a2726cd9ec.zip differ diff --git a/.yarn/cache/@webpack-cli-info-npm-1.5.0-9d9627ae19-7f56fe037c.zip b/.yarn/cache/@webpack-cli-info-npm-1.5.0-9d9627ae19-7f56fe037c.zip new file mode 100644 index 0000000..64c90ae Binary files /dev/null and b/.yarn/cache/@webpack-cli-info-npm-1.5.0-9d9627ae19-7f56fe037c.zip differ diff --git a/.yarn/cache/@webpack-cli-serve-npm-1.7.0-2869abfdb4-d475e8effa.zip b/.yarn/cache/@webpack-cli-serve-npm-1.7.0-2869abfdb4-d475e8effa.zip new file mode 100644 index 0000000..a341014 Binary files /dev/null and b/.yarn/cache/@webpack-cli-serve-npm-1.7.0-2869abfdb4-d475e8effa.zip differ diff --git a/.yarn/cache/adverb-where-npm-0.2.5-e6f24e4584-8ad0f12571.zip b/.yarn/cache/adverb-where-npm-0.2.5-e6f24e4584-8ad0f12571.zip new file mode 100644 index 0000000..67c339b Binary files /dev/null and b/.yarn/cache/adverb-where-npm-0.2.5-e6f24e4584-8ad0f12571.zip differ diff --git a/.yarn/cache/ansi-regex-npm-2.1.1-ddd24d102b-190abd03e4.zip b/.yarn/cache/ansi-regex-npm-2.1.1-ddd24d102b-190abd03e4.zip new file mode 100644 index 0000000..39b4640 Binary files /dev/null and b/.yarn/cache/ansi-regex-npm-2.1.1-ddd24d102b-190abd03e4.zip differ diff --git a/.yarn/cache/any-base-npm-1.1.0-1f3e797fba-c1fd040de5.zip b/.yarn/cache/any-base-npm-1.1.0-1f3e797fba-c1fd040de5.zip new file mode 100644 index 0000000..6418dec Binary files /dev/null and b/.yarn/cache/any-base-npm-1.1.0-1f3e797fba-c1fd040de5.zip differ diff --git a/.yarn/cache/apollo-cache-control-npm-0.15.0-8a7390a43d-1d060f0368.zip b/.yarn/cache/apollo-cache-control-npm-0.15.0-8a7390a43d-1d060f0368.zip new file mode 100644 index 0000000..fc11ef9 Binary files /dev/null and b/.yarn/cache/apollo-cache-control-npm-0.15.0-8a7390a43d-1d060f0368.zip differ diff --git a/.yarn/cache/apollo-datasource-npm-0.10.0-8996f841a8-c786b406d5.zip b/.yarn/cache/apollo-datasource-npm-0.10.0-8996f841a8-c786b406d5.zip new file mode 100644 index 0000000..4d78cfc Binary files /dev/null and b/.yarn/cache/apollo-datasource-npm-0.10.0-8996f841a8-c786b406d5.zip differ diff --git a/.yarn/cache/apollo-graphql-npm-0.9.7-44e8ccc498-684aea8f77.zip b/.yarn/cache/apollo-graphql-npm-0.9.7-44e8ccc498-684aea8f77.zip new file mode 100644 index 0000000..c8fedc2 Binary files /dev/null and b/.yarn/cache/apollo-graphql-npm-0.9.7-44e8ccc498-684aea8f77.zip differ diff --git a/.yarn/cache/apollo-reporting-protobuf-npm-0.8.0-1827f019aa-03987a454a.zip b/.yarn/cache/apollo-reporting-protobuf-npm-0.8.0-1827f019aa-03987a454a.zip new file mode 100644 index 0000000..2df2caf Binary files /dev/null and b/.yarn/cache/apollo-reporting-protobuf-npm-0.8.0-1827f019aa-03987a454a.zip differ diff --git a/.yarn/cache/apollo-server-caching-npm-0.7.0-0cd30be7ad-53057326f5.zip b/.yarn/cache/apollo-server-caching-npm-0.7.0-0cd30be7ad-53057326f5.zip new file mode 100644 index 0000000..9165664 Binary files /dev/null and b/.yarn/cache/apollo-server-caching-npm-0.7.0-0cd30be7ad-53057326f5.zip differ diff --git a/.yarn/cache/apollo-server-core-npm-2.26.1-4ba610ad6f-7c509bb8a2.zip b/.yarn/cache/apollo-server-core-npm-2.26.1-4ba610ad6f-7c509bb8a2.zip new file mode 100644 index 0000000..32db98c Binary files /dev/null and b/.yarn/cache/apollo-server-core-npm-2.26.1-4ba610ad6f-7c509bb8a2.zip differ diff --git a/.yarn/cache/apollo-server-env-npm-3.2.0-53f2a2cb9b-84d880e483.zip b/.yarn/cache/apollo-server-env-npm-3.2.0-53f2a2cb9b-84d880e483.zip new file mode 100644 index 0000000..872db1d Binary files /dev/null and b/.yarn/cache/apollo-server-env-npm-3.2.0-53f2a2cb9b-84d880e483.zip differ diff --git a/.yarn/cache/apollo-server-errors-npm-2.5.0-3b059580ed-c93129f0b0.zip b/.yarn/cache/apollo-server-errors-npm-2.5.0-3b059580ed-c93129f0b0.zip new file mode 100644 index 0000000..46acbb0 Binary files /dev/null and b/.yarn/cache/apollo-server-errors-npm-2.5.0-3b059580ed-c93129f0b0.zip differ diff --git a/.yarn/cache/apollo-server-express-npm-2.26.1-6bde2a2142-29dc4a1b67.zip b/.yarn/cache/apollo-server-express-npm-2.26.1-6bde2a2142-29dc4a1b67.zip new file mode 100644 index 0000000..59c5b10 Binary files /dev/null and b/.yarn/cache/apollo-server-express-npm-2.26.1-6bde2a2142-29dc4a1b67.zip differ diff --git a/.yarn/cache/apollo-server-plugin-base-npm-0.14.0-25efb5355f-dd076fa44b.zip b/.yarn/cache/apollo-server-plugin-base-npm-0.14.0-25efb5355f-dd076fa44b.zip new file mode 100644 index 0000000..04ce81e Binary files /dev/null and b/.yarn/cache/apollo-server-plugin-base-npm-0.14.0-25efb5355f-dd076fa44b.zip differ diff --git a/.yarn/cache/apollo-server-types-npm-0.10.0-f821998100-73b4783e5e.zip b/.yarn/cache/apollo-server-types-npm-0.10.0-f821998100-73b4783e5e.zip new file mode 100644 index 0000000..ee084ca Binary files /dev/null and b/.yarn/cache/apollo-server-types-npm-0.10.0-f821998100-73b4783e5e.zip differ diff --git a/.yarn/cache/apollo-tracing-npm-0.16.0-63d067cefa-1b6851b555.zip b/.yarn/cache/apollo-tracing-npm-0.16.0-63d067cefa-1b6851b555.zip new file mode 100644 index 0000000..8d4f696 Binary files /dev/null and b/.yarn/cache/apollo-tracing-npm-0.16.0-63d067cefa-1b6851b555.zip differ diff --git a/.yarn/cache/app-root-path-npm-2.2.1-8d3b98fb57-c0a8a39022.zip b/.yarn/cache/app-root-path-npm-2.2.1-8d3b98fb57-c0a8a39022.zip new file mode 100644 index 0000000..7e7cf48 Binary files /dev/null and b/.yarn/cache/app-root-path-npm-2.2.1-8d3b98fb57-c0a8a39022.zip differ diff --git a/.yarn/cache/app-root-path-npm-3.1.0-9822bb2a96-e3db3957ae.zip b/.yarn/cache/app-root-path-npm-3.1.0-9822bb2a96-e3db3957ae.zip new file mode 100644 index 0000000..1049e51 Binary files /dev/null and b/.yarn/cache/app-root-path-npm-3.1.0-9822bb2a96-e3db3957ae.zip differ diff --git a/.yarn/cache/append-field-npm-0.1.0-42e384f5e1-eeb573c009.zip b/.yarn/cache/append-field-npm-0.1.0-42e384f5e1-eeb573c009.zip new file mode 100644 index 0000000..3928e7c Binary files /dev/null and b/.yarn/cache/append-field-npm-0.1.0-42e384f5e1-eeb573c009.zip differ diff --git a/.yarn/cache/append-field-npm-1.0.0-bb98be199c-482ba08acc.zip b/.yarn/cache/append-field-npm-1.0.0-bb98be199c-482ba08acc.zip new file mode 100644 index 0000000..230c6b4 Binary files /dev/null and b/.yarn/cache/append-field-npm-1.0.0-bb98be199c-482ba08acc.zip differ diff --git a/.yarn/cache/aproba-npm-1.2.0-34129f0778-0fca141966.zip b/.yarn/cache/aproba-npm-1.2.0-34129f0778-0fca141966.zip new file mode 100644 index 0000000..87d8517 Binary files /dev/null and b/.yarn/cache/aproba-npm-1.2.0-34129f0778-0fca141966.zip differ diff --git a/.yarn/cache/are-we-there-yet-npm-1.1.7-db9f39924e-70d251719c.zip b/.yarn/cache/are-we-there-yet-npm-1.1.7-db9f39924e-70d251719c.zip new file mode 100644 index 0000000..464871d Binary files /dev/null and b/.yarn/cache/are-we-there-yet-npm-1.1.7-db9f39924e-70d251719c.zip differ diff --git a/.yarn/cache/array.prototype.reduce-npm-1.0.5-161dafd7db-f44691395f.zip b/.yarn/cache/array.prototype.reduce-npm-1.0.5-161dafd7db-f44691395f.zip new file mode 100644 index 0000000..d2077a3 Binary files /dev/null and b/.yarn/cache/array.prototype.reduce-npm-1.0.5-161dafd7db-f44691395f.zip differ diff --git a/.yarn/cache/async-retry-npm-1.3.3-bc90c5cee0-38a7152ff7.zip b/.yarn/cache/async-retry-npm-1.3.3-bc90c5cee0-38a7152ff7.zip new file mode 100644 index 0000000..e525290 Binary files /dev/null and b/.yarn/cache/async-retry-npm-1.3.3-bc90c5cee0-38a7152ff7.zip differ diff --git a/.yarn/cache/available-typed-arrays-npm-1.0.5-88f321e4d3-20eb47b3ce.zip b/.yarn/cache/available-typed-arrays-npm-1.0.5-88f321e4d3-20eb47b3ce.zip new file mode 100644 index 0000000..62f8601 Binary files /dev/null and b/.yarn/cache/available-typed-arrays-npm-1.0.5-88f321e4d3-20eb47b3ce.zip differ diff --git a/.yarn/cache/bmp-js-npm-0.1.0-5c9f284ca3-2f6cf7eeab.zip b/.yarn/cache/bmp-js-npm-0.1.0-5c9f284ca3-2f6cf7eeab.zip new file mode 100644 index 0000000..bb21298 Binary files /dev/null and b/.yarn/cache/bmp-js-npm-0.1.0-5c9f284ca3-2f6cf7eeab.zip differ diff --git a/.yarn/cache/buffer-equal-constant-time-npm-1.0.1-41826f3419-80bb945f5d.zip b/.yarn/cache/buffer-equal-constant-time-npm-1.0.1-41826f3419-80bb945f5d.zip new file mode 100644 index 0000000..b1f7def Binary files /dev/null and b/.yarn/cache/buffer-equal-constant-time-npm-1.0.1-41826f3419-80bb945f5d.zip differ diff --git a/.yarn/cache/buffer-equal-npm-0.0.1-428f7d217a-ca4b52e6c0.zip b/.yarn/cache/buffer-equal-npm-0.0.1-428f7d217a-ca4b52e6c0.zip new file mode 100644 index 0000000..43ce00a Binary files /dev/null and b/.yarn/cache/buffer-equal-npm-0.0.1-428f7d217a-ca4b52e6c0.zip differ diff --git a/.yarn/cache/buffer-npm-6.0.3-cd90dfedfe-5ad23293d9.zip b/.yarn/cache/buffer-npm-6.0.3-cd90dfedfe-5ad23293d9.zip new file mode 100644 index 0000000..dbf2748 Binary files /dev/null and b/.yarn/cache/buffer-npm-6.0.3-cd90dfedfe-5ad23293d9.zip differ diff --git a/.yarn/cache/buffer-writer-npm-2.0.0-5cd2ef55bc-11736b48bb.zip b/.yarn/cache/buffer-writer-npm-2.0.0-5cd2ef55bc-11736b48bb.zip new file mode 100644 index 0000000..e676a36 Binary files /dev/null and b/.yarn/cache/buffer-writer-npm-2.0.0-5cd2ef55bc-11736b48bb.zip differ diff --git a/.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-db021755d7.zip b/.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-db021755d7.zip new file mode 100644 index 0000000..c7e2044 Binary files /dev/null and b/.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-db021755d7.zip differ diff --git a/.yarn/cache/busboy-npm-0.2.14-adb3ecd9ee-9df9fca6d9.zip b/.yarn/cache/busboy-npm-0.2.14-adb3ecd9ee-9df9fca6d9.zip new file mode 100644 index 0000000..5e49f0a Binary files /dev/null and b/.yarn/cache/busboy-npm-0.2.14-adb3ecd9ee-9df9fca6d9.zip differ diff --git a/.yarn/cache/busboy-npm-0.3.1-87ec0dae5a-d2bcb788c4.zip b/.yarn/cache/busboy-npm-0.3.1-87ec0dae5a-d2bcb788c4.zip new file mode 100644 index 0000000..aa0bb27 Binary files /dev/null and b/.yarn/cache/busboy-npm-0.3.1-87ec0dae5a-d2bcb788c4.zip differ diff --git a/.yarn/cache/cache-content-type-npm-1.0.1-f709f8c309-18db4d5945.zip b/.yarn/cache/cache-content-type-npm-1.0.1-f709f8c309-18db4d5945.zip new file mode 100644 index 0000000..a342215 Binary files /dev/null and b/.yarn/cache/cache-content-type-npm-1.0.1-f709f8c309-18db4d5945.zip differ diff --git a/.yarn/cache/chownr-npm-1.1.4-5bd400ab08-115648f8eb.zip b/.yarn/cache/chownr-npm-1.1.4-5bd400ab08-115648f8eb.zip new file mode 100644 index 0000000..b4f5043 Binary files /dev/null and b/.yarn/cache/chownr-npm-1.1.4-5bd400ab08-115648f8eb.zip differ diff --git a/.yarn/cache/ci-info-npm-3.7.1-fd86862c3f-72d93d5101.zip b/.yarn/cache/ci-info-npm-3.7.1-fd86862c3f-72d93d5101.zip new file mode 100644 index 0000000..42dcad2 Binary files /dev/null and b/.yarn/cache/ci-info-npm-3.7.1-fd86862c3f-72d93d5101.zip differ diff --git a/.yarn/cache/class-transformer-npm-0.3.1-ced328a333-3a3f7a92cb.zip b/.yarn/cache/class-transformer-npm-0.3.1-ced328a333-3a3f7a92cb.zip new file mode 100644 index 0000000..7b0bc6c Binary files /dev/null and b/.yarn/cache/class-transformer-npm-0.3.1-ced328a333-3a3f7a92cb.zip differ diff --git a/.yarn/cache/class-validator-jsonschema-npm-2.2.0-ac36d9d893-c909908459.zip b/.yarn/cache/class-validator-jsonschema-npm-2.2.0-ac36d9d893-c909908459.zip new file mode 100644 index 0000000..bb33093 Binary files /dev/null and b/.yarn/cache/class-validator-jsonschema-npm-2.2.0-ac36d9d893-c909908459.zip differ diff --git a/.yarn/cache/class-validator-npm-0.14.0-b600d5fe72-f62e4a0ad2.zip b/.yarn/cache/class-validator-npm-0.14.0-b600d5fe72-f62e4a0ad2.zip new file mode 100644 index 0000000..7521af9 Binary files /dev/null and b/.yarn/cache/class-validator-npm-0.14.0-b600d5fe72-f62e4a0ad2.zip differ diff --git a/.yarn/cache/clean-regexp-npm-1.0.0-f349f98f15-0b1ce281b0.zip b/.yarn/cache/clean-regexp-npm-1.0.0-f349f98f15-0b1ce281b0.zip new file mode 100644 index 0000000..fe895a5 Binary files /dev/null and b/.yarn/cache/clean-regexp-npm-1.0.0-f349f98f15-0b1ce281b0.zip differ diff --git a/.yarn/cache/cliui-npm-6.0.0-488b2414c6-4fcfd26d29.zip b/.yarn/cache/cliui-npm-6.0.0-488b2414c6-4fcfd26d29.zip new file mode 100644 index 0000000..d3c2fa4 Binary files /dev/null and b/.yarn/cache/cliui-npm-6.0.0-488b2414c6-4fcfd26d29.zip differ diff --git a/.yarn/cache/co-body-npm-6.1.0-8102b96671-d0a78831a6.zip b/.yarn/cache/co-body-npm-6.1.0-8102b96671-d0a78831a6.zip new file mode 100644 index 0000000..1b8a9bb Binary files /dev/null and b/.yarn/cache/co-body-npm-6.1.0-8102b96671-d0a78831a6.zip differ diff --git a/.yarn/cache/code-point-at-npm-1.1.0-37de5fe566-17d5666611.zip b/.yarn/cache/code-point-at-npm-1.1.0-37de5fe566-17d5666611.zip new file mode 100644 index 0000000..5e910b2 Binary files /dev/null and b/.yarn/cache/code-point-at-npm-1.1.0-37de5fe566-17d5666611.zip differ diff --git a/.yarn/cache/color-npm-3.2.1-568cf1014f-f81220e8b7.zip b/.yarn/cache/color-npm-3.2.1-568cf1014f-f81220e8b7.zip new file mode 100644 index 0000000..6021f3d Binary files /dev/null and b/.yarn/cache/color-npm-3.2.1-568cf1014f-f81220e8b7.zip differ diff --git a/.yarn/cache/color-string-npm-1.9.1-dc020e56be-c13fe7cff7.zip b/.yarn/cache/color-string-npm-1.9.1-dc020e56be-c13fe7cff7.zip new file mode 100644 index 0000000..7f3fc72 Binary files /dev/null and b/.yarn/cache/color-string-npm-1.9.1-dc020e56be-c13fe7cff7.zip differ diff --git a/.yarn/cache/colorspace-npm-1.1.4-f01655548a-bb3934ef3c.zip b/.yarn/cache/colorspace-npm-1.1.4-f01655548a-bb3934ef3c.zip new file mode 100644 index 0000000..61c649a Binary files /dev/null and b/.yarn/cache/colorspace-npm-1.1.4-f01655548a-bb3934ef3c.zip differ diff --git a/.yarn/cache/comment-parser-npm-1.1.6-beta.0-05566ace41-f686c8b710.zip b/.yarn/cache/comment-parser-npm-1.1.6-beta.0-05566ace41-f686c8b710.zip new file mode 100644 index 0000000..eb8ef04 Binary files /dev/null and b/.yarn/cache/comment-parser-npm-1.1.6-beta.0-05566ace41-f686c8b710.zip differ diff --git a/.yarn/cache/concat-stream-npm-1.6.2-2bee337060-1ef77032cb.zip b/.yarn/cache/concat-stream-npm-1.6.2-2bee337060-1ef77032cb.zip new file mode 100644 index 0000000..2adcea7 Binary files /dev/null and b/.yarn/cache/concat-stream-npm-1.6.2-2bee337060-1ef77032cb.zip differ diff --git a/.yarn/cache/cookie-npm-0.4.2-7761894d5f-a00833c998.zip b/.yarn/cache/cookie-npm-0.4.2-7761894d5f-a00833c998.zip new file mode 100644 index 0000000..2a47844 Binary files /dev/null and b/.yarn/cache/cookie-npm-0.4.2-7761894d5f-a00833c998.zip differ diff --git a/.yarn/cache/cookies-npm-0.8.0-d7388cbd94-806055a44f.zip b/.yarn/cache/cookies-npm-0.8.0-d7388cbd94-806055a44f.zip new file mode 100644 index 0000000..1fc4167 Binary files /dev/null and b/.yarn/cache/cookies-npm-0.8.0-d7388cbd94-806055a44f.zip differ diff --git a/.yarn/cache/copy-to-npm-2.0.1-474b7b678b-05ea12875b.zip b/.yarn/cache/copy-to-npm-2.0.1-474b7b678b-05ea12875b.zip new file mode 100644 index 0000000..9805700 Binary files /dev/null and b/.yarn/cache/copy-to-npm-2.0.1-474b7b678b-05ea12875b.zip differ diff --git a/.yarn/cache/core-js-pure-npm-3.27.2-3edfabddfd-7cb24502a7.zip b/.yarn/cache/core-js-pure-npm-3.27.2-3edfabddfd-7cb24502a7.zip new file mode 100644 index 0000000..73c9e1f Binary files /dev/null and b/.yarn/cache/core-js-pure-npm-3.27.2-3edfabddfd-7cb24502a7.zip differ diff --git a/.yarn/cache/cors-npm-2.8.5-c9935a2d12-ced838404c.zip b/.yarn/cache/cors-npm-2.8.5-c9935a2d12-ced838404c.zip new file mode 100644 index 0000000..b7ab2c5 Binary files /dev/null and b/.yarn/cache/cors-npm-2.8.5-c9935a2d12-ced838404c.zip differ diff --git a/.yarn/cache/cron-decorators-npm-0.1.5-a6e6b26683-93e0986ed2.zip b/.yarn/cache/cron-decorators-npm-0.1.5-a6e6b26683-93e0986ed2.zip new file mode 100644 index 0000000..a746de3 Binary files /dev/null and b/.yarn/cache/cron-decorators-npm-0.1.5-a6e6b26683-93e0986ed2.zip differ diff --git a/.yarn/cache/cron-npm-1.8.2-e208a565b6-9df2d2e246.zip b/.yarn/cache/cron-npm-1.8.2-e208a565b6-9df2d2e246.zip new file mode 100644 index 0000000..f7a942a Binary files /dev/null and b/.yarn/cache/cron-npm-1.8.2-e208a565b6-9df2d2e246.zip differ diff --git a/.yarn/cache/cssfilter-npm-0.0.10-28e06ce546-bc2c52bbb3.zip b/.yarn/cache/cssfilter-npm-0.0.10-28e06ce546-bc2c52bbb3.zip new file mode 100644 index 0000000..c0ce52a Binary files /dev/null and b/.yarn/cache/cssfilter-npm-0.0.10-28e06ce546-bc2c52bbb3.zip differ diff --git a/.yarn/cache/decamelize-npm-1.2.0-c5a2fdc622-ad8c51a7e7.zip b/.yarn/cache/decamelize-npm-1.2.0-c5a2fdc622-ad8c51a7e7.zip new file mode 100644 index 0000000..db4ac47 Binary files /dev/null and b/.yarn/cache/decamelize-npm-1.2.0-c5a2fdc622-ad8c51a7e7.zip differ diff --git a/.yarn/cache/decompress-response-npm-4.2.1-abe5b4ebe4-4e783ca4df.zip b/.yarn/cache/decompress-response-npm-4.2.1-abe5b4ebe4-4e783ca4df.zip new file mode 100644 index 0000000..d9f9f70 Binary files /dev/null and b/.yarn/cache/decompress-response-npm-4.2.1-abe5b4ebe4-4e783ca4df.zip differ diff --git a/.yarn/cache/deep-equal-npm-1.0.1-f05565c4e5-5af8cbfceb.zip b/.yarn/cache/deep-equal-npm-1.0.1-f05565c4e5-5af8cbfceb.zip new file mode 100644 index 0000000..077864e Binary files /dev/null and b/.yarn/cache/deep-equal-npm-1.0.1-f05565c4e5-5af8cbfceb.zip differ diff --git a/.yarn/cache/deep-extend-npm-0.6.0-e182924219-7be7e5a8d4.zip b/.yarn/cache/deep-extend-npm-0.6.0-e182924219-7be7e5a8d4.zip new file mode 100644 index 0000000..87f0270 Binary files /dev/null and b/.yarn/cache/deep-extend-npm-0.6.0-e182924219-7be7e5a8d4.zip differ diff --git a/.yarn/cache/define-properties-npm-1.1.4-85ee575655-ce0aef3f9e.zip b/.yarn/cache/define-properties-npm-1.1.4-85ee575655-ce0aef3f9e.zip new file mode 100644 index 0000000..afc995a Binary files /dev/null and b/.yarn/cache/define-properties-npm-1.1.4-85ee575655-ce0aef3f9e.zip differ diff --git a/.yarn/cache/deprecated-decorator-npm-0.1.6-86e1a9d956-26e4ca36e6.zip b/.yarn/cache/deprecated-decorator-npm-0.1.6-86e1a9d956-26e4ca36e6.zip new file mode 100644 index 0000000..757d586 Binary files /dev/null and b/.yarn/cache/deprecated-decorator-npm-0.1.6-86e1a9d956-26e4ca36e6.zip differ diff --git a/.yarn/cache/detect-libc-npm-1.0.3-c30ac344d4-daaaed925f.zip b/.yarn/cache/detect-libc-npm-1.0.3-c30ac344d4-daaaed925f.zip new file mode 100644 index 0000000..9c78505 Binary files /dev/null and b/.yarn/cache/detect-libc-npm-1.0.3-c30ac344d4-daaaed925f.zip differ diff --git a/.yarn/cache/dicer-npm-0.2.5-bd0237602f-a6f0ce9ac5.zip b/.yarn/cache/dicer-npm-0.2.5-bd0237602f-a6f0ce9ac5.zip new file mode 100644 index 0000000..998b891 Binary files /dev/null and b/.yarn/cache/dicer-npm-0.2.5-bd0237602f-a6f0ce9ac5.zip differ diff --git a/.yarn/cache/dicer-npm-0.3.0-ef4dcd1bb9-9f61aea61f.zip b/.yarn/cache/dicer-npm-0.3.0-ef4dcd1bb9-9f61aea61f.zip new file mode 100644 index 0000000..a2f3002 Binary files /dev/null and b/.yarn/cache/dicer-npm-0.3.0-ef4dcd1bb9-9f61aea61f.zip differ diff --git a/.yarn/cache/dijkstrajs-npm-1.0.2-c58f4835d6-8cd822441a.zip b/.yarn/cache/dijkstrajs-npm-1.0.2-c58f4835d6-8cd822441a.zip new file mode 100644 index 0000000..bd3aadb Binary files /dev/null and b/.yarn/cache/dijkstrajs-npm-1.0.2-c58f4835d6-8cd822441a.zip differ diff --git a/.yarn/cache/dom-walk-npm-0.1.2-7d20a1a8d8-19eb0ce9c6.zip b/.yarn/cache/dom-walk-npm-0.1.2-7d20a1a8d8-19eb0ce9c6.zip new file mode 100644 index 0000000..67f96c7 Binary files /dev/null and b/.yarn/cache/dom-walk-npm-0.1.2-7d20a1a8d8-19eb0ce9c6.zip differ diff --git a/.yarn/cache/dotenv-npm-8.6.0-2ce3e9f7bb-38e902c80b.zip b/.yarn/cache/dotenv-npm-8.6.0-2ce3e9f7bb-38e902c80b.zip new file mode 100644 index 0000000..21f3698 Binary files /dev/null and b/.yarn/cache/dotenv-npm-8.6.0-2ce3e9f7bb-38e902c80b.zip differ diff --git a/.yarn/cache/dynamic-dedupe-npm-0.3.0-2bd097ed43-5178b99ad3.zip b/.yarn/cache/dynamic-dedupe-npm-0.3.0-2bd097ed43-5178b99ad3.zip new file mode 100644 index 0000000..a9d504f Binary files /dev/null and b/.yarn/cache/dynamic-dedupe-npm-0.3.0-2bd097ed43-5178b99ad3.zip differ diff --git a/.yarn/cache/e-prime-npm-0.10.4-30f4beb5d1-4932a58f48.zip b/.yarn/cache/e-prime-npm-0.10.4-30f4beb5d1-4932a58f48.zip new file mode 100644 index 0000000..2560f00 Binary files /dev/null and b/.yarn/cache/e-prime-npm-0.10.4-30f4beb5d1-4932a58f48.zip differ diff --git a/.yarn/cache/ecdsa-sig-formatter-npm-1.0.11-b6784e7852-207f9ab1c2.zip b/.yarn/cache/ecdsa-sig-formatter-npm-1.0.11-b6784e7852-207f9ab1c2.zip new file mode 100644 index 0000000..20b562d Binary files /dev/null and b/.yarn/cache/ecdsa-sig-formatter-npm-1.0.11-b6784e7852-207f9ab1c2.zip differ diff --git a/.yarn/cache/enabled-npm-2.0.0-bf5d96c9d8-9d256d89f4.zip b/.yarn/cache/enabled-npm-2.0.0-bf5d96c9d8-9d256d89f4.zip new file mode 100644 index 0000000..def4625 Binary files /dev/null and b/.yarn/cache/enabled-npm-2.0.0-bf5d96c9d8-9d256d89f4.zip differ diff --git a/.yarn/cache/encode-utf8-npm-1.0.3-8f92a23782-550224bf2a.zip b/.yarn/cache/encode-utf8-npm-1.0.3-8f92a23782-550224bf2a.zip new file mode 100644 index 0000000..526ff9b Binary files /dev/null and b/.yarn/cache/encode-utf8-npm-1.0.3-8f92a23782-550224bf2a.zip differ diff --git a/.yarn/cache/envinfo-npm-7.8.1-f320033691-de736c98d6.zip b/.yarn/cache/envinfo-npm-7.8.1-f320033691-de736c98d6.zip new file mode 100644 index 0000000..006bb8e Binary files /dev/null and b/.yarn/cache/envinfo-npm-7.8.1-f320033691-de736c98d6.zip differ diff --git a/.yarn/cache/es-abstract-npm-1.21.1-28d9a4a469-23ff60d42d.zip b/.yarn/cache/es-abstract-npm-1.21.1-28d9a4a469-23ff60d42d.zip new file mode 100644 index 0000000..46e5d7d Binary files /dev/null and b/.yarn/cache/es-abstract-npm-1.21.1-28d9a4a469-23ff60d42d.zip differ diff --git a/.yarn/cache/es-array-method-boxes-properly-npm-1.0.0-d4bc728109-2537fcd1ce.zip b/.yarn/cache/es-array-method-boxes-properly-npm-1.0.0-d4bc728109-2537fcd1ce.zip new file mode 100644 index 0000000..594ebad Binary files /dev/null and b/.yarn/cache/es-array-method-boxes-properly-npm-1.0.0-d4bc728109-2537fcd1ce.zip differ diff --git a/.yarn/cache/es-set-tostringtag-npm-2.0.1-c87b5de872-ec416a1294.zip b/.yarn/cache/es-set-tostringtag-npm-2.0.1-c87b5de872-ec416a1294.zip new file mode 100644 index 0000000..af638f1 Binary files /dev/null and b/.yarn/cache/es-set-tostringtag-npm-2.0.1-c87b5de872-ec416a1294.zip differ diff --git a/.yarn/cache/es-to-primitive-npm-1.2.1-b7a7eac6c5-4ead6671a2.zip b/.yarn/cache/es-to-primitive-npm-1.2.1-b7a7eac6c5-4ead6671a2.zip new file mode 100644 index 0000000..c0bb5b0 Binary files /dev/null and b/.yarn/cache/es-to-primitive-npm-1.2.1-b7a7eac6c5-4ead6671a2.zip differ diff --git a/.yarn/cache/eslint-plugin-autofix-npm-1.1.0-f58e86defe-93d33ca48f.zip b/.yarn/cache/eslint-plugin-autofix-npm-1.1.0-f58e86defe-93d33ca48f.zip new file mode 100644 index 0000000..ef6c5e4 Binary files /dev/null and b/.yarn/cache/eslint-plugin-autofix-npm-1.1.0-f58e86defe-93d33ca48f.zip differ diff --git a/.yarn/cache/eslint-plugin-deprecation-npm-1.3.3-6b2ead7463-5e14d7bc82.zip b/.yarn/cache/eslint-plugin-deprecation-npm-1.3.3-6b2ead7463-5e14d7bc82.zip new file mode 100644 index 0000000..8c150fa Binary files /dev/null and b/.yarn/cache/eslint-plugin-deprecation-npm-1.3.3-6b2ead7463-5e14d7bc82.zip differ diff --git a/.yarn/cache/eslint-plugin-immutable-npm-1.0.0-14338730cf-cad83491b6.zip b/.yarn/cache/eslint-plugin-immutable-npm-1.0.0-14338730cf-cad83491b6.zip new file mode 100644 index 0000000..c7182eb Binary files /dev/null and b/.yarn/cache/eslint-plugin-immutable-npm-1.0.0-14338730cf-cad83491b6.zip differ diff --git a/.yarn/cache/eslint-plugin-jsdoc-npm-35.5.1-30101ce518-c5aa87831a.zip b/.yarn/cache/eslint-plugin-jsdoc-npm-35.5.1-30101ce518-c5aa87831a.zip new file mode 100644 index 0000000..610e4f9 Binary files /dev/null and b/.yarn/cache/eslint-plugin-jsdoc-npm-35.5.1-30101ce518-c5aa87831a.zip differ diff --git a/.yarn/cache/eslint-plugin-no-loops-npm-0.3.0-9b88b6187d-61232f8a77.zip b/.yarn/cache/eslint-plugin-no-loops-npm-0.3.0-9b88b6187d-61232f8a77.zip new file mode 100644 index 0000000..b6e08c4 Binary files /dev/null and b/.yarn/cache/eslint-plugin-no-loops-npm-0.3.0-9b88b6187d-61232f8a77.zip differ diff --git a/.yarn/cache/eslint-plugin-no-secrets-npm-0.8.9-49cf59cabe-28b0ddb378.zip b/.yarn/cache/eslint-plugin-no-secrets-npm-0.8.9-49cf59cabe-28b0ddb378.zip new file mode 100644 index 0000000..8ddb270 Binary files /dev/null and b/.yarn/cache/eslint-plugin-no-secrets-npm-0.8.9-49cf59cabe-28b0ddb378.zip differ diff --git a/.yarn/cache/eslint-plugin-notice-npm-0.9.10-66e7a73ef5-0892ea3da8.zip b/.yarn/cache/eslint-plugin-notice-npm-0.9.10-66e7a73ef5-0892ea3da8.zip new file mode 100644 index 0000000..967ae98 Binary files /dev/null and b/.yarn/cache/eslint-plugin-notice-npm-0.9.10-66e7a73ef5-0892ea3da8.zip differ diff --git a/.yarn/cache/eslint-plugin-promise-npm-5.2.0-bbf641e133-5d6b2d2840.zip b/.yarn/cache/eslint-plugin-promise-npm-5.2.0-bbf641e133-5d6b2d2840.zip new file mode 100644 index 0000000..a188e96 Binary files /dev/null and b/.yarn/cache/eslint-plugin-promise-npm-5.2.0-bbf641e133-5d6b2d2840.zip differ diff --git a/.yarn/cache/eslint-plugin-radar-npm-0.2.1-5341ad27e0-dece5c0250.zip b/.yarn/cache/eslint-plugin-radar-npm-0.2.1-5341ad27e0-dece5c0250.zip new file mode 100644 index 0000000..2bcf6c7 Binary files /dev/null and b/.yarn/cache/eslint-plugin-radar-npm-0.2.1-5341ad27e0-dece5c0250.zip differ diff --git a/.yarn/cache/eslint-plugin-security-npm-1.6.0-6b69a17cf5-e47fa1a71a.zip b/.yarn/cache/eslint-plugin-security-npm-1.6.0-6b69a17cf5-e47fa1a71a.zip new file mode 100644 index 0000000..3fbe5e5 Binary files /dev/null and b/.yarn/cache/eslint-plugin-security-npm-1.6.0-6b69a17cf5-e47fa1a71a.zip differ diff --git a/.yarn/cache/eslint-plugin-simple-import-sort-npm-7.0.0-45d08a8927-6aacb7179c.zip b/.yarn/cache/eslint-plugin-simple-import-sort-npm-7.0.0-45d08a8927-6aacb7179c.zip new file mode 100644 index 0000000..3e7bf43 Binary files /dev/null and b/.yarn/cache/eslint-plugin-simple-import-sort-npm-7.0.0-45d08a8927-6aacb7179c.zip differ diff --git a/.yarn/cache/eslint-plugin-sort-keys-fix-npm-1.1.2-1d8806df9a-d089e4ec4f.zip b/.yarn/cache/eslint-plugin-sort-keys-fix-npm-1.1.2-1d8806df9a-d089e4ec4f.zip new file mode 100644 index 0000000..6d6e040 Binary files /dev/null and b/.yarn/cache/eslint-plugin-sort-keys-fix-npm-1.1.2-1d8806df9a-d089e4ec4f.zip differ diff --git a/.yarn/cache/eslint-plugin-type-graphql-npm-0.3.2-d1092b0648-9429f0ddf1.zip b/.yarn/cache/eslint-plugin-type-graphql-npm-0.3.2-d1092b0648-9429f0ddf1.zip new file mode 100644 index 0000000..094770d Binary files /dev/null and b/.yarn/cache/eslint-plugin-type-graphql-npm-0.3.2-d1092b0648-9429f0ddf1.zip differ diff --git a/.yarn/cache/eslint-plugin-unicorn-npm-32.0.1-bd22dedee0-e74051e8b0.zip b/.yarn/cache/eslint-plugin-unicorn-npm-32.0.1-bd22dedee0-e74051e8b0.zip new file mode 100644 index 0000000..3eafa51 Binary files /dev/null and b/.yarn/cache/eslint-plugin-unicorn-npm-32.0.1-bd22dedee0-e74051e8b0.zip differ diff --git a/.yarn/cache/eslint-plugin-woke-npm-1.0.1-1686c69f9a-d87a831f0e.zip b/.yarn/cache/eslint-plugin-woke-npm-1.0.1-1686c69f9a-d87a831f0e.zip new file mode 100644 index 0000000..49d868e Binary files /dev/null and b/.yarn/cache/eslint-plugin-woke-npm-1.0.1-1686c69f9a-d87a831f0e.zip differ diff --git a/.yarn/cache/eslint-plugin-write-good-comments-npm-0.1.4-ddfb9f0478-73e6e30735.zip b/.yarn/cache/eslint-plugin-write-good-comments-npm-0.1.4-ddfb9f0478-73e6e30735.zip new file mode 100644 index 0000000..faf17bb Binary files /dev/null and b/.yarn/cache/eslint-plugin-write-good-comments-npm-0.1.4-ddfb9f0478-73e6e30735.zip differ diff --git a/.yarn/cache/eslint-rule-composer-npm-0.3.0-0188afafaa-c2f57cded8.zip b/.yarn/cache/eslint-rule-composer-npm-0.3.0-0188afafaa-c2f57cded8.zip new file mode 100644 index 0000000..8c64824 Binary files /dev/null and b/.yarn/cache/eslint-rule-composer-npm-0.3.0-0188afafaa-c2f57cded8.zip differ diff --git a/.yarn/cache/eslint-template-visitor-npm-2.3.2-2d1a722dab-83da75f462.zip b/.yarn/cache/eslint-template-visitor-npm-2.3.2-2d1a722dab-83da75f462.zip new file mode 100644 index 0000000..6c6a9b7 Binary files /dev/null and b/.yarn/cache/eslint-template-visitor-npm-2.3.2-2d1a722dab-83da75f462.zip differ diff --git a/.yarn/cache/exif-parser-npm-0.1.12-ff077373a4-6ba50cb9e0.zip b/.yarn/cache/exif-parser-npm-0.1.12-ff077373a4-6ba50cb9e0.zip new file mode 100644 index 0000000..3a879f8 Binary files /dev/null and b/.yarn/cache/exif-parser-npm-0.1.12-ff077373a4-6ba50cb9e0.zip differ diff --git a/.yarn/cache/expand-template-npm-2.0.3-80de959306-588c198472.zip b/.yarn/cache/expand-template-npm-2.0.3-80de959306-588c198472.zip new file mode 100644 index 0000000..ec0c34f Binary files /dev/null and b/.yarn/cache/expand-template-npm-2.0.3-80de959306-588c198472.zip differ diff --git a/.yarn/cache/express-session-npm-1.17.3-0819dbe06c-1021a79343.zip b/.yarn/cache/express-session-npm-1.17.3-0819dbe06c-1021a79343.zip new file mode 100644 index 0000000..8acaf06 Binary files /dev/null and b/.yarn/cache/express-session-npm-1.17.3-0819dbe06c-1021a79343.zip differ diff --git a/.yarn/cache/fastest-levenshtein-npm-1.0.16-192d328856-a78d44285c.zip b/.yarn/cache/fastest-levenshtein-npm-1.0.16-192d328856-a78d44285c.zip new file mode 100644 index 0000000..26d734f Binary files /dev/null and b/.yarn/cache/fastest-levenshtein-npm-1.0.16-192d328856-a78d44285c.zip differ diff --git a/.yarn/cache/fecha-npm-4.2.3-75248da3fd-f94e2fb3ac.zip b/.yarn/cache/fecha-npm-4.2.3-75248da3fd-f94e2fb3ac.zip new file mode 100644 index 0000000..f716e2f Binary files /dev/null and b/.yarn/cache/fecha-npm-4.2.3-75248da3fd-f94e2fb3ac.zip differ diff --git a/.yarn/cache/file-type-npm-9.0.0-e0f2c352e4-9ea78b29c3.zip b/.yarn/cache/file-type-npm-9.0.0-e0f2c352e4-9ea78b29c3.zip new file mode 100644 index 0000000..b8652cd Binary files /dev/null and b/.yarn/cache/file-type-npm-9.0.0-e0f2c352e4-9ea78b29c3.zip differ diff --git a/.yarn/cache/find-root-npm-1.1.0-a16a94005f-b2a59fe4b6.zip b/.yarn/cache/find-root-npm-1.1.0-a16a94005f-b2a59fe4b6.zip new file mode 100644 index 0000000..7f45aff Binary files /dev/null and b/.yarn/cache/find-root-npm-1.1.0-a16a94005f-b2a59fe4b6.zip differ diff --git a/.yarn/cache/fn.name-npm-1.1.0-b472333184-e357144f48.zip b/.yarn/cache/fn.name-npm-1.1.0-b472333184-e357144f48.zip new file mode 100644 index 0000000..416b895 Binary files /dev/null and b/.yarn/cache/fn.name-npm-1.1.0-b472333184-e357144f48.zip differ diff --git a/.yarn/cache/for-each-npm-0.3.3-0010ca8cdd-6c48ff2bc6.zip b/.yarn/cache/for-each-npm-0.3.3-0010ca8cdd-6c48ff2bc6.zip new file mode 100644 index 0000000..7ba7b16 Binary files /dev/null and b/.yarn/cache/for-each-npm-0.3.3-0010ca8cdd-6c48ff2bc6.zip differ diff --git a/.yarn/cache/from2-npm-2.3.0-bd16dc410b-6080eba079.zip b/.yarn/cache/from2-npm-2.3.0-bd16dc410b-6080eba079.zip new file mode 100644 index 0000000..9f43825 Binary files /dev/null and b/.yarn/cache/from2-npm-2.3.0-bd16dc410b-6080eba079.zip differ diff --git a/.yarn/cache/fs-capacitor-npm-2.0.4-344fd25807-5558e6c9b9.zip b/.yarn/cache/fs-capacitor-npm-2.0.4-344fd25807-5558e6c9b9.zip new file mode 100644 index 0000000..b21c725 Binary files /dev/null and b/.yarn/cache/fs-capacitor-npm-2.0.4-344fd25807-5558e6c9b9.zip differ diff --git a/.yarn/cache/function.prototype.name-npm-1.1.5-e776a642bb-acd21d733a.zip b/.yarn/cache/function.prototype.name-npm-1.1.5-e776a642bb-acd21d733a.zip new file mode 100644 index 0000000..ac0af53 Binary files /dev/null and b/.yarn/cache/function.prototype.name-npm-1.1.5-e776a642bb-acd21d733a.zip differ diff --git a/.yarn/cache/functions-have-names-npm-1.2.3-e5cf1e2208-c3f1f5ba20.zip b/.yarn/cache/functions-have-names-npm-1.2.3-e5cf1e2208-c3f1f5ba20.zip new file mode 100644 index 0000000..9316619 Binary files /dev/null and b/.yarn/cache/functions-have-names-npm-1.2.3-e5cf1e2208-c3f1f5ba20.zip differ diff --git a/.yarn/cache/gauge-npm-2.7.4-2189a73529-a89b53cee6.zip b/.yarn/cache/gauge-npm-2.7.4-2189a73529-a89b53cee6.zip new file mode 100644 index 0000000..6d86f11 Binary files /dev/null and b/.yarn/cache/gauge-npm-2.7.4-2189a73529-a89b53cee6.zip differ diff --git a/.yarn/cache/get-intrinsic-npm-1.2.0-eb08ea9b1d-78fc0487b7.zip b/.yarn/cache/get-intrinsic-npm-1.2.0-eb08ea9b1d-78fc0487b7.zip new file mode 100644 index 0000000..2ed7c89 Binary files /dev/null and b/.yarn/cache/get-intrinsic-npm-1.2.0-eb08ea9b1d-78fc0487b7.zip differ diff --git a/.yarn/cache/get-symbol-description-npm-1.0.0-9c95a4bc1f-9ceff8fe96.zip b/.yarn/cache/get-symbol-description-npm-1.0.0-9c95a4bc1f-9ceff8fe96.zip new file mode 100644 index 0000000..5cdbc26 Binary files /dev/null and b/.yarn/cache/get-symbol-description-npm-1.0.0-9c95a4bc1f-9ceff8fe96.zip differ diff --git a/.yarn/cache/gifwrap-npm-0.9.4-f819bc557d-f06d74d72d.zip b/.yarn/cache/gifwrap-npm-0.9.4-f819bc557d-f06d74d72d.zip new file mode 100644 index 0000000..37089b0 Binary files /dev/null and b/.yarn/cache/gifwrap-npm-0.9.4-f819bc557d-f06d74d72d.zip differ diff --git a/.yarn/cache/github-from-package-npm-0.0.0-519f80c9a1-14e448192a.zip b/.yarn/cache/github-from-package-npm-0.0.0-519f80c9a1-14e448192a.zip new file mode 100644 index 0000000..0b7c782 Binary files /dev/null and b/.yarn/cache/github-from-package-npm-0.0.0-519f80c9a1-14e448192a.zip differ diff --git a/.yarn/cache/global-npm-4.4.0-888ee8033d-9c057557c8.zip b/.yarn/cache/global-npm-4.4.0-888ee8033d-9c057557c8.zip new file mode 100644 index 0000000..8d6099e Binary files /dev/null and b/.yarn/cache/global-npm-4.4.0-888ee8033d-9c057557c8.zip differ diff --git a/.yarn/cache/globalthis-npm-1.0.3-96cd56020d-fbd7d760dc.zip b/.yarn/cache/globalthis-npm-1.0.3-96cd56020d-fbd7d760dc.zip new file mode 100644 index 0000000..b82d79d Binary files /dev/null and b/.yarn/cache/globalthis-npm-1.0.3-96cd56020d-fbd7d760dc.zip differ diff --git a/.yarn/cache/gopd-npm-1.0.1-10c1d0b534-a5ccfb8806.zip b/.yarn/cache/gopd-npm-1.0.1-10c1d0b534-a5ccfb8806.zip new file mode 100644 index 0000000..cafca67 Binary files /dev/null and b/.yarn/cache/gopd-npm-1.0.1-10c1d0b534-a5ccfb8806.zip differ diff --git a/.yarn/cache/graphql-extensions-npm-0.16.0-32eeff6a89-b1748c69e3.zip b/.yarn/cache/graphql-extensions-npm-0.16.0-32eeff6a89-b1748c69e3.zip new file mode 100644 index 0000000..d6436ef Binary files /dev/null and b/.yarn/cache/graphql-extensions-npm-0.16.0-32eeff6a89-b1748c69e3.zip differ diff --git a/.yarn/cache/graphql-npm-15.8.0-0156c66b65-423325271d.zip b/.yarn/cache/graphql-npm-15.8.0-0156c66b65-423325271d.zip new file mode 100644 index 0000000..ec82230 Binary files /dev/null and b/.yarn/cache/graphql-npm-15.8.0-0156c66b65-423325271d.zip differ diff --git a/.yarn/cache/graphql-npm-16.6.0-301c470966-bf1d9e3c19.zip b/.yarn/cache/graphql-npm-16.6.0-301c470966-bf1d9e3c19.zip deleted file mode 100644 index 626d914..0000000 Binary files a/.yarn/cache/graphql-npm-16.6.0-301c470966-bf1d9e3c19.zip and /dev/null differ diff --git a/.yarn/cache/graphql-query-complexity-npm-0.7.2-829d8de8a4-defe9a5e9c.zip b/.yarn/cache/graphql-query-complexity-npm-0.7.2-829d8de8a4-defe9a5e9c.zip new file mode 100644 index 0000000..a8a0540 Binary files /dev/null and b/.yarn/cache/graphql-query-complexity-npm-0.7.2-829d8de8a4-defe9a5e9c.zip differ diff --git a/.yarn/cache/graphql-subscriptions-npm-1.2.1-6f6629f38d-2b9533c677.zip b/.yarn/cache/graphql-subscriptions-npm-1.2.1-6f6629f38d-2b9533c677.zip new file mode 100644 index 0000000..20d8c9f Binary files /dev/null and b/.yarn/cache/graphql-subscriptions-npm-1.2.1-6f6629f38d-2b9533c677.zip differ diff --git a/.yarn/cache/graphql-tools-npm-4.0.8-8345536f34-6a2dc7f158.zip b/.yarn/cache/graphql-tools-npm-4.0.8-8345536f34-6a2dc7f158.zip new file mode 100644 index 0000000..abd241b Binary files /dev/null and b/.yarn/cache/graphql-tools-npm-4.0.8-8345536f34-6a2dc7f158.zip differ diff --git a/.yarn/cache/graphql-type-json-npm-0.3.2-05debc01d8-4162069963.zip b/.yarn/cache/graphql-type-json-npm-0.3.2-05debc01d8-4162069963.zip new file mode 100644 index 0000000..dead156 Binary files /dev/null and b/.yarn/cache/graphql-type-json-npm-0.3.2-05debc01d8-4162069963.zip differ diff --git a/.yarn/cache/has-bigints-npm-1.0.2-52732e614d-390e31e7be.zip b/.yarn/cache/has-bigints-npm-1.0.2-52732e614d-390e31e7be.zip new file mode 100644 index 0000000..bc0b5ff Binary files /dev/null and b/.yarn/cache/has-bigints-npm-1.0.2-52732e614d-390e31e7be.zip differ diff --git a/.yarn/cache/has-property-descriptors-npm-1.0.0-56289b918d-a6d3f0a266.zip b/.yarn/cache/has-property-descriptors-npm-1.0.0-56289b918d-a6d3f0a266.zip new file mode 100644 index 0000000..46eaa4f Binary files /dev/null and b/.yarn/cache/has-property-descriptors-npm-1.0.0-56289b918d-a6d3f0a266.zip differ diff --git a/.yarn/cache/has-proto-npm-1.0.1-631ea9d820-febc5b5b53.zip b/.yarn/cache/has-proto-npm-1.0.1-631ea9d820-febc5b5b53.zip new file mode 100644 index 0000000..78afc3d Binary files /dev/null and b/.yarn/cache/has-proto-npm-1.0.1-631ea9d820-febc5b5b53.zip differ diff --git a/.yarn/cache/has-tostringtag-npm-1.0.0-b1fcf3ab55-cc12eb28cb.zip b/.yarn/cache/has-tostringtag-npm-1.0.0-b1fcf3ab55-cc12eb28cb.zip new file mode 100644 index 0000000..7718fc2 Binary files /dev/null and b/.yarn/cache/has-tostringtag-npm-1.0.0-b1fcf3ab55-cc12eb28cb.zip differ diff --git a/.yarn/cache/http-assert-npm-1.5.0-bf7ea4ffcf-69c9b3c14c.zip b/.yarn/cache/http-assert-npm-1.5.0-bf7ea4ffcf-69c9b3c14c.zip new file mode 100644 index 0000000..989ef7d Binary files /dev/null and b/.yarn/cache/http-assert-npm-1.5.0-bf7ea4ffcf-69c9b3c14c.zip differ diff --git a/.yarn/cache/http-errors-npm-1.8.1-fb60d9f6ae-d3c7e7e776.zip b/.yarn/cache/http-errors-npm-1.8.1-fb60d9f6ae-d3c7e7e776.zip new file mode 100644 index 0000000..2fb70dd Binary files /dev/null and b/.yarn/cache/http-errors-npm-1.8.1-fb60d9f6ae-d3c7e7e776.zip differ diff --git a/.yarn/cache/ignore-by-default-npm-1.0.1-78ea10bc54-441509147b.zip b/.yarn/cache/ignore-by-default-npm-1.0.1-78ea10bc54-441509147b.zip new file mode 100644 index 0000000..fecc35c Binary files /dev/null and b/.yarn/cache/ignore-by-default-npm-1.0.1-78ea10bc54-441509147b.zip differ diff --git a/.yarn/cache/image-q-npm-4.0.0-22657645c0-6c6a1dd846.zip b/.yarn/cache/image-q-npm-4.0.0-22657645c0-6c6a1dd846.zip new file mode 100644 index 0000000..fb97a72 Binary files /dev/null and b/.yarn/cache/image-q-npm-4.0.0-22657645c0-6c6a1dd846.zip differ diff --git a/.yarn/cache/import-modules-npm-2.1.0-f8f1a4ea1a-d9ac33dfea.zip b/.yarn/cache/import-modules-npm-2.1.0-f8f1a4ea1a-d9ac33dfea.zip new file mode 100644 index 0000000..827ac60 Binary files /dev/null and b/.yarn/cache/import-modules-npm-2.1.0-f8f1a4ea1a-d9ac33dfea.zip differ diff --git a/.yarn/cache/inflation-npm-2.0.0-e638c91672-a0494871b1.zip b/.yarn/cache/inflation-npm-2.0.0-e638c91672-a0494871b1.zip new file mode 100644 index 0000000..0af8f7a Binary files /dev/null and b/.yarn/cache/inflation-npm-2.0.0-e638c91672-a0494871b1.zip differ diff --git a/.yarn/cache/internal-slot-npm-1.0.4-9183007374-8974588d06.zip b/.yarn/cache/internal-slot-npm-1.0.4-9183007374-8974588d06.zip new file mode 100644 index 0000000..cba2d7b Binary files /dev/null and b/.yarn/cache/internal-slot-npm-1.0.4-9183007374-8974588d06.zip differ diff --git a/.yarn/cache/interpret-npm-2.2.0-3603a544e1-f51efef7cb.zip b/.yarn/cache/interpret-npm-2.2.0-3603a544e1-f51efef7cb.zip new file mode 100644 index 0000000..20392ae Binary files /dev/null and b/.yarn/cache/interpret-npm-2.2.0-3603a544e1-f51efef7cb.zip differ diff --git a/.yarn/cache/into-stream-npm-6.0.0-663ab596b2-8df24c9ead.zip b/.yarn/cache/into-stream-npm-6.0.0-663ab596b2-8df24c9ead.zip new file mode 100644 index 0000000..1597a51 Binary files /dev/null and b/.yarn/cache/into-stream-npm-6.0.0-663ab596b2-8df24c9ead.zip differ diff --git a/.yarn/cache/is-array-buffer-npm-3.0.1-3e93b14326-f26ab87448.zip b/.yarn/cache/is-array-buffer-npm-3.0.1-3e93b14326-f26ab87448.zip new file mode 100644 index 0000000..4fb5eb3 Binary files /dev/null and b/.yarn/cache/is-array-buffer-npm-3.0.1-3e93b14326-f26ab87448.zip differ diff --git a/.yarn/cache/is-arrayish-npm-0.3.2-f856180f79-977e64f54d.zip b/.yarn/cache/is-arrayish-npm-0.3.2-f856180f79-977e64f54d.zip new file mode 100644 index 0000000..593895a Binary files /dev/null and b/.yarn/cache/is-arrayish-npm-0.3.2-f856180f79-977e64f54d.zip differ diff --git a/.yarn/cache/is-bigint-npm-1.0.4-31c2eecbc9-c56edfe09b.zip b/.yarn/cache/is-bigint-npm-1.0.4-31c2eecbc9-c56edfe09b.zip new file mode 100644 index 0000000..5282dfa Binary files /dev/null and b/.yarn/cache/is-bigint-npm-1.0.4-31c2eecbc9-c56edfe09b.zip differ diff --git a/.yarn/cache/is-boolean-object-npm-1.1.2-ecbd575e6a-c03b23dbaa.zip b/.yarn/cache/is-boolean-object-npm-1.1.2-ecbd575e6a-c03b23dbaa.zip new file mode 100644 index 0000000..7a1ae53 Binary files /dev/null and b/.yarn/cache/is-boolean-object-npm-1.1.2-ecbd575e6a-c03b23dbaa.zip differ diff --git a/.yarn/cache/is-builtin-module-npm-3.2.0-8f435dc375-0315751b89.zip b/.yarn/cache/is-builtin-module-npm-3.2.0-8f435dc375-0315751b89.zip new file mode 100644 index 0000000..c9f1eae Binary files /dev/null and b/.yarn/cache/is-builtin-module-npm-3.2.0-8f435dc375-0315751b89.zip differ diff --git a/.yarn/cache/is-callable-npm-1.2.7-808a303e61-61fd57d03b.zip b/.yarn/cache/is-callable-npm-1.2.7-808a303e61-61fd57d03b.zip new file mode 100644 index 0000000..0e383ae Binary files /dev/null and b/.yarn/cache/is-callable-npm-1.2.7-808a303e61-61fd57d03b.zip differ diff --git a/.yarn/cache/is-core-module-npm-2.9.0-5ba77c35ae-b27034318b.zip b/.yarn/cache/is-core-module-npm-2.9.0-5ba77c35ae-b27034318b.zip new file mode 100644 index 0000000..b7f03ef Binary files /dev/null and b/.yarn/cache/is-core-module-npm-2.9.0-5ba77c35ae-b27034318b.zip differ diff --git a/.yarn/cache/is-date-object-npm-1.0.5-88f3d08b5e-baa9077cdf.zip b/.yarn/cache/is-date-object-npm-1.0.5-88f3d08b5e-baa9077cdf.zip new file mode 100644 index 0000000..3dbce36 Binary files /dev/null and b/.yarn/cache/is-date-object-npm-1.0.5-88f3d08b5e-baa9077cdf.zip differ diff --git a/.yarn/cache/is-fullwidth-code-point-npm-1.0.0-0e436ba1ef-4d46a7465a.zip b/.yarn/cache/is-fullwidth-code-point-npm-1.0.0-0e436ba1ef-4d46a7465a.zip new file mode 100644 index 0000000..6d63e1f Binary files /dev/null and b/.yarn/cache/is-fullwidth-code-point-npm-1.0.0-0e436ba1ef-4d46a7465a.zip differ diff --git a/.yarn/cache/is-function-npm-1.0.2-90ac01927b-7d564562e0.zip b/.yarn/cache/is-function-npm-1.0.2-90ac01927b-7d564562e0.zip new file mode 100644 index 0000000..81e16b3 Binary files /dev/null and b/.yarn/cache/is-function-npm-1.0.2-90ac01927b-7d564562e0.zip differ diff --git a/.yarn/cache/is-generator-function-npm-1.0.10-1d0f3809ef-d54644e7db.zip b/.yarn/cache/is-generator-function-npm-1.0.10-1d0f3809ef-d54644e7db.zip new file mode 100644 index 0000000..6045379 Binary files /dev/null and b/.yarn/cache/is-generator-function-npm-1.0.10-1d0f3809ef-d54644e7db.zip differ diff --git a/.yarn/cache/is-negative-zero-npm-2.0.2-0adac91f15-f3232194c4.zip b/.yarn/cache/is-negative-zero-npm-2.0.2-0adac91f15-f3232194c4.zip new file mode 100644 index 0000000..06b47fd Binary files /dev/null and b/.yarn/cache/is-negative-zero-npm-2.0.2-0adac91f15-f3232194c4.zip differ diff --git a/.yarn/cache/is-number-object-npm-1.0.7-539d0e274d-d1e8d01bb0.zip b/.yarn/cache/is-number-object-npm-1.0.7-539d0e274d-d1e8d01bb0.zip new file mode 100644 index 0000000..fac0d67 Binary files /dev/null and b/.yarn/cache/is-number-object-npm-1.0.7-539d0e274d-d1e8d01bb0.zip differ diff --git a/.yarn/cache/is-regex-npm-1.1.4-cca193ef11-362399b335.zip b/.yarn/cache/is-regex-npm-1.1.4-cca193ef11-362399b335.zip new file mode 100644 index 0000000..41d26b8 Binary files /dev/null and b/.yarn/cache/is-regex-npm-1.1.4-cca193ef11-362399b335.zip differ diff --git a/.yarn/cache/is-shared-array-buffer-npm-1.0.2-32e4181fcd-9508929cf1.zip b/.yarn/cache/is-shared-array-buffer-npm-1.0.2-32e4181fcd-9508929cf1.zip new file mode 100644 index 0000000..af3ad4f Binary files /dev/null and b/.yarn/cache/is-shared-array-buffer-npm-1.0.2-32e4181fcd-9508929cf1.zip differ diff --git a/.yarn/cache/is-string-npm-1.0.7-9f7066daed-323b3d0462.zip b/.yarn/cache/is-string-npm-1.0.7-9f7066daed-323b3d0462.zip new file mode 100644 index 0000000..21039f9 Binary files /dev/null and b/.yarn/cache/is-string-npm-1.0.7-9f7066daed-323b3d0462.zip differ diff --git a/.yarn/cache/is-symbol-npm-1.0.4-eb9baac703-92805812ef.zip b/.yarn/cache/is-symbol-npm-1.0.4-eb9baac703-92805812ef.zip new file mode 100644 index 0000000..aa6f763 Binary files /dev/null and b/.yarn/cache/is-symbol-npm-1.0.4-eb9baac703-92805812ef.zip differ diff --git a/.yarn/cache/is-there-npm-4.5.1-1aae40e437-763240c846.zip b/.yarn/cache/is-there-npm-4.5.1-1aae40e437-763240c846.zip new file mode 100644 index 0000000..5754142 Binary files /dev/null and b/.yarn/cache/is-there-npm-4.5.1-1aae40e437-763240c846.zip differ diff --git a/.yarn/cache/is-typed-array-npm-1.1.10-fe4ef83cdc-aac6ecb59d.zip b/.yarn/cache/is-typed-array-npm-1.1.10-fe4ef83cdc-aac6ecb59d.zip new file mode 100644 index 0000000..b3a4495 Binary files /dev/null and b/.yarn/cache/is-typed-array-npm-1.1.10-fe4ef83cdc-aac6ecb59d.zip differ diff --git a/.yarn/cache/is-weakref-npm-1.0.2-ff80e8c314-95bd9a57cd.zip b/.yarn/cache/is-weakref-npm-1.0.2-ff80e8c314-95bd9a57cd.zip new file mode 100644 index 0000000..a798b01 Binary files /dev/null and b/.yarn/cache/is-weakref-npm-1.0.2-ff80e8c314-95bd9a57cd.zip differ diff --git a/.yarn/cache/isarray-npm-0.0.1-92e37e0a70-49191f1425.zip b/.yarn/cache/isarray-npm-0.0.1-92e37e0a70-49191f1425.zip new file mode 100644 index 0000000..4c3f427 Binary files /dev/null and b/.yarn/cache/isarray-npm-0.0.1-92e37e0a70-49191f1425.zip differ diff --git a/.yarn/cache/jpeg-js-npm-0.4.4-4dd87659c3-bd7cb61aa8.zip b/.yarn/cache/jpeg-js-npm-0.4.4-4dd87659c3-bd7cb61aa8.zip new file mode 100644 index 0000000..b6644c1 Binary files /dev/null and b/.yarn/cache/jpeg-js-npm-0.4.4-4dd87659c3-bd7cb61aa8.zip differ diff --git a/.yarn/cache/jsdoc-type-pratt-parser-npm-1.0.4-d9563f414a-f80df71fc5.zip b/.yarn/cache/jsdoc-type-pratt-parser-npm-1.0.4-d9563f414a-f80df71fc5.zip new file mode 100644 index 0000000..73b8002 Binary files /dev/null and b/.yarn/cache/jsdoc-type-pratt-parser-npm-1.0.4-d9563f414a-f80df71fc5.zip differ diff --git a/.yarn/cache/jsdoc-type-pratt-parser-npm-1.2.0-bcaf0eceba-8be7a0e137.zip b/.yarn/cache/jsdoc-type-pratt-parser-npm-1.2.0-bcaf0eceba-8be7a0e137.zip new file mode 100644 index 0000000..9ce60d4 Binary files /dev/null and b/.yarn/cache/jsdoc-type-pratt-parser-npm-1.2.0-bcaf0eceba-8be7a0e137.zip differ diff --git a/.yarn/cache/jsonwebtoken-npm-8.5.1-c007670b76-93c9e3f23c.zip b/.yarn/cache/jsonwebtoken-npm-8.5.1-c007670b76-93c9e3f23c.zip new file mode 100644 index 0000000..da19a86 Binary files /dev/null and b/.yarn/cache/jsonwebtoken-npm-8.5.1-c007670b76-93c9e3f23c.zip differ diff --git a/.yarn/cache/jwa-npm-1.4.1-4f19d6572c-ff30ea7c2d.zip b/.yarn/cache/jwa-npm-1.4.1-4f19d6572c-ff30ea7c2d.zip new file mode 100644 index 0000000..e50529e Binary files /dev/null and b/.yarn/cache/jwa-npm-1.4.1-4f19d6572c-ff30ea7c2d.zip differ diff --git a/.yarn/cache/jws-npm-3.2.2-c1ae59c7af-f0213fe5b7.zip b/.yarn/cache/jws-npm-3.2.2-c1ae59c7af-f0213fe5b7.zip new file mode 100644 index 0000000..20d7e1e Binary files /dev/null and b/.yarn/cache/jws-npm-3.2.2-c1ae59c7af-f0213fe5b7.zip differ diff --git a/.yarn/cache/keygrip-npm-1.1.0-8da030c3ff-078cd16a46.zip b/.yarn/cache/keygrip-npm-1.1.0-8da030c3ff-078cd16a46.zip new file mode 100644 index 0000000..1d25b57 Binary files /dev/null and b/.yarn/cache/keygrip-npm-1.1.0-8da030c3ff-078cd16a46.zip differ diff --git a/.yarn/cache/koa-bodyparser-npm-4.3.0-1bf6ca26ab-c227fe0fb5.zip b/.yarn/cache/koa-bodyparser-npm-4.3.0-1bf6ca26ab-c227fe0fb5.zip new file mode 100644 index 0000000..f64002b Binary files /dev/null and b/.yarn/cache/koa-bodyparser-npm-4.3.0-1bf6ca26ab-c227fe0fb5.zip differ diff --git a/.yarn/cache/koa-compose-npm-3.2.1-0020b997fa-ff8e5fc034.zip b/.yarn/cache/koa-compose-npm-3.2.1-0020b997fa-ff8e5fc034.zip new file mode 100644 index 0000000..d5417ed Binary files /dev/null and b/.yarn/cache/koa-compose-npm-3.2.1-0020b997fa-ff8e5fc034.zip differ diff --git a/.yarn/cache/koa-compose-npm-4.1.0-b682d9324e-46cb16792d.zip b/.yarn/cache/koa-compose-npm-4.1.0-b682d9324e-46cb16792d.zip new file mode 100644 index 0000000..e901342 Binary files /dev/null and b/.yarn/cache/koa-compose-npm-4.1.0-b682d9324e-46cb16792d.zip differ diff --git a/.yarn/cache/koa-convert-npm-2.0.0-d709eca55c-7385b33919.zip b/.yarn/cache/koa-convert-npm-2.0.0-d709eca55c-7385b33919.zip new file mode 100644 index 0000000..d73061b Binary files /dev/null and b/.yarn/cache/koa-convert-npm-2.0.0-d709eca55c-7385b33919.zip differ diff --git a/.yarn/cache/koa-multer-npm-1.0.2-0a77fae36d-cb2fe8b00c.zip b/.yarn/cache/koa-multer-npm-1.0.2-0a77fae36d-cb2fe8b00c.zip new file mode 100644 index 0000000..7f0e4c2 Binary files /dev/null and b/.yarn/cache/koa-multer-npm-1.0.2-0a77fae36d-cb2fe8b00c.zip differ diff --git a/.yarn/cache/koa-npm-2.14.1-92dad86c35-84cfce48d7.zip b/.yarn/cache/koa-npm-2.14.1-92dad86c35-84cfce48d7.zip new file mode 100644 index 0000000..376fa07 Binary files /dev/null and b/.yarn/cache/koa-npm-2.14.1-92dad86c35-84cfce48d7.zip differ diff --git a/.yarn/cache/koa-router-npm-7.4.0-0a220ac73d-fa39643a00.zip b/.yarn/cache/koa-router-npm-7.4.0-0a220ac73d-fa39643a00.zip new file mode 100644 index 0000000..5b0c567 Binary files /dev/null and b/.yarn/cache/koa-router-npm-7.4.0-0a220ac73d-fa39643a00.zip differ diff --git a/.yarn/cache/kuler-npm-2.0.0-19e74c9695-9e10b5a165.zip b/.yarn/cache/kuler-npm-2.0.0-19e74c9695-9e10b5a165.zip new file mode 100644 index 0000000..1c905da Binary files /dev/null and b/.yarn/cache/kuler-npm-2.0.0-19e74c9695-9e10b5a165.zip differ diff --git a/.yarn/cache/libphonenumber-js-npm-1.10.18-154a7b087a-df0a4b8adf.zip b/.yarn/cache/libphonenumber-js-npm-1.10.18-154a7b087a-df0a4b8adf.zip new file mode 100644 index 0000000..17ddacc Binary files /dev/null and b/.yarn/cache/libphonenumber-js-npm-1.10.18-154a7b087a-df0a4b8adf.zip differ diff --git a/.yarn/cache/load-bmfont-npm-1.4.1-f3f8c0beeb-688d932fb0.zip b/.yarn/cache/load-bmfont-npm-1.4.1-f3f8c0beeb-688d932fb0.zip new file mode 100644 index 0000000..ced8d92 Binary files /dev/null and b/.yarn/cache/load-bmfont-npm-1.4.1-f3f8c0beeb-688d932fb0.zip differ diff --git a/.yarn/cache/lodash.get-npm-4.4.2-7bda64ed87-e403047ddb.zip b/.yarn/cache/lodash.get-npm-4.4.2-7bda64ed87-e403047ddb.zip new file mode 100644 index 0000000..63cd7cc Binary files /dev/null and b/.yarn/cache/lodash.get-npm-4.4.2-7bda64ed87-e403047ddb.zip differ diff --git a/.yarn/cache/lodash.includes-npm-4.3.0-3a2f6fa22c-71092c1305.zip b/.yarn/cache/lodash.includes-npm-4.3.0-3a2f6fa22c-71092c1305.zip new file mode 100644 index 0000000..9d28269 Binary files /dev/null and b/.yarn/cache/lodash.includes-npm-4.3.0-3a2f6fa22c-71092c1305.zip differ diff --git a/.yarn/cache/lodash.isboolean-npm-3.0.3-b575b41488-b70068b4a8.zip b/.yarn/cache/lodash.isboolean-npm-3.0.3-b575b41488-b70068b4a8.zip new file mode 100644 index 0000000..fa18a44 Binary files /dev/null and b/.yarn/cache/lodash.isboolean-npm-3.0.3-b575b41488-b70068b4a8.zip differ diff --git a/.yarn/cache/lodash.isinteger-npm-4.0.4-42add9f4e1-6034821b3f.zip b/.yarn/cache/lodash.isinteger-npm-4.0.4-42add9f4e1-6034821b3f.zip new file mode 100644 index 0000000..97a0dac Binary files /dev/null and b/.yarn/cache/lodash.isinteger-npm-4.0.4-42add9f4e1-6034821b3f.zip differ diff --git a/.yarn/cache/lodash.isnumber-npm-3.0.3-b3bb5f7347-913784275b.zip b/.yarn/cache/lodash.isnumber-npm-3.0.3-b3bb5f7347-913784275b.zip new file mode 100644 index 0000000..9b52442 Binary files /dev/null and b/.yarn/cache/lodash.isnumber-npm-3.0.3-b3bb5f7347-913784275b.zip differ diff --git a/.yarn/cache/lodash.isplainobject-npm-4.0.6-d73937742f-29c6351f28.zip b/.yarn/cache/lodash.isplainobject-npm-4.0.6-d73937742f-29c6351f28.zip new file mode 100644 index 0000000..c46c1ed Binary files /dev/null and b/.yarn/cache/lodash.isplainobject-npm-4.0.6-d73937742f-29c6351f28.zip differ diff --git a/.yarn/cache/lodash.isstring-npm-4.0.1-721fee791c-eaac87ae96.zip b/.yarn/cache/lodash.isstring-npm-4.0.1-721fee791c-eaac87ae96.zip new file mode 100644 index 0000000..dc0bd0c Binary files /dev/null and b/.yarn/cache/lodash.isstring-npm-4.0.1-721fee791c-eaac87ae96.zip differ diff --git a/.yarn/cache/lodash.once-npm-4.1.1-d8ba329ead-d768fa9f9b.zip b/.yarn/cache/lodash.once-npm-4.1.1-d8ba329ead-d768fa9f9b.zip new file mode 100644 index 0000000..8d6432c Binary files /dev/null and b/.yarn/cache/lodash.once-npm-4.1.1-d8ba329ead-d768fa9f9b.zip differ diff --git a/.yarn/cache/lodash.sortby-npm-4.7.0-fda8ab950d-db170c9396.zip b/.yarn/cache/lodash.sortby-npm-4.7.0-fda8ab950d-db170c9396.zip new file mode 100644 index 0000000..915d1f2 Binary files /dev/null and b/.yarn/cache/lodash.sortby-npm-4.7.0-fda8ab950d-db170c9396.zip differ diff --git a/.yarn/cache/logform-npm-2.4.2-c83969e14e-3d00f4e1cc.zip b/.yarn/cache/logform-npm-2.4.2-c83969e14e-3d00f4e1cc.zip new file mode 100644 index 0000000..8683db9 Binary files /dev/null and b/.yarn/cache/logform-npm-2.4.2-c83969e14e-3d00f4e1cc.zip differ diff --git a/.yarn/cache/loglevel-npm-1.8.1-1768109374-a1a62db402.zip b/.yarn/cache/loglevel-npm-1.8.1-1768109374-a1a62db402.zip new file mode 100644 index 0000000..aa8f06f Binary files /dev/null and b/.yarn/cache/loglevel-npm-1.8.1-1768109374-a1a62db402.zip differ diff --git a/.yarn/cache/long-npm-4.0.0-ecd96a31ed-16afbe8f74.zip b/.yarn/cache/long-npm-4.0.0-ecd96a31ed-16afbe8f74.zip new file mode 100644 index 0000000..228e6f9 Binary files /dev/null and b/.yarn/cache/long-npm-4.0.0-ecd96a31ed-16afbe8f74.zip differ diff --git a/.yarn/cache/metric-lcs-npm-0.1.2-a32de58c11-9dbdedb904.zip b/.yarn/cache/metric-lcs-npm-0.1.2-a32de58c11-9dbdedb904.zip new file mode 100644 index 0000000..ec2bdaf Binary files /dev/null and b/.yarn/cache/metric-lcs-npm-0.1.2-a32de58c11-9dbdedb904.zip differ diff --git a/.yarn/cache/microframework-npm-0.6.4-dfefccfd7e-d339d3a11e.zip b/.yarn/cache/microframework-npm-0.6.4-dfefccfd7e-d339d3a11e.zip new file mode 100644 index 0000000..b4d8e41 Binary files /dev/null and b/.yarn/cache/microframework-npm-0.6.4-dfefccfd7e-d339d3a11e.zip differ diff --git a/.yarn/cache/mimic-response-npm-2.1.0-037463e454-014fad6ab9.zip b/.yarn/cache/mimic-response-npm-2.1.0-037463e454-014fad6ab9.zip new file mode 100644 index 0000000..39add20 Binary files /dev/null and b/.yarn/cache/mimic-response-npm-2.1.0-037463e454-014fad6ab9.zip differ diff --git a/.yarn/cache/min-document-npm-2.19.0-458cdb3d84-da6437562e.zip b/.yarn/cache/min-document-npm-2.19.0-458cdb3d84-da6437562e.zip new file mode 100644 index 0000000..33f484c Binary files /dev/null and b/.yarn/cache/min-document-npm-2.19.0-458cdb3d84-da6437562e.zip differ diff --git a/.yarn/cache/mkdirp-classic-npm-0.5.3-3b5c991910-3f4e088208.zip b/.yarn/cache/mkdirp-classic-npm-0.5.3-3b5c991910-3f4e088208.zip new file mode 100644 index 0000000..8663492 Binary files /dev/null and b/.yarn/cache/mkdirp-classic-npm-0.5.3-3b5c991910-3f4e088208.zip differ diff --git a/.yarn/cache/moment-npm-2.29.4-902943305d-0ec3f9c2bc.zip b/.yarn/cache/moment-npm-2.29.4-902943305d-0ec3f9c2bc.zip new file mode 100644 index 0000000..78acd14 Binary files /dev/null and b/.yarn/cache/moment-npm-2.29.4-902943305d-0ec3f9c2bc.zip differ diff --git a/.yarn/cache/moment-timezone-npm-0.5.40-873e898229-6f6be5412b.zip b/.yarn/cache/moment-timezone-npm-0.5.40-873e898229-6f6be5412b.zip new file mode 100644 index 0000000..cc364f7 Binary files /dev/null and b/.yarn/cache/moment-timezone-npm-0.5.40-873e898229-6f6be5412b.zip differ diff --git a/.yarn/cache/multer-npm-1.3.0-3b886dc3ea-dd4d51c5f2.zip b/.yarn/cache/multer-npm-1.3.0-3b886dc3ea-dd4d51c5f2.zip new file mode 100644 index 0000000..e81e41d Binary files /dev/null and b/.yarn/cache/multer-npm-1.3.0-3b886dc3ea-dd4d51c5f2.zip differ diff --git a/.yarn/cache/multer-npm-1.4.4-741799ce7d-b5550d250a.zip b/.yarn/cache/multer-npm-1.4.4-741799ce7d-b5550d250a.zip new file mode 100644 index 0000000..0f7bced Binary files /dev/null and b/.yarn/cache/multer-npm-1.4.4-741799ce7d-b5550d250a.zip differ diff --git a/.yarn/cache/multimap-npm-1.1.0-86e72bcb35-42769c9dd7.zip b/.yarn/cache/multimap-npm-1.1.0-86e72bcb35-42769c9dd7.zip new file mode 100644 index 0000000..05726f2 Binary files /dev/null and b/.yarn/cache/multimap-npm-1.1.0-86e72bcb35-42769c9dd7.zip differ diff --git a/.yarn/cache/multistream-npm-4.1.0-0df2458b36-305c49a1aa.zip b/.yarn/cache/multistream-npm-4.1.0-0df2458b36-305c49a1aa.zip new file mode 100644 index 0000000..b6a343f Binary files /dev/null and b/.yarn/cache/multistream-npm-4.1.0-0df2458b36-305c49a1aa.zip differ diff --git a/.yarn/cache/napi-build-utils-npm-1.0.2-892e4bba56-06c14271ee.zip b/.yarn/cache/napi-build-utils-npm-1.0.2-892e4bba56-06c14271ee.zip new file mode 100644 index 0000000..3088994 Binary files /dev/null and b/.yarn/cache/napi-build-utils-npm-1.0.2-892e4bba56-06c14271ee.zip differ diff --git a/.yarn/cache/no-cliches-npm-0.3.4-3e98a64616-7abc57c9bc.zip b/.yarn/cache/no-cliches-npm-0.3.4-3e98a64616-7abc57c9bc.zip new file mode 100644 index 0000000..392eebf Binary files /dev/null and b/.yarn/cache/no-cliches-npm-0.3.4-3e98a64616-7abc57c9bc.zip differ diff --git a/.yarn/cache/node-abi-npm-2.30.1-36a2c4e28a-3f4b0c912c.zip b/.yarn/cache/node-abi-npm-2.30.1-36a2c4e28a-3f4b0c912c.zip new file mode 100644 index 0000000..78cb2c3 Binary files /dev/null and b/.yarn/cache/node-abi-npm-2.30.1-36a2c4e28a-3f4b0c912c.zip differ diff --git a/.yarn/cache/node-fetch-npm-2.6.8-ddb8bfc274-91f57be68e.zip b/.yarn/cache/node-fetch-npm-2.6.8-ddb8bfc274-91f57be68e.zip new file mode 100644 index 0000000..6f04660 Binary files /dev/null and b/.yarn/cache/node-fetch-npm-2.6.8-ddb8bfc274-91f57be68e.zip differ diff --git a/.yarn/cache/node-vibrant-npm-3.2.1-alpha.1-22baddba2f-f5c287db61.zip b/.yarn/cache/node-vibrant-npm-3.2.1-alpha.1-22baddba2f-f5c287db61.zip new file mode 100644 index 0000000..142c3fd Binary files /dev/null and b/.yarn/cache/node-vibrant-npm-3.2.1-alpha.1-22baddba2f-f5c287db61.zip differ diff --git a/.yarn/cache/nodemon-npm-2.0.20-2fea8f7bf9-9fe8586824.zip b/.yarn/cache/nodemon-npm-2.0.20-2fea8f7bf9-9fe8586824.zip new file mode 100644 index 0000000..df033ec Binary files /dev/null and b/.yarn/cache/nodemon-npm-2.0.20-2fea8f7bf9-9fe8586824.zip differ diff --git a/.yarn/cache/nopt-npm-1.0.10-f3db192976-f62575acea.zip b/.yarn/cache/nopt-npm-1.0.10-f3db192976-f62575acea.zip new file mode 100644 index 0000000..1f5b95d Binary files /dev/null and b/.yarn/cache/nopt-npm-1.0.10-f3db192976-f62575acea.zip differ diff --git a/.yarn/cache/npmlog-npm-4.1.2-cfb32957b5-edbda9f95e.zip b/.yarn/cache/npmlog-npm-4.1.2-cfb32957b5-edbda9f95e.zip new file mode 100644 index 0000000..15a8695 Binary files /dev/null and b/.yarn/cache/npmlog-npm-4.1.2-cfb32957b5-edbda9f95e.zip differ diff --git a/.yarn/cache/number-is-nan-npm-1.0.1-845325a0fe-13656bc9aa.zip b/.yarn/cache/number-is-nan-npm-1.0.1-845325a0fe-13656bc9aa.zip new file mode 100644 index 0000000..4ef9a25 Binary files /dev/null and b/.yarn/cache/number-is-nan-npm-1.0.1-845325a0fe-13656bc9aa.zip differ diff --git a/.yarn/cache/object-assign-npm-3.0.0-8d79858461-56c66a7731.zip b/.yarn/cache/object-assign-npm-3.0.0-8d79858461-56c66a7731.zip new file mode 100644 index 0000000..36aac74 Binary files /dev/null and b/.yarn/cache/object-assign-npm-3.0.0-8d79858461-56c66a7731.zip differ diff --git a/.yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-dabfd824d9.zip b/.yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-dabfd824d9.zip new file mode 100644 index 0000000..ec58095 Binary files /dev/null and b/.yarn/cache/object-inspect-npm-1.12.3-1e7d20f5ff-dabfd824d9.zip differ diff --git a/.yarn/cache/object-keys-npm-1.1.1-1bf2f1be93-b363c5e764.zip b/.yarn/cache/object-keys-npm-1.1.1-1bf2f1be93-b363c5e764.zip new file mode 100644 index 0000000..3402282 Binary files /dev/null and b/.yarn/cache/object-keys-npm-1.1.1-1bf2f1be93-b363c5e764.zip differ diff --git a/.yarn/cache/object-path-npm-0.11.8-f23d497fab-684ccf0fb6.zip b/.yarn/cache/object-path-npm-0.11.8-f23d497fab-684ccf0fb6.zip new file mode 100644 index 0000000..74c5992 Binary files /dev/null and b/.yarn/cache/object-path-npm-0.11.8-f23d497fab-684ccf0fb6.zip differ diff --git a/.yarn/cache/object.assign-npm-4.1.4-fb3deb1c3a-76cab513a5.zip b/.yarn/cache/object.assign-npm-4.1.4-fb3deb1c3a-76cab513a5.zip new file mode 100644 index 0000000..8a1fef0 Binary files /dev/null and b/.yarn/cache/object.assign-npm-4.1.4-fb3deb1c3a-76cab513a5.zip differ diff --git a/.yarn/cache/object.getownpropertydescriptors-npm-2.1.5-4cfa1d83ab-7883e1aac1.zip b/.yarn/cache/object.getownpropertydescriptors-npm-2.1.5-4cfa1d83ab-7883e1aac1.zip new file mode 100644 index 0000000..5b75626 Binary files /dev/null and b/.yarn/cache/object.getownpropertydescriptors-npm-2.1.5-4cfa1d83ab-7883e1aac1.zip differ diff --git a/.yarn/cache/omggif-npm-1.0.10-6ffa5bf343-15102e46b6.zip b/.yarn/cache/omggif-npm-1.0.10-6ffa5bf343-15102e46b6.zip new file mode 100644 index 0000000..4f4ecf8 Binary files /dev/null and b/.yarn/cache/omggif-npm-1.0.10-6ffa5bf343-15102e46b6.zip differ diff --git a/.yarn/cache/one-time-npm-1.0.0-aeaad5e524-fd008d7e99.zip b/.yarn/cache/one-time-npm-1.0.0-aeaad5e524-fd008d7e99.zip new file mode 100644 index 0000000..59188f6 Binary files /dev/null and b/.yarn/cache/one-time-npm-1.0.0-aeaad5e524-fd008d7e99.zip differ diff --git a/.yarn/cache/only-npm-0.0.2-122402a3f9-d399710db8.zip b/.yarn/cache/only-npm-0.0.2-122402a3f9-d399710db8.zip new file mode 100644 index 0000000..5b8e8de Binary files /dev/null and b/.yarn/cache/only-npm-0.0.2-122402a3f9-d399710db8.zip differ diff --git a/.yarn/cache/openapi3-ts-npm-1.4.0-d5df748422-f45cb15fae.zip b/.yarn/cache/openapi3-ts-npm-1.4.0-d5df748422-f45cb15fae.zip new file mode 100644 index 0000000..8e4c276 Binary files /dev/null and b/.yarn/cache/openapi3-ts-npm-1.4.0-d5df748422-f45cb15fae.zip differ diff --git a/.yarn/cache/openapi3-ts-npm-2.0.2-812565c888-ec82bbbbd5.zip b/.yarn/cache/openapi3-ts-npm-2.0.2-812565c888-ec82bbbbd5.zip new file mode 100644 index 0000000..50a22cf Binary files /dev/null and b/.yarn/cache/openapi3-ts-npm-2.0.2-812565c888-ec82bbbbd5.zip differ diff --git a/.yarn/cache/p-is-promise-npm-3.0.0-a3c472793c-74e511225f.zip b/.yarn/cache/p-is-promise-npm-3.0.0-a3c472793c-74e511225f.zip new file mode 100644 index 0000000..550fbd9 Binary files /dev/null and b/.yarn/cache/p-is-promise-npm-3.0.0-a3c472793c-74e511225f.zip differ diff --git a/.yarn/cache/packet-reader-npm-1.0.0-e93c92246b-0b7516f0cb.zip b/.yarn/cache/packet-reader-npm-1.0.0-e93c92246b-0b7516f0cb.zip new file mode 100644 index 0000000..fb20aed Binary files /dev/null and b/.yarn/cache/packet-reader-npm-1.0.0-e93c92246b-0b7516f0cb.zip differ diff --git a/.yarn/cache/pako-npm-1.0.11-b8f1b69d3e-1be2bfa1f8.zip b/.yarn/cache/pako-npm-1.0.11-b8f1b69d3e-1be2bfa1f8.zip new file mode 100644 index 0000000..4a6767b Binary files /dev/null and b/.yarn/cache/pako-npm-1.0.11-b8f1b69d3e-1be2bfa1f8.zip differ diff --git a/.yarn/cache/parse-bmfont-ascii-npm-1.0.6-15dd9909ba-de3f6671f1.zip b/.yarn/cache/parse-bmfont-ascii-npm-1.0.6-15dd9909ba-de3f6671f1.zip new file mode 100644 index 0000000..a9ef44b Binary files /dev/null and b/.yarn/cache/parse-bmfont-ascii-npm-1.0.6-15dd9909ba-de3f6671f1.zip differ diff --git a/.yarn/cache/parse-bmfont-binary-npm-1.0.6-50892a2477-ca37fb1e92.zip b/.yarn/cache/parse-bmfont-binary-npm-1.0.6-50892a2477-ca37fb1e92.zip new file mode 100644 index 0000000..5aad6da Binary files /dev/null and b/.yarn/cache/parse-bmfont-binary-npm-1.0.6-50892a2477-ca37fb1e92.zip differ diff --git a/.yarn/cache/parse-bmfont-xml-npm-1.1.4-dcbad8a521-879e5435be.zip b/.yarn/cache/parse-bmfont-xml-npm-1.1.4-dcbad8a521-879e5435be.zip new file mode 100644 index 0000000..1d3be89 Binary files /dev/null and b/.yarn/cache/parse-bmfont-xml-npm-1.1.4-dcbad8a521-879e5435be.zip differ diff --git a/.yarn/cache/parse-headers-npm-2.0.5-c1f2d79179-3e97f01e4c.zip b/.yarn/cache/parse-headers-npm-2.0.5-c1f2d79179-3e97f01e4c.zip new file mode 100644 index 0000000..d4fd29e Binary files /dev/null and b/.yarn/cache/parse-headers-npm-2.0.5-c1f2d79179-3e97f01e4c.zip differ diff --git a/.yarn/cache/passive-voice-npm-0.1.0-3e05f8a874-4f5d1810e6.zip b/.yarn/cache/passive-voice-npm-0.1.0-3e05f8a874-4f5d1810e6.zip new file mode 100644 index 0000000..927c839 Binary files /dev/null and b/.yarn/cache/passive-voice-npm-0.1.0-3e05f8a874-4f5d1810e6.zip differ diff --git a/.yarn/cache/path-to-regexp-npm-1.8.0-a1904f5c44-709f6f083c.zip b/.yarn/cache/path-to-regexp-npm-1.8.0-a1904f5c44-709f6f083c.zip new file mode 100644 index 0000000..3528453 Binary files /dev/null and b/.yarn/cache/path-to-regexp-npm-1.8.0-a1904f5c44-709f6f083c.zip differ diff --git a/.yarn/cache/path-to-regexp-npm-2.4.0-ce02fd84d9-581175bf29.zip b/.yarn/cache/path-to-regexp-npm-2.4.0-ce02fd84d9-581175bf29.zip new file mode 100644 index 0000000..c4c3442 Binary files /dev/null and b/.yarn/cache/path-to-regexp-npm-2.4.0-ce02fd84d9-581175bf29.zip differ diff --git a/.yarn/cache/pg-connection-string-npm-2.5.0-1ee5de9ab9-a6f3a068f7.zip b/.yarn/cache/pg-connection-string-npm-2.5.0-1ee5de9ab9-a6f3a068f7.zip new file mode 100644 index 0000000..95f2afe Binary files /dev/null and b/.yarn/cache/pg-connection-string-npm-2.5.0-1ee5de9ab9-a6f3a068f7.zip differ diff --git a/.yarn/cache/pg-int8-npm-1.0.1-5cd67f3e22-a1e3a05a69.zip b/.yarn/cache/pg-int8-npm-1.0.1-5cd67f3e22-a1e3a05a69.zip new file mode 100644 index 0000000..6001796 Binary files /dev/null and b/.yarn/cache/pg-int8-npm-1.0.1-5cd67f3e22-a1e3a05a69.zip differ diff --git a/.yarn/cache/pg-npm-8.8.0-69c9e9f8ac-fa30a85814.zip b/.yarn/cache/pg-npm-8.8.0-69c9e9f8ac-fa30a85814.zip new file mode 100644 index 0000000..42cbcb8 Binary files /dev/null and b/.yarn/cache/pg-npm-8.8.0-69c9e9f8ac-fa30a85814.zip differ diff --git a/.yarn/cache/pg-pool-npm-3.5.2-d467bbecca-a5d0292002.zip b/.yarn/cache/pg-pool-npm-3.5.2-d467bbecca-a5d0292002.zip new file mode 100644 index 0000000..87e6144 Binary files /dev/null and b/.yarn/cache/pg-pool-npm-3.5.2-d467bbecca-a5d0292002.zip differ diff --git a/.yarn/cache/pg-protocol-npm-1.5.0-390f8d9ed8-b839d12caf.zip b/.yarn/cache/pg-protocol-npm-1.5.0-390f8d9ed8-b839d12caf.zip new file mode 100644 index 0000000..f52b4a0 Binary files /dev/null and b/.yarn/cache/pg-protocol-npm-1.5.0-390f8d9ed8-b839d12caf.zip differ diff --git a/.yarn/cache/pg-types-npm-2.2.0-a3360226c4-bf4ec3f594.zip b/.yarn/cache/pg-types-npm-2.2.0-a3360226c4-bf4ec3f594.zip new file mode 100644 index 0000000..d72f1a1 Binary files /dev/null and b/.yarn/cache/pg-types-npm-2.2.0-a3360226c4-bf4ec3f594.zip differ diff --git a/.yarn/cache/pgpass-npm-1.0.5-653e71ddd8-947ac096c0.zip b/.yarn/cache/pgpass-npm-1.0.5-653e71ddd8-947ac096c0.zip new file mode 100644 index 0000000..12ab157 Binary files /dev/null and b/.yarn/cache/pgpass-npm-1.0.5-653e71ddd8-947ac096c0.zip differ diff --git a/.yarn/cache/phin-npm-2.9.3-8661be52b1-7e2abd7be7.zip b/.yarn/cache/phin-npm-2.9.3-8661be52b1-7e2abd7be7.zip new file mode 100644 index 0000000..0c0d4b6 Binary files /dev/null and b/.yarn/cache/phin-npm-2.9.3-8661be52b1-7e2abd7be7.zip differ diff --git a/.yarn/cache/pixelmatch-npm-4.0.2-03016768a7-9c5c132900.zip b/.yarn/cache/pixelmatch-npm-4.0.2-03016768a7-9c5c132900.zip new file mode 100644 index 0000000..2de0d65 Binary files /dev/null and b/.yarn/cache/pixelmatch-npm-4.0.2-03016768a7-9c5c132900.zip differ diff --git a/.yarn/cache/pkg-fetch-npm-3.4.2-2669e3068c-e0f73cedf6.zip b/.yarn/cache/pkg-fetch-npm-3.4.2-2669e3068c-e0f73cedf6.zip new file mode 100644 index 0000000..03c50dd Binary files /dev/null and b/.yarn/cache/pkg-fetch-npm-3.4.2-2669e3068c-e0f73cedf6.zip differ diff --git a/.yarn/cache/pkg-npm-5.8.0-f9fed71dd1-eb85975275.zip b/.yarn/cache/pkg-npm-5.8.0-f9fed71dd1-eb85975275.zip new file mode 100644 index 0000000..81b3ccb Binary files /dev/null and b/.yarn/cache/pkg-npm-5.8.0-f9fed71dd1-eb85975275.zip differ diff --git a/.yarn/cache/pluralize-npm-8.0.0-f5f044ed52-08931d4a6a.zip b/.yarn/cache/pluralize-npm-8.0.0-f5f044ed52-08931d4a6a.zip new file mode 100644 index 0000000..cb849f4 Binary files /dev/null and b/.yarn/cache/pluralize-npm-8.0.0-f5f044ed52-08931d4a6a.zip differ diff --git a/.yarn/cache/pngjs-npm-3.4.0-4e495c1dad-8bd40bd698.zip b/.yarn/cache/pngjs-npm-3.4.0-4e495c1dad-8bd40bd698.zip new file mode 100644 index 0000000..24bc69f Binary files /dev/null and b/.yarn/cache/pngjs-npm-3.4.0-4e495c1dad-8bd40bd698.zip differ diff --git a/.yarn/cache/pngjs-npm-5.0.0-e8ba79f838-04e912cc45.zip b/.yarn/cache/pngjs-npm-5.0.0-e8ba79f838-04e912cc45.zip new file mode 100644 index 0000000..14e24a3 Binary files /dev/null and b/.yarn/cache/pngjs-npm-5.0.0-e8ba79f838-04e912cc45.zip differ diff --git a/.yarn/cache/postgres-array-npm-2.0.0-4f49dc1389-0e1e659888.zip b/.yarn/cache/postgres-array-npm-2.0.0-4f49dc1389-0e1e659888.zip new file mode 100644 index 0000000..9de6c5d Binary files /dev/null and b/.yarn/cache/postgres-array-npm-2.0.0-4f49dc1389-0e1e659888.zip differ diff --git a/.yarn/cache/postgres-bytea-npm-1.0.0-8c2b81fa73-d844ae4ca7.zip b/.yarn/cache/postgres-bytea-npm-1.0.0-8c2b81fa73-d844ae4ca7.zip new file mode 100644 index 0000000..9f69fde Binary files /dev/null and b/.yarn/cache/postgres-bytea-npm-1.0.0-8c2b81fa73-d844ae4ca7.zip differ diff --git a/.yarn/cache/postgres-date-npm-1.0.7-aadfe5531e-5745001d47.zip b/.yarn/cache/postgres-date-npm-1.0.7-aadfe5531e-5745001d47.zip new file mode 100644 index 0000000..4fa6f03 Binary files /dev/null and b/.yarn/cache/postgres-date-npm-1.0.7-aadfe5531e-5745001d47.zip differ diff --git a/.yarn/cache/postgres-interval-npm-1.2.0-ca6414744d-746b71f938.zip b/.yarn/cache/postgres-interval-npm-1.2.0-ca6414744d-746b71f938.zip new file mode 100644 index 0000000..ed2ddbe Binary files /dev/null and b/.yarn/cache/postgres-interval-npm-1.2.0-ca6414744d-746b71f938.zip differ diff --git a/.yarn/cache/prebuild-install-npm-6.1.4-dba03730c6-de4313eda8.zip b/.yarn/cache/prebuild-install-npm-6.1.4-dba03730c6-de4313eda8.zip new file mode 100644 index 0000000..9580e57 Binary files /dev/null and b/.yarn/cache/prebuild-install-npm-6.1.4-dba03730c6-de4313eda8.zip differ diff --git a/.yarn/cache/process-npm-0.11.10-aeb3b641ae-bfcce49814.zip b/.yarn/cache/process-npm-0.11.10-aeb3b641ae-bfcce49814.zip new file mode 100644 index 0000000..1bb2720 Binary files /dev/null and b/.yarn/cache/process-npm-0.11.10-aeb3b641ae-bfcce49814.zip differ diff --git a/.yarn/cache/progress-npm-2.0.3-d1f87e2ac6-f67403fe7b.zip b/.yarn/cache/progress-npm-2.0.3-d1f87e2ac6-f67403fe7b.zip new file mode 100644 index 0000000..0585bd0 Binary files /dev/null and b/.yarn/cache/progress-npm-2.0.3-d1f87e2ac6-f67403fe7b.zip differ diff --git a/.yarn/cache/pstree.remy-npm-1.1.8-2dd5d55de2-5cb53698d6.zip b/.yarn/cache/pstree.remy-npm-1.1.8-2dd5d55de2-5cb53698d6.zip new file mode 100644 index 0000000..dccb458 Binary files /dev/null and b/.yarn/cache/pstree.remy-npm-1.1.8-2dd5d55de2-5cb53698d6.zip differ diff --git a/.yarn/cache/punycode-npm-1.3.2-3727a84cea-b8807fd594.zip b/.yarn/cache/punycode-npm-1.3.2-3727a84cea-b8807fd594.zip new file mode 100644 index 0000000..22be1b6 Binary files /dev/null and b/.yarn/cache/punycode-npm-1.3.2-3727a84cea-b8807fd594.zip differ diff --git a/.yarn/cache/qrcode-npm-1.5.1-99944b0431-842f899d95.zip b/.yarn/cache/qrcode-npm-1.5.1-99944b0431-842f899d95.zip new file mode 100644 index 0000000..a14d878 Binary files /dev/null and b/.yarn/cache/qrcode-npm-1.5.1-99944b0431-842f899d95.zip differ diff --git a/.yarn/cache/querystring-npm-0.2.0-421b870c92-8258d6734f.zip b/.yarn/cache/querystring-npm-0.2.0-421b870c92-8258d6734f.zip new file mode 100644 index 0000000..161c2bf Binary files /dev/null and b/.yarn/cache/querystring-npm-0.2.0-421b870c92-8258d6734f.zip differ diff --git a/.yarn/cache/querystring-npm-0.2.1-15cb60859d-7b83b45d64.zip b/.yarn/cache/querystring-npm-0.2.1-15cb60859d-7b83b45d64.zip new file mode 100644 index 0000000..50f259e Binary files /dev/null and b/.yarn/cache/querystring-npm-0.2.1-15cb60859d-7b83b45d64.zip differ diff --git a/.yarn/cache/random-bytes-npm-1.0.0-5a886b8827-09faa25639.zip b/.yarn/cache/random-bytes-npm-1.0.0-5a886b8827-09faa25639.zip new file mode 100644 index 0000000..16d629e Binary files /dev/null and b/.yarn/cache/random-bytes-npm-1.0.0-5a886b8827-09faa25639.zip differ diff --git a/.yarn/cache/rc-npm-1.2.8-d6768ac936-2e26e052f8.zip b/.yarn/cache/rc-npm-1.2.8-d6768ac936-2e26e052f8.zip new file mode 100644 index 0000000..f7372f9 Binary files /dev/null and b/.yarn/cache/rc-npm-1.2.8-d6768ac936-2e26e052f8.zip differ diff --git a/.yarn/cache/readable-stream-npm-1.1.14-41e61d1768-17dfeae3e9.zip b/.yarn/cache/readable-stream-npm-1.1.14-41e61d1768-17dfeae3e9.zip new file mode 100644 index 0000000..48cedcd Binary files /dev/null and b/.yarn/cache/readable-stream-npm-1.1.14-41e61d1768-17dfeae3e9.zip differ diff --git a/.yarn/cache/rechoir-npm-0.7.1-0c7e5c1201-2a04aab4e2.zip b/.yarn/cache/rechoir-npm-0.7.1-0c7e5c1201-2a04aab4e2.zip new file mode 100644 index 0000000..24cb0af Binary files /dev/null and b/.yarn/cache/rechoir-npm-0.7.1-0c7e5c1201-2a04aab4e2.zip differ diff --git a/.yarn/cache/reflect-metadata-npm-0.1.13-c525998e20-798d379a7b.zip b/.yarn/cache/reflect-metadata-npm-0.1.13-c525998e20-798d379a7b.zip new file mode 100644 index 0000000..244085a Binary files /dev/null and b/.yarn/cache/reflect-metadata-npm-0.1.13-c525998e20-798d379a7b.zip differ diff --git a/.yarn/cache/regenerator-runtime-npm-0.13.11-90bf536060-27481628d2.zip b/.yarn/cache/regenerator-runtime-npm-0.13.11-90bf536060-27481628d2.zip new file mode 100644 index 0000000..599a0d4 Binary files /dev/null and b/.yarn/cache/regenerator-runtime-npm-0.13.11-90bf536060-27481628d2.zip differ diff --git a/.yarn/cache/regexp-tree-npm-0.1.24-b265ab7f23-5807013289.zip b/.yarn/cache/regexp-tree-npm-0.1.24-b265ab7f23-5807013289.zip new file mode 100644 index 0000000..fa8f550 Binary files /dev/null and b/.yarn/cache/regexp-tree-npm-0.1.24-b265ab7f23-5807013289.zip differ diff --git a/.yarn/cache/regexp.prototype.flags-npm-1.4.3-df1c08b65d-51228bae73.zip b/.yarn/cache/regexp.prototype.flags-npm-1.4.3-df1c08b65d-51228bae73.zip new file mode 100644 index 0000000..9e56b1a Binary files /dev/null and b/.yarn/cache/regexp.prototype.flags-npm-1.4.3-df1c08b65d-51228bae73.zip differ diff --git a/.yarn/cache/regextras-npm-0.8.0-52c909a234-b7ec5b32a2.zip b/.yarn/cache/regextras-npm-0.8.0-52c909a234-b7ec5b32a2.zip new file mode 100644 index 0000000..c5a78d3 Binary files /dev/null and b/.yarn/cache/regextras-npm-0.8.0-52c909a234-b7ec5b32a2.zip differ diff --git a/.yarn/cache/require-main-filename-npm-2.0.0-03eef65c84-e9e294695f.zip b/.yarn/cache/require-main-filename-npm-2.0.0-03eef65c84-e9e294695f.zip new file mode 100644 index 0000000..9a8a691 Binary files /dev/null and b/.yarn/cache/require-main-filename-npm-2.0.0-03eef65c84-e9e294695f.zip differ diff --git a/.yarn/cache/requireindex-npm-1.1.0-445c011741-397057d97d.zip b/.yarn/cache/requireindex-npm-1.1.0-445c011741-397057d97d.zip new file mode 100644 index 0000000..8411f49 Binary files /dev/null and b/.yarn/cache/requireindex-npm-1.1.0-445c011741-397057d97d.zip differ diff --git a/.yarn/cache/requireindex-npm-1.2.0-483c52ddaf-50d8b10a1f.zip b/.yarn/cache/requireindex-npm-1.2.0-483c52ddaf-50d8b10a1f.zip new file mode 100644 index 0000000..4da9164 Binary files /dev/null and b/.yarn/cache/requireindex-npm-1.2.0-483c52ddaf-50d8b10a1f.zip differ diff --git a/.yarn/cache/reserved-words-npm-0.1.2-eed4b16ca9-72e80f71dc.zip b/.yarn/cache/reserved-words-npm-0.1.2-eed4b16ca9-72e80f71dc.zip new file mode 100644 index 0000000..bc57b4b Binary files /dev/null and b/.yarn/cache/reserved-words-npm-0.1.2-eed4b16ca9-72e80f71dc.zip differ diff --git a/.yarn/cache/rimraf-npm-2.7.1-9a71f3cc37-cdc7f6eacb.zip b/.yarn/cache/rimraf-npm-2.7.1-9a71f3cc37-cdc7f6eacb.zip new file mode 100644 index 0000000..096f552 Binary files /dev/null and b/.yarn/cache/rimraf-npm-2.7.1-9a71f3cc37-cdc7f6eacb.zip differ diff --git a/.yarn/cache/routing-controllers-npm-0.9.0-6e3502292f-81d6d505a6.zip b/.yarn/cache/routing-controllers-npm-0.9.0-6e3502292f-81d6d505a6.zip new file mode 100644 index 0000000..7797417 Binary files /dev/null and b/.yarn/cache/routing-controllers-npm-0.9.0-6e3502292f-81d6d505a6.zip differ diff --git a/.yarn/cache/routing-controllers-openapi-npm-2.2.0-99a5ff7e3c-c8c1df741f.zip b/.yarn/cache/routing-controllers-openapi-npm-2.2.0-99a5ff7e3c-c8c1df741f.zip new file mode 100644 index 0000000..ace163d Binary files /dev/null and b/.yarn/cache/routing-controllers-openapi-npm-2.2.0-99a5ff7e3c-c8c1df741f.zip differ diff --git a/.yarn/cache/safe-regex-npm-2.1.1-4438cded67-5d734e2193.zip b/.yarn/cache/safe-regex-npm-2.1.1-4438cded67-5d734e2193.zip new file mode 100644 index 0000000..df5a53b Binary files /dev/null and b/.yarn/cache/safe-regex-npm-2.1.1-4438cded67-5d734e2193.zip differ diff --git a/.yarn/cache/safe-regex-test-npm-1.0.0-e94a09b84e-bc566d8beb.zip b/.yarn/cache/safe-regex-test-npm-1.0.0-e94a09b84e-bc566d8beb.zip new file mode 100644 index 0000000..9e9dbfc Binary files /dev/null and b/.yarn/cache/safe-regex-test-npm-1.0.0-e94a09b84e-bc566d8beb.zip differ diff --git a/.yarn/cache/safe-stable-stringify-npm-2.4.2-26d12f7937-0324ba2e40.zip b/.yarn/cache/safe-stable-stringify-npm-2.4.2-26d12f7937-0324ba2e40.zip new file mode 100644 index 0000000..c7b65f5 Binary files /dev/null and b/.yarn/cache/safe-stable-stringify-npm-2.4.2-26d12f7937-0324ba2e40.zip differ diff --git a/.yarn/cache/semver-npm-7.0.0-218e8c00ca-272c11bf8d.zip b/.yarn/cache/semver-npm-7.0.0-218e8c00ca-272c11bf8d.zip new file mode 100644 index 0000000..74b3f93 Binary files /dev/null and b/.yarn/cache/semver-npm-7.0.0-218e8c00ca-272c11bf8d.zip differ diff --git a/.yarn/cache/sha.js-npm-2.4.11-14868df4ca-ebd3f59d4b.zip b/.yarn/cache/sha.js-npm-2.4.11-14868df4ca-ebd3f59d4b.zip new file mode 100644 index 0000000..6d55cc0 Binary files /dev/null and b/.yarn/cache/sha.js-npm-2.4.11-14868df4ca-ebd3f59d4b.zip differ diff --git a/.yarn/cache/sha512-npm-0.0.1-1fd4f6b351-7a6e6fadc2.zip b/.yarn/cache/sha512-npm-0.0.1-1fd4f6b351-7a6e6fadc2.zip new file mode 100644 index 0000000..24fe31c Binary files /dev/null and b/.yarn/cache/sha512-npm-0.0.1-1fd4f6b351-7a6e6fadc2.zip differ diff --git a/.yarn/cache/simple-concat-npm-1.0.1-48df70de29-4d211042cc.zip b/.yarn/cache/simple-concat-npm-1.0.1-48df70de29-4d211042cc.zip new file mode 100644 index 0000000..6b694be Binary files /dev/null and b/.yarn/cache/simple-concat-npm-1.0.1-48df70de29-4d211042cc.zip differ diff --git a/.yarn/cache/simple-get-npm-3.1.1-dce5923dba-80195e70bf.zip b/.yarn/cache/simple-get-npm-3.1.1-dce5923dba-80195e70bf.zip new file mode 100644 index 0000000..27c4575 Binary files /dev/null and b/.yarn/cache/simple-get-npm-3.1.1-dce5923dba-80195e70bf.zip differ diff --git a/.yarn/cache/simple-swizzle-npm-0.2.2-8dee37fad1-a7f3f2ab5c.zip b/.yarn/cache/simple-swizzle-npm-0.2.2-8dee37fad1-a7f3f2ab5c.zip new file mode 100644 index 0000000..8420b56 Binary files /dev/null and b/.yarn/cache/simple-swizzle-npm-0.2.2-8dee37fad1-a7f3f2ab5c.zip differ diff --git a/.yarn/cache/simple-update-notifier-npm-1.1.0-92878518a3-1012e9b6c5.zip b/.yarn/cache/simple-update-notifier-npm-1.1.0-92878518a3-1012e9b6c5.zip new file mode 100644 index 0000000..2a36e6d Binary files /dev/null and b/.yarn/cache/simple-update-notifier-npm-1.1.0-92878518a3-1012e9b6c5.zip differ diff --git a/.yarn/cache/split2-npm-4.1.0-1c1a4bd984-ec581597cb.zip b/.yarn/cache/split2-npm-4.1.0-1c1a4bd984-ec581597cb.zip new file mode 100644 index 0000000..fd70b1d Binary files /dev/null and b/.yarn/cache/split2-npm-4.1.0-1c1a4bd984-ec581597cb.zip differ diff --git a/.yarn/cache/stack-trace-npm-0.0.10-9460b173e1-473036ad32.zip b/.yarn/cache/stack-trace-npm-0.0.10-9460b173e1-473036ad32.zip new file mode 100644 index 0000000..6674dc5 Binary files /dev/null and b/.yarn/cache/stack-trace-npm-0.0.10-9460b173e1-473036ad32.zip differ diff --git a/.yarn/cache/stream-meter-npm-1.0.4-3d727492d5-a732f7ede9.zip b/.yarn/cache/stream-meter-npm-1.0.4-3d727492d5-a732f7ede9.zip new file mode 100644 index 0000000..f6ff360 Binary files /dev/null and b/.yarn/cache/stream-meter-npm-1.0.4-3d727492d5-a732f7ede9.zip differ diff --git a/.yarn/cache/streamsearch-npm-0.1.2-813180eb1c-d2db57cbfb.zip b/.yarn/cache/streamsearch-npm-0.1.2-813180eb1c-d2db57cbfb.zip new file mode 100644 index 0000000..2cc9408 Binary files /dev/null and b/.yarn/cache/streamsearch-npm-0.1.2-813180eb1c-d2db57cbfb.zip differ diff --git a/.yarn/cache/string-similarity-npm-4.0.4-74971fe325-797b41b24e.zip b/.yarn/cache/string-similarity-npm-4.0.4-74971fe325-797b41b24e.zip new file mode 100644 index 0000000..12cbd78 Binary files /dev/null and b/.yarn/cache/string-similarity-npm-4.0.4-74971fe325-797b41b24e.zip differ diff --git a/.yarn/cache/string-width-npm-1.0.2-01031f9add-5c79439e95.zip b/.yarn/cache/string-width-npm-1.0.2-01031f9add-5c79439e95.zip new file mode 100644 index 0000000..a138422 Binary files /dev/null and b/.yarn/cache/string-width-npm-1.0.2-01031f9add-5c79439e95.zip differ diff --git a/.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-0fdc34645a.zip b/.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-0fdc34645a.zip new file mode 100644 index 0000000..c28cc81 Binary files /dev/null and b/.yarn/cache/string.prototype.trimend-npm-1.0.6-304246ecc1-0fdc34645a.zip differ diff --git a/.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-89080feef4.zip b/.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-89080feef4.zip new file mode 100644 index 0000000..6203bec Binary files /dev/null and b/.yarn/cache/string.prototype.trimstart-npm-1.0.6-0926caea6c-89080feef4.zip differ diff --git a/.yarn/cache/string_decoder-npm-0.10.31-851f3f7302-fe00f8e303.zip b/.yarn/cache/string_decoder-npm-0.10.31-851f3f7302-fe00f8e303.zip new file mode 100644 index 0000000..52b4bfd Binary files /dev/null and b/.yarn/cache/string_decoder-npm-0.10.31-851f3f7302-fe00f8e303.zip differ diff --git a/.yarn/cache/strip-ansi-npm-3.0.1-6aec1365b9-9b974de611.zip b/.yarn/cache/strip-ansi-npm-3.0.1-6aec1365b9-9b974de611.zip new file mode 100644 index 0000000..a1c9f6a Binary files /dev/null and b/.yarn/cache/strip-ansi-npm-3.0.1-6aec1365b9-9b974de611.zip differ diff --git a/.yarn/cache/subscriptions-transport-ws-npm-0.9.19-5f31f99bef-6979b36e03.zip b/.yarn/cache/subscriptions-transport-ws-npm-0.9.19-5f31f99bef-6979b36e03.zip new file mode 100644 index 0000000..2e1044e Binary files /dev/null and b/.yarn/cache/subscriptions-transport-ws-npm-0.9.19-5f31f99bef-6979b36e03.zip differ diff --git a/.yarn/cache/swagger-ui-dist-npm-4.15.5-9e0c8d56dd-b032ecc124.zip b/.yarn/cache/swagger-ui-dist-npm-4.15.5-9e0c8d56dd-b032ecc124.zip new file mode 100644 index 0000000..bf6e3a4 Binary files /dev/null and b/.yarn/cache/swagger-ui-dist-npm-4.15.5-9e0c8d56dd-b032ecc124.zip differ diff --git a/.yarn/cache/swagger-ui-express-npm-4.6.0-e6d70a5883-8e5e2bf431.zip b/.yarn/cache/swagger-ui-express-npm-4.6.0-e6d70a5883-8e5e2bf431.zip new file mode 100644 index 0000000..a648696 Binary files /dev/null and b/.yarn/cache/swagger-ui-express-npm-4.6.0-e6d70a5883-8e5e2bf431.zip differ diff --git a/.yarn/cache/tar-fs-npm-2.1.1-e374d3b7a2-f5b9a70059.zip b/.yarn/cache/tar-fs-npm-2.1.1-e374d3b7a2-f5b9a70059.zip new file mode 100644 index 0000000..f256de3 Binary files /dev/null and b/.yarn/cache/tar-fs-npm-2.1.1-e374d3b7a2-f5b9a70059.zip differ diff --git a/.yarn/cache/template-url-npm-1.0.0-3c41cf69c0-cf68e4b2b5.zip b/.yarn/cache/template-url-npm-1.0.0-3c41cf69c0-cf68e4b2b5.zip new file mode 100644 index 0000000..d5bd3fb Binary files /dev/null and b/.yarn/cache/template-url-npm-1.0.0-3c41cf69c0-cf68e4b2b5.zip differ diff --git a/.yarn/cache/text-hex-npm-1.0.0-22389e4d56-1138f68adc.zip b/.yarn/cache/text-hex-npm-1.0.0-22389e4d56-1138f68adc.zip new file mode 100644 index 0000000..ce4bf0b Binary files /dev/null and b/.yarn/cache/text-hex-npm-1.0.0-22389e4d56-1138f68adc.zip differ diff --git a/.yarn/cache/timm-npm-1.7.1-4d0984663a-c80df538ec.zip b/.yarn/cache/timm-npm-1.7.1-4d0984663a-c80df538ec.zip new file mode 100644 index 0000000..bf5fbc5 Binary files /dev/null and b/.yarn/cache/timm-npm-1.7.1-4d0984663a-c80df538ec.zip differ diff --git a/.yarn/cache/tinycolor2-npm-1.5.2-0898381e92-9df1ea9a98.zip b/.yarn/cache/tinycolor2-npm-1.5.2-0898381e92-9df1ea9a98.zip new file mode 100644 index 0000000..dc59ab8 Binary files /dev/null and b/.yarn/cache/tinycolor2-npm-1.5.2-0898381e92-9df1ea9a98.zip differ diff --git a/.yarn/cache/too-wordy-npm-0.3.4-e303e3e352-c7e4b5cdaf.zip b/.yarn/cache/too-wordy-npm-0.3.4-e303e3e352-c7e4b5cdaf.zip new file mode 100644 index 0000000..7395746 Binary files /dev/null and b/.yarn/cache/too-wordy-npm-0.3.4-e303e3e352-c7e4b5cdaf.zip differ diff --git a/.yarn/cache/touch-npm-3.1.0-e2eacebbda-e0be589cb5.zip b/.yarn/cache/touch-npm-3.1.0-e2eacebbda-e0be589cb5.zip new file mode 100644 index 0000000..84e3b23 Binary files /dev/null and b/.yarn/cache/touch-npm-3.1.0-e2eacebbda-e0be589cb5.zip differ diff --git a/.yarn/cache/triple-beam-npm-1.3.0-eda4e2a46c-7d7b77d862.zip b/.yarn/cache/triple-beam-npm-1.3.0-eda4e2a46c-7d7b77d862.zip new file mode 100644 index 0000000..5aab747 Binary files /dev/null and b/.yarn/cache/triple-beam-npm-1.3.0-eda4e2a46c-7d7b77d862.zip differ diff --git a/.yarn/cache/ts-node-dev-npm-1.1.8-a4a6e3dc64-768a580621.zip b/.yarn/cache/ts-node-dev-npm-1.1.8-a4a6e3dc64-768a580621.zip new file mode 100644 index 0000000..2834f6c Binary files /dev/null and b/.yarn/cache/ts-node-dev-npm-1.1.8-a4a6e3dc64-768a580621.zip differ diff --git a/.yarn/cache/ts-node-npm-9.1.1-4ad31da228-356e2647b8.zip b/.yarn/cache/ts-node-npm-9.1.1-4ad31da228-356e2647b8.zip new file mode 100644 index 0000000..e790d33 Binary files /dev/null and b/.yarn/cache/ts-node-npm-9.1.1-4ad31da228-356e2647b8.zip differ diff --git a/.yarn/cache/tsconfig-paths-npm-3.14.1-17a815b5c5-8afa01c673.zip b/.yarn/cache/tsconfig-paths-npm-3.14.1-17a815b5c5-8afa01c673.zip new file mode 100644 index 0000000..98a7ab1 Binary files /dev/null and b/.yarn/cache/tsconfig-paths-npm-3.14.1-17a815b5c5-8afa01c673.zip differ diff --git a/.yarn/cache/tsconfig-paths-webpack-plugin-npm-3.5.2-7d7e8a5739-e7872f45b1.zip b/.yarn/cache/tsconfig-paths-webpack-plugin-npm-3.5.2-7d7e8a5739-e7872f45b1.zip new file mode 100644 index 0000000..5ad7cbc Binary files /dev/null and b/.yarn/cache/tsconfig-paths-webpack-plugin-npm-3.5.2-7d7e8a5739-e7872f45b1.zip differ diff --git a/.yarn/cache/tsscmp-npm-1.0.6-3223087558-1512384def.zip b/.yarn/cache/tsscmp-npm-1.0.6-3223087558-1512384def.zip new file mode 100644 index 0000000..f7a4759 Binary files /dev/null and b/.yarn/cache/tsscmp-npm-1.0.6-3223087558-1512384def.zip differ diff --git a/.yarn/cache/tunnel-agent-npm-0.6.0-64345ab7eb-05f6510358.zip b/.yarn/cache/tunnel-agent-npm-0.6.0-64345ab7eb-05f6510358.zip new file mode 100644 index 0000000..5256e20 Binary files /dev/null and b/.yarn/cache/tunnel-agent-npm-0.6.0-64345ab7eb-05f6510358.zip differ diff --git a/.yarn/cache/type-graphql-npm-1.1.1-82668f6e3f-fa14b76daf.zip b/.yarn/cache/type-graphql-npm-1.1.1-82668f6e3f-fa14b76daf.zip new file mode 100644 index 0000000..d2e010b Binary files /dev/null and b/.yarn/cache/type-graphql-npm-1.1.1-82668f6e3f-fa14b76daf.zip differ diff --git a/.yarn/cache/typed-array-length-npm-1.0.4-92771b81fc-2228febc93.zip b/.yarn/cache/typed-array-length-npm-1.0.4-92771b81fc-2228febc93.zip new file mode 100644 index 0000000..f68a3c2 Binary files /dev/null and b/.yarn/cache/typed-array-length-npm-1.0.4-92771b81fc-2228febc93.zip differ diff --git a/.yarn/cache/typedarray-npm-0.0.6-37638b2241-33b39f3d0e.zip b/.yarn/cache/typedarray-npm-0.0.6-37638b2241-33b39f3d0e.zip new file mode 100644 index 0000000..d03674e Binary files /dev/null and b/.yarn/cache/typedarray-npm-0.0.6-37638b2241-33b39f3d0e.zip differ diff --git a/.yarn/cache/typedi-npm-0.8.0-6729062c9f-f6fc275672.zip b/.yarn/cache/typedi-npm-0.8.0-6729062c9f-f6fc275672.zip new file mode 100644 index 0000000..4a48286 Binary files /dev/null and b/.yarn/cache/typedi-npm-0.8.0-6729062c9f-f6fc275672.zip differ diff --git a/.yarn/cache/typeorm-npm-0.2.45-8264084ef9-b7684a52c8.zip b/.yarn/cache/typeorm-npm-0.2.45-8264084ef9-b7684a52c8.zip new file mode 100644 index 0000000..95bd3d5 Binary files /dev/null and b/.yarn/cache/typeorm-npm-0.2.45-8264084ef9-b7684a52c8.zip differ diff --git a/.yarn/cache/typeorm-typedi-extensions-npm-0.2.3-6c65d478a6-01b2fb2684.zip b/.yarn/cache/typeorm-typedi-extensions-npm-0.2.3-6c65d478a6-01b2fb2684.zip new file mode 100644 index 0000000..23580ac Binary files /dev/null and b/.yarn/cache/typeorm-typedi-extensions-npm-0.2.3-6c65d478a6-01b2fb2684.zip differ diff --git a/.yarn/cache/uid-safe-npm-2.1.5-2f400e5dbd-07536043da.zip b/.yarn/cache/uid-safe-npm-2.1.5-2f400e5dbd-07536043da.zip new file mode 100644 index 0000000..0cd8d9a Binary files /dev/null and b/.yarn/cache/uid-safe-npm-2.1.5-2f400e5dbd-07536043da.zip differ diff --git a/.yarn/cache/unbox-primitive-npm-1.0.2-cb56a05066-b7a1cf5862.zip b/.yarn/cache/unbox-primitive-npm-1.0.2-cb56a05066-b7a1cf5862.zip new file mode 100644 index 0000000..7230bc6 Binary files /dev/null and b/.yarn/cache/unbox-primitive-npm-1.0.2-cb56a05066-b7a1cf5862.zip differ diff --git a/.yarn/cache/undefsafe-npm-2.0.5-8c3bbf9354-f42ab3b577.zip b/.yarn/cache/undefsafe-npm-2.0.5-8c3bbf9354-f42ab3b577.zip new file mode 100644 index 0000000..ef05395 Binary files /dev/null and b/.yarn/cache/undefsafe-npm-2.0.5-8c3bbf9354-f42ab3b577.zip differ diff --git a/.yarn/cache/urijs-npm-1.19.11-e9c694fd1d-f9b9500456.zip b/.yarn/cache/urijs-npm-1.19.11-e9c694fd1d-f9b9500456.zip new file mode 100644 index 0000000..361e731 Binary files /dev/null and b/.yarn/cache/urijs-npm-1.19.11-e9c694fd1d-f9b9500456.zip differ diff --git a/.yarn/cache/url-npm-0.11.0-32ce15acfb-50d100d3dd.zip b/.yarn/cache/url-npm-0.11.0-32ce15acfb-50d100d3dd.zip new file mode 100644 index 0000000..30c964b Binary files /dev/null and b/.yarn/cache/url-npm-0.11.0-32ce15acfb-50d100d3dd.zip differ diff --git a/.yarn/cache/utif-npm-2.0.1-b6892ce22a-66b0bffc18.zip b/.yarn/cache/utif-npm-2.0.1-b6892ce22a-66b0bffc18.zip new file mode 100644 index 0000000..982f90e Binary files /dev/null and b/.yarn/cache/utif-npm-2.0.1-b6892ce22a-66b0bffc18.zip differ diff --git a/.yarn/cache/util.promisify-npm-1.1.1-351ea97c2a-ea371c30b9.zip b/.yarn/cache/util.promisify-npm-1.1.1-351ea97c2a-ea371c30b9.zip new file mode 100644 index 0000000..8e48073 Binary files /dev/null and b/.yarn/cache/util.promisify-npm-1.1.1-351ea97c2a-ea371c30b9.zip differ diff --git a/.yarn/cache/uuid-npm-3.4.0-4fd8ef88ad-58de2feed6.zip b/.yarn/cache/uuid-npm-3.4.0-4fd8ef88ad-58de2feed6.zip new file mode 100644 index 0000000..86d48ea Binary files /dev/null and b/.yarn/cache/uuid-npm-3.4.0-4fd8ef88ad-58de2feed6.zip differ diff --git a/.yarn/cache/validator-npm-13.7.0-624277e841-2b83283de1.zip b/.yarn/cache/validator-npm-13.7.0-624277e841-2b83283de1.zip new file mode 100644 index 0000000..27c8c61 Binary files /dev/null and b/.yarn/cache/validator-npm-13.7.0-624277e841-2b83283de1.zip differ diff --git a/.yarn/cache/weasel-words-npm-0.1.1-2ad2f69400-a7693308cf.zip b/.yarn/cache/weasel-words-npm-0.1.1-2ad2f69400-a7693308cf.zip new file mode 100644 index 0000000..d242a28 Binary files /dev/null and b/.yarn/cache/weasel-words-npm-0.1.1-2ad2f69400-a7693308cf.zip differ diff --git a/.yarn/cache/webpack-cli-npm-4.10.0-09cee8c457-2ff5355ac3.zip b/.yarn/cache/webpack-cli-npm-4.10.0-09cee8c457-2ff5355ac3.zip new file mode 100644 index 0000000..8919e5b Binary files /dev/null and b/.yarn/cache/webpack-cli-npm-4.10.0-09cee8c457-2ff5355ac3.zip differ diff --git a/.yarn/cache/which-boxed-primitive-npm-1.0.2-e214f9ae5a-53ce774c73.zip b/.yarn/cache/which-boxed-primitive-npm-1.0.2-e214f9ae5a-53ce774c73.zip new file mode 100644 index 0000000..fef0ce4 Binary files /dev/null and b/.yarn/cache/which-boxed-primitive-npm-1.0.2-e214f9ae5a-53ce774c73.zip differ diff --git a/.yarn/cache/which-module-npm-2.0.0-daf3daa08d-809f7fd3df.zip b/.yarn/cache/which-module-npm-2.0.0-daf3daa08d-809f7fd3df.zip new file mode 100644 index 0000000..5548e31 Binary files /dev/null and b/.yarn/cache/which-module-npm-2.0.0-daf3daa08d-809f7fd3df.zip differ diff --git a/.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-fe0178ca44.zip b/.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-fe0178ca44.zip new file mode 100644 index 0000000..e7e7d54 Binary files /dev/null and b/.yarn/cache/which-typed-array-npm-1.1.9-9559c95dfc-fe0178ca44.zip differ diff --git a/.yarn/cache/winston-npm-3.8.2-2035e9cac4-f7b901798b.zip b/.yarn/cache/winston-npm-3.8.2-2035e9cac4-f7b901798b.zip new file mode 100644 index 0000000..d5fc690 Binary files /dev/null and b/.yarn/cache/winston-npm-3.8.2-2035e9cac4-f7b901798b.zip differ diff --git a/.yarn/cache/winston-transport-npm-4.5.0-e10bfb2169-a56e5678a8.zip b/.yarn/cache/winston-transport-npm-4.5.0-e10bfb2169-a56e5678a8.zip new file mode 100644 index 0000000..6f2b4f7 Binary files /dev/null and b/.yarn/cache/winston-transport-npm-4.5.0-e10bfb2169-a56e5678a8.zip differ diff --git a/.yarn/cache/wrap-ansi-npm-6.2.0-439a7246d8-6cd96a4101.zip b/.yarn/cache/wrap-ansi-npm-6.2.0-439a7246d8-6cd96a4101.zip new file mode 100644 index 0000000..aa06055 Binary files /dev/null and b/.yarn/cache/wrap-ansi-npm-6.2.0-439a7246d8-6cd96a4101.zip differ diff --git a/.yarn/cache/write-good-npm-1.0.8-a8d6459437-045f1d1b50.zip b/.yarn/cache/write-good-npm-1.0.8-a8d6459437-045f1d1b50.zip new file mode 100644 index 0000000..5009803 Binary files /dev/null and b/.yarn/cache/write-good-npm-1.0.8-a8d6459437-045f1d1b50.zip differ diff --git a/.yarn/cache/xhr-npm-2.6.0-c4a4d64db8-a1db277e37.zip b/.yarn/cache/xhr-npm-2.6.0-c4a4d64db8-a1db277e37.zip new file mode 100644 index 0000000..29b4819 Binary files /dev/null and b/.yarn/cache/xhr-npm-2.6.0-c4a4d64db8-a1db277e37.zip differ diff --git a/.yarn/cache/xml-parse-from-string-npm-1.0.1-8305dfb2e2-5155cb98e4.zip b/.yarn/cache/xml-parse-from-string-npm-1.0.1-8305dfb2e2-5155cb98e4.zip new file mode 100644 index 0000000..3f1c4f0 Binary files /dev/null and b/.yarn/cache/xml-parse-from-string-npm-1.0.1-8305dfb2e2-5155cb98e4.zip differ diff --git a/.yarn/cache/xml2js-npm-0.4.23-93a8b2e10b-ca0cf2dfbf.zip b/.yarn/cache/xml2js-npm-0.4.23-93a8b2e10b-ca0cf2dfbf.zip new file mode 100644 index 0000000..0206d68 Binary files /dev/null and b/.yarn/cache/xml2js-npm-0.4.23-93a8b2e10b-ca0cf2dfbf.zip differ diff --git a/.yarn/cache/xmlbuilder-npm-11.0.1-b8b04dc929-7152695e16.zip b/.yarn/cache/xmlbuilder-npm-11.0.1-b8b04dc929-7152695e16.zip new file mode 100644 index 0000000..b7a7d79 Binary files /dev/null and b/.yarn/cache/xmlbuilder-npm-11.0.1-b8b04dc929-7152695e16.zip differ diff --git a/.yarn/cache/xss-npm-1.0.14-eb6e57872e-77c6a60a5f.zip b/.yarn/cache/xss-npm-1.0.14-eb6e57872e-77c6a60a5f.zip new file mode 100644 index 0000000..83e21e8 Binary files /dev/null and b/.yarn/cache/xss-npm-1.0.14-eb6e57872e-77c6a60a5f.zip differ diff --git a/.yarn/cache/xtend-npm-4.0.2-7f2375736e-ac5dfa738b.zip b/.yarn/cache/xtend-npm-4.0.2-7f2375736e-ac5dfa738b.zip new file mode 100644 index 0000000..1090c68 Binary files /dev/null and b/.yarn/cache/xtend-npm-4.0.2-7f2375736e-ac5dfa738b.zip differ diff --git a/.yarn/cache/y18n-npm-4.0.3-ced95acdbc-014dfcd9b5.zip b/.yarn/cache/y18n-npm-4.0.3-ced95acdbc-014dfcd9b5.zip new file mode 100644 index 0000000..5fab75d Binary files /dev/null and b/.yarn/cache/y18n-npm-4.0.3-ced95acdbc-014dfcd9b5.zip differ diff --git a/.yarn/cache/yargs-npm-15.4.1-ca1c444de1-40b974f508.zip b/.yarn/cache/yargs-npm-15.4.1-ca1c444de1-40b974f508.zip new file mode 100644 index 0000000..5923276 Binary files /dev/null and b/.yarn/cache/yargs-npm-15.4.1-ca1c444de1-40b974f508.zip differ diff --git a/.yarn/cache/yargs-parser-npm-18.1.3-0ba9c4f088-60e8c7d1b8.zip b/.yarn/cache/yargs-parser-npm-18.1.3-0ba9c4f088-60e8c7d1b8.zip new file mode 100644 index 0000000..5364230 Binary files /dev/null and b/.yarn/cache/yargs-parser-npm-18.1.3-0ba9c4f088-60e8c7d1b8.zip differ diff --git a/.yarn/cache/ylru-npm-1.3.2-81969d097f-b6bb393114.zip b/.yarn/cache/ylru-npm-1.3.2-81969d097f-b6bb393114.zip new file mode 100644 index 0000000..6835e3c Binary files /dev/null and b/.yarn/cache/ylru-npm-1.3.2-81969d097f-b6bb393114.zip differ diff --git a/.yarn/cache/zen-observable-ts-npm-1.2.5-4ddaa0e233-3b707b7a02.zip b/.yarn/cache/zen-observable-ts-npm-1.2.5-4ddaa0e233-3b707b7a02.zip new file mode 100644 index 0000000..df8198e Binary files /dev/null and b/.yarn/cache/zen-observable-ts-npm-1.2.5-4ddaa0e233-3b707b7a02.zip differ diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 689348a..3375fb0 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/package.json b/package.json index 3cd091d..06ae403 100644 --- a/package.json +++ b/package.json @@ -28,37 +28,95 @@ "deepmerge": "^4.2.2", "eslint": "~8.15.0", "eslint-config-prettier": "8.1.0", + "eslint-plugin-autofix": "^1.1.0", + "eslint-plugin-deprecation": "^1.3.2", + "eslint-plugin-immutable": "^1.0.0", + "eslint-plugin-jsdoc": "^35.1.2", + "eslint-plugin-no-loops": "^0.3.0", + "eslint-plugin-no-secrets": "^0.8.9", + "eslint-plugin-notice": "^0.9.10", "eslint-plugin-prettier": "^4.2.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-radar": "^0.2.1", + "eslint-plugin-security": "^1.5.0", + "eslint-plugin-simple-import-sort": "^7.0.0", + "eslint-plugin-sort-keys-fix": "^1.1.2", + "eslint-plugin-type-graphql": "^0.3.0", + "eslint-plugin-unicorn": "^32.0.1", "eslint-plugin-vue": "^7.8.0", + "eslint-plugin-woke": "^1.0.0", + "eslint-plugin-write-good-comments": "^0.1.3", "jest": "28.1.1", "jest-environment-jsdom": "28.1.1", "jest-serializer-vue": "^3.0.0", "jest-transform-stub": "^2.0.0", + "nodemon": "^2.0.5", "nx": "15.5.3", + "pkg": "^5.6.0", "prettier": "^2.6.2", + "rimraf": "^3.0.2", "sass": "1.32.8", "sass-loader": "^13.2.0", "ts-jest": "28.0.5", + "ts-loader": "^9.2.2", "ts-node": "10.9.1", - "typescript": "~4.8.2" + "ts-node-dev": "^1.0.0-pre.44", + "tsconfig-paths": "^3.9.0", + "tsconfig-paths-webpack-plugin": "^3.5.1", + "typescript": "~4.8.2", + "webpack": "^5.38.1", + "webpack-cli": "^4.7.0", + "webpack-node-externals": "^3.0.0" }, "packageManager": "yarn@3.3.1", "dependencies": { "@fingerprintjs/fingerprintjs": "^3.3.3", "apollo-boost": "^0.4.9", "apollo-link-ws": "^1.0.20", + "apollo-server-express": "^2.24.1", + "axios": "^0.21.2", + "body-parser": "^1.20.0", + "chalk": "^4.0.0", + "class-transformer": "^0.3.1", + "class-validator": "^0.14.0", + "class-validator-jsonschema": "^2.0.3", + "cors": "^2.8.5", + "cron-decorators": "^0.1.5", "dayjs": "^1.11.4", "debounce": "^1.2.1", + "dotenv": "^8.2.0", "express": "^4.18.1", - "graphql": "^16.5.0", + "glob": "^7.1.6", + "graphql": "^15.3.0", "graphql-tag": "^2.12.6", + "graphql-type-json": "^0.3.2", + "is-there": "^4.5.1", + "jsonwebtoken": "^8.5.1", + "microframework": "^0.6.4", + "multer": "^1.4.2", + "node-vibrant": "^3.2.1-alpha.1", + "pg": "^8.6.0", + "qrcode": "^1.4.4", + "querystring": "^0.2.0", + "reflect-metadata": "^0.1.13", "register-service-worker": "^1.7.2", + "routing-controllers": "^0.9.0-alpha.6", + "routing-controllers-openapi": "^2.1.0", + "sha512": "^0.0.1", "subscriptions-transport-ws": "^0.11.0", + "swagger-ui-express": "^4.1.2", "tslib": "^2.3.0", + "type-graphql": "^1.1.1", + "typedi": "^0.8.0", + "typeorm": "^0.2.25", + "typeorm-typedi-extensions": "^0.2.3", + "uuid": "^8.3.2", + "validator": "^13.7.0", "vue": "^2.7.0", "vue-apollo": "^3.1.0", "vue-router": "^3.6.0", - "vuetify": "^2.6.13" + "vuetify": "^2.6.13", + "winston": "^3.3.3" }, "scripts": { "postinstall": "node node_modules/@nx-plus/vue/patch-nx-dep-graph.js", diff --git a/packages/server/project.json b/packages/server/project.json index 773bf23..875c0a9 100644 --- a/packages/server/project.json +++ b/packages/server/project.json @@ -11,7 +11,7 @@ "target": "node", "compiler": "tsc", "outputPath": "dist/packages/server", - "main": "packages/server/src/main.ts", + "main": "packages/server/src/app.ts", "tsConfig": "packages/server/tsconfig.app.json", "assets": ["packages/server/src/assets"], "webpackConfig": "packages/server/webpack.config.js" diff --git a/packages/server/src/api/auth/auth.ts b/packages/server/src/api/auth/auth.ts new file mode 100644 index 0000000..c0e7922 --- /dev/null +++ b/packages/server/src/api/auth/auth.ts @@ -0,0 +1,6 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ +import { Context } from '../types'; + +export const authChecker = ({ context }: {context: Context}): boolean => !!context.member; diff --git a/packages/server/src/api/auth/context.ts b/packages/server/src/api/auth/context.ts new file mode 100644 index 0000000..6587b84 --- /dev/null +++ b/packages/server/src/api/auth/context.ts @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { validateTokenAndGetState } from './util'; +import { Context } from '../types'; +import { ExpressContext } from 'apollo-server-express/src/ApolloServer'; +import { Container } from 'typedi'; +import { v4 } from 'uuid'; + +export const context = async (expressContext: ExpressContext): Promise => { + const token = expressContext.req.headers.authorization; + const { user, member, party } = await validateTokenAndGetState(token); + const requestId = v4(); + const container = Container.of(requestId); + const c: Context = { + container, + member, + party, + requestId, + user, + }; + container.set( + 'context', c + ); + return c; +}; diff --git a/packages/server/src/api/auth/util.ts b/packages/server/src/api/auth/util.ts new file mode 100644 index 0000000..55a5357 --- /dev/null +++ b/packages/server/src/api/auth/util.ts @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, User } from '../models'; +import { MemberService, TokenService } from '../services'; +import { AccessToken } from '../types'; +import { plainToClass } from 'class-transformer'; +import { Container } from 'typedi'; + +const invalidState = { + member: undefined, + party: undefined, + user: undefined, +}; + +export interface StateFromToken { + user: User; + member: Member; + party: Party +} + +export const validateTokenAndGetState: (token: string) => Promise = async token => { + if (!token) { + return invalidState; + } + try { + const tokenService: TokenService = Container.get(TokenService); + const memberService: MemberService = Container.get(MemberService); + const { memberId } = tokenService.verify(token); + const member = await memberService.getById(memberId); + const user = await memberService.getUserFor(member); + const party = await memberService.getPartyFor(member); + if (!member) { + throw new Error('Invalid token'); + } + return member ? { + member: plainToClass( + Member, member + ), + party: plainToClass( + Party, party + ), + user: plainToClass( + User, user + ), + } : invalidState; + } catch { + return invalidState; + } +}; diff --git a/packages/server/src/api/controllers/auth.controller.ts b/packages/server/src/api/controllers/auth.controller.ts new file mode 100644 index 0000000..9f8293a --- /dev/null +++ b/packages/server/src/api/controllers/auth.controller.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../../environment'; +import { AuthService } from '../services'; +import { Controller, Get, QueryParam, Redirect } from 'routing-controllers'; + +@Controller('/auth') +export class AuthController { + constructor(private readonly _authService: AuthService) {} + + @Get('/callback') + @Redirect(`${environment.front.url}/join?code=:code`) + async OAuthCallback( + @QueryParam('code') code: string, + @QueryParam('state') state: string + ): Promise> { + const partyCode = await this._authService.oAuthCallback( + code, + state + ); + + return { + code: partyCode + }; + } +} diff --git a/packages/server/src/api/controllers/front.controller.ts b/packages/server/src/api/controllers/front.controller.ts new file mode 100644 index 0000000..cd53773 --- /dev/null +++ b/packages/server/src/api/controllers/front.controller.ts @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../../environment'; +import { Controller, Get } from 'routing-controllers'; + +@Controller('/front') +export class FrontController { + @Get('/config') + async config(): Promise> { + return { + version: environment.front.version, + }; + } +} diff --git a/packages/server/src/api/controllers/index.ts b/packages/server/src/api/controllers/index.ts new file mode 100644 index 0000000..14ea22f --- /dev/null +++ b/packages/server/src/api/controllers/index.ts @@ -0,0 +1,8 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + + +export * from './auth.controller'; +export * from './front.controller'; +export * from './party.controller'; diff --git a/packages/server/src/api/controllers/party.controller.ts b/packages/server/src/api/controllers/party.controller.ts new file mode 100644 index 0000000..da60c60 --- /dev/null +++ b/packages/server/src/api/controllers/party.controller.ts @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../../environment'; +import { QRService } from '../services'; +import { ContentType, Controller, Get, QueryParam } from 'routing-controllers'; + +@Controller('/party') +export class PartyController { + constructor(private readonly _qrService: QRService) {} + + @Get('/qr.png') + @ContentType('image/png') + async shareQRCode( + @QueryParam('code') code: string, + @QueryParam('back') back: string, + @QueryParam('front') front: string + ): Promise { + const data = await this._qrService.generateFrom( + `${environment.front.url}/join?c=${code}`, `#${front}ff`, `#${back}ff` + ); + return Buffer.from( + data.split(',')[1], 'base64' + ); + } +} diff --git a/packages/server/src/app/.gitkeep b/packages/server/src/api/errors/.gitkeep similarity index 100% rename from packages/server/src/app/.gitkeep rename to packages/server/src/api/errors/.gitkeep diff --git a/packages/server/src/api/inputs/index.ts b/packages/server/src/api/inputs/index.ts new file mode 100644 index 0000000..39ca6a9 --- /dev/null +++ b/packages/server/src/api/inputs/index.ts @@ -0,0 +1,5 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './user.input'; diff --git a/packages/server/src/api/inputs/user.input.ts b/packages/server/src/api/inputs/user.input.ts new file mode 100644 index 0000000..74129a2 --- /dev/null +++ b/packages/server/src/api/inputs/user.input.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { User } from '../models'; +import { InputType } from 'type-graphql'; + +@InputType() +export class UserInput implements Partial {} diff --git a/packages/server/src/api/jobs/index.ts b/packages/server/src/api/jobs/index.ts new file mode 100644 index 0000000..7759933 --- /dev/null +++ b/packages/server/src/api/jobs/index.ts @@ -0,0 +1,6 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './party-state.job'; +export * from './spotify-refresh.job'; diff --git a/packages/server/src/api/jobs/party-state.job.ts b/packages/server/src/api/jobs/party-state.job.ts new file mode 100644 index 0000000..9722a50 --- /dev/null +++ b/packages/server/src/api/jobs/party-state.job.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { PartyService, UpNextService } from '../services'; +import { Cron, CronController } from 'cron-decorators'; +import { Inject } from 'typedi'; + +@CronController('spotify-refresh') +export class PartyStateJob { + @Inject() + private readonly _upNextService: UpNextService; + + + @Inject() + private readonly _partyService: PartyService; + + + @Cron( + 'update-party-state', '*/1 * * * * *' + ) + async updatePartyState(): Promise { + const parties = await this._partyService.getAll(); + const partyStateMap = parties + .filter(p => p.spotifyAccount) + .map(async party => this._upNextService.partyLoopStuff(party)); + await Promise.all(partyStateMap); + } +} diff --git a/packages/server/src/api/jobs/spotify-refresh.job.ts b/packages/server/src/api/jobs/spotify-refresh.job.ts new file mode 100644 index 0000000..d72885f --- /dev/null +++ b/packages/server/src/api/jobs/spotify-refresh.job.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Logger } from '../../util/logger'; +import { PartyService, SpotifyAccountService } from '../services'; +import { Cron, CronController } from 'cron-decorators'; +import dayjs from 'dayjs'; +import { Inject } from 'typedi'; + +const log = new Logger(__filename); + +const REFRESH_MINUTE_RANGE = 5; + +@CronController('spotify-refresh') +export class SpotifyRefreshJob { + @Inject() + private readonly _spotifyAccountService: SpotifyAccountService; + + @Inject() + private readonly _partyService: PartyService; + + @Cron( + 'refresh-tokens', '* * * * *' + ) + async refreshTokens(): Promise { + const parties = await this._partyService.getAll(); + const partiesToBeRefreshed = parties.filter(p => dayjs(p.spotifyAccount.tokenExpire).diff( + dayjs(), 'minutes' + ) <= REFRESH_MINUTE_RANGE); + if (partiesToBeRefreshed.length > 0) { + log.info(`Refreshing ${partiesToBeRefreshed.length} parties.`); + await Promise.all(partiesToBeRefreshed.map(async party => + this._spotifyAccountService.refreshTokenFor(party))); + } + } +} diff --git a/packages/server/src/api/models/active-auth.ts b/packages/server/src/api/models/active-auth.ts new file mode 100644 index 0000000..2651204 --- /dev/null +++ b/packages/server/src/api/models/active-auth.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Party, User } from './'; +import { Type } from 'class-transformer'; +import { IsDate, IsObject, IsUUID, ValidateNested } from 'class-validator'; +import { ObjectType } from 'type-graphql'; +import { CreateDateColumn, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; + +@ObjectType({ + description: 'An active authentication session reference.', +}) +@Entity() +export class ActiveAuth { + @IsUUID() + @PrimaryGeneratedColumn('uuid') + id: string; + + @IsDate() + @CreateDateColumn({ type: 'timestamptz' }) + startedAt: Date; + + @Type(() => User) + @IsObject() + @ValidateNested() + @JoinColumn() + @OneToOne( + () => User, user => user.member, { + cascade: true, + onDelete: 'CASCADE', + } + ) + user: User; + + @Type(() => Party) + @IsObject() + @ValidateNested() + @ManyToOne( + () => Party, party => party.activeAuth, { onDelete: 'CASCADE' } + ) + party: Party; +} diff --git a/packages/server/src/api/models/index.ts b/packages/server/src/api/models/index.ts new file mode 100644 index 0000000..0610d9c --- /dev/null +++ b/packages/server/src/api/models/index.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './active-auth'; +export * from './member'; +export * from './party'; +export * from './playlist-entry'; +export * from './playlist-history'; +export * from './spotify-account'; +export * from './user'; +export * from './vote'; diff --git a/packages/server/src/api/models/member.ts b/packages/server/src/api/models/member.ts new file mode 100644 index 0000000..4bbcf31 --- /dev/null +++ b/packages/server/src/api/models/member.ts @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Party, PlaylistEntry, User, Vote } from './'; +import { Type } from 'class-transformer'; +import { IsArray, IsDate, IsInt, IsNotEmpty, IsObject, IsString, IsUUID, ValidateNested } from 'class-validator'; +import { Field, Int, ObjectType } from 'type-graphql'; +import { + Column, + CreateDateColumn, + Entity, + JoinColumn, + ManyToOne, + OneToMany, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm'; + +@ObjectType({ + description: 'A member links a user to a party', +}) +@Entity() +export class Member { + @IsUUID() + @PrimaryGeneratedColumn('uuid') + @Field({ description: 'The ID of member' }) + id: string; + + @IsDate() + @CreateDateColumn({ type: 'timestamptz' }) + @Field({ description: 'The date of when the member joined the party' }) + joinedAt: Date; + + @IsString() + @IsNotEmpty() + @Column() + @Field({ description: 'The username of the member' }) + username: string; + + @Type(() => User) + @IsObject() + @ValidateNested() + @JoinColumn() + @OneToOne( + () => User, user => user.member, { + cascade: true, + onDelete: 'CASCADE', + } + ) + @Field( + () => User, { description: 'The user map of the member' } + ) + user: User; + + @Type(() => Party) + @IsObject() + @ValidateNested() + @ManyToOne( + () => Party, party => party.members, { onDelete: 'CASCADE' } + ) + @Field( + () => Party, { description: 'The party that the member has joined' } + ) + party: Party; + + @IsInt() + @Column({ default: 0 }) + @Field( + () => Int, { defaultValue: 0, description: 'The score of the member' } + ) + score: number; + + @Type(() => Vote) + @IsArray() + @ValidateNested() + @OneToMany( + () => Vote, vote => vote.member, { cascade: true } + ) + @Field( + () => [ Vote ], { description: 'The Votes of the member' } + ) + votes: Array; + + @Type(() => PlaylistEntry) + @IsArray() + @ValidateNested() + @OneToMany( + () => PlaylistEntry, playlistEntry => playlistEntry.addedBy, { cascade: true } + ) + @Field( + () => [ PlaylistEntry ], { description: 'The playlist entries of the member' } + ) + playlistEntries: Array; +} diff --git a/packages/server/src/api/models/party.ts b/packages/server/src/api/models/party.ts new file mode 100644 index 0000000..659f07b --- /dev/null +++ b/packages/server/src/api/models/party.ts @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { ActiveAuth, Member, PlaylistEntry, PlaylistHistory, SpotifyAccount } from './'; +import { Type } from 'class-transformer'; +import { IsArray, IsDate, IsNotEmpty, IsObject, IsString, IsUUID, ValidateNested } from 'class-validator'; +import { Field, ObjectType } from 'type-graphql'; +import { Column, CreateDateColumn, Entity, OneToMany, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; + +@ObjectType({ + description: 'The party!', +}) +@Entity() +export class Party { + @IsUUID() + @PrimaryGeneratedColumn('uuid') + @Field({ description: 'The ID of party' }) + id: string; + + @IsString() + @IsNotEmpty() + @Column() + @Field({ description: 'The name of the party' }) + name: string; + + @IsString() + @IsNotEmpty() + @Column() + @Field({ description: 'The 4-digit code of the party' }) + code: string; + + @IsDate() + @CreateDateColumn({ type: 'timestamptz' }) + @Field({ description: 'The date when the party was created' }) + createdAt: Date; + + @IsString() + @IsNotEmpty() + @Column() + @Field({ description: 'The spotify playlist ID of the party' }) + spotifyPlaylistId: string; + + @Type(() => Member) + @IsArray() + @ValidateNested() + @OneToMany( + () => Member, member => member.party, { cascade: true } + ) + @Field( + () => [ Member ], { description: 'The party members' } + ) + members: Array; + + @Type(() => SpotifyAccount) + @IsObject() + @ValidateNested() + @OneToOne( + () => SpotifyAccount, spotifyAccount => spotifyAccount.party, { + cascade: true, + nullable: true, + onDelete: 'CASCADE' + } + ) + spotifyAccount: SpotifyAccount; + + @Type(() => PlaylistEntry) + @IsArray() + @ValidateNested() + @OneToMany( + () => PlaylistEntry, playlistEntry => playlistEntry.party, { cascade: true } + ) + @Field( + () => [ PlaylistEntry ], { description: 'The playlist of the party' } + ) + playlist: Array; + + @Type(() => PlaylistHistory) + @IsArray() + @ValidateNested() + @OneToMany( + () => PlaylistHistory, playlistHistory => playlistHistory.party, { cascade: true } + ) + @Field( + () => [ PlaylistHistory ], { description: 'The playlist of the party' } + ) + history: Array; + + @IsObject() + @ValidateNested() + @OneToOne( + () => ActiveAuth, activeAuth => activeAuth.party, { nullable: true, onDelete: 'CASCADE' } + ) + activeAuth: ActiveAuth; +} diff --git a/packages/server/src/api/models/playlist-entry.ts b/packages/server/src/api/models/playlist-entry.ts new file mode 100644 index 0000000..b6ac794 --- /dev/null +++ b/packages/server/src/api/models/playlist-entry.ts @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member } from './member'; +import { Party } from './party'; +import { Vote } from './vote'; +import { Type } from 'class-transformer'; +import { IsArray, IsDate, IsObject, IsString, IsUrl, IsUUID, ValidateNested } from 'class-validator'; +import { Field, ObjectType } from 'type-graphql'; +import { Column, CreateDateColumn, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; + +@ObjectType({ + description: 'A song to be played at the party', +}) +@Entity() +export class PlaylistEntry { + @IsUUID() + @PrimaryGeneratedColumn('uuid') + @Field({ description: 'The ID of entry' }) + id: string; + + @IsDate() + @CreateDateColumn({ type: 'timestamptz' }) + @Field({ description: 'The date when the song was added' }) + addedAt: Date; + + @IsString() + @Column() + @Field({ description: 'The name of the song' }) + name: string; + + @IsString() + @Column() + @Field({ description: 'The artist of the song' }) + artist: string; + + @IsUrl() + @Column() + @Field({ description: 'The url of the albumArtwork for the song' }) + albumArtwork: string; + + @IsString() + @Column() + @Field({ description: 'The spotifyId of the song' }) + spotifyId: string; + + @Type(() => Member) + @IsObject() + @ValidateNested() + @ManyToOne( + () => Member, member => member.playlistEntries, { onDelete: 'CASCADE' } + ) + @Field( + () => Member, { description: 'The member who added the song' } + ) + addedBy: Member; + + @Type(() => Party) + @IsObject() + @ValidateNested() + @ManyToOne( + () => Party, party => party.playlist, { onDelete: 'CASCADE' } + ) + @Field( + () => Party, { description: 'The party that the song was added to' } + ) + party: Party; + + + @Type(() => Vote) + @IsArray() + @ValidateNested() + @OneToMany( + () => Vote, vote => vote.playlistEntry, { cascade: true } + ) + @Field( + () => [ Vote ], { description: 'The Votes on the playlist entry' } + ) + votes: Array; +} diff --git a/packages/server/src/api/models/playlist-history.ts b/packages/server/src/api/models/playlist-history.ts new file mode 100644 index 0000000..787234d --- /dev/null +++ b/packages/server/src/api/models/playlist-history.ts @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Party } from './party'; +import { Type } from 'class-transformer'; +import { IsDate, IsObject, IsString, IsUrl, IsUUID, ValidateNested } from 'class-validator'; +import { Field, ObjectType } from 'type-graphql'; +import { Column, CreateDateColumn, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; + +@ObjectType({ + description: 'A song that has played at the party', +}) +@Entity() +export class PlaylistHistory { + @IsUUID() + @PrimaryGeneratedColumn('uuid') + @Field({ description: 'The ID of entry' }) + id: string; + + @IsDate() + @CreateDateColumn({ type: 'timestamptz' }) + @Field({ description: 'The date when the song was added' }) + playedAt: Date; + + @IsString() + @Column() + @Field({ description: 'The name of the song' }) + name: string; + + @IsString() + @Column() + @Field({ description: 'The artist of the song' }) + artist: string; + + @IsUrl() + @Column() + @Field({ description: 'The url of the albumArtwork for the song' }) + albumArtwork: string; + + @IsString() + @Column() + @Field({ description: 'The spotifyId of the song' }) + spotifyId: string; + + @Type(() => Party) + @IsObject() + @ValidateNested() + @ManyToOne( + () => Party, party => party.history, { onDelete: 'CASCADE' } + ) + @Field( + () => Party, { description: 'The party that the song was played at' } + ) + party: Party; +} diff --git a/packages/server/src/api/models/spotify-account.ts b/packages/server/src/api/models/spotify-account.ts new file mode 100644 index 0000000..c93afb2 --- /dev/null +++ b/packages/server/src/api/models/spotify-account.ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Party } from './party'; +import { IsDate, IsObject, IsString, IsUUID, ValidateNested } from 'class-validator'; +import { Field, ObjectType } from 'type-graphql'; +import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; + +@ObjectType({ + description: 'The user being controlled by the party', +}) +@Entity() +export class SpotifyAccount { + @IsUUID() + @PrimaryGeneratedColumn('uuid') + @Field({ description: 'The ID of account' }) + id: string; + + @IsString() + @Column() + @Field({ description: 'The spotify token' }) + token: string; + + @IsString() + @Column() + @Field({ description: 'The spotify refresh token' }) + refreshToken: string; + + @IsDate() + @Column({ type: 'timestamptz' }) + @Field({ description: 'The spotify token expiration' }) + tokenExpire: Date; + + @IsString() + @Column() + @Field({ description: 'The spotify user ID of the account' }) + spotifyUserId: string; + + @IsObject() + @ValidateNested() + @OneToOne( + () => Party, party => party.spotifyAccount, { onDelete: 'CASCADE' } + ) + @JoinColumn() + @Field( + () => Party, { description: 'The party controlling the user' } + ) + party: Party; +} diff --git a/packages/server/src/api/models/user.ts b/packages/server/src/api/models/user.ts new file mode 100644 index 0000000..3741194 --- /dev/null +++ b/packages/server/src/api/models/user.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { ActiveAuth, Member } from './'; +import { IsObject, IsString, IsUUID, ValidateNested } from 'class-validator'; +import { Field, ObjectType } from 'type-graphql'; +import { Column, Entity, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; + +@ObjectType({ + description: 'A user helps dampen spam by tracking fingerprints', +}) +@Entity() +export class User { + @IsUUID() + @PrimaryGeneratedColumn('uuid') + @Field({ description: 'The ID of user' }) + id: string; + + @IsString() + @Column() + @Field({ description: 'fingerprint of the user' }) + fingerprint: string; + + @IsObject() + @ValidateNested() + @OneToOne( + () => Member, member => member.user, { nullable: true, onDelete: 'CASCADE' } + ) + @Field( + () => Member, { description: 'The membership of a user', nullable: true } + ) + member: Member; + + @IsObject() + @ValidateNested() + @OneToOne( + () => ActiveAuth, activeAuth => activeAuth.user, { nullable: true, onDelete: 'CASCADE' } + ) + activeAuth: ActiveAuth; +} diff --git a/packages/server/src/api/models/vote.ts b/packages/server/src/api/models/vote.ts new file mode 100644 index 0000000..2114746 --- /dev/null +++ b/packages/server/src/api/models/vote.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, PlaylistEntry } from './'; +import { VoteTypeEnum } from '../types'; +import { IsEnum, IsObject, IsUUID, ValidateNested } from 'class-validator'; +import { Field, ObjectType } from 'type-graphql'; +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; + +@ObjectType({ + description: 'A vote on a playlist entry', +}) +@Entity() +export class Vote { + @IsUUID() + @PrimaryGeneratedColumn('uuid') + @Field({ description: 'The ID of vote' }) + id: string; + + @IsObject() + @ValidateNested() + @ManyToOne( + () => Member, member => member.votes, { onDelete: 'CASCADE' } + ) + @Field( + () => Member, { description: 'The member who voted' } + ) + member: Member; + + @IsEnum(VoteTypeEnum) + @Column( + 'enum', { enum: VoteTypeEnum } + ) + @Field( + () => VoteTypeEnum, { description: 'The type of vote' } + ) + type: VoteTypeEnum; + + @IsObject() + @ValidateNested() + @ManyToOne( + () => PlaylistEntry, playlistEntry => playlistEntry.votes, { onDelete: 'CASCADE' } + ) + @Field( + () => PlaylistEntry, { description: 'The entry being voted on' } + ) + playlistEntry: PlaylistEntry; +} diff --git a/packages/server/src/api/repositories/active-auth.repository.ts b/packages/server/src/api/repositories/active-auth.repository.ts new file mode 100644 index 0000000..c8be77b --- /dev/null +++ b/packages/server/src/api/repositories/active-auth.repository.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { ActiveAuth } from '../models'; +import { EntityRepository, Repository } from 'typeorm'; + +@EntityRepository(ActiveAuth) +export class ActiveAuthRepository extends Repository {} diff --git a/packages/server/src/api/repositories/index.ts b/packages/server/src/api/repositories/index.ts new file mode 100644 index 0000000..122e4c8 --- /dev/null +++ b/packages/server/src/api/repositories/index.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './active-auth.repository'; +export * from './member.repository'; +export * from './party.repository'; +export * from './playlist-entry.repository'; +export * from './playlist-history.repository'; +export * from './spotify-account.repository'; +export * from './user.repository'; +export * from './vote.repository'; diff --git a/packages/server/src/api/repositories/member.repository.ts b/packages/server/src/api/repositories/member.repository.ts new file mode 100644 index 0000000..72593bd --- /dev/null +++ b/packages/server/src/api/repositories/member.repository.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member } from '../models'; +import { EntityRepository, Repository } from 'typeorm'; + +@EntityRepository(Member) +export class MemberRepository extends Repository {} diff --git a/packages/server/src/api/repositories/party.repository.ts b/packages/server/src/api/repositories/party.repository.ts new file mode 100644 index 0000000..aed918c --- /dev/null +++ b/packages/server/src/api/repositories/party.repository.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Party } from '../models'; +import { EntityRepository, Repository } from 'typeorm'; + +@EntityRepository(Party) +export class PartyRepository extends Repository {} diff --git a/packages/server/src/api/repositories/playlist-entry.repository.ts b/packages/server/src/api/repositories/playlist-entry.repository.ts new file mode 100644 index 0000000..9b4dbc0 --- /dev/null +++ b/packages/server/src/api/repositories/playlist-entry.repository.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { PlaylistEntry } from '../models'; +import { EntityRepository, Repository } from 'typeorm'; + +@EntityRepository(PlaylistEntry) +export class PlaylistEntryRepository extends Repository {} diff --git a/packages/server/src/api/repositories/playlist-history.repository.ts b/packages/server/src/api/repositories/playlist-history.repository.ts new file mode 100644 index 0000000..de5c65e --- /dev/null +++ b/packages/server/src/api/repositories/playlist-history.repository.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { PlaylistHistory } from '../models'; +import { EntityRepository, Repository } from 'typeorm'; + +@EntityRepository(PlaylistHistory) +export class PlaylistHistoryRepository extends Repository {} diff --git a/packages/server/src/api/repositories/spotify-account.repository.ts b/packages/server/src/api/repositories/spotify-account.repository.ts new file mode 100644 index 0000000..bf40059 --- /dev/null +++ b/packages/server/src/api/repositories/spotify-account.repository.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { SpotifyAccount } from '../models'; +import { EntityRepository, Repository } from 'typeorm'; + +@EntityRepository(SpotifyAccount) +export class SpotifyAccountRepository extends Repository {} diff --git a/packages/server/src/api/repositories/user.repository.ts b/packages/server/src/api/repositories/user.repository.ts new file mode 100644 index 0000000..56cb281 --- /dev/null +++ b/packages/server/src/api/repositories/user.repository.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { User } from '../models'; +import { EntityRepository, Repository } from 'typeorm'; + +@EntityRepository(User) +export class UserRepository extends Repository {} diff --git a/packages/server/src/api/repositories/vote.repository.ts b/packages/server/src/api/repositories/vote.repository.ts new file mode 100644 index 0000000..790a568 --- /dev/null +++ b/packages/server/src/api/repositories/vote.repository.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Vote } from '../models'; +import { EntityRepository, Repository } from 'typeorm'; + +@EntityRepository(Vote) +export class VoteRepository extends Repository {} diff --git a/packages/server/src/api/resolvers/front.resolver.ts b/packages/server/src/api/resolvers/front.resolver.ts new file mode 100644 index 0000000..f3edd79 --- /dev/null +++ b/packages/server/src/api/resolvers/front.resolver.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../../environment'; +import { FrontConfigOutput } from './output'; +import { Query, Resolver } from 'type-graphql'; +import { Service } from 'typedi'; + +@Service() +@Resolver() +export class FrontResolver { + + @Query(() => FrontConfigOutput) + async config(): Promise { + return { + version: environment.front.version, + }; + } +} diff --git a/packages/server/src/api/resolvers/index.ts b/packages/server/src/api/resolvers/index.ts new file mode 100644 index 0000000..95ddfc6 --- /dev/null +++ b/packages/server/src/api/resolvers/index.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './front.resolver'; +export * from './member.resolver'; +export * from './party.resolver'; +export * from './playlist-entry.resolver'; +export * from './spotify-account.resolver'; +export * from './up-next.resolver'; +export * from './user.resolver'; +export * from './vote.resolver'; diff --git a/packages/server/src/api/resolvers/input/index.ts b/packages/server/src/api/resolvers/input/index.ts new file mode 100644 index 0000000..fe0f5d2 --- /dev/null +++ b/packages/server/src/api/resolvers/input/index.ts @@ -0,0 +1,5 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './party.input'; diff --git a/packages/server/src/api/resolvers/input/party.input.ts b/packages/server/src/api/resolvers/input/party.input.ts new file mode 100644 index 0000000..57137a9 --- /dev/null +++ b/packages/server/src/api/resolvers/input/party.input.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ +import { Field, InputType } from 'type-graphql'; + +@InputType() +export class PartyInput { + @Field() + name: string; +} diff --git a/packages/server/src/api/resolvers/member.resolver.ts b/packages/server/src/api/resolvers/member.resolver.ts new file mode 100644 index 0000000..5501274 --- /dev/null +++ b/packages/server/src/api/resolvers/member.resolver.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, PlaylistEntry, User, Vote } from '../models'; +import { MemberService } from '../services'; +import { FieldResolver, Query, Resolver, ResolverInterface, Root } from 'type-graphql'; +import { Service } from 'typedi'; + +@Service() +@Resolver(() => Member) +export class MemberResolver implements ResolverInterface{ + + constructor(private readonly _memberService: MemberService) {} + + @Query(() => [ Member ]) + async members(): Promise> { + return this._memberService.getAll(); + } + + @FieldResolver(() => User) + async user (@Root() member: Member): Promise { + return this._memberService.getUserFor(member); + } + + @FieldResolver(() => Party) + async party (@Root() member: Member): Promise { + return this._memberService.getPartyFor(member); + } + + @FieldResolver(() => [ Vote ]) + async votes (@Root() member: Member): Promise> { + return this._memberService.getVotesFor(member); + } + + @FieldResolver(() => [ PlaylistEntry ]) + async playlistEntries (@Root() member: Member): Promise> { + return this._memberService.getPlaylistEntriesFor(member); + } +} diff --git a/packages/server/src/api/resolvers/output/artwork-palette.output.ts b/packages/server/src/api/resolvers/output/artwork-palette.output.ts new file mode 100644 index 0000000..bad5a2d --- /dev/null +++ b/packages/server/src/api/resolvers/output/artwork-palette.output.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { ArtworkPalette } from '../../types'; +import { Field, ObjectType } from 'type-graphql'; + +@ObjectType({ + description: 'ArtworkPaletteOutput', +}) +export class ArtworkPaletteOutput implements ArtworkPalette { + @Field() + vibrant: string; + + @Field() + muted: string; + + @Field() + darkVibrant: string; + + @Field() + darkMuted: string; + + @Field() + lightVibrant: string; + + @Field() + lightMuted: string; +} diff --git a/packages/server/src/api/resolvers/output/featured-playlists.output.ts b/packages/server/src/api/resolvers/output/featured-playlists.output.ts new file mode 100644 index 0000000..3f821f0 --- /dev/null +++ b/packages/server/src/api/resolvers/output/featured-playlists.output.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Field, ObjectType } from 'type-graphql'; + +@ObjectType({ + description: 'FeaturedPlaylistsOutput', +}) +export class FeaturedPlaylistsOutput { + @Field() + message: string; +} diff --git a/packages/server/src/api/resolvers/output/front-config.output.ts b/packages/server/src/api/resolvers/output/front-config.output.ts new file mode 100644 index 0000000..76d86c7 --- /dev/null +++ b/packages/server/src/api/resolvers/output/front-config.output.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Field, Int, ObjectType } from 'type-graphql'; + +@ObjectType({ + description: 'FrontConfigOutput', +}) +export class FrontConfigOutput { + @Field(() => Int) + version: number; +} diff --git a/packages/server/src/api/resolvers/output/index.ts b/packages/server/src/api/resolvers/output/index.ts new file mode 100644 index 0000000..2cee2c6 --- /dev/null +++ b/packages/server/src/api/resolvers/output/index.ts @@ -0,0 +1,8 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './artwork-palette.output'; +export * from './featured-playlists.output'; +export * from './front-config.output'; +export * from './party-state.output'; diff --git a/packages/server/src/api/resolvers/output/party-state.output.ts b/packages/server/src/api/resolvers/output/party-state.output.ts new file mode 100644 index 0000000..951c290 --- /dev/null +++ b/packages/server/src/api/resolvers/output/party-state.output.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { ArtworkPaletteOutput } from './artwork-palette.output'; +import { PartyState } from '../../types'; +import { Field, Int, ObjectType } from 'type-graphql'; + +@ObjectType({ + description: 'PartyStateOutput', +}) +export class PartyStateOutput implements PartyState { + @Field({ nullable: true }) + name?: string; + + @Field( + () => Int, { nullable: true } + ) + progress?: number; + + @Field( + () => Int, { nullable: true } + ) + duration?: number; + + @Field({ nullable: true }) + playing?: boolean; + + @Field({ nullable: true }) + spotifyId?: string; + + @Field({ nullable: true }) + artwork?: string; + + @Field({ nullable: true }) + artist?: string; + + @Field( + () => ArtworkPaletteOutput, { nullable: true } + ) + palette?: ArtworkPaletteOutput + +} diff --git a/packages/server/src/api/resolvers/party.resolver.ts b/packages/server/src/api/resolvers/party.resolver.ts new file mode 100644 index 0000000..b1e5810 --- /dev/null +++ b/packages/server/src/api/resolvers/party.resolver.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, PlaylistEntry } from '../models'; +import { PartyService } from '../services'; +import { Arg, FieldResolver, Mutation, Query, Resolver, ResolverInterface, Root } from 'type-graphql'; +import { Service } from 'typedi'; + +@Service() +@Resolver(() => Party) +export class PartyResolver implements ResolverInterface{ + + constructor(private readonly _partyService: PartyService) {} + + @Query(() => Party) + async partyById(@Arg('id') id: string): Promise { + return this._partyService.getById(id); + } + + @Query(() => Party) + async partyByCode(@Arg('code') code: string): Promise { + return this._partyService.getByCode(code); + } + + @FieldResolver(() => [ Member ]) + async members (@Root() party: Party): Promise> { + return this._partyService.getMembersFor(party); + } + + @FieldResolver(() => [ PlaylistEntry ]) + async playlist(@Root() party: Party): Promise> { + return this._partyService.getPlaylistFor(party); + } + + @Mutation(() => Party) + async startParty(@Arg('partyName') partyName: string): Promise { + return this._partyService.createParty(partyName); + } +} diff --git a/packages/server/src/api/resolvers/playlist-entry.resolver.ts b/packages/server/src/api/resolvers/playlist-entry.resolver.ts new file mode 100644 index 0000000..4f73480 --- /dev/null +++ b/packages/server/src/api/resolvers/playlist-entry.resolver.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, PlaylistEntry, Vote } from '../models'; +import { PlaylistEntryService } from '../services'; +import { FieldResolver, Query, Resolver, ResolverInterface, Root } from 'type-graphql'; +import { Service } from 'typedi'; + +@Service() +@Resolver(() => PlaylistEntry) +export class PlaylistEntryResolver implements ResolverInterface { + + constructor(private readonly _playlistEntryService: PlaylistEntryService) {} + + @Query(() => [ PlaylistEntry ]) + async playlistEntries(): Promise> { + return this._playlistEntryService.getAll(); + } + + @FieldResolver(() => Member) + async addedBy (@Root() playlistEntry: PlaylistEntry): Promise { + return this._playlistEntryService.getAddedByFor(playlistEntry); + } + + @FieldResolver(() => Party) + async party (@Root() playlistEntry: PlaylistEntry): Promise { + return this._playlistEntryService.getPartyFor(playlistEntry); + } + + @FieldResolver(() => [ Vote ]) + async votes (@Root() playlistEntry: PlaylistEntry): Promise> { + return this._playlistEntryService.getVotesFor(playlistEntry); + } +} diff --git a/packages/server/src/api/resolvers/spotify-account.resolver.ts b/packages/server/src/api/resolvers/spotify-account.resolver.ts new file mode 100644 index 0000000..9a36733 --- /dev/null +++ b/packages/server/src/api/resolvers/spotify-account.resolver.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Party, SpotifyAccount } from '../models'; +import { SpotifyAccountService } from '../services'; +import { FieldResolver, Query, Resolver, ResolverInterface, Root } from 'type-graphql'; +import { Service } from 'typedi'; + +@Service() +@Resolver(() => SpotifyAccount) +export class SpotifyAccountResolver implements ResolverInterface { + + constructor(private readonly _spotifyAccountService: SpotifyAccountService) {} + + @Query(() => [ SpotifyAccount ]) + async spotifyAccounts(): Promise> { + return this._spotifyAccountService.getAll(); + } + + @FieldResolver(() => Party) + async party (@Root() spotifyAccount: SpotifyAccount): Promise { + return this._spotifyAccountService.getPartyFor(spotifyAccount); + } +} diff --git a/packages/server/src/api/resolvers/up-next.resolver.ts b/packages/server/src/api/resolvers/up-next.resolver.ts new file mode 100644 index 0000000..2d5549a --- /dev/null +++ b/packages/server/src/api/resolvers/up-next.resolver.ts @@ -0,0 +1,204 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, PlaylistEntry, PlaylistHistory } from '../models'; +import { PartyStateOutput } from './output'; +import { AuthService, FullArtist, PartyService, UpNextService } from '../services'; +import { Album, FeaturedPlaylists, Playlist as PlaylistObject, SearchResultAll, Track } from '../spotify'; +import { Context } from '../types'; +import GraphQLJSON from 'graphql-type-json'; +import { Arg, Authorized, Ctx, Mutation, Query, Resolver } from 'type-graphql'; +import { Service } from 'typedi'; + +@Service() +@Resolver() +export class UpNextResolver { + + constructor( + private readonly _upNextService: UpNextService, + private readonly _authService: AuthService, + private readonly _partyService: PartyService, + ) {} + + + @Mutation(() => String) + async startAuth( + @Arg('userId') userId: string, + @Arg('partyId') partyId: string + ): Promise { + return this._authService.startAuthGetRedirectUrl( + userId, + partyId + ); + } + + @Query( + () => Party, + { nullable: true } + ) + async checkForMembership(@Arg('userId') userId: string): Promise { + return this._upNextService.checkForMembership(userId); + } + + @Query(() => Boolean) + @Authorized() + async validToken(@Ctx() context: Context): Promise { + return !!context.member; + } + + @Query(() => [ Member ]) + @Authorized() + async members(@Ctx() context: Context): Promise> { + return this._partyService.getMembersFor(context.party); + } + + @Query(() => [ PlaylistHistory ]) + @Authorized() + async history(@Ctx() context: Context): Promise> { + return this._partyService.getHistoryFor(context.party); + } + + @Query(() => Party) + @Authorized() + async party(@Ctx() context: Context): Promise { + return this._partyService.getById(context.party.id); + } + + @Query(() => GraphQLJSON) + @Authorized() + async spotifyRecommendations(@Ctx() context: Context): Promise { + return this._upNextService.getRecommendations(context.party); + } + + @Query( + () => PartyStateOutput, { nullable: true } + ) + @Authorized() + async partyState(@Ctx() context: Context): Promise { + return this._upNextService.getPartyState(context.party); + } + + @Mutation(() => String) + async joinParty( + @Arg('partyCode') partyCode: string, + @Arg('username') username: string, + @Arg('userId') userId: string + ): Promise { + return this._upNextService.joinParty( + partyCode, + username, + userId + ); + } + + @Mutation(() => String) + async leaveParty(@Arg('userId') userId: string): Promise { + await this._upNextService.leaveParty(userId); + return userId; + } + + @Query(() => GraphQLJSON) + @Authorized() + async spotifySong( + @Ctx() context: Context, + @Arg('songId') songId: string, + ): Promise { + return this._upNextService.getSpotifySong( + context.party, + songId + ); + } + + @Query(() => GraphQLJSON) + @Authorized() + async spotifyPlaylist( + @Ctx() context: Context, + @Arg('playlistId') playlistId: string, + ): Promise { + return this._upNextService.getSpotifyPlaylist( + context.party, + playlistId + ); + } + + @Query(() => GraphQLJSON) + @Authorized() + async spotifyAlbum( + @Ctx() context: Context, + @Arg('albumId') albumId: string, + ): Promise { + return this._upNextService.getSpotifyAlbum( + context.party, + albumId + ); + } + + @Query(() => GraphQLJSON) + @Authorized() + async spotifyArtist( + @Ctx() context: Context, + @Arg('artistId') artistId: string, + ): Promise { + return this._upNextService.getSpotifyArtist( + context.party, + artistId + ); + } + + @Query(() => GraphQLJSON) + @Authorized() + async spotifySearch( + @Ctx() context: Context, + @Arg('query') query: string, + ): Promise { + return this._upNextService.searchSpotify( + context.party, + query + ); + } + + @Query(() => [ PlaylistEntry ]) + @Authorized() + async queue(@Ctx() context: Context): Promise> { + return this._partyService.getPlaylistFor(context.party); + } + + @Mutation(() => String) + @Authorized() + async addToQueue( + @Ctx() context: Context, + @Arg('songId') songId: string, + ): Promise { + await this._upNextService.addToPlaylist( + context.party, + context.member, + songId + ); + return songId; + } + + @Mutation(() => PlaylistEntry) + @Authorized() + async upvote( + @Ctx() context: Context, + @Arg('entryId') entryId: string, + ): Promise { + return this._upNextService.upvote( + context.member, + entryId + ); + } + + @Mutation(() => PlaylistEntry) + @Authorized() + async downvote( + @Ctx() context: Context, + @Arg('entryId') entryId: string, + ): Promise { + return this._upNextService.downvote( + context.member, + entryId + ); + } +} diff --git a/packages/server/src/api/resolvers/user.resolver.ts b/packages/server/src/api/resolvers/user.resolver.ts new file mode 100644 index 0000000..29ed908 --- /dev/null +++ b/packages/server/src/api/resolvers/user.resolver.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, User } from '../models'; +import { UserService } from '../services'; +import { Arg, FieldResolver, Mutation, Query, Resolver, ResolverInterface, Root } from 'type-graphql'; +import { Service } from 'typedi'; + +@Service() +@Resolver(() => User) +export class UserResolver implements ResolverInterface { + + constructor(private readonly _userService: UserService) {} + + @Query(() => [ User ]) + async users(): Promise> { + return this._userService.getAll(); + } + + @FieldResolver(() => Member) + async member(@Root() user: User): Promise { + return this._userService.getMemberFor(user); + } + + @Mutation(() => User) + async registerFingerprint(@Arg('fingerprint') fingerprint: string): Promise { + return this._userService.newUser(fingerprint); + } +} diff --git a/packages/server/src/api/resolvers/vote.resolver.ts b/packages/server/src/api/resolvers/vote.resolver.ts new file mode 100644 index 0000000..c5ce59b --- /dev/null +++ b/packages/server/src/api/resolvers/vote.resolver.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, PlaylistEntry, Vote } from '../models'; +import { VoteService } from '../services'; +import { FieldResolver, Resolver, ResolverInterface, Root } from 'type-graphql'; +import { Service } from 'typedi'; + +@Service() +@Resolver(() => Vote) +export class VoteResolver implements ResolverInterface { + + constructor(private readonly _voteService: VoteService) {} + + @FieldResolver(() => Member) + async member (@Root() vote: Vote): Promise { + return this._voteService.getMemberFor(vote); + } + + @FieldResolver(() => PlaylistEntry) + async playlistEntry (@Root() vote: Vote): Promise { + return this._voteService.getPlaylistEntryFor(vote); + } +} diff --git a/packages/server/src/api/services/active-auth.service.ts b/packages/server/src/api/services/active-auth.service.ts new file mode 100644 index 0000000..6a2a7da --- /dev/null +++ b/packages/server/src/api/services/active-auth.service.ts @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { ActiveAuth, Party, User } from '../models'; +import { ActiveAuthRepository } from '../repositories'; +import { Service } from 'typedi'; +import { OrmRepository } from 'typeorm-typedi-extensions'; + +@Service() +export class ActiveAuthService { + + constructor(@OrmRepository() private readonly _activeAuthRepository: ActiveAuthRepository) {} + + async getByUser(user: User): Promise { + return this._activeAuthRepository.findOne({ + where: { + user + } + }); + } + + async startNewAuth( + user: User, + party: Party + ): Promise { + const active = await this.getByUser(user); + if (active) { + return active; + } + + return this._activeAuthRepository.save({ + party, + user + }); + } + + async getById(authId: string): Promise { + return this._activeAuthRepository.findOne({ + relations: [ + 'party', + 'user' + ], + where: { + id: authId + } + }); + } + + async remove(activeAuth: ActiveAuth): Promise { + await this._activeAuthRepository.remove(activeAuth); + } +} diff --git a/packages/server/src/api/services/auth.service.ts b/packages/server/src/api/services/auth.service.ts new file mode 100644 index 0000000..76b8732 --- /dev/null +++ b/packages/server/src/api/services/auth.service.ts @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import 'reflect-metadata'; + +import { environment } from '../../environment'; +import { + ActiveAuthService, + PartyService, + SpotifyAccountService, + SpotifyService, + TokenService, + UserService, +} from '../services'; +import { SCOPES } from '../spotify'; +import dayjs from 'dayjs'; +import { Inject, Service } from 'typedi'; +import validator from 'validator'; + +export interface ActiveAuthToken { + authId: string; +} + +@Service() +export class AuthService { + private static readonly AUTH_SCOPES = [ + SCOPES.USER_READ_PLAYBACK_STATE, + SCOPES.USER_MODIFY_PLAYBACK_STATE, + SCOPES.USER_READ_CURRENTLY_PLAYING, + SCOPES.STREAMING, + SCOPES.USER_READ_EMAIL, + SCOPES.USER_READ_PRIVATE, + SCOPES.PLAYLIST_MODIFY_PUBLIC, + SCOPES.USER_READ_PLAYBACK_POSITION, + SCOPES.APP_REMOTE_CONTROL + ].join(' '); + + constructor( + // So some strange bug is forcing me to manually define the Injected Services, + // EXCEPT SOME OF THEM???? + @Inject(type => UserService) private readonly _userService: UserService, + @Inject(type => SpotifyService) private readonly _spotifyService: SpotifyService, + private readonly _activeAuthService: ActiveAuthService, + @Inject(type => SpotifyAccountService) private readonly _spotifyAccountService: SpotifyAccountService, + @Inject(type => PartyService) private readonly _partyService: PartyService, + @Inject(type => TokenService) private readonly _tokenService: TokenService + ) {} + + async startAuthGetRedirectUrl( + userId: string, + partyId: string + ): Promise { + if (!userId || !validator.isUUID(userId)) { + throw new Error('Invalid User ID'); + } + + if (!partyId || !validator.isUUID(partyId)) { + throw new Error('Invalid User ID'); + } + + const user = await this._userService.getById(userId); + + if (!user) { + throw new Error('User does not exist'); + } + + const party = await this._partyService.getById(partyId); + + if (!party) { + throw new Error('Party does not exist'); + } + + const account = await this._partyService.getSpotifyAccountFor(party); + + if (account) { + throw new Error('Party already authenticated'); + } + + const activeAuth = await this._activeAuthService.startNewAuth( + user, + party + ); + + const token = this._tokenService.generate({ authId: activeAuth.id }); + + return this._spotifyService.spotifyApis.auth.getAuthStartURL( + environment.spotify.clientID, + environment.spotify.redirectURI, + token, + AuthService.AUTH_SCOPES + ); + } + + async oAuthCallback( + code: string, state: string + ): Promise { + const x = await this._spotifyService.spotifyApis.auth.authorizationCode( + environment.spotify.clientID, + environment.spotify.clientSecret, + code, + environment.spotify.redirectURI + ); + + const spotifyUser = await this._spotifyService.spotifyApis.users.getCurrent(x.access_token); + + const parsedState = this._tokenService.verify(state); + const activeAuth = await this._activeAuthService.getById(parsedState.authId); + if (!activeAuth) { + throw new Error('Invalid authentication session'); + } + + const party = await this._partyService.getById(activeAuth.party.id); + + const playlist = await this._spotifyService.spotifyApis.playlist.create( + x.access_token, spotifyUser.id, { + collaborative: false, + description: 'Playlist generated by UpNext.cool', + name: party.name, + public: true + } + ); + + await this._partyService.updateParty({ + id: party.id, + spotifyPlaylistId: playlist.id + }); + + await this._spotifyAccountService.addAccount({ + party, + refreshToken: x.refresh_token, + spotifyUserId: spotifyUser.id, + token: x.access_token, + tokenExpire: dayjs().add( + x.expires_in, + 'seconds' + ).toDate() + }); + await this._activeAuthService.remove(activeAuth); + + return party.code; + } +} diff --git a/packages/server/src/api/services/index.ts b/packages/server/src/api/services/index.ts new file mode 100644 index 0000000..f83428a --- /dev/null +++ b/packages/server/src/api/services/index.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './active-auth.service'; +export * from './auth.service'; +export * from './member.service'; +export * from './party.service'; +export * from './party-state.service'; +export * from './playlist-entry.service'; +export * from './qr.service'; +export * from './spotify.service'; +export * from './spotify-account.service'; +export * from './token.service'; +export * from './up-next.service'; +export * from './user.service'; +export * from './vote.service'; diff --git a/packages/server/src/api/services/member.service.ts b/packages/server/src/api/services/member.service.ts new file mode 100644 index 0000000..8c91201 --- /dev/null +++ b/packages/server/src/api/services/member.service.ts @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, PlaylistEntry, User, Vote } from '../models'; +import { MemberRepository } from '../repositories'; +import { Service } from 'typedi'; +import { OrmRepository } from 'typeorm-typedi-extensions'; + +@Service() +export class MemberService { + constructor(@OrmRepository() private readonly _memberRepository: MemberRepository) {} + + async getAll(): Promise> { + return this._memberRepository.find(); + } + + async getById(id: string): Promise { + return this._memberRepository.findOne({ + where: { + id + } + }); + } + + async getByUser(user: User): Promise { + return this._memberRepository.findOne({ + where: { + user + } + }); + } + + async getByUsername(username: string): Promise { + return this._memberRepository.findOne({ + where: { + username + } + }); + } + + async getByAllByParty(party: Party): Promise> { + return this._memberRepository.find({ + where: { + party + } + }); + } + + async getPartyFor(member: Member): Promise { + const m = await this._memberRepository.findOne({ relations: [ 'party' ], where: { id: member.id } }); + return m.party; + } + + async getUserFor(member: Member): Promise { + const m = await this._memberRepository.findOne({ relations: [ 'user' ], where: { id: member.id } }); + return m.user; + } + + async getVotesFor(member: Member): Promise> { + const m = await this._memberRepository.findOne({ relations: [ 'votes' ], where: { id: member.id } }); + return m.votes; + } + + async getPlaylistEntriesFor(member: Member): Promise> { + const m = await this._memberRepository.findOne({ relations: [ 'playlistEntries' ], where: { id: member.id } }); + return m.playlistEntries; + } + + async new(member: Partial): Promise { + const m = await this.getByUser(member.user); + if (m) { + return m; + } + return this._memberRepository.save(member); + } + + async remove(member: Member): Promise { + await this._memberRepository.remove(member); + } +} diff --git a/packages/server/src/api/services/party-state.service.ts b/packages/server/src/api/services/party-state.service.ts new file mode 100644 index 0000000..01fff49 --- /dev/null +++ b/packages/server/src/api/services/party-state.service.ts @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Party } from '../models'; +import { CurrentlyPlaying } from '../spotify'; +import { ArtworkPalette, PartyState, PartyStateEnum } from '../types'; +import Vibrant from 'node-vibrant'; +import { Service } from 'typedi'; + +export interface StoredState { + state: PartyStateEnum; + currentlyPlaying: CurrentlyPlaying; + partyState: PartyState; +} + +@Service() +export class PartyStateService { + private _partySpotifyStates: Map = new Map(); + + setStateFor( + party: Party, + state: StoredState + ): void { + this._partySpotifyStates.set( + party.id, state + ); + } + + getStateFor(party: Party): StoredState { + return this._partySpotifyStates.has(party.id) + ? this._partySpotifyStates.get(party.id) + : undefined; + } + + private _nextSongQueue: Map + = new Map(); + + setNextSongQueued( + party: Party, + spotifyId: string + ): void { + this._nextSongQueue.set( + party.id, { isQueued: true, spotifyId } + ); + } + + setEmptyNextSongQueue(party: Party): void { + this._nextSongQueue.set( + party.id, + { isQueued: false, spotifyId: '' } + ); + } + + hasSongQueued(party: Party): boolean { + const x = this._nextSongQueue.get(party.id); + return x ? x.isQueued:false; + } + + updateState( + previousState: PartyState, + newState: Partial + ): PartyState { + return { + ...previousState, + ...newState + }; + } + + async computePalette(artwork: string): Promise { + const palette = await Vibrant.from(artwork).getSwatches(); + return { + darkMuted: palette.DarkMuted.hex, + darkVibrant: palette.DarkVibrant.hex, + lightMuted: palette.LightMuted.hex, + lightVibrant: palette.LightVibrant.hex, + muted: palette.Muted.hex, + vibrant: palette.Vibrant.hex, + }; + } +} diff --git a/packages/server/src/api/services/party.service.ts b/packages/server/src/api/services/party.service.ts new file mode 100644 index 0000000..ae6144d --- /dev/null +++ b/packages/server/src/api/services/party.service.ts @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, PlaylistEntry, PlaylistHistory, SpotifyAccount } from '../models'; +import { PartyRepository } from '../repositories'; +import { Service } from 'typedi'; +import { OrmRepository } from 'typeorm-typedi-extensions'; + +@Service() +export class PartyService { + constructor(@OrmRepository() private readonly _partyRepository: PartyRepository) {} + + async getAll(): Promise> { + return this._partyRepository.find({ + relations: [ 'spotifyAccount' ] + }); + } + + async getById(id: string): Promise { + return this._partyRepository.findOne({ + where: { + id + } + }); + } + + async getByCode(code: string): Promise { + return this._partyRepository.findOne({ + where: { + code: code.toUpperCase() + } + }); + } + + async getPlaylistFor(party: Party): Promise> { + const p = await this._partyRepository.findOne({ relations: [ + 'playlist', + 'playlist.votes' + ], where: { id: party.id } }); + return p.playlist; + } + + async getMembersFor(party: Party): Promise> { + const p = await this._partyRepository.findOne({ relations: [ 'members' ], where: { id: party.id } }); + return p.members; + } + + async getSpotifyAccountFor(party: Party): Promise { + const p = await this._partyRepository.findOne({ relations: [ 'spotifyAccount' ], where: { id: party.id } }); + return p.spotifyAccount; + } + + async createParty(name: string): Promise { + return this._partyRepository.save({ + code: this.generateCode(), + name, + spotifyPlaylistId: '' + }); + } + + private generateCode(): string { + const ALL = '1234567890'.toUpperCase(); + return [ ...'XXXX' ].map(() => ALL[Math.floor(Math.random() * ALL.length)]).join(''); + } + + async updateParty(party: Partial) { + await this._partyRepository.update( + party.id, + party + ); + } + + async getHistoryFor(party: Party): Promise> { + const p = await this._partyRepository.findOne({ relations: [ 'history' ], where: { id: party.id } }); + return p.history; + } +} diff --git a/packages/server/src/api/services/playlist-entry.service.ts b/packages/server/src/api/services/playlist-entry.service.ts new file mode 100644 index 0000000..10327cf --- /dev/null +++ b/packages/server/src/api/services/playlist-entry.service.ts @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, PlaylistEntry, Vote } from '../models'; +import { PlaylistEntryRepository } from '../repositories'; +import { Service } from 'typedi'; +import { OrmRepository } from 'typeorm-typedi-extensions'; + +@Service() +export class PlaylistEntryService { + constructor(@OrmRepository() private readonly _playlistEntryRepository: PlaylistEntryRepository) {} + + async getAll(): Promise> { + return this._playlistEntryRepository.find(); + } + + async getById(id: string): Promise { + return this._playlistEntryRepository.findOne({ + relations: [ + 'votes', + 'votes.member', + 'addedBy' + ], + where: { + id + } + }); + } + + async getAddedByFor(playlistEntry: PlaylistEntry): Promise { + const m = await this._playlistEntryRepository.findOne({ relations: [ 'addedBy' ], where: { id: playlistEntry.id } }); + return m.addedBy; + } + + async getPartyFor(playlistEntry: PlaylistEntry): Promise { + const m = await this._playlistEntryRepository.findOne({ relations: [ 'party' ], where: { id: playlistEntry.id } }); + return m.party; + } + + async getVotesFor(playlistEntry: PlaylistEntry): Promise> { + const m = await this._playlistEntryRepository.findOne({ relations: [ 'votes' ], where: { id: playlistEntry.id } }); + return m.votes; + } + + async newEntry(entry: Partial): Promise { + return this._playlistEntryRepository.save(entry); + } + + async update(entry: PlaylistEntry): Promise { + return this._playlistEntryRepository.save(entry); + } + + async remove(nextSong: PlaylistEntry): Promise { + await this._playlistEntryRepository.remove(nextSong); + } +} diff --git a/packages/server/src/api/services/playlist-history.service.ts b/packages/server/src/api/services/playlist-history.service.ts new file mode 100644 index 0000000..e838b54 --- /dev/null +++ b/packages/server/src/api/services/playlist-history.service.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { PlaylistHistory } from '../models'; +import { PlaylistHistoryRepository } from '../repositories'; +import { Service } from 'typedi'; +import { OrmRepository } from 'typeorm-typedi-extensions'; + +@Service() +export class PlaylistHistoryService { + constructor(@OrmRepository() private readonly _playlistHistoryRepository: PlaylistHistoryRepository) {} + + async addToHistory(entry: Partial): Promise { + return this._playlistHistoryRepository.save(entry); + } +} diff --git a/packages/server/src/api/services/qr.service.ts b/packages/server/src/api/services/qr.service.ts new file mode 100644 index 0000000..4a180e8 --- /dev/null +++ b/packages/server/src/api/services/qr.service.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import QRCode from 'qrcode'; +import { Service } from 'typedi'; + +@Service() +export class QRService { + + public async generateFrom( + data: string, dark: string, light: string + ): Promise { + return QRCode.toDataURL( + data, { color: { dark, light }, errorCorrectionLevel: 'H' } + ); + } + +} diff --git a/packages/server/src/api/services/spotify-account.service.ts b/packages/server/src/api/services/spotify-account.service.ts new file mode 100644 index 0000000..e6a5646 --- /dev/null +++ b/packages/server/src/api/services/spotify-account.service.ts @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../../environment'; +import { Party, SpotifyAccount } from '../models'; +import { SpotifyAccountRepository } from '../repositories'; +import { SpotifyService } from './spotify.service'; +import dayjs from 'dayjs'; +import { Service } from 'typedi'; +import { OrmRepository } from 'typeorm-typedi-extensions'; + +@Service() +export class SpotifyAccountService { + constructor( + @OrmRepository() private readonly _spotifyAccountRepository: SpotifyAccountRepository, + private readonly _spotifyService: SpotifyService + ) {} + + async getAll(): Promise> { + return this._spotifyAccountRepository.find(); + } + + async getById(id: string): Promise { + return this._spotifyAccountRepository.findOne({ + where: { + id + } + }); + } + + async getPartyFor(spotifyAccount: SpotifyAccount): Promise { + const sa = await this._spotifyAccountRepository.findOne({ + relations: [ 'party' ], + where: { + id: spotifyAccount.id + } + }); + return sa.party; + } + + async addAccount(spotifyAccount: Partial): Promise { + return this._spotifyAccountRepository.save(spotifyAccount); + } + + async refreshTokenFor(party: Party): Promise { + const tt = await this._spotifyService.spotifyApis.auth.refreshAuthToken( + environment.spotify.clientID, + environment.spotify.clientSecret, + party.spotifyAccount.refreshToken + ); + await this._spotifyAccountRepository.update( + { id: party.spotifyAccount.id }, + { + token: tt.access_token, + tokenExpire: dayjs().add( + tt.expires_in, + 'seconds' + ).toDate() + } + ); + } +} diff --git a/packages/server/src/api/services/spotify.service.ts b/packages/server/src/api/services/spotify.service.ts new file mode 100644 index 0000000..d72e938 --- /dev/null +++ b/packages/server/src/api/services/spotify.service.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Albums, Artists, Auth, Browse, Library, Player, Playlists, Search, Tracks, Users } from '../spotify'; +import { Service } from 'typedi'; + +export interface SpotifyApis { + albums: Albums, + artists: Artists, + auth: Auth, + browse: Browse, + library: Library, + player: Player, + playlist: Playlists, + search: Search, + tracks: Tracks, + users: Users, +} + + +@Service() +export class SpotifyService { + private readonly _spotifyApis: SpotifyApis = { + albums: new Albums(), + artists: new Artists(), + auth: new Auth(), + browse: new Browse(), + library: new Library(), + player: new Player(), + playlist: new Playlists(), + search: new Search(), + tracks: new Tracks(), + users: new Users(), + }; + + get spotifyApis(): SpotifyApis { + return this._spotifyApis; + } +} diff --git a/packages/server/src/api/services/token.service.ts b/packages/server/src/api/services/token.service.ts new file mode 100644 index 0000000..a4a43c0 --- /dev/null +++ b/packages/server/src/api/services/token.service.ts @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../../environment'; +import { sign, SignOptions, verify, VerifyOptions } from 'jsonwebtoken'; +import { Service } from 'typedi'; + +@Service() +export class TokenService { + private static readonly ALGORITHM = 'HS512'; + + private static readonly EXPIRY = '24h'; + + private static readonly ISSUER = environment.app.name; + + private readonly secretKey: string = environment.app.key; + + private readonly encryptionOptions: SignOptions = { + algorithm: TokenService.ALGORITHM, + expiresIn: TokenService.EXPIRY, + issuer: TokenService.ISSUER + }; + + private readonly decryptionOptions: VerifyOptions = { + algorithms: [ TokenService.ALGORITHM ], + issuer: TokenService.ISSUER + }; + + public generate( + data: T, + expire: string = TokenService.EXPIRY + ): string { + return sign( + data, + this.secretKey, + { + ...this.encryptionOptions, + expiresIn: expire + } as SignOptions + ); + } + + public verify(jwt: string): T { + try { + return verify( + jwt, + this.secretKey, + this.decryptionOptions + ); + } catch (error_) { + throw new Error(`Invalid token.\n${error_.name}\n${error_.message}`); + } + } +} diff --git a/packages/server/src/api/services/up-next.service.ts b/packages/server/src/api/services/up-next.service.ts new file mode 100644 index 0000000..1d95802 --- /dev/null +++ b/packages/server/src/api/services/up-next.service.ts @@ -0,0 +1,428 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, PlaylistEntry } from '../models'; +import { MemberService } from './member.service'; +import { PartyService } from './party.service'; +import { PartyStateService } from './party-state.service'; +import { PlaylistEntryService } from './playlist-entry.service'; +import { PlaylistHistoryService } from './playlist-history.service'; +import { SpotifyService } from './spotify.service'; +import { TokenService } from './token.service'; +import { UserService } from './user.service'; +import { VoteService } from './vote.service'; +import { + Album, + Artist, + CurrentlyPlaying, + FeaturedPlaylists, + Playlist as PlaylistObject, + SearchResultAll, + SimplifiedAlbum, + Track, + TrackArray, +} from '../spotify'; +import { + AccessToken, + PartyState, + PartyStateEnum, + VoteTypeEnum, +} from '../types'; +import { Service } from 'typedi'; + +export interface FullArtist { + info: Artist; + tracks: TrackArray; + albums: Array; +} + +@Service() +export class UpNextService { + constructor( + private readonly _memberService: MemberService, + private readonly _userService: UserService, + private readonly _partyService: PartyService, + private readonly _tokenService: TokenService, + private readonly _spotifyService: SpotifyService, + private readonly _partyStateService: PartyStateService, + private readonly _playlistEntryService: PlaylistEntryService, + private readonly _voteService: VoteService, + private readonly _playlistHistoryService: PlaylistHistoryService + ) {} + + async joinParty( + partyCode: string, + username: string, + userId: string + ): Promise { + const user = await this._userService.getById(userId); + const party = await this._partyService.getByCode(partyCode); + + if (!user) { + throw new Error('User does not exist'); + } + + if (!party) { + throw new Error('Party does not exist'); + } + + const activeMember = await this._userService.getMemberFor(user); + + if (activeMember) { + throw new Error("Cannot join a party you're already a member of"); + } + + const member = await this._memberService.new({ + party, + user, + username, + }); + + return this._tokenService.generate({ memberId: member.id }); + } + + // If the user is already a member of a party, return the party + async checkForMembership(userId: string): Promise { + const user = await this._userService.getById(userId); + if (!user) { + throw new Error('User does not exist'); + } + const member = await this._memberService.getByUser(user); + + if (member) { + return this._memberService.getPartyFor(member); + } + + return undefined; + } + + async leaveParty(userId: string): Promise { + const user = await this._userService.getById(userId); + const m = await this._memberService.getByUser(user); + if (!m) { + throw new Error("Cannot leave party you aren't a member of"); + } + await this._memberService.remove(m); + } + + async getRecommendations(party: Party): Promise { + const spotifyAccount = await this._partyService.getSpotifyAccountFor(party); + return this._spotifyService.spotifyApis.browse.getFeaturedPlaylists( + spotifyAccount.token + ); + } + + async getSpotifyPlaylist( + party: Party, + playlistId: string + ): Promise { + const spotifyAccount = await this._partyService.getSpotifyAccountFor(party); + const playlist = + await this._spotifyService.spotifyApis.playlist.getPlaylist( + spotifyAccount.token, + playlistId + ); + const tracks = await this._spotifyService.spotifyApis.playlist.getAllTracks( + spotifyAccount.token, + playlist.id + ); + playlist.tracks = tracks; + return playlist; + } + + getPartyState(party: Party): PartyState { + return this._partyStateService.getStateFor(party).partyState; + } + + async searchSpotify(party: Party, query: string): Promise { + const spotifyAccount = await this._partyService.getSpotifyAccountFor(party); + return this._spotifyService.spotifyApis.search.searchEverything( + spotifyAccount.token, + query + ); + } + + async getSpotifyAlbum(party: Party, albumId: string): Promise { + const spotifyAccount = await this._partyService.getSpotifyAccountFor(party); + return this._spotifyService.spotifyApis.albums.getAlbum( + spotifyAccount.token, + albumId + ); + } + + async getSpotifyArtist(party: Party, artistId: string): Promise { + const spotifyAccount = await this._partyService.getSpotifyAccountFor(party); + const artist = await this._spotifyService.spotifyApis.artists.getArtist( + spotifyAccount.token, + artistId + ); + const tracks = await this._spotifyService.spotifyApis.artists.getTopTracks( + spotifyAccount.token, + artistId + ); + const albums = await this._spotifyService.spotifyApis.artists.getAllAlbums( + spotifyAccount.token, + artistId + ); + const cleanedAlbums = this.cleanAlbums(albums); + return { + albums: cleanedAlbums, + info: artist, + tracks, + }; + } + + async addToPlaylist( + party: Party, + member: Member, + songId: string + ): Promise { + const spotifyAccount = await this._partyService.getSpotifyAccountFor(party); + const x = await this._spotifyService.spotifyApis.tracks.getTrack( + spotifyAccount.token, + songId + ); + await this._playlistEntryService.newEntry({ + addedBy: member, + albumArtwork: x.album.images[0].url, + artist: x.artists.map((m) => m.name).join(', '), + name: x.name, + party, + spotifyId: x.id, + }); + } + + async upvote(member: Member, entryId: string): Promise { + return this.vote(entryId, member, VoteTypeEnum.UP_VOTE); + } + + async downvote(member: Member, entryId: string): Promise { + return this.vote(entryId, member, VoteTypeEnum.DOWN_VOTE); + } + + private async vote(entryId: string, member: Member, voteType: VoteTypeEnum) { + const entry = await this._playlistEntryService.getById(entryId); + const memberVotes = entry.votes.filter( + (mvEntry) => mvEntry.member.id === member.id + ); + if (memberVotes.length > 0) { + if (memberVotes[0].type === voteType) { + return entry; + } else if (memberVotes[0].type === this.oppositeOf(voteType)) { + await this._voteService.remove(memberVotes[0]); + } + } + await this._voteService.newVote({ + member, + playlistEntry: entry, + type: voteType, + }); + return entry; + } + + private oppositeOf(voteType: VoteTypeEnum): VoteTypeEnum { + return [VoteTypeEnum.UP_VOTE, VoteTypeEnum.DOWN_VOTE] + .filter((type) => type !== voteType) + .pop(); + } + + async partyLoopStuff(party: Party): Promise { + try { + const currentSpotifyState = + await this._spotifyService.spotifyApis.player.getCurrentlyPlaying( + party.spotifyAccount.token + ); + + const previousState = await this._partyStateService.getStateFor(party); + + const currentPartyState = await this.determineCurrentState( + party, + currentSpotifyState, + previousState ? previousState.currentlyPlaying : undefined + ); + + const computedPartyState = await this.stateMachine( + party, + currentPartyState, + currentSpotifyState, + previousState ? previousState.partyState : undefined + ); + + this._partyStateService.setStateFor(party, { + currentlyPlaying: currentSpotifyState, + partyState: computedPartyState, + state: currentPartyState, + }); + } catch (error) { + console.error( + `Looks like we have an issue with party: '${party.name}'`, + error + ); + } + } + + private async stateMachine( + party: Party, + currentPartyState: PartyStateEnum, + currentSpotifyState: CurrentlyPlaying, + previousPartyState: PartyState + ): Promise { + switch (currentPartyState) { + case PartyStateEnum.NEW_SONG: + return this.newSongState(party, currentSpotifyState); + case PartyStateEnum.NEXT_FROM_QUEUE: + return this.nextFromQueueState( + party, + previousPartyState, + currentSpotifyState + ); + case PartyStateEnum.PLAYING: + return this._partyStateService.updateState(previousPartyState, { + playing: currentSpotifyState.is_playing, + progress: currentSpotifyState.progress_ms, + }); + case PartyStateEnum.PAUSED: + return this._partyStateService.updateState(previousPartyState, {}); + case PartyStateEnum.NOTHING_PLAYING: + return undefined; + default: + console.error('UNKNOWN STATE'); + } + return undefined; + } + + private async nextFromQueueState( + party: Party, + previousPartyState: PartyState, + currentSpotifyState: CurrentlyPlaying + ): Promise { + const playlist = await this._partyService.getPlaylistFor(party); + if (playlist.length > 0 && !this._partyStateService.hasSongQueued(party)) { + const sorted = playlist + .map((entry) => ({ + ...entry, + score: entry.votes + .map((v) => (v.type === VoteTypeEnum.UP_VOTE ? 1 : -1)) + .reduce((p, c) => p + c, 0), + })) + .sort((a, b) => b.score - a.score); + const [nextSong] = sorted; + const spotifyAccount = await this._partyService.getSpotifyAccountFor( + party + ); + await this._spotifyService.spotifyApis.player.addSongToEndOfQueue( + spotifyAccount.token, + nextSong.spotifyId + ); + await this._playlistEntryService.remove(nextSong); + this._partyStateService.setNextSongQueued(party, nextSong.spotifyId); + } + return this._partyStateService.updateState(previousPartyState, { + playing: currentSpotifyState.is_playing, + progress: currentSpotifyState.progress_ms, + }); + } + + private async newSongState( + party: Party, + currentSpotifyState: CurrentlyPlaying + ): Promise { + await this._spotifyService.spotifyApis.playlist.addTracks( + party.spotifyAccount.token, + party.spotifyPlaylistId, + [currentSpotifyState.item.id] + ); + const artwork = currentSpotifyState.item.album.images.find( + (image) => + image.height === + Math.max(...currentSpotifyState.item.album.images.map((p) => p.height)) + ).url; + this._partyStateService.setEmptyNextSongQueue(party); + await this._playlistHistoryService.addToHistory({ + albumArtwork: artwork, + artist: currentSpotifyState.item.artists.map((a) => a.name).join(', '), + name: currentSpotifyState.item.name, + party, + spotifyId: currentSpotifyState.item.id, + }); + return this._partyStateService.updateState(undefined, { + artist: currentSpotifyState.item.artists.map((a) => a.name).join(', '), + artwork, + duration: currentSpotifyState.item.duration_ms, + name: currentSpotifyState.item.name, + palette: await this._partyStateService.computePalette(artwork), + playing: currentSpotifyState.is_playing, + progress: currentSpotifyState.progress_ms, + spotifyId: currentSpotifyState.item.id, + }); + } + + private async determineCurrentState( + party: Party, + currentState: CurrentlyPlaying, + previousState: CurrentlyPlaying + ): Promise { + if (!currentState) { + return PartyStateEnum.NOTHING_PLAYING; + } + if (!previousState) { + return PartyStateEnum.NEW_SONG; + } + if (currentState.is_playing) { + if (currentState.item.id === previousState.item.id) { + if ( + currentState.item.duration_ms - currentState.progress_ms < 10_000 && + !this._partyStateService.hasSongQueued(party) + ) { + return PartyStateEnum.NEXT_FROM_QUEUE; + } + return PartyStateEnum.PLAYING; + } + return PartyStateEnum.NEW_SONG; + } + return PartyStateEnum.PAUSED; + } + + async getSpotifySong(party: Party, songId: string): Promise { + const spotifyAccount = await this._partyService.getSpotifyAccountFor(party); + return this._spotifyService.spotifyApis.tracks.getTrack( + spotifyAccount.token, + songId + ); + } + + private cleanAlbums(albums: Array): Array { + const dedupedAlbums = this.dedupeAlbums(albums); + const albumMap = new Map>(); + dedupedAlbums.forEach((album) => { + if (albumMap.has(album.name)) { + const x = albumMap.get(album.name); + x.push(album); + albumMap.set(album.name, x); + } else { + albumMap.set(album.name, [album]); + } + }); + const cleanedAlbums = []; + albumMap.forEach((value) => { + cleanedAlbums.push(...value); + }); + return cleanedAlbums; + } + + private dedupeAlbums(albums: Array): Array { + const hashTable = albums.reduce( + (a, c) => ({ + ...a, + [c.id]: c, + }), + {} + ); + const noDupe = []; + new Set(albums.map((album) => `${album.id}`)).forEach((albumId) => { + noDupe.push(hashTable[albumId]); + }); + return noDupe; + } +} diff --git a/packages/server/src/api/services/user.service.ts b/packages/server/src/api/services/user.service.ts new file mode 100644 index 0000000..5f5decc --- /dev/null +++ b/packages/server/src/api/services/user.service.ts @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, User } from '../models'; +import { UserRepository } from '../repositories'; +import { Service } from 'typedi'; +import { OrmRepository } from 'typeorm-typedi-extensions'; + +@Service() +export class UserService { + constructor(@OrmRepository() private readonly _userRepository: UserRepository) {} + + async getAll(): Promise> { + return this._userRepository.find(); + } + + async getById(id: string): Promise { + return this._userRepository.findOne({ + where: { + id + } + }); + } + + async getByMember(member: Member): Promise { + return this._userRepository.findOne({ + where: { + member + } + }); + } + + async getByFingerprint(fingerprint: string): Promise { + return this._userRepository.findOne({ + where: { + fingerprint + } + }); + } + + async getMemberFor(user: User): Promise { + const u = await this._userRepository.findOne({ relations: [ 'member' ], where: { id: user.id } }); + return u.member; + } + + async newUser(fingerprint: string): Promise { + const user = await this.getByFingerprint(fingerprint); + if (user) { + return user; + } + return this._userRepository.save({ + fingerprint + }); + } +} diff --git a/packages/server/src/api/services/vote.service.ts b/packages/server/src/api/services/vote.service.ts new file mode 100644 index 0000000..9ceb2fa --- /dev/null +++ b/packages/server/src/api/services/vote.service.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, PlaylistEntry, Vote } from '../models'; +import { VoteRepository } from '../repositories'; +import { Service } from 'typedi'; +import { OrmRepository } from 'typeorm-typedi-extensions'; + +@Service() +export class VoteService { + constructor(@OrmRepository() private readonly _voteRepository: VoteRepository) {} + + async getAll(): Promise> { + return this._voteRepository.find(); + } + + async getById(id: string): Promise { + return this._voteRepository.findOne({ + where: { + id + } + }); + } + + async getMemberFor(vote: Vote): Promise { + const v = await this._voteRepository.findOne({ relations: [ 'member' ], where: { id: vote.id } }); + return v.member; + } + + async getPlaylistEntryFor(vote: Vote): Promise { + const v = await this._voteRepository.findOne({ relations: [ 'playlistEntry' ], where: { id: vote.id } }); + return v.playlistEntry; + } + + async newVote(vote: Partial): Promise { + return this._voteRepository.save(vote); + } + + async remove(vote: Vote): Promise { + await this._voteRepository.remove(vote); + } +} diff --git a/packages/server/src/api/spotify/apis/albums.ts b/packages/server/src/api/spotify/apis/albums.ts new file mode 100644 index 0000000..491e898 --- /dev/null +++ b/packages/server/src/api/spotify/apis/albums.ts @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { WebApiRequestBuilder } from '../requests'; +import { Album, AlbumArray, HttpMethods, Paging, SimplifiedTrack } from '../types'; + +const MAX_LIMIT = 50; + +export class Albums { + private static readonly URL = '/v1/albums' + + public async getAlbums( + token: string, ids: Array + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(Albums.URL) + .withQueryParameters({ ids: ids.join(','), market: 'from_token' }) + .build() + .execute(); + } + + public async getAlbum( + token: string, id: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Albums.URL}/${id}`) + .withQueryParameters({ market: 'from_token' }) + .build() + .execute(); + } + + public async getAlbumTracks( + token: string, + id: string, + limit = MAX_LIMIT, + offset = 0 + ): Promise> { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Albums.URL}/${id}/tracks`) + .withQueryParameters({ limit, market: 'from_token', offset }) + .build().execute>(); + } + +} diff --git a/packages/server/src/api/spotify/apis/artists.ts b/packages/server/src/api/spotify/apis/artists.ts new file mode 100644 index 0000000..3e46f10 --- /dev/null +++ b/packages/server/src/api/spotify/apis/artists.ts @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { WebApiRequestBuilder } from '../requests'; +import { + Artist, + ArtistArray, + ArtistArray as ArtistsArray, + HttpMethods, + Paging, + SimplifiedAlbum, + TrackArray, +} from '../types'; + +const MAX_LIMIT = 50; + +export class Artists { + + private static readonly URL = '/v1/artists'; + + private static readonly INCLUDE_GROUPS = [ + 'album', + 'single' + ].join(','); + + public async getArtists( + token: string, ids: Array + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(Artists.URL) + .withQueryParameters({ ids: ids.join(',') }) + .build() + .execute(); + } + + public async getArtist( + token: string, id: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Artists.URL}/${id}`) + .build() + .execute(); + } + + public async getTopTracks( + token: string, id: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Artists.URL}/${id}/top-tracks`) + .withQueryParameters({ market: 'from_token' }) + .build() + .execute(); + } + + public async getRelatedArtists( + token: string, id: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Artists.URL}/${id}/related-artists`) + .withQueryParameters({ market: 'from_token' }) + .build() + .execute(); + } + + public async getAlbums( + token: string, + id: string, + limit = MAX_LIMIT, + offset = 0 + ): Promise> { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Artists.URL}/${id}/albums`) + .withQueryParameters({ + include_groups: Artists.INCLUDE_GROUPS, + limit, + market: 'from_token', + offset + }) + .build() + .execute>(); + } + + public async getAllAlbums( + token: string, + id: string + ): Promise> { + const items: Array = []; + const first50 = await this.getAlbums( + token, id + ); + items.push(...first50.items); + if (first50.total > MAX_LIMIT) { + const remaining = await Promise.all(Array.from({ length: Math.ceil(first50.total - MAX_LIMIT) % MAX_LIMIT }) + .fill(0) + .map(( + _, index + ) => this.getAlbums( + token, id, MAX_LIMIT, index * MAX_LIMIT + ))); + items.push(...remaining.flatMap(element => element.items)); + } + return items; + } +} diff --git a/packages/server/src/api/spotify/apis/auth.ts b/packages/server/src/api/spotify/apis/auth.ts new file mode 100644 index 0000000..b4b81f1 --- /dev/null +++ b/packages/server/src/api/spotify/apis/auth.ts @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import querystring from 'querystring'; + +import { RequestBuilder } from '../requests'; +import { AuthResponse, HttpMethods, RefreshResponse, SCOPES } from '../types'; + + +export class Auth { + public static ALL_SCOPES = Object.values(SCOPES).join(' '); + + public getAuthStartURL( + clientID: string, + redirectURI: string, + state: string, + scope: string = Auth.ALL_SCOPES + ): string { + return `https://accounts.spotify.com/authorize?${ + querystring.stringify({ + client_id: clientID, + redirect_uri: redirectURI, + response_type: 'code', + scope: scope, + state: state + }) + }`; + } + + public async authorizationCode( + clientID: string, + clientSecret: string, + code: string, + redirectURI: string + ): Promise { + return RequestBuilder + .builder() + .withHost('accounts.spotify.com') + .withScheme('https') + .withHeaders({ + Authorization: `Basic ${Buffer.from(`${clientID}:${clientSecret}`).toString('base64')}` + }) + .withMethod(HttpMethods.POST) + .withPath('/api/token') + .withQueryParameters({ + code, + grant_type: 'authorization_code', + redirect_uri: redirectURI + }) + .build() + .execute(); + } + + public async refreshAuthToken( + clientID: string, + clientSecret: string, + refreshToken: string + ): Promise { + return RequestBuilder + .builder() + .withHost('accounts.spotify.com') + .withScheme('https') + .withHeaders({ + Authorization: `Basic ${Buffer.from(`${clientID}:${clientSecret}`).toString('base64')}` + }) + .withMethod(HttpMethods.POST) + .withPath('/api/token') + .withQueryParameters({ + grant_type: 'refresh_token', + refresh_token: refreshToken + }) + .build() + .execute(); + } +} diff --git a/packages/server/src/api/spotify/apis/browse.ts b/packages/server/src/api/spotify/apis/browse.ts new file mode 100644 index 0000000..7fb88be --- /dev/null +++ b/packages/server/src/api/spotify/apis/browse.ts @@ -0,0 +1,159 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { WebApiRequestBuilder } from '../requests'; +import { + Categories, + Category, + FeaturedPlaylists, + GenreSeeds, + HttpMethods, + NewReleases, + RecommendationsResponse, +} from '../types'; + +const MAX_LIMIT = 50; + +export class Browse { + + private static readonly URL = '/v1/browse'; + + public async getNewReleases( + token: string, + limit: number = MAX_LIMIT, + offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Browse.URL}/new-releases`) + .withQueryParameters({ country: 'from_token', limit, offset }) + .build() + .execute(); + } + + public async getFeaturedPlaylists( + token: string, + limit: number = MAX_LIMIT, + offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Browse.URL}/featured-playlists`) + .withQueryParameters({ country: 'from_token', limit, offset }) + .build() + .execute(); + } + + public async getCategories( + token: string, + limit: number = MAX_LIMIT, + offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Browse.URL}/categories`) + .withQueryParameters({ country: 'from_token', limit, offset }) + .build() + .execute(); + } + + public async getCategory( + token: string, id: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Browse.URL}/categories/${id}`) + .withQueryParameters({ country: 'from_token' }) + .build() + .execute(); + } + + public async getCategoryPlaylists( + token: string, + id: string, + limit: number = MAX_LIMIT, + offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Browse.URL}/categories/${id}/playlists`) + .withQueryParameters({ country: 'from_token', limit, offset }) + .build() + .execute(); + } + + public async getRecommendationsFromTracks( + token: string, + trackSeeds: Array, + limit: number = MAX_LIMIT, + offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath('/v1/recommendations') + .withQueryParameters({ + limit, + market: 'from_token', + offset, + seed_tracks: trackSeeds.join(',') + }) + .build() + .execute(); + } + + public async getRecommendationsFromArtists( + token: string, + artistSeeds: Array, + limit: number = MAX_LIMIT, + offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath('/v1/recommendations') + .withQueryParameters({ + limit, + market: 'from_token', + offset, + seed_artists: artistSeeds.join(',') + }) + .build() + .execute(); + } + + public async getRecommendationsFromGenres( + token: string, + genreSeeds: Array, + limit: number = MAX_LIMIT, + offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath('/v1/recommendations') + .withQueryParameters({ + limit, + market: 'from_token', + offset, + seed_genres: genreSeeds.join(',') + }) + .build() + .execute(); + } + + public async getAvailableRecommendationGenres(token: string): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath('/v1/recommendations/available-genre-seeds') + .build() + .execute(); + } +} diff --git a/packages/server/src/api/spotify/apis/index.ts b/packages/server/src/api/spotify/apis/index.ts new file mode 100644 index 0000000..4d728c8 --- /dev/null +++ b/packages/server/src/api/spotify/apis/index.ts @@ -0,0 +1,14 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './albums'; +export * from './artists'; +export * from './auth'; +export * from './browse'; +export * from './library'; +export * from './player'; +export * from './playlists'; +export * from './search'; +export * from './tracks'; +export * from './users'; diff --git a/packages/server/src/api/spotify/apis/library.ts b/packages/server/src/api/spotify/apis/library.ts new file mode 100644 index 0000000..ae5aefa --- /dev/null +++ b/packages/server/src/api/spotify/apis/library.ts @@ -0,0 +1,5 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export class Library {} diff --git a/packages/server/src/api/spotify/apis/player.ts b/packages/server/src/api/spotify/apis/player.ts new file mode 100644 index 0000000..3ab425e --- /dev/null +++ b/packages/server/src/api/spotify/apis/player.ts @@ -0,0 +1,145 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { WebApiRequestBuilder } from '../requests'; +import { CurrentlyPlaying, Devices, HttpMethods } from '../types'; + +export class Player { + + private static readonly URL = '/v1/me/player' + + public async getPlayingContext(token: string): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(Player.URL) + .build() + .execute(); + } + + public async transferDevice( + token: string, + deviceId: string, + play = false + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.PUT) + .withPath(Player.URL) + .withBodyParameters({ + device_ids: [ deviceId ], + play + }) + .build() + .execute(); + } + + public async getDevices(token: string): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Player.URL}/devices`) + .build() + .execute(); + } + + public async getCurrentlyPlaying(token: string): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Player.URL}/currently-playing`) + .build() + .execute(); + } + + public async play(token: string): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.PUT) + .withPath(`${Player.URL}/play`) + .build() + .execute(); + } + + public async playSong( + token: string, songId: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.PUT) + .withPath(`${Player.URL}/play`) + .withBodyParameters({ + uris: [ `spotify:track:${songId}` ] + }) + .build() + .execute(); + } + + public async pause(token: string): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.PUT) + .withPath(`${Player.URL}/pause`) + .build() + .execute(); + } + + public async nextSong(token: string): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.POST) + .withPath(`${Player.URL}/next`) + .build() + .execute(); + } + + public async previousSong(token: string): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.POST) + .withPath(`${Player.URL}/previous`) + .build() + .execute(); + } + + public async trackSeek( + token: string, positionMs: number + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.PUT) + .withPath(`${Player.URL}/seek`) + .withQueryParameters({ + position_ms: positionMs + }) + .build() + .execute(); + } + + public async setVolume( + token: string, volumePercent: number + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.PUT) + .withPath(`${Player.URL}/volume`) + .withQueryParameters({ + volume_percent: volumePercent + }) + .build() + .execute(); + } + + public async addSongToEndOfQueue( + token: string, trackId: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.POST) + .withPath(`${Player.URL}/queue`) + .withQueryParameters({ uri: `spotify:track:${trackId}` }) + .build() + .execute(); + } +} diff --git a/packages/server/src/api/spotify/apis/playlists.ts b/packages/server/src/api/spotify/apis/playlists.ts new file mode 100644 index 0000000..7bffe86 --- /dev/null +++ b/packages/server/src/api/spotify/apis/playlists.ts @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + + +import { WebApiRequestBuilder } from '../requests'; +import { + HttpMethods, + Paging, + Playlist as PlaylistObject, + PlaylistDetails, + PlaylistSnapshot, + PlaylistTrack, +} from '../types'; + +const MAX_LIMIT = 50; +const MAX_LIMIT_PLAYLIST_ITEMS = 50; + +export class Playlists { + + private static readonly URL = '/v1/playlists' + + public async getPlaylists( + token: string, limit: number = MAX_LIMIT, offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(Playlists.URL) + .withQueryParameters({ + fields: 'description,name,uri,id,followers,href,images,owner,public,type,tracks.total', + limit, + offset + }) + .build() + .execute(); + } + + public async getPlaylist( + token: string, playlistId: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Playlists.URL}/${playlistId}`) + .withQueryParameters({ + fields: 'description,name,uri,id,followers,href,images,owner,public,type,tracks.total' + }) + .build() + .execute(); + } + + public async create( + token: string, + userId: string, + details: PlaylistDetails + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.POST) + .withPath(`/v1/users/${userId}/playlists`) + .withBodyParameters({ + ...details + }) + .build() + .execute(); + } + + public async changeDetails( + token: string, + playlistId: string, + details: Partial + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.PUT) + .withPath(`${Playlists.URL}/${playlistId}`) + .withBodyParameters({ + ...details + }) + .build() + .execute(); + } + + public async getTracks( + token: string, + playlistId: string, + offset = 0, + limit = MAX_LIMIT_PLAYLIST_ITEMS + ): Promise> { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Playlists.URL}/${playlistId}/tracks`) + .withQueryParameters({ + limit, + market: 'from_token', + offset + }) + .build() + .execute>(); + } + + public async getAllTracks( + token: string, playlistId: string + ): Promise> { + const items: Array = []; + const first50 = await this.getTracks( + token, playlistId + ); + items.push(...first50.items); + if (first50.total > MAX_LIMIT_PLAYLIST_ITEMS) { + const toDo = new Array(Math.ceil((first50.total - MAX_LIMIT_PLAYLIST_ITEMS) / MAX_LIMIT_PLAYLIST_ITEMS)) + .fill(0); + const promises = toDo.map(async ( + _, index + ) => this.getTracks( + token, playlistId, (index + 1) * MAX_LIMIT_PLAYLIST_ITEMS + )); + const remaining = await Promise.all(promises); + items.push(...remaining.flatMap(element => element.items)); + } + return items; + } + + public async addTracks( + token: string, + playlistId: string, + uris: Array + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.POST) + .withPath(`${Playlists.URL}/${playlistId}/tracks`) + .withBodyParameters({ + uris: uris.map(trackId => `spotify:track:${trackId}`) + }) + .build() + .execute(); + } +} diff --git a/packages/server/src/api/spotify/apis/search.ts b/packages/server/src/api/spotify/apis/search.ts new file mode 100644 index 0000000..fe597af --- /dev/null +++ b/packages/server/src/api/spotify/apis/search.ts @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { WebApiRequestBuilder } from '../requests'; +import { + HttpMethods, + SearchResultAlbums, + SearchResultAll, + SearchResultArtists, + SearchResultPlaylists, + SearchResultTracks, +} from '../types'; + +export type JoinedSearchResults = SearchResultAll + | SearchResultAlbums + | SearchResultArtists + | SearchResultTracks + | SearchResultPlaylists; + +export enum SearchTypes { + ALBUM = 'album', + ARTIST = 'artist', + PLAYLIST = 'playlist', + TRACK = 'track' +} + +const MAX_LIMIT = 50; + +export class Search { + private static readonly DEFAULT_SEARCH_URL = '/v1/search'; + + private static ALL_TYPES = Object.values(SearchTypes); + + // TODO: possibly remove if unused + public async search( + token: string, + query: string, + types: Array, + limit: number = MAX_LIMIT, + offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(Search.DEFAULT_SEARCH_URL) + .withQueryParameters({ + limit, + market: 'from_token', + offset, + q: query, + type: types.join(',') + }) + .build() + .execute(); + } + + public async searchEverything( + token: string, + query: string, + limit: number = MAX_LIMIT, + offset = 0 + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(Search.DEFAULT_SEARCH_URL) + .withQueryParameters({ + limit: limit, + market: 'from_token', + offset, + q: query, + type: Search.ALL_TYPES.join(',') + }) + .build() + .execute(); + } +} diff --git a/packages/server/src/api/spotify/apis/tracks.ts b/packages/server/src/api/spotify/apis/tracks.ts new file mode 100644 index 0000000..ffd4b4e --- /dev/null +++ b/packages/server/src/api/spotify/apis/tracks.ts @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { WebApiRequestBuilder } from '../requests'; +import { AudioFeaturesObject, HttpMethods, Track } from '../types'; + +export class Tracks { + + private static readonly URL = '/v1/tracks'; + + public async getTracks( + token: string, ids: Array + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(Tracks.URL) + .withQueryParameters({ + ids: ids.join(','), + market: 'from_token' + }) + .build() + .execute(); + } + + public async getTrack( + token: string, trackId: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`${Tracks.URL}/${trackId}`) + .withQueryParameters({ + market: 'from_token' + }) + .build() + .execute(); + } + + public async getAudioFeatures( + token: string, trackId: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`/v1/audio-features/${trackId}`) + .build() + .execute(); + } + + public async getAudioAnalysis( + token: string, trackId: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`/v1/audio-analysis/${trackId}`) + .build() + .execute(); + } +} diff --git a/packages/server/src/api/spotify/apis/users.ts b/packages/server/src/api/spotify/apis/users.ts new file mode 100644 index 0000000..5de7acf --- /dev/null +++ b/packages/server/src/api/spotify/apis/users.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { WebApiRequestBuilder } from '../requests'; +import { HttpMethods, PrivateUser, PublicUser } from '../types'; + +export class Users { + + public async getCurrent(token: string): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath('/v1/me') + .build() + .execute(); + } + + public async getById( + token: string, userId: string + ): Promise { + return WebApiRequestBuilder + .make(token) + .withMethod(HttpMethods.GET) + .withPath(`/v1/users/${userId}`) + .build() + .execute(); + } +} diff --git a/packages/server/src/api/spotify/error/generic-error.ts b/packages/server/src/api/spotify/error/generic-error.ts new file mode 100644 index 0000000..0f32a14 --- /dev/null +++ b/packages/server/src/api/spotify/error/generic-error.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export class GenericError extends Error { + constructor( + name: string, message: string, stack: string + ) { + super(message); + // eslint-disable-next-line immutable/no-mutation + this.name = name; + // eslint-disable-next-line immutable/no-mutation + this.stack = stack; + } +} diff --git a/packages/server/src/api/spotify/error/index.ts b/packages/server/src/api/spotify/error/index.ts new file mode 100644 index 0000000..28a4583 --- /dev/null +++ b/packages/server/src/api/spotify/error/index.ts @@ -0,0 +1,5 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './generic-error'; diff --git a/packages/server/src/api/spotify/index.ts b/packages/server/src/api/spotify/index.ts new file mode 100644 index 0000000..9e75f9e --- /dev/null +++ b/packages/server/src/api/spotify/index.ts @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './apis'; +export * from './error'; +export * from './types'; diff --git a/packages/server/src/api/spotify/requests/index.ts b/packages/server/src/api/spotify/requests/index.ts new file mode 100644 index 0000000..32661fc --- /dev/null +++ b/packages/server/src/api/spotify/requests/index.ts @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './request'; +export * from './request-builder'; +export * from './web-api-request-builder'; diff --git a/packages/server/src/api/spotify/requests/request-builder.ts b/packages/server/src/api/spotify/requests/request-builder.ts new file mode 100644 index 0000000..1cf2552 --- /dev/null +++ b/packages/server/src/api/spotify/requests/request-builder.ts @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { HttpMethods } from '../types'; +import { Request } from './request'; + +export class RequestBuilder { + method: HttpMethods; + + host: string; + + scheme: string; + + path: string; + + headers: Record; + + queryParameters: Record; + + bodyParameters: Record; + + public static builder(): RequestBuilder { + return new RequestBuilder(); + } + + public withMethod(method: HttpMethods): RequestBuilder { + // eslint-disable-next-line immutable/no-mutation + this.method = method; + return this; + } + + public withHost(host: string): RequestBuilder { + // eslint-disable-next-line immutable/no-mutation + this.host = host; + return this; + } + + public withScheme(scheme: string): RequestBuilder { + // eslint-disable-next-line immutable/no-mutation + this.scheme = scheme; + return this; + } + + public withPath(path: string): RequestBuilder { + // eslint-disable-next-line immutable/no-mutation + this.path = path; + return this; + } + + public withQueryParameters(queryParameters: Record): RequestBuilder { + // eslint-disable-next-line immutable/no-mutation + this.queryParameters = queryParameters; + return this; + } + + public withBodyParameters(bodyParameters: Record): RequestBuilder { + // eslint-disable-next-line immutable/no-mutation + this.bodyParameters = bodyParameters; + return this; + } + + public withHeaders(headers: Record): RequestBuilder { + // eslint-disable-next-line immutable/no-mutation + this.headers = headers; + return this; + } + + public withAuth(token: string): RequestBuilder { + if (!this.headers) { + // eslint-disable-next-line immutable/no-mutation + this.headers = {}; + } + // eslint-disable-next-line immutable/no-mutation + this.headers.Authorization = `Bearer ${token}`; + return this; + } + + public build(): Request { + return new Request(this); + } +} diff --git a/packages/server/src/api/spotify/requests/request.ts b/packages/server/src/api/spotify/requests/request.ts new file mode 100644 index 0000000..fa17362 --- /dev/null +++ b/packages/server/src/api/spotify/requests/request.ts @@ -0,0 +1,102 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import axios, { AxiosResponse } from 'axios'; + +import { GenericError } from '../error'; +import { HttpMethods } from '../types'; +import { RequestBuilder } from './request-builder'; + +export class Request { + private readonly method: HttpMethods; + + private readonly host: string; + + private readonly scheme: string; + + private readonly path: string; + + private readonly headers: Record; + + private readonly queryParameters: Record; + + private readonly bodyParameters: Record; + + constructor(builder: RequestBuilder) { + // eslint-disable-next-line immutable/no-mutation + this.method = builder.method; + // eslint-disable-next-line immutable/no-mutation + this.host = builder.host; + // eslint-disable-next-line immutable/no-mutation + this.scheme = builder.scheme; + // eslint-disable-next-line immutable/no-mutation + this.path = builder.path; + // eslint-disable-next-line immutable/no-mutation + this.headers = builder.headers; + // eslint-disable-next-line immutable/no-mutation + this.queryParameters = builder.queryParameters; + // eslint-disable-next-line immutable/no-mutation + this.bodyParameters = builder.bodyParameters; + } + + public async execute(): Promise { + try { + return (await this.makeAxios()).data as T; + } catch (error) { + throw new GenericError( + error.response.data.error.status, error.response.data.error.message, error.stack + ); + } + } + + private getURI(): string { + return `${this.scheme}://${this.host}${this.path}`; + } + + private makeAxios(): Promise { + switch (this.method) { + case HttpMethods.DELETE: + return axios.request({ + headers: this.headers, + method: 'delete', + params: this.queryParameters, + url: this.getURI() + }); + case HttpMethods.GET: + return axios.request({ + headers: this.headers, + method: 'get', + params: this.queryParameters, + url: this.getURI() + }); + case HttpMethods.POST: + if (this.bodyParameters) { + return axios.request({ + data: this.bodyParameters, + headers: this.headers, + method: 'post', + params: this.queryParameters, + url: this.getURI() + }); + } + return axios.request({ + headers: this.headers, + method: 'post', + params: this.queryParameters, + url: this.getURI() + }); + + case HttpMethods.PUT: + return axios.request({ + data: this.bodyParameters, + headers: this.headers, + method: 'put', + params: this.queryParameters, + url: this.getURI() + }); + default: + throw new Error(`Invalid HTTP method: ${this.method}`); + } + } +} diff --git a/packages/server/src/api/spotify/requests/web-api-request-builder.ts b/packages/server/src/api/spotify/requests/web-api-request-builder.ts new file mode 100644 index 0000000..7c208b8 --- /dev/null +++ b/packages/server/src/api/spotify/requests/web-api-request-builder.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { RequestBuilder } from './request-builder'; + +export class WebApiRequestBuilder { + private static DEFAULT_HOST = 'api.spotify.com'; + + private static DEFAULT_SCHEME = 'https'; + + constructor() {} + + public static make(token: string): RequestBuilder { + return RequestBuilder + .builder() + .withHost(this.DEFAULT_HOST) + .withScheme(this.DEFAULT_SCHEME) + .withAuth(token); + } + +} diff --git a/packages/server/src/api/spotify/types/album-array.ts b/packages/server/src/api/spotify/types/album-array.ts new file mode 100644 index 0000000..d5aafff --- /dev/null +++ b/packages/server/src/api/spotify/types/album-array.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Album } from './'; + +export interface AlbumArray { + albums: Array; +} diff --git a/packages/server/src/api/spotify/types/album.ts b/packages/server/src/api/spotify/types/album.ts new file mode 100644 index 0000000..6a95058 --- /dev/null +++ b/packages/server/src/api/spotify/types/album.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Artist, Copyright, ExternalId, Image, Paging, SimplifiedTrack } from './'; + +export interface Album { + album_type: string; + artists: Array; + available_markets: Array; + copyrights: Array; + external_ids: ExternalId; + external_urls: Object; + genres: Array; + href: string; + id: string; + images: Array; + label: string; + name: string; + popularity: number; + release_date: string; + release_date_precision: string; + tracks: Paging; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/artist-array.ts b/packages/server/src/api/spotify/types/artist-array.ts new file mode 100644 index 0000000..28d0910 --- /dev/null +++ b/packages/server/src/api/spotify/types/artist-array.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Artist } from './'; + +export interface ArtistArray { + artists: Array; +} diff --git a/packages/server/src/api/spotify/types/artist.ts b/packages/server/src/api/spotify/types/artist.ts new file mode 100644 index 0000000..38c4ff6 --- /dev/null +++ b/packages/server/src/api/spotify/types/artist.ts @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Followers, Image } from './'; + +export interface Artist { + external_urls: Object; + followers: Followers; + genres: Array; + href: string; + id: string; + images: Array; + name: string; + popularity: number; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/audio-features.ts b/packages/server/src/api/spotify/types/audio-features.ts new file mode 100644 index 0000000..2e3a295 --- /dev/null +++ b/packages/server/src/api/spotify/types/audio-features.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface AudioFeaturesObject { + acousticness: number; + analysis_url: string; + danceability: number; + duration_ms: number; + energy: number; + id: string; + instrumentalness: number; + key: number; + liveness: number; + loudness: number; + mode: number; + speechiness: number; + tempo: number; + time_signature: number; + track_ref: string; + type: string; + uri: string; + valence: number; +} diff --git a/packages/server/src/api/spotify/types/auth-context.ts b/packages/server/src/api/spotify/types/auth-context.ts new file mode 100644 index 0000000..04bf9f2 --- /dev/null +++ b/packages/server/src/api/spotify/types/auth-context.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface AuthContext { + scope: string; + token_type: string; + expires_in: number; + refresh_token: string; + access_token: string; + +} diff --git a/packages/server/src/api/spotify/types/auth-response.ts b/packages/server/src/api/spotify/types/auth-response.ts new file mode 100644 index 0000000..2e38f3d --- /dev/null +++ b/packages/server/src/api/spotify/types/auth-response.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface AuthResponse { + access_token: string; + refresh_token: string; + expires_in: number; + token_type: string; + scope: string; +} diff --git a/packages/server/src/api/spotify/types/categories.ts b/packages/server/src/api/spotify/types/categories.ts new file mode 100644 index 0000000..97983d8 --- /dev/null +++ b/packages/server/src/api/spotify/types/categories.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Category, Paging } from './'; + +export interface Categories { + categories: Paging; +} diff --git a/packages/server/src/api/spotify/types/category.ts b/packages/server/src/api/spotify/types/category.ts new file mode 100644 index 0000000..43306f6 --- /dev/null +++ b/packages/server/src/api/spotify/types/category.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Image } from './'; + +export interface Category { + href: string; + icons: Array; + id: string; + name: string; +} diff --git a/packages/server/src/api/spotify/types/context.ts b/packages/server/src/api/spotify/types/context.ts new file mode 100644 index 0000000..f1e43bf --- /dev/null +++ b/packages/server/src/api/spotify/types/context.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface Context { + type: string; + href: string; + external_urls: any; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/copyright.ts b/packages/server/src/api/spotify/types/copyright.ts new file mode 100644 index 0000000..c3dc8ae --- /dev/null +++ b/packages/server/src/api/spotify/types/copyright.ts @@ -0,0 +1,8 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface Copyright { + text: string; + type: string; +} diff --git a/packages/server/src/api/spotify/types/currently-playing.ts b/packages/server/src/api/spotify/types/currently-playing.ts new file mode 100644 index 0000000..28cf84c --- /dev/null +++ b/packages/server/src/api/spotify/types/currently-playing.ts @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Context, Device, Track } from './'; + +export interface CurrentlyPlaying { + device: Device; + repeat_state: string; + shuffle_state: boolean; + context: Context; + timestamp: number; + progress_ms: number; + is_playing: boolean; + item: Track; + currently_playing_type: string; + actions: Record; +} diff --git a/packages/server/src/api/spotify/types/cursor-paging.ts b/packages/server/src/api/spotify/types/cursor-paging.ts new file mode 100644 index 0000000..a3291d9 --- /dev/null +++ b/packages/server/src/api/spotify/types/cursor-paging.ts @@ -0,0 +1,14 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Cursor } from './'; + +export interface CursorPaging { + href: string; + items: Array>; + limit: number; + next: string; + cursors: Cursor; + total: number; +} diff --git a/packages/server/src/api/spotify/types/cursor.ts b/packages/server/src/api/spotify/types/cursor.ts new file mode 100644 index 0000000..84dea0d --- /dev/null +++ b/packages/server/src/api/spotify/types/cursor.ts @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface Cursor { + after: string; +} diff --git a/packages/server/src/api/spotify/types/device.ts b/packages/server/src/api/spotify/types/device.ts new file mode 100644 index 0000000..faf0e12 --- /dev/null +++ b/packages/server/src/api/spotify/types/device.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface Device { + id: string; + is_active: boolean; + is_private_session: boolean; + is_restricted: boolean; + name: string; + type: string; + volume_percent: number; +} diff --git a/packages/server/src/api/spotify/types/devices.ts b/packages/server/src/api/spotify/types/devices.ts new file mode 100644 index 0000000..dc9f28a --- /dev/null +++ b/packages/server/src/api/spotify/types/devices.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Device } from './'; + +export interface Devices { + devices: Array; +} diff --git a/packages/server/src/api/spotify/types/error.ts b/packages/server/src/api/spotify/types/error.ts new file mode 100644 index 0000000..86a1386 --- /dev/null +++ b/packages/server/src/api/spotify/types/error.ts @@ -0,0 +1,8 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface Error { + status: number; + message: string; +} diff --git a/packages/server/src/api/spotify/types/external-id.ts b/packages/server/src/api/spotify/types/external-id.ts new file mode 100644 index 0000000..13f12ac --- /dev/null +++ b/packages/server/src/api/spotify/types/external-id.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface ExternalId { + isrc: string; + ean: string; + upc: string; +} diff --git a/packages/server/src/api/spotify/types/featured-playlists.ts b/packages/server/src/api/spotify/types/featured-playlists.ts new file mode 100644 index 0000000..c15f54f --- /dev/null +++ b/packages/server/src/api/spotify/types/featured-playlists.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Paging, SimplifiedPlaylist } from './'; + +export interface FeaturedPlaylists { + message: string; + playlists: Paging; +} diff --git a/packages/server/src/api/spotify/types/followers.ts b/packages/server/src/api/spotify/types/followers.ts new file mode 100644 index 0000000..82787ff --- /dev/null +++ b/packages/server/src/api/spotify/types/followers.ts @@ -0,0 +1,8 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface Followers { + href: string; + total: number; +} diff --git a/packages/server/src/api/spotify/types/genre-seeds.ts b/packages/server/src/api/spotify/types/genre-seeds.ts new file mode 100644 index 0000000..a176b7e --- /dev/null +++ b/packages/server/src/api/spotify/types/genre-seeds.ts @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface GenreSeeds { + genres: Array; +} diff --git a/packages/server/src/api/spotify/types/http-methods.ts b/packages/server/src/api/spotify/types/http-methods.ts new file mode 100644 index 0000000..8ad101b --- /dev/null +++ b/packages/server/src/api/spotify/types/http-methods.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export enum HttpMethods { + GET, + POST, + PUT, + DELETE +} diff --git a/packages/server/src/api/spotify/types/image.ts b/packages/server/src/api/spotify/types/image.ts new file mode 100644 index 0000000..c1c2481 --- /dev/null +++ b/packages/server/src/api/spotify/types/image.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface Image { + height: number; + width: number; + url: string; +} diff --git a/packages/server/src/api/spotify/types/index.ts b/packages/server/src/api/spotify/types/index.ts new file mode 100644 index 0000000..8c97d23 --- /dev/null +++ b/packages/server/src/api/spotify/types/index.ts @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './album'; +export * from './album-array'; +export * from './artist'; +export * from './artist-array'; +export * from './audio-features'; +export * from './auth-context'; +export * from './auth-response'; +export * from './categories'; +export * from './category'; +export * from './context'; +export * from './copyright'; +export * from './currently-playing'; +export * from './cursor'; +export * from './cursor-paging'; +export * from './device'; +export * from './devices'; +export * from './error'; +export * from './external-id'; +export * from './featured-playlists'; +export * from './followers'; +export * from './genre-seeds'; +export * from './http-methods'; +export * from './image'; +export * from './linked-track'; +export * from './new-releases'; +export * from './paging'; +export * from './play-history'; +export * from './player-error'; +export * from './playlist'; +export * from './playlist-details'; +export * from './playlist-snapshot'; +export * from './playlist-track'; +export * from './private-user'; +export * from './public-user'; +export * from './recommendation-seed'; +export * from './recommendations-response'; +export * from './refresh-response'; +export * from './saved-album'; +export * from './saved-track'; +export * from './scopes'; +export * from './search-result-albums'; +export * from './search-result-all'; +export * from './search-result-artists'; +export * from './search-result-playlists'; +export * from './search-result-tracks'; +export * from './search-type'; +export * from './simplified-album'; +export * from './simplified-artist'; +export * from './simplified-playlist'; +export * from './simplified-track'; +export * from './track'; +export * from './track-array'; +export * from './tuneable-track'; diff --git a/packages/server/src/api/spotify/types/linked-track.ts b/packages/server/src/api/spotify/types/linked-track.ts new file mode 100644 index 0000000..3765e83 --- /dev/null +++ b/packages/server/src/api/spotify/types/linked-track.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface LinkedTrack { + external_urls: any; + href: string; + id: string; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/new-releases.ts b/packages/server/src/api/spotify/types/new-releases.ts new file mode 100644 index 0000000..49d9ca4 --- /dev/null +++ b/packages/server/src/api/spotify/types/new-releases.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Paging, SimplifiedAlbum } from './'; + +export interface NewReleases { + message: string; + albums: Paging; +} diff --git a/packages/server/src/api/spotify/types/paging.ts b/packages/server/src/api/spotify/types/paging.ts new file mode 100644 index 0000000..3ca8804 --- /dev/null +++ b/packages/server/src/api/spotify/types/paging.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface Paging { + items: Array; + href: string; + limit: number; + next: string; + offset: number; + previous: string; + total: number; +} diff --git a/packages/server/src/api/spotify/types/play-history.ts b/packages/server/src/api/spotify/types/play-history.ts new file mode 100644 index 0000000..5d1e56a --- /dev/null +++ b/packages/server/src/api/spotify/types/play-history.ts @@ -0,0 +1,11 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Context, SimplifiedTrack } from './'; + +export interface PlayHistory { + track: SimplifiedTrack; + played_at: Record; + context: Context; +} diff --git a/packages/server/src/api/spotify/types/player-error.ts b/packages/server/src/api/spotify/types/player-error.ts new file mode 100644 index 0000000..c148b0f --- /dev/null +++ b/packages/server/src/api/spotify/types/player-error.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface PlayerError { + status: number; + message: string; + reason: string; +} diff --git a/packages/server/src/api/spotify/types/playlist-details.ts b/packages/server/src/api/spotify/types/playlist-details.ts new file mode 100644 index 0000000..b83b9f3 --- /dev/null +++ b/packages/server/src/api/spotify/types/playlist-details.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface PlaylistDetails { + name: string; + public: boolean; + collaborative: boolean; + description: string; +} diff --git a/packages/server/src/api/spotify/types/playlist-snapshot.ts b/packages/server/src/api/spotify/types/playlist-snapshot.ts new file mode 100644 index 0000000..1b6ff3c --- /dev/null +++ b/packages/server/src/api/spotify/types/playlist-snapshot.ts @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface PlaylistSnapshot { + snapshot_id: string; +} diff --git a/packages/server/src/api/spotify/types/playlist-track.ts b/packages/server/src/api/spotify/types/playlist-track.ts new file mode 100644 index 0000000..ed49f68 --- /dev/null +++ b/packages/server/src/api/spotify/types/playlist-track.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { PublicUser, Track } from './'; + +export interface PlaylistTrack { + added_at: Record; + added_by: PublicUser; + is_local: boolean; + track: Track; +} diff --git a/packages/server/src/api/spotify/types/playlist.ts b/packages/server/src/api/spotify/types/playlist.ts new file mode 100644 index 0000000..520d976 --- /dev/null +++ b/packages/server/src/api/spotify/types/playlist.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Image, PlaylistTrack, PublicUser } from './'; + +export interface Playlist { + collaborative: boolean; + external_urls: any; + href: string; + id: string; + images: Array; + name: string; + owner: PublicUser; + public: boolean; + snapshot_id: string; + tracks: Array; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/private-user.ts b/packages/server/src/api/spotify/types/private-user.ts new file mode 100644 index 0000000..33b4009 --- /dev/null +++ b/packages/server/src/api/spotify/types/private-user.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Followers, Image } from './'; + +export interface PrivateUser { + country: string; + display_name: string; + email: string; + external_urls: any; + followers: Followers; + href: string; + id: string; + images: Array; + product: string; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/public-user.ts b/packages/server/src/api/spotify/types/public-user.ts new file mode 100644 index 0000000..fa5c6d1 --- /dev/null +++ b/packages/server/src/api/spotify/types/public-user.ts @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Followers, Image } from './'; + +export interface PublicUser { + display_name: string; + external_urls: any; + followers: Followers; + href: string; + id: string; + images: Array; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/recommendation-seed.ts b/packages/server/src/api/spotify/types/recommendation-seed.ts new file mode 100644 index 0000000..8d3ca78 --- /dev/null +++ b/packages/server/src/api/spotify/types/recommendation-seed.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface RecommendationSeed { + afterFilteringSize: number; + afterRelinkingSize: number; + href: string; + id: string; + initialPoolSize: number; + type: string; +} diff --git a/packages/server/src/api/spotify/types/recommendations-response.ts b/packages/server/src/api/spotify/types/recommendations-response.ts new file mode 100644 index 0000000..9cd59ef --- /dev/null +++ b/packages/server/src/api/spotify/types/recommendations-response.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { RecommendationSeed, SimplifiedTrack } from './'; + +export interface RecommendationsResponse { + seeds: Array; + tracks: Array; +} diff --git a/packages/server/src/api/spotify/types/refresh-response.ts b/packages/server/src/api/spotify/types/refresh-response.ts new file mode 100644 index 0000000..bcf4e12 --- /dev/null +++ b/packages/server/src/api/spotify/types/refresh-response.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface RefreshResponse { + access_token: string; + expires_in: number; + token_type: string; + scope: string; +} diff --git a/packages/server/src/api/spotify/types/saved-album.ts b/packages/server/src/api/spotify/types/saved-album.ts new file mode 100644 index 0000000..6ac108d --- /dev/null +++ b/packages/server/src/api/spotify/types/saved-album.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Album } from './'; + +export interface SavedAlbum { + added_at: Record; + album: Album; +} diff --git a/packages/server/src/api/spotify/types/saved-track.ts b/packages/server/src/api/spotify/types/saved-track.ts new file mode 100644 index 0000000..8c4eb21 --- /dev/null +++ b/packages/server/src/api/spotify/types/saved-track.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Track } from './'; + +export interface SavedTrack { + added_at: Record; + track: Track; +} diff --git a/packages/server/src/api/spotify/types/scopes.ts b/packages/server/src/api/spotify/types/scopes.ts new file mode 100644 index 0000000..03d3895 --- /dev/null +++ b/packages/server/src/api/spotify/types/scopes.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export enum SCOPES { + APP_REMOTE_CONTROL= 'app-remote-control', + PLAYLIST_MODIFY_PUBLIC= 'playlist-modify-public', + PLAYLIST_READ_COLLABORATIVE= 'playlist-read-collaborative', + PLAYLIST_MODIFY_PRIVATE= 'playlist-modify-private', + STREAMING= 'streaming', + PLAYLIST_READ_PRIVATE= 'playlist-read-private', + UGC_IMAGE_UPLOAD= 'ugc-image-upload', + USER_FOLLOW_READ= 'user-follow-read', + USER_MODIFY_PLAYBACK_STATE= 'user-modify-playback-state', + USER_LIBRARY_MODIFY= 'user-library-modify', + USER_READ_PLAYBACK_STATE= 'user-read-playback-state', + USER_FOLLOW_MODIFY= 'user-follow-modify', + USER_READ_CURRENTLY_PLAYING= 'user-read-currently-playing', + USER_LIBRARY_READ= 'user-library-read', + USER_READ_EMAIL= 'user-read-email', + USER_READ_PLAYBACK_POSITION= 'user-read-playback-position', + USER_READ_PRIVATE= 'user-read-private', + USER_READ_RECENTLY_PLAYED= 'user-read-recently-played', + USER_TOP_READ= 'user-top-read' +} diff --git a/packages/server/src/api/spotify/types/search-result-albums.ts b/packages/server/src/api/spotify/types/search-result-albums.ts new file mode 100644 index 0000000..d815f47 --- /dev/null +++ b/packages/server/src/api/spotify/types/search-result-albums.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Paging, SimplifiedAlbum } from './'; + +export interface SearchResultAlbums { + albums: Paging; +} diff --git a/packages/server/src/api/spotify/types/search-result-all.ts b/packages/server/src/api/spotify/types/search-result-all.ts new file mode 100644 index 0000000..4fab199 --- /dev/null +++ b/packages/server/src/api/spotify/types/search-result-all.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Artist, Paging, SimplifiedAlbum, SimplifiedPlaylist, Track } from './'; + +export interface SearchResultAll { + artists: Paging; + albums: Paging; + tracks: Paging; + playlists: Paging; +} diff --git a/packages/server/src/api/spotify/types/search-result-artists.ts b/packages/server/src/api/spotify/types/search-result-artists.ts new file mode 100644 index 0000000..5d42e3f --- /dev/null +++ b/packages/server/src/api/spotify/types/search-result-artists.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Artist, Paging } from './'; + +export interface SearchResultArtists { + artists: Paging; +} diff --git a/packages/server/src/api/spotify/types/search-result-playlists.ts b/packages/server/src/api/spotify/types/search-result-playlists.ts new file mode 100644 index 0000000..7e45014 --- /dev/null +++ b/packages/server/src/api/spotify/types/search-result-playlists.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Paging, SimplifiedPlaylist } from './'; + +export interface SearchResultPlaylists { + playlists: Paging; +} diff --git a/packages/server/src/api/spotify/types/search-result-tracks.ts b/packages/server/src/api/spotify/types/search-result-tracks.ts new file mode 100644 index 0000000..2a9f4f6 --- /dev/null +++ b/packages/server/src/api/spotify/types/search-result-tracks.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Paging, Track } from './'; + +export interface SearchResultTracks { + tracks: Paging; +} diff --git a/packages/server/src/api/spotify/types/search-type.ts b/packages/server/src/api/spotify/types/search-type.ts new file mode 100644 index 0000000..660b527 --- /dev/null +++ b/packages/server/src/api/spotify/types/search-type.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export enum SearchType { + track, + album, + playlist, + artist +} diff --git a/packages/server/src/api/spotify/types/simplified-album.ts b/packages/server/src/api/spotify/types/simplified-album.ts new file mode 100644 index 0000000..d09d602 --- /dev/null +++ b/packages/server/src/api/spotify/types/simplified-album.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Image, SimplifiedArtist } from './'; + +export interface SimplifiedAlbum { + album_group: string; + album_type: string; + artists: Array; + available_markets: Array; + external_urls: any; + href: string; + id: string; + images: Array; + name: string; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/simplified-artist.ts b/packages/server/src/api/spotify/types/simplified-artist.ts new file mode 100644 index 0000000..8a10d11 --- /dev/null +++ b/packages/server/src/api/spotify/types/simplified-artist.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface SimplifiedArtist { + external_urls: any; + href: string; + id: string; + name: string; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/simplified-playlist.ts b/packages/server/src/api/spotify/types/simplified-playlist.ts new file mode 100644 index 0000000..995afac --- /dev/null +++ b/packages/server/src/api/spotify/types/simplified-playlist.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Image, PlaylistTrack, PublicUser } from './'; + +export interface SimplifiedPlaylist { + collaborative: boolean; + external_urls: any; + href: string; + id: string; + images: Array; + name: string; + owner: PublicUser; + public: boolean; + snapshot_id: string; + tracks: Array; + +} diff --git a/packages/server/src/api/spotify/types/simplified-track.ts b/packages/server/src/api/spotify/types/simplified-track.ts new file mode 100644 index 0000000..297039a --- /dev/null +++ b/packages/server/src/api/spotify/types/simplified-track.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { LinkedTrack, SimplifiedArtist } from './'; + +export interface SimplifiedTrack { + artists: Array; + available_markets: Array; + disc_number: number; + duration_ms: number; + explicit: boolean; + external_urls: any; + href: string; + id: string; + is_playable: boolean; + linked_from: LinkedTrack; + name: string; + preview_url: string; + track_number: number; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/track-array.ts b/packages/server/src/api/spotify/types/track-array.ts new file mode 100644 index 0000000..150d2da --- /dev/null +++ b/packages/server/src/api/spotify/types/track-array.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Track } from './'; + +export interface TrackArray { + tracks: Array; +} diff --git a/packages/server/src/api/spotify/types/track.ts b/packages/server/src/api/spotify/types/track.ts new file mode 100644 index 0000000..facbf8a --- /dev/null +++ b/packages/server/src/api/spotify/types/track.ts @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Artist, ExternalId, SimplifiedAlbum } from './'; + +export interface Track { + album: SimplifiedAlbum; + artists: Array; + available_markets: Array; + disc_number: number; + duration_ms: number; + explicit: boolean; + external_ids: ExternalId; + external_urls: any; + href: string; + id: string; + is_playable: boolean; + linked_from: Track; + restrictions: Record; + name: string; + popularity: number; + preview_url: string; + track_number: number; + type: string; + uri: string; +} diff --git a/packages/server/src/api/spotify/types/tuneable-track.ts b/packages/server/src/api/spotify/types/tuneable-track.ts new file mode 100644 index 0000000..e74a2f9 --- /dev/null +++ b/packages/server/src/api/spotify/types/tuneable-track.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface TuneableTrack { + acousticness: number; + danceability: number; + duration_ms: number; + energy: number + instrumentalness: number; + key: number; + liveness: number; + loudness: number; + mode: number; + popularity: number; + speechiness: number; + tempo: number; + time_signature: number; + valence: number; +} diff --git a/packages/server/src/api/types/access-token.ts b/packages/server/src/api/types/access-token.ts new file mode 100644 index 0000000..e5d7d0c --- /dev/null +++ b/packages/server/src/api/types/access-token.ts @@ -0,0 +1,3 @@ +export interface AccessToken { + memberId: string; +} diff --git a/packages/server/src/api/types/context.ts b/packages/server/src/api/types/context.ts new file mode 100644 index 0000000..7ba1117 --- /dev/null +++ b/packages/server/src/api/types/context.ts @@ -0,0 +1,14 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Member, Party, User } from '../models'; +import { ContainerInstance } from 'typedi'; + +export interface Context { + user: User; + member: Member; + party: Party; + requestId: string; + container: ContainerInstance; +} diff --git a/packages/server/src/api/types/index.ts b/packages/server/src/api/types/index.ts new file mode 100644 index 0000000..bac1fd3 --- /dev/null +++ b/packages/server/src/api/types/index.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './access-token'; +export * from './context'; +export * from './party-state'; +export * from './party-state.enum'; +export * from './vote-type.enum'; diff --git a/packages/server/src/api/types/party-state.enum.ts b/packages/server/src/api/types/party-state.enum.ts new file mode 100644 index 0000000..b71131c --- /dev/null +++ b/packages/server/src/api/types/party-state.enum.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { registerEnumType } from 'type-graphql'; + +export enum PartyStateEnum { + NEW_SONG, + PLAYING, + NOTHING_PLAYING, + PAUSED, + NEXT_FROM_QUEUE +} + +registerEnumType( + PartyStateEnum, { + description: 'The playback state as tracked by upnext', + name: 'PartyStateEnum', + } +); diff --git a/packages/server/src/api/types/party-state.ts b/packages/server/src/api/types/party-state.ts new file mode 100644 index 0000000..4558ed3 --- /dev/null +++ b/packages/server/src/api/types/party-state.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface ArtworkPalette { + vibrant: string; + muted: string; + darkVibrant: string; + darkMuted: string; + lightVibrant: string; + lightMuted: string; +} + +export interface PartyState { + progress?: number; + duration?: number; + name?: string; + artist?: string; + spotifyId?: string; + artwork?: string; + playing?: boolean; + palette?: ArtworkPalette; +} diff --git a/packages/server/src/api/types/vote-type.enum.ts b/packages/server/src/api/types/vote-type.enum.ts new file mode 100644 index 0000000..6caf330 --- /dev/null +++ b/packages/server/src/api/types/vote-type.enum.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { registerEnumType } from 'type-graphql'; + +export enum VoteTypeEnum { + UP_VOTE, + DOWN_VOTE, +} + +registerEnumType( + VoteTypeEnum, { + description: 'The type of vote', + name: 'VoteEnum', + } +); diff --git a/packages/server/src/app.ts b/packages/server/src/app.ts new file mode 100644 index 0000000..0fbdc85 --- /dev/null +++ b/packages/server/src/app.ts @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import 'reflect-metadata'; + +import { Logger } from './util/logger'; + +import { UpNextServer } from './up-next.server'; + +const log = Logger.for('app'); + +UpNextServer + .getInstance() + .main() + .catch(error => log.error( + 'SERVER HAS CRASHED!\n', error + )); diff --git a/packages/server/src/decorators/logger.ts b/packages/server/src/decorators/logger.ts new file mode 100644 index 0000000..55e968f --- /dev/null +++ b/packages/server/src/decorators/logger.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Logger } from '../util/logger'; +import { Container } from 'typedi'; + +export const LogInjector = ( + scope: string, customDecorator?: Array +) => + ( + object: unknown, propertyName: string, index?: number + ): void => { + const logger = Logger.for( + scope, customDecorator + ); + Container.registerHandler({ + index, object, propertyName, value: () => logger, + }); + }; + +export { LoggerInterface } from '../util/logger/logger-interface'; diff --git a/packages/server/src/environment.ts b/packages/server/src/environment.ts new file mode 100644 index 0000000..ff81432 --- /dev/null +++ b/packages/server/src/environment.ts @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import dotenv from 'dotenv'; +import { readFileSync } from 'fs'; +import path from 'path'; + +import { EnvironmentHelpers } from './util/environment-helpers'; + +dotenv.config({ path: path.join( + process.cwd(), `.env${process.env.NODE_ENV==='test' ? '.test':''}` +) }); + +export const environment = { + api: { + route: EnvironmentHelpers.getOsEnv('API_ROUTE'), + }, + app: { + description: 'Upnext cool server', + host: EnvironmentHelpers.getOsEnv('APP_HOST'), + key: EnvironmentHelpers.getOsEnv('APP_KEY'), + name: 'Upnext Server', + port: EnvironmentHelpers.normalizePort(process.env.PORT || EnvironmentHelpers.getOsEnv('APP_PORT')), + schema: EnvironmentHelpers.getOsEnv('APP_SCHEMA'), + version: '0.0.1', + }, + database: { + database: EnvironmentHelpers.getOsEnv('DATABASE_DATABASE'), + host: EnvironmentHelpers.getOsEnv('DATABASE_HOST'), + password: EnvironmentHelpers.getOsEnv('DATABASE_PASSWORD'), + port: EnvironmentHelpers.toNumber(EnvironmentHelpers.getOsEnv('DATABASE_PORT')), + type: EnvironmentHelpers.getOsEnv('DATABASE_TYPE'), + username: EnvironmentHelpers.getOsEnv('DATABASE_USERNAME'), + }, + front: { + url: EnvironmentHelpers.getOsEnv('FRONT_URL'), + version: EnvironmentHelpers.toNumber(EnvironmentHelpers.getOsEnv('FRONT_VERSION')), + }, + graphql: { + enabled: EnvironmentHelpers.toBoolean(EnvironmentHelpers.getOsEnv('GRAPHQL_ENABLED')), + route: EnvironmentHelpers.getOsEnv('GRAPHQL_ROUTE'), + }, + isProduction: EnvironmentHelpers.getOsEnv('PRODUCTION')==='true', + isTest: process.env.NODE_ENV==='test', + logLevel: EnvironmentHelpers.getOsEnv('LOG_LEVEL'), + node: process.env.NODE_ENV || 'development', + spotify: { + clientID: EnvironmentHelpers.getOsEnv('SPOTIFY_CLIENT_ID'), + clientSecret: EnvironmentHelpers.getOsEnv('SPOTIFY_CLIENT_SECRET'), + redirectURI: EnvironmentHelpers.getOsEnv('SPOTIFY_REDIRECT_URI'), + }, + swagger: { + enabled: EnvironmentHelpers.getOsEnv('SWAGGER_ENABLED'), + route: EnvironmentHelpers.getOsEnv('SWAGGER_ROUTE'), + }, +}; diff --git a/packages/server/src/loaders/cron.loader.ts b/packages/server/src/loaders/cron.loader.ts new file mode 100644 index 0000000..a2ffd64 --- /dev/null +++ b/packages/server/src/loaders/cron.loader.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import * as CronJobs from '../api/jobs'; +import { registerController } from 'cron-decorators'; +import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework'; + +import { Logger } from '../util/logger'; + +export const CronLoader: MicroframeworkLoader = (settings: MicroframeworkSettings | undefined) => { + const log = new Logger( + __filename, [ 'CRON' ] + ); + if (settings) { + log.info('Loading Cron jobs...'); + registerController(Object.values(CronJobs)); + } +}; diff --git a/packages/server/src/loaders/express.loader.ts b/packages/server/src/loaders/express.loader.ts new file mode 100644 index 0000000..2e3557c --- /dev/null +++ b/packages/server/src/loaders/express.loader.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import * as Controllers from '../api/controllers'; +import { environment } from '../environment'; +import { Logger } from '../util/logger'; +import * as Middlewares from '../middleware'; +import { Application } from 'express'; +import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework'; +import { createExpressServer } from 'routing-controllers'; + +export const ExpressLoader: MicroframeworkLoader = (settings: MicroframeworkSettings | undefined) => { + const log = Logger.for( + __filename, [ 'EXPRESS' ] + ); + + if (settings) { + log.info('Loading Express'); + const expressApp: Application = createExpressServer({ + classTransformer: true, + controllers: Object.values(Controllers), + cors: true, + defaultErrorHandler: false, + middlewares: Object.values(Middlewares), + routePrefix: `/${environment.api.route}`, + }); + + const server = settings.getData('http').createServer(expressApp); + settings.setData( + 'server', server + ); + settings.setData( + 'express_app', expressApp + ); + } +}; diff --git a/packages/server/src/loaders/file.loader.ts b/packages/server/src/loaders/file.loader.ts new file mode 100644 index 0000000..d09ab18 --- /dev/null +++ b/packages/server/src/loaders/file.loader.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Logger } from '../util/logger'; +import { static as expressStatic } from 'express'; +import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework'; +import path from 'path'; + +export const FileLoader: MicroframeworkLoader = (settings: MicroframeworkSettings | undefined) => { + const log = Logger.for( + __filename, [ 'FILE' ] + ); + + if (settings) { + log.info('Loading Public Dir'); + const expressApp = settings.getData('express_app'); + expressApp.use(expressStatic( + path.join( + __dirname, '..', 'public' + ), { maxAge: 31_557_600_000 } + )); + } +}; diff --git a/packages/server/src/loaders/graphql.loader.ts b/packages/server/src/loaders/graphql.loader.ts new file mode 100644 index 0000000..ef603a3 --- /dev/null +++ b/packages/server/src/loaders/graphql.loader.ts @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ +import { authChecker } from '../api/auth/auth'; +import { context } from '../api/auth/context'; +import { environment } from '../environment'; +import { Logger } from '../util/logger'; +import * as Resolvers from '../api/resolvers'; +import { ApolloServer } from 'apollo-server-express'; +import { Express } from 'express'; +import { execute, subscribe } from 'graphql'; +import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework'; +import { SubscriptionServer } from 'subscriptions-transport-ws'; +import { buildSchema } from 'type-graphql'; +import { Container } from 'typedi'; + +export const GraphqlLoader: MicroframeworkLoader = async (settings: MicroframeworkSettings | undefined) => { + const log = Logger.for( + __filename, [ 'GRAPHQL' ] + ); + if (settings && environment.graphql.enabled) { + log.info('Starting graphql'); + const app: Express = settings.getData('express_app'); + const schema = await buildSchema({ + authChecker, + container: Container, + dateScalarMode: 'isoDate', + resolvers: Object.values(Resolvers) as never + }); + + const apolloServer = new ApolloServer({ + context, + introspection: !environment.isProduction, + logger: log, + playground: !environment.isProduction, + plugins: [ + { + requestDidStart: () => ({ + willSendResponse(requestContext) { + Container.reset(requestContext.context.requestId); + }, + }), + }, + ], + schema, + }); + apolloServer.applyMiddleware({ + app, + path: `/${environment.graphql.route}`, + }); + + const server = settings.getData('server'); + const ss = new SubscriptionServer( + { + execute, + schema, + subscribe, + }, { + path: `/${environment.graphql.route}`, + server, + } + ); + log.info(ss.server.path); + } +}; diff --git a/packages/server/src/loaders/home.loader.ts b/packages/server/src/loaders/home.loader.ts new file mode 100644 index 0000000..d40b621 --- /dev/null +++ b/packages/server/src/loaders/home.loader.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../environment'; +import { Logger } from '../util/logger'; +import { Request, Response } from 'express'; +import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework'; + +export const HomeLoader: MicroframeworkLoader = (settings: MicroframeworkSettings | undefined) => { + const log = Logger.for( + __filename, [ 'HOME' ] + ); + + if (settings) { + const url = `${environment.app.schema}://${environment.app.host}:${environment.app.port}`; + log.info('Loading API Root'); + const expressApp = settings.getData('express_app'); + expressApp.get( + '/', + ( + request: Request, response: Response + ) => response.json({ + description: environment.app.description, + name: environment.app.name, + urls: { + api: `${url}/${environment.api.route}`, + graphql: environment.graphql.enabled ? `${url}/${environment.graphql.route}`:undefined, + swagger: environment.swagger.enabled ? `${url}/${environment.swagger.route}`:undefined, + }, + version: environment.app.version, + }) + ); + expressApp.get( + `/${environment.api.route}`, + ( + request: Request, response: Response + ) => response.send('[API]') + ); + } +}; diff --git a/packages/server/src/loaders/http.loader.ts b/packages/server/src/loaders/http.loader.ts new file mode 100644 index 0000000..085c599 --- /dev/null +++ b/packages/server/src/loaders/http.loader.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../environment'; +import { Logger } from '../util/logger'; +import http from 'http'; +import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework'; + +export const HttpLoader: MicroframeworkLoader = (settings: MicroframeworkSettings | undefined) => { + const log = Logger.for( + __filename, [ 'HTTP' ] + ); + + if (settings) { + log.info('Loading HTTP Instance'); + if (!environment.isTest) { + settings.setData( + 'http', http + ); + } + } +}; diff --git a/packages/server/src/loaders/index.ts b/packages/server/src/loaders/index.ts new file mode 100644 index 0000000..5a6d753 --- /dev/null +++ b/packages/server/src/loaders/index.ts @@ -0,0 +1,15 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './cron.loader'; +export * from './express.loader'; +export * from './file.loader'; +export * from './graphql.loader'; +export * from './home.loader'; +export * from './http.loader'; +export * from './ioc.loader'; +export * from './logger.loader'; +export * from './server.loader'; +export * from './swagger.loader'; +export * from './type-orm.loader'; diff --git a/packages/server/src/loaders/ioc.loader.ts b/packages/server/src/loaders/ioc.loader.ts new file mode 100644 index 0000000..727ed7f --- /dev/null +++ b/packages/server/src/loaders/ioc.loader.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Logger } from '../util/logger'; +import { useContainer as classValidatorUseContainer } from 'class-validator'; +import { useContainer as cronUseContainer } from 'cron-decorators'; +import { MicroframeworkLoader } from 'microframework'; +import { useContainer as routingUseContainer } from 'routing-controllers'; +import { Container } from 'typedi'; +import { useContainer as ormUseContainer } from 'typeorm'; + + +export const IocLoader: MicroframeworkLoader = () => { + const log = Logger.for( + __filename, [ 'IOC' ] + ); + log.info('Loading Containers'); + routingUseContainer(Container); + ormUseContainer(Container); + cronUseContainer(Container); + classValidatorUseContainer(Container); +}; diff --git a/packages/server/src/loaders/logger.loader.ts b/packages/server/src/loaders/logger.loader.ts new file mode 100644 index 0000000..7c5653f --- /dev/null +++ b/packages/server/src/loaders/logger.loader.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../environment'; +import { ConsoleTransport } from '../util/logger'; +import { Format, TransformableInfo } from 'logform'; +import { MicroframeworkLoader } from 'microframework'; +import { configure, format } from 'winston'; + +const formatMessage = (info: { timestamp: unknown; level: unknown; message: unknown; durationMs: unknown; }) => + `[${info.timestamp}] [${info.level}] ${info.message} ${info.durationMs ? `Timer: ${info.durationMs}ms`:''}`; +const formatError = (info: { timestamp: unknown; level: unknown; message: unknown; durationMs: unknown; }) => + `[${info.timestamp}] [${info.level}] ${info.message}`; +const selectFormat = (info: { timestamp: unknown; level: unknown; message: unknown; durationMs: unknown; }) => + info instanceof Error ? formatError(info):formatMessage(info); + +export const LoggerLoader: MicroframeworkLoader = () => { + const { + combine, timestamp, printf, + } = format; + + + const developmentFormat = () => printf(selectFormat as (info: TransformableInfo) => string); + + const consoleLogFormat = (): Format => combine( + timestamp(), developmentFormat() + ); + + configure({ + exitOnError: false, + level: environment.logLevel, + transports: [ new ConsoleTransport({ format: consoleLogFormat() }) ], + }); +}; diff --git a/packages/server/src/loaders/server.loader.ts b/packages/server/src/loaders/server.loader.ts new file mode 100644 index 0000000..b382470 --- /dev/null +++ b/packages/server/src/loaders/server.loader.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../environment'; +import { Logger } from '../util/logger'; +import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework'; + +export const ServerLoader: MicroframeworkLoader = (settings: MicroframeworkSettings | undefined) => { + const log = Logger.for( + __filename, [ 'SERVER' ] + ); + + if (settings) { + log.info('Loading Server'); + settings.getData('server').listen( + environment.app.port, () => { + log.info(`Server Listening on ${environment.app.port}`); + } + ); + } +}; diff --git a/packages/server/src/loaders/swagger.loader.ts b/packages/server/src/loaders/swagger.loader.ts new file mode 100644 index 0000000..f3aa5c9 --- /dev/null +++ b/packages/server/src/loaders/swagger.loader.ts @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../environment'; +import { Logger } from '../util/logger'; +import { validationMetadatasToSchemas } from 'class-validator-jsonschema'; +import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework'; +import { getMetadataArgsStorage } from 'routing-controllers'; +import { routingControllersToSpec } from 'routing-controllers-openapi'; +import * as swaggerUi from 'swagger-ui-express'; + +export const SwaggerLoader: MicroframeworkLoader = (settings: MicroframeworkSettings | undefined) => { + const log = Logger.for( + __filename, [ 'SWAGGER' ] + ); + const DEFAULT_PUBLIC_PORT = 80; + const port = environment.app.port===DEFAULT_PUBLIC_PORT ? '':`:${environment.app.port}`; + const url = `${environment.app.schema}://${environment.app.host}${port}`; + + if (settings && environment.swagger.enabled) { + log.info('Loading Swagger'); + const expressApp = settings.getData('express_app'); + const schemas = validationMetadatasToSchemas(); + const swaggerFile = routingControllersToSpec( + getMetadataArgsStorage(), + {}, + { + components: { + schemas, + }, + info: { + description: environment.app.description, + name: environment.app.name, + title: environment.app.name, + version: environment.app.version, + }, + servers: [ + { + url: `${url}/${environment.api.route}`, + }, + ], + }, + ); + expressApp.use( + `/${environment.swagger.route}`, + ( + request, response, next + ) => next(), + swaggerUi.serve, + swaggerUi.setup(swaggerFile), + ); + } +}; diff --git a/packages/server/src/loaders/type-orm.loader.ts b/packages/server/src/loaders/type-orm.loader.ts new file mode 100644 index 0000000..60e1a91 --- /dev/null +++ b/packages/server/src/loaders/type-orm.loader.ts @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../environment'; +import { Logger } from '../util/logger'; +import * as Models from '../api/models'; +import { MicroframeworkLoader, MicroframeworkSettings } from 'microframework'; +import { ConnectionOptions, createConnection } from 'typeorm'; + +export const TypeOrmLoader: MicroframeworkLoader = async (settings: MicroframeworkSettings | undefined) => { + const log = Logger.for( + __filename, [ 'ORM' ] + ); + + log.info('Loading ORM'); + const options: ConnectionOptions = { + database: environment.database.database, + entities: Object.values(Models), + host: environment.database.host, + logging: [ + 'schema', + 'error', + 'warn', + 'info', + 'log', + ], + password: environment.database.password, + port: environment.database.port, + ssl: { rejectUnauthorized: false }, + synchronize: true, + type: environment.database.type as never, + username: environment.database.username, + }; + log.info('Connecting to DB'); + const connection = await createConnection(options); + + if (settings) { + settings.setData( + 'connection', connection + ); + settings.onShutdown(() => connection.close()); + } +}; diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts deleted file mode 100644 index 966dcdc..0000000 --- a/packages/server/src/main.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * This is not a production server yet! - * This is only a minimal backend to get started. - */ - -import * as express from 'express'; -import * as path from 'path'; - -const app = express(); - -app.use('/assets', express.static(path.join(__dirname, 'assets'))); - -app.get('/api', (req, res) => { - res.send({ message: 'Welcome to server!' }); -}); - -const port = process.env.PORT || 3333; -const server = app.listen(port, () => { - console.log(`Listening at http://localhost:${port}/api`); -}); -server.on('error', console.error); diff --git a/packages/server/src/middleware/error.middleware.ts b/packages/server/src/middleware/error.middleware.ts new file mode 100644 index 0000000..9c9491d --- /dev/null +++ b/packages/server/src/middleware/error.middleware.ts @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { environment } from '../environment'; +import { Logger } from '../util/logger'; +import { NextFunction, Request, Response } from 'express'; +import { ExpressErrorMiddlewareInterface, HttpError, Middleware } from 'routing-controllers'; + +@Middleware({ type: 'after' }) +export class ErrorMiddleware implements ExpressErrorMiddlewareInterface { + private readonly log = Logger.for(__filename); + + error( + error: HttpError, request: Request, response: Response, next: NextFunction + ): void { + const GENERIC_ERROR_CODE = 500; + response.status(error.httpCode || GENERIC_ERROR_CODE); + if (environment.isProduction) { + response.json({ + name: error.name, + }); + } else { + response.json({ + message: error.message, + name: error.name, + }); + } + + this.log.error(error); + next(); + } +} diff --git a/packages/server/src/middleware/index.ts b/packages/server/src/middleware/index.ts new file mode 100644 index 0000000..10c43dd --- /dev/null +++ b/packages/server/src/middleware/index.ts @@ -0,0 +1,6 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './error.middleware'; +export * from './log.middleware'; diff --git a/packages/server/src/middleware/log.middleware.ts b/packages/server/src/middleware/log.middleware.ts new file mode 100644 index 0000000..d13fe75 --- /dev/null +++ b/packages/server/src/middleware/log.middleware.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { Logger } from '../util/logger'; +import chalk from 'chalk'; +import { NextFunction, Request, Response } from 'express'; +import { ExpressMiddlewareInterface, Middleware } from 'routing-controllers'; + +@Middleware({ type: 'before' }) +export class LogMiddleware implements ExpressMiddlewareInterface { + private readonly log = Logger.for( + __filename, [ chalk.yellow('EXPRESS') ] + ); + + static colourizeHttpMethod(method: string): string { + switch (method) { + case 'GET': + return chalk.blue(method); + case 'POST': + return chalk.green(method); + case 'DELETE': + return chalk.red(method); + case 'PUT': + return chalk.yellow(method); + default: + return method; + } + } + + use( + request: Request, response: Response, next: NextFunction + ): void { + const method = LogMiddleware.colourizeHttpMethod(request.method); + this.log.debug(`(${method}) ${request.path}`); + next(); + } +} diff --git a/packages/server/src/up-next.server.ts b/packages/server/src/up-next.server.ts new file mode 100644 index 0000000..bd6702a --- /dev/null +++ b/packages/server/src/up-next.server.ts @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import { + CronLoader, + ExpressLoader, + FileLoader, + GraphqlLoader, + HomeLoader, + HttpLoader, + IocLoader, + LoggerLoader, + ServerLoader, + SwaggerLoader, + TypeOrmLoader, +} from './loaders'; +import { Logger } from './util/logger'; +import { bootstrapMicroframework } from 'microframework'; + +import { banner } from './util/banner'; + +export class UpNextServer { + private log = Logger.for(__filename); + + static getInstance(): UpNextServer { + return new UpNextServer(); + } + + async main(): Promise { + await bootstrapMicroframework({ + config: { + debug: true, + showBootstrapTime: true, + }, + loaders: [ + LoggerLoader, + HttpLoader, + IocLoader, + TypeOrmLoader, + ExpressLoader, + SwaggerLoader, + HomeLoader, + FileLoader, + ServerLoader, + GraphqlLoader, + CronLoader + ], + }); + await banner(this.log); + } +} diff --git a/packages/server/src/util/banner.ts b/packages/server/src/util/banner.ts new file mode 100644 index 0000000..be1b86d --- /dev/null +++ b/packages/server/src/util/banner.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import * as Controllers from '../api/controllers'; +import { environment } from '../environment'; +import * as CronJobs from '../api/jobs'; +import * as Loaders from '../loaders'; +import { Logger } from './logger'; +import * as Middlewares from '../middleware'; +import * as Models from '../api/models'; +import * as Resolvers from '../api/resolvers'; +import * as Services from '../api/services'; + +export const banner = (log: Logger): void => { + const route = () => `${environment.app.schema}://${environment.app.host}:${environment.app.port}/`; + log.info('-------------------------------------------------------------------------------------------------'); + log.info(''); + log.info(`${environment.app.name}`); + log.info(''); + log.info('-------------------------------------------------------------------------------------------------'); + log.info(`Environment : ${environment.node}`); + log.info(`Version : ${environment.app.version}`); + log.info(''); + log.info(`API Info : ${route()}${environment.api.route}`); + if (environment.swagger.enabled) { + log.info(`Swagger : ${route()}${environment.swagger.route}`); + } + if (environment.graphql.enabled) { + log.info(`Graphql : ${route()}${environment.graphql.route}`); + } + log.info('-------------------------------------------------------'); + log.info(`Loaded Loaders: [${Object.keys(Loaders)}]`); + log.info(`Loaded Entities: [${Object.keys(Models)}]`); + log.info(`Loaded Controllers: [${Object.keys(Controllers)}]`); + log.info(`Loaded Resolvers: [${Object.keys(Resolvers)}]`); + log.info(`Loaded Middlewares: [${Object.keys(Middlewares)}]`); + log.info(`Loaded Services: [${Object.keys(Services)}]`); + log.info(`Loaded Jobs: [${Object.keys(CronJobs)}]`); + log.info('-------------------------------------------------------'); + log.info(''); +}; diff --git a/packages/server/src/util/environment-helpers.ts b/packages/server/src/util/environment-helpers.ts new file mode 100644 index 0000000..ef5e408 --- /dev/null +++ b/packages/server/src/util/environment-helpers.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export const EnvironmentHelpers = { + getOsEnv(key: string): string { + // eslint-disable-next-line security/detect-object-injection + if (typeof process.env[key]==='undefined') { + throw new TypeError(`Environment variable ${key} is not set.`); + } + // eslint-disable-next-line security/detect-object-injection + return process.env[key] as string; + }, + + normalizePort(port: string): number { + const parsedPort = Number.parseInt( + port, 10 + ); + if (parsedPort >= 0) { + return parsedPort; + } + return undefined; + }, + + toBoolean(value: string): boolean { + return value==='true'; + }, + + toNumber(value: string): number { + return Number.parseInt( + value, 10 + ); + }, +}; diff --git a/packages/server/src/util/logger/index.ts b/packages/server/src/util/logger/index.ts new file mode 100644 index 0000000..ef75dcc --- /dev/null +++ b/packages/server/src/util/logger/index.ts @@ -0,0 +1,7 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export * from './logger'; +export * from './logger-interface'; +export * from './transports/console-transport'; diff --git a/packages/server/src/util/logger/logger-interface.ts b/packages/server/src/util/logger/logger-interface.ts new file mode 100644 index 0000000..5dfcbf8 --- /dev/null +++ b/packages/server/src/util/logger/logger-interface.ts @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +export interface LoggerInterface { + debug(...arguments_: Array): void; + + info(...arguments_: Array): void; + + warn(...arguments_: Array): void; + + error(...arguments_: Array): void; +} diff --git a/packages/server/src/util/logger/logger.ts b/packages/server/src/util/logger/logger.ts new file mode 100644 index 0000000..3b9217e --- /dev/null +++ b/packages/server/src/util/logger/logger.ts @@ -0,0 +1,104 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import chalk from 'chalk'; +import path from 'path'; +import winston from 'winston'; + +import { environment } from '../../environment'; +import { LoggerInterface } from './logger-interface'; + +export class Logger implements LoggerInterface { + static DEFAULT_SCOPE = 'app'; + + private readonly scope: string; + + private readonly customDecorators: Array; + + constructor( + scope?: string, customDecorators?: Array + ) { + // eslint-disable-next-line immutable/no-mutation + this.scope = Logger.parsePathToScope(scope || Logger.DEFAULT_SCOPE); + // eslint-disable-next-line immutable/no-mutation + this.customDecorators = customDecorators || []; + } + + static for( + scope?: string, customDecorators?: Array + ): Logger { + return new Logger( + scope, customDecorators + ); + } + + private static parsePathToScope(filepath: string): string { + return filepath.replace( + process.cwd(), '' + ) + .replace( + `${path.sep}src${path.sep}`, '' + ) + .replace( + `${path.sep}dist${path.sep}`, '' + ) + .replace( + '.ts', '' + ) + .replace( + '.js', '' + ) + .split(path.sep).join(':').split('.')[0]; + } + + debug(...arguments_: Array): void { + this.log( + 'debug', arguments_ + ); + } + + info(...arguments_: Array): void { + this.log( + 'info', arguments_ + ); + } + + warn(...arguments_: Array): void { + this.log( + 'warn', arguments_ + ); + } + + error(...arguments_: Array): void { + this.log( + 'error', arguments_ + ); + } + + private log( + level: string, message: Array + ): void { + const messageParts = message.map(m => { + if (m && typeof m!=='string') { + if (m && m instanceof Error) { + return environment.isProduction ? `${m.name}: ${m.message}`:`${m.name}: ${m.message}\n${m.stack}`; + } else if (m.toString) { + return m.toString(); + } + return JSON.stringify(m); + } + return m; + }); + // eslint-disable-next-line security/detect-object-injection + winston[level](`${this.formatScope()}${this.formatCustomDecorators()} ${messageParts.join(' ')}`); + } + + private formatCustomDecorators(): string { + return this.customDecorators.map(d => `[${chalk.cyan(d)}]`).join(''); + } + + private formatScope(): string { + return `[${chalk.blueBright(this.scope)}]`; + } +} diff --git a/packages/server/src/util/logger/transports/console-transport.ts b/packages/server/src/util/logger/transports/console-transport.ts new file mode 100644 index 0000000..ffdb822 --- /dev/null +++ b/packages/server/src/util/logger/transports/console-transport.ts @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2021, Ethan Elliott + */ + +import chalk from 'chalk'; +import Transport from 'winston-transport'; + +export type LogLevel = 'error' | 'warn' | 'help' | 'info' | 'debug' | 'silly' | string; + +export class ConsoleTransport extends Transport { + // Until @Override becomes a thing + static colourizeLevel(level: LogLevel): string { + switch (level) { + case 'error': + return chalk.red(level); + case 'warn': + return chalk.redBright(level); + case 'help': + return chalk.cyan(level); + case 'info': + return chalk.green(level); + case 'debug': + return chalk.blue(level); + case 'silly': + return chalk.magenta(level); + default: + return level; + } + } + + // eslint-disable-next-line class-methods-use-this + log( + info: Record, next: () => void + ): void { + // eslint-disable-next-line no-console + console.log(`[${chalk.magenta(info.timestamp)}][${ConsoleTransport.colourizeLevel(info.level)}]${info.message}`); + next(); + } +} diff --git a/packages/server/tsconfig.app.json b/packages/server/tsconfig.app.json index efa8414..d8b393c 100644 --- a/packages/server/tsconfig.app.json +++ b/packages/server/tsconfig.app.json @@ -3,7 +3,8 @@ "compilerOptions": { "outDir": "../../dist/out-tsc", "module": "commonjs", - "types": ["node", "express"] + "types": ["node", "express"], + "esModuleInterop": true }, "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], "include": ["src/**/*.ts"] diff --git a/yarn.lock b/yarn.lock index 272dd5b..bca9820 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,6 +33,65 @@ __metadata: languageName: node linkType: hard +"@apollo/protobufjs@npm:1.2.2": + version: 1.2.2 + resolution: "@apollo/protobufjs@npm:1.2.2" + dependencies: + "@protobufjs/aspromise": ^1.1.2 + "@protobufjs/base64": ^1.1.2 + "@protobufjs/codegen": ^2.0.4 + "@protobufjs/eventemitter": ^1.1.0 + "@protobufjs/fetch": ^1.1.0 + "@protobufjs/float": ^1.0.2 + "@protobufjs/inquire": ^1.1.0 + "@protobufjs/path": ^1.1.2 + "@protobufjs/pool": ^1.1.0 + "@protobufjs/utf8": ^1.1.0 + "@types/long": ^4.0.0 + "@types/node": ^10.1.0 + long: ^4.0.0 + bin: + apollo-pbjs: bin/pbjs + apollo-pbts: bin/pbts + checksum: 3f3ec1f428cbcc53760daa6f1076c9043a5aa270b2c9a2ca9f97610eabd3ee1aea08dd36fac658bab83eb6607bc62340bbc6c13ba6bba3c6776df71d68b55929 + languageName: node + linkType: hard + +"@apollographql/apollo-tools@npm:^0.5.0": + version: 0.5.4 + resolution: "@apollographql/apollo-tools@npm:0.5.4" + peerDependencies: + graphql: ^14.2.1 || ^15.0.0 || ^16.0.0 + checksum: 673eaaf371504939b58c2717334e237639d3c277ec9b1b9cc7a53a1ad24ded456a6e49bbf2ecf26a64f4b92b04c12cd48f6e22066c6041ae30f2ba4720fb01b6 + languageName: node + linkType: hard + +"@apollographql/graphql-playground-html@npm:1.6.27": + version: 1.6.27 + resolution: "@apollographql/graphql-playground-html@npm:1.6.27" + dependencies: + xss: ^1.0.8 + checksum: a345e8c7d12eba6f6c0e081b97254061f802b31a85e3e5be4bf11dd81cb5e3785801b206b39940eeaf437062da0690d106f48c1d777f5539f4c88c42d263b3bc + languageName: node + linkType: hard + +"@apollographql/graphql-upload-8-fork@npm:^8.1.4": + version: 8.1.4 + resolution: "@apollographql/graphql-upload-8-fork@npm:8.1.4" + dependencies: + "@types/express": "*" + "@types/fs-capacitor": ^2.0.0 + "@types/koa": "*" + busboy: ^0.3.1 + fs-capacitor: ^2.0.4 + http-errors: ^1.7.3 + object-path: ^0.11.4 + peerDependencies: + graphql: 0.13.1 - 15 + checksum: 0d8db5afe8a26befb20b1cc6f2a43f0f6224ccd394606710bb00a45f0a45002635cbd6d2958362e9df8f1371b177fad1f2070739e79eae2c0df5d5d9039947bf + languageName: node + linkType: hard + "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.7, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.8.3": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" @@ -72,6 +131,31 @@ __metadata: languageName: node linkType: hard +"@babel/eslint-parser@npm:^7.12.16": + version: 7.19.1 + resolution: "@babel/eslint-parser@npm:7.19.1" + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 + eslint-visitor-keys: ^2.1.0 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ">=7.11.0" + eslint: ^7.5.0 || ^8.0.0 + checksum: 6d5360f62f25ed097250657deb1bc4c4f51a5f5f2fe456e98cda13727753fdf7a11a109b4cfa03ef0dd6ced3beaeb703b76193c1141e29434d1f91f1bac0517d + languageName: node + linkType: hard + +"@babel/generator@npm:7.18.2": + version: 7.18.2 + resolution: "@babel/generator@npm:7.18.2" + dependencies: + "@babel/types": ^7.18.2 + "@jridgewell/gen-mapping": ^0.3.0 + jsesc: ^2.5.1 + checksum: d0661e95532ddd97566d41fec26355a7b28d1cbc4df95fe80cc084c413342935911b48db20910708db39714844ddd614f61c2ec4cca3fb10181418bdcaa2e7a3 + languageName: node + linkType: hard + "@babel/generator@npm:^7.20.7, @babel/generator@npm:^7.7.2": version: 7.20.7 resolution: "@babel/generator@npm:7.20.7" @@ -181,7 +265,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": +"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": version: 7.19.1 resolution: "@babel/helper-validator-identifier@npm:7.19.1" checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a @@ -217,6 +301,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:7.18.4": + version: 7.18.4 + resolution: "@babel/parser@npm:7.18.4" + bin: + parser: ./bin/babel-parser.js + checksum: e05b2dc720c4b200e088258f3c2a2de5041c140444edc38181d1217b10074e881a7133162c5b62356061f26279f08df5a06ec14c5842996ee8601ad03c57a44f + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.4, @babel/parser@npm:^7.20.7": version: 7.20.7 resolution: "@babel/parser@npm:7.20.7" @@ -382,6 +475,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.7.2": + version: 7.20.13 + resolution: "@babel/runtime@npm:7.20.13" + dependencies: + regenerator-runtime: ^0.13.11 + checksum: 09b7a97a05c80540db6c9e4ddf8c5d2ebb06cae5caf3a87e33c33f27f8c4d49d9c67a2d72f1570e796045288fad569f98a26ceba0c4f5fad2af84b6ad855c4fb + languageName: node + linkType: hard + "@babel/template@npm:^7.18.10, @babel/template@npm:^7.20.7, @babel/template@npm:^7.3.3": version: 7.20.7 resolution: "@babel/template@npm:7.20.7" @@ -411,7 +513,17 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": +"@babel/types@npm:7.18.4": + version: 7.18.4 + resolution: "@babel/types@npm:7.18.4" + dependencies: + "@babel/helper-validator-identifier": ^7.16.7 + to-fast-properties: ^2.0.0 + checksum: 85df59beb99c1b95e9e41590442f2ffa1e5b1b558d025489db40c9f7c906bd03a17da26c3ec486e5800e80af27c42ca7eee9506d9212ab17766d2d68d30fbf52 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.2, @babel/types@npm:^7.18.6, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": version: 7.20.7 resolution: "@babel/types@npm:7.20.7" dependencies: @@ -429,6 +541,13 @@ __metadata: languageName: node linkType: hard +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -438,6 +557,35 @@ __metadata: languageName: node linkType: hard +"@dabh/diagnostics@npm:^2.0.2": + version: 2.0.3 + resolution: "@dabh/diagnostics@npm:2.0.3" + dependencies: + colorspace: 1.1.x + enabled: 2.0.x + kuler: ^2.0.0 + checksum: 4879600c55c8315a0fb85fbb19057bad1adc08f0a080a8cb4e2b63f723c379bfc4283b68123a2b078d367b327dd8df12fcb27464efe791addc0a48b9df6d79a1 + languageName: node + linkType: hard + +"@discoveryjs/json-ext@npm:^0.5.0": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 + languageName: node + linkType: hard + +"@es-joy/jsdoccomment@npm:0.9.0-alpha.1": + version: 0.9.0-alpha.1 + resolution: "@es-joy/jsdoccomment@npm:0.9.0-alpha.1" + dependencies: + comment-parser: 1.1.6-beta.0 + esquery: ^1.4.0 + jsdoc-type-pratt-parser: 1.0.4 + checksum: b178379056e23de438f87935c6ce4ea4f99c50045f7d247e4fddbfba6a3afecc100530847ebbbb381dbebb58bea5e63b947298bcb60910134f46a9197325bbf7 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^1.2.3": version: 1.4.1 resolution: "@eslint/eslintrc@npm:1.4.1" @@ -806,6 +954,146 @@ __metadata: languageName: node linkType: hard +"@jimp/bmp@npm:^0.16.2": + version: 0.16.2 + resolution: "@jimp/bmp@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + "@jimp/utils": ^0.16.2 + bmp-js: ^0.1.0 + peerDependencies: + "@jimp/custom": ">=0.3.5" + checksum: e52d2f77d5d32678f0245b7a77fa0a4d52b37ec198b9605e78c0c3de63b1cc3c7ef06fefc2732d675edac9e941ca4c95bbced81ff5a698f2073e8ec2e2258f4c + languageName: node + linkType: hard + +"@jimp/core@npm:^0.16.2": + version: 0.16.2 + resolution: "@jimp/core@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + "@jimp/utils": ^0.16.2 + any-base: ^1.1.0 + buffer: ^5.2.0 + exif-parser: ^0.1.12 + file-type: ^9.0.0 + load-bmfont: ^1.3.1 + mkdirp: ^0.5.1 + phin: ^2.9.1 + pixelmatch: ^4.0.2 + tinycolor2: ^1.4.1 + checksum: 16bcc2be91c86ee3b523af98b4f08cb159f2705761b67cc5209c2d97d98f9a6f8b25f80995ca58f8665f43c068e05d8cf19018206fc8ec41100b1c177c506406 + languageName: node + linkType: hard + +"@jimp/custom@npm:^0.16.1": + version: 0.16.2 + resolution: "@jimp/custom@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + "@jimp/core": ^0.16.2 + checksum: 2edca54cc87144e7668b1e154150abfe6663baa83d609035ae5f2412cc767345c33c0b7700b7b1a4995e1d975301712568f1b548f55a6dc03634bd4bfd4492e9 + languageName: node + linkType: hard + +"@jimp/gif@npm:^0.16.2": + version: 0.16.2 + resolution: "@jimp/gif@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + "@jimp/utils": ^0.16.2 + gifwrap: ^0.9.2 + omggif: ^1.0.9 + peerDependencies: + "@jimp/custom": ">=0.3.5" + checksum: 0699df7170b3e11e7a1738205404cfe4a9bf54ad30e405826aa7539c4f389bbca2d9576bc03769e8d52ce474fd19ec392725420fc373fb47986a90fc5680b52e + languageName: node + linkType: hard + +"@jimp/jpeg@npm:^0.16.2": + version: 0.16.2 + resolution: "@jimp/jpeg@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + "@jimp/utils": ^0.16.2 + jpeg-js: ^0.4.2 + peerDependencies: + "@jimp/custom": ">=0.3.5" + checksum: cae9d8fc323d2d673b0104aebc60764de9681c5c213417b8cc67d11d1251361a7f5b0bc37fb76fc84ece4d13e1c2de5e9f23dfdb1510fd5e280e95efa2329dda + languageName: node + linkType: hard + +"@jimp/plugin-resize@npm:^0.16.1": + version: 0.16.2 + resolution: "@jimp/plugin-resize@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + "@jimp/utils": ^0.16.2 + peerDependencies: + "@jimp/custom": ">=0.3.5" + checksum: f8fdf9de6fd157c4d4f1eb4a80bd39bd32833fc05d5033ef438de52b30830746d3830d5d255f6a49fa59f25e210bc37c8a1f4301d7427b2ebd508c28c0fa4446 + languageName: node + linkType: hard + +"@jimp/png@npm:^0.16.2": + version: 0.16.2 + resolution: "@jimp/png@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + "@jimp/utils": ^0.16.2 + pngjs: ^3.3.3 + peerDependencies: + "@jimp/custom": ">=0.3.5" + checksum: c25e0fdd3bf296e0df6e514ced95b59135590742a5243ef1070644140aa550311fcc0c4fa9f96d43a850b6499dea7507209c5a3825419bb8c4b25ca4eca8cd92 + languageName: node + linkType: hard + +"@jimp/tiff@npm:^0.16.2": + version: 0.16.2 + resolution: "@jimp/tiff@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + utif: ^2.0.1 + peerDependencies: + "@jimp/custom": ">=0.3.5" + checksum: 7fc11c13c1ca8e65659b798af4ef8d06a2e2bce825805c1b448ccc9376999a7da051d33c64497c44d75dfc6127cd3d15753716c9e8e6678acf8efdf54b9d088a + languageName: node + linkType: hard + +"@jimp/types@npm:^0.16.1": + version: 0.16.2 + resolution: "@jimp/types@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + "@jimp/bmp": ^0.16.2 + "@jimp/gif": ^0.16.2 + "@jimp/jpeg": ^0.16.2 + "@jimp/png": ^0.16.2 + "@jimp/tiff": ^0.16.2 + timm: ^1.6.1 + peerDependencies: + "@jimp/custom": ">=0.3.5" + checksum: 529e234a4c8ee3470dbedeef8c41bde702e5aebb4049c0b7b66fda6972039d74618236fd36e316b7393670106264011ae89e55b370b9589a6a4b6cddcca26eff + languageName: node + linkType: hard + +"@jimp/utils@npm:^0.16.2": + version: 0.16.2 + resolution: "@jimp/utils@npm:0.16.2" + dependencies: + "@babel/runtime": ^7.7.2 + regenerator-runtime: ^0.13.3 + checksum: 96f3c815f3ac5bd16ab7cdfe97eef9839e070fca6d15ca171dbf934a8ab9af17ad4c861445ca69d0f00a4ea5fe70303efbde77325c5b181db5441d6bfa96b444 + languageName: node + linkType: hard + +"@josephg/resolvable@npm:^1.0.0": + version: 1.0.1 + resolution: "@josephg/resolvable@npm:1.0.1" + checksum: 64eb763b5138bdae4fb59c0c0e89ed261b690917ae6bd777b533257668f151b8868698fb73dfd7665746ad07c7c917fe89ccfdf2404048d39f373f57f1a14e34 + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.1.0": version: 0.1.1 resolution: "@jridgewell/gen-mapping@npm:0.1.1" @@ -885,6 +1173,15 @@ __metadata: languageName: node linkType: hard +"@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": + version: 5.1.1-v1 + resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" + dependencies: + eslint-scope: 5.1.1 + checksum: f2e3b2d6a6e2d9f163ca22105910c9f850dc4897af0aea3ef0a5886b63d8e1ba6505b71c99cb78a3bba24a09557d601eb21c8dede3f3213753fcfef364eb0e57 + languageName: node + linkType: hard + "@node-ipc/js-queue@npm:2.0.3": version: 2.0.3 resolution: "@node-ipc/js-queue@npm:2.0.3" @@ -1246,6 +1543,79 @@ __metadata: languageName: node linkType: hard +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 011fe7ef0826b0fd1a95935a033a3c0fd08483903e1aa8f8b4e0704e3233406abb9ee25350ec0c20bbecb2aad8da0dcea58b392bbd77d6690736f02c143865d2 + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 67173ac34de1e242c55da52c2f5bdc65505d82453893f9b51dc74af9fe4c065cf4a657a4538e91b0d4a1a1e0a0642215e31894c31650ff6e3831471061e1ee9e + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 59240c850b1d3d0b56d8f8098dd04787dcaec5c5bd8de186fa548de86b86076e1c50e80144b90335e705a044edf5bc8b0998548474c2a10a98c7e004a1547e4b + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 0369163a3d226851682f855f81413cbf166cd98f131edb94a0f67f79e75342d86e89df9d7a1df08ac28be2bc77e0a7f0200526bb6c2a407abbfee1f0262d5fd7 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": ^1.1.1 + "@protobufjs/inquire": ^1.1.0 + checksum: 3fce7e09eb3f1171dd55a192066450f65324fd5f7cc01a431df01bb00d0a895e6bfb5b0c5561ce157ee1d886349c90703d10a4e11a1a256418ff591b969b3477 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 5781e1241270b8bd1591d324ca9e3a3128d2f768077a446187a049e36505e91bc4156ed5ac3159c3ce3d2ba3743dbc757b051b2d723eea9cd367bfd54ab29b2f + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: ca06f02eaf65ca36fb7498fc3492b7fc087bfcc85c702bac5b86fad34b692bdce4990e0ef444c1e2aea8c034227bd1f0484be02810d5d7e931c55445555646f4 + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 856eeb532b16a7aac071cacde5c5620df800db4c80cee6dbc56380524736205aae21e5ae47739114bf669ab5e8ba0e767a282ad894f3b5e124197cb9224445ee + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: d6a34fbbd24f729e2a10ee915b74e1d77d52214de626b921b2d77288bd8f2386808da2315080f2905761527cceffe7ec34c7647bd21a5ae41a25e8212ff79451 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: f9bf3163d13aaa3b6f5e6fbf37a116e094ea021c0e1f2a7ccd0e12a29e2ce08dafba4e8b36e13f8ed7397e1591610ce880ed1289af4d66cf4ace8a36a9557278 + languageName: node + linkType: hard + "@sideway/address@npm:^4.1.3": version: 4.1.4 resolution: "@sideway/address@npm:4.1.4" @@ -1315,6 +1685,13 @@ __metadata: languageName: node linkType: hard +"@sqltools/formatter@npm:^1.2.2": + version: 1.2.5 + resolution: "@sqltools/formatter@npm:1.2.5" + checksum: 9b8354e715467d660daa5afe044860b5686bbb1a5cb67a60866b932effafbf5e8b429f19a8ae67cd412065a4f067161f227e182f3664a0245339d5eb1e26e355 + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -1357,6 +1734,15 @@ __metadata: languageName: node linkType: hard +"@types/accepts@npm:*, @types/accepts@npm:^1.3.5": + version: 1.3.5 + resolution: "@types/accepts@npm:1.3.5" + dependencies: + "@types/node": "*" + checksum: 590b7580570534a640510c071e09074cf63b5958b237a728f94322567350aea4d239f8a9d897a12b15c856b992ee4d7907e9812bb079886af2c00714e7fb3f60 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.1.20 resolution: "@types/babel__core@npm:7.1.20" @@ -1408,6 +1794,16 @@ __metadata: languageName: node linkType: hard +"@types/body-parser@npm:1.19.0": + version: 1.19.0 + resolution: "@types/body-parser@npm:1.19.0" + dependencies: + "@types/connect": "*" + "@types/node": "*" + checksum: 15043566f1909e2a08dabb0a5d2642f8988545a1369bc5995fc40ee90c95200da2aa66f9240fcb19fc6af6ff4e27ff453f311b49363c14bb308c308c0751ca9b + languageName: node + linkType: hard + "@types/bonjour@npm:^3.5.9": version: 3.5.10 resolution: "@types/bonjour@npm:3.5.10" @@ -1436,6 +1832,32 @@ __metadata: languageName: node linkType: hard +"@types/content-disposition@npm:*": + version: 0.5.5 + resolution: "@types/content-disposition@npm:0.5.5" + checksum: fdf7379db1d509990bcf9a21d85f05aad878596f28b1418f9179f6436cb22513262c670ce88c6055054a7f5804a9303eeacb70aa59a5e11ffdc1434559db9692 + languageName: node + linkType: hard + +"@types/cookies@npm:*": + version: 0.7.7 + resolution: "@types/cookies@npm:0.7.7" + dependencies: + "@types/connect": "*" + "@types/express": "*" + "@types/keygrip": "*" + "@types/node": "*" + checksum: d3759efc1182cb0651808570ae13638677b67b0ea724eef7b174e58ffe6ea044b62c7c2715e532f76f88fce4dd8101ed32ac6fbb73226db654017924e8a2a1e6 + languageName: node + linkType: hard + +"@types/cors@npm:2.8.10": + version: 2.8.10 + resolution: "@types/cors@npm:2.8.10" + checksum: f87e2f7bb6b4e3a143713a8e6def1791c47e8b3d344d30b6a190cae729de2f50df656c51fc92d5bdf7c5536cb32624f73bab244f6396a35aae0119e7c7bbad73 + languageName: node + linkType: hard + "@types/eslint-scope@npm:^3.7.3": version: 3.7.4 resolution: "@types/eslint-scope@npm:3.7.4" @@ -1470,7 +1892,7 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18, @types/express-serve-static-core@npm:^4.17.31": +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18, @types/express-serve-static-core@npm:^4.17.21, @types/express-serve-static-core@npm:^4.17.31": version: 4.17.32 resolution: "@types/express-serve-static-core@npm:4.17.32" dependencies: @@ -1481,7 +1903,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13": +"@types/express@npm:*, @types/express@npm:^4.17.12, @types/express@npm:^4.17.13": version: 4.17.15 resolution: "@types/express@npm:4.17.15" dependencies: @@ -1505,6 +1927,25 @@ __metadata: languageName: node linkType: hard +"@types/fs-capacitor@npm:^2.0.0": + version: 2.0.0 + resolution: "@types/fs-capacitor@npm:2.0.0" + dependencies: + "@types/node": "*" + checksum: 367079834ddb8984e9b740d4219d01cfa9683e8552b1dfda473817e7f2b33d750453adda148d1b99cb67bd6e990fad8bd31e4034b5e9311dfb9803e6f1fbb0dc + languageName: node + linkType: hard + +"@types/glob@npm:^7.1.3": + version: 7.2.0 + resolution: "@types/glob@npm:7.2.0" + dependencies: + "@types/minimatch": "*" + "@types/node": "*" + checksum: 6ae717fedfdfdad25f3d5a568323926c64f52ef35897bcac8aca8e19bc50c0bd84630bbd063e5d52078b2137d8e7d3c26eabebd1a2f03ff350fff8a91e79fc19 + languageName: node + linkType: hard + "@types/graceful-fs@npm:^4.1.3": version: 4.1.5 resolution: "@types/graceful-fs@npm:4.1.5" @@ -1521,6 +1962,20 @@ __metadata: languageName: node linkType: hard +"@types/http-assert@npm:*": + version: 1.5.3 + resolution: "@types/http-assert@npm:1.5.3" + checksum: 9553e5a0b8bcfdac4b51d3fa3b89a91b5450171861a667a5b4c47204e0f4a1ca865d97396e6ceaf220e87b64d06b7a8bad7bfba15ef97acb41a87507c9940dbc + languageName: node + linkType: hard + +"@types/http-errors@npm:*": + version: 2.0.1 + resolution: "@types/http-errors@npm:2.0.1" + checksum: 3bb0c50b0a652e679a84c30cd0340d696c32ef6558518268c238840346c077f899315daaf1c26c09c57ddd5dc80510f2a7f46acd52bf949e339e35ed3ee9654f + languageName: node + linkType: hard + "@types/http-proxy@npm:^1.17.8": version: 1.17.9 resolution: "@types/http-proxy@npm:1.17.9" @@ -1576,13 +2031,59 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.11 resolution: "@types/json-schema@npm:7.0.11" checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d languageName: node linkType: hard +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac + languageName: node + linkType: hard + +"@types/keygrip@npm:*": + version: 1.0.2 + resolution: "@types/keygrip@npm:1.0.2" + checksum: 60bc2738a4f107070ee3d96f44709cb38f3a96c7ccabab09f56c1b2b4d85f869fd8fb9f1f2937e863d0e9e781f005c2223b823bf32b859185b4f52370c352669 + languageName: node + linkType: hard + +"@types/koa-compose@npm:*": + version: 3.2.5 + resolution: "@types/koa-compose@npm:3.2.5" + dependencies: + "@types/koa": "*" + checksum: 5d1147c4b057eb158195f442f0384f06503f3e69dba99fb517b30a05261a9f92928945c12bb1cfc17a5b7d60db003f38b455a3a9b125f12e4fc81fffa396b3cf + languageName: node + linkType: hard + +"@types/koa@npm:*": + version: 2.13.5 + resolution: "@types/koa@npm:2.13.5" + dependencies: + "@types/accepts": "*" + "@types/content-disposition": "*" + "@types/cookies": "*" + "@types/http-assert": "*" + "@types/http-errors": "*" + "@types/keygrip": "*" + "@types/koa-compose": "*" + "@types/node": "*" + checksum: e3b634d934b79ce8f394bf4130511596081f9c073dbfb4309aa32e4c421c47049a002b65111f8d9687eabec55d5a27b1b9ae0699afa83894cb7032c3536bfa17 + languageName: node + linkType: hard + +"@types/long@npm:^4.0.0": + version: 4.0.2 + resolution: "@types/long@npm:4.0.2" + checksum: d16cde7240d834cf44ba1eaec49e78ae3180e724cd667052b194a372f350d024cba8dd3f37b0864931683dab09ca935d52f0c4c1687178af5ada9fc85b0635f4 + languageName: node + linkType: hard + "@types/mime@npm:*": version: 3.0.1 resolution: "@types/mime@npm:3.0.1" @@ -1590,6 +2091,13 @@ __metadata: languageName: node linkType: hard +"@types/minimatch@npm:*": + version: 5.1.2 + resolution: "@types/minimatch@npm:5.1.2" + checksum: 0391a282860c7cb6fe262c12b99564732401bdaa5e395bee9ca323c312c1a0f45efbf34dce974682036e857db59a5c9b1da522f3d6055aeead7097264c8705a8 + languageName: node + linkType: hard + "@types/minimist@npm:^1.2.0": version: 1.2.2 resolution: "@types/minimist@npm:1.2.2" @@ -1604,6 +2112,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:16.9.1": + version: 16.9.1 + resolution: "@types/node@npm:16.9.1" + checksum: 41afcf183a22d59323a0199dd7e0f46591247f45fc08a4434edb26d56dc279ae4fdb80f37989ddd7a0f45e3857c4933e6e82057ede09c5a829f77e373e680375 + languageName: node + linkType: hard + "@types/node@npm:18.7.1": version: 18.7.1 resolution: "@types/node@npm:18.7.1" @@ -1611,6 +2126,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^10.1.0, @types/node@npm:^10.12.18": + version: 10.17.60 + resolution: "@types/node@npm:10.17.60" + checksum: 2cdb3a77d071ba8513e5e8306fa64bf50e3c3302390feeaeff1fd325dd25c8441369715dfc8e3701011a72fed5958c7dfa94eb9239a81b3c286caa4d97db6eef + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.1 resolution: "@types/normalize-package-data@npm:2.4.1" @@ -1660,7 +2182,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12": +"@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.3": version: 7.3.13 resolution: "@types/semver@npm:7.3.13" checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 @@ -1723,6 +2245,13 @@ __metadata: languageName: node linkType: hard +"@types/validator@npm:^13.7.10": + version: 13.7.10 + resolution: "@types/validator@npm:13.7.10" + checksum: 7b142c08019f484d62c9f3074231f640c24311558f157dd253a60810dd0cb29e41ec64ca210a192b54f6de51f4fe016bfeb2c30f90fa49c9337ed54a9d8e02aa + languageName: node + linkType: hard + "@types/webpack-env@npm:^1.15.2": version: 1.18.0 resolution: "@types/webpack-env@npm:1.18.0" @@ -1730,6 +2259,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^7.0.0": + version: 7.4.7 + resolution: "@types/ws@npm:7.4.7" + dependencies: + "@types/node": "*" + checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 + languageName: node + linkType: hard + "@types/ws@npm:^8.5.1": version: 8.5.4 resolution: "@types/ws@npm:8.5.4" @@ -1785,14 +2323,41 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.36.1": - version: 5.47.1 - resolution: "@typescript-eslint/parser@npm:5.47.1" +"@typescript-eslint/experimental-utils@npm:^4.4.0": + version: 4.33.0 + resolution: "@typescript-eslint/experimental-utils@npm:4.33.0" dependencies: - "@typescript-eslint/scope-manager": 5.47.1 - "@typescript-eslint/types": 5.47.1 - "@typescript-eslint/typescript-estree": 5.47.1 - debug: ^4.3.4 + "@types/json-schema": ^7.0.7 + "@typescript-eslint/scope-manager": 4.33.0 + "@typescript-eslint/types": 4.33.0 + "@typescript-eslint/typescript-estree": 4.33.0 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + peerDependencies: + eslint: "*" + checksum: f859800ada0884f92db6856f24efcb1d073ac9883ddc2b1aa9339f392215487895bed8447ebce3741e8141bb32e545244abef62b73193ba9a8a0527c523aabae + languageName: node + linkType: hard + +"@typescript-eslint/experimental-utils@npm:^5.0.0": + version: 5.48.2 + resolution: "@typescript-eslint/experimental-utils@npm:5.48.2" + dependencies: + "@typescript-eslint/utils": 5.48.2 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: eabb776b1a19c1ac2cbd09c843ffeee7bf7b5460836cd4fee4ee576d84eafa3aed324794fdf41fcde8e395ce77b1f31f519a995bf3836de6295925debad9fa5a + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.36.1": + version: 5.47.1 + resolution: "@typescript-eslint/parser@npm:5.47.1" + dependencies: + "@typescript-eslint/scope-manager": 5.47.1 + "@typescript-eslint/types": 5.47.1 + "@typescript-eslint/typescript-estree": 5.47.1 + debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: @@ -1802,6 +2367,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/scope-manager@npm:4.33.0" + dependencies: + "@typescript-eslint/types": 4.33.0 + "@typescript-eslint/visitor-keys": 4.33.0 + checksum: 9a25fb7ba7c725ea7227a24d315b0f6aacbad002e2549a049edf723c1d3615c22f5c301f0d7d615b377f2cdf2f3519d97e79af0c459de6ef8d2aaf0906dff13e + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:5.47.1": version: 5.47.1 resolution: "@typescript-eslint/scope-manager@npm:5.47.1" @@ -1812,6 +2387,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:5.48.2": + version: 5.48.2 + resolution: "@typescript-eslint/scope-manager@npm:5.48.2" + dependencies: + "@typescript-eslint/types": 5.48.2 + "@typescript-eslint/visitor-keys": 5.48.2 + checksum: d18a9016b734b58eb7664701a1f8933704167cd7a96c10b8d3d224301b9e194674fdde4d288079d6800452d4524b38c83f7e8dc76cea15793d2358aa7026fdde + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:5.47.1": version: 5.47.1 resolution: "@typescript-eslint/type-utils@npm:5.47.1" @@ -1829,6 +2414,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/types@npm:4.33.0" + checksum: 3baae1ca35872421b4eb60f5d3f3f32dc1d513f2ae0a67dee28c7d159fd7a43ed0d11a8a5a0f0c2d38507ffa036fc7c511cb0f18a5e8ac524b3ebde77390ec53 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:5.47.1": version: 5.47.1 resolution: "@typescript-eslint/types@npm:5.47.1" @@ -1836,6 +2428,31 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:5.48.2": + version: 5.48.2 + resolution: "@typescript-eslint/types@npm:5.48.2" + checksum: 9c5e860a0102badf5116985cfa0a1be5b1d7453c3fd84861c4e82d9b73b881304f52ea8455740f5b4af8491dabe5e8d2dfdeb5e333a509118b1fd7e718496147 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/typescript-estree@npm:4.33.0" + dependencies: + "@typescript-eslint/types": 4.33.0 + "@typescript-eslint/visitor-keys": 4.33.0 + debug: ^4.3.1 + globby: ^11.0.3 + is-glob: ^4.0.1 + semver: ^7.3.5 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 2566984390c76bd95f43240057215c068c69769e406e27aba41e9f21fd300074d6772e4983fa58fe61e80eb5550af1548d2e31e80550d92ba1d051bb00fe6f5c + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:5.47.1": version: 5.47.1 resolution: "@typescript-eslint/typescript-estree@npm:5.47.1" @@ -1854,6 +2471,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:5.48.2": + version: 5.48.2 + resolution: "@typescript-eslint/typescript-estree@npm:5.48.2" + dependencies: + "@typescript-eslint/types": 5.48.2 + "@typescript-eslint/visitor-keys": 5.48.2 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 3ae06c597249220bcc138857d37ab2c14204d7db42e943e1a4fe6c56b6912ea271e3ab19f15f458390c54f82ac47785481546b644ff3c111cbb37398cf29949a + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:5.47.1, @typescript-eslint/utils@npm:^5.36.1": version: 5.47.1 resolution: "@typescript-eslint/utils@npm:5.47.1" @@ -1872,6 +2507,34 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:5.48.2": + version: 5.48.2 + resolution: "@typescript-eslint/utils@npm:5.48.2" + dependencies: + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.48.2 + "@typescript-eslint/types": 5.48.2 + "@typescript-eslint/typescript-estree": 5.48.2 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: d363dbf577acc5817427ac0e1290df685b027de6b03bbc150fa252e6435a2e88e254ec4c1db03773cbcae14875d1529e447861e015bf19055bd2b02de766f722 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/visitor-keys@npm:4.33.0" + dependencies: + "@typescript-eslint/types": 4.33.0 + eslint-visitor-keys: ^2.0.0 + checksum: 59953e474ad4610c1aa23b2b1a964445e2c6201521da6367752f37939d854352bbfced5c04ea539274065e012b1337ba3ffa49c2647a240a4e87155378ba9873 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:5.47.1": version: 5.47.1 resolution: "@typescript-eslint/visitor-keys@npm:5.47.1" @@ -1882,6 +2545,126 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:5.48.2": + version: 5.48.2 + resolution: "@typescript-eslint/visitor-keys@npm:5.48.2" + dependencies: + "@typescript-eslint/types": 5.48.2 + eslint-visitor-keys: ^3.3.0 + checksum: 4d83d1e4b39ad76fe865b0580dbfcad6d6f9e936de3d40c1c13d552d40e394eab390a7f9d1172ba59ce457853b93ed0ec253642e6d07cd6cf4fa0b5ec006f0c4 + languageName: node + linkType: hard + +"@vibrant/color@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/color@npm:3.2.1-alpha.1" + checksum: d175ba75dd2d23f83af8dac838ae16e0e2195ffc04e7a697e7e85f087abb8e2eab659efc6d9a4df9ae698ec933b511c051dcf7a8a79af574be0faa3c03def600 + languageName: node + linkType: hard + +"@vibrant/core@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/core@npm:3.2.1-alpha.1" + dependencies: + "@vibrant/color": ^3.2.1-alpha.1 + "@vibrant/generator": ^3.2.1-alpha.1 + "@vibrant/image": ^3.2.1-alpha.1 + "@vibrant/quantizer": ^3.2.1-alpha.1 + "@vibrant/types": ^3.2.1-alpha.1 + "@vibrant/worker": ^3.2.1-alpha.1 + checksum: b08b22dfdae2237f23a4af812e1225a1b6cee4c36a2d84b255247f43997cb61a74d2b492e1a169c667f052bff863d45a7f538d6eeb43b6fbee3be0538b1ce1a4 + languageName: node + linkType: hard + +"@vibrant/generator-default@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/generator-default@npm:3.2.1-alpha.1" + dependencies: + "@vibrant/color": ^3.2.1-alpha.1 + "@vibrant/generator": ^3.2.1-alpha.1 + checksum: 83b0eba7b9c799f888a2278a6a04dda9dcefe3823d046f28ec95427cd912ac689c9ac806c5bd4b5ca5f7c2430f48dec38238a5dfb5398c1f918ad8a07b331ef3 + languageName: node + linkType: hard + +"@vibrant/generator@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/generator@npm:3.2.1-alpha.1" + dependencies: + "@vibrant/color": ^3.2.1-alpha.1 + "@vibrant/types": ^3.2.1-alpha.1 + checksum: 57ea34d8cc298a7f8de21a90ebbd75c7bc86839a141a61ac7d34b0fcee15faa28a2a15dd662c31dc2d026781deb4ee45afef7dcf508bd6dc26a4d4b28be9abf1 + languageName: node + linkType: hard + +"@vibrant/image-browser@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/image-browser@npm:3.2.1-alpha.1" + dependencies: + "@vibrant/image": ^3.2.1-alpha.1 + checksum: 937495f9bdaf0daca1618048575e4cb03ef28084cf6f1d0b394d49a7f7049664bdb9d06f6af13711017df755d01ec55d46adf451f45e7518dc169e16234e9595 + languageName: node + linkType: hard + +"@vibrant/image-node@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/image-node@npm:3.2.1-alpha.1" + dependencies: + "@jimp/custom": ^0.16.1 + "@jimp/plugin-resize": ^0.16.1 + "@jimp/types": ^0.16.1 + "@vibrant/image": ^3.2.1-alpha.1 + checksum: 0f718a7ca60e69f987e9590fbb44f7d5fb2f0989f37660ad38f551827edffb51a7b59be9d2e9e151af8c8575f135af39ef62df8db19abadee4cbf34841ba5b18 + languageName: node + linkType: hard + +"@vibrant/image@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/image@npm:3.2.1-alpha.1" + dependencies: + "@vibrant/color": ^3.2.1-alpha.1 + "@vibrant/types": ^3.2.1-alpha.1 + checksum: dee9383c554a6d05b7b80d96e803774461ab988e5a537aeb12298a7898f54e0baa44fa56fc3d5bc66e2e29dfd10cc09b70acac886869d1f640fee01c0dc9d25e + languageName: node + linkType: hard + +"@vibrant/quantizer-mmcq@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/quantizer-mmcq@npm:3.2.1-alpha.1" + dependencies: + "@vibrant/color": ^3.2.1-alpha.1 + "@vibrant/image": ^3.2.1-alpha.1 + "@vibrant/quantizer": ^3.2.1-alpha.1 + checksum: 26dd56112b9fd192b6774d83cdf91345abca3b35e626cb071f7e9e9209e79385722d5225995699f14bcd07b7c03d954aec95cda99c97e95a0764893f0d98906c + languageName: node + linkType: hard + +"@vibrant/quantizer@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/quantizer@npm:3.2.1-alpha.1" + dependencies: + "@vibrant/color": ^3.2.1-alpha.1 + "@vibrant/image": ^3.2.1-alpha.1 + "@vibrant/types": ^3.2.1-alpha.1 + checksum: bbd991d474dc79c326abcd6d45442e61a3692b1f9cc21e85b833a5740c19464c6199599a0bfa2b11d8a836c5c43a5355563234e83097384de9f76d7c10fed721 + languageName: node + linkType: hard + +"@vibrant/types@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/types@npm:3.2.1-alpha.1" + checksum: 260d4b3bddc893a7e66f98fbfb36a4531700e790fa8cf581d6cfcdb452c8cca08d80835ff53a49e972d79e75f587d4c63b7d117b1e0abe65829ef586d30f8127 + languageName: node + linkType: hard + +"@vibrant/worker@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "@vibrant/worker@npm:3.2.1-alpha.1" + dependencies: + "@vibrant/types": ^3.2.1-alpha.1 + checksum: 6eaec0390420290922eed6acc3199a711b02a78baa0734c353ddbe71ee18f6139647ded7adbfbf46dd25043991928cf8f3abaf5eff9b3607968936e32fccbbc6 + languageName: node + linkType: hard + "@vue/cli-overlay@npm:^5.0.8": version: 5.0.8 resolution: "@vue/cli-overlay@npm:5.0.8" @@ -2317,6 +3100,39 @@ __metadata: languageName: node linkType: hard +"@webpack-cli/configtest@npm:^1.2.0": + version: 1.2.0 + resolution: "@webpack-cli/configtest@npm:1.2.0" + peerDependencies: + webpack: 4.x.x || 5.x.x + webpack-cli: 4.x.x + checksum: a2726cd9ec601d2b57e5fc15e0ebf5200a8892065e735911269ac2038e62be4bfc176ea1f88c2c46ff09b4d05d4c10ae045e87b3679372483d47da625a327e28 + languageName: node + linkType: hard + +"@webpack-cli/info@npm:^1.5.0": + version: 1.5.0 + resolution: "@webpack-cli/info@npm:1.5.0" + dependencies: + envinfo: ^7.7.3 + peerDependencies: + webpack-cli: 4.x.x + checksum: 7f56fe037cd7d1fd5c7428588519fbf04a0cad33925ee4202ffbafd00f8ec1f2f67d991245e687d50e0f3e23f7b7814273d56cb9f7da4b05eed47c8d815c6296 + languageName: node + linkType: hard + +"@webpack-cli/serve@npm:^1.7.0": + version: 1.7.0 + resolution: "@webpack-cli/serve@npm:1.7.0" + peerDependencies: + webpack-cli: 4.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: d475e8effa23eb7ff9a48b14d4de425989fd82f906ce71c210921cc3852327c22873be00c35e181a25a6bd03d424ae2b83e7f3b3f410ac7ee31b128ab4ac7713 + languageName: node + linkType: hard + "@wry/context@npm:^0.4.0": version: 0.4.4 resolution: "@wry/context@npm:0.4.4" @@ -2385,14 +3201,14 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^1.0.0": +"abbrev@npm:1, abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 languageName: node linkType: hard -"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": +"accepts@npm:^1.3.5, accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -2469,6 +3285,13 @@ __metadata: languageName: node linkType: hard +"adverb-where@npm:^0.2.2": + version: 0.2.5 + resolution: "adverb-where@npm:0.2.5" + checksum: 8ad0f125717a4b86004c17a945ff0c9cac03bda00f0adea0d881638a421c7c937e92a65045cfaf0cbb7be2a2c1cb4c17e931bf67391261ca6aa35d0bf46e48b4 + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -2589,6 +3412,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^2.0.0": + version: 2.1.1 + resolution: "ansi-regex@npm:2.1.1" + checksum: 190abd03e4ff86794f338a31795d262c1dfe8c91f7e01d04f13f646f1dcb16c5800818f886047876f1272f065570ab86b24b99089f8b68a0e11ff19aed4ca8f1 + languageName: node + linkType: hard + "ansi-regex@npm:^3.0.0": version: 3.0.1 resolution: "ansi-regex@npm:3.0.1" @@ -2628,7 +3458,14 @@ __metadata: languageName: node linkType: hard -"any-promise@npm:^1.0.0": +"any-base@npm:^1.1.0": + version: 1.1.0 + resolution: "any-base@npm:1.1.0" + checksum: c1fd040de52e710e2de7d9ae4df52bac589f35622adb24686c98ce21c7b824859a8db9614bc119ed8614f42fd08918b2612e6a6c385480462b3100a1af59289d + languageName: node + linkType: hard + +"any-promise@npm:^1.0.0, any-promise@npm:^1.1.0": version: 1.3.0 resolution: "any-promise@npm:1.3.0" checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de @@ -2664,6 +3501,18 @@ __metadata: languageName: node linkType: hard +"apollo-cache-control@npm:^0.15.0": + version: 0.15.0 + resolution: "apollo-cache-control@npm:0.15.0" + dependencies: + apollo-server-env: ^3.2.0 + apollo-server-plugin-base: ^0.14.0 + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: 1d060f0368d66d57a1f79bd4535a39fc7fd2b135f7f25767f1d0f0b0be67536e816261e4dc741c7f43805bd64fdfeee0ab5cb9b0d9123cd5139506d3c858ff29 + languageName: node + linkType: hard + "apollo-cache-inmemory@npm:^1.6.6": version: 1.6.6 resolution: "apollo-cache-inmemory@npm:1.6.6" @@ -2709,6 +3558,29 @@ __metadata: languageName: node linkType: hard +"apollo-datasource@npm:^0.10.0": + version: 0.10.0 + resolution: "apollo-datasource@npm:0.10.0" + dependencies: + apollo-server-caching: ^0.7.0 + apollo-server-env: ^3.2.0 + checksum: c786b406d5359beae90e3150ef07abe2c42b87f7661b99f631ee9e5d9a751b783369b37e7942ff6b4c865de9aa589ced0c5a30de7509cb62c21dcdb5bf076da2 + languageName: node + linkType: hard + +"apollo-graphql@npm:^0.9.0": + version: 0.9.7 + resolution: "apollo-graphql@npm:0.9.7" + dependencies: + core-js-pure: ^3.10.2 + lodash.sortby: ^4.7.0 + sha.js: ^2.4.11 + peerDependencies: + graphql: ^14.2.1 || ^15.0.0 + checksum: 684aea8f772ef62c6cfac65139be843054f85471ee9b8b750e738d9433ba092eefdbf20994b114701d01c37d52df250aa13240992fd8e7c88e10eca2dfe9ed80 + languageName: node + linkType: hard + "apollo-link-error@npm:^1.0.3": version: 1.1.13 resolution: "apollo-link-error@npm:1.1.13" @@ -2772,7 +3644,142 @@ __metadata: languageName: node linkType: hard -"apollo-utilities@npm:1.3.4, apollo-utilities@npm:^1.3.0, apollo-utilities@npm:^1.3.4": +"apollo-reporting-protobuf@npm:^0.8.0": + version: 0.8.0 + resolution: "apollo-reporting-protobuf@npm:0.8.0" + dependencies: + "@apollo/protobufjs": 1.2.2 + checksum: 03987a454aed81417b9c684efebf89ee3754468b66cb1793baffcf5ab55f782c96a04825329cdabb025fe2b1d29969816460ef142f81982d070637af3c1dd7fc + languageName: node + linkType: hard + +"apollo-server-caching@npm:^0.7.0": + version: 0.7.0 + resolution: "apollo-server-caching@npm:0.7.0" + dependencies: + lru-cache: ^6.0.0 + checksum: 53057326f5d0bdeb48da0c738281e3e3765b918050ad02a4d2db514d1e45c9263fcc526fca26ac71aedeccee094f2b6adaa45d67a02b566a6bb4ad1524610ae5 + languageName: node + linkType: hard + +"apollo-server-core@npm:^2.26.1": + version: 2.26.1 + resolution: "apollo-server-core@npm:2.26.1" + dependencies: + "@apollographql/apollo-tools": ^0.5.0 + "@apollographql/graphql-playground-html": 1.6.27 + "@apollographql/graphql-upload-8-fork": ^8.1.4 + "@josephg/resolvable": ^1.0.0 + "@types/ws": ^7.0.0 + apollo-cache-control: ^0.15.0 + apollo-datasource: ^0.10.0 + apollo-graphql: ^0.9.0 + apollo-reporting-protobuf: ^0.8.0 + apollo-server-caching: ^0.7.0 + apollo-server-env: ^3.2.0 + apollo-server-errors: ^2.5.0 + apollo-server-plugin-base: ^0.14.0 + apollo-server-types: ^0.10.0 + apollo-tracing: ^0.16.0 + async-retry: ^1.2.1 + fast-json-stable-stringify: ^2.0.0 + graphql-extensions: ^0.16.0 + graphql-tag: ^2.11.0 + graphql-tools: ^4.0.8 + loglevel: ^1.6.7 + lru-cache: ^6.0.0 + sha.js: ^2.4.11 + subscriptions-transport-ws: ^0.9.19 + uuid: ^8.0.0 + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: 7c509bb8a25b82753e5c6273ad6f1f3c9cbeebd73561a9ea99d98b1596c648c12fd1ff62f79298f5694f23528aefac5b0cd18a0ceeb19d7b150ff21466bd6c24 + languageName: node + linkType: hard + +"apollo-server-env@npm:^3.2.0": + version: 3.2.0 + resolution: "apollo-server-env@npm:3.2.0" + dependencies: + node-fetch: ^2.6.1 + util.promisify: ^1.0.0 + checksum: 84d880e48371d02860ba2124d1c0f026276f5f22cd18dcdd3cacbb7a70cc8d2cf07a4bd4f294006e928c0ef95cc31cdad2198cbc968a649633521b0084416e5c + languageName: node + linkType: hard + +"apollo-server-errors@npm:^2.5.0": + version: 2.5.0 + resolution: "apollo-server-errors@npm:2.5.0" + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: c93129f0b0a9a4aeb35dfdb958ee70c7a55b70eaa44cba9f177eaa95cdba44095db574e85bd9dc6ae96ed6dbb713fa16ad22dbc274f60e8f5272d4f446099244 + languageName: node + linkType: hard + +"apollo-server-express@npm:^2.24.1": + version: 2.26.1 + resolution: "apollo-server-express@npm:2.26.1" + dependencies: + "@apollographql/graphql-playground-html": 1.6.27 + "@types/accepts": ^1.3.5 + "@types/body-parser": 1.19.0 + "@types/cors": 2.8.10 + "@types/express": ^4.17.12 + "@types/express-serve-static-core": ^4.17.21 + accepts: ^1.3.5 + apollo-server-core: ^2.26.1 + apollo-server-types: ^0.10.0 + body-parser: ^1.18.3 + cors: ^2.8.5 + express: ^4.17.1 + graphql-subscriptions: ^1.0.0 + graphql-tools: ^4.0.8 + parseurl: ^1.3.2 + subscriptions-transport-ws: ^0.9.19 + type-is: ^1.6.16 + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: 29dc4a1b6706a9828246cb1d8a6b61edb48189d6ccafc516337fbf611ead95961a2fcca3709cdc2830ab7feca3fb0d602dc06d56460975523044b3d42360cae7 + languageName: node + linkType: hard + +"apollo-server-plugin-base@npm:^0.14.0": + version: 0.14.0 + resolution: "apollo-server-plugin-base@npm:0.14.0" + dependencies: + apollo-server-types: ^0.10.0 + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: dd076fa44b9fecd826a7035407b771cafc6d690bd9416b877a88d981830afaa02863e99cf215faa1b0ef24b30e8cad251eb0bb530e999c48067239d965b8ca60 + languageName: node + linkType: hard + +"apollo-server-types@npm:^0.10.0": + version: 0.10.0 + resolution: "apollo-server-types@npm:0.10.0" + dependencies: + apollo-reporting-protobuf: ^0.8.0 + apollo-server-caching: ^0.7.0 + apollo-server-env: ^3.2.0 + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: 73b4783e5ecd47cafd69cdf82ffb3422cbbcc51fe56b1ea617cc61f577ca68107da0097b2b3466c3d547d93122e000aee3b2459fc6034aacefbe317e446df4da + languageName: node + linkType: hard + +"apollo-tracing@npm:^0.16.0": + version: 0.16.0 + resolution: "apollo-tracing@npm:0.16.0" + dependencies: + apollo-server-env: ^3.2.0 + apollo-server-plugin-base: ^0.14.0 + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: 1b6851b555f07f2314568de2e65057bb3d5e7f9f4d3088881e5575aa6366b3abcb119ce4404a1a01ac1a721cba965581dba3ebf83d8e977833d2cc097a52c089 + languageName: node + linkType: hard + +"apollo-utilities@npm:1.3.4, apollo-utilities@npm:^1.0.1, apollo-utilities@npm:^1.3.0, apollo-utilities@npm:^1.3.4": version: 1.3.4 resolution: "apollo-utilities@npm:1.3.4" dependencies: @@ -2786,6 +3793,41 @@ __metadata: languageName: node linkType: hard +"app-root-path@npm:^2.0.1": + version: 2.2.1 + resolution: "app-root-path@npm:2.2.1" + checksum: c0a8a390221cb7c2c9abd1ba8acd48000ccf9a1c1dd394034bb37d8c4d7d4c49be03001b1e0726535a35f3ace28a45a3fb2b1a7593c5df1c106a64952282a22a + languageName: node + linkType: hard + +"app-root-path@npm:^3.0.0": + version: 3.1.0 + resolution: "app-root-path@npm:3.1.0" + checksum: e3db3957aee197143a0f6c75e39fe89b19e7244f28b4f2944f7276a9c526d2a7ab2d115b4b2d70a51a65a9a3ca17506690e5b36f75a068a7e5a13f8c092389ba + languageName: node + linkType: hard + +"append-field@npm:^0.1.0": + version: 0.1.0 + resolution: "append-field@npm:0.1.0" + checksum: eeb573c009acdcfed99010ed3f55a65f4089446a50b1e0131727f2c728c556ccd68b9a6e735c1aca32a38bcd3245cc496517dcc49a034eb6f14108de79297b28 + languageName: node + linkType: hard + +"append-field@npm:^1.0.0": + version: 1.0.0 + resolution: "append-field@npm:1.0.0" + checksum: 482ba08acc0ecef00fe7da6bf2f8e48359a9905ee1af525f3120c9260c02e91eedf0579b59d898e8d8455b6c199e340bc0a2fd4b9e02adaa29a8a86c722b37f9 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3": + version: 1.2.0 + resolution: "aproba@npm:1.2.0" + checksum: 0fca141966559d195072ed047658b6e6c4fe92428c385dd38e288eacfc55807e7b4989322f030faff32c0f46bb0bc10f1e0ac32ec22d25315a1e5bbc0ebb76dc + languageName: node + linkType: hard + "aproba@npm:^1.0.3 || ^2.0.0": version: 2.0.0 resolution: "aproba@npm:2.0.0" @@ -2810,6 +3852,16 @@ __metadata: languageName: node linkType: hard +"are-we-there-yet@npm:~1.1.2": + version: 1.1.7 + resolution: "are-we-there-yet@npm:1.1.7" + dependencies: + delegates: ^1.0.0 + readable-stream: ^2.0.6 + checksum: 70d251719c969b2745bfe5ddf3ebaefa846a636e90a6d5212573676af5d6670e15457761d4725731e19cbebdce42c4ab0cbedf23ab047f2a08274985aa10a3c7 + languageName: node + linkType: hard + "arg@npm:^4.1.0": version: 4.1.3 resolution: "arg@npm:4.1.3" @@ -2861,6 +3913,28 @@ __metadata: languageName: node linkType: hard +"array.prototype.reduce@npm:^1.0.5": + version: 1.0.5 + resolution: "array.prototype.reduce@npm:1.0.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + es-array-method-boxes-properly: ^1.0.0 + is-string: ^1.0.7 + checksum: f44691395f9202aba5ec2446468d4c27209bfa81464f342ae024b7157dbf05b164e47cca01250b8c7c2a8219953fb57651cca16aab3d16f43b85c0d92c26eef3 + languageName: node + linkType: hard + +"async-retry@npm:^1.2.1": + version: 1.3.3 + resolution: "async-retry@npm:1.3.3" + dependencies: + retry: 0.13.1 + checksum: 38a7152ff7265a9321ea214b9c69e8224ab1febbdec98efbbde6e562f17ff68405569b796b1c5271f354aef8783665d29953f051f68c1fc45306e61aec82fdc4 + languageName: node + linkType: hard + "async@npm:^2.6.4": version: 2.6.4 resolution: "async@npm:2.6.4" @@ -2918,6 +3992,13 @@ __metadata: languageName: node linkType: hard +"available-typed-arrays@npm:^1.0.5": + version: 1.0.5 + resolution: "available-typed-arrays@npm:1.0.5" + checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a + languageName: node + linkType: hard + "axios@npm:^0.21.2": version: 0.21.4 resolution: "axios@npm:0.21.4" @@ -3102,7 +4183,14 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.1": +"bmp-js@npm:^0.1.0": + version: 0.1.0 + resolution: "bmp-js@npm:0.1.0" + checksum: 2f6cf7eeabae2aa50eb768122f59e9752caa97248028cb8b5cf0d9db7cf8fb3a60262aeb2c6889dd21357ab061b2fb318f21f20d2b24963ba36ead8e264c6654 + languageName: node + linkType: hard + +"body-parser@npm:1.20.1, body-parser@npm:^1.18.3, body-parser@npm:^1.19.0, body-parser@npm:^1.20.0": version: 1.20.1 resolution: "body-parser@npm:1.20.1" dependencies: @@ -3208,6 +4296,20 @@ __metadata: languageName: node linkType: hard +"buffer-equal-constant-time@npm:1.0.1": + version: 1.0.1 + resolution: "buffer-equal-constant-time@npm:1.0.1" + checksum: 80bb945f5d782a56f374b292770901065bad21420e34936ecbe949e57724b4a13874f735850dd1cc61f078773c4fb5493a41391e7bda40d1fa388d6bd80daaab + languageName: node + linkType: hard + +"buffer-equal@npm:0.0.1": + version: 0.0.1 + resolution: "buffer-equal@npm:0.0.1" + checksum: ca4b52e6c01143529d957a78cb9a93e4257f172bbab30d9eb87c20ae085ed23c5e07f236ac051202dacbf3d17aba42e1455f84cba21ea79b67d57f2b05e9a613 + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -3215,8 +4317,15 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.5.0": - version: 5.7.1 +"buffer-writer@npm:2.0.0": + version: 2.0.0 + resolution: "buffer-writer@npm:2.0.0" + checksum: 11736b48bb75106c52ca8ec9f025e7c1b3b25ce31875f469d7210eabd5c576c329e34f6b805d4a8d605ff3f0db1e16342328802c4c963e9c826b0e43a4e631c2 + languageName: node + linkType: hard + +"buffer@npm:^5.2.0, buffer@npm:^5.5.0": + version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: base64-js: ^1.3.1 @@ -3225,6 +4334,42 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: db021755d7ed8be048f25668fe2117620861ef6703ea2c65ed2779c9e3636d5c3b82325bd912244293959ff3ae303afa3471f6a15bf5060c103e4cc3a839749d + languageName: node + linkType: hard + +"busboy@npm:^0.2.11": + version: 0.2.14 + resolution: "busboy@npm:0.2.14" + dependencies: + dicer: 0.2.5 + readable-stream: 1.1.x + checksum: 9df9fca6d96dab9edd03f568bde31f215794e6fabd73c75d2b39a4be2e8b73a45121d987dea5db881f3fb499737c261b372106fe72d08b8db92afaed8d751165 + languageName: node + linkType: hard + +"busboy@npm:^0.3.1": + version: 0.3.1 + resolution: "busboy@npm:0.3.1" + dependencies: + dicer: 0.3.0 + checksum: d2bcb788c4595edca4ea2168ab8bf7f9558b627ddcec2fb6bbaf0aa6a10b63da48dce35ce56936570f330c5268a3204f7037021a310a895a8b1a223568e0cc1b + languageName: node + linkType: hard + "bytes@npm:3.0.0": version: 3.0.0 resolution: "bytes@npm:3.0.0" @@ -3265,7 +4410,17 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0": +"cache-content-type@npm:^1.0.0": + version: 1.0.1 + resolution: "cache-content-type@npm:1.0.1" + dependencies: + mime-types: ^2.1.18 + ylru: ^1.2.0 + checksum: 18db4d59452669ccbfd7146a1510a37eb28e9eccf18ca7a4eb603dff2edc5cccdca7498fc3042a2978f76f11151fba486eb9eb69d9afa3fb124957870aef4fd3 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": version: 1.0.2 resolution: "call-bind@npm:1.0.2" dependencies: @@ -3292,7 +4447,7 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^5.3.1": +"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b @@ -3380,7 +4535,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:>=2.0.0 <4.0.0, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.4.2, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3": +"chokidar@npm:>=2.0.0 <4.0.0, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.4.2, chokidar@npm:^3.5.1, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -3399,6 +4554,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -3413,6 +4575,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^3.1.1": + version: 3.7.1 + resolution: "ci-info@npm:3.7.1" + checksum: 72d93d5101ea1c186511277fbd8d06ae8a6e028cc2fb94361e92bf735b39c5ebd192e8d15a66ff8c4e3ed569f87c2f844e96f90e141b2de5c649f77ec34ff601 + languageName: node + linkType: hard + "ci-info@npm:^3.2.0": version: 3.7.0 resolution: "ci-info@npm:3.7.0" @@ -3427,6 +4596,39 @@ __metadata: languageName: node linkType: hard +"class-transformer@npm:^0.3.1": + version: 0.3.1 + resolution: "class-transformer@npm:0.3.1" + checksum: 3a3f7a92cbfd6e7fb5904f9a350bbca8b1e04954dc1f75b39eba949775ecb8bcdf96223e2ca563ec67155e38bdf6d6616ad6b989f8b1ffe377cda3300f5b719a + languageName: node + linkType: hard + +"class-validator-jsonschema@npm:^2.0.3": + version: 2.2.0 + resolution: "class-validator-jsonschema@npm:2.2.0" + dependencies: + lodash: ^4.17.20 + openapi3-ts: ^2.0.0 + reflect-metadata: ^0.1.13 + tslib: ^2.0.3 + peerDependencies: + class-transformer: 0.2.3 - 0.3.1 + class-validator: ^0.12.0 + checksum: c909908459fea019ea81061b77085ceb901a189046a9207d38f19a7bedb64dd7565489eb69854970123b150e04053abcab02ae6db47e7b2539d04a72e8abad88 + languageName: node + linkType: hard + +"class-validator@npm:^0.14.0": + version: 0.14.0 + resolution: "class-validator@npm:0.14.0" + dependencies: + "@types/validator": ^13.7.10 + libphonenumber-js: ^1.10.14 + validator: ^13.7.0 + checksum: f62e4a0ad24cee68f4b2bc70d32b96de90cb598f96bde362b4dbf4234151af8eb6ae225458312a38fc49fa3959844cf61c60e731a8205e9a570454cff8de2710 + languageName: node + linkType: hard + "clean-css@npm:^5.2.2": version: 5.3.1 resolution: "clean-css@npm:5.3.1" @@ -3436,6 +4638,15 @@ __metadata: languageName: node linkType: hard +"clean-regexp@npm:^1.0.0": + version: 1.0.0 + resolution: "clean-regexp@npm:1.0.0" + dependencies: + escape-string-regexp: ^1.0.5 + checksum: 0b1ce281b07da2463c6882ea2e8409119b6cabbd9f687cdbdcee942c45b2b9049a2084f7b5f228c63ef9f21e722963ae0bfe56a735dbdbdd92512867625a7e40 + languageName: node + linkType: hard + "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -3461,7 +4672,7 @@ __metadata: languageName: node linkType: hard -"cli-highlight@npm:^2.1.10": +"cli-highlight@npm:^2.1.10, cli-highlight@npm:^2.1.11": version: 2.1.11 resolution: "cli-highlight@npm:2.1.11" dependencies: @@ -3502,6 +4713,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^6.0.0": + version: 6.0.0 + resolution: "cliui@npm:6.0.0" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + wrap-ansi: ^6.2.0 + checksum: 4fcfd26d292c9f00238117f39fc797608292ae36bac2168cfee4c85923817d0607fe21b3329a8621e01aedf512c99b7eaa60e363a671ffd378df6649fb48ae42 + languageName: node + linkType: hard + "cliui@npm:^7.0.2, cliui@npm:^7.0.4": version: 7.0.4 resolution: "cliui@npm:7.0.4" @@ -3542,6 +4764,18 @@ __metadata: languageName: node linkType: hard +"co-body@npm:^6.0.0": + version: 6.1.0 + resolution: "co-body@npm:6.1.0" + dependencies: + inflation: ^2.0.0 + qs: ^6.5.2 + raw-body: ^2.3.3 + type-is: ^1.6.16 + checksum: d0a78831a6651f2085fce16b0ecdc49f45fb5baf4f94148c2f499e7ec89d188205362548b9c500eae15a819360cfda208079e68a72c204cf66ca3ffa2fc0f57e + languageName: node + linkType: hard + "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -3549,6 +4783,13 @@ __metadata: languageName: node linkType: hard +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: 17d5666611f9b16d64fdf48176d9b7fb1c7d1c1607a189f7e600040a11a6616982876af148230336adb7d8fe728a559f743a4e29db3747e3b1a32fa7f4529681 + languageName: node + linkType: hard + "collect-v8-coverage@npm:^1.0.0": version: 1.0.1 resolution: "collect-v8-coverage@npm:1.0.1" @@ -3556,7 +4797,7 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": +"color-convert@npm:^1.9.0, color-convert@npm:^1.9.3": version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: @@ -3581,13 +4822,23 @@ __metadata: languageName: node linkType: hard -"color-name@npm:~1.1.4": +"color-name@npm:^1.0.0, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard +"color-string@npm:^1.6.0": + version: 1.9.1 + resolution: "color-string@npm:1.9.1" + dependencies: + color-name: ^1.0.0 + simple-swizzle: ^0.2.2 + checksum: c13fe7cff7885f603f49105827d621ce87f4571d78ba28ef4a3f1a104304748f620615e6bf065ecd2145d0d9dad83a3553f52bb25ede7239d18e9f81622f1cc5 + languageName: node + linkType: hard + "color-support@npm:^1.1.3": version: 1.1.3 resolution: "color-support@npm:1.1.3" @@ -3597,6 +4848,16 @@ __metadata: languageName: node linkType: hard +"color@npm:^3.1.3": + version: 3.2.1 + resolution: "color@npm:3.2.1" + dependencies: + color-convert: ^1.9.3 + color-string: ^1.6.0 + checksum: f81220e8b774d35865c2561be921f5652117638dcda7ca4029262046e37fc2444ac7bbfdd110cf1fd9c074a4ee5eda8f85944ffbdda26186b602dd9bb05f6400 + languageName: node + linkType: hard + "colord@npm:^2.9.1": version: 2.9.3 resolution: "colord@npm:2.9.3" @@ -3604,13 +4865,23 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.10": +"colorette@npm:^2.0.10, colorette@npm:^2.0.14": version: 2.0.19 resolution: "colorette@npm:2.0.19" checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 languageName: node linkType: hard +"colorspace@npm:1.1.x": + version: 1.1.4 + resolution: "colorspace@npm:1.1.4" + dependencies: + color: ^3.1.3 + text-hex: 1.0.x + checksum: bb3934ef3c417e961e6d03d7ca60ea6e175947029bfadfcdb65109b01881a1c0ecf9c2b0b59abcd0ee4a0d7c1eae93beed01b0e65848936472270a0b341ebce8 + languageName: node + linkType: hard + "combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -3620,14 +4891,14 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.19.0, commander@npm:^2.20.0": +"commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.20.3": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e languageName: node linkType: hard -"commander@npm:^7.2.0": +"commander@npm:^7.0.0, commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc @@ -3641,6 +4912,13 @@ __metadata: languageName: node linkType: hard +"comment-parser@npm:1.1.6-beta.0": + version: 1.1.6-beta.0 + resolution: "comment-parser@npm:1.1.6-beta.0" + checksum: f686c8b710043d262660f42039afa39474bf820532943561dd6e0c219fd56a53891c56151ccd7252b380f14a8151fcc28ea5e26a8af82f27bb8ac9aa502c76cb + languageName: node + linkType: hard + "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" @@ -3679,6 +4957,18 @@ __metadata: languageName: node linkType: hard +"concat-stream@npm:^1.5.0, concat-stream@npm:^1.5.2": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: ^1.0.0 + inherits: ^2.0.3 + readable-stream: ^2.2.2 + typedarray: ^0.0.6 + checksum: 1ef77032cb4459dcd5187bd710d6fc962b067b64ec6a505810de3d2b8cc0605638551b42f8ec91edf6fcd26141b32ef19ad749239b58fae3aba99187adc32285 + languageName: node + linkType: hard + "condense-newlines@npm:^0.2.1": version: 0.2.1 resolution: "condense-newlines@npm:0.2.1" @@ -3714,7 +5004,7 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.1.0": +"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0, console-control-strings@npm:~1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed @@ -3730,7 +5020,7 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.4": +"content-disposition@npm:0.5.4, content-disposition@npm:~0.5.2": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -3739,7 +5029,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4": +"content-type@npm:^1.0.4, content-type@npm:~1.0.4": version: 1.0.4 resolution: "content-type@npm:1.0.4" checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 @@ -3760,6 +5050,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:0.4.2, cookie@npm:^0.4.0": + version: 0.4.2 + resolution: "cookie@npm:0.4.2" + checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b + languageName: node + linkType: hard + "cookie@npm:0.5.0": version: 0.5.0 resolution: "cookie@npm:0.5.0" @@ -3767,6 +5064,16 @@ __metadata: languageName: node linkType: hard +"cookies@npm:~0.8.0": + version: 0.8.0 + resolution: "cookies@npm:0.8.0" + dependencies: + depd: ~2.0.0 + keygrip: ~1.1.0 + checksum: 806055a44f128705265b1bc6a853058da18bf80dea3654ad99be20985b1fa1b14f86c1eef73644aab8071241f8a78acd57202b54c4c5c70769fc694fbb9c4edc + languageName: node + linkType: hard + "copy-anything@npm:^2.0.1": version: 2.0.6 resolution: "copy-anything@npm:2.0.6" @@ -3776,6 +5083,13 @@ __metadata: languageName: node linkType: hard +"copy-to@npm:^2.0.1": + version: 2.0.1 + resolution: "copy-to@npm:2.0.1" + checksum: 05ea12875bdc96ae053a3b30148e9d992026035ff2bfcc0b615e8d49d1cf8fc3d1f40843f9a4b7b1b6d9118eeebcba31e621076d7de525828aa9c07d22a81dab + languageName: node + linkType: hard + "copy-webpack-plugin@npm:^10.2.4": version: 10.2.4 resolution: "copy-webpack-plugin@npm:10.2.4" @@ -3824,6 +5138,13 @@ __metadata: languageName: node linkType: hard +"core-js-pure@npm:^3.10.2": + version: 3.27.2 + resolution: "core-js-pure@npm:3.27.2" + checksum: 7cb24502a782a032ffa2af6e84abfcfeffa0c30e84c38f4d0a1d7567c8c86e2d36a7554a00ca47762606c84d2a86d99662a7158e9f4df989f3fe3c7e7c09fa45 + languageName: node + linkType: hard + "core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -3831,6 +5152,16 @@ __metadata: languageName: node linkType: hard +"cors@npm:^2.8.5": + version: 2.8.5 + resolution: "cors@npm:2.8.5" + dependencies: + object-assign: ^4 + vary: ^1 + checksum: ced838404ccd184f61ab4fdc5847035b681c90db7ac17e428f3d81d69e2989d2b680cc254da0e2554f5ed4f8a341820a1ce3d1c16b499f6e2f47a1b9b07b5006 + languageName: node + linkType: hard + "cosmiconfig@npm:^6.0.0": version: 6.0.0 resolution: "cosmiconfig@npm:6.0.0" @@ -3864,6 +5195,27 @@ __metadata: languageName: node linkType: hard +"cron-decorators@npm:^0.1.5": + version: 0.1.5 + resolution: "cron-decorators@npm:0.1.5" + dependencies: + cron: ^1.7.2 + glob: ^7.1.6 + moment: ^2.24.0 + reflect-metadata: ^0.1.13 + checksum: 93e0986ed2a73c5ebdcc896830fe7b113d5f1b7aa8df66d1232e83128eff4b68c0bd060fcad15dedb089a7ea5f2d956fb15ebe28dc28d24e96d61a098c2bfcb7 + languageName: node + linkType: hard + +"cron@npm:^1.7.2": + version: 1.8.2 + resolution: "cron@npm:1.8.2" + dependencies: + moment-timezone: ^0.5.x + checksum: 9df2d2e24684e1ebce37e3e29c183b1dfecf7adb5fb16f84435014e7205926fc9868e9bfacfa5f7b93c556c9f4a6fbcce5fde9bee1306d20bc848568bb587791 + languageName: node + linkType: hard + "cross-spawn@npm:^6.0.0": version: 6.0.5 resolution: "cross-spawn@npm:6.0.5" @@ -4000,6 +5352,13 @@ __metadata: languageName: node linkType: hard +"cssfilter@npm:0.0.10": + version: 0.0.10 + resolution: "cssfilter@npm:0.0.10" + checksum: bc2c52bbb3426c3f2e4832edb6f8573e6cfa65b40b540932762d1e018f0f0157725e2991b77344bbc8266c6bbf4daa2803b0707cfb1bd0877505bf83a68e4b04 + languageName: node + linkType: hard + "cssnano-preset-default@npm:^5.2.13": version: 5.2.13 resolution: "cssnano-preset-default@npm:5.2.13" @@ -4134,7 +5493,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -4146,7 +5505,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.6, debug@npm:^3.2.7": +"debug@npm:^3.1.0, debug@npm:^3.2.6, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -4164,6 +5523,13 @@ __metadata: languageName: node linkType: hard +"decamelize@npm:^1.2.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa + languageName: node + linkType: hard + "decimal.js@npm:^10.3.1": version: 10.4.3 resolution: "decimal.js@npm:10.4.3" @@ -4178,6 +5544,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^4.2.0": + version: 4.2.1 + resolution: "decompress-response@npm:4.2.1" + dependencies: + mimic-response: ^2.0.0 + checksum: 4e783ca4dfe9417354d61349750fe05236f565a4415a6ca20983a311be2371debaedd9104c0b0e7b36e5f167aeaae04f84f1a0b3f8be4162f1d7d15598b8fdba + languageName: node + linkType: hard + "dedent@npm:^0.7.0": version: 0.7.0 resolution: "dedent@npm:0.7.0" @@ -4185,6 +5560,20 @@ __metadata: languageName: node linkType: hard +"deep-equal@npm:~1.0.1": + version: 1.0.1 + resolution: "deep-equal@npm:1.0.1" + checksum: 5af8cbfcebf190491878a498caccc7dc9592f8ebd1685b976eacc3825619d222b5e929923163b92c4f414494e2b884f7ebf00c022e8198e8292deb70dd9785f4 + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 + languageName: node + linkType: hard + "deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -4231,6 +5620,16 @@ __metadata: languageName: node linkType: hard +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": + version: 1.1.4 + resolution: "define-properties@npm:1.1.4" + dependencies: + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -4245,7 +5644,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"depd@npm:2.0.0, depd@npm:^2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a @@ -4259,13 +5658,29 @@ __metadata: languageName: node linkType: hard -"destroy@npm:1.2.0": +"deprecated-decorator@npm:^0.1.6": + version: 0.1.6 + resolution: "deprecated-decorator@npm:0.1.6" + checksum: 26e4ca36e6ac4c2c19a7330d602c12344337f39472f46ec3dc5fe2dc15eeeefa89634c88596d0d9bcf032619cf266a0daeb385f98a1130449db20d0d8cfebb7d + languageName: node + linkType: hard + +"destroy@npm:1.2.0, destroy@npm:^1.0.4": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 languageName: node linkType: hard +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: daaaed925ffa7889bd91d56e9624e6c8033911bb60f3a50a74a87500680652969dbaab9526d1e200a4c94acf80fc862a22131841145a0a8482d60a99c24f4a3e + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -4280,6 +5695,25 @@ __metadata: languageName: node linkType: hard +"dicer@npm:0.2.5": + version: 0.2.5 + resolution: "dicer@npm:0.2.5" + dependencies: + readable-stream: 1.1.x + streamsearch: 0.1.2 + checksum: a6f0ce9ac5099c7ffeaec7398d711eea1dd803eb99036d0f05342e9ed46a4235a5ed0ea01ad5d6c785fdb0aae6d61d2722e6e64f9fabdfe39885f7f52eb635ee + languageName: node + linkType: hard + +"dicer@npm:0.3.0": + version: 0.3.0 + resolution: "dicer@npm:0.3.0" + dependencies: + streamsearch: 0.1.2 + checksum: 9f61aea61fcd81457f1b43967af7e66415b7a31d393336fa05a29b221b5ba065b99e5cac46476b2da36eb7af7665bf8dad6f9500409116dc6a35ada183841598 + languageName: node + linkType: hard + "diff-sequences@npm:^27.5.1": version: 27.5.1 resolution: "diff-sequences@npm:27.5.1" @@ -4301,6 +5735,13 @@ __metadata: languageName: node linkType: hard +"dijkstrajs@npm:^1.0.1": + version: 1.0.2 + resolution: "dijkstrajs@npm:1.0.2" + checksum: 8cd822441a26f190da24d69bfab7b433d080b09e069e41e046ac84e152f182a1ed9478d531b34126e000adaa7b73114a0f85fcac117a7d25b3edf302d57c0d09 + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -4362,6 +5803,13 @@ __metadata: languageName: node linkType: hard +"dom-walk@npm:^0.1.0": + version: 0.1.2 + resolution: "dom-walk@npm:0.1.2" + checksum: 19eb0ce9c6de39d5e231530685248545d9cd2bd97b2cb3486e0bfc0f2a393a9addddfd5557463a932b52fdfcf68ad2a619020cd2c74a5fe46fbecaa8e80872f3 + languageName: node + linkType: hard + "domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" @@ -4422,6 +5870,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^8.2.0": + version: 8.6.0 + resolution: "dotenv@npm:8.6.0" + checksum: 38e902c80b0666ab59e9310a3d24ed237029a7ce34d976796349765ac96b8d769f6df19090f1f471b77a25ca391971efde8a1ea63bb83111bd8bec8e5cc9b2cd + languageName: node + linkType: hard + "duplexer@npm:^0.1.1, duplexer@npm:^0.1.2": version: 0.1.2 resolution: "duplexer@npm:0.1.2" @@ -4429,6 +5884,22 @@ __metadata: languageName: node linkType: hard +"dynamic-dedupe@npm:^0.3.0": + version: 0.3.0 + resolution: "dynamic-dedupe@npm:0.3.0" + dependencies: + xtend: ^4.0.0 + checksum: 5178b99ad30a59234c63b38b453183cfd0a6cb7acbe7b94b7aea9bf0f75376fdaab6e2ea7922931cfc0152390ccb20bd024d8d80b4fc8c3c3255a2fcadf2cafb + languageName: node + linkType: hard + +"e-prime@npm:^0.10.4": + version: 0.10.4 + resolution: "e-prime@npm:0.10.4" + checksum: 4932a58f481c266e1e4d85a9d2c2b7ff797640429c71acda264379074a347bdc5e26497d32f96908c7b7760834c9e50e009ea97ab6a796dfa0248f38a6dc9c18 + languageName: node + linkType: hard + "easy-stack@npm:1.0.1": version: 1.0.1 resolution: "easy-stack@npm:1.0.1" @@ -4436,6 +5907,15 @@ __metadata: languageName: node linkType: hard +"ecdsa-sig-formatter@npm:1.0.11": + version: 1.0.11 + resolution: "ecdsa-sig-formatter@npm:1.0.11" + dependencies: + safe-buffer: ^5.0.1 + checksum: 207f9ab1c2669b8e65540bce29506134613dd5f122cccf1e6a560f4d63f2732d427d938f8481df175505aad94583bcb32c688737bb39a6df0625f903d6d93c03 + languageName: node + linkType: hard + "editorconfig@npm:^0.15.3": version: 0.15.3 resolution: "editorconfig@npm:0.15.3" @@ -4496,7 +5976,21 @@ __metadata: languageName: node linkType: hard -"encodeurl@npm:~1.0.2": +"enabled@npm:2.0.x": + version: 2.0.0 + resolution: "enabled@npm:2.0.0" + checksum: 9d256d89f4e8a46ff988c6a79b22fa814b4ffd82826c4fdacd9b42e9b9465709d3b748866d0ab4d442dfc6002d81de7f7b384146ccd1681f6a7f868d2acca063 + languageName: node + linkType: hard + +"encode-utf8@npm:^1.0.3": + version: 1.0.3 + resolution: "encode-utf8@npm:1.0.3" + checksum: 550224bf2a104b1d355458c8a82e9b4ea07f9fc78387bc3a49c151b940ad26473de8dc9e121eefc4e84561cb0b46de1e4cd2bc766f72ee145e9ea9541482817f + languageName: node + linkType: hard + +"encodeurl@npm:^1.0.2, encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c @@ -4554,6 +6048,15 @@ __metadata: languageName: node linkType: hard +"envinfo@npm:^7.7.3": + version: 7.8.1 + resolution: "envinfo@npm:7.8.1" + bin: + envinfo: dist/cli.js + checksum: de736c98d6311c78523628ff127af138451b162e57af5293c1b984ca821d0aeb9c849537d2fde0434011bed33f6bca5310ca2aab8a51a3f28fc719e89045d648 + languageName: node + linkType: hard + "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -4590,6 +6093,54 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": + version: 1.21.1 + resolution: "es-abstract@npm:1.21.1" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + es-set-tostringtag: ^2.0.1 + es-to-primitive: ^1.2.1 + function-bind: ^1.1.1 + function.prototype.name: ^1.1.5 + get-intrinsic: ^1.1.3 + get-symbol-description: ^1.0.0 + globalthis: ^1.0.3 + gopd: ^1.0.1 + has: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.4 + is-array-buffer: ^3.0.1 + is-callable: ^1.2.7 + is-negative-zero: ^2.0.2 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.2 + is-string: ^1.0.7 + is-typed-array: ^1.1.10 + is-weakref: ^1.0.2 + object-inspect: ^1.12.2 + object-keys: ^1.1.1 + object.assign: ^4.1.4 + regexp.prototype.flags: ^1.4.3 + safe-regex-test: ^1.0.0 + string.prototype.trimend: ^1.0.6 + string.prototype.trimstart: ^1.0.6 + typed-array-length: ^1.0.4 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.9 + checksum: 23ff60d42d17a55d150e7bcedbdb065d4077a8b98c436e0e2e1ef4dd532a6d78a56028673de0bd8ed464a43c46ba781c50d9af429b6a17e44dbd14c7d7fb7926 + languageName: node + linkType: hard + +"es-array-method-boxes-properly@npm:^1.0.0": + version: 1.0.0 + resolution: "es-array-method-boxes-properly@npm:1.0.0" + checksum: 2537fcd1cecf187083890bc6f5236d3a26bf39237433587e5bf63392e88faae929dbba78ff0120681a3f6f81c23fe3816122982c160d63b38c95c830b633b826 + languageName: node + linkType: hard + "es-module-lexer@npm:^0.9.0": version: 0.9.3 resolution: "es-module-lexer@npm:0.9.3" @@ -4597,6 +6148,28 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.1 + resolution: "es-set-tostringtag@npm:2.0.1" + dependencies: + get-intrinsic: ^1.1.3 + has: ^1.0.3 + has-tostringtag: ^1.0.0 + checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.2.1": + version: 1.2.1 + resolution: "es-to-primitive@npm:1.2.1" + dependencies: + is-callable: ^1.1.4 + is-date-object: ^1.0.1 + is-symbol: ^1.0.2 + checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -4604,7 +6177,7 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:~1.0.3": +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 @@ -4673,47 +6246,244 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-prettier@npm:^4.0.0, eslint-plugin-prettier@npm:^4.2.0": - version: 4.2.1 - resolution: "eslint-plugin-prettier@npm:4.2.1" +"eslint-plugin-autofix@npm:^1.1.0": + version: 1.1.0 + resolution: "eslint-plugin-autofix@npm:1.1.0" dependencies: - prettier-linter-helpers: ^1.0.0 + eslint-rule-composer: ^0.3.0 + espree: ^9.0.0 + esutils: ^2.0.2 + lodash: ^4.17.20 + string-similarity: ^4.0.3 peerDependencies: - eslint: ">=7.28.0" - prettier: ">=2.0.0" - peerDependenciesMeta: - eslint-config-prettier: - optional: true - checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 + eslint: ">= 5.12.1" + checksum: 93d33ca48f0a45d1298e1b8db9d241eb9e782f26a0d48d3e5721614c23e4edaba99215e72f890a3b1a6b885f3bfd40bd8c50f1fb863ed0a3bbf45e93c4495014 languageName: node linkType: hard -"eslint-plugin-vue@npm:^7.8.0": - version: 7.20.0 - resolution: "eslint-plugin-vue@npm:7.20.0" +"eslint-plugin-deprecation@npm:^1.3.2": + version: 1.3.3 + resolution: "eslint-plugin-deprecation@npm:1.3.3" dependencies: - eslint-utils: ^2.1.0 - natural-compare: ^1.4.0 - semver: ^6.3.0 - vue-eslint-parser: ^7.10.0 + "@typescript-eslint/experimental-utils": ^5.0.0 + tslib: ^2.3.1 + tsutils: ^3.21.0 peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 - checksum: 7b724ed8317ce3621cfd94235a68af20ec355fca93092cc09ee73fbffcefa69e3c5202b8035aae8e7457df6924dfe713834ae46dee08acdd9316188c47933956 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: ^3.7.5 || ^4.0.0 + checksum: 5e14d7bc8245a14784623632d43a6210880a4aad4c029fd44686a5516c248287f32406ff230f6e9d238784854b24cd09da953ec8f73d9d19a7c4b3905884e432 languageName: node linkType: hard -"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb +"eslint-plugin-immutable@npm:^1.0.0": + version: 1.0.0 + resolution: "eslint-plugin-immutable@npm:1.0.0" + checksum: cad83491b62f428c59f1f5987d5ebb3990131ede2a77630319625b383fcd64401f84f882964663993ab6f87621a5456a75cad06c48c3a6805c23a8f1cfbd5bd0 languageName: node linkType: hard -"eslint-scope@npm:^7.1.1": - version: 7.1.1 +"eslint-plugin-jsdoc@npm:^35.1.2": + version: 35.5.1 + resolution: "eslint-plugin-jsdoc@npm:35.5.1" + dependencies: + "@es-joy/jsdoccomment": 0.9.0-alpha.1 + comment-parser: 1.1.6-beta.0 + debug: ^4.3.2 + esquery: ^1.4.0 + jsdoc-type-pratt-parser: ^1.0.4 + lodash: ^4.17.21 + regextras: ^0.8.0 + semver: ^7.3.5 + spdx-expression-parse: ^3.0.1 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 + checksum: c5aa87831a4e434bcb527e760520c9af6b650a7d6956017556645f8b41cda2e5dbccdd8b31eccc2c6135e17bea159c2c912965f1222806eae27a294dd871e757 + languageName: node + linkType: hard + +"eslint-plugin-no-loops@npm:^0.3.0": + version: 0.3.0 + resolution: "eslint-plugin-no-loops@npm:0.3.0" + peerDependencies: + eslint: ">=2.0.0" + checksum: 61232f8a778263361f3e933913382fd7c5e1a64e40100dcbd7fee1d0722313bc5156296160cfc11cf1b9a8f99a680904ee58c04418fe6734245232bc169a8c8c + languageName: node + linkType: hard + +"eslint-plugin-no-secrets@npm:^0.8.9": + version: 0.8.9 + resolution: "eslint-plugin-no-secrets@npm:0.8.9" + peerDependencies: + eslint: ">=3.0.0" + checksum: 28b0ddb37826889a90119e7265468320a18145bd3f357713d74757f5433bc5a4dc48662d8113a30eac5fc05ac3710a65c8280df90dff35ed86313edd07132871 + languageName: node + linkType: hard + +"eslint-plugin-notice@npm:^0.9.10": + version: 0.9.10 + resolution: "eslint-plugin-notice@npm:0.9.10" + dependencies: + find-root: ^1.1.0 + lodash: ^4.17.15 + metric-lcs: ^0.1.2 + peerDependencies: + eslint: ">=3.0.0" + checksum: 0892ea3da8f31f57390941b6ae3472a34fe4037a21dfe73763c2e5011a08859bff4be6af50d1c54b04e16e43b10342458acb83874b806fcd5e2839be9f99c92e + languageName: node + linkType: hard + +"eslint-plugin-prettier@npm:^4.0.0, eslint-plugin-prettier@npm:^4.2.0": + version: 4.2.1 + resolution: "eslint-plugin-prettier@npm:4.2.1" + dependencies: + prettier-linter-helpers: ^1.0.0 + peerDependencies: + eslint: ">=7.28.0" + prettier: ">=2.0.0" + peerDependenciesMeta: + eslint-config-prettier: + optional: true + checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 + languageName: node + linkType: hard + +"eslint-plugin-promise@npm:^5.1.0": + version: 5.2.0 + resolution: "eslint-plugin-promise@npm:5.2.0" + peerDependencies: + eslint: ^7.0.0 + checksum: 5d6b2d28408c5afde6386942862427af3d83c9a130eb2555bb54b26a1761914e2c7326aca1be26dd3fee6405e65a2ee9432a4526147e5962545060ea0ef64058 + languageName: node + linkType: hard + +"eslint-plugin-radar@npm:^0.2.1": + version: 0.2.1 + resolution: "eslint-plugin-radar@npm:0.2.1" + peerDependencies: + eslint: ">= 3.0.0 <= 7.x.x" + checksum: dece5c02506ab40a4e231c813f1a8ecd7a57c0a4d177cd35dbfcf56222333d5434a8c06901e8b06409d919b7beeea870428a3574315419252a3698b3766d1a91 + languageName: node + linkType: hard + +"eslint-plugin-security@npm:^1.5.0": + version: 1.6.0 + resolution: "eslint-plugin-security@npm:1.6.0" + dependencies: + safe-regex: ^2.1.1 + checksum: e47fa1a71abe8b4b5849037c7e537f00d7d6ad28aa3b4f5e467686ed394d25896880007efad0f3ed23ab39dbc864726bf91fdf5c211f09586d0f6716f54194bd + languageName: node + linkType: hard + +"eslint-plugin-simple-import-sort@npm:^7.0.0": + version: 7.0.0 + resolution: "eslint-plugin-simple-import-sort@npm:7.0.0" + peerDependencies: + eslint: ">=5.0.0" + checksum: 6aacb7179c213cd2081950630368d1f3b1dcb4f5674d8b989fe7839e7b317ee521d74761676e8b1a7cab49f20405dbcc9aac05358ae804e6bcba6cbf1daccb3d + languageName: node + linkType: hard + +"eslint-plugin-sort-keys-fix@npm:^1.1.2": + version: 1.1.2 + resolution: "eslint-plugin-sort-keys-fix@npm:1.1.2" + dependencies: + espree: ^6.1.2 + esutils: ^2.0.2 + natural-compare: ^1.4.0 + requireindex: ~1.2.0 + checksum: d089e4ec4f8cea4ec239132f85c807ce71e500370e3ef778d684697da5011b413e625d6f5b9bf3b5b1cf7c4eafffc39d386bffca271b7c3e7983409fb0d7d2c6 + languageName: node + linkType: hard + +"eslint-plugin-type-graphql@npm:^0.3.0": + version: 0.3.2 + resolution: "eslint-plugin-type-graphql@npm:0.3.2" + dependencies: + "@typescript-eslint/experimental-utils": ^4.4.0 + peerDependencies: + "@typescript-eslint/parser": ^4.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + checksum: 9429f0ddf1df3a3fb18b28e1735866c5cae2618db61cfa18774b2b9332ca25cf9f7653a2f2046c92e9ad23462ddb6a0b7eb27667e234a9c208c7f5b0775135fb + languageName: node + linkType: hard + +"eslint-plugin-unicorn@npm:^32.0.1": + version: 32.0.1 + resolution: "eslint-plugin-unicorn@npm:32.0.1" + dependencies: + ci-info: ^3.1.1 + clean-regexp: ^1.0.0 + eslint-template-visitor: ^2.3.2 + eslint-utils: ^2.1.0 + import-modules: ^2.1.0 + is-builtin-module: ^3.1.0 + lodash: ^4.17.21 + pluralize: ^8.0.0 + read-pkg-up: ^7.0.1 + regexp-tree: ^0.1.23 + reserved-words: ^0.1.2 + safe-regex: ^2.1.1 + semver: ^7.3.5 + peerDependencies: + eslint: ">=7.23.0" + checksum: e74051e8b05f66c55355c719e7738495e9fcdaca0beb618c223c65640406c1eb54e10c4858ee80a476f97e199174e265734dbcb35563137e407fe05cb7343454 + languageName: node + linkType: hard + +"eslint-plugin-vue@npm:^7.8.0": + version: 7.20.0 + resolution: "eslint-plugin-vue@npm:7.20.0" + dependencies: + eslint-utils: ^2.1.0 + natural-compare: ^1.4.0 + semver: ^6.3.0 + vue-eslint-parser: ^7.10.0 + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + checksum: 7b724ed8317ce3621cfd94235a68af20ec355fca93092cc09ee73fbffcefa69e3c5202b8035aae8e7457df6924dfe713834ae46dee08acdd9316188c47933956 + languageName: node + linkType: hard + +"eslint-plugin-woke@npm:^1.0.0": + version: 1.0.1 + resolution: "eslint-plugin-woke@npm:1.0.1" + dependencies: + requireindex: ~1.1.0 + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: d87a831f0e6a508a10b60d79f4320443eb67f006339d3027ac582446547b7364f066cfe6b286bdd0647331287e0048570fe4fef652af3e11edf1c76513deafed + languageName: node + linkType: hard + +"eslint-plugin-write-good-comments@npm:^0.1.3": + version: 0.1.4 + resolution: "eslint-plugin-write-good-comments@npm:0.1.4" + dependencies: + requireindex: ~1.1.0 + write-good: ^1.0.8 + checksum: 73e6e307356816ed13b4387b7c87dea505e95038454694a9332a9213305c1b03b39054ebf4458d7ff873d0c2fec83955ed4d09166e76944c07fd66cbbe645729 + languageName: node + linkType: hard + +"eslint-rule-composer@npm:^0.3.0": + version: 0.3.0 + resolution: "eslint-rule-composer@npm:0.3.0" + checksum: c2f57cded8d1c8f82483e0ce28861214347e24fd79fd4144667974cd334d718f4ba05080aaef2399e3bbe36f7d6632865110227e6b176ed6daa2d676df9281b1 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-scope@npm:^7.1.1": + version: 7.1.1 resolution: "eslint-scope@npm:7.1.1" dependencies: esrecurse: ^4.3.0 @@ -4722,6 +6492,21 @@ __metadata: languageName: node linkType: hard +"eslint-template-visitor@npm:^2.3.2": + version: 2.3.2 + resolution: "eslint-template-visitor@npm:2.3.2" + dependencies: + "@babel/core": ^7.12.16 + "@babel/eslint-parser": ^7.12.16 + eslint-visitor-keys: ^2.0.0 + esquery: ^1.3.1 + multimap: ^1.1.0 + peerDependencies: + eslint: ">=7.0.0" + checksum: 83da75f46251d0f3c72367db23993194b105e8dde96f70d1fc782ece5ed7f8d299c4d7f9330fd1f2774458bed90c21c445984f659efc11c4bb49491a8d934e3e + languageName: node + linkType: hard + "eslint-utils@npm:^2.1.0": version: 2.1.0 resolution: "eslint-utils@npm:2.1.0" @@ -4749,7 +6534,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^2.0.0": +"eslint-visitor-keys@npm:^2.0.0, eslint-visitor-keys@npm:^2.1.0": version: 2.1.0 resolution: "eslint-visitor-keys@npm:2.1.0" checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d @@ -4808,7 +6593,7 @@ __metadata: languageName: node linkType: hard -"espree@npm:^6.2.1": +"espree@npm:^6.1.2, espree@npm:^6.2.1": version: 6.2.1 resolution: "espree@npm:6.2.1" dependencies: @@ -4819,7 +6604,7 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.3.2, espree@npm:^9.4.0": +"espree@npm:^9.0.0, espree@npm:^9.3.2, espree@npm:^9.4.0": version: 9.4.1 resolution: "espree@npm:9.4.1" dependencies: @@ -4840,7 +6625,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.0.1, esquery@npm:^1.4.0": +"esquery@npm:^1.0.1, esquery@npm:^1.3.1, esquery@npm:^1.4.0": version: 1.4.0 resolution: "esquery@npm:1.4.0" dependencies: @@ -4946,6 +6731,13 @@ __metadata: languageName: node linkType: hard +"exif-parser@npm:^0.1.12": + version: 0.1.12 + resolution: "exif-parser@npm:0.1.12" + checksum: 6ba50cb9e0b45a6efa37e966a9582ecd171b5c5b3ef0c47542f2b862c521f70d2f656dde85b4d2a5dd8e1163486b09049f4c412e9c6176bfbda1654a5b2f021c + languageName: node + linkType: hard + "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -4953,6 +6745,13 @@ __metadata: languageName: node linkType: hard +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 588c19847216421ed92befb521767b7018dc88f88b0576df98cb242f20961425e96a92cbece525ef28cc5becceae5d544ae0f5b9b5e2aa05acb13716ca5b3099 + languageName: node + linkType: hard + "expect@npm:^28.1.3": version: 28.1.3 resolution: "expect@npm:28.1.3" @@ -4966,7 +6765,23 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.3, express@npm:^4.18.1": +"express-session@npm:^1.17.1": + version: 1.17.3 + resolution: "express-session@npm:1.17.3" + dependencies: + cookie: 0.4.2 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: ~2.0.0 + on-headers: ~1.0.2 + parseurl: ~1.3.3 + safe-buffer: 5.2.1 + uid-safe: ~2.1.5 + checksum: 1021a793433cbc6a1b32c803fcb2daa1e03a8f50dd907e8745ae57994370315a5cfde5b6ef7b062d9a9a0754ff268844bda211c08240b3a0e01014dcf1073ec5 + languageName: node + linkType: hard + +"express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1": version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: @@ -5068,6 +6883,13 @@ __metadata: languageName: node linkType: hard +"fastest-levenshtein@npm:^1.0.12": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: a78d44285c9e2ae2c25f3ef0f8a73f332c1247b7ea7fb4a191e6bb51aa6ee1ef0dfb3ed113616dcdc7023e18e35a8db41f61c8d88988e877cf510df8edafbc71 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.14.0 resolution: "fastq@npm:1.14.0" @@ -5095,6 +6917,13 @@ __metadata: languageName: node linkType: hard +"fecha@npm:^4.2.0": + version: 4.2.3 + resolution: "fecha@npm:4.2.3" + checksum: f94e2fb3acf5a7754165d04549460d3ae6c34830394d20c552197e3e000035d69732d74af04b9bed3283bf29fe2a9ebdcc0085e640b0be3cc3658b9726265e31 + languageName: node + linkType: hard + "figures@npm:3.2.0": version: 3.2.0 resolution: "figures@npm:3.2.0" @@ -5134,6 +6963,13 @@ __metadata: languageName: node linkType: hard +"file-type@npm:^9.0.0": + version: 9.0.0 + resolution: "file-type@npm:9.0.0" + checksum: 9ea78b29c3762d967eb1e3e4f45e401388b6d252b12c217f78f5ea97556ff7e35e4c7255cab68810ac414d51b776bd4e83504c86f132c262a454251561189efa + languageName: node + linkType: hard + "filelist@npm:^1.0.1": version: 1.0.4 resolution: "filelist@npm:1.0.4" @@ -5178,6 +7014,13 @@ __metadata: languageName: node linkType: hard +"find-root@npm:^1.1.0": + version: 1.1.0 + resolution: "find-root@npm:1.1.0" + checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf + languageName: node + linkType: hard + "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -5214,6 +7057,13 @@ __metadata: languageName: node linkType: hard +"fn.name@npm:1.x.x": + version: 1.1.0 + resolution: "fn.name@npm:1.1.0" + checksum: e357144f48cfc9a7f52a82bbc6c23df7c8de639fce049cac41d41d62cabb740cdb9f14eddc6485e29c933104455bdd7a69bb14a9012cef9cd4fa252a4d0cf293 + languageName: node + linkType: hard + "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.15.0": version: 1.15.2 resolution: "follow-redirects@npm:1.15.2" @@ -5224,6 +7074,15 @@ __metadata: languageName: node linkType: hard +"for-each@npm:^0.3.3": + version: 0.3.3 + resolution: "for-each@npm:0.3.3" + dependencies: + is-callable: ^1.1.3 + checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + languageName: node + linkType: hard + "fork-ts-checker-webpack-plugin@npm:7.2.13": version: 7.2.13 resolution: "fork-ts-checker-webpack-plugin@npm:7.2.13" @@ -5307,13 +7166,30 @@ __metadata: languageName: node linkType: hard -"fresh@npm:0.5.2": +"fresh@npm:0.5.2, fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 languageName: node linkType: hard +"from2@npm:^2.3.0": + version: 2.3.0 + resolution: "from2@npm:2.3.0" + dependencies: + inherits: ^2.0.1 + readable-stream: ^2.0.0 + checksum: 6080eba0793dce32f475141fb3d54cc15f84ee52e420ee22ac3ab0ad639dc95a1875bc6eb9c0e1140e94972a36a89dc5542491b85f1ab8df0c126241e0f1a61b + languageName: node + linkType: hard + +"fs-capacitor@npm:^2.0.4": + version: 2.0.4 + resolution: "fs-capacitor@npm:2.0.4" + checksum: 5558e6c9b93fca724ea2dc720fef6908011378c73be4d123601e70a04e84f025944b7b791426df83d850bc08d564846858cf69116bda74fd1741687016554bf5 + languageName: node + linkType: hard + "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -5404,6 +7280,18 @@ __metadata: languageName: node linkType: hard +"function.prototype.name@npm:^1.1.5": + version: 1.1.5 + resolution: "function.prototype.name@npm:1.1.5" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + es-abstract: ^1.19.0 + functions-have-names: ^1.2.2 + checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + languageName: node + linkType: hard + "functional-red-black-tree@npm:^1.0.1": version: 1.0.1 resolution: "functional-red-black-tree@npm:1.0.1" @@ -5411,6 +7299,13 @@ __metadata: languageName: node linkType: hard +"functions-have-names@npm:^1.2.2": + version: 1.2.3 + resolution: "functions-have-names@npm:1.2.3" + checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + languageName: node + linkType: hard + "gauge@npm:^4.0.3": version: 4.0.4 resolution: "gauge@npm:4.0.4" @@ -5427,6 +7322,22 @@ __metadata: languageName: node linkType: hard +"gauge@npm:~2.7.3": + version: 2.7.4 + resolution: "gauge@npm:2.7.4" + dependencies: + aproba: ^1.0.3 + console-control-strings: ^1.0.0 + has-unicode: ^2.0.0 + object-assign: ^4.1.0 + signal-exit: ^3.0.0 + string-width: ^1.0.1 + strip-ansi: ^3.0.1 + wide-align: ^1.1.0 + checksum: a89b53cee65579b46832e050b5f3a79a832cc422c190de79c6b8e2e15296ab92faddde6ddf2d376875cbba2b043efa99b9e1ed8124e7365f61b04e3cee9d40ee + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -5434,7 +7345,7 @@ __metadata: languageName: node linkType: hard -"get-caller-file@npm:^2.0.5": +"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 @@ -5452,6 +7363,17 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3": + version: 1.2.0 + resolution: "get-intrinsic@npm:1.2.0" + dependencies: + function-bind: ^1.1.1 + has: ^1.0.3 + has-symbols: ^1.0.3 + checksum: 78fc0487b783f5c58cf2dccafc3ae656ee8d2d8062a8831ce4a95e7057af4587a1d4882246c033aca0a7b4965276f4802b45cc300338d1b77a73d3e3e3f4877d + languageName: node + linkType: hard + "get-package-type@npm:^0.1.0": version: 0.1.0 resolution: "get-package-type@npm:0.1.0" @@ -5475,6 +7397,33 @@ __metadata: languageName: node linkType: hard +"get-symbol-description@npm:^1.0.0": + version: 1.0.0 + resolution: "get-symbol-description@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + languageName: node + linkType: hard + +"gifwrap@npm:^0.9.2": + version: 0.9.4 + resolution: "gifwrap@npm:0.9.4" + dependencies: + image-q: ^4.0.0 + omggif: ^1.0.10 + checksum: f06d74d72d5fd5cfef78935471da06334c23305328fcaa5b1740c6c93b7ce7f775c28e75e166ecb4d7bc9848f767d4d191c8e18a74187543076a44123002f918 + languageName: node + linkType: hard + +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 14e448192a35c1e42efee94c9d01a10f42fe790375891a24b25261246ce9336ab9df5d274585aedd4568f7922246c2a78b8a8cd2571bfe99c693a9718e7dd0e3 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -5541,6 +7490,16 @@ __metadata: languageName: node linkType: hard +"global@npm:~4.4.0": + version: 4.4.0 + resolution: "global@npm:4.4.0" + dependencies: + min-document: ^2.19.0 + process: ^0.11.10 + checksum: 9c057557c8f5a5bcfbeb9378ba4fe2255d04679452be504608dd5f13b54edf79f7be1db1031ea06a4ec6edd3b9f5f17d2d172fb47e6c69dae57fd84b7e72b77f + languageName: node + linkType: hard + "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -5557,6 +7516,15 @@ __metadata: languageName: node linkType: hard +"globalthis@npm:^1.0.3": + version: 1.0.3 + resolution: "globalthis@npm:1.0.3" + dependencies: + define-properties: ^1.1.3 + checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + languageName: node + linkType: hard + "globby@npm:^11.0.2, globby@npm:^11.0.3, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" @@ -5598,6 +7566,15 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + "graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.10 resolution: "graceful-fs@npm:4.2.10" @@ -5605,7 +7582,42 @@ __metadata: languageName: node linkType: hard -"graphql-tag@npm:^2.12.6, graphql-tag@npm:^2.4.2": +"graphql-extensions@npm:^0.16.0": + version: 0.16.0 + resolution: "graphql-extensions@npm:0.16.0" + dependencies: + "@apollographql/apollo-tools": ^0.5.0 + apollo-server-env: ^3.2.0 + apollo-server-types: ^0.10.0 + peerDependencies: + graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: b1748c69e34ed109f3f369fa46152ec1ee6f8e5327e7f05f3dc4545cafcf50f5184c23c15437ab4b89e76762ac546e0410a8ddc1627515ab9e576c11ae2524c5 + languageName: node + linkType: hard + +"graphql-query-complexity@npm:^0.7.0": + version: 0.7.2 + resolution: "graphql-query-complexity@npm:0.7.2" + dependencies: + lodash.get: ^4.4.2 + peerDependencies: + graphql: ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: defe9a5e9c797c6619b66eda8129b3576579bd420e5cd10e245a8ad1250d15d5be789b841b36c8533f65f4c2f0aa4f1a5b62d4b51b74ff14adb77f729b5621c9 + languageName: node + linkType: hard + +"graphql-subscriptions@npm:^1.0.0, graphql-subscriptions@npm:^1.1.0": + version: 1.2.1 + resolution: "graphql-subscriptions@npm:1.2.1" + dependencies: + iterall: ^1.3.0 + peerDependencies: + graphql: ^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: 2b9533c6774e7be46acd6fbee528aab06429f15dc222eabd991e82c02bf74e390b638dffa1a3fd86c1e26212c40a42a0418d7f4a7c3a1edf0534978ef128e528 + languageName: node + linkType: hard + +"graphql-tag@npm:^2.11.0, graphql-tag@npm:^2.12.6, graphql-tag@npm:^2.4.2": version: 2.12.6 resolution: "graphql-tag@npm:2.12.6" dependencies: @@ -5616,10 +7628,34 @@ __metadata: languageName: node linkType: hard -"graphql@npm:^16.5.0": - version: 16.6.0 - resolution: "graphql@npm:16.6.0" - checksum: bf1d9e3c1938ce3c1a81e909bd3ead1ae4707c577f91cff1ca2eca474bfbc7873d5d7b942e1e9777ff5a8304421dba57a4b76d7a29eb19de8711cb70e3c2415e +"graphql-tools@npm:^4.0.8": + version: 4.0.8 + resolution: "graphql-tools@npm:4.0.8" + dependencies: + apollo-link: ^1.2.14 + apollo-utilities: ^1.0.1 + deprecated-decorator: ^0.1.6 + iterall: ^1.1.3 + uuid: ^3.1.0 + peerDependencies: + graphql: ^0.13.0 || ^14.0.0 || ^15.0.0 + checksum: 6a2dc7f158a87444943db0762dafdbcc6dbfd57a398c6615721a6c1a150641d76f5efca2109685aadb0c1df6ba8ff5bd0fdddcb690c36d3d4f608b46e40427a7 + languageName: node + linkType: hard + +"graphql-type-json@npm:^0.3.2": + version: 0.3.2 + resolution: "graphql-type-json@npm:0.3.2" + peerDependencies: + graphql: ">=0.8.0" + checksum: 41620699637a5294937bd61d6e2696edea5a1279ef3d8f4b33716a910635595435381ccd1b74c6fae62c2bc81064c62ae27d3559c8380c0f99bdfdc8ecb249b0 + languageName: node + linkType: hard + +"graphql@npm:^15.3.0": + version: 15.8.0 + resolution: "graphql@npm:15.8.0" + checksum: 423325271db8858428641b9aca01699283d1fe5b40ef6d4ac622569ecca927019fce8196208b91dd1d8eb8114f00263fe661d241d0eb40c10e5bfd650f86ec5e languageName: node linkType: hard @@ -5646,6 +7682,13 @@ __metadata: languageName: node linkType: hard +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + languageName: node + linkType: hard + "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -5660,14 +7703,39 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.3": +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 languageName: node linkType: hard -"has-unicode@npm:^2.0.1": +"has-tostringtag@npm:^1.0.0": + version: 1.0.0 + resolution: "has-tostringtag@npm:1.0.0" + dependencies: + has-symbols: ^1.0.2 + checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.0, has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 @@ -5799,6 +7867,16 @@ __metadata: languageName: node linkType: hard +"http-assert@npm:^1.3.0": + version: 1.5.0 + resolution: "http-assert@npm:1.5.0" + dependencies: + deep-equal: ~1.0.1 + http-errors: ~1.8.0 + checksum: 69c9b3c14cf8b2822916360a365089ce936c883c49068f91c365eccba5c141a9964d19fdda589150a480013bf503bf37d8936c732e9635819339e730ab0e7527 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.0": version: 4.1.0 resolution: "http-cache-semantics@npm:4.1.0" @@ -5826,6 +7904,19 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:^1.3.1, http-errors@npm:^1.6.3, http-errors@npm:^1.7.3, http-errors@npm:~1.8.0": + version: 1.8.1 + resolution: "http-errors@npm:1.8.1" + dependencies: + depd: ~1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: ">= 1.5.0 < 2" + toidentifier: 1.0.1 + checksum: d3c7e7e776fd51c0a812baff570bdf06fe49a5dc448b700ab6171b1250e4cf7db8b8f4c0b133e4bfe2451022a5790c1ca6c2cae4094dedd6ac8304a1267f91d2 + languageName: node + linkType: hard + "http-errors@npm:~1.6.2": version: 1.6.3 resolution: "http-errors@npm:1.6.3" @@ -5947,13 +8038,20 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.1.13": +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e languageName: node linkType: hard +"ignore-by-default@npm:^1.0.1": + version: 1.0.1 + resolution: "ignore-by-default@npm:1.0.1" + checksum: 441509147b3615e0365e407a3c18e189f78c07af08564176c680be1fabc94b6c789cad1342ad887175d4ecd5225de86f73d376cec8e06b42fd9b429505ffcf8a + languageName: node + linkType: hard + "ignore@npm:^5.0.4, ignore@npm:^5.1.9, ignore@npm:^5.2.0": version: 5.2.4 resolution: "ignore@npm:5.2.4" @@ -5961,6 +8059,15 @@ __metadata: languageName: node linkType: hard +"image-q@npm:^4.0.0": + version: 4.0.0 + resolution: "image-q@npm:4.0.0" + dependencies: + "@types/node": 16.9.1 + checksum: 6c6a1dd8467833161f46cc17b4a43218d30a3899ff71a4ffb895f71a14ca29de12f79d824d4d2174070924cbd97faa018b2ded8d690483ab7eb269f364cd97cc + languageName: node + linkType: hard + "image-size@npm:~0.5.0": version: 0.5.5 resolution: "image-size@npm:0.5.5" @@ -5999,6 +8106,13 @@ __metadata: languageName: node linkType: hard +"import-modules@npm:^2.1.0": + version: 2.1.0 + resolution: "import-modules@npm:2.1.0" + checksum: d9ac33dfea5a301c0cdc51455d875c373b2c04eb673488cb6d706474612575763f8ea6353d0b4a5bfffb2a9a06cbf4ecba90d8d9db4aa5f736fa957acbbc851c + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -6020,6 +8134,13 @@ __metadata: languageName: node linkType: hard +"inflation@npm:^2.0.0": + version: 2.0.0 + resolution: "inflation@npm:2.0.0" + checksum: a0494871b12275afdef9e2710ee1af1e0fc642b04613a9be69c05ef8b5e9627f3bd7d358a937fa47aa20235ee7313a4f30255048533add0ad4918beb918a586e + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -6030,7 +8151,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -6044,13 +8165,41 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.4": +"ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 languageName: node linkType: hard +"internal-slot@npm:^1.0.4": + version: 1.0.4 + resolution: "internal-slot@npm:1.0.4" + dependencies: + get-intrinsic: ^1.1.3 + has: ^1.0.3 + side-channel: ^1.0.4 + checksum: 8974588d06bab4f675573a3b52975370facf6486df51bc0567a982c7024fa29495f10b76c0d4dc742dd951d1b72024fdc1e31bb0bedf1678dc7aacacaf5a4f73 + languageName: node + linkType: hard + +"interpret@npm:^2.2.0": + version: 2.2.0 + resolution: "interpret@npm:2.2.0" + checksum: f51efef7cb8d02da16408ffa3504cd6053014c5aeb7bb8c223727e053e4235bf565e45d67028b0c8740d917c603807aa3c27d7bd2f21bf20b6417e2bb3e5fd6e + languageName: node + linkType: hard + +"into-stream@npm:^6.0.0": + version: 6.0.0 + resolution: "into-stream@npm:6.0.0" + dependencies: + from2: ^2.3.0 + p-is-promise: ^3.0.0 + checksum: 8df24c9eadd7cdd1cbc160bc20914b961dfd0ca29767785b69e698f799e85466b6f7c637d237dca1472d09d333399f70cc05a2fb8d08cb449dc9a80d92193980 + languageName: node + linkType: hard + "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" @@ -6072,6 +8221,17 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.1": + version: 3.0.1 + resolution: "is-array-buffer@npm:3.0.1" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-typed-array: ^1.1.10 + checksum: f26ab87448e698285daf707e52a533920449f7abf63714140ffab9d5571aa5a71ac2fa2677e8b793ad0d5d3e40078d4d2c8a0ab39c957e3cfc6513bb6c9dfdc9 + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -6079,6 +8239,22 @@ __metadata: languageName: node linkType: hard +"is-arrayish@npm:^0.3.1": + version: 0.3.2 + resolution: "is-arrayish@npm:0.3.2" + checksum: 977e64f54d91c8f169b59afcd80ff19227e9f5c791fa28fa2e5bce355cbaf6c2c356711b734656e80c9dd4a854dd7efcf7894402f1031dfc5de5d620775b4d5f + languageName: node + linkType: hard + +"is-bigint@npm:^1.0.1": + version: 1.0.4 + resolution: "is-bigint@npm:1.0.4" + dependencies: + has-bigints: ^1.0.1 + checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + languageName: node + linkType: hard + "is-binary-path@npm:~2.1.0": version: 2.1.0 resolution: "is-binary-path@npm:2.1.0" @@ -6088,6 +8264,16 @@ __metadata: languageName: node linkType: hard +"is-boolean-object@npm:^1.1.0": + version: 1.1.2 + resolution: "is-boolean-object@npm:1.1.2" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + languageName: node + linkType: hard + "is-buffer@npm:^1.1.5": version: 1.1.6 resolution: "is-buffer@npm:1.1.6" @@ -6095,6 +8281,31 @@ __metadata: languageName: node linkType: hard +"is-builtin-module@npm:^3.1.0": + version: 3.2.0 + resolution: "is-builtin-module@npm:3.2.0" + dependencies: + builtin-modules: ^3.3.0 + checksum: 0315751b898feff0646511c896e88b608a755c5025d0ce9a3ad25783de50be870e47dafb838cebbb06fbb2a948b209ea55348eee267836c9dd40d3a11ec717d3 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac + languageName: node + linkType: hard + +"is-core-module@npm:2.9.0": + version: 2.9.0 + resolution: "is-core-module@npm:2.9.0" + dependencies: + has: ^1.0.3 + checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce + languageName: node + linkType: hard + "is-core-module@npm:^2.9.0": version: 2.11.0 resolution: "is-core-module@npm:2.11.0" @@ -6104,6 +8315,15 @@ __metadata: languageName: node linkType: hard +"is-date-object@npm:^1.0.1": + version: 1.0.5 + resolution: "is-date-object@npm:1.0.5" + dependencies: + has-tostringtag: ^1.0.0 + checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + languageName: node + linkType: hard + "is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": version: 2.2.1 resolution: "is-docker@npm:2.2.1" @@ -6136,6 +8356,15 @@ __metadata: languageName: node linkType: hard +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: ^1.0.0 + checksum: 4d46a7465a66a8aebcc5340d3b63a56602133874af576a9ca42c6f0f4bd787a743605771c5f246db77da96605fefeffb65fc1dbe862dcc7328f4b4d03edf5a57 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^2.0.0": version: 2.0.0 resolution: "is-fullwidth-code-point@npm:2.0.0" @@ -6150,6 +8379,13 @@ __metadata: languageName: node linkType: hard +"is-function@npm:^1.0.1": + version: 1.0.2 + resolution: "is-function@npm:1.0.2" + checksum: 7d564562e07b4b51359547d3ccc10fb93bb392fd1b8177ae2601ee4982a0ece86d952323fc172a9000743a3971f09689495ab78a1d49a9b14fc97a7e28521dc0 + languageName: node + linkType: hard + "is-generator-fn@npm:^2.0.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" @@ -6157,6 +8393,15 @@ __metadata: languageName: node linkType: hard +"is-generator-function@npm:^1.0.7": + version: 1.0.10 + resolution: "is-generator-function@npm:1.0.10" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d54644e7dbaccef15ceb1e5d91d680eb5068c9ee9f9eb0a9e04173eb5542c9b51b5ab52c5537f5703e48d5fddfd376817c1ca07a84a407b7115b769d4bdde72b + languageName: node + linkType: hard + "is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -6180,6 +8425,22 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.2": + version: 2.0.2 + resolution: "is-negative-zero@npm:2.0.2" + checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a + languageName: node + linkType: hard + +"is-number-object@npm:^1.0.4": + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + languageName: node + linkType: hard + "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -6210,6 +8471,25 @@ __metadata: languageName: node linkType: hard +"is-regex@npm:^1.1.4": + version: 1.1.4 + resolution: "is-regex@npm:1.1.4" + dependencies: + call-bind: ^1.0.2 + has-tostringtag: ^1.0.0 + checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + languageName: node + linkType: hard + +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + languageName: node + linkType: hard + "is-stream@npm:^1.1.0": version: 1.1.0 resolution: "is-stream@npm:1.1.0" @@ -6224,6 +8504,44 @@ __metadata: languageName: node linkType: hard +"is-string@npm:^1.0.5, is-string@npm:^1.0.7": + version: 1.0.7 + resolution: "is-string@npm:1.0.7" + dependencies: + has-tostringtag: ^1.0.0 + checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": + version: 1.0.4 + resolution: "is-symbol@npm:1.0.4" + dependencies: + has-symbols: ^1.0.2 + checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + languageName: node + linkType: hard + +"is-there@npm:^4.5.1": + version: 4.5.1 + resolution: "is-there@npm:4.5.1" + checksum: 763240c846c85b516271c747d675bae1f49efdfb252556c946e9940cb0d5d9953a50610d6f2a1ee9827da7ac1f8e74157c0f02a6ab17e86aaf319c56ba4652c2 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": + version: 1.1.10 + resolution: "is-typed-array@npm:1.1.10" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 + languageName: node + linkType: hard + "is-unicode-supported@npm:^0.1.0": version: 0.1.0 resolution: "is-unicode-supported@npm:0.1.0" @@ -6231,6 +8549,15 @@ __metadata: languageName: node linkType: hard +"is-weakref@npm:^1.0.2": + version: 1.0.2 + resolution: "is-weakref@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + languageName: node + linkType: hard + "is-what@npm:^3.14.1": version: 3.14.1 resolution: "is-what@npm:3.14.1" @@ -6254,6 +8581,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:0.0.1": + version: 0.0.1 + resolution: "isarray@npm:0.0.1" + checksum: 49191f1425681df4a18c2f0f93db3adb85573bcdd6a4482539d98eac9e705d8961317b01175627e860516a2fc45f8f9302db26e5a380a97a520e272e2a40a8d4 + languageName: node + linkType: hard + "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -6327,7 +8661,7 @@ __metadata: languageName: node linkType: hard -"iterall@npm:^1.2.1": +"iterall@npm:^1.1.3, iterall@npm:^1.2.1, iterall@npm:^1.3.0": version: 1.3.0 resolution: "iterall@npm:1.3.0" checksum: c78b99678f8c99be488cca7f33e4acca9b72c1326e050afbaf023f086e55619ee466af0464af94a0cb3f292e60cb5bac53a8fd86bd4249ecad26e09f17bb158b @@ -6950,6 +9284,13 @@ __metadata: languageName: node linkType: hard +"jpeg-js@npm:^0.4.2": + version: 0.4.4 + resolution: "jpeg-js@npm:0.4.4" + checksum: bd7cb61aa8df40a9ee2c2106839c3df6054891e56cfc22c0ac581402e06c6295f962a4754b0b2ac50a401789131b1c6dc9df8d24400f1352168be1894833c590 + languageName: node + linkType: hard + "js-beautify@npm:^1.6.12": version: 1.14.7 resolution: "js-beautify@npm:1.14.7" @@ -6980,7 +9321,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:4.1.0, js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -7003,6 +9344,20 @@ __metadata: languageName: node linkType: hard +"jsdoc-type-pratt-parser@npm:1.0.4": + version: 1.0.4 + resolution: "jsdoc-type-pratt-parser@npm:1.0.4" + checksum: f80df71fc5d90714a035283136485c518dca74f1aa263e66d7ea79d563dd04fe73602156a6683f32a6218bc9d0d15d1a767a7d3e8b67227ec663183296250330 + languageName: node + linkType: hard + +"jsdoc-type-pratt-parser@npm:^1.0.4": + version: 1.2.0 + resolution: "jsdoc-type-pratt-parser@npm:1.2.0" + checksum: 8be7a0e1373ad7662edd2e0f804dda462e9c56c9297aa722466ebe4bfd8c96ecdc5ce42ca91e0ca97ff6cc5c7ca730a9f5a0bc6939d7695559f0a8b95e3a2ca2 + languageName: node + linkType: hard + "jsdom@npm:^19.0.0": version: 19.0.0 resolution: "jsdom@npm:19.0.0" @@ -7127,6 +9482,54 @@ __metadata: languageName: node linkType: hard +"jsonwebtoken@npm:^8.5.1": + version: 8.5.1 + resolution: "jsonwebtoken@npm:8.5.1" + dependencies: + jws: ^3.2.2 + lodash.includes: ^4.3.0 + lodash.isboolean: ^3.0.3 + lodash.isinteger: ^4.0.4 + lodash.isnumber: ^3.0.3 + lodash.isplainobject: ^4.0.6 + lodash.isstring: ^4.0.1 + lodash.once: ^4.0.0 + ms: ^2.1.1 + semver: ^5.6.0 + checksum: 93c9e3f23c59b758ac88ba15f4e4753b3749dfce7a6f7c40fb86663128a1e282db085eec852d4e0cbca4cefdcd3a8275ee255dbd08fcad0df26ad9f6e4cc853a + languageName: node + linkType: hard + +"jwa@npm:^1.4.1": + version: 1.4.1 + resolution: "jwa@npm:1.4.1" + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: ^5.0.1 + checksum: ff30ea7c2dcc61f3ed2098d868bf89d43701605090c5b21b5544b512843ec6fd9e028381a4dda466cbcdb885c2d1150f7c62e7168394ee07941b4098e1035e2f + languageName: node + linkType: hard + +"jws@npm:^3.2.2": + version: 3.2.2 + resolution: "jws@npm:3.2.2" + dependencies: + jwa: ^1.4.1 + safe-buffer: ^5.0.1 + checksum: f0213fe5b79344c56cd443428d8f65c16bf842dc8cb8f5aed693e1e91d79c20741663ad6eff07a6d2c433d1831acc9814e8d7bada6a0471fbb91d09ceb2bf5c2 + languageName: node + linkType: hard + +"keygrip@npm:~1.1.0": + version: 1.1.0 + resolution: "keygrip@npm:1.1.0" + dependencies: + tsscmp: 1.0.6 + checksum: 078cd16a463d187121f0a27c1c9c95c52ad392b620f823431689f345a0501132cee60f6e96914b07d570105af470b96960402accd6c48a0b1f3cd8fac4fa2cae + languageName: node + linkType: hard + "kind-of@npm:^3.0.2": version: 3.2.2 resolution: "kind-of@npm:3.2.2" @@ -7157,6 +9560,103 @@ __metadata: languageName: node linkType: hard +"koa-bodyparser@npm:^4.2.1": + version: 4.3.0 + resolution: "koa-bodyparser@npm:4.3.0" + dependencies: + co-body: ^6.0.0 + copy-to: ^2.0.1 + checksum: c227fe0fb5a55b98fc91d865e80229b60178d216d53b732b07833eb38f48a7ed6aa768a083bc06e359db33298547e9a65842fbe9d3f0fdaf5149fe0becafc88f + languageName: node + linkType: hard + +"koa-compose@npm:^3.0.0": + version: 3.2.1 + resolution: "koa-compose@npm:3.2.1" + dependencies: + any-promise: ^1.1.0 + checksum: ff8e5fc0348455acf751179c6c613eb030a5fac6406d3b49ae9e00460b7ee8770db3ef62633fd3db0306cd4a6d2a0b5152399ebd5bb5e684418f9eeeb251c2de + languageName: node + linkType: hard + +"koa-compose@npm:^4.1.0": + version: 4.1.0 + resolution: "koa-compose@npm:4.1.0" + checksum: 46cb16792d96425e977c2ae4e5cb04930280740e907242ec9c25e3fb8b4a1d7b54451d7432bc24f40ec62255edea71894d2ceeb8238501842b4e48014f2e83db + languageName: node + linkType: hard + +"koa-convert@npm:^2.0.0": + version: 2.0.0 + resolution: "koa-convert@npm:2.0.0" + dependencies: + co: ^4.6.0 + koa-compose: ^4.1.0 + checksum: 7385b3391995f59c1312142e110d5dff677f9850dbfbcf387cd36a7b0af03b5d26e82b811eb9bb008b4f3e661cdab1f8817596e46b1929da2cf6e97a2f7456ed + languageName: node + linkType: hard + +"koa-multer@npm:^1.0.2": + version: 1.0.2 + resolution: "koa-multer@npm:1.0.2" + dependencies: + multer: 1.3.0 + checksum: cb2fe8b00c9b6d74081fa7f722d60a976939a5ecf051f7e4b3fb4fa41414aa762a24c741aa1cde6bcd6d709174a7cf0410b6a05330fa55769b9f9f663cc33aa3 + languageName: node + linkType: hard + +"koa-router@npm:^7.4.0": + version: 7.4.0 + resolution: "koa-router@npm:7.4.0" + dependencies: + debug: ^3.1.0 + http-errors: ^1.3.1 + koa-compose: ^3.0.0 + methods: ^1.0.1 + path-to-regexp: ^1.1.1 + urijs: ^1.19.0 + checksum: fa39643a00d12964e0c0479beb9987b58b4a68367b0f2e93a5b9b7187912442ca50ceda31c084b49407d77ea4d9ba1fbcc432170cc528f5774dee738df9dcb4e + languageName: node + linkType: hard + +"koa@npm:^2.8.2": + version: 2.14.1 + resolution: "koa@npm:2.14.1" + dependencies: + accepts: ^1.3.5 + cache-content-type: ^1.0.0 + content-disposition: ~0.5.2 + content-type: ^1.0.4 + cookies: ~0.8.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 + checksum: 84cfce48d72cf434831bd9f4f06beb3815da030325a7e89b13ee684f5afd158221e16c2d450ca637b221aa0c4a0ab235edd129e4efea656dc5d8384801d3e90f + languageName: node + linkType: hard + +"kuler@npm:^2.0.0": + version: 2.0.0 + resolution: "kuler@npm:2.0.0" + checksum: 9e10b5a1659f9ed8761d38df3c35effabffbd19fc6107324095238e4ef0ff044392cae9ac64a1c2dda26e532426485342226b93806bd97504b174b0dcf04ed81 + languageName: node + linkType: hard + "launch-editor-middleware@npm:^2.2.1": version: 2.6.0 resolution: "launch-editor-middleware@npm:2.6.0" @@ -7283,6 +9783,13 @@ __metadata: languageName: node linkType: hard +"libphonenumber-js@npm:^1.10.14": + version: 1.10.18 + resolution: "libphonenumber-js@npm:1.10.18" + checksum: df0a4b8adfb79666636913f6da730ffc3bc037094e35be492d2f7a23ef26754d65a7afa5f64e04f5c5c2883193fa10bd4bea966fd28edcf0c72ddd13bd4b3625 + languageName: node + linkType: hard + "license-webpack-plugin@npm:^4.0.2": version: 4.0.2 resolution: "license-webpack-plugin@npm:4.0.2" @@ -7318,6 +9825,22 @@ __metadata: languageName: node linkType: hard +"load-bmfont@npm:^1.3.1": + version: 1.4.1 + resolution: "load-bmfont@npm:1.4.1" + dependencies: + buffer-equal: 0.0.1 + mime: ^1.3.4 + parse-bmfont-ascii: ^1.0.3 + parse-bmfont-binary: ^1.0.5 + parse-bmfont-xml: ^1.1.4 + phin: ^2.9.1 + xhr: ^2.0.1 + xtend: ^4.0.0 + checksum: 688d932fb0dc4c9333747736ccd926261f0b91734b7bdb6ff24f8659ef068a0f0b2278084b208851afac0beec79af7bd6664fe2ed5b6c5e1db88755fc25f785e + languageName: node + linkType: hard + "loader-runner@npm:^4.1.0, loader-runner@npm:^4.2.0": version: 4.3.0 resolution: "loader-runner@npm:4.3.0" @@ -7363,6 +9886,55 @@ __metadata: languageName: node linkType: hard +"lodash.get@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.get@npm:4.4.2" + checksum: e403047ddb03181c9d0e92df9556570e2b67e0f0a930fcbbbd779370972368f5568e914f913e93f3b08f6d492abc71e14d4e9b7a18916c31fa04bd2306efe545 + languageName: node + linkType: hard + +"lodash.includes@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.includes@npm:4.3.0" + checksum: 71092c130515a67ab3bd928f57f6018434797c94def7f46aafa417771e455ce3a4834889f4267b17887d7f75297dfabd96231bf704fd2b8c5096dc4a913568b6 + languageName: node + linkType: hard + +"lodash.isboolean@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isboolean@npm:3.0.3" + checksum: b70068b4a8b8837912b54052557b21fc4774174e3512ed3c5b94621e5aff5eb6c68089d0a386b7e801d679cd105d2e35417978a5e99071750aa2ed90bffd0250 + languageName: node + linkType: hard + +"lodash.isinteger@npm:^4.0.4": + version: 4.0.4 + resolution: "lodash.isinteger@npm:4.0.4" + checksum: 6034821b3fc61a2ffc34e7d5644bb50c5fd8f1c0121c554c21ac271911ee0c0502274852845005f8651d51e199ee2e0cfebfe40aaa49c7fe617f603a8a0b1691 + languageName: node + linkType: hard + +"lodash.isnumber@npm:^3.0.3": + version: 3.0.3 + resolution: "lodash.isnumber@npm:3.0.3" + checksum: 913784275b565346255e6ae6a6e30b760a0da70abc29f3e1f409081585875105138cda4a429ff02577e1bc0a7ae2a90e0a3079a37f3a04c3d6c5aaa532f4cab2 + languageName: node + linkType: hard + +"lodash.isplainobject@npm:^4.0.6": + version: 4.0.6 + resolution: "lodash.isplainobject@npm:4.0.6" + checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 + languageName: node + linkType: hard + +"lodash.isstring@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.isstring@npm:4.0.1" + checksum: eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0 + languageName: node + linkType: hard + "lodash.mapvalues@npm:^4.6.0": version: 4.6.0 resolution: "lodash.mapvalues@npm:4.6.0" @@ -7384,6 +9956,20 @@ __metadata: languageName: node linkType: hard +"lodash.once@npm:^4.0.0": + version: 4.1.1 + resolution: "lodash.once@npm:4.1.1" + checksum: d768fa9f9b4e1dc6453be99b753906f58990e0c45e7b2ca5a3b40a33111e5d17f6edf2f768786e2716af90a8e78f8f91431ab8435f761fef00f9b0c256f6d245 + languageName: node + linkType: hard + +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c + languageName: node + linkType: hard + "lodash.uniq@npm:^4.5.0": version: 4.5.0 resolution: "lodash.uniq@npm:4.5.0" @@ -7419,6 +10005,33 @@ __metadata: languageName: node linkType: hard +"logform@npm:^2.3.2, logform@npm:^2.4.0": + version: 2.4.2 + resolution: "logform@npm:2.4.2" + dependencies: + "@colors/colors": 1.5.0 + fecha: ^4.2.0 + ms: ^2.1.1 + safe-stable-stringify: ^2.3.1 + triple-beam: ^1.3.0 + checksum: 3d00f4e1ccaf0a86886aabbf66d1f1d207441d5b408f103457da6d64d055aee76c02af4b40a31ca77a1db4cbcdecb007149f731536c39cbd89b7b6ba3dda6d7b + languageName: node + linkType: hard + +"loglevel@npm:^1.6.7": + version: 1.8.1 + resolution: "loglevel@npm:1.8.1" + checksum: a1a62db40291aaeaef2f612334c49e531bff71cc1d01a2acab689ab80d59e092f852ab164a5aedc1a752fdc46b7b162cb097d8a9eb2cf0b299511106c29af61d + languageName: node + linkType: hard + +"long@npm:^4.0.0": + version: 4.0.0 + resolution: "long@npm:4.0.0" + checksum: 16afbe8f749c7c849db1f4de4e2e6a31ac6e617cead3bdc4f9605cb703cd20e1e9fc1a7baba674ffcca57d660a6e5b53a9e236d7b25a295d3855cca79cc06744 + languageName: node + linkType: hard + "lower-case@npm:^2.0.2": version: 2.0.2 resolution: "lower-case@npm:2.0.2" @@ -7582,13 +10195,29 @@ __metadata: languageName: node linkType: hard -"methods@npm:~1.1.2": +"methods@npm:^1.0.1, methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a languageName: node linkType: hard +"metric-lcs@npm:^0.1.2": + version: 0.1.2 + resolution: "metric-lcs@npm:0.1.2" + checksum: 9dbdedb904da1a4c0a21024df781427f7b23d7469fdf55275c790fef3471634ee64a7bde0813c6b035c7eff021957833249172180f4ca59e7b4c7b5e587950bc + languageName: node + linkType: hard + +"microframework@npm:^0.6.4": + version: 0.6.4 + resolution: "microframework@npm:0.6.4" + dependencies: + app-root-path: ^2.0.1 + checksum: d339d3a11e422622cd1ace25c1ed39a5e493ff9f25310940712811be62c22b2812efff5f835aa662f86f5645f5247b8a93d4c0e6cf47a32ae8f2912aa99945dd + languageName: node + linkType: hard + "micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -7606,7 +10235,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.18, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -7615,7 +10244,7 @@ __metadata: languageName: node linkType: hard -"mime@npm:1.6.0, mime@npm:^1.4.1": +"mime@npm:1.6.0, mime@npm:^1.3.4, mime@npm:^1.4.1": version: 1.6.0 resolution: "mime@npm:1.6.0" bin: @@ -7638,6 +10267,22 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^2.0.0": + version: 2.1.0 + resolution: "mimic-response@npm:2.1.0" + checksum: 014fad6ab936657e5f2f48bd87af62a8e928ebe84472aaf9e14fec4fcb31257a5edff77324d8ac13ddc6685ba5135cf16e381efac324e5f174fb4ddbf902bf07 + languageName: node + linkType: hard + +"min-document@npm:^2.19.0": + version: 2.19.0 + resolution: "min-document@npm:2.19.0" + dependencies: + dom-walk: ^0.1.0 + checksum: da6437562ea2228041542a2384528e74e22d1daa1a4ec439c165abf0b9d8a63e17e3b8a6dc6e0c731845e85301198730426932a0e813d23f932ca668340c9623 + languageName: node + linkType: hard + "mini-css-extract-plugin@npm:^2.5.3": version: 2.7.2 resolution: "mini-css-extract-plugin@npm:2.7.2" @@ -7694,7 +10339,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.7 resolution: "minimist@npm:1.2.7" checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec @@ -7780,7 +10425,14 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.6": +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.6": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -7807,6 +10459,22 @@ __metadata: languageName: node linkType: hard +"moment-timezone@npm:^0.5.x": + version: 0.5.40 + resolution: "moment-timezone@npm:0.5.40" + dependencies: + moment: ">= 2.9.0" + checksum: 6f6be5412b37fd937bb143efe74bf65b2c3f115fd967a6dc13b717a126ed6dd198bff6db6e179d69a089e20ac03ce7622c6b5598dd585005195554487a91b528 + languageName: node + linkType: hard + +"moment@npm:>= 2.9.0, moment@npm:^2.24.0": + version: 2.29.4 + resolution: "moment@npm:2.29.4" + checksum: 0ec3f9c2bcba38dc2451b1daed5daded747f17610b92427bebe1d08d48d8b7bdd8d9197500b072d14e326dd0ccf3e326b9e3d07c5895d3d49e39b6803b76e80e + languageName: node + linkType: hard + "mrmime@npm:^1.0.0": version: 1.0.1 resolution: "mrmime@npm:1.0.1" @@ -7835,6 +10503,38 @@ __metadata: languageName: node linkType: hard +"multer@npm:1.3.0": + version: 1.3.0 + resolution: "multer@npm:1.3.0" + dependencies: + append-field: ^0.1.0 + busboy: ^0.2.11 + concat-stream: ^1.5.0 + mkdirp: ^0.5.1 + object-assign: ^3.0.0 + on-finished: ^2.3.0 + type-is: ^1.6.4 + xtend: ^4.0.0 + checksum: dd4d51c5f243578ac0cc49aeca0acdb93dc6098fb5759f0664cdcfcfdf480d0ac480caf0697a3b8bf09d009b5897c1b6ec2ba9638871b557a17d06de354927bd + languageName: node + linkType: hard + +"multer@npm:^1.4.2": + version: 1.4.4 + resolution: "multer@npm:1.4.4" + dependencies: + append-field: ^1.0.0 + busboy: ^0.2.11 + concat-stream: ^1.5.2 + mkdirp: ^0.5.4 + object-assign: ^4.1.1 + on-finished: ^2.3.0 + type-is: ^1.6.4 + xtend: ^4.0.0 + checksum: b5550d250aeee9c4d630eaecd133af0899239f6b10cec4b448ddd0a808025b383520b8227198a8612f60c2cd2094bcb60de93d973084f889d4e40efe6dbd641e + languageName: node + linkType: hard + "multicast-dns@npm:^7.2.5": version: 7.2.5 resolution: "multicast-dns@npm:7.2.5" @@ -7847,6 +10547,23 @@ __metadata: languageName: node linkType: hard +"multimap@npm:^1.1.0": + version: 1.1.0 + resolution: "multimap@npm:1.1.0" + checksum: 42769c9dd74096d989618fd0f47c69d19f9bab48d1b0b673cfa6c44042a0bd5847524533a06afde80334b4a24defec27754dc8d1f083ee7bb880f69f437efabc + languageName: node + linkType: hard + +"multistream@npm:^4.1.0": + version: 4.1.0 + resolution: "multistream@npm:4.1.0" + dependencies: + once: ^1.4.0 + readable-stream: ^3.6.0 + checksum: 305c49a1aadcb7f63f64d8ca2bb6e7852e5f7dba94c7329e9a72ce53cd0046686b71668dc1adbf123f17d2dd107765fc946e64c36a26b15c470a3146ea3bc923 + languageName: node + linkType: hard + "mz@npm:^2.4.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -7867,6 +10584,13 @@ __metadata: languageName: node linkType: hard +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 06c14271ee966e108d55ae109f340976a9556c8603e888037145d6522726aebe89dd0c861b4b83947feaf6d39e79e08817559e8693deedc2c94e82c5cbd090c7 + languageName: node + linkType: hard + "native-request@npm:^1.0.5": version: 1.1.0 resolution: "native-request@npm:1.1.0" @@ -7922,13 +10646,34 @@ __metadata: languageName: node linkType: hard -"no-case@npm:^3.0.4": - version: 3.0.4 - resolution: "no-case@npm:3.0.4" +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: ^2.0.2 + tslib: ^2.0.3 + checksum: 0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c + languageName: node + linkType: hard + +"no-cliches@npm:^0.3.0": + version: 0.3.4 + resolution: "no-cliches@npm:0.3.4" + peerDependencies: + eslint-plugin-import: ^2.22.1 + eslint-plugin-jsx-a11y: ^6.4.1 + eslint-plugin-react: ^7.21.5 + eslint-plugin-react-hooks: ^4.0.0 + checksum: 7abc57c9bc987453d4b8b606097b8ddffefec573782fea1c921784b6b51fdb247c9599bb73b38c7e1274f677aa517f2758155acf0585e5c58b77bedfe7e01861 + languageName: node + linkType: hard + +"node-abi@npm:^2.21.0": + version: 2.30.1 + resolution: "node-abi@npm:2.30.1" dependencies: - lower-case: ^2.0.2 - tslib: ^2.0.3 - checksum: 0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c + semver: ^5.4.1 + checksum: 3f4b0c912ce4befcd7ceab4493ba90b51d60dfcc90f567c93f731d897ef8691add601cb64c181683b800f21d479d68f9a6e15d8ab8acd16a5706333b9e30a881 languageName: node linkType: hard @@ -7948,6 +10693,20 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.6": + version: 2.6.8 + resolution: "node-fetch@npm:2.6.8" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 91f57be68e29f9b1382750693619e199733a6936998e6d618f1aa779853ad8fc4a2facf170db7957bf1d2510bad33449edf74b5802713d81b63de5986fa3be00 + languageName: node + linkType: hard + "node-fetch@npm:^2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -8021,6 +10780,41 @@ __metadata: languageName: node linkType: hard +"node-vibrant@npm:^3.2.1-alpha.1": + version: 3.2.1-alpha.1 + resolution: "node-vibrant@npm:3.2.1-alpha.1" + dependencies: + "@types/node": ^10.12.18 + "@vibrant/core": ^3.2.1-alpha.1 + "@vibrant/generator-default": ^3.2.1-alpha.1 + "@vibrant/image-browser": ^3.2.1-alpha.1 + "@vibrant/image-node": ^3.2.1-alpha.1 + "@vibrant/quantizer-mmcq": ^3.2.1-alpha.1 + url: ^0.11.0 + checksum: f5c287db6133114673e2b7e2752f4f7586348451fa31033107b1316a36e12f207428deaaaa1d30845139a94d6ebd4b64959c33fc568e57287bc5749f93c94c2e + languageName: node + linkType: hard + +"nodemon@npm:^2.0.5": + version: 2.0.20 + resolution: "nodemon@npm:2.0.20" + dependencies: + chokidar: ^3.5.2 + debug: ^3.2.7 + ignore-by-default: ^1.0.1 + minimatch: ^3.1.2 + pstree.remy: ^1.1.8 + semver: ^5.7.1 + simple-update-notifier: ^1.0.7 + supports-color: ^5.5.0 + touch: ^3.1.0 + undefsafe: ^2.0.5 + bin: + nodemon: bin/nodemon.js + checksum: 9fe858682414fe703179f4fe36c86e71f40d2693b5345c09803d7b191816a6589c5df8f1f9873bffee92893880183b95a031c86340e46b364ef1b0b7f619edbf + languageName: node + linkType: hard + "nopt@npm:^6.0.0": version: 6.0.0 resolution: "nopt@npm:6.0.0" @@ -8032,6 +10826,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:~1.0.10": + version: 1.0.10 + resolution: "nopt@npm:1.0.10" + dependencies: + abbrev: 1 + bin: + nopt: ./bin/nopt.js + checksum: f62575aceaa3be43f365bf37a596b89bbac2e796b001b6d2e2a85c2140a4e378ff919e2753ccba959c4fd344776fc88c29b393bc167fa939fb1513f126f4cd45 + languageName: node + linkType: hard + "normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" @@ -8083,6 +10888,18 @@ __metadata: languageName: node linkType: hard +"npmlog@npm:^4.0.1": + version: 4.1.2 + resolution: "npmlog@npm:4.1.2" + dependencies: + are-we-there-yet: ~1.1.2 + console-control-strings: ~1.1.0 + gauge: ~2.7.3 + set-blocking: ~2.0.0 + checksum: edbda9f95ec20957a892de1839afc6fb735054c3accf6fbefe767bac9a639fd5cea2baeac6bd2bcd50a85cb54924d57d9886c81c7fbc2332c2ddd19227504192 + languageName: node + linkType: hard + "npmlog@npm:^6.0.0": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -8104,6 +10921,13 @@ __metadata: languageName: node linkType: hard +"number-is-nan@npm:^1.0.0": + version: 1.0.1 + resolution: "number-is-nan@npm:1.0.1" + checksum: 13656bc9aa771b96cef209ffca31c31a03b507ca6862ba7c3f638a283560620d723d52e626d57892c7fff475f4c36ac07f0600f14544692ff595abff214b9ffb + languageName: node + linkType: hard + "nwsapi@npm:^2.2.0": version: 2.2.2 resolution: "nwsapi@npm:2.2.2" @@ -8164,13 +10988,27 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1": +"object-assign@npm:^3.0.0": + version: 3.0.0 + resolution: "object-assign@npm:3.0.0" + checksum: 56c66a77318aea95b11bd16a65c313e98786cea1db673a7fdd3bc92aced671b35f62a9819ad9cf7846921c773818329636cda5cd1b7c4fa0ce9908440e091dac + languageName: node + linkType: hard + +"object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f languageName: node linkType: hard +"object-inspect@npm:^1.12.2": + version: 1.12.3 + resolution: "object-inspect@npm:1.12.3" + checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db + languageName: node + linkType: hard + "object-inspect@npm:^1.9.0": version: 1.12.2 resolution: "object-inspect@npm:1.12.2" @@ -8178,6 +11016,44 @@ __metadata: languageName: node linkType: hard +"object-keys@npm:^1.1.1": + version: 1.1.1 + resolution: "object-keys@npm:1.1.1" + checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + languageName: node + linkType: hard + +"object-path@npm:^0.11.4": + version: 0.11.8 + resolution: "object-path@npm:0.11.8" + checksum: 684ccf0fb6b82f067dc81e2763481606692b8485bec03eb2a64e086a44dbea122b2b9ef44423a08e09041348fe4b4b67bd59985598f1652f67df95f0618f5968 + languageName: node + linkType: hard + +"object.assign@npm:^4.1.4": + version: 4.1.4 + resolution: "object.assign@npm:4.1.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + languageName: node + linkType: hard + +"object.getownpropertydescriptors@npm:^2.1.1": + version: 2.1.5 + resolution: "object.getownpropertydescriptors@npm:2.1.5" + dependencies: + array.prototype.reduce: ^1.0.5 + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 7883e1aac1f9cd4cd85e2bb8c7aab6a60940a7cfe07b788356f301844d4967482fc81058e7bda24e1b3909cbb4879387ea9407329b78704f8937bc0b97dec58b + languageName: node + linkType: hard + "obuf@npm:^1.0.0, obuf@npm:^1.1.2": version: 1.1.2 resolution: "obuf@npm:1.1.2" @@ -8185,7 +11061,14 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1": +"omggif@npm:^1.0.10, omggif@npm:^1.0.9": + version: 1.0.10 + resolution: "omggif@npm:1.0.10" + checksum: 15102e46b6fa0fba32d7e948f702623cdc3cdcdfd64b2d33c6e29a61f366ffd0f250da55d66f5217dce5b93ba9c67763fa998652791a5c7f2201a3bde2c4db45 + languageName: node + linkType: hard + +"on-finished@npm:2.4.1, on-finished@npm:^2.3.0": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -8210,6 +11093,15 @@ __metadata: languageName: node linkType: hard +"one-time@npm:^1.0.0": + version: 1.0.0 + resolution: "one-time@npm:1.0.0" + dependencies: + fn.name: 1.x.x + checksum: fd008d7e992bdec1c67f53a2f9b46381ee12a9b8c309f88b21f0223546003fb47e8ad7c1fd5843751920a8d276c63bd4b45670ef80c61fb3e07dbccc962b5c7d + languageName: node + linkType: hard + "onetime@npm:^2.0.0": version: 2.0.1 resolution: "onetime@npm:2.0.1" @@ -8228,6 +11120,13 @@ __metadata: languageName: node linkType: hard +"only@npm:~0.0.2": + version: 0.0.2 + resolution: "only@npm:0.0.2" + checksum: d399710db867a1ef436dd3ce74499c87ece794aa81ab0370b5d153968766ee4aed2f98d3f92fc87c963e45b7a74d400d6f463ef651a5e7cfb861b15e88e9efe6 + languageName: node + linkType: hard + "open@npm:^8.0.2, open@npm:^8.0.9, open@npm:^8.4.0": version: 8.4.0 resolution: "open@npm:8.4.0" @@ -8239,6 +11138,22 @@ __metadata: languageName: node linkType: hard +"openapi3-ts@npm:^1.3.0": + version: 1.4.0 + resolution: "openapi3-ts@npm:1.4.0" + checksum: f45cb15fae165e97cacd482ae9c57b15ab5756e370542ad105593cc6f00c0bd9d1489fc63da6c98d3ace8e16af5ac1e12681568129c30793056436bd6a4aff2a + languageName: node + linkType: hard + +"openapi3-ts@npm:^2.0.0": + version: 2.0.2 + resolution: "openapi3-ts@npm:2.0.2" + dependencies: + yaml: ^1.10.2 + checksum: ec82bbbbd51cb8311f52f10e0441d72715b10446269040556251edcdc0230b86e3790f48b324881c4a1b22e87a317b5eb70e4d6cb717242bfd32674f21eecfc9 + languageName: node + linkType: hard + "opener@npm:^1.5.2": version: 1.5.2 resolution: "opener@npm:1.5.2" @@ -8309,6 +11224,13 @@ __metadata: languageName: node linkType: hard +"p-is-promise@npm:^3.0.0": + version: 3.0.0 + resolution: "p-is-promise@npm:3.0.0" + checksum: 74e511225fde5eeda7a120d51c60c284de90d68dec7c73611e7e59e8d1c44cc7e2246686544515849149b74ed0571ad470a456ac0d00314f8d03d2cc1ad43aae + languageName: node + linkType: hard + "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -8362,6 +11284,20 @@ __metadata: languageName: node linkType: hard +"packet-reader@npm:1.0.0": + version: 1.0.0 + resolution: "packet-reader@npm:1.0.0" + checksum: 0b7516f0cbf3e322aad591bed29ba544220088c53943145c0d9121a6f59182ad811f7fd6785a8979a34356aca69d97653689029964c5998dc02645633d88ffd7 + languageName: node + linkType: hard + +"pako@npm:^1.0.5": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 1be2bfa1f807608c7538afa15d6f25baa523c30ec870a3228a89579e474a4d992f4293859524e46d5d87fd30fa17c5edf34dbef0671251d9749820b488660b16 + languageName: node + linkType: hard + "param-case@npm:^3.0.4": version: 3.0.4 resolution: "param-case@npm:3.0.4" @@ -8381,6 +11317,37 @@ __metadata: languageName: node linkType: hard +"parse-bmfont-ascii@npm:^1.0.3": + version: 1.0.6 + resolution: "parse-bmfont-ascii@npm:1.0.6" + checksum: de3f6671f183c3e9d64bb4812b0407693b5fd0d24e9d16b2e106bb9eef809d64a6cc061f39ca29bb10c5c2e47e241e91b7aeefa587391fff7ccb27ab9db5012e + languageName: node + linkType: hard + +"parse-bmfont-binary@npm:^1.0.5": + version: 1.0.6 + resolution: "parse-bmfont-binary@npm:1.0.6" + checksum: ca37fb1e92f5941fddc5342b45857fafd27f00d2bd5fa44dd504bec6faeab97536c95ad45260c2dd5fc4c63de71e525663d3cdac09d038cbca803d97c669add5 + languageName: node + linkType: hard + +"parse-bmfont-xml@npm:^1.1.4": + version: 1.1.4 + resolution: "parse-bmfont-xml@npm:1.1.4" + dependencies: + xml-parse-from-string: ^1.0.0 + xml2js: ^0.4.5 + checksum: 879e5435be44f22b8c4934e2e1d2754a6d90a9ddb16309360daff965e1428d877b673f3d1fafaab4fef437c912a0db9f85545e0dd375ec62df7d4d328450d257 + languageName: node + linkType: hard + +"parse-headers@npm:^2.0.0": + version: 2.0.5 + resolution: "parse-headers@npm:2.0.5" + checksum: 3e97f01e4c7f960bfbfd0ee489f0bd8d3c72b6c814f1f79b66abec2cca8eaf8e4ecd89deba0b6e61266469aed87350bc932001181c01ff8c29a59e696abe251f + languageName: node + linkType: hard + "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -8449,7 +11416,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": +"parseurl@npm:^1.3.2, parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -8466,6 +11433,13 @@ __metadata: languageName: node linkType: hard +"passive-voice@npm:^0.1.0": + version: 0.1.0 + resolution: "passive-voice@npm:0.1.0" + checksum: 4f5d1810e609342f97ece91801388e9751f6185094e4c598a902b895fae303a82c8d14472e8a57ba9161c1cc2c275189ad59c83138c33bcfaf0c7562c63309a7 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -8508,6 +11482,22 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^1.1.1": + version: 1.8.0 + resolution: "path-to-regexp@npm:1.8.0" + dependencies: + isarray: 0.0.1 + checksum: 709f6f083c0552514ef4780cb2e7e4cf49b0cc89a97439f2b7cc69a608982b7690fb5d1720a7473a59806508fc2dae0be751ba49f495ecf89fd8fbc62abccbcd + languageName: node + linkType: hard + +"path-to-regexp@npm:^2.2.1": + version: 2.4.0 + resolution: "path-to-regexp@npm:2.4.0" + checksum: 581175bf2968e51452f2b8c71f10e75c995693668b4ecf7d0b48962fbe0c56830661ca5dd5fd6d8e2f0cc9a045ce07e89af504ab133e1d21887c2712df85b1f4 + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -8515,6 +11505,85 @@ __metadata: languageName: node linkType: hard +"pg-connection-string@npm:^2.5.0": + version: 2.5.0 + resolution: "pg-connection-string@npm:2.5.0" + checksum: a6f3a068f7c9416a5b33a326811caf0dfaaee045c225b7c628b4c9b4e9a2b25bdd12a21e4c48940e1000ea223a4e608ca122d2ff3dd08c8b1db0fc9f5705133a + languageName: node + linkType: hard + +"pg-int8@npm:1.0.1": + version: 1.0.1 + resolution: "pg-int8@npm:1.0.1" + checksum: a1e3a05a69005ddb73e5f324b6b4e689868a447c5fa280b44cd4d04e6916a344ac289e0b8d2695d66e8e89a7fba023affb9e0e94778770ada5df43f003d664c9 + languageName: node + linkType: hard + +"pg-pool@npm:^3.5.2": + version: 3.5.2 + resolution: "pg-pool@npm:3.5.2" + peerDependencies: + pg: ">=8.0" + checksum: a5d029200257671f0c17ca54b9ab6213e2060e64e5cc792b78edd50ab471a26cd364890d05d546d9296949e079e943821cf2ceb4d488f4e6a6789fb781a628bf + languageName: node + linkType: hard + +"pg-protocol@npm:^1.5.0": + version: 1.5.0 + resolution: "pg-protocol@npm:1.5.0" + checksum: b839d12cafe942ef9cbc5b13c174eb2356804fb4fe8ead8279f46a36be90722d19a91409955beb8a3d5301639c44854e49749de4aef02dc361fee3e2a61fb1e4 + languageName: node + linkType: hard + +"pg-types@npm:^2.1.0": + version: 2.2.0 + resolution: "pg-types@npm:2.2.0" + 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 + checksum: bf4ec3f594743442857fb3a8dfe5d2478a04c98f96a0a47365014557cbc0b4b0cee01462c79adca863b93befbf88f876299b75b72c665b5fb84a2c94fbd10316 + languageName: node + linkType: hard + +"pg@npm:^8.6.0": + version: 8.8.0 + resolution: "pg@npm:8.8.0" + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: ^2.5.0 + pg-pool: ^3.5.2 + pg-protocol: ^1.5.0 + pg-types: ^2.1.0 + pgpass: 1.x + peerDependencies: + pg-native: ">=3.0.1" + peerDependenciesMeta: + pg-native: + optional: true + checksum: fa30a85814dd7238b582c3bc6c0b9e2b0ae38dd0a6bb485ef480e64bb5ce589de6cb873ce4d3cd10c37a3e0a1e1281ba75dc7d80b1a68bae91999cd5b70d398b + languageName: node + linkType: hard + +"pgpass@npm:1.x": + version: 1.0.5 + resolution: "pgpass@npm:1.0.5" + dependencies: + split2: ^4.1.0 + checksum: 947ac096c031eebdf08d989de2e9f6f156b8133d6858c7c2c06c041e1e71dda6f5f3bad3c0ec1e96a09497bbc6ef89e762eefe703b5ef9cb2804392ec52ec400 + languageName: node + linkType: hard + +"phin@npm:^2.9.1": + version: 2.9.3 + resolution: "phin@npm:2.9.3" + checksum: 7e2abd7be74a54eb7be92dccb1d7a019725c8adaa79ac22a38f25220f9a859393e654ea753a559d326aed7bbc966fadac88270cc8c39d78896f7784219560c47 + languageName: node + linkType: hard + "picocolors@npm:^0.2.1": version: 0.2.1 resolution: "picocolors@npm:0.2.1" @@ -8557,6 +11626,17 @@ __metadata: languageName: node linkType: hard +"pixelmatch@npm:^4.0.2": + version: 4.0.2 + resolution: "pixelmatch@npm:4.0.2" + dependencies: + pngjs: ^3.0.0 + bin: + pixelmatch: bin/pixelmatch + checksum: 9c5c1329001938cae6d01e2bb84a909ba767f8256bcafc075422cea2a4dbaa8bebd44fceaa4b4ce7cdc36d11f20d4f1ba0cf669851d5649b32d8d1d27e4f5a36 + languageName: node + linkType: hard + "pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -8566,6 +11646,74 @@ __metadata: languageName: node linkType: hard +"pkg-fetch@npm:3.4.2": + version: 3.4.2 + resolution: "pkg-fetch@npm:3.4.2" + dependencies: + chalk: ^4.1.2 + fs-extra: ^9.1.0 + https-proxy-agent: ^5.0.0 + node-fetch: ^2.6.6 + progress: ^2.0.3 + semver: ^7.3.5 + tar-fs: ^2.1.1 + yargs: ^16.2.0 + bin: + pkg-fetch: lib-es5/bin.js + checksum: e0f73cedf6cb8882e4d998700031443e6542d213f9817d66deb03fb89c122ca7f7505f11401f85a760a2d3951f9b793d0f78782be220c46c56ccf70f9915812a + languageName: node + linkType: hard + +"pkg@npm:^5.6.0": + version: 5.8.0 + resolution: "pkg@npm:5.8.0" + dependencies: + "@babel/generator": 7.18.2 + "@babel/parser": 7.18.4 + "@babel/types": 7.18.4 + chalk: ^4.1.2 + fs-extra: ^9.1.0 + globby: ^11.1.0 + into-stream: ^6.0.0 + is-core-module: 2.9.0 + minimist: ^1.2.6 + multistream: ^4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 6.1.4 + resolve: ^1.22.0 + stream-meter: ^1.0.4 + peerDependencies: + node-notifier: ">=9.0.1" + peerDependenciesMeta: + node-notifier: + optional: true + bin: + pkg: lib-es5/bin.js + checksum: eb85975275ab4c5760884c1cc9b6251a17a8c15eb1b5a13183d0a5a0385650459e44d8438af7ecf5c5d185b55046cce9ce705b5b6d59ae058a157f49f6fb56a0 + languageName: node + linkType: hard + +"pluralize@npm:^8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e + languageName: node + linkType: hard + +"pngjs@npm:^3.0.0, pngjs@npm:^3.3.3": + version: 3.4.0 + resolution: "pngjs@npm:3.4.0" + checksum: 8bd40bd698abd16b72c97b85cb858c80894fbedc76277ce72a784aa441e14795d45d9856e97333ca469b34b67528860ffc8a7317ca6beea349b645366df00bcd + languageName: node + linkType: hard + +"pngjs@npm:^5.0.0": + version: 5.0.0 + resolution: "pngjs@npm:5.0.0" + checksum: 04e912cc45fb9601564e2284efaf0c5d20d131d9b596244f8a6789fc6cdb6b18d2975a6bbf7a001858d7e159d5c5c5dd7b11592e97629b7137f7f5cef05904c8 + languageName: node + linkType: hard + "portfinder@npm:^1.0.26": version: 1.0.32 resolution: "portfinder@npm:1.0.32" @@ -8991,6 +12139,59 @@ __metadata: languageName: node linkType: hard +"postgres-array@npm:~2.0.0": + version: 2.0.0 + resolution: "postgres-array@npm:2.0.0" + checksum: 0e1e659888147c5de579d229a2d95c0d83ebdbffc2b9396d890a123557708c3b758a0a97ed305ce7f58edfa961fa9f0bbcd1ea9f08b6e5df73322e683883c464 + languageName: node + linkType: hard + +"postgres-bytea@npm:~1.0.0": + version: 1.0.0 + resolution: "postgres-bytea@npm:1.0.0" + checksum: d844ae4ca7a941b70e45cac1261a73ee8ed39d72d3d74ab1d645248185a1b7f0ac91a3c63d6159441020f4e1f7fe64689ac56536a307b31cef361e5187335090 + languageName: node + linkType: hard + +"postgres-date@npm:~1.0.4": + version: 1.0.7 + resolution: "postgres-date@npm:1.0.7" + checksum: 5745001d47e51cd767e46bcb1710649cd705d91a24d42fa661c454b6dcbb7353c066a5047983c90a626cd3bbfea9e626cc6fa84a35ec57e5bbb28b49f78e13ed + languageName: node + linkType: hard + +"postgres-interval@npm:^1.1.0": + version: 1.2.0 + resolution: "postgres-interval@npm:1.2.0" + dependencies: + xtend: ^4.0.0 + checksum: 746b71f93805ae33b03528e429dc624706d1f9b20ee81bf743263efb6a0cd79ae02a642a8a480dbc0f09547b4315ab7df6ce5ec0be77ed700bac42730f5c76b2 + languageName: node + linkType: hard + +"prebuild-install@npm:6.1.4": + version: 6.1.4 + resolution: "prebuild-install@npm:6.1.4" + dependencies: + detect-libc: ^1.0.3 + 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: ^2.21.0 + npmlog: ^4.0.1 + pump: ^3.0.0 + rc: ^1.2.7 + simple-get: ^3.0.3 + tar-fs: ^2.0.0 + tunnel-agent: ^0.6.0 + bin: + prebuild-install: bin.js + checksum: de4313eda821305912af922700a2db04bb8e77fe8aa9c2788550f1000c026cbefc82da468ec0c0a37764c5417bd8169dbd540928535fb38d00bb9bbd673dd217 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -9074,6 +12275,13 @@ __metadata: languageName: node linkType: hard +"process@npm:^0.11.10": + version: 0.11.10 + resolution: "process@npm:0.11.10" + checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 + languageName: node + linkType: hard + "progress-webpack-plugin@npm:^1.0.12": version: 1.0.16 resolution: "progress-webpack-plugin@npm:1.0.16" @@ -9087,6 +12295,13 @@ __metadata: languageName: node linkType: hard +"progress@npm:^2.0.3": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 + languageName: node + linkType: hard + "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -9159,6 +12374,13 @@ __metadata: languageName: node linkType: hard +"pstree.remy@npm:^1.1.8": + version: 1.1.8 + resolution: "pstree.remy@npm:1.1.8" + checksum: 5cb53698d6bb34dfb278c8a26957964aecfff3e161af5fbf7cee00bbe9d8547c7aced4bd9cb193bce15fb56e9e4220fc02a5bf9c14345ffb13a36b858701ec2d + languageName: node + linkType: hard + "pump@npm:^3.0.0": version: 3.0.0 resolution: "pump@npm:3.0.0" @@ -9169,6 +12391,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:1.3.2": + version: 1.3.2 + resolution: "punycode@npm:1.3.2" + checksum: b8807fd594b1db33335692d1f03e8beeddde6fda7fbb4a2e32925d88d20a3aa4cd8dcc0c109ccaccbd2ba761c208dfaaada83007087ea8bfb0129c9ef1b99ed6 + languageName: node + linkType: hard + "punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.1.1 resolution: "punycode@npm:2.1.1" @@ -9176,7 +12405,21 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0": +"qrcode@npm:^1.4.4": + version: 1.5.1 + resolution: "qrcode@npm:1.5.1" + dependencies: + dijkstrajs: ^1.0.1 + encode-utf8: ^1.0.3 + pngjs: ^5.0.0 + yargs: ^15.3.1 + bin: + qrcode: bin/qrcode + checksum: 842f899d95caaad2ac507408b5498be3197e1df16bc6b537b20069d2cb1330e4588b50f672ce4a9ccf01338f7c97b5732ff9b5caaa6eb2338187d3c25a973e79 + languageName: node + linkType: hard + +"qs@npm:6.11.0, qs@npm:^6.5.2": version: 6.11.0 resolution: "qs@npm:6.11.0" dependencies: @@ -9185,6 +12428,20 @@ __metadata: languageName: node linkType: hard +"querystring@npm:0.2.0": + version: 0.2.0 + resolution: "querystring@npm:0.2.0" + checksum: 8258d6734f19be27e93f601758858c299bdebe71147909e367101ba459b95446fbe5b975bf9beb76390156a592b6f4ac3a68b6087cea165c259705b8b4e56a69 + languageName: node + linkType: hard + +"querystring@npm:^0.2.0": + version: 0.2.1 + resolution: "querystring@npm:0.2.1" + checksum: 7b83b45d641e75fd39cd6625ddfd44e7618e741c61e95281b57bbae8fde0afcc12cf851924559e5cc1ef9baa3b1e06e22b164ea1397d65dd94b801f678d9c8ce + languageName: node + linkType: hard + "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -9199,6 +12456,13 @@ __metadata: languageName: node linkType: hard +"random-bytes@npm:~1.0.0": + version: 1.0.0 + resolution: "random-bytes@npm:1.0.0" + checksum: 09faa256394aa2ca9754aa57e92a27c452c3e97ffb266e98bebb517332e9df7168fea393159f88d884febce949ba8bec8ddb02f03342da6c6023ecc7b155e0ae + languageName: node + linkType: hard + "randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -9215,7 +12479,7 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.1": +"raw-body@npm:2.5.1, raw-body@npm:^2.3.3": version: 2.5.1 resolution: "raw-body@npm:2.5.1" dependencies: @@ -9227,6 +12491,20 @@ __metadata: languageName: node linkType: hard +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: ^0.6.0 + ini: ~1.3.0 + minimist: ^1.2.0 + strip-json-comments: ~2.0.1 + bin: + rc: ./cli.js + checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e + languageName: node + linkType: hard + "react-is@npm:^17.0.1": version: 17.0.2 resolution: "react-is@npm:17.0.2" @@ -9273,7 +12551,19 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.1": +"readable-stream@npm:1.1.x": + version: 1.1.14 + resolution: "readable-stream@npm:1.1.14" + dependencies: + core-util-is: ~1.0.0 + inherits: ~2.0.1 + isarray: 0.0.1 + string_decoder: ~0.10.x + checksum: 17dfeae3e909945a4a1abc5613ea92d03269ef54c49288599507fc98ff4615988a1c39a999dcf9aacba70233d9b7040bc11a5f2bfc947e262dedcc0a8b32b5a0 + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.6, readable-stream@npm:^2.1.4, readable-stream@npm:^2.2.2": version: 2.3.7 resolution: "readable-stream@npm:2.3.7" dependencies: @@ -9308,6 +12598,49 @@ __metadata: languageName: node linkType: hard +"rechoir@npm:^0.7.0": + version: 0.7.1 + resolution: "rechoir@npm:0.7.1" + dependencies: + resolve: ^1.9.0 + checksum: 2a04aab4e28c05fcd6ee6768446bc8b859d8f108e71fc7f5bcbc5ef25e53330ce2c11d10f82a24591a2df4c49c4f61feabe1fd11f844c66feedd4cd7bb61146a + languageName: node + linkType: hard + +"reflect-metadata@npm:^0.1.13": + version: 0.1.13 + resolution: "reflect-metadata@npm:0.1.13" + checksum: 798d379a7b6f6455501145419505c97dd11cbc23857a386add2b9ef15963ccf15a48d9d15507afe01d4cd74116df8a213247200bac00320bd7c11ddeaa5e8fb4 + languageName: node + linkType: hard + +"regenerator-runtime@npm:^0.13.11, regenerator-runtime@npm:^0.13.3": + version: 0.13.11 + resolution: "regenerator-runtime@npm:0.13.11" + checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 + languageName: node + linkType: hard + +"regexp-tree@npm:^0.1.23, regexp-tree@npm:~0.1.1": + version: 0.1.24 + resolution: "regexp-tree@npm:0.1.24" + bin: + regexp-tree: bin/regexp-tree + checksum: 5807013289d9205288d665e0f8d8cff94843dfd55fdedd1833eb9d9bbd07188a37dfa02942ec5cdc671180037f715148fac1ba6f18fd6be4268e5a8feb49d340 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.4.3": + version: 1.4.3 + resolution: "regexp.prototype.flags@npm:1.4.3" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.3 + functions-have-names: ^1.2.2 + checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 + languageName: node + linkType: hard + "regexpp@npm:^3.2.0": version: 3.2.0 resolution: "regexpp@npm:3.2.0" @@ -9315,6 +12648,13 @@ __metadata: languageName: node linkType: hard +"regextras@npm:^0.8.0": + version: 0.8.0 + resolution: "regextras@npm:0.8.0" + checksum: b7ec5b32a2b98b4b27048d44f8ab90009873c1307f2cf89321aa8c4cbb8147f1bee07863f4dadf585546ca0b91a234ad9804954dea5fc029421f6c25a4523798 + languageName: node + linkType: hard + "register-service-worker@npm:^1.7.2": version: 1.7.2 resolution: "register-service-worker@npm:1.7.2" @@ -9356,6 +12696,27 @@ __metadata: languageName: node linkType: hard +"require-main-filename@npm:^2.0.0": + version: 2.0.0 + resolution: "require-main-filename@npm:2.0.0" + checksum: e9e294695fea08b076457e9ddff854e81bffbe248ed34c1eec348b7abbd22a0d02e8d75506559e2265e96978f3c4720bd77a6dad84755de8162b357eb6c778c7 + languageName: node + linkType: hard + +"requireindex@npm:~1.1.0": + version: 1.1.0 + resolution: "requireindex@npm:1.1.0" + checksum: 397057d97d7f753a3851abf0d6db94c295bd8254536f71f622b896ba08ea8c0d3e3771c8b009a557e6ce602f4245c0588836cdf59c4ce588fff721a7b855d323 + languageName: node + linkType: hard + +"requireindex@npm:~1.2.0": + version: 1.2.0 + resolution: "requireindex@npm:1.2.0" + checksum: 50d8b10a1ff1fdf6aea7a1870bc7bd238b0fb1917d8d7ca17fd03afc38a65dcd7a8a4eddd031f89128b5f0065833d5c92c4fef67f2c04e8624057fe626c9cf94 + languageName: node + linkType: hard + "requires-port@npm:^1.0.0": version: 1.0.0 resolution: "requires-port@npm:1.0.0" @@ -9363,6 +12724,13 @@ __metadata: languageName: node linkType: hard +"reserved-words@npm:^0.1.2": + version: 0.1.2 + resolution: "reserved-words@npm:0.1.2" + checksum: 72e80f71dcde1e2d697e102473ad6d597e1659118836092c63cc4db68a64857f07f509176d239c8675b24f7f03574336bf202a780cc1adb39574e2884d1fd1fa + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -9393,7 +12761,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.20.0": +"resolve@npm:^1.0.0, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0, resolve@npm:^1.9.0": version: 1.22.1 resolution: "resolve@npm:1.22.1" dependencies: @@ -9406,7 +12774,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin": +"resolve@patch:resolve@^1.0.0#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin, resolve@patch:resolve@^1.9.0#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" dependencies: @@ -9439,6 +12807,13 @@ __metadata: languageName: node linkType: hard +"retry@npm:0.13.1, retry@npm:^0.13.1": + version: 0.13.1 + resolution: "retry@npm:0.13.1" + checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -9446,13 +12821,6 @@ __metadata: languageName: node linkType: hard -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 47c4d5be674f7c13eee4cfe927345023972197dbbdfba5d3af7e461d13b44de1bfd663bfc80d2f601f8ef3fc8164c16dd99655a221921954a65d044a2fc1233b - languageName: node - linkType: hard - "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -9460,6 +12828,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^2.6.1": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: ^7.1.3 + bin: + rimraf: ./bin.js + checksum: cdc7f6eacb17927f2a075117a823e1c5951792c6498ebcce81ca8203454a811d4cf8900314154d3259bb8f0b42ab17f67396a8694a54cae3283326e57ad250cd + languageName: node + linkType: hard + "rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -9471,6 +12850,59 @@ __metadata: languageName: node linkType: hard +"routing-controllers-openapi@npm:^2.1.0": + version: 2.2.0 + resolution: "routing-controllers-openapi@npm:2.2.0" + dependencies: + lodash: ^4.17.15 + openapi3-ts: ^1.3.0 + path-to-regexp: ^2.2.1 + reflect-metadata: ^0.1.13 + tslib: ^1.11.1 + peerDependencies: + routing-controllers: ^0.8.0 + checksum: c8c1df741f8ed176ed70ff87d28cc01f120a97f3ff444a5598b767d0ac979d11787056b1f8a0b8a0f7aa907bd4d7de635f7e9e6d81fc99198a2f17520dd03980 + languageName: node + linkType: hard + +"routing-controllers@npm:^0.9.0-alpha.6": + version: 0.9.0 + resolution: "routing-controllers@npm:0.9.0" + dependencies: + body-parser: ^1.19.0 + cookie: ^0.4.0 + express: ^4.17.1 + express-session: ^1.17.1 + glob: ^7.1.4 + koa: ^2.8.2 + koa-bodyparser: ^4.2.1 + koa-multer: ^1.0.2 + koa-router: ^7.4.0 + multer: ^1.4.2 + reflect-metadata: ^0.1.13 + template-url: ^1.0.0 + peerDependencies: + class-transformer: ^0.3.1 + class-validator: ^0.12.2 + dependenciesMeta: + body-parser: + optional: true + express: + optional: true + koa: + optional: true + koa-bodyparser: + optional: true + koa-multer: + optional: true + koa-router: + optional: true + multer: + optional: true + checksum: 81d6d505a62500dadee4bc248692a9f039f4f036a2d017bb5e061852fd91e80a0e356525455cb653a0b4d9e6b99595f700325946f7963bb8ade55b29721428b5 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -9496,13 +12928,40 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 languageName: node linkType: hard +"safe-regex-test@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-regex-test@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.3 + is-regex: ^1.1.4 + checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + languageName: node + linkType: hard + +"safe-regex@npm:^2.1.1": + version: 2.1.1 + resolution: "safe-regex@npm:2.1.1" + dependencies: + regexp-tree: ~0.1.1 + checksum: 5d734e2193c63ef0cb00f60c0244e0f8a30ecb31923633cd34636808d6a7c4c206d650017953ae1db8bc33967c2f06af33488dea6f038f4e38212beb7bed77b4 + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.4.2 + resolution: "safe-stable-stringify@npm:2.4.2" + checksum: 0324ba2e40f78cae63e31a02b1c9bdf1b786621f9e8760845608eb9e81aef401944ac2078e5c9c1533cf516aea34d08fa8052ca853637ced84b791caaf1e394e + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.1.2": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -9584,7 +13043,7 @@ __metadata: languageName: node linkType: hard -"sax@npm:^1.2.4, sax@npm:~1.2.4": +"sax@npm:>=0.6.0, sax@npm:^1.2.4, sax@npm:~1.2.4": version: 1.2.4 resolution: "sax@npm:1.2.4" checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe @@ -9661,7 +13120,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0, semver@npm:^5.6.0": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.6.0, semver@npm:^5.7.1": version: 5.7.1 resolution: "semver@npm:5.7.1" bin: @@ -9701,6 +13160,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:~7.0.0": + version: 7.0.0 + resolution: "semver@npm:7.0.0" + bin: + semver: bin/semver.js + checksum: 272c11bf8d083274ef79fe40a81c55c184dff84dd58e3c325299d0927ba48cece1f020793d138382b85f89bab5002a35a5ba59a3a68a7eebbb597eb733838778 + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -9767,7 +13235,7 @@ __metadata: languageName: node linkType: hard -"set-blocking@npm:^2.0.0": +"set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 @@ -9788,6 +13256,25 @@ __metadata: languageName: node linkType: hard +"sha.js@npm:^2.4.11": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: ^2.0.1 + safe-buffer: ^5.0.1 + bin: + sha.js: ./bin.js + checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07 + languageName: node + linkType: hard + +"sha512@npm:^0.0.1": + version: 0.0.1 + resolution: "sha512@npm:0.0.1" + checksum: 7a6e6fadc2fe669b5b4d29016cf9b743c41a5542903c988be1f2e720ef50e60544feaac634eac33fcc6be5f750ea877a50b7cd3019afcedb97aa2163b4d289cf + languageName: node + linkType: hard + "shallow-clone@npm:^3.0.0": version: 3.0.1 resolution: "shallow-clone@npm:3.0.1" @@ -9861,6 +13348,42 @@ __metadata: languageName: node linkType: hard +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a + languageName: node + linkType: hard + +"simple-get@npm:^3.0.3": + version: 3.1.1 + resolution: "simple-get@npm:3.1.1" + dependencies: + decompress-response: ^4.2.0 + once: ^1.3.1 + simple-concat: ^1.0.0 + checksum: 80195e70bf171486e75c31e28e5485468195cc42f85940f8b45c4a68472160144d223eb4d07bc82ef80cb974b7c401db021a540deb2d34ac4b3b8883da2d6401 + languageName: node + linkType: hard + +"simple-swizzle@npm:^0.2.2": + version: 0.2.2 + resolution: "simple-swizzle@npm:0.2.2" + dependencies: + is-arrayish: ^0.3.1 + checksum: a7f3f2ab5c76c4472d5c578df892e857323e452d9f392e1b5cf74b74db66e6294a1e1b8b390b519fa1b96b5b613f2a37db6cffef52c3f1f8f3c5ea64eb2d54c0 + languageName: node + linkType: hard + +"simple-update-notifier@npm:^1.0.7": + version: 1.1.0 + resolution: "simple-update-notifier@npm:1.1.0" + dependencies: + semver: ~7.0.0 + checksum: 1012e9b6c504e559a948078177b3eedbb9d7e4d15878e2bda56314d08db609ca5da485be4ac9f838759faae8057935ee0246fcdf63f1233c86bd9fecb2a5544b + languageName: node + linkType: hard + "sirv@npm:^1.0.7": version: 1.0.19 resolution: "sirv@npm:1.0.19" @@ -9982,7 +13505,7 @@ __metadata: languageName: node linkType: hard -"source-map-support@npm:~0.5.20": +"source-map-support@npm:^0.5.12, source-map-support@npm:^0.5.17, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: @@ -10030,7 +13553,7 @@ __metadata: languageName: node linkType: hard -"spdx-expression-parse@npm:^3.0.0": +"spdx-expression-parse@npm:^3.0.0, spdx-expression-parse@npm:^3.0.1": version: 3.0.1 resolution: "spdx-expression-parse@npm:3.0.1" dependencies: @@ -10074,6 +13597,13 @@ __metadata: languageName: node linkType: hard +"split2@npm:^4.1.0": + version: 4.1.0 + resolution: "split2@npm:4.1.0" + checksum: ec581597cb74c13cdfb5e2047543dd40cb1e8e9803c7b1e0c29ede05f2b4f049b2d6e7f2788a225d544549375719658b8f38e9366364dec35dc7a12edfda5ee5 + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -10106,6 +13636,13 @@ __metadata: languageName: node linkType: hard +"stack-trace@npm:0.0.x": + version: 0.0.10 + resolution: "stack-trace@npm:0.0.10" + checksum: 473036ad32f8c00e889613153d6454f9be0536d430eb2358ca51cad6b95cea08a3cc33cc0e34de66b0dad221582b08ed2e61ef8e13f4087ab690f388362d6610 + languageName: node + linkType: hard + "stack-utils@npm:^2.0.3": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -10129,13 +13666,29 @@ __metadata: languageName: node linkType: hard -"statuses@npm:>= 1.4.0 < 2": +"statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2, statuses@npm:^1.5.0": version: 1.5.0 resolution: "statuses@npm:1.5.0" checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c languageName: node linkType: hard +"stream-meter@npm:^1.0.4": + version: 1.0.4 + resolution: "stream-meter@npm:1.0.4" + dependencies: + readable-stream: ^2.1.4 + checksum: a732f7ede9dadd6214083aaf4e3014d664498a56b91cdbc4e6abae59ec8ae507883f58f1f3ca7a939cdb9cc8e2320997241191e9fb8c7717f3fad9ca8cb5dc46 + languageName: node + linkType: hard + +"streamsearch@npm:0.1.2": + version: 0.1.2 + resolution: "streamsearch@npm:0.1.2" + checksum: d2db57cbfbf7947ab9c75a7b4c80a8ef8d24850cf0a1a24258bb6956c97317ce1eab7dbcbf9c5aba3e6198611af1053b02411057bbedb99bf9c64b8275248997 + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -10146,6 +13699,24 @@ __metadata: languageName: node linkType: hard +"string-similarity@npm:^4.0.3": + version: 4.0.4 + resolution: "string-similarity@npm:4.0.4" + checksum: 797b41b24e1eb6b3b0ab896950b58c295a19a82933479c75f7b5279ffb63e0b456a8c8d10329c02f607ca1a50370e961e83d552aa468ff3b0fa15809abc9eff7 + languageName: node + linkType: hard + +"string-width@npm:^1.0.1": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: ^1.0.0 + is-fullwidth-code-point: ^1.0.0 + strip-ansi: ^3.0.0 + checksum: 5c79439e95bc3bd7233a332c5f5926ab2ee90b23816ed4faa380ce3b2576d7800b0a5bb15ae88ed28737acc7ea06a518c2eef39142dd727adad0e45c776cd37e + languageName: node + linkType: hard + "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -10167,6 +13738,28 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimend@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimend@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.6": + version: 1.0.6 + resolution: "string.prototype.trimstart@npm:1.0.6" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.1.4 + es-abstract: ^1.20.4 + checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -10176,6 +13769,13 @@ __metadata: languageName: node linkType: hard +"string_decoder@npm:~0.10.x": + version: 0.10.31 + resolution: "string_decoder@npm:0.10.31" + checksum: fe00f8e303647e5db919948ccb5ce0da7dea209ab54702894dd0c664edd98e5d4df4b80d6fabf7b9e92b237359d21136c95bf068b2f7760b772ca974ba970202 + languageName: node + linkType: hard + "string_decoder@npm:~1.1.1": version: 1.1.1 resolution: "string_decoder@npm:1.1.1" @@ -10185,6 +13785,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": + version: 3.0.1 + resolution: "strip-ansi@npm:3.0.1" + dependencies: + ansi-regex: ^2.0.0 + checksum: 9b974de611ce5075c70629c00fa98c46144043db92ae17748fb780f706f7a789e9989fd10597b7c2053ae8d1513fd707816a91f1879b2f71e6ac0b6a863db465 + languageName: node + linkType: hard + "strip-ansi@npm:^4.0.0": version: 4.0.0 resolution: "strip-ansi@npm:4.0.0" @@ -10231,7 +13840,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^2.0.0": +"strip-json-comments@npm:^2.0.0, strip-json-comments@npm:~2.0.1": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 @@ -10341,7 +13950,22 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": +"subscriptions-transport-ws@npm:^0.9.19": + version: 0.9.19 + resolution: "subscriptions-transport-ws@npm:0.9.19" + dependencies: + backo2: ^1.0.2 + eventemitter3: ^3.1.0 + iterall: ^1.2.1 + symbol-observable: ^1.0.4 + ws: ^5.2.0 || ^6.0.0 || ^7.0.0 + peerDependencies: + graphql: ">=0.10.0" + checksum: 6979b36e03c0a48e33836cb412941e41bae8743767dff2aa453159cfffa983b879cc80cd4e744e82afbf11062c66899c37f5dca0281253ee240098ada0078533 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" dependencies: @@ -10402,6 +14026,24 @@ __metadata: languageName: node linkType: hard +"swagger-ui-dist@npm:>=4.11.0": + version: 4.15.5 + resolution: "swagger-ui-dist@npm:4.15.5" + checksum: b032ecc1245e10729d0fb0fc681fc61115a78925b9410fe0fa5fe025a0a3e7d1505dacc3b5d7d2355835d118162843ad9a754a810010a4bbf65ef71466e40512 + languageName: node + linkType: hard + +"swagger-ui-express@npm:^4.1.2": + version: 4.6.0 + resolution: "swagger-ui-express@npm:4.6.0" + dependencies: + swagger-ui-dist: ">=4.11.0" + peerDependencies: + express: ">=4.0.0" + checksum: 8e5e2bf431f4b2207fc4c07eeaee78ec983fae4ab14b6df8fd6d87bd7edf0a9c644bf32bb251b8478a9bad7b1617d6bec56c6b87208f5eddb18840832abf55a3 + languageName: node + linkType: hard + "symbol-observable@npm:^1.0.2, symbol-observable@npm:^1.0.4": version: 1.2.0 resolution: "symbol-observable@npm:1.2.0" @@ -10430,7 +14072,19 @@ __metadata: languageName: node linkType: hard -"tar-stream@npm:~2.2.0": +"tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: ^1.1.1 + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^2.1.4 + checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4, tar-stream@npm:~2.2.0": version: 2.2.0 resolution: "tar-stream@npm:2.2.0" dependencies: @@ -10471,6 +14125,13 @@ __metadata: languageName: node linkType: hard +"template-url@npm:^1.0.0": + version: 1.0.0 + resolution: "template-url@npm:1.0.0" + checksum: cf68e4b2b53aca008d2b1fe73a5c65d1099c9f68966580fb6844aae61599e45d56f4d36f16cc9a8495f538266845c946853b33e28bce07bf8c72db640f92c170 + languageName: node + linkType: hard + "terminal-link@npm:^2.0.0": version: 2.1.1 resolution: "terminal-link@npm:2.1.1" @@ -10528,6 +14189,13 @@ __metadata: languageName: node linkType: hard +"text-hex@npm:1.0.x": + version: 1.0.0 + resolution: "text-hex@npm:1.0.0" + checksum: 1138f68adc97bf4381a302a24e2352f04992b7b1316c5003767e9b0d3367ffd0dc73d65001ea02b07cd0ecc2a9d186de0cf02f3c2d880b8a522d4ccb9342244a + languageName: node + linkType: hard + "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" @@ -10589,6 +14257,20 @@ __metadata: languageName: node linkType: hard +"timm@npm:^1.6.1": + version: 1.7.1 + resolution: "timm@npm:1.7.1" + checksum: c80df538ec7fae50a0e3183931b20fbe97f6f2c06907d9675eb7b9d90b3f788af7742285c730192db3b066c4ab22ebae75f8d21970c5b03f38d928d5bb2a0339 + languageName: node + linkType: hard + +"tinycolor2@npm:^1.4.1": + version: 1.5.2 + resolution: "tinycolor2@npm:1.5.2" + checksum: 9df1ea9a986b03f1aebb1c1ac17fc561e358493f61b56d73ef2d7207fe7bd74eb71cf745b70487b2b5bb1ce33c9e8af7101088bb0b5fc532eaa1f9d1eda4ef31 + languageName: node + linkType: hard + "tmp@npm:~0.2.1": version: 0.2.1 resolution: "tmp@npm:0.2.1" @@ -10628,6 +14310,13 @@ __metadata: languageName: node linkType: hard +"too-wordy@npm:^0.3.1": + version: 0.3.4 + resolution: "too-wordy@npm:0.3.4" + checksum: c7e4b5cdaf445a4d7ea8d07e4f293e10507b6e70252b6a0a17d0e28b676b0d5c193913f6313ab293e661e72655a27821aa64a3b479d044a0a9bb3e69e0d0e85b + languageName: node + linkType: hard + "totalist@npm:^1.0.0": version: 1.1.0 resolution: "totalist@npm:1.1.0" @@ -10635,6 +14324,17 @@ __metadata: languageName: node linkType: hard +"touch@npm:^3.1.0": + version: 3.1.0 + resolution: "touch@npm:3.1.0" + dependencies: + nopt: ~1.0.10 + bin: + nodetouch: ./bin/nodetouch.js + checksum: e0be589cb5b0e6dbfce6e7e077d4a0d5f0aba558ef769c6d9c33f635e00d73d5be49da6f8631db302ee073919d82b5b7f56da2987feb28765c95a7673af68647 + languageName: node + linkType: hard + "tough-cookie@npm:^4.0.0": version: 4.1.2 resolution: "tough-cookie@npm:4.1.2" @@ -10663,7 +14363,7 @@ __metadata: languageName: node linkType: hard -"tree-kill@npm:1.2.2": +"tree-kill@npm:1.2.2, tree-kill@npm:^1.2.2": version: 1.2.2 resolution: "tree-kill@npm:1.2.2" bin: @@ -10672,6 +14372,13 @@ __metadata: languageName: node linkType: hard +"triple-beam@npm:^1.3.0": + version: 1.3.0 + resolution: "triple-beam@npm:1.3.0" + checksum: 7d7b77d8625fb252c126c24984a68de462b538a8fcd1de2abd0a26421629cf3527d48e23b3c2264f08f4a6c3bc40a478a722176f4d7b6a1acc154cb70c359f2b + languageName: node + linkType: hard + "ts-invariant@npm:^0.4.0": version: 0.4.4 resolution: "ts-invariant@npm:0.4.4" @@ -10711,7 +14418,7 @@ __metadata: languageName: node linkType: hard -"ts-loader@npm:^9.2.5, ts-loader@npm:^9.3.1": +"ts-loader@npm:^9.2.2, ts-loader@npm:^9.2.5, ts-loader@npm:^9.3.1": version: 9.4.2 resolution: "ts-loader@npm:9.4.2" dependencies: @@ -10721,8 +14428,35 @@ __metadata: semver: ^7.3.4 peerDependencies: typescript: "*" - webpack: ^5.0.0 - checksum: 6f306ee4c615c2a159fb177561e3fb86ca2cbd6c641e710d408a64b4978e1ff3f2c9733df07bff27d3f82efbfa7c287523d4306049510c7485ac2669a9c37eb0 + webpack: ^5.0.0 + checksum: 6f306ee4c615c2a159fb177561e3fb86ca2cbd6c641e710d408a64b4978e1ff3f2c9733df07bff27d3f82efbfa7c287523d4306049510c7485ac2669a9c37eb0 + languageName: node + linkType: hard + +"ts-node-dev@npm:^1.0.0-pre.44": + version: 1.1.8 + resolution: "ts-node-dev@npm:1.1.8" + dependencies: + chokidar: ^3.5.1 + dynamic-dedupe: ^0.3.0 + minimist: ^1.2.5 + mkdirp: ^1.0.4 + resolve: ^1.0.0 + rimraf: ^2.6.1 + source-map-support: ^0.5.12 + tree-kill: ^1.2.2 + ts-node: ^9.0.0 + tsconfig: ^7.0.0 + peerDependencies: + node-notifier: "*" + typescript: "*" + peerDependenciesMeta: + node-notifier: + optional: true + bin: + ts-node-dev: lib/bin.js + tsnd: lib/bin.js + checksum: 768a5806215ca78694d39b85ec6877ba41d33b5affcbedc8208f0e4befd5ba1cffbcc505d5d8eca82ea23a4517a79be5f5de6350cb6e249425c832f4ddf10a0f languageName: node linkType: hard @@ -10764,6 +14498,27 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^9.0.0": + version: 9.1.1 + resolution: "ts-node@npm:9.1.1" + dependencies: + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + source-map-support: ^0.5.17 + yn: 3.1.1 + peerDependencies: + typescript: ">=2.7" + bin: + ts-node: dist/bin.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 356e2647b8b1e6ab00380c0537fa569b63bd9b6f006cc40fd650f81fae1817bd8fecc075300036950d8f45c1d85b95be33cd1e48a1a424a7d86c3dbb42bf60e5 + languageName: node + linkType: hard + "tsconfig-paths-webpack-plugin@npm:4.0.0": version: 4.0.0 resolution: "tsconfig-paths-webpack-plugin@npm:4.0.0" @@ -10775,6 +14530,29 @@ __metadata: languageName: node linkType: hard +"tsconfig-paths-webpack-plugin@npm:^3.5.1": + version: 3.5.2 + resolution: "tsconfig-paths-webpack-plugin@npm:3.5.2" + dependencies: + chalk: ^4.1.0 + enhanced-resolve: ^5.7.0 + tsconfig-paths: ^3.9.0 + checksum: e7872f45b10684204d4a6cbc7989073d885c99e0c9eb5222de6b2b83d2e1594bccb647f52d2f8e00c53da5b9a3084e47a2de44f41c6f7a607ec2b17330a8d9e9 + languageName: node + linkType: hard + +"tsconfig-paths@npm:^3.9.0": + version: 3.14.1 + resolution: "tsconfig-paths@npm:3.14.1" + dependencies: + "@types/json5": ^0.0.29 + json5: ^1.0.1 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d + languageName: node + linkType: hard + "tsconfig-paths@npm:^4.0.0, tsconfig-paths@npm:^4.1.2": version: 4.1.2 resolution: "tsconfig-paths@npm:4.1.2" @@ -10798,20 +14576,27 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.10.0, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": +"tslib@npm:^1.10.0, tslib@npm:^1.11.1, tslib@npm:^1.8.1, tslib@npm:^1.9.0, tslib@npm:^1.9.3": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0": +"tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": version: 2.4.1 resolution: "tslib@npm:2.4.1" checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca languageName: node linkType: hard +"tsscmp@npm:1.0.6": + version: 1.0.6 + resolution: "tsscmp@npm:1.0.6" + checksum: 1512384def36bccc9125cabbd4c3b0e68608d7ee08127ceaa0b84a71797263f1a01c7f82fa69be8a3bd3c1396e2965d2f7b52d581d3a5eeaf3967fbc52e3b3bf + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -10823,6 +14608,15 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: ^5.0.1 + checksum: 05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -10876,7 +14670,26 @@ __metadata: languageName: node linkType: hard -"type-is@npm:~1.6.18": +"type-graphql@npm:^1.1.1": + version: 1.1.1 + resolution: "type-graphql@npm:1.1.1" + dependencies: + "@types/glob": ^7.1.3 + "@types/node": "*" + "@types/semver": ^7.3.3 + glob: ^7.1.6 + graphql-query-complexity: ^0.7.0 + graphql-subscriptions: ^1.1.0 + semver: ^7.3.2 + tslib: ^2.0.1 + peerDependencies: + class-validator: ">=0.12.0" + graphql: ^15.3.0 + checksum: fa14b76daf3a8017858884fdd0c5966d7a8892c21a317223cc79cf004e99e3b858a95443da15ef93ae24de4a1601be1536477e3a1fbb3754c9c7349d20b403eb + languageName: node + linkType: hard + +"type-is@npm:^1.6.16, type-is@npm:^1.6.4, type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: @@ -10886,6 +14699,17 @@ __metadata: languageName: node linkType: hard +"typed-array-length@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-length@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + is-typed-array: ^1.1.9 + checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + languageName: node + linkType: hard + "typed-assert@npm:^1.0.8": version: 1.0.9 resolution: "typed-assert@npm:1.0.9" @@ -10893,6 +14717,104 @@ __metadata: languageName: node linkType: hard +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 + languageName: node + linkType: hard + +"typedi@npm:^0.8.0": + version: 0.8.0 + resolution: "typedi@npm:0.8.0" + checksum: f6fc275672945953aa3486582273a89bcf4e6c0808810a1f21332f4725d0493d1fb74fef8cdb7bc700ec8aa9c36db9a070d6a2f88c8639037185f0d78b988692 + languageName: node + linkType: hard + +"typeorm-typedi-extensions@npm:^0.2.3": + version: 0.2.3 + resolution: "typeorm-typedi-extensions@npm:0.2.3" + peerDependencies: + typedi: ">=0.7.2" + typeorm: ">=0.2.0" + checksum: 01b2fb26846bc1d55bbba3f13c753f4e8969b5833880788640537d309f8e5c781dfcfff0aaf6d31cffcfeb26c6d250a0b61f888be45d487a5a246d31b3d68fe4 + languageName: node + linkType: hard + +"typeorm@npm:^0.2.25": + version: 0.2.45 + resolution: "typeorm@npm:0.2.45" + dependencies: + "@sqltools/formatter": ^1.2.2 + app-root-path: ^3.0.0 + buffer: ^6.0.3 + chalk: ^4.1.0 + cli-highlight: ^2.1.11 + debug: ^4.3.1 + dotenv: ^8.2.0 + glob: ^7.1.6 + js-yaml: ^4.0.0 + mkdirp: ^1.0.4 + reflect-metadata: ^0.1.13 + sha.js: ^2.4.11 + tslib: ^2.1.0 + uuid: ^8.3.2 + xml2js: ^0.4.23 + yargs: ^17.0.1 + zen-observable-ts: ^1.0.0 + peerDependencies: + "@sap/hana-client": ^2.11.14 + better-sqlite3: ^7.1.2 + hdb-pool: ^0.1.6 + ioredis: ^4.28.3 + mongodb: ^3.6.0 + mssql: ^6.3.1 + mysql2: ^2.2.5 + oracledb: ^5.1.0 + pg: ^8.5.1 + pg-native: ^3.0.0 + pg-query-stream: ^4.0.0 + redis: ^3.1.1 + sql.js: ^1.4.0 + sqlite3: ^5.0.2 + typeorm-aurora-data-api-driver: ^2.0.0 + peerDependenciesMeta: + "@sap/hana-client": + optional: true + better-sqlite3: + optional: true + hdb-pool: + optional: true + ioredis: + optional: true + mongodb: + optional: true + mssql: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-native: + optional: true + pg-query-stream: + optional: true + redis: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + typeorm-aurora-data-api-driver: + optional: true + bin: + typeorm: cli.js + checksum: b7684a52c8ba3b796fb9f7d9ea6223edd9256dbeec67c4befe39515ce684dd684d82a2d53158b738555f5c964efaf09144bdd3ced046638e89aa46483d9a696b + languageName: node + linkType: hard + "typescript@npm:^4.0.0": version: 4.9.4 resolution: "typescript@npm:4.9.4" @@ -10933,6 +14855,34 @@ __metadata: languageName: node linkType: hard +"uid-safe@npm:~2.1.5": + version: 2.1.5 + resolution: "uid-safe@npm:2.1.5" + dependencies: + random-bytes: ~1.0.0 + checksum: 07536043da9a026f4a2bc397543d0ace7587449afa1d9d2c4fd3ce76af8a5263a678788bcc429dff499ef29d45843cd5ee9d05434450fcfc19cc661229f703d1 + languageName: node + linkType: hard + +"unbox-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 + which-boxed-primitive: ^1.0.2 + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + languageName: node + linkType: hard + +"undefsafe@npm:^2.0.5": + version: 2.0.5 + resolution: "undefsafe@npm:2.0.5" + checksum: f42ab3b5770fedd4ada175fc1b2eb775b78f609156f7c389106aafd231bfc210813ee49f54483d7191d7b76e483bc7f537b5d92d19ded27156baf57592eb02cc + languageName: node + linkType: hard + "unique-filename@npm:^2.0.0": version: 2.0.1 resolution: "unique-filename@npm:2.0.1" @@ -11014,34 +14964,92 @@ __metadata: "@vue/vue2-jest": ^28.1.0 apollo-boost: ^0.4.9 apollo-link-ws: ^1.0.20 + apollo-server-express: ^2.24.1 + axios: ^0.21.2 + body-parser: ^1.20.0 + chalk: ^4.0.0 + class-transformer: ^0.3.1 + class-validator: ^0.14.0 + class-validator-jsonschema: ^2.0.3 + cors: ^2.8.5 + cron-decorators: ^0.1.5 dayjs: ^1.11.4 debounce: ^1.2.1 deepmerge: ^4.2.2 + dotenv: ^8.2.0 eslint: ~8.15.0 eslint-config-prettier: 8.1.0 + eslint-plugin-autofix: ^1.1.0 + eslint-plugin-deprecation: ^1.3.2 + eslint-plugin-immutable: ^1.0.0 + eslint-plugin-jsdoc: ^35.1.2 + eslint-plugin-no-loops: ^0.3.0 + eslint-plugin-no-secrets: ^0.8.9 + eslint-plugin-notice: ^0.9.10 eslint-plugin-prettier: ^4.2.0 + eslint-plugin-promise: ^5.1.0 + eslint-plugin-radar: ^0.2.1 + eslint-plugin-security: ^1.5.0 + eslint-plugin-simple-import-sort: ^7.0.0 + eslint-plugin-sort-keys-fix: ^1.1.2 + eslint-plugin-type-graphql: ^0.3.0 + eslint-plugin-unicorn: ^32.0.1 eslint-plugin-vue: ^7.8.0 + eslint-plugin-woke: ^1.0.0 + eslint-plugin-write-good-comments: ^0.1.3 express: ^4.18.1 - graphql: ^16.5.0 + glob: ^7.1.6 + graphql: ^15.3.0 graphql-tag: ^2.12.6 + graphql-type-json: ^0.3.2 + is-there: ^4.5.1 jest: 28.1.1 jest-environment-jsdom: 28.1.1 jest-serializer-vue: ^3.0.0 jest-transform-stub: ^2.0.0 + jsonwebtoken: ^8.5.1 + microframework: ^0.6.4 + multer: ^1.4.2 + node-vibrant: ^3.2.1-alpha.1 + nodemon: ^2.0.5 nx: 15.5.3 + pg: ^8.6.0 + pkg: ^5.6.0 prettier: ^2.6.2 + qrcode: ^1.4.4 + querystring: ^0.2.0 + reflect-metadata: ^0.1.13 register-service-worker: ^1.7.2 + rimraf: ^3.0.2 + routing-controllers: ^0.9.0-alpha.6 + routing-controllers-openapi: ^2.1.0 sass: 1.32.8 sass-loader: ^13.2.0 + sha512: ^0.0.1 subscriptions-transport-ws: ^0.11.0 + swagger-ui-express: ^4.1.2 ts-jest: 28.0.5 + ts-loader: ^9.2.2 ts-node: 10.9.1 + ts-node-dev: ^1.0.0-pre.44 + tsconfig-paths: ^3.9.0 + tsconfig-paths-webpack-plugin: ^3.5.1 tslib: ^2.3.0 + type-graphql: ^1.1.1 + typedi: ^0.8.0 + typeorm: ^0.2.25 + typeorm-typedi-extensions: ^0.2.3 typescript: ~4.8.2 + uuid: ^8.3.2 + validator: ^13.7.0 vue: ^2.7.0 vue-apollo: ^3.1.0 vue-router: ^3.6.0 vuetify: ^2.6.13 + webpack: ^5.38.1 + webpack-cli: ^4.7.0 + webpack-node-externals: ^3.0.0 + winston: ^3.3.3 languageName: unknown linkType: soft @@ -11054,6 +15062,13 @@ __metadata: languageName: node linkType: hard +"urijs@npm:^1.19.0": + version: 1.19.11 + resolution: "urijs@npm:1.19.11" + checksum: f9b95004560754d30fd7dbee44b47414d662dc9863f1cf5632a7c7983648df11d23c0be73b9b4f9554463b61d5b0a520b70df9e1ee963ebb4af02e6da2cc80f3 + languageName: node + linkType: hard + "url-parse@npm:^1.5.3": version: 1.5.10 resolution: "url-parse@npm:1.5.10" @@ -11064,6 +15079,25 @@ __metadata: languageName: node linkType: hard +"url@npm:^0.11.0": + version: 0.11.0 + resolution: "url@npm:0.11.0" + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + checksum: 50d100d3dd2d98b9fe3ada48cadb0b08aa6be6d3ac64112b867b56b19be4bfcba03c2a9a0d7922bfd7ac17d4834e88537749fe182430dfd9b68e520175900d90 + languageName: node + linkType: hard + +"utif@npm:^2.0.1": + version: 2.0.1 + resolution: "utif@npm:2.0.1" + dependencies: + pako: ^1.0.5 + checksum: 66b0bffc18f08834a34c44846f189b2223418e8bddfff3882e07fccea54436737f7334e27c86cbff46e247487dc92377b7a17428a7aafc5d5c733d61bed39038 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -11071,6 +15105,19 @@ __metadata: languageName: node linkType: hard +"util.promisify@npm:^1.0.0": + version: 1.1.1 + resolution: "util.promisify@npm:1.1.1" + dependencies: + call-bind: ^1.0.0 + define-properties: ^1.1.3 + for-each: ^0.3.3 + has-symbols: ^1.0.1 + object.getownpropertydescriptors: ^2.1.1 + checksum: ea371c30b90576862487ae4efd7182aa5855019549a4019d82629acc2709e8ccb0f38944403eebec622fff8ebb44ac3f46a52d745d5f543d30606132a4905f96 + languageName: node + linkType: hard + "utila@npm:~0.4": version: 0.4.0 resolution: "utila@npm:0.4.0" @@ -11085,7 +15132,16 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^8.3.2": +"uuid@npm:^3.1.0": + version: 3.4.0 + resolution: "uuid@npm:3.4.0" + bin: + uuid: ./bin/uuid + checksum: 58de2feed61c59060b40f8203c0e4ed7fd6f99d42534a499f1741218a1dd0c129f4aa1de797bcf822c8ea5da7e4137aa3673431a96dae729047f7aca7b27866f + languageName: node + linkType: hard + +"uuid@npm:^8.0.0, uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" bin: @@ -11129,7 +15185,14 @@ __metadata: languageName: node linkType: hard -"vary@npm:~1.1.2": +"validator@npm:^13.7.0": + version: 13.7.0 + resolution: "validator@npm:13.7.0" + checksum: 2b83283de1222ca549a7ef57f46e8d49c6669213348db78b7045bce36a3b5843ff1e9f709ebf74574e06223461ee1f264f8cc9a26a0060a79a27de079d8286ef + languageName: node + linkType: hard + +"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b @@ -11289,6 +15352,13 @@ __metadata: languageName: node linkType: hard +"weasel-words@npm:^0.1.1": + version: 0.1.1 + resolution: "weasel-words@npm:0.1.1" + checksum: a7693308cf29af979da3b9d4803b535c8ea0fa78e0fa3baedae44fa353b5c93779df76189d54829743fd6aae029e46cbb06e30dc4baa8b36032b0573157f8200 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -11332,6 +15402,39 @@ __metadata: languageName: node linkType: hard +"webpack-cli@npm:^4.7.0": + version: 4.10.0 + resolution: "webpack-cli@npm:4.10.0" + dependencies: + "@discoveryjs/json-ext": ^0.5.0 + "@webpack-cli/configtest": ^1.2.0 + "@webpack-cli/info": ^1.5.0 + "@webpack-cli/serve": ^1.7.0 + colorette: ^2.0.14 + commander: ^7.0.0 + cross-spawn: ^7.0.3 + fastest-levenshtein: ^1.0.12 + import-local: ^3.0.2 + interpret: ^2.2.0 + rechoir: ^0.7.0 + webpack-merge: ^5.7.3 + peerDependencies: + webpack: 4.x.x || 5.x.x + peerDependenciesMeta: + "@webpack-cli/generators": + optional: true + "@webpack-cli/migrate": + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + bin: + webpack-cli: bin/cli.js + checksum: 2ff5355ac348e6b40f2630a203b981728834dca96d6d621be96249764b2d0fc01dd54edfcc37f02214d02935de2cf0eefd6ce689d970d154ef493f01ba922390 + languageName: node + linkType: hard + "webpack-dev-middleware@npm:^5.3.1": version: 5.3.3 resolution: "webpack-dev-middleware@npm:5.3.3" @@ -11437,7 +15540,7 @@ __metadata: languageName: node linkType: hard -"webpack@npm:^5.54.0, webpack@npm:^5.75.0": +"webpack@npm:^5.38.1, webpack@npm:^5.54.0, webpack@npm:^5.75.0": version: 5.75.0 resolution: "webpack@npm:5.75.0" dependencies: @@ -11545,6 +15648,40 @@ __metadata: languageName: node linkType: hard +"which-boxed-primitive@npm:^1.0.2": + version: 1.0.2 + resolution: "which-boxed-primitive@npm:1.0.2" + 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 + checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + languageName: node + linkType: hard + +"which-module@npm:^2.0.0": + version: 2.0.0 + resolution: "which-module@npm:2.0.0" + checksum: 809f7fd3dfcb2cdbe0180b60d68100c88785084f8f9492b0998c051d7a8efe56784492609d3f09ac161635b78ea29219eb1418a98c15ce87d085bce905705c9c + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.9": + version: 1.1.9 + resolution: "which-typed-array@npm:1.1.9" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.0 + is-typed-array: ^1.1.10 + checksum: fe0178ca44c57699ca2c0e657b64eaa8d2db2372a4e2851184f568f98c478ae3dc3fdb5f7e46c384487046b0cf9e23241423242b277e03e8ba3dabc7c84c98ef + languageName: node + linkType: hard + "which@npm:^1.2.9": version: 1.3.1 resolution: "which@npm:1.3.1" @@ -11567,7 +15704,7 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.5": +"wide-align@npm:^1.1.0, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: @@ -11583,6 +15720,36 @@ __metadata: languageName: node linkType: hard +"winston-transport@npm:^4.5.0": + version: 4.5.0 + resolution: "winston-transport@npm:4.5.0" + dependencies: + logform: ^2.3.2 + readable-stream: ^3.6.0 + triple-beam: ^1.3.0 + checksum: a56e5678a80b88a73e77ed998fc6e19d0db19c989a356b137ec236782f2bf58ae4511b11c29163f99391fa4dc12102c7bc5738dcb6543f28877fa2819adc3ee9 + languageName: node + linkType: hard + +"winston@npm:^3.3.3": + version: 3.8.2 + resolution: "winston@npm:3.8.2" + dependencies: + "@colors/colors": 1.5.0 + "@dabh/diagnostics": ^2.0.2 + async: ^3.2.3 + is-stream: ^2.0.0 + logform: ^2.4.0 + one-time: ^1.0.0 + readable-stream: ^3.4.0 + safe-stable-stringify: ^2.3.1 + stack-trace: 0.0.x + triple-beam: ^1.3.0 + winston-transport: ^4.5.0 + checksum: f7b901798b92ab9e93c850110bf6e98500e9a0e762b62dab410cf928b2a4145533dfa6d3d2b24f7bf0dc94b53808d5bd28aaaeff9a4b43b89ea4c798cce308ea + languageName: node + linkType: hard + "word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": version: 1.2.3 resolution: "word-wrap@npm:1.2.3" @@ -11600,6 +15767,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^6.2.0": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a + languageName: node + linkType: hard + "wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -11628,6 +15806,24 @@ __metadata: languageName: node linkType: hard +"write-good@npm:^1.0.8": + version: 1.0.8 + resolution: "write-good@npm:1.0.8" + dependencies: + adverb-where: ^0.2.2 + commander: ^2.19.0 + e-prime: ^0.10.4 + no-cliches: ^0.3.0 + passive-voice: ^0.1.0 + too-wordy: ^0.3.1 + weasel-words: ^0.1.1 + bin: + write-good: bin/write-good.js + writegood: bin/write-good.js + checksum: 045f1d1b50f73d15c6664350ecacaa4bf74bab681376747b42c14ccaec06a667db89874ec0c1ff31a46e01f52051ed76518c2b920d114925f84aefcb91708e92 + languageName: node + linkType: hard + "ws@npm:^5.2.0 || ^6.0.0 || ^7.0.0, ws@npm:^7.3.1": version: 7.5.9 resolution: "ws@npm:7.5.9" @@ -11658,6 +15854,18 @@ __metadata: languageName: node linkType: hard +"xhr@npm:^2.0.1": + version: 2.6.0 + resolution: "xhr@npm:2.6.0" + dependencies: + global: ~4.4.0 + is-function: ^1.0.1 + parse-headers: ^2.0.0 + xtend: ^4.0.0 + checksum: a1db277e37737caf3ed363d2a33ce4b4ea5b5fc190b663a6f70bc252799185b840ccaa166eaeeea4841c9c60b87741f0a24e29cbcf6708dd425986d4df186d2f + languageName: node + linkType: hard + "xml-name-validator@npm:^4.0.0": version: 4.0.0 resolution: "xml-name-validator@npm:4.0.0" @@ -11665,6 +15873,30 @@ __metadata: languageName: node linkType: hard +"xml-parse-from-string@npm:^1.0.0": + version: 1.0.1 + resolution: "xml-parse-from-string@npm:1.0.1" + checksum: 5155cb98e428409829f4060ce542c55438b2f7646d11fd306d850eaf12d35c06ffd9e86d76aa5230121a533b958fd1a319d6f90a5c113391853d0ff01f4da7bb + languageName: node + linkType: hard + +"xml2js@npm:^0.4.23, xml2js@npm:^0.4.5": + version: 0.4.23 + resolution: "xml2js@npm:0.4.23" + dependencies: + sax: ">=0.6.0" + xmlbuilder: ~11.0.0 + checksum: ca0cf2dfbf6deeaae878a891c8fbc0db6fd04398087084edf143cdc83d0509ad0fe199b890f62f39c4415cf60268a27a6aed0d343f0658f8779bd7add690fa98 + languageName: node + linkType: hard + +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0 + languageName: node + linkType: hard + "xmlchars@npm:^2.2.0": version: 2.2.0 resolution: "xmlchars@npm:2.2.0" @@ -11672,6 +15904,32 @@ __metadata: languageName: node linkType: hard +"xss@npm:^1.0.8": + version: 1.0.14 + resolution: "xss@npm:1.0.14" + dependencies: + commander: ^2.20.3 + cssfilter: 0.0.10 + bin: + xss: bin/xss + checksum: 77c6a60a5f96490098ef837c3b49321c0f31963f323c748cb0a01bc02fc6e465a6accbe4c54cad62f8d6ffe647d984be173879433af861883f6213d9416d3f53 + languageName: node + linkType: hard + +"xtend@npm:^4.0.0": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a + languageName: node + linkType: hard + +"y18n@npm:^4.0.0": + version: 4.0.3 + resolution: "y18n@npm:4.0.3" + checksum: 014dfcd9b5f4105c3bb397c1c8c6429a9df004aa560964fb36732bfb999bfe83d45ae40aeda5b55d21b1ee53d8291580a32a756a443e064317953f08025b1aa4 + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" @@ -11714,6 +15972,16 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^18.1.2": + version: 18.1.3 + resolution: "yargs-parser@npm:18.1.3" + dependencies: + camelcase: ^5.0.0 + decamelize: ^1.2.0 + checksum: 60e8c7d1b85814594d3719300ecad4e6ae3796748b0926137bfec1f3042581b8646d67e83c6fc80a692ef08b8390f21ddcacb9464476c39bbdf52e34961dd4d9 + languageName: node + linkType: hard + "yargs-parser@npm:^20.2.2": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" @@ -11721,7 +15989,26 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^16.0.0": +"yargs@npm:^15.3.1": + version: 15.4.1 + resolution: "yargs@npm:15.4.1" + dependencies: + cliui: ^6.0.0 + decamelize: ^1.2.0 + find-up: ^4.1.0 + get-caller-file: ^2.0.1 + require-directory: ^2.1.1 + require-main-filename: ^2.0.0 + set-blocking: ^2.0.0 + string-width: ^4.2.0 + which-module: ^2.0.0 + y18n: ^4.0.0 + yargs-parser: ^18.1.2 + checksum: 40b974f508d8aed28598087720e086ecd32a5fd3e945e95ea4457da04ee9bdb8bdd17fd91acff36dc5b7f0595a735929c514c40c402416bbb87c03f6fb782373 + languageName: node + linkType: hard + +"yargs@npm:^16.0.0, yargs@npm:^16.2.0": version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: @@ -11736,7 +16023,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.3.1, yargs@npm:^17.6.2": +"yargs@npm:^17.0.1, yargs@npm:^17.3.1, yargs@npm:^17.6.2": version: 17.6.2 resolution: "yargs@npm:17.6.2" dependencies: @@ -11751,6 +16038,13 @@ __metadata: languageName: node linkType: hard +"ylru@npm:^1.2.0": + version: 1.3.2 + resolution: "ylru@npm:1.3.2" + checksum: b6bb3931144424114f2350c072cfeb180f205add93509c605ae025cbed8059846f8a5767655feeeab890d288b5b4c4b36f5d5d867ee4e6946c16bcc7ec3ddaee + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" @@ -11775,7 +16069,16 @@ __metadata: languageName: node linkType: hard -"zen-observable@npm:^0.8.0": +"zen-observable-ts@npm:^1.0.0": + version: 1.2.5 + resolution: "zen-observable-ts@npm:1.2.5" + dependencies: + zen-observable: 0.8.15 + checksum: 3b707b7a0239a9bc40f73ba71b27733a689a957c1f364fabb9fa9cbd7d04b7c2faf0d517bf17004e3ed3f4330ac613e84c0d32313e450ddaa046f3350af44541 + languageName: node + linkType: hard + +"zen-observable@npm:0.8.15, zen-observable@npm:^0.8.0": version: 0.8.15 resolution: "zen-observable@npm:0.8.15" checksum: b7289084bc1fc74a559b7259faa23d3214b14b538a8843d2b001a35e27147833f4107590b1b44bf5bc7f6dfe6f488660d3a3725f268e09b3925b3476153b7821