diff --git a/.changeset/chilly-bikes-deliver.md b/.changeset/chilly-bikes-deliver.md new file mode 100644 index 00000000000..cfad3032fb8 --- /dev/null +++ b/.changeset/chilly-bikes-deliver.md @@ -0,0 +1,5 @@ +--- +'web-app': minor +--- + +Add prisma and next-auth example diff --git a/.changeset/config.json b/.changeset/config.json index e0a0ff1bd40..f37bc02b7fc 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -3,7 +3,7 @@ "changelog": ["@changesets/changelog-github", { "repo": "belgattitude/nextjs-monorepo-example" }], "commit": false, "linked": [], - "access": "public", + "access": "private", "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": [], diff --git a/.changeset/eleven-mugs-protect.md b/.changeset/eleven-mugs-protect.md new file mode 100644 index 00000000000..55c3ed89828 --- /dev/null +++ b/.changeset/eleven-mugs-protect.md @@ -0,0 +1,5 @@ +--- +'@your-org/core-lib': minor +--- + +Add example asserts and typeguards diff --git a/.changeset/funny-suns-exist.md b/.changeset/funny-suns-exist.md new file mode 100644 index 00000000000..4e970cb8a25 --- /dev/null +++ b/.changeset/funny-suns-exist.md @@ -0,0 +1,5 @@ +--- +'@your-org/core-lib': minor +--- + +Add jest example for packages diff --git a/.eslintrc.base.json b/.eslintrc.base.json index 72f6ad050d2..f33e2eb660a 100644 --- a/.eslintrc.base.json +++ b/.eslintrc.base.json @@ -26,7 +26,10 @@ "assert": "readonly", "Cypress": "readonly" }, - "rules": {}, + "rules": { + "no-empty-function": "off", + "@typescript-eslint/no-empty-function": ["error",{"allow": ["private-constructors", "decoratedFunctions"]}] + }, "overrides": [ { "files": [ diff --git a/.github/workflows/ci-web-app.yml b/.github/workflows/ci-web-app.yml index 85be26f1b3f..e1b1cadabd1 100644 --- a/.github/workflows/ci-web-app.yml +++ b/.github/workflows/ci-web-app.yml @@ -77,6 +77,11 @@ jobs: run: | yarn dedupe --check + #- name: Generate Prisma client + # working-directory: apps/web-app + # run: | + # yarn prisma generate + - name: Typecheck working-directory: apps/web-app run: | diff --git a/apps/blog-app/jest.config.js b/apps/blog-app/jest.config.js index ad73f72ab84..8b16d9aab02 100644 --- a/apps/blog-app/jest.config.js +++ b/apps/blog-app/jest.config.js @@ -8,9 +8,11 @@ const { compilerOptions: baseTsConfig } = require('./tsconfig.json'); // Take the paths from tsconfig automatically from base tsconfig.json // @link https://kulshekhar.github.io/ts-jest/docs/paths-mapping const getTsConfigBasePaths = () => { - return pathsToModuleNameMapper(baseTsConfig.paths, { - prefix: '/', - }); + return baseTsConfig.paths + ? pathsToModuleNameMapper(baseTsConfig.paths, { + prefix: '/', + }) + : {}; }; /** @typedef {import('ts-jest')} */ diff --git a/apps/blog-app/package.json b/apps/blog-app/package.json index c36901bdda6..7552be6f0f1 100644 --- a/apps/blog-app/package.json +++ b/apps/blog-app/package.json @@ -31,8 +31,7 @@ "typecheck": "tsc --project ./tsconfig.json --noEmit", "lint": "eslint . --ext .ts,.tsx,.js,.jsx", "fix:staged-files": "lint-staged --allow-empty", - "fix:all-files": "eslint . --ext .ts,.tsx,.js,.jsx --fix", - "postinstall": "yarn share:static:symlink" + "fix:all-files": "eslint . --ext .ts,.tsx,.js,.jsx --fix" }, "devDependencies": { "@emotion/babel-plugin": "^11.3.0", diff --git a/apps/web-app/.env b/apps/web-app/.env index b5c81250a11..7e454682bc7 100644 --- a/apps/web-app/.env +++ b/apps/web-app/.env @@ -1,6 +1,11 @@ +# This is the main file for environment # https://nextjs.org/docs/basic-features/environment-variables -PRISMA_DATABASE_URL="file:../data/prisma-dev-database.sqlite" + +# DATABASE_URL +# When deploying on serveless/lambdas "?connection_limit=" should be 1 +# @see https://www.prisma.io/docs/concepts/components/prisma-client/deployment#recommended-connection-limit +PRISMA_DATABASE_URL=postgresql://nextjs:!ChangeMe!@localhost:5432/maindb?schema=public # Enable display of lambdas size for vercel deployments # NEXT_DEBUG_FUNCTION_SIZE=1 diff --git a/apps/web-app/.env.development b/apps/web-app/.env.development new file mode 100644 index 00000000000..689cff6612f --- /dev/null +++ b/apps/web-app/.env.development @@ -0,0 +1 @@ +PRISMA_DATABASE_URL=postgresql://nextjs:!ChangeMe!@localhost:5432/maindb?schema=public \ No newline at end of file diff --git a/apps/web-app/README.md b/apps/web-app/README.md index 9c0e5ac7308..ee558d87acf 100644 --- a/apps/web-app/README.md +++ b/apps/web-app/README.md @@ -8,10 +8,63 @@ > Part of the [nextjs-monorepo-example](https://github.com/belgattitude/nextjs-monorepo-example) -## Develop +## Quick start + +### Step 1: Database + +This project uses [Prisma](https://prisma.io) as primary database layer an connect +to a postgresql database. An example schema is defined in [./prisma/schema.prisma](./prisma/schema.prisma), +seeds are available in [./prisma/seeds.ts](./prisma/seed.ts). + +#### Option 1: Postgresql local + +The default env for PRISMA_DATABASE_URL is defined in the main [.env](.env) file. +By default, it connects to the postgresql service defined in [../../docker-compose.yml](../../docker-compose.yml). + +Ensure you have docker and docker-compose and run + +```bash +# In the root folder +$ docker-compose up database +# Alternatively, from any folder +$ yarn docker:up +``` + +#### Option 2: An hosted postgres instance + +To quick start, you can use a free tier at supabase.io, but all providers will work. + +As an example, simply create an `.env.local` and set the supabase pgbouncer url: + +```env +PRISMA_DATABASE_URL=postgresql://postgres:[PASSWORD]@[HOST]:[PORT]/postgres?schema=public&pgbouncer=true&sslmode=require&sslaccept=strict&sslcert=../config/certs/supabase-prod-ca-2021.crt +``` + +> You can append `&connection_limit=1` if deploying on a serverless/lambda provider (ie: vercel, netlify...) + +### Step 2: + +Create and seed the database the first time or after a change. ```bash -$ cd apps/web-app -$ yarn dev -p 3001 -# Alternatively: yarn workspace webapp run dev -p 3000 +# Using push here rather than migrate it's easier for +# the example. +$ yarn prisma:db:push +$ yarn prisma:db:seed +``` + +> **Warning**. Notice how we use ':' rather than spaces. Why ? Cause prisma +> [does not support](https://github.com/prisma/prisma/issues/3865) the .env.[local|development...] supported by nextjs. +> Curious ? Open the package.json script folder to see how we use dotenv-flow under the hood read [this](https://github.com/prisma/prisma/issues/3865). + +## Nextjs + +### Develop + ``` +$ yarn dev +``` + +To test the api/db browse to + +- http://localhost:3000/api/rest/post/1 diff --git a/apps/web-app/config/certs/supabase-prod-ca-2021.crt b/apps/web-app/config/certs/supabase-prod-ca-2021.crt new file mode 100644 index 00000000000..3d693669b23 --- /dev/null +++ b/apps/web-app/config/certs/supabase-prod-ca-2021.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDxDCCAqygAwIBAgIUbLxMod62P2ktCiAkxnKJwtE9VPYwDQYJKoZIhvcNAQEL +BQAwazELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB0RlbHdhcmUxEzARBgNVBAcMCk5l +dyBDYXN0bGUxFTATBgNVBAoMDFN1cGFiYXNlIEluYzEeMBwGA1UEAwwVU3VwYWJh +c2UgUm9vdCAyMDIxIENBMB4XDTIxMDQyODEwNTY1M1oXDTMxMDQyNjEwNTY1M1ow +azELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB0RlbHdhcmUxEzARBgNVBAcMCk5ldyBD +YXN0bGUxFTATBgNVBAoMDFN1cGFiYXNlIEluYzEeMBwGA1UEAwwVU3VwYWJhc2Ug +Um9vdCAyMDIxIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqQXW +QyHOB+qR2GJobCq/CBmQ40G0oDmCC3mzVnn8sv4XNeWtE5XcEL0uVih7Jo4Dkx1Q +DmGHBH1zDfgs2qXiLb6xpw/CKQPypZW1JssOTMIfQppNQ87K75Ya0p25Y3ePS2t2 +GtvHxNjUV6kjOZjEn2yWEcBdpOVCUYBVFBNMB4YBHkNRDa/+S4uywAoaTWnCJLUi +cvTlHmMw6xSQQn1UfRQHk50DMCEJ7Cy1RxrZJrkXXRP3LqQL2ijJ6F4yMfh+Gyb4 +O4XajoVj/+R4GwywKYrrS8PrSNtwxr5StlQO8zIQUSMiq26wM8mgELFlS/32Uclt +NaQ1xBRizkzpZct9DwIDAQABo2AwXjALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFKjX +uXY32CztkhImng4yJNUtaUYsMB8GA1UdIwQYMBaAFKjXuXY32CztkhImng4yJNUt +aUYsMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAB8spzNn+4VU +tVxbdMaX+39Z50sc7uATmus16jmmHjhIHz+l/9GlJ5KqAMOx26mPZgfzG7oneL2b +VW+WgYUkTT3XEPFWnTp2RJwQao8/tYPXWEJDc0WVQHrpmnWOFKU/d3MqBgBm5y+6 +jB81TU/RG2rVerPDWP+1MMcNNy0491CTL5XQZ7JfDJJ9CCmXSdtTl4uUQnSuv/Qx +Cea13BX2ZgJc7Au30vihLhub52De4P/4gonKsNHYdbWjg7OWKwNv/zitGDVDB9Y2 +CMTyZKG3XEu5Ghl1LEnI3QmEKsqaCLv12BnVjbkSeZsMnevJPs1Ye6TjjJwdik5P +o/bKiIz+Fq8= +-----END CERTIFICATE----- diff --git a/apps/web-app/data/prisma-dev-database.sqlite b/apps/web-app/data/prisma-dev-database.sqlite deleted file mode 100644 index b7671999ffa..00000000000 Binary files a/apps/web-app/data/prisma-dev-database.sqlite and /dev/null differ diff --git a/apps/web-app/jest.config.js b/apps/web-app/jest.config.js index 24cb3b9b598..25f8570de8f 100644 --- a/apps/web-app/jest.config.js +++ b/apps/web-app/jest.config.js @@ -8,9 +8,11 @@ const { compilerOptions: baseTsConfig } = require('./tsconfig.json'); // Take the paths from tsconfig automatically from base tsconfig.json // @link https://kulshekhar.github.io/ts-jest/docs/paths-mapping const getTsConfigBasePaths = () => { - return pathsToModuleNameMapper(baseTsConfig.paths, { - prefix: '/', - }); + return baseTsConfig.paths + ? pathsToModuleNameMapper(baseTsConfig.paths, { + prefix: '/', + }) + : {}; }; /** @typedef {import('ts-jest')} */ diff --git a/apps/web-app/package.json b/apps/web-app/package.json index cee5a38ca45..3cb28db6e1e 100644 --- a/apps/web-app/package.json +++ b/apps/web-app/package.json @@ -19,6 +19,10 @@ "vercel-build": "yarn share:static:hardlink && cross-env NEXTJS_BUILD_TARGET=serverless next build", "clean": "rimraf --no-glob ./.next ./out", "start": "next start", + "prisma:migrate:reset": "dotenv-flow -- yarn prisma migrate reset", + "prisma:db:seed": "dotenv-flow -- yarn prisma db seed --preview-feature", + "prisma:db:push": "dotenv-flow -- yarn prisma db push", + "prisma:studio": "dotenv-flow -- yarn prisma studio", "?share:static:symlink": "echo 'Use this command to link assets, locales... from shared static folder'", "share:static:symlink": "rimraf ./public/shared-assets && symlink-dir ../../static/assets ./public/shared-assets", "?share:static:hardlink": "echo 'Use this command to link assets, locales... from shared static folder'", @@ -30,7 +34,11 @@ "typecheck": "tsc --project ./tsconfig.json --noEmit", "lint": "eslint . --ext .ts,.tsx,.js,.jsx", "fix:staged-files": "lint-staged --allow-empty", - "fix:all-files": "eslint . --ext .ts,.tsx,.js,.jsx --fix" + "fix:all-files": "eslint . --ext .ts,.tsx,.js,.jsx --fix", + "?ts-node": "Tip: this is only needed for prisma seeds", + "ts-node": "ts-node --compiler-options {\\\"module\\\":\\\"commonjs\\\"}", + "?postinstall": "@todo: the prisma generate seems to be required, but is installed at the root", + "postinstall": "yarn prisma generate" }, "devDependencies": { "@emotion/babel-plugin": "^11.3.0", @@ -39,6 +47,7 @@ "@testing-library/jest-dom": "^5.12.0", "@testing-library/react": "^11.2.7", "@testing-library/react-hooks": "^6.0.0", + "@types/cors": "^2.8.10", "@types/jest": "^26.0.23", "@types/node": "^15.6.1", "@types/react": "^17.0.7", @@ -48,6 +57,8 @@ "autoprefixer": "^10.2.5", "camelcase": "^6.2.0", "cross-env": "^7.0.3", + "dotenv-flow": "^3.2.0", + "dotenv-flow-cli": "^1.0.0", "eslint": "^7.27.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "2.23.3", @@ -72,6 +83,7 @@ "sync-directory": "^2.2.22", "tailwindcss": "^2.1.2", "ts-jest": "^26.5.6", + "ts-node": "^10.0.0", "typescript": "^4.2.4" }, "dependencies": { @@ -80,10 +92,14 @@ "@headlessui/react": "^1.2.0", "@heroicons/react": "^1.0.1", "@prisma/client": "^2.23.0", + "@tsed/exceptions": "^6.51.0", "@your-org/core-lib": "workspace:*", "@your-org/ui-lib": "workspace:*", + "cors": "^2.8.5", "cross-env": "^7.0.3", "next": "^10.2.3", + "next-auth": "^3.23.3", + "next-connect": "^0.10.1", "next-secure-headers": "^2.2.0", "next-seo": "^4.24.0", "react": "^17.0.2", diff --git a/apps/web-app/prisma/schema.prisma b/apps/web-app/prisma/schema.prisma index a8e19e8fec5..acc34460d26 100644 --- a/apps/web-app/prisma/schema.prisma +++ b/apps/web-app/prisma/schema.prisma @@ -1,12 +1,12 @@ -datasource db { - provider = "sqlite" - url = env("PRISMA_DATABASE_URL") -} - generator client { provider = "prisma-client-js" } +datasource db { + provider = "postgresql" + url = env("PRISMA_DATABASE_URL") +} + model Post { id Int @id @default(autoincrement()) title String @@ -14,11 +14,56 @@ model Post { published Boolean @default(false) author User? @relation(fields: [authorId], references: [id]) authorId Int? + @@map(name: "post") } model User { - id Int @id @default(autoincrement()) - email String @unique - name String? - posts Post[] + id Int @id @default(autoincrement()) + name String? + email String @unique + emailVerified DateTime? @map(name: "email_verified") + image String? + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @updatedAt @map(name: "updated_at") + posts Post[] + @@map(name: "user") +} + +model AuthAccount { + id Int @id @default(autoincrement()) + compoundId String @unique @map(name: "compound_id") + userId Int @map(name: "user_id") + providerType String @map(name: "provider_type") + providerId String @map(name: "provider_id") + providerAccountId String @map(name: "provider_account_id") + refreshToken String? @map(name: "refresh_token") + accessToken String? @map(name: "access_token") + accessTokenExpires DateTime? @map(name: "access_token_expires") + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @default(now()) @map(name: "updated_at") + @@index([providerAccountId], name: "providerAccountId") + @@index([providerId], name: "providerId") + @@index([userId], name: "userId") + @@map(name: "auth_account") } + +model AuthSession { + id Int @id @default(autoincrement()) + userId Int @map(name: "user_id") + expires DateTime + sessionToken String @unique @map(name: "session_token") + accessToken String @unique @map(name: "access_token") + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @default(now()) @map(name: "updated_at") + @@map(name: "auth_session") +} + +model AuthVerificationRequest { + id Int @id @default(autoincrement()) + identifier String + token String @unique + expires DateTime + createdAt DateTime @default(now()) @map(name: "created_at") + updatedAt DateTime @default(now()) @map(name: "updated_at") + @@map(name: "auth_verification_request") +} \ No newline at end of file diff --git a/apps/web-app/prisma/seed.ts b/apps/web-app/prisma/seed.ts new file mode 100644 index 00000000000..9a868adba97 --- /dev/null +++ b/apps/web-app/prisma/seed.ts @@ -0,0 +1,71 @@ +import { PrismaClient, Prisma } from '@prisma/client'; + +const prisma = new PrismaClient(); + +const userData: Prisma.UserCreateInput[] = [ + { + name: 'Alice', + email: 'alice@prisma.io', + posts: { + create: [ + { + title: 'Join the Prisma Slack', + content: 'https://slack.prisma.io', + published: true, + }, + ], + }, + }, + { + name: 'Nilu', + email: 'nilu@prisma.io', + posts: { + create: [ + { + title: 'Follow Prisma on Twitter', + content: 'https://www.twitter.com/prisma', + published: true, + }, + ], + }, + }, + { + name: 'Mahmoud', + email: 'mahmoud@prisma.io', + posts: { + create: [ + { + title: 'Ask a question about Prisma on GitHub', + content: 'https://www.github.com/prisma/prisma/discussions', + published: true, + }, + { + title: 'Prisma on YouTube', + content: 'https://pris.ly/youtube', + }, + ], + }, + }, +]; + +async function main() { + console.log(`Start seeding ...`); + for (const u of userData) { + const user = await prisma.user.upsert({ + where: { email: u.email }, + update: {}, + create: u, + }); + console.log(`Created or updated user with id: ${user.id}`); + } + console.log(`Seeding finished.`); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/apps/web-app/src/backend/config/container.config.ts b/apps/web-app/src/backend/config/container.config.ts new file mode 100644 index 00000000000..8d356c95448 --- /dev/null +++ b/apps/web-app/src/backend/config/container.config.ts @@ -0,0 +1,46 @@ +import { PrismaClient } from '@prisma/client'; +import { Asserts } from '@your-org/core-lib'; + +declare let global: { + __PRISMA_CLIENT__: PrismaClient | undefined; +}; + +class PrismaFactory { + private static instance: PrismaClient | undefined; + private constructor() {} + private static createNewInstance(): PrismaClient { + const url = process.env?.PRISMA_DATABASE_URL ?? null; + Asserts.nonEmptyString( + url, + `Cannot create prisma client instance, missing env variable DATABASE_URL.` + ); + return new PrismaClient({ + datasources: { + db: { + url: url, + }, + }, + }); + } + static getInstance() { + if (process.env.NODE_ENV === 'production') { + if (!PrismaFactory.instance) { + PrismaFactory.instance = PrismaFactory.createNewInstance(); + } + return PrismaFactory.instance; + } else { + // PrismaClient is attached to the `global` object in development to prevent + // exhausting your database connection limit. + // + // Learn more: + // https://pris.ly/d/help/next-js-best-practices + if (!global.__PRISMA_CLIENT__) { + global.__PRISMA_CLIENT__ = PrismaFactory.createNewInstance(); + console.log('Development: Created DB connection.'); + } + return global.__PRISMA_CLIENT__; + } + } +} + +export const prismaClient = PrismaFactory.getInstance(); diff --git a/apps/web-app/src/pages/api/rest/post/[id].ts b/apps/web-app/src/pages/api/rest/post/[id].ts new file mode 100644 index 00000000000..df72d20c582 --- /dev/null +++ b/apps/web-app/src/pages/api/rest/post/[id].ts @@ -0,0 +1,38 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { prismaClient } from '@/backend/config/container.config'; +import { BadRequest, InternalServerError, NotFound } from '@tsed/exceptions'; +import { Asserts } from '@your-org/core-lib'; +import { StringConvert } from '@your-org/core-lib/utils/string-convert'; + +export default async function handle( + req: NextApiRequest, + res: NextApiResponse +) { + const { id } = req.query; + const postId = StringConvert.toSafeInteger(id); + Asserts.safeInteger(postId, () => new BadRequest('Wrong param id')); + + if (req.method === 'GET') { + return res.json(await getPostSsr(postId)); + } else { + throw new Error( + `The HTTP ${req.method} method is not supported at this route.` + ); + } +} + +const getPostSsr = async (postId: number) => { + try { + const post = await prismaClient.post.findUnique({ + where: { id: postId }, + include: { author: true }, + }); + Asserts.isPresent( + post, + () => new NotFound(`Post ${postId} can't be found`) + ); + return post; + } catch (e) { + throw new InternalServerError(`Post ${postId} can't be retrieved`, e); + } +}; diff --git a/apps/web-app/tsconfig.json b/apps/web-app/tsconfig.json index 9213b655eb4..8873fec480b 100644 --- a/apps/web-app/tsconfig.json +++ b/apps/web-app/tsconfig.json @@ -9,6 +9,7 @@ "incremental": true, "paths": { "@/test-utils": ["../config/jest/test-utils"], + "@/backend/*": ["./backend/*"], "@/components/*": ["./components/*"], "@your-org/ui-lib/*": ["../../../packages/ui-lib/src/*"], "@your-org/ui-lib": ["../../../packages/ui-lib/src/index"], diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 00000000000..326e12a1724 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,9 @@ +version: "3.4" + +# Development environment override +services: + database: + ports: + - target: 5432 + published: 5432 + protocol: tcp \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000000..c57e300b967 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: "3.4" + +services: + database: + image: postgres:13-alpine + environment: + - POSTGRES_DB=maindb + - POSTGRES_PASSWORD=!ChangeMe! + - POSTGRES_USER=nextjs + volumes: + - db_data:/var/lib/postgresql/data:rw + # you may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data! + # - ./docker/db/data:/var/lib/postgresql/data:rw + +volumes: + db_data: diff --git a/package.json b/package.json index 19c0fe640ce..59847954154 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,10 @@ "packages:lint": "yarn workspaces foreach -ptv --include '@your-org/*' run lint", "packages:typecheck": "yarn workspaces foreach -ptv --include '@your-org/*' run typecheck", "packages:clean": "yarn workspaces foreach -ptv --include '@your-org/*' run clean", - "postinstall": "is-ci || husky install" + "postinstall": "is-ci || yarn husky install", + "docker:up": "docker-compose up -d", + "docker:up:database": "docker-compose up -d database", + "docker:down": "docker-compose down" }, "devDependencies": { "@changesets/changelog-github": "^0.4.0", diff --git a/packages/core-lib/config/jest/css-transform.js b/packages/core-lib/config/jest/css-transform.js new file mode 100644 index 00000000000..95e67df929d --- /dev/null +++ b/packages/core-lib/config/jest/css-transform.js @@ -0,0 +1,15 @@ +// Borrowed from https://github.com/facebook/create-react-app v4.0.1 +'use strict'; + +// This is a custom Jest transformer turning style imports into empty objects. +// http://facebook.github.io/jest/docs/en/webpack.html + +module.exports = { + process() { + return 'module.exports = {};'; + }, + getCacheKey() { + // The output is always the same. + return 'cssTransform'; + }, +}; diff --git a/packages/core-lib/config/jest/file-transform.js b/packages/core-lib/config/jest/file-transform.js new file mode 100644 index 00000000000..aab67618c38 --- /dev/null +++ b/packages/core-lib/config/jest/file-transform.js @@ -0,0 +1,40 @@ +'use strict'; + +const path = require('path'); +const camelcase = require('camelcase'); + +// This is a custom Jest transformer turning file imports into filenames. +// http://facebook.github.io/jest/docs/en/webpack.html + +module.exports = { + process(src, filename) { + const assetFilename = JSON.stringify(path.basename(filename)); + + if (filename.match(/\.svg$/)) { + // Based on how SVGR generates a component name: + // https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6 + const pascalCaseFilename = camelcase(path.parse(filename).name, { + pascalCase: true, + }); + const componentName = `Svg${pascalCaseFilename}`; + return `const React = require('react'); + module.exports = { + __esModule: true, + default: ${assetFilename}, + ReactComponent: React.forwardRef(function ${componentName}(props, ref) { + return { + $$typeof: Symbol.for('react.element'), + type: 'svg', + ref: ref, + key: null, + props: Object.assign({}, props, { + children: ${assetFilename} + }) + }; + }), + };`; + } + + return `module.exports = ${assetFilename};`; + }, +}; diff --git a/packages/core-lib/jest.config.js b/packages/core-lib/jest.config.js new file mode 100644 index 00000000000..e1c5727b291 --- /dev/null +++ b/packages/core-lib/jest.config.js @@ -0,0 +1,51 @@ +'use strict'; + +const { pathsToModuleNameMapper } = require('ts-jest/utils'); +const { defaults: tsjPreset } = require('ts-jest/presets'); + +const { compilerOptions: baseTsConfig } = require('./tsconfig.json'); + +// Take the paths from tsconfig automatically from base tsconfig.json +// @link https://kulshekhar.github.io/ts-jest/docs/paths-mapping +const getTsConfigBasePaths = () => { + return baseTsConfig.paths + ? pathsToModuleNameMapper(baseTsConfig.paths, { + prefix: '/', + }) + : {}; +}; + +/** @typedef {import('ts-jest')} */ +/** @type {import('@jest/types').Config.InitialOptions} */ +const config = { + name: 'core-lib:unit', + testRunner: 'jest-circus/runner', + testEnvironment: 'jsdom', + verbose: true, + rootDir: './src', + transform: { + ...tsjPreset.transform, + '^.+\\.css$': '/../config/jest/css-transform.js', + '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': + '/../config/jest/file-transform.js', + }, + setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect'], + transformIgnorePatterns: ['^.+\\.module\\.(css|sass|scss|less)$'], + testMatch: ['/**/*.{spec,test}.{js,jsx,ts,tsx}'], + moduleNameMapper: { + // For @testing-library/react + '^@/test-utils$': '/../config/jest/test-utils', + '^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy', + ...getTsConfigBasePaths(), + }, + coverageDirectory: '/coverage', + collectCoverageFrom: ['/**/*.{ts,tsx,js,jsx}', '!**/*.test.ts'], + globals: { + 'ts-jest': { + diagnostics: true, + tsconfig: './tsconfig.jest.json', + }, + }, +}; + +module.exports = config; diff --git a/packages/core-lib/package.json b/packages/core-lib/package.json index ff7cb0cf789..5c6db9b346a 100644 --- a/packages/core-lib/package.json +++ b/packages/core-lib/package.json @@ -24,7 +24,8 @@ "lint": "eslint . --ext .ts,.tsx,.js,.jsx", "typecheck": "tsc --project ./tsconfig.json --noEmit", "test": "run-s 'test:*'", - "test:unit": "echo \"No tests yet\"", + "test:unit": "jest --config jest.config.js --maxWorkers=50% --color $@", + "ci-test:unit": "jest --config jest.config.js --runInBand --color $@", "fix:staged-files": "lint-staged --allow-empty", "fix:all-files": "eslint . --ext .ts,.tsx,.js,.jsx --fix" }, diff --git a/packages/core-lib/src/index.ts b/packages/core-lib/src/index.ts index 8edc8b237ed..f86753c2a6d 100644 --- a/packages/core-lib/src/index.ts +++ b/packages/core-lib/src/index.ts @@ -1,3 +1,6 @@ +export { Asserts } from './utils/asserts'; +export * as Typeguards from './utils/typeguards'; + export const sayHello = (name: string): string => { return `I'm the @your-org/ui-lib component telling ${name} !`; }; diff --git a/packages/core-lib/src/utils/__tests__/asserts.test.ts b/packages/core-lib/src/utils/__tests__/asserts.test.ts new file mode 100644 index 00000000000..b3976202361 --- /dev/null +++ b/packages/core-lib/src/utils/__tests__/asserts.test.ts @@ -0,0 +1,19 @@ +import { Asserts } from '../asserts'; + +describe('Asserts test', () => { + describe('Asserts.nonEmptyString', () => { + it('should work as expected', () => { + expect(() => { + Asserts.nonEmptyString('cool'); + }).not.toThrowError(''); + expect(() => { + Asserts.nonEmptyString(' ', 'message'); + }).toThrow('message'); + expect(() => { + Asserts.nonEmptyString(true, () => { + return new Error('message2'); + }); + }).toThrowError('message2'); + }); + }); +}); diff --git a/packages/core-lib/src/utils/__tests__/string-convert.test.ts b/packages/core-lib/src/utils/__tests__/string-convert.test.ts new file mode 100644 index 00000000000..0c76df8433b --- /dev/null +++ b/packages/core-lib/src/utils/__tests__/string-convert.test.ts @@ -0,0 +1,32 @@ +import { StringConvert } from '../string-convert'; + +describe('StringConvert tests', () => { + describe('.toSafeInteger', () => { + it('should work as expected', () => { + expect(StringConvert.toSafeInteger('')).toStrictEqual(null); + expect(StringConvert.toSafeInteger(10)).toStrictEqual(10); + expect(StringConvert.toSafeInteger('10')).toStrictEqual(10); + expect(StringConvert.toSafeInteger('32568888')).toStrictEqual(32568888); + expect(StringConvert.toSafeInteger('10.2')).toStrictEqual(null); + expect(StringConvert.toSafeInteger(null)).toStrictEqual(null); + expect(StringConvert.toSafeInteger('-3')).toStrictEqual(-3); + expect(StringConvert.toSafeInteger(undefined)).toStrictEqual(null); + expect(StringConvert.toSafeInteger(null)).toStrictEqual(null); + expect(StringConvert.toSafeInteger(false)).toStrictEqual(null); + expect(StringConvert.toSafeInteger(NaN)).toStrictEqual(null); + }); + }); + + describe('.toFloat', () => { + it('should work as expected', () => { + expect(StringConvert.toFloat(10)).toStrictEqual(10); + expect(StringConvert.toFloat('10.2345')).toStrictEqual(10.2345); + expect(StringConvert.toFloat('.2')).toStrictEqual(0.2); + expect(StringConvert.toFloat('-10.234')).toStrictEqual(-10.234); + expect(StringConvert.toFloat(undefined)).toStrictEqual(null); + expect(StringConvert.toFloat(null)).toStrictEqual(null); + expect(StringConvert.toFloat(NaN)).toStrictEqual(null); + expect(StringConvert.toFloat(false)).toStrictEqual(null); + }); + }); +}); diff --git a/packages/core-lib/src/utils/__tests__/typeguards.test.ts b/packages/core-lib/src/utils/__tests__/typeguards.test.ts new file mode 100644 index 00000000000..c2b0035b8d7 --- /dev/null +++ b/packages/core-lib/src/utils/__tests__/typeguards.test.ts @@ -0,0 +1,40 @@ +import { isNonEmptyString, isParsableNumeric } from '../typeguards'; + +describe('Typeguards tests', () => { + describe('isNonEmptyString', () => { + it('should trim by default', () => { + expect(isNonEmptyString(' ')).toStrictEqual(isNonEmptyString('')); + }); + describe('when trim === true (default)', () => { + it('should work as expected', () => { + expect(isNonEmptyString('cool')).toBeTruthy(); + expect(isNonEmptyString(1)).toBeFalsy(); + expect(isNonEmptyString(' ')).toBeFalsy(); + expect(isNonEmptyString('')).toBeFalsy(); + expect(isNonEmptyString(null)).toBeFalsy(); + expect(isNonEmptyString({})).toBeFalsy(); + }); + }); + describe('when trim === false', () => { + it('should work as expected', () => { + expect(isNonEmptyString('cool ', false)).toBeTruthy(); + expect(isNonEmptyString(' ', false)).toBeTruthy(); + }); + }); + }); + describe('isParsableNumeric', () => { + it('should work as expected', () => { + expect(isParsableNumeric(10)).toBeTruthy(); + expect(isParsableNumeric('100')).toBeTruthy(); + expect(isParsableNumeric('-3')).toBeTruthy(); + expect(isParsableNumeric('2.12')).toBeTruthy(); + expect(isParsableNumeric(NaN)).toBeFalsy(); + expect(isParsableNumeric(undefined)).toBeFalsy(); + expect(isParsableNumeric(null)).toBeFalsy(); + expect(isParsableNumeric(false)).toBeFalsy(); + expect(isParsableNumeric({})).toBeFalsy(); + expect(isParsableNumeric([])).toBeFalsy(); + expect(isParsableNumeric(new Date())).toBeFalsy(); + }); + }); +}); diff --git a/packages/core-lib/src/utils/asserts.ts b/packages/core-lib/src/utils/asserts.ts new file mode 100644 index 00000000000..6b4994eb3aa --- /dev/null +++ b/packages/core-lib/src/utils/asserts.ts @@ -0,0 +1,57 @@ +import { isNonEmptyString } from './typeguards'; + +export class Asserts { + static isPresent( + v: T, + msgOrErrorFactory?: string | (() => Error) + ): asserts v is NonNullable { + if (v === null || v == undefined) { + throw Asserts.createException( + msgOrErrorFactory, + 'Value is null or undefined.' + ); + } + } + + static safeInteger( + v: unknown, + msgOrErrorFactory?: string | (() => Error) + ): asserts v is number { + if (typeof v !== 'number' || !Number.isSafeInteger(v)) { + throw Asserts.createException( + msgOrErrorFactory, + 'Value is not a safe integer' + ); + } + } + + static nonEmptyString( + v: unknown, + msgOrErrorFactory?: string | (() => Error), + /** auto-trim, default true */ + trim?: boolean + ): asserts v is string { + if (!isNonEmptyString(v, trim ?? true)) { + throw Asserts.createException(msgOrErrorFactory); + } + } + + static never(v: never, msg?: string): never { + throw new Error(msg ?? 'Unexpected value'); + } + + private static createException( + msgOrErrorFactory?: string | (() => Error), + fallbackMsg?: string + ) { + if ( + typeof msgOrErrorFactory === 'string' || + msgOrErrorFactory === undefined + ) { + throw new Error( + msgOrErrorFactory ?? fallbackMsg ?? 'Assertion did not pass.' + ); + } + throw msgOrErrorFactory(); + } +} diff --git a/packages/core-lib/src/utils/string-convert.ts b/packages/core-lib/src/utils/string-convert.ts new file mode 100644 index 00000000000..1d34dd6e046 --- /dev/null +++ b/packages/core-lib/src/utils/string-convert.ts @@ -0,0 +1,24 @@ +import { isParsableNumeric, isParsableSafeInteger } from './typeguards'; + +export class StringConvert { + static toSafeInteger = (value: string | unknown): number | null => { + if (!isParsableSafeInteger(value)) { + return null; + } + return typeof value === 'string' ? Number.parseInt(value, 10) : value; + }; + + static toFloat = (value: string | unknown): number | null => { + if ( + !isParsableNumeric( + typeof value === 'number' ? value.toString(10) : value ?? '' + ) + ) { + return null; + } + const v = Number.parseFloat( + typeof value === 'string' ? value : (value as number).toString(10) + ); + return Number.isNaN(v) ? null : v; + }; +} diff --git a/packages/core-lib/src/utils/typeguards.ts b/packages/core-lib/src/utils/typeguards.ts new file mode 100644 index 00000000000..582960fac74 --- /dev/null +++ b/packages/core-lib/src/utils/typeguards.ts @@ -0,0 +1,29 @@ +export const isNonEmptyString = (v: unknown, trim = true): v is string => { + return typeof v === 'string' && (trim ? v.trim() : v).length > 0; +}; + +export const isSafeInteger = (v: unknown): v is number => { + return typeof v === 'number' && Number.isSafeInteger(v); +}; + +export const isParsableNumeric = (v: unknown): v is number | string => { + if (typeof v === 'number' && !Number.isNaN(v)) { + return true; + } + if (!isNonEmptyString(v)) { + return false; + } + return !Number.isNaN( + Number.parseInt(v, 10) || Number.isNaN(Number.parseFloat(v)) + ); +}; + +export const isParsableSafeInteger = (v: unknown): v is number | string => { + const value = + typeof v === 'string' && /^-?\d+$/.test(v) ? Number.parseInt(v, 10) : v; + return isSafeInteger(value); +}; + +export const isHttpStatusCode = (v: unknown): v is number => { + return isSafeInteger(v) && v < 600 && v >= 100; +}; diff --git a/packages/core-lib/tsconfig.jest.json b/packages/core-lib/tsconfig.jest.json new file mode 100644 index 00000000000..7d2013bb774 --- /dev/null +++ b/packages/core-lib/tsconfig.jest.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "jsx": "react-jsx", + "jsxImportSource": "@emotion/react", + "noEmit": true, + "incremental": true, + "noImplicitAny": false, + "declaration": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "isolatedModules": true + } +} diff --git a/yarn.lock b/yarn.lock index 02c273caa8f..5bff4babded 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1332,7 +1332,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.14.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": version: 7.14.0 resolution: "@babel/runtime@npm:7.14.0" dependencies: @@ -2270,6 +2270,44 @@ __metadata: languageName: node linkType: hard +"@next-auth/prisma-legacy-adapter@npm:0.0.1-canary.127": + version: 0.0.1-canary.127 + resolution: "@next-auth/prisma-legacy-adapter@npm:0.0.1-canary.127" + dependencies: + "@babel/runtime": ^7.14.0 + peerDependencies: + "@prisma/client": ^2.16.1 + next-auth: ^3.17.2 + checksum: aafb22a5e0c1acb3733f358bdbc086f4cb00a7d2ee1eca3b942fec8d4315cf057070ba58a20df0c12c878cc8d95d1a5f751bf7d2b51f964a165fd7e0198d3aa2 + languageName: node + linkType: hard + +"@next-auth/typeorm-legacy-adapter@npm:0.0.2-canary.129": + version: 0.0.2-canary.129 + resolution: "@next-auth/typeorm-legacy-adapter@npm:0.0.2-canary.129" + dependencies: + "@babel/runtime": ^7.14.0 + require_optional: ^1.0.1 + typeorm: ^0.2.30 + peerDependencies: + mongodb: ^3.5.9 + mssql: ^6.2.1 + mysql: ^2.18.1 + next-auth: ^3.1.0 + pg: ^8.2.1 + peerDependenciesMeta: + mongodb: + optional: true + mssql: + optional: true + mysql: + optional: true + pg: + optional: true + checksum: fbf0c772359480fd18df9c84011cd923748c967ab520ea48331f05a54b5512f8347c1c03eaa8f60fd4fa2dd8045181d2e93cd5c70c5f49c5a35040d40efc0d72 + languageName: node + linkType: hard + "@next/bundle-analyzer@npm:^10.2.3": version: 10.2.3 resolution: "@next/bundle-analyzer@npm:10.2.3" @@ -2438,6 +2476,13 @@ __metadata: languageName: node linkType: hard +"@panva/asn1.js@npm:^1.0.0": + version: 1.0.0 + resolution: "@panva/asn1.js@npm:1.0.0" + checksum: cb6bcc1918a7f08e81e7d7f5bde83c20a66b30248ddc3ef10b1612e0e0b9f722c2b07ca6b586a089a49c1b6cfb29d63fdd23d4bc00c8cc40538b5595bec66d7d + languageName: node + linkType: hard + "@polka/url@npm:^1.0.0-next.9": version: 1.0.0-next.12 resolution: "@polka/url@npm:1.0.0-next.12" @@ -2583,6 +2628,13 @@ __metadata: languageName: node linkType: hard +"@sqltools/formatter@npm:^1.2.2": + version: 1.2.3 + resolution: "@sqltools/formatter@npm:1.2.3" + checksum: 5d80554b84ed15747fcfa6e488ef794c610c08152a53ebac0f270574ad938cdf39a02de7dfba4e9d9c33a790368f819945d315ee6dae360b220c29e092cba930 + languageName: node + linkType: hard + "@szmarczak/http-timer@npm:^1.1.2": version: 1.1.2 resolution: "@szmarczak/http-timer@npm:1.1.2" @@ -2681,6 +2733,76 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.7 + resolution: "@tsconfig/node10@npm:1.0.7" + checksum: 54c3d90a93c7f0c04a4781403f4ec68f263968380d20e474ef615cec5eacac433b20081c68a084b13cc396bb2d1a1e1ee717592cbe02611b407654c4c50e0178 + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.7 + resolution: "@tsconfig/node12@npm:1.0.7" + checksum: e58704bf5132ca95e39935bbb1825e81ca40e12ec6be5446c54b9e612b5b8c16e81a5ab0e706f8c74883210adf25e4d34115dc38457991aefea37003a72ecad8 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.0 + resolution: "@tsconfig/node14@npm:1.0.0" + checksum: a6e564b91e588bc05d37e2689e009ccd12743f6e1a2532ca7d20ca5e80b4d3b5b324b03e477497f2ebf2311901a369095a36c1c3cf744da7f35486923672c1f0 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.1": + version: 1.0.1 + resolution: "@tsconfig/node16@npm:1.0.1" + checksum: 5fdfd91e48dc1f406cb59d19fd450a594ea6279f3be54a50bd6fd6b8d189a53bb930f2e7d496cbc3bb45fbb23f0ce5c69086f90c796ce8441cbd2a26fb738fd5 + languageName: node + linkType: hard + +"@tsed/core@npm:6.51.0": + version: 6.51.0 + resolution: "@tsed/core@npm:6.51.0" + dependencies: + normalize-path: 3.0.0 + reflect-metadata: ^0.1.13 + source-map-support: 0.5.19 + tslib: 2.1.0 + checksum: 765d84f20068da9a44bf026c9b4b56dd6358f7b0e42dc58b9e90ffd657873337627cf50c692c4ddb9598c4c83ca4db10345e39c17db239d015b7ef1b6c0a6761 + languageName: node + linkType: hard + +"@tsed/exceptions@npm:^6.51.0": + version: 6.51.0 + resolution: "@tsed/exceptions@npm:6.51.0" + dependencies: + "@tsed/schema": 6.51.0 + tslib: 2.1.0 + checksum: 63bf01e8c679f40c756972903641f8322aa8604e15ef50f25a6b644d58ebf703ba18c2c26e938d8246be3f9b1b337051c59ecb5eb1c16202960c3c8e91efee69 + languageName: node + linkType: hard + +"@tsed/openspec@npm:6.51.0": + version: 6.51.0 + resolution: "@tsed/openspec@npm:6.51.0" + checksum: 34b274ed190b9e0b558c09d59d8403072a2e64d39213e4e4a86ec3b0d6b6910adfb1141e3fde7a40aebf849e82e9042b5074bf7b5217afa37e94b6db2784836c + languageName: node + linkType: hard + +"@tsed/schema@npm:6.51.0": + version: 6.51.0 + resolution: "@tsed/schema@npm:6.51.0" + dependencies: + "@tsed/core": 6.51.0 + "@tsed/openspec": 6.51.0 + change-case: 4.1.2 + micromatch: 4.0.2 + tslib: 2.1.0 + checksum: 7441858062489aca38cf7b3323ed8b75470fdb030328f68bc247b93f5519d47370f558eeb0e20f369e41d47c1b00beac48705f4df8321f870ad6265de8c73521 + languageName: node + linkType: hard + "@types/aria-query@npm:^4.2.0": version: 4.2.1 resolution: "@types/aria-query@npm:4.2.1" @@ -2729,6 +2851,13 @@ __metadata: 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/estree@npm:*": version: 0.0.47 resolution: "@types/estree@npm:0.0.47" @@ -2959,6 +3088,13 @@ __metadata: languageName: node linkType: hard +"@types/zen-observable@npm:^0.8.2": + version: 0.8.2 + resolution: "@types/zen-observable@npm:0.8.2" + checksum: 558959fc0482d329cedbd9eabb591849a3dab9574880d3b0781e6916d57cd87fc2268f85d5fe236b58eab8c4063e4aaebd4e9c302b9e56af372d15732c26bb99 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^4.25.0": version: 4.25.0 resolution: "@typescript-eslint/eslint-plugin@npm:4.25.0" @@ -3391,6 +3527,13 @@ __metadata: languageName: node linkType: hard +"any-promise@npm:^1.0.0": + version: 1.3.0 + resolution: "any-promise@npm:1.3.0" + checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de + languageName: node + linkType: hard + "anymatch@npm:^2.0.0": version: 2.0.0 resolution: "anymatch@npm:2.0.0" @@ -3411,6 +3554,13 @@ __metadata: languageName: node linkType: hard +"app-root-path@npm:^3.0.0": + version: 3.0.0 + resolution: "app-root-path@npm:3.0.0" + checksum: ff91a24db2b55070f6b3e22e72ce8fe8ea847e19eb8a3cbb267f9e9ac2a8372db65114dd6798a4ed7897a6f475b90a49330b3e53bf199d47e6abb5c5279aa1d7 + languageName: node + linkType: hard + "aproba@npm:^1.0.3": version: 1.2.0 resolution: "aproba@npm:1.2.0" @@ -3428,6 +3578,13 @@ __metadata: languageName: node linkType: hard +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -3885,7 +4042,7 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.0.2": +"base64-js@npm:^1.0.2, base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 @@ -4222,6 +4379,13 @@ __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-from@npm:1.x, buffer-from@npm:^1.0.0": version: 1.1.1 resolution: "buffer-from@npm:1.1.1" @@ -4257,6 +4421,16 @@ __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.1.0": version: 3.2.0 resolution: "builtin-modules@npm:3.2.0" @@ -4391,6 +4565,16 @@ __metadata: languageName: node linkType: hard +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: ^3.1.2 + tslib: ^2.0.3 + checksum: bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6 + languageName: node + linkType: hard + "camelcase-css@npm:^2.0.1": version: 2.0.1 resolution: "camelcase-css@npm:2.0.1" @@ -4449,6 +4633,17 @@ __metadata: languageName: node linkType: hard +"capital-case@npm:^1.0.4": + version: 1.0.4 + resolution: "capital-case@npm:1.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + upper-case-first: ^2.0.2 + checksum: 41fa8fa87f6d24d0835a2b4a9341a3eaecb64ac29cd7c5391f35d6175a0fa98ab044e7f2602e1ec3afc886231462ed71b5b80c590b8b41af903ec2c15e5c5931 + languageName: node + linkType: hard + "capture-exit@npm:^2.0.0": version: 2.0.0 resolution: "capture-exit@npm:2.0.0" @@ -4486,7 +4681,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^1.0.0, chalk@npm:^1.1.3": +"chalk@npm:^1.0.0, chalk@npm:^1.1.1, chalk@npm:^1.1.3": version: 1.1.3 resolution: "chalk@npm:1.1.3" dependencies: @@ -4519,6 +4714,26 @@ __metadata: languageName: node linkType: hard +"change-case@npm:4.1.2": + version: 4.1.2 + resolution: "change-case@npm:4.1.2" + dependencies: + camel-case: ^4.1.2 + capital-case: ^1.0.4 + constant-case: ^3.0.4 + dot-case: ^3.0.4 + header-case: ^2.0.4 + no-case: ^3.0.4 + param-case: ^3.0.4 + pascal-case: ^3.1.2 + path-case: ^3.0.4 + sentence-case: ^3.0.4 + snake-case: ^3.0.4 + tslib: ^2.0.3 + checksum: e4bc4a093a1f7cce8b33896665cf9e456e3bc3cc0def2ad7691b1994cfca99b3188d0a513b16855b01a6bd20692fcde12a7d4d87a5615c4c515bbbf0e651f116 + languageName: node + linkType: hard + "char-regex@npm:^1.0.2": version: 1.0.2 resolution: "char-regex@npm:1.0.2" @@ -4646,6 +4861,22 @@ __metadata: languageName: node linkType: hard +"cli-highlight@npm:^2.1.10": + version: 2.1.11 + resolution: "cli-highlight@npm:2.1.11" + dependencies: + chalk: ^4.0.0 + highlight.js: ^10.7.1 + mz: ^2.4.0 + parse5: ^5.1.1 + parse5-htmlparser2-tree-adapter: ^6.0.0 + yargs: ^16.0.0 + bin: + highlight: bin/highlight + checksum: 0a60e60545e39efea78c1732a25b91692017ec40fb6e9497208dc0eeeae69991d3923a8d6e4edd0543db3c395ed14529a33dd4d0353f1679c5b6dded792a8496 + languageName: node + linkType: hard + "cli-table@npm:^0.3.6": version: 0.3.6 resolution: "cli-table@npm:0.3.6" @@ -4909,6 +5140,17 @@ __metadata: languageName: node linkType: hard +"constant-case@npm:^3.0.4": + version: 3.0.4 + resolution: "constant-case@npm:3.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + upper-case: ^2.0.2 + checksum: 6c3346d51afc28d9fae922e966c68eb77a19d94858dba230dd92d7b918b37d36db50f0311e9ecf6847e43e934b1c01406a0936973376ab17ec2c471fbcfb2cf3 + languageName: node + linkType: hard + "constants-browserify@npm:1.0.0, constants-browserify@npm:^1.0.0": version: 1.0.0 resolution: "constants-browserify@npm:1.0.0" @@ -4994,6 +5236,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:^5.0.0": version: 5.2.1 resolution: "cosmiconfig@npm:5.2.1" @@ -5069,6 +5321,13 @@ __metadata: languageName: node linkType: hard +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + "cross-env@npm:^7.0.3": version: 7.0.3 resolution: "cross-env@npm:7.0.3" @@ -5691,6 +5950,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.0": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -5800,6 +6066,16 @@ __metadata: languageName: node linkType: hard +"dot-case@npm:^3.0.4": + version: 3.0.4 + resolution: "dot-case@npm:3.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + checksum: a65e3519414856df0228b9f645332f974f2bf5433370f544a681122eab59e66038fc3349b4be1cdc47152779dac71a5864f1ccda2f745e767c46e9c6543b1169 + languageName: node + linkType: hard + "dot-prop@npm:^5.1.0, dot-prop@npm:^5.2.0": version: 5.3.0 resolution: "dot-prop@npm:5.3.0" @@ -5809,7 +6085,29 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^8.1.0": +"dotenv-flow-cli@npm:^1.0.0": + version: 1.0.0 + resolution: "dotenv-flow-cli@npm:1.0.0" + dependencies: + cross-spawn: ^7.0.3 + dotenv-flow: "*" + minimist: ^1.2.5 + bin: + dotenv-flow: cli.js + checksum: 64feffe0d51bd0a5d72d705390fe015ff02b7cc62242ede83ab538bebe9fbc5af7fe76a605bb1bf5c3da9066ed1d94eb090d4cf5b7ddd101c407391707b3aa1a + languageName: node + linkType: hard + +"dotenv-flow@npm:*, dotenv-flow@npm:^3.2.0": + version: 3.2.0 + resolution: "dotenv-flow@npm:3.2.0" + dependencies: + dotenv: ^8.0.0 + checksum: 8e34ea8f5cb216acb0f9cc602752dceef6e1c0b52c39045d6b92fadbefcbfecaf0cc868d3e115c9764860293d62d0bb31d46cfa41d29cb9fc7039797e20de03e + languageName: node + linkType: hard + +"dotenv@npm:^8.0.0, dotenv@npm:^8.1.0, dotenv@npm:^8.2.0": version: 8.6.0 resolution: "dotenv@npm:8.6.0" checksum: 38e902c80b0666ab59e9310a3d24ed237029a7ce34d976796349765ac96b8d769f6df19090f1f471b77a25ca391971efde8a1ea63bb83111bd8bec8e5cc9b2cd @@ -5847,6 +6145,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 + "electron-to-chromium@npm:^1.3.723": version: 1.3.728 resolution: "electron-to-chromium@npm:1.3.728" @@ -6671,6 +6978,13 @@ __metadata: languageName: node linkType: hard +"figlet@npm:^1.1.1": + version: 1.5.0 + resolution: "figlet@npm:1.5.0" + checksum: 89641163b38f6f76e798d878cc6ba04cf978f6962c54f52521bc6630fd6cfb4d2cbc2cb97465a8049bf0e84a22a47159da3264590dfd307d45e39f23bc4087df + languageName: node + linkType: hard + "figures@npm:^1.0.1": version: 1.7.0 resolution: "figures@npm:1.7.0" @@ -6954,6 +7268,13 @@ __metadata: languageName: node linkType: hard +"futoin-hkdf@npm:^1.3.2": + version: 1.3.3 + resolution: "futoin-hkdf@npm:1.3.3" + checksum: 7863236ce6a6d38ce0978384b5046f03714bd8511ac080d5581defb0b41dd9da1b33e9b07f763c3afae4e58b149d695e2d7776b14cb257ca78ee03d1c047d01f + languageName: node + linkType: hard + "gauge@npm:~2.7.3": version: 2.7.4 resolution: "gauge@npm:2.7.4" @@ -7435,6 +7756,16 @@ __metadata: languageName: node linkType: hard +"header-case@npm:^2.0.4": + version: 2.0.4 + resolution: "header-case@npm:2.0.4" + dependencies: + capital-case: ^1.0.4 + tslib: ^2.0.3 + checksum: 571c83eeb25e8130d172218712f807c0b96d62b020981400bccc1503a7cf14b09b8b10498a962d2739eccf231d950e3848ba7d420b58a6acd2f9283439546cd9 + languageName: node + linkType: hard + "hex-color-regex@npm:^1.1.0": version: 1.1.0 resolution: "hex-color-regex@npm:1.1.0" @@ -7442,6 +7773,13 @@ __metadata: languageName: node linkType: hard +"highlight.js@npm:^10.7.1": + version: 10.7.2 + resolution: "highlight.js@npm:10.7.2" + checksum: af09b434070c81ed154b4c990bee61a8c1295887554abc7884eb2544c48bff208e237e7ce1b324ebe94abe0f942e15e2c11dff1b1ed22a79a3c4a0d8a900a921 + languageName: node + linkType: hard + "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" @@ -7647,7 +7985,7 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.1.4": +"ieee754@npm:^1.1.4, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e @@ -8968,6 +9306,15 @@ __metadata: languageName: node linkType: hard +"jose@npm:^1.27.2": + version: 1.28.1 + resolution: "jose@npm:1.28.1" + dependencies: + "@panva/asn1.js": ^1.0.0 + checksum: b91458949df7df08810b7a896a10751f25d3108dfcc41af138dc01e8e5bf7f90ea510cdb3d6bc37e3a293ec7d5cc26fb587de7ce15785a8109892c412e5c0416 + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -9188,6 +9535,24 @@ __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 + "jsprim@npm:^1.2.2": version: 1.4.1 resolution: "jsprim@npm:1.4.1" @@ -9210,6 +9575,27 @@ __metadata: 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 + "keyv@npm:^3.0.0": version: 3.1.0 resolution: "keyv@npm:3.1.0" @@ -9491,6 +9877,34 @@ __metadata: 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" @@ -9498,6 +9912,13 @@ __metadata: 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.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -9512,6 +9933,13 @@ __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" @@ -9594,6 +10022,15 @@ __metadata: languageName: node linkType: hard +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010 + languageName: node + linkType: hard + "lowercase-keys@npm:^1.0.0, lowercase-keys@npm:^1.0.1": version: 1.0.1 resolution: "lowercase-keys@npm:1.0.1" @@ -9654,7 +10091,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:1.x": +"make-error@npm:1.x, make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -9887,6 +10324,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:4.0.2": + version: 4.0.2 + resolution: "micromatch@npm:4.0.2" + dependencies: + braces: ^3.0.1 + picomatch: ^2.0.5 + checksum: 39590a96d9ffad21f0afac044d0a5af4f33715a16fdd82c53a01c8f5ff6f70832a31b53e52972dac3deff8bf9f0bed0207d1c34e54ab3306a5e4c4efd5f7d249 + languageName: node + linkType: hard + "micromatch@npm:^3.1.4": version: 3.1.10 resolution: "micromatch@npm:3.1.10" @@ -10176,6 +10623,17 @@ __metadata: languageName: node linkType: hard +"mz@npm:^2.4.0": + version: 2.7.0 + resolution: "mz@npm:2.7.0" + dependencies: + any-promise: ^1.0.0 + object-assign: ^4.0.1 + thenify-all: ^1.0.0 + checksum: 8427de0ece99a07e9faed3c0c6778820d7543e3776f9a84d22cf0ec0a8eb65f6e9aee9c9d353ff9a105ff62d33a9463c6ca638974cc652ee8140cd1e35951c87 + languageName: node + linkType: hard + "nanoid@npm:^3.1.22, nanoid@npm:^3.1.23": version: 3.1.23 resolution: "nanoid@npm:3.1.23" @@ -10220,6 +10678,38 @@ __metadata: languageName: node linkType: hard +"next-auth@npm:^3.23.3": + version: 3.23.3 + resolution: "next-auth@npm:3.23.3" + dependencies: + "@babel/runtime": ^7.14.0 + "@next-auth/prisma-legacy-adapter": 0.0.1-canary.127 + "@next-auth/typeorm-legacy-adapter": 0.0.2-canary.129 + futoin-hkdf: ^1.3.2 + jose: ^1.27.2 + jsonwebtoken: ^8.5.1 + nodemailer: ^6.4.16 + oauth: ^0.9.15 + pkce-challenge: ^2.1.0 + preact: ^10.4.1 + preact-render-to-string: ^5.1.14 + querystring: ^0.2.0 + peerDependencies: + react: ^16.13.1 || ^17 + react-dom: ^16.13.1 || ^17 + checksum: 8157140d2de3c99debcded326a7f3eb3888b49c925279d1abb82364ee9dd7285369f11b3870db20999cb4c9026b375e9b7b31004375f3b0e6f9a14753f050742 + languageName: node + linkType: hard + +"next-connect@npm:^0.10.1": + version: 0.10.1 + resolution: "next-connect@npm:0.10.1" + dependencies: + trouter: ^3.1.0 + checksum: 74aba53585b48a2a15d2a65502d0fee548a4d94113d0fd57fbf75bf682b7673709b9fb30765ddb03ca86992d17e02cd65fa31f64e6fb3d2cf90f3608e32be659 + languageName: node + linkType: hard + "next-secure-headers@npm:^2.2.0": version: 2.2.0 resolution: "next-secure-headers@npm:2.2.0" @@ -10347,6 +10837,16 @@ __metadata: languageName: node linkType: hard +"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 + "node-emoji@npm:^1.8.1": version: 1.10.0 resolution: "node-emoji@npm:1.10.0" @@ -10478,6 +10978,13 @@ __metadata: languageName: node linkType: hard +"nodemailer@npm:^6.4.16": + version: 6.6.1 + resolution: "nodemailer@npm:6.6.1" + checksum: b9211533ec45c3b39636c2dd095902be9a528c70c0da44e69a143a98345944c49d6e6d8584bf729d81160ab771048b73cabda97046ba4faa7c937b015cfcb174 + languageName: node + linkType: hard + "nopt@npm:^5.0.0": version: 5.0.0 resolution: "nopt@npm:5.0.0" @@ -10513,6 +11020,13 @@ __metadata: languageName: node linkType: hard +"normalize-path@npm:3.0.0, normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + "normalize-path@npm:^2.1.1": version: 2.1.1 resolution: "normalize-path@npm:2.1.1" @@ -10522,13 +11036,6 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - "normalize-range@npm:^0.1.2": version: 0.1.2 resolution: "normalize-range@npm:0.1.2" @@ -10746,7 +11253,14 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": +"oauth@npm:^0.9.15": + version: 0.9.15 + resolution: "oauth@npm:0.9.15" + checksum: 957c0d8d85300398dcb0e293953650c0fc3facc795bee8228238414f19f59cef5fd4ee8d17a972c142924c10c5f6ec50ef80f77f4a6cc6e3c98f9d22c027801c + 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 @@ -11145,6 +11659,16 @@ __metadata: languageName: node linkType: hard +"param-case@npm:^3.0.4": + version: 3.0.4 + resolution: "param-case@npm:3.0.4" + dependencies: + dot-case: ^3.0.4 + tslib: ^2.0.3 + checksum: b34227fd0f794e078776eb3aa6247442056cb47761e9cd2c4c881c86d84c64205f6a56ef0d70b41ee7d77da02c3f4ed2f88e3896a8fefe08bdfb4deca037c687 + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" @@ -11154,6 +11678,13 @@ __metadata: languageName: node linkType: hard +"parent-require@npm:^1.0.0": + version: 1.0.0 + resolution: "parent-require@npm:1.0.0" + checksum: 91ecef2c8e0ecc06a7d68ebdfccec9cb8b34a7144cccda0141273c8871d4dd05856fe13b17ae1e1a32bfd769143671a6dbd2ad7ee72f55d1cb8e588dc60a8f4c + languageName: node + linkType: hard + "parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": version: 5.1.6 resolution: "parse-asn1@npm:5.1.6" @@ -11210,13 +11741,39 @@ __metadata: languageName: node linkType: hard -"parse5@npm:6.0.1": +"parse5-htmlparser2-tree-adapter@npm:^6.0.0": + version: 6.0.1 + resolution: "parse5-htmlparser2-tree-adapter@npm:6.0.1" + dependencies: + parse5: ^6.0.1 + checksum: 1848378b355d027915645c13f13f982e60502d201f53bc2067a508bf2dba4aac08219fc781dcd160167f5f50f0c73f58d20fa4fb3d90ee46762c20234fa90a6d + languageName: node + linkType: hard + +"parse5@npm:6.0.1, parse5@npm:^6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd languageName: node linkType: hard +"parse5@npm:^5.1.1": + version: 5.1.1 + resolution: "parse5@npm:5.1.1" + checksum: 613a714af4c1101d1cb9f7cece2558e35b9ae8a0c03518223a4a1e35494624d9a9ad5fad4c13eab66a0e0adccd9aa3d522fc8f5f9cc19789e0579f3fa0bdfc65 + languageName: node + linkType: hard + +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + checksum: ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e + languageName: node + linkType: hard + "pascalcase@npm:^0.1.1": version: 0.1.1 resolution: "pascalcase@npm:0.1.1" @@ -11238,6 +11795,16 @@ __metadata: languageName: node linkType: hard +"path-case@npm:^3.0.4": + version: 3.0.4 + resolution: "path-case@npm:3.0.4" + dependencies: + dot-case: ^3.0.4 + tslib: ^2.0.3 + checksum: 61de0526222629f65038a66f63330dd22d5b54014ded6636283e1d15364da38b3cf29e4433aa3f9d8b0dba407ae2b059c23b0104a34ee789944b1bc1c5c7e06d + languageName: node + linkType: hard + "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -11316,10 +11883,10 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3": - version: 2.2.3 - resolution: "picomatch@npm:2.2.3" - checksum: 45e2b882b5265d3a322c6b7b854c1fdc33d5083011b9730296e9ad26332824ac356529f1ce1b0c1111f08a84c02e8525ea121d17c4bbe2970ca6665e587921fa +"picomatch@npm:^2.0.4, picomatch@npm:^2.0.5, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3": + version: 2.3.0 + resolution: "picomatch@npm:2.3.0" + checksum: 16818720ea7c5872b6af110760dee856c8e4cd79aed1c7a006d076b1cc09eff3ae41ca5019966694c33fbd2e1cc6ea617ab10e4adac6df06556168f13be3fca2 languageName: node linkType: hard @@ -11362,6 +11929,13 @@ __metadata: languageName: node linkType: hard +"pkce-challenge@npm:^2.1.0": + version: 2.2.0 + resolution: "pkce-challenge@npm:2.2.0" + checksum: f1ab8af2513e0088e691edb3397ea2c14ffd9ae51ecfabc08be2e5a97a09f93f776769022efa0536de5fd6caac40de9a6d7ac38d49ee6efcabd87c87deda94bf + languageName: node + linkType: hard + "pkg-dir@npm:^2.0.0": version: 2.0.0 resolution: "pkg-dir@npm:2.0.0" @@ -11905,6 +12479,24 @@ __metadata: languageName: node linkType: hard +"preact-render-to-string@npm:^5.1.14": + version: 5.1.19 + resolution: "preact-render-to-string@npm:5.1.19" + dependencies: + pretty-format: ^3.8.0 + peerDependencies: + preact: ">=10" + checksum: b8b454d7b4bd93d6dcfc5e1269cfef1756e850c524e80340be62b88582cb88eb926a3edc0088f4dc2a454f56c1e09faa10bced081f25204342fd338275aa5af1 + languageName: node + linkType: hard + +"preact@npm:^10.4.1": + version: 10.5.13 + resolution: "preact@npm:10.5.13" + checksum: afc22da600977935dd0c69c7b69f54d44cdf5d0bc50a6a1a47eafb55cce9c6bf126213b6e842f8079e7e6aca77ea763478eaba6ff75eb5bcb998273bc15b74d1 + languageName: node + linkType: hard + "preferred-pm@npm:^3.0.0": version: 3.0.3 resolution: "preferred-pm@npm:3.0.3" @@ -11993,6 +12585,13 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^3.8.0": + version: 3.8.0 + resolution: "pretty-format@npm:3.8.0" + checksum: 21a114d43ef06978f8f7f6212be4649b0b094f05d9b30e14e37550bf35c8ca24d8adbca9e5adc4cc15d9eaf7a1e7a30478a4dc37b30982bfdf0292a5b385484c + languageName: node + linkType: hard + "pretty-hrtime@npm:^1.0.3": version: 1.0.3 resolution: "pretty-hrtime@npm:1.0.3" @@ -12460,6 +13059,13 @@ __metadata: 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 + "regenerate-unicode-properties@npm:^8.2.0": version: 8.2.0 resolution: "regenerate-unicode-properties@npm:8.2.0" @@ -12512,6 +13118,13 @@ __metadata: languageName: node linkType: hard +"regexparam@npm:^1.3.0": + version: 1.3.0 + resolution: "regexparam@npm:1.3.0" + checksum: ea6449d9984392cdf401d3d9b722a56357224fba7e9fdf2887f1901e0d3a838052d3b92b30f2276047bf5d5b6a1a90b7dff6aa1c89599b246a86285e7e3e3fd4 + languageName: node + linkType: hard + "regexpp@npm:^3.0.0, regexpp@npm:^3.1.0": version: 3.1.0 resolution: "regexpp@npm:3.1.0" @@ -12679,6 +13292,16 @@ __metadata: languageName: node linkType: hard +"require_optional@npm:^1.0.1": + version: 1.0.1 + resolution: "require_optional@npm:1.0.1" + dependencies: + resolve-from: ^2.0.0 + semver: ^5.1.0 + checksum: 64aed45ccff138e3e8abfa104de6f9bd324d27408228dbe0902049f586a2a80caf885e162b4724ee9dd5a2a0369987e8b5c5db86f5eb48a98a9f7c7d00b5c5a5 + languageName: node + linkType: hard + "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -12695,6 +13318,13 @@ __metadata: languageName: node linkType: hard +"resolve-from@npm:^2.0.0": + version: 2.0.0 + resolution: "resolve-from@npm:2.0.0" + checksum: 02db4c30fecddef0efafbafb2d66b96c4a80f91d103d9850be3b85d1feb65b6af6c818d137dc546cea7d0288c21e13aa0fb4580af9af34b08052b3516690c5f3 + languageName: node + linkType: hard + "resolve-from@npm:^3.0.0": version: 3.0.0 resolution: "resolve-from@npm:3.0.0" @@ -13045,7 +13675,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"sax@npm:~1.2.4": +"sax@npm:>=0.6.0, sax@npm:~1.2.4": version: 1.2.4 resolution: "sax@npm:1.2.4" checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe @@ -13094,7 +13724,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.4.1, semver@npm:^5.5.0": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.1.0, semver@npm:^5.4.1, semver@npm:^5.5.0, semver@npm:^5.6.0": version: 5.7.1 resolution: "semver@npm:5.7.1" bin: @@ -13132,6 +13762,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"sentence-case@npm:^3.0.4": + version: 3.0.4 + resolution: "sentence-case@npm:3.0.4" + dependencies: + no-case: ^3.0.4 + tslib: ^2.0.3 + upper-case-first: ^2.0.2 + checksum: 3cfe6c0143e649132365695706702d7f729f484fa7b25f43435876efe7af2478243eefb052bacbcce10babf9319fd6b5b6bc59b94c80a1c819bcbb40651465d5 + languageName: node + linkType: hard + "serialize-javascript@npm:^4.0.0": version: 4.0.0 resolution: "serialize-javascript@npm:4.0.0" @@ -13174,7 +13815,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": version: 2.4.11 resolution: "sha.js@npm:2.4.11" dependencies: @@ -13328,6 +13969,16 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"snake-case@npm:^3.0.4": + version: 3.0.4 + resolution: "snake-case@npm:3.0.4" + dependencies: + dot-case: ^3.0.4 + tslib: ^2.0.3 + checksum: 0a7a79900bbb36f8aaa922cf111702a3647ac6165736d5dc96d3ef367efc50465cac70c53cd172c382b022dac72ec91710608e5393de71f76d7142e6fd80e8a3 + languageName: node + linkType: hard + "snapdragon-node@npm:^2.0.1": version: 2.1.1 resolution: "snapdragon-node@npm:2.1.1" @@ -13415,7 +14066,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"source-map-support@npm:^0.5.6, source-map-support@npm:~0.5.19": +"source-map-support@npm:0.5.19, source-map-support@npm:^0.5.17, source-map-support@npm:^0.5.6, source-map-support@npm:~0.5.19": version: 0.5.19 resolution: "source-map-support@npm:0.5.19" dependencies: @@ -14225,6 +14876,24 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"thenify-all@npm:^1.0.0": + version: 1.6.0 + resolution: "thenify-all@npm:1.6.0" + dependencies: + thenify: ">= 3.1.0 < 4" + checksum: dba7cc8a23a154cdcb6acb7f51d61511c37a6b077ec5ab5da6e8b874272015937788402fd271fdfc5f187f8cb0948e38d0a42dcc89d554d731652ab458f5343e + languageName: node + linkType: hard + +"thenify@npm:>= 3.1.0 < 4": + version: 3.3.1 + resolution: "thenify@npm:3.3.1" + dependencies: + any-promise: ^1.0.0 + checksum: 84e1b804bfec49f3531215f17b4a6e50fd4397b5f7c1bccc427b9c656e1ecfb13ea79d899930184f78bc2f57285c54d9a50a590c8868f4f0cef5c1d9f898b05e + languageName: node + linkType: hard + "throat@npm:^5.0.0": version: 5.0.0 resolution: "throat@npm:5.0.0" @@ -14418,6 +15087,15 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"trouter@npm:^3.1.0": + version: 3.2.0 + resolution: "trouter@npm:3.2.0" + dependencies: + regexparam: ^1.3.0 + checksum: 50beb18d4cf0239fe5ee81368d59f08b25298869d169d39c35b1c1d142e922025e14a648989382da70d4064d2ac7900b4348401caa0a235c3cccabaaa85351ef + languageName: node + linkType: hard + "ts-jest@npm:^26.5.6": version: 26.5.6 resolution: "ts-jest@npm:26.5.6" @@ -14441,6 +15119,40 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"ts-node@npm:^10.0.0": + version: 10.0.0 + resolution: "ts-node@npm:10.0.0" + dependencies: + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + source-map-support: ^0.5.17 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.45" + "@swc/wasm": ">=1.2.45" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 96d633774e13eb90ad49d644f397e99f5da72818e36040bf5b6bd66d0ab369dbb4348e499193c0fa45071f8e9559bb7724174139389e56bb562db36a3842484e + languageName: node + linkType: hard + "ts-pnp@npm:^1.1.6": version: 1.2.0 resolution: "ts-pnp@npm:1.2.0" @@ -14470,6 +15182,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"tslib@npm:2.1.0": + version: 2.1.0 + resolution: "tslib@npm:2.1.0" + checksum: aa189c8179de0427b0906da30926fd53c59d96ec239dff87d6e6bc831f608df0cbd6f77c61dabc074408bd0aa0b9ae4ec35cb2c15f729e32f37274db5730cb78 + languageName: node + linkType: hard + "tslib@npm:^1.8.1, tslib@npm:^1.9.0": version: 1.14.1 resolution: "tslib@npm:1.14.1" @@ -14477,7 +15196,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"tslib@npm:^2.0.3": +"tslib@npm:^2.0.3, tslib@npm:^2.1.0": version: 2.2.0 resolution: "tslib@npm:2.2.0" checksum: a48c9639f7496fa701ea8ffe0561070fcb44c104a59632f7f845c0af00825c99b6373575ec59b2b5cdbfd7505875086dbe5dc83312304d8979f22ce571218ca3 @@ -14624,6 +15343,33 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"typeorm@npm:^0.2.30": + version: 0.2.32 + resolution: "typeorm@npm:0.2.32" + dependencies: + "@sqltools/formatter": ^1.2.2 + app-root-path: ^3.0.0 + buffer: ^6.0.3 + chalk: ^4.1.0 + cli-highlight: ^2.1.10 + 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 + xml2js: ^0.4.23 + yargonaut: ^1.1.4 + yargs: ^16.2.0 + zen-observable-ts: ^1.0.0 + bin: + typeorm: cli.js + checksum: 5163a41b56be509271e07c577bbd88b3a065fa5596b61e82f0d26158de3d46df89fa3eb8967b5deaa97511ba58b892bcbb5b360f778776f8ec73c5eae5710dec + languageName: node + linkType: hard + "typescript@^4.1.3, typescript@^4.2.4": version: 4.2.4 resolution: "typescript@npm:4.2.4" @@ -14807,6 +15553,24 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"upper-case-first@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case-first@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 4487db4701effe3b54ced4b3e4aa4d9ab06c548f97244d04aafb642eedf96a76d5a03cf5f38f10f415531d5792d1ac6e1b50f2a76984dc6964ad530f12876409 + languageName: node + linkType: hard + +"upper-case@npm:^2.0.2": + version: 2.0.2 + resolution: "upper-case@npm:2.0.2" + dependencies: + tslib: ^2.0.3 + checksum: 508723a2b03ab90cf1d6b7e0397513980fab821cbe79c87341d0e96cedefadf0d85f9d71eac24ab23f526a041d585a575cfca120a9f920e44eb4f8a7cf89121c + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -14966,6 +15730,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"vary@npm:^1": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b + languageName: node + linkType: hard + "vendors@npm:^1.0.0": version: 1.0.4 resolution: "vendors@npm:1.0.4" @@ -15052,6 +15823,8 @@ resolve@^2.0.0-next.3: "@testing-library/jest-dom": ^5.12.0 "@testing-library/react": ^11.2.7 "@testing-library/react-hooks": ^6.0.0 + "@tsed/exceptions": ^6.51.0 + "@types/cors": ^2.8.10 "@types/jest": ^26.0.23 "@types/node": ^15.6.1 "@types/react": ^17.0.7 @@ -15062,7 +15835,10 @@ resolve@^2.0.0-next.3: "@your-org/ui-lib": "workspace:*" autoprefixer: ^10.2.5 camelcase: ^6.2.0 + cors: ^2.8.5 cross-env: ^7.0.3 + dotenv-flow: ^3.2.0 + dotenv-flow-cli: ^1.0.0 eslint: ^7.27.0 eslint-config-prettier: ^8.3.0 eslint-plugin-import: 2.23.3 @@ -15076,6 +15852,8 @@ resolve@^2.0.0-next.3: jest-circus: ^26.6.3 jest-cli: ^26.6.3 next: ^10.2.3 + next-auth: ^3.23.3 + next-connect: ^0.10.1 next-secure-headers: ^2.2.0 next-seo: ^4.24.0 next-transpile-modules: ^7.2.0 @@ -15092,6 +15870,7 @@ resolve@^2.0.0-next.3: sync-directory: ^2.2.22 tailwindcss: ^2.1.2 ts-jest: ^26.5.6 + ts-node: ^10.0.0 typescript: ^4.2.4 languageName: unknown linkType: soft @@ -15345,6 +16124,23 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"xml2js@npm:^0.4.23": + 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" @@ -15394,6 +16190,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"yargonaut@npm:^1.1.4": + version: 1.1.4 + resolution: "yargonaut@npm:1.1.4" + dependencies: + chalk: ^1.1.1 + figlet: ^1.1.1 + parent-require: ^1.0.0 + checksum: d0ffc310a761782ae38022d88e13e84486080b2be2c43e8d5cbb987e40c3d2dd18274c39ce34e05d6bc312a4e768cd4c469d338ed60409adf6f4d870017c63a3 + languageName: node + linkType: hard + "yargs-parser@npm:20.x, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.7 resolution: "yargs-parser@npm:20.2.7" @@ -15430,7 +16237,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"yargs@npm:^16.2.0": +"yargs@npm:^16.0.0, yargs@npm:^16.2.0": version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: @@ -15445,9 +16252,33 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 languageName: node linkType: hard + +"zen-observable-ts@npm:^1.0.0": + version: 1.0.0 + resolution: "zen-observable-ts@npm:1.0.0" + dependencies: + "@types/zen-observable": ^0.8.2 + zen-observable: ^0.8.15 + checksum: 536259a29cbd47a424f6d8af7bfffbb3e9c49a7e7f65c0b49a9b0afb29597daca69bba68a8840e7fc1a36da2ea9000065eff665d75d3111e8084b5b37d763b90 + languageName: node + linkType: hard + +"zen-observable@npm:^0.8.15": + version: 0.8.15 + resolution: "zen-observable@npm:0.8.15" + checksum: b7289084bc1fc74a559b7259faa23d3214b14b538a8843d2b001a35e27147833f4107590b1b44bf5bc7f6dfe6f488660d3a3725f268e09b3925b3476153b7821 + languageName: node + linkType: hard