diff --git a/packages/core/jest.config.js b/packages/core/jest.config.js index adc71677f..a1f7f1868 100644 --- a/packages/core/jest.config.js +++ b/packages/core/jest.config.js @@ -7,4 +7,7 @@ module.exports = { tsconfig: 'tsconfig.test.json', }, }, + moduleNameMapper: { + '^@/(.*)$': '/src/$1', + }, }; diff --git a/packages/core/package.json b/packages/core/package.json index ae63f3172..0cffff7f3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -9,9 +9,9 @@ "scripts": { "preinstall": "npx only-allow pnpm", "precommit": "lint-staged", - "build": "rm -rf build/ && tsc", + "build": "rm -rf build/ && tsc -p tsconfig.build.json", "lint": "eslint --ext .ts src", - "dev": "rm -rf build/ && tsc-watch --preserveWatchOutput --onSuccess \"node ./build/index.js\"", + "dev": "rm -rf build/ && tsc-watch -p tsconfig.build.json --preserveWatchOutput --onSuccess \"node ./build/index.js\"", "start": "NODE_ENV=production node build/index.js", "test": "jest" }, @@ -42,8 +42,8 @@ "zod": "^3.8.1" }, "devDependencies": { - "@logto/eslint-config": "^0.1.0-rc.18", - "@logto/ts-config": "^0.1.0-rc.18", + "@logto/eslint-config": "^0.1.0-rc.24", + "@logto/ts-config": "^0.1.0-rc.24", "@types/jest": "^27.0.1", "@types/koa": "^2.13.3", "@types/koa-logger": "^3.1.1", diff --git a/packages/core/src/app/init.ts b/packages/core/src/app/init.ts index bf97415fb..849bd9e17 100644 --- a/packages/core/src/app/init.ts +++ b/packages/core/src/app/init.ts @@ -1,10 +1,11 @@ -import https from 'https'; import fs from 'fs/promises'; +import https from 'https'; + import Koa from 'koa'; import koaLogger from 'koa-logger'; -import koaErrorHandler from '@/middleware/koa-error-handler'; import { port } from '@/env/consts'; +import koaErrorHandler from '@/middleware/koa-error-handler'; import koaUIProxy from '@/middleware/koa-ui-proxy'; import initOidc from '@/oidc/init'; import initRouter from '@/routes/init'; diff --git a/packages/core/src/database/insert-into.ts b/packages/core/src/database/insert-into.ts index 8ea5def47..1c0b6e4e4 100644 --- a/packages/core/src/database/insert-into.ts +++ b/packages/core/src/database/insert-into.ts @@ -1,7 +1,10 @@ import assert from 'assert'; -import RequestError from '@/errors/RequestError'; + import { SchemaLike, GeneratedSchema } from '@logto/schemas'; import { DatabasePoolType, IdentifierSqlTokenType, sql } from 'slonik'; + +import RequestError from '@/errors/RequestError'; + import { conditionalSql, convertToIdentifiers, diff --git a/packages/core/src/database/pool.ts b/packages/core/src/database/pool.ts index cdd826b93..c7b668ebb 100644 --- a/packages/core/src/database/pool.ts +++ b/packages/core/src/database/pool.ts @@ -1,5 +1,6 @@ import { createPool } from 'slonik'; import { createInterceptors } from 'slonik-interceptor-preset'; + import { getEnv } from '@/utils/env'; const interceptors = [...createInterceptors()]; diff --git a/packages/core/src/database/update-where.ts b/packages/core/src/database/update-where.ts index 077b58d7e..500672e25 100644 --- a/packages/core/src/database/update-where.ts +++ b/packages/core/src/database/update-where.ts @@ -1,9 +1,12 @@ import assert from 'assert'; -import RequestError from '@/errors/RequestError'; + +import { notFalsy, Truthy } from '@logto/essentials'; import { SchemaLike, GeneratedSchema } from '@logto/schemas'; import { DatabasePoolType, sql } from 'slonik'; + +import RequestError from '@/errors/RequestError'; import { isKeyOf } from '@/utils/schema'; -import { notFalsy, Truthy } from '@logto/essentials'; + import { conditionalSql, convertToIdentifiers, convertToPrimitiveOrSql } from './utils'; export type UpdateWhereData = { diff --git a/packages/core/src/database/utils.test.ts b/packages/core/src/database/utils.test.ts index 5ea753359..b1d3976d5 100644 --- a/packages/core/src/database/utils.test.ts +++ b/packages/core/src/database/utils.test.ts @@ -1,6 +1,8 @@ +import dayjs from 'dayjs'; import { sql } from 'slonik'; import { SqlToken } from 'slonik/dist/src/tokens.js'; -import dayjs from 'dayjs'; + +import { Table } from './types'; import { excludeAutoSetFields, autoSetFields, @@ -9,7 +11,6 @@ import { convertToTimestamp, conditionalSql, } from './utils'; -import { Table } from './types'; describe('conditionalSql()', () => { it('returns empty sql when value is falsy', () => { diff --git a/packages/core/src/database/utils.ts b/packages/core/src/database/utils.ts index 2741aa138..71095b4b5 100644 --- a/packages/core/src/database/utils.ts +++ b/packages/core/src/database/utils.ts @@ -2,6 +2,7 @@ import { Falsy, notFalsy } from '@logto/essentials'; import { SchemaValuePrimitive, SchemaValue } from '@logto/schemas'; import dayjs from 'dayjs'; import { sql, SqlSqlTokenType, SqlTokenType } from 'slonik'; + import { FieldIdentifiers, Table } from './types'; export const conditionalSql = ( diff --git a/packages/core/src/errors/RequestError/index.ts b/packages/core/src/errors/RequestError/index.ts index 5517d840e..1a88856f6 100644 --- a/packages/core/src/errors/RequestError/index.ts +++ b/packages/core/src/errors/RequestError/index.ts @@ -1,7 +1,7 @@ -import pick from 'lodash.pick'; -import i18next from 'i18next'; import { LogtoErrorCode, LogtoErrorI18nKey } from '@logto/phrases'; import { RequestErrorBody, RequestErrorMetadata } from '@logto/schemas'; +import i18next from 'i18next'; +import pick from 'lodash.pick'; export default class RequestError extends Error { code: LogtoErrorCode; diff --git a/packages/core/src/i18n/init.ts b/packages/core/src/i18n/init.ts index 6e569157b..29b1c46f5 100644 --- a/packages/core/src/i18n/init.ts +++ b/packages/core/src/i18n/init.ts @@ -1,5 +1,5 @@ -import i18next from 'i18next'; import resources from '@logto/phrases'; +import i18next from 'i18next'; export default async function initI18n() { await i18next.init({ diff --git a/packages/core/src/include.d/koa-body.d.ts b/packages/core/src/include.d/koa-body.d.ts index 57f347378..185931a39 100644 --- a/packages/core/src/include.d/koa-body.d.ts +++ b/packages/core/src/include.d/koa-body.d.ts @@ -1,6 +1,6 @@ declare module 'koa-body' { - import { IKoaBodyOptions } from 'node_modules/koa-body'; import { MiddlewareType } from 'koa'; + import { IKoaBodyOptions } from 'node_modules/koa-body'; declare function koaBody< StateT = Record, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 671d33c6d..6bf702547 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,12 +2,12 @@ import 'module-alias/register.js'; import dotenv from 'dotenv'; +import Koa from 'koa'; dotenv.config(); -import Koa from 'koa'; -import initI18n from './i18n/init'; import initApp from './app/init'; +import initI18n from './i18n/init'; const app = new Koa(); diff --git a/packages/core/src/middleware/koa-auth.ts b/packages/core/src/middleware/koa-auth.ts index fdc2f863e..82cf2c77d 100644 --- a/packages/core/src/middleware/koa-auth.ts +++ b/packages/core/src/middleware/koa-auth.ts @@ -1,14 +1,16 @@ import assert from 'assert'; import { IncomingHttpHeaders } from 'http'; -import RequestError from '@/errors/RequestError'; -import { MiddlewareType, Request } from 'koa'; -import { jwtVerify } from 'jose/jwt/verify'; -import { publicKey, issuer, adminResource } from '@/oidc/consts'; -import { IRouterParamContext } from 'koa-router'; + import { UserInfo, userInfoSelectFields } from '@logto/schemas'; -import { findUserById } from '@/queries/user'; +import { jwtVerify } from 'jose/jwt/verify'; +import { MiddlewareType, Request } from 'koa'; +import { IRouterParamContext } from 'koa-router'; import pick from 'lodash.pick'; + import { developmentUserId, isProduction } from '@/env/consts'; +import RequestError from '@/errors/RequestError'; +import { publicKey, issuer, adminResource } from '@/oidc/consts'; +import { findUserById } from '@/queries/user'; export type WithAuthContext = ContextT & { diff --git a/packages/core/src/middleware/koa-error-handler.ts b/packages/core/src/middleware/koa-error-handler.ts index 8e4a7318b..51f09eee8 100644 --- a/packages/core/src/middleware/koa-error-handler.ts +++ b/packages/core/src/middleware/koa-error-handler.ts @@ -1,10 +1,11 @@ -import RequestError from '@/errors/RequestError'; -import { RequestErrorBody } from '@logto/schemas'; import { LogtoErrorCode } from '@logto/phrases'; +import { RequestErrorBody } from '@logto/schemas'; import decamelize from 'decamelize'; import { Middleware } from 'koa'; import { errors } from 'oidc-provider'; +import RequestError from '@/errors/RequestError'; + export default function koaErrorHandler(): Middleware< StateT, ContextT, diff --git a/packages/core/src/middleware/koa-guard.ts b/packages/core/src/middleware/koa-guard.ts index d5aae3f9c..c8e6e4ebf 100644 --- a/packages/core/src/middleware/koa-guard.ts +++ b/packages/core/src/middleware/koa-guard.ts @@ -1,10 +1,11 @@ -import RequestError from '@/errors/RequestError'; import { has } from '@logto/essentials'; import { MiddlewareType } from 'koa'; import koaBody from 'koa-body'; import { IMiddleware, IRouterParamContext } from 'koa-router'; import { ZodType } from 'zod'; +import RequestError from '@/errors/RequestError'; + export type GuardConfig = { query?: ZodType; body?: ZodType; diff --git a/packages/core/src/middleware/koa-ui-proxy.ts b/packages/core/src/middleware/koa-ui-proxy.ts index c5f971b24..44a39537a 100644 --- a/packages/core/src/middleware/koa-ui-proxy.ts +++ b/packages/core/src/middleware/koa-ui-proxy.ts @@ -1,8 +1,10 @@ import fs from 'fs'; + import { MiddlewareType } from 'koa'; import proxy from 'koa-proxies'; -import serveStatic from 'koa-static'; import { IRouterParamContext } from 'koa-router'; +import serveStatic from 'koa-static'; + import { isProduction, mountedApps } from '@/env/consts'; const PATH_TO_UI_DIST = '../ui/build/public'; diff --git a/packages/core/src/oidc/adapter.ts b/packages/core/src/oidc/adapter.ts index 5d40270cc..a26d9c829 100644 --- a/packages/core/src/oidc/adapter.ts +++ b/packages/core/src/oidc/adapter.ts @@ -1,4 +1,8 @@ +import { ApplicationDBEntry } from '@logto/schemas'; +import dayjs from 'dayjs'; import { AdapterFactory, AllClientMetadata } from 'oidc-provider'; + +import { findApplicationById } from '@/queries/application'; import { consumeInstanceById, destoryInstanceById, @@ -7,9 +11,6 @@ import { revokeInstanceByGrantId, upsertInstance, } from '@/queries/oidc-model-instance'; -import { findApplicationById } from '@/queries/application'; -import { ApplicationDBEntry } from '@logto/schemas'; -import dayjs from 'dayjs'; export default function postgresAdapter(modelName: string): ReturnType { if (modelName === 'Client') { diff --git a/packages/core/src/oidc/consts.ts b/packages/core/src/oidc/consts.ts index a4a41944b..a7b3be750 100644 --- a/packages/core/src/oidc/consts.ts +++ b/packages/core/src/oidc/consts.ts @@ -1,6 +1,7 @@ import crypto from 'crypto'; -import { getEnv } from '@/utils/env'; + import { port } from '@/env/consts'; +import { getEnv } from '@/utils/env'; export const privateKey = crypto.createPrivateKey( Buffer.from(getEnv('OIDC_PROVIDER_PRIVATE_KEY_BASE64'), 'base64') diff --git a/packages/core/src/oidc/init.ts b/packages/core/src/oidc/init.ts index 08b7a8022..41d09b75f 100644 --- a/packages/core/src/oidc/init.ts +++ b/packages/core/src/oidc/init.ts @@ -1,11 +1,12 @@ +import { fromKeyLike } from 'jose/jwk/from_key_like'; import Koa from 'koa'; import mount from 'koa-mount'; import { Provider } from 'oidc-provider'; -import postgresAdapter from '@/oidc/adapter'; -import { fromKeyLike } from 'jose/jwk/from_key_like'; +import postgresAdapter from '@/oidc/adapter'; import { findUserById } from '@/queries/user'; import { routes } from '@/routes/consts'; + import { issuer, privateKey } from './consts'; export default async function initOidc(app: Koa): Promise { diff --git a/packages/core/src/queries/application.ts b/packages/core/src/queries/application.ts index b76f661e1..99716ed79 100644 --- a/packages/core/src/queries/application.ts +++ b/packages/core/src/queries/application.ts @@ -1,10 +1,11 @@ +import { ApplicationDBEntry, Applications } from '@logto/schemas'; +import { sql } from 'slonik'; + import { buildInsertInto } from '@/database/insert-into'; import pool from '@/database/pool'; import { buildUpdateWhere } from '@/database/update-where'; import { convertToIdentifiers, OmitAutoSetFields } from '@/database/utils'; import RequestError from '@/errors/RequestError'; -import { ApplicationDBEntry, Applications } from '@logto/schemas'; -import { sql } from 'slonik'; const { table, fields } = convertToIdentifiers(Applications); diff --git a/packages/core/src/queries/oidc-model-instance.ts b/packages/core/src/queries/oidc-model-instance.ts index 57480fcc3..676b86ca4 100644 --- a/packages/core/src/queries/oidc-model-instance.ts +++ b/packages/core/src/queries/oidc-model-instance.ts @@ -1,6 +1,3 @@ -import { buildInsertInto } from '@/database/insert-into'; -import pool from '@/database/pool'; -import { convertToIdentifiers, convertToTimestamp } from '@/database/utils'; import { conditional } from '@logto/essentials'; import { OidcModelInstanceDBEntry, @@ -9,6 +6,10 @@ import { } from '@logto/schemas'; import { sql, ValueExpressionType } from 'slonik'; +import { buildInsertInto } from '@/database/insert-into'; +import pool from '@/database/pool'; +import { convertToIdentifiers, convertToTimestamp } from '@/database/utils'; + export type WithConsumed = T & { consumed?: boolean }; export type QueryResult = Pick; diff --git a/packages/core/src/queries/user.ts b/packages/core/src/queries/user.ts index 8f64d8a6b..7502a3901 100644 --- a/packages/core/src/queries/user.ts +++ b/packages/core/src/queries/user.ts @@ -1,8 +1,9 @@ import { UserDBEntry, Users } from '@logto/schemas'; import { sql } from 'slonik'; + +import { buildInsertInto } from '@/database/insert-into'; import pool from '@/database/pool'; import { convertToIdentifiers } from '@/database/utils'; -import { buildInsertInto } from '@/database/insert-into'; const { table, fields } = convertToIdentifiers(Users); diff --git a/packages/core/src/routes/application.ts b/packages/core/src/routes/application.ts index c511f86ae..c6c5bc596 100644 --- a/packages/core/src/routes/application.ts +++ b/packages/core/src/routes/application.ts @@ -1,14 +1,15 @@ +import { Applications } from '@logto/schemas'; import Router from 'koa-router'; import { object, string } from 'zod'; -import { Applications } from '@logto/schemas'; + import koaGuard from '@/middleware/koa-guard'; +import { generateOidcClientMetadata } from '@/oidc/utils'; import { deleteApplicationById, insertApplication, updateApplicationById, } from '@/queries/application'; import { buildIdGenerator } from '@/utils/id'; -import { generateOidcClientMetadata } from '@/oidc/utils'; const applicationId = buildIdGenerator(21); diff --git a/packages/core/src/routes/init.ts b/packages/core/src/routes/init.ts index 6b24cd228..4cb467831 100644 --- a/packages/core/src/routes/init.ts +++ b/packages/core/src/routes/init.ts @@ -1,12 +1,13 @@ import Koa from 'koa'; +import mount from 'koa-mount'; import Router from 'koa-router'; import { Provider } from 'oidc-provider'; -import sessionRoutes from '@/routes/session'; -import userRoutes from '@/routes/user'; -import swaggerRoutes from '@/routes/swagger'; -import mount from 'koa-mount'; + import koaAuth, { WithAuthContext } from '@/middleware/koa-auth'; import applicationRoutes from '@/routes/application'; +import sessionRoutes from '@/routes/session'; +import swaggerRoutes from '@/routes/swagger'; +import userRoutes from '@/routes/user'; const createRouters = (provider: Provider) => { const anonymousRouter = new Router(); diff --git a/packages/core/src/routes/session.ts b/packages/core/src/routes/session.ts index c2643e812..d20c143e6 100644 --- a/packages/core/src/routes/session.ts +++ b/packages/core/src/routes/session.ts @@ -1,13 +1,15 @@ import assert from 'assert'; -import Router from 'koa-router'; -import { object, string } from 'zod'; -import { encryptPassword } from '@/utils/password'; -import { findUserByUsername } from '@/queries/user'; -import { Provider } from 'oidc-provider'; + import { conditional } from '@logto/essentials'; -import koaGuard from '@/middleware/koa-guard'; -import RequestError from '@/errors/RequestError'; import { LogtoErrorCode } from '@logto/phrases'; +import Router from 'koa-router'; +import { Provider } from 'oidc-provider'; +import { object, string } from 'zod'; + +import RequestError from '@/errors/RequestError'; +import koaGuard from '@/middleware/koa-guard'; +import { findUserByUsername } from '@/queries/user'; +import { encryptPassword } from '@/utils/password'; export default function sessionRoutes(router: Router, provider: Provider) { router.post( diff --git a/packages/core/src/routes/swagger.ts b/packages/core/src/routes/swagger.ts index ff1e3e315..65e72df48 100644 --- a/packages/core/src/routes/swagger.ts +++ b/packages/core/src/routes/swagger.ts @@ -1,5 +1,6 @@ import Router, { IMiddleware } from 'koa-router'; import { OpenAPIV3 } from 'openapi-types'; + import { isGuardMiddleware, WithGuardConfig } from '@/middleware/koa-guard'; import { toTitle } from '@/utils/string'; import { zodTypeToSwagger } from '@/utils/zod'; diff --git a/packages/core/src/routes/user.ts b/packages/core/src/routes/user.ts index 3b5b1df90..c7e2a306f 100644 --- a/packages/core/src/routes/user.ts +++ b/packages/core/src/routes/user.ts @@ -1,12 +1,13 @@ -import Router from 'koa-router'; -import { object, string } from 'zod'; -import { encryptPassword } from '@/utils/password'; -import { hasUser, hasUserWithId, insertUser } from '@/queries/user'; -import { nanoid } from 'nanoid'; import { PasswordEncryptionMethod } from '@logto/schemas'; -import koaGuard from '@/middleware/koa-guard'; +import Router from 'koa-router'; +import { nanoid } from 'nanoid'; +import { object, string } from 'zod'; + import RequestError from '@/errors/RequestError'; +import koaGuard from '@/middleware/koa-guard'; +import { hasUser, hasUserWithId, insertUser } from '@/queries/user'; import { buildIdGenerator } from '@/utils/id'; +import { encryptPassword } from '@/utils/password'; const userId = buildIdGenerator(12); diff --git a/packages/core/src/utils/env.test.ts b/packages/core/src/utils/env.test.ts index 03487703d..6d99c33e2 100644 --- a/packages/core/src/utils/env.test.ts +++ b/packages/core/src/utils/env.test.ts @@ -1,4 +1,5 @@ import { AssertionError } from 'assert'; + import { assertEnv, getEnv } from './env'; describe('getEnv()', () => { diff --git a/packages/core/src/utils/password.ts b/packages/core/src/utils/password.ts index 421eac9ba..f7402e818 100644 --- a/packages/core/src/utils/password.ts +++ b/packages/core/src/utils/password.ts @@ -1,7 +1,9 @@ import assert from 'assert'; import { createHash } from 'crypto'; + import { PasswordEncryptionMethod } from '@logto/schemas'; import { number, string } from 'zod'; + import { assertEnv } from './env'; const peppers = string() diff --git a/packages/core/src/utils/zod.ts b/packages/core/src/utils/zod.ts index dbc761816..3a837cb8d 100644 --- a/packages/core/src/utils/zod.ts +++ b/packages/core/src/utils/zod.ts @@ -1,7 +1,8 @@ +import { conditional } from '@logto/essentials'; import { OpenAPIV3 } from 'openapi-types'; import { ZodArray, ZodBoolean, ZodNumber, ZodObject, ZodOptional, ZodString } from 'zod'; + import RequestError from '@/errors/RequestError'; -import { conditional } from '@logto/essentials'; export const zodTypeToSwagger = (config: unknown): OpenAPIV3.SchemaObject => { if (config instanceof ZodOptional) { diff --git a/packages/core/tsconfig.build.json b/packages/core/tsconfig.build.json new file mode 100644 index 000000000..a34d12e20 --- /dev/null +++ b/packages/core/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base", + "include": [ + "src" + ], + "exclude": [ + "src/**/*.test.ts" + ] +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index a34d12e20..dc2cbc058 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -2,8 +2,5 @@ "extends": "./tsconfig.base", "include": [ "src" - ], - "exclude": [ - "src/**/*.test.ts" ] } diff --git a/packages/phrases/package.json b/packages/phrases/package.json index 6e1bac45c..4edaae1d7 100644 --- a/packages/phrases/package.json +++ b/packages/phrases/package.json @@ -24,8 +24,8 @@ "url": "https://github.com/logto-io/logto/issues" }, "devDependencies": { - "@logto/eslint-config": "^0.1.0-rc.18", - "@logto/ts-config": "^0.1.0-rc.18", + "@logto/eslint-config": "^0.1.0-rc.24", + "@logto/ts-config": "^0.1.0-rc.24", "eslint": "^7.31.0", "prettier": "^2.3.2", "typescript": "^4.3.5" diff --git a/packages/schemas/package.json b/packages/schemas/package.json index 2d237d2c5..edf7caf45 100644 --- a/packages/schemas/package.json +++ b/packages/schemas/package.json @@ -20,9 +20,9 @@ "node": ">=14.15.0" }, "devDependencies": { - "@logto/eslint-config": "^0.1.0-rc.18", + "@logto/eslint-config": "^0.1.0-rc.24", "@logto/essentials": "^1.1.0-rc.2", - "@logto/ts-config": "^0.1.0-rc.18", + "@logto/ts-config": "^0.1.0-rc.24", "@types/lodash.uniq": "^4.5.6", "@types/node": "14", "@types/pluralize": "^0.0.29", diff --git a/packages/schemas/src/db-entries/application.ts b/packages/schemas/src/db-entries/application.ts index 4f361b7db..333ab1e67 100644 --- a/packages/schemas/src/db-entries/application.ts +++ b/packages/schemas/src/db-entries/application.ts @@ -8,7 +8,6 @@ import { GeneratedSchema, Guard, } from '../foundations'; - import { ApplicationType } from './custom-types'; export type ApplicationDBEntry = { diff --git a/packages/schemas/src/db-entries/user.ts b/packages/schemas/src/db-entries/user.ts index 9d05a930c..e9c5bb9a4 100644 --- a/packages/schemas/src/db-entries/user.ts +++ b/packages/schemas/src/db-entries/user.ts @@ -3,7 +3,6 @@ import { z } from 'zod'; import { GeneratedSchema, Guard } from '../foundations'; - import { PasswordEncryptionMethod } from './custom-types'; export type UserDBEntry = { diff --git a/packages/schemas/src/gen/index.ts b/packages/schemas/src/gen/index.ts index a11dbd96c..d2d8267c3 100644 --- a/packages/schemas/src/gen/index.ts +++ b/packages/schemas/src/gen/index.ts @@ -1,14 +1,15 @@ import assert from 'assert'; import fs from 'fs/promises'; import path from 'path'; -import camelcase from 'camelcase'; -import pluralize from 'pluralize'; -import uniq from 'lodash.uniq'; -import { conditional, conditionalString } from '@logto/essentials'; -import { findFirstParentheses, getType, normalizeWhitespaces, removeParentheses } from './utils'; -import { FileData, Table, Field, Type, GeneratedType, TableWithType } from './types'; +import { conditional, conditionalString } from '@logto/essentials'; +import camelcase from 'camelcase'; +import uniq from 'lodash.uniq'; +import pluralize from 'pluralize'; + import { generateSchema } from './schema'; +import { FileData, Table, Field, Type, GeneratedType, TableWithType } from './types'; +import { findFirstParentheses, getType, normalizeWhitespaces, removeParentheses } from './utils'; const directory = 'tables'; diff --git a/packages/schemas/src/gen/schema.ts b/packages/schemas/src/gen/schema.ts index 91c9eb36d..a326c332d 100644 --- a/packages/schemas/src/gen/schema.ts +++ b/packages/schemas/src/gen/schema.ts @@ -1,6 +1,7 @@ -import pluralize from 'pluralize'; -import camelcase from 'camelcase'; import { conditionalString } from '@logto/essentials'; +import camelcase from 'camelcase'; +import pluralize from 'pluralize'; + import { TableWithType } from './types'; export const generateSchema = ({ name, fields }: TableWithType) => { diff --git a/packages/ui/package.json b/packages/ui/package.json index e772ea7d0..3820d83f3 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -31,10 +31,10 @@ "devDependencies": { "@babel/core": "^7.14.6", "@jest/types": "^27.0.6", - "@logto/eslint-config": "^0.1.0-rc.18", - "@logto/eslint-config-react": "^0.1.0-rc.18", - "@logto/ts-config": "^0.1.0-rc.18", - "@logto/ts-config-react": "^0.1.0-rc.18", + "@logto/eslint-config": "^0.1.0-rc.24", + "@logto/eslint-config-react": "^0.1.0-rc.24", + "@logto/ts-config": "^0.1.0-rc.24", + "@logto/ts-config-react": "^0.1.0-rc.24", "@testing-library/react": "^12.0.0", "@types/jest": "^26.0.24", "@types/react": "^17.0.14", diff --git a/packages/ui/src/App.test.tsx b/packages/ui/src/App.test.tsx index ac5a77e5b..2b6ef942b 100644 --- a/packages/ui/src/App.test.tsx +++ b/packages/ui/src/App.test.tsx @@ -1,6 +1,7 @@ import React from 'react'; -import ReactDOM from 'react-dom'; +import { render } from 'react-dom'; import { MemoryRouter } from 'react-router-dom'; + import App from './App'; jest.mock('ky', () => ({})); @@ -8,7 +9,7 @@ jest.mock('ky', () => ({})); describe('', () => { test('renders without exploding', () => { const div = document.createElement('div'); - ReactDOM.render( + render( , diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx index 4708eb98c..ff7b431ab 100644 --- a/packages/ui/src/App.tsx +++ b/packages/ui/src/App.tsx @@ -1,11 +1,12 @@ import React from 'react'; import { Route, Switch } from 'react-router-dom'; + import AppContent from './components/AppContent'; import useTheme from './hooks/use-theme'; import initI18n from './init/i18n'; import Consent from './pages/Consent'; -import SignIn from './pages/SignIn'; import Register from './pages/Register'; +import SignIn from './pages/SignIn'; import './scss/normalized.scss'; void initI18n(); diff --git a/packages/ui/src/client.tsx b/packages/ui/src/client.tsx index 594aea480..eb9592f3a 100644 --- a/packages/ui/src/client.tsx +++ b/packages/ui/src/client.tsx @@ -1,12 +1,13 @@ /* eslint-disable unicorn/prefer-module */ -import { BrowserRouter } from 'react-router-dom'; import React from 'react'; -import ReactDOM from 'react-dom'; +import { render, hydrate } from 'react-dom'; +import { BrowserRouter } from 'react-router-dom'; + import App from './App'; -const render = module.hot ? ReactDOM.render : ReactDOM.hydrate; +const renderFunction = module.hot ? render : hydrate; -render( +renderFunction( , diff --git a/packages/ui/src/components/AppContent/index.tsx b/packages/ui/src/components/AppContent/index.tsx index cf974252d..7fb5b811a 100644 --- a/packages/ui/src/components/AppContent/index.tsx +++ b/packages/ui/src/components/AppContent/index.tsx @@ -1,5 +1,6 @@ import classNames from 'classnames'; import React, { ReactNode } from 'react'; + import styles from './index.module.scss'; export type Theme = 'dark' | 'light'; diff --git a/packages/ui/src/components/Button/index.tsx b/packages/ui/src/components/Button/index.tsx index 3ee226b6f..7c4364813 100644 --- a/packages/ui/src/components/Button/index.tsx +++ b/packages/ui/src/components/Button/index.tsx @@ -1,5 +1,6 @@ -import React from 'react'; import classNames from 'classnames'; +import React from 'react'; + import styles from './index.module.scss'; export type Props = { diff --git a/packages/ui/src/components/Input/index.tsx b/packages/ui/src/components/Input/index.tsx index 92b9e932a..cff6dced3 100644 --- a/packages/ui/src/components/Input/index.tsx +++ b/packages/ui/src/components/Input/index.tsx @@ -1,5 +1,6 @@ import classNames from 'classnames'; import React from 'react'; + import styles from './index.module.scss'; export type Props = { diff --git a/packages/ui/src/components/MessageBox/index.tsx b/packages/ui/src/components/MessageBox/index.tsx index cde2b63d1..c186eac3b 100644 --- a/packages/ui/src/components/MessageBox/index.tsx +++ b/packages/ui/src/components/MessageBox/index.tsx @@ -1,5 +1,6 @@ import classNames from 'classnames'; import React, { ReactNode } from 'react'; + import styles from './index.module.scss'; export type Props = { diff --git a/packages/ui/src/components/TextLink/index.tsx b/packages/ui/src/components/TextLink/index.tsx index af4edba89..2f4d368e1 100644 --- a/packages/ui/src/components/TextLink/index.tsx +++ b/packages/ui/src/components/TextLink/index.tsx @@ -1,5 +1,6 @@ -import React, { ReactChild } from 'react'; import classNames from 'classnames'; +import React, { ReactChild } from 'react'; + import styles from './index.module.scss'; export type Props = { diff --git a/packages/ui/src/hooks/use-api.ts b/packages/ui/src/hooks/use-api.ts index a0431b902..f9070fb48 100644 --- a/packages/ui/src/hooks/use-api.ts +++ b/packages/ui/src/hooks/use-api.ts @@ -1,6 +1,6 @@ -import { useState } from 'react'; -import { HTTPError } from 'ky'; import { RequestErrorBody } from '@logto/schemas'; +import { HTTPError } from 'ky'; +import { useState } from 'react'; type UseApi = { result?: U; diff --git a/packages/ui/src/hooks/use-theme.ts b/packages/ui/src/hooks/use-theme.ts index b9e9a09d3..e9c6051db 100644 --- a/packages/ui/src/hooks/use-theme.ts +++ b/packages/ui/src/hooks/use-theme.ts @@ -1,4 +1,5 @@ import { useState, useEffect } from 'react'; + import { Theme } from '@/components/AppContent'; const darkThemeWatchMedia = window.matchMedia('(prefers-color-scheme: dark)'); diff --git a/packages/ui/src/init/i18n.ts b/packages/ui/src/init/i18n.ts index 1250f183d..142bc4129 100644 --- a/packages/ui/src/init/i18n.ts +++ b/packages/ui/src/init/i18n.ts @@ -1,10 +1,10 @@ -import i18n from 'i18next'; +import resources from '@logto/phrases'; +import i18next from 'i18next'; import LanguageDetector from 'i18next-browser-languagedetector'; import { initReactI18next } from 'react-i18next'; -import resources from '@logto/phrases'; const initI18n = async () => - i18n + i18next .use(initReactI18next) .use(LanguageDetector) .init({ diff --git a/packages/ui/src/pages/Consent/index.tsx b/packages/ui/src/pages/Consent/index.tsx index d18ac2e49..29026c034 100644 --- a/packages/ui/src/pages/Consent/index.tsx +++ b/packages/ui/src/pages/Consent/index.tsx @@ -1,7 +1,8 @@ import React, { useEffect } from 'react'; -import { consent } from '@/apis/consent'; import { useTranslation } from 'react-i18next'; +import { consent } from '@/apis/consent'; + const Consent = () => { const { t } = useTranslation(); diff --git a/packages/ui/src/pages/Register/index.test.tsx b/packages/ui/src/pages/Register/index.test.tsx index 6418bf6e0..cc89cac01 100644 --- a/packages/ui/src/pages/Register/index.test.tsx +++ b/packages/ui/src/pages/Register/index.test.tsx @@ -1,7 +1,8 @@ -import React from 'react'; import { render, fireEvent, waitFor } from '@testing-library/react'; -import Register from '@/pages/Register'; +import React from 'react'; + import { register } from '@/apis/register'; +import Register from '@/pages/Register'; jest.mock('@/apis/register', () => ({ register: jest.fn(async () => Promise.resolve()) })); diff --git a/packages/ui/src/pages/Register/index.tsx b/packages/ui/src/pages/Register/index.tsx index 4c2fb2ff0..7443a3cce 100644 --- a/packages/ui/src/pages/Register/index.tsx +++ b/packages/ui/src/pages/Register/index.tsx @@ -1,7 +1,7 @@ +import { LogtoErrorI18nKey } from '@logto/phrases'; +import classNames from 'classnames'; import React, { FC, FormEventHandler, useState, useCallback, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; -import classNames from 'classnames'; -import { LogtoErrorI18nKey } from '@logto/phrases'; import { register } from '@/apis/register'; import Button from '@/components/Button'; diff --git a/packages/ui/src/pages/SignIn/index.test.tsx b/packages/ui/src/pages/SignIn/index.test.tsx index 08e06b924..a92fb4f0a 100644 --- a/packages/ui/src/pages/SignIn/index.test.tsx +++ b/packages/ui/src/pages/SignIn/index.test.tsx @@ -1,7 +1,8 @@ -import React from 'react'; import { render, fireEvent, waitFor } from '@testing-library/react'; -import SignIn from '@/pages/SignIn'; +import React from 'react'; + import { signInBasic } from '@/apis/sign-in'; +import SignIn from '@/pages/SignIn'; jest.mock('@/apis/sign-in', () => ({ signInBasic: jest.fn(async () => Promise.resolve()) })); diff --git a/packages/ui/src/pages/SignIn/index.tsx b/packages/ui/src/pages/SignIn/index.tsx index 3042b9464..b063f5024 100644 --- a/packages/ui/src/pages/SignIn/index.tsx +++ b/packages/ui/src/pages/SignIn/index.tsx @@ -1,7 +1,7 @@ +import { LogtoErrorI18nKey } from '@logto/phrases'; +import classNames from 'classnames'; import React, { FC, FormEventHandler, useState, useCallback, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; -import classNames from 'classnames'; -import { LogtoErrorI18nKey } from '@logto/phrases'; import { signInBasic } from '@/apis/sign-in'; import Button from '@/components/Button'; diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 7e26d5fd4..21b89ee9a 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -1,9 +1,10 @@ { "extends": "@logto/ts-config-react/tsconfig.base", "compilerOptions": { + "baseUrl": "src", "paths": { "@/*": [ - "./src/*" + "./*" ] } }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5bd362023..5237d7a55 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,11 +20,11 @@ importers: packages/core: specifiers: - '@logto/eslint-config': ^0.1.0-rc.18 + '@logto/eslint-config': ^0.1.0-rc.24 '@logto/essentials': ^1.1.0-rc.2 '@logto/phrases': ^0.1.0 '@logto/schemas': ^0.1.0 - '@logto/ts-config': ^0.1.0-rc.18 + '@logto/ts-config': ^0.1.0-rc.24 '@types/jest': ^27.0.1 '@types/koa': ^2.13.3 '@types/koa-logger': ^3.1.1 @@ -89,8 +89,8 @@ importers: slonik-interceptor-preset: 1.2.10 zod: 3.8.1 devDependencies: - '@logto/eslint-config': 0.1.0-rc.18_2055f56ab8dafa07df5c7ad406c8a4ab - '@logto/ts-config': 0.1.0-rc.18_54a571252e94826a463f89cda755e2f0 + '@logto/eslint-config': 0.1.0-rc.24_2055f56ab8dafa07df5c7ad406c8a4ab + '@logto/ts-config': 0.1.0-rc.24_43787dd55a198a22e6c455f148105a9c '@types/jest': 27.0.1 '@types/koa': 2.13.4 '@types/koa-logger': 3.1.1 @@ -111,24 +111,24 @@ importers: packages/phrases: specifiers: - '@logto/eslint-config': ^0.1.0-rc.18 - '@logto/ts-config': ^0.1.0-rc.18 + '@logto/eslint-config': ^0.1.0-rc.24 + '@logto/ts-config': ^0.1.0-rc.24 eslint: ^7.31.0 prettier: ^2.3.2 typescript: ^4.3.5 devDependencies: - '@logto/eslint-config': 0.1.0-rc.18_2055f56ab8dafa07df5c7ad406c8a4ab - '@logto/ts-config': 0.1.0-rc.18_54a571252e94826a463f89cda755e2f0 + '@logto/eslint-config': 0.1.0-rc.24_2055f56ab8dafa07df5c7ad406c8a4ab + '@logto/ts-config': 0.1.0-rc.24_43787dd55a198a22e6c455f148105a9c eslint: 7.31.0 prettier: 2.3.2 typescript: 4.3.5 packages/schemas: specifiers: - '@logto/eslint-config': ^0.1.0-rc.18 + '@logto/eslint-config': ^0.1.0-rc.24 '@logto/essentials': ^1.1.0-rc.2 '@logto/phrases': ^0.1.0 - '@logto/ts-config': ^0.1.0-rc.18 + '@logto/ts-config': ^0.1.0-rc.24 '@types/lodash.uniq': ^4.5.6 '@types/node': '14' '@types/pluralize': ^0.0.29 @@ -143,9 +143,9 @@ importers: dependencies: '@logto/phrases': link:../phrases devDependencies: - '@logto/eslint-config': 0.1.0-rc.18_2055f56ab8dafa07df5c7ad406c8a4ab + '@logto/eslint-config': 0.1.0-rc.24_2055f56ab8dafa07df5c7ad406c8a4ab '@logto/essentials': 1.1.0-rc.2 - '@logto/ts-config': 0.1.0-rc.18_54a571252e94826a463f89cda755e2f0 + '@logto/ts-config': 0.1.0-rc.24_43787dd55a198a22e6c455f148105a9c '@types/lodash.uniq': 4.5.6 '@types/node': 14.17.6 '@types/pluralize': 0.0.29 @@ -162,12 +162,12 @@ importers: specifiers: '@babel/core': ^7.14.6 '@jest/types': ^27.0.6 - '@logto/eslint-config': ^0.1.0-rc.18 - '@logto/eslint-config-react': ^0.1.0-rc.18 + '@logto/eslint-config': ^0.1.0-rc.24 + '@logto/eslint-config-react': ^0.1.0-rc.24 '@logto/phrases': ^0.1.0 '@logto/schemas': ^0.1.0 - '@logto/ts-config': ^0.1.0-rc.18 - '@logto/ts-config-react': ^0.1.0-rc.18 + '@logto/ts-config': ^0.1.0-rc.24 + '@logto/ts-config-react': ^0.1.0-rc.24 '@testing-library/react': ^12.0.0 '@types/jest': ^26.0.24 '@types/react': ^17.0.14 @@ -212,10 +212,10 @@ importers: devDependencies: '@babel/core': 7.14.8 '@jest/types': 27.0.6 - '@logto/eslint-config': 0.1.0-rc.18_2055f56ab8dafa07df5c7ad406c8a4ab - '@logto/eslint-config-react': 0.1.0-rc.18_8a23604bf110df38aac3ebd7ead305e2 - '@logto/ts-config': 0.1.0-rc.18_54a571252e94826a463f89cda755e2f0 - '@logto/ts-config-react': 0.1.0-rc.18_1457f2a7d92889c1b1eaca634f64e592 + '@logto/eslint-config': 0.1.0-rc.24_2055f56ab8dafa07df5c7ad406c8a4ab + '@logto/eslint-config-react': 0.1.0-rc.24_3d86d47bd84fdbb75de6533b28633e70 + '@logto/ts-config': 0.1.0-rc.24_43787dd55a198a22e6c455f148105a9c + '@logto/ts-config-react': 0.1.0-rc.24_56e7b91bb27f2374270546bf6b655d4d '@testing-library/react': 12.0.0_react-dom@17.0.2+react@17.0.2 '@types/jest': 26.0.24 '@types/react': 17.0.15 @@ -2786,15 +2786,15 @@ packages: write-file-atomic: 3.0.3 dev: true - /@logto/eslint-config-react/0.1.0-rc.18_8a23604bf110df38aac3ebd7ead305e2: - resolution: {integrity: sha512-fUfUCwujf11Xr7i8P380V+7qRPAo+JUEn+GYx80OU9aoFpaUhGhpwNfbHl37MBDCdg6A650Sqnx3X4YfxDdxLQ==} + /@logto/eslint-config-react/0.1.0-rc.24_3d86d47bd84fdbb75de6533b28633e70: + resolution: {integrity: sha512-0telwVjuHOpfbTMFJ6xwRPwhDgpEFPOThM/pvKhh9Yy8sqS76ITC7S+0N3jyQjnRUId/ut0q9EYiTqtKrJ/W+g==} peerDependencies: - '@logto/eslint-config': ^0.1.0-rc.18 + '@logto/eslint-config': ^0.1.0-rc.24 stylelint: ^13.13.1 dependencies: - '@logto/eslint-config': 0.1.0-rc.18_2055f56ab8dafa07df5c7ad406c8a4ab - eslint-config-xo-react: 0.25.0_d9ce695d054fb5a322f2803e7ac84389 - eslint-plugin-react: 7.24.0_eslint@7.31.0 + '@logto/eslint-config': 0.1.0-rc.24_2055f56ab8dafa07df5c7ad406c8a4ab + eslint-config-xo-react: 0.25.0_5f704e3662965de4cfb2bcc40a24fdc0 + eslint-plugin-react: 7.25.0_eslint@7.31.0 eslint-plugin-react-hooks: 4.2.0_eslint@7.31.0 stylelint: 13.13.1 stylelint-config-xo-scss: 0.14.0_stylelint@13.13.1 @@ -2802,25 +2802,26 @@ packages: - eslint dev: true - /@logto/eslint-config/0.1.0-rc.18_2055f56ab8dafa07df5c7ad406c8a4ab: - resolution: {integrity: sha512-GMf+FP6NYzKUCHDpZ+19LPmmUT+btmBCTv04wokoHjynjbPZfVxn26+WK/0BGar9rrr2Cr+QT65LvjztpHhiQg==} + /@logto/eslint-config/0.1.0-rc.24_2055f56ab8dafa07df5c7ad406c8a4ab: + resolution: {integrity: sha512-dmIg0AwhFczqhq54OikElhNlcyS3iXnTIpPxdhkZfql8LpydDYizpDwE5gl/tcEGiI152ZfwWw+8lYcyQatfUA==} engines: {node: '>=14.15.0'} peerDependencies: eslint: ^7.30.0 prettier: ^2.3.2 typescript: ^4.3.5 dependencies: - '@typescript-eslint/eslint-plugin': 4.28.5_514553717ff968e20f6d1c6e521f8616 - '@typescript-eslint/parser': 4.28.5_eslint@7.31.0+typescript@4.3.5 + '@typescript-eslint/eslint-plugin': 4.29.3_2bd6bd57372f0c556f3cf56680206192 + '@typescript-eslint/parser': 4.29.3_eslint@7.31.0+typescript@4.3.5 eslint: 7.31.0 eslint-config-prettier: 8.3.0_eslint@7.31.0 eslint-config-xo: 0.37.0_eslint@7.31.0 - eslint-config-xo-typescript: 0.43.0_6fd5a9364a943d2d4e6f2a7372de0670 + eslint-config-xo-typescript: 0.43.0_5e94fa9d17795ac650ba73b69f3de816 + eslint-import-resolver-typescript: 2.4.0_ad16af91e8fab94a7e22e925abb31583 eslint-plugin-eslint-comments: 3.2.0_eslint@7.31.0 - eslint-plugin-import: 2.23.4_eslint@7.31.0 + eslint-plugin-import: 2.24.2_eslint@7.31.0 eslint-plugin-no-use-extend-native: 0.5.0 eslint-plugin-node: 11.1.0_eslint@7.31.0 - eslint-plugin-prettier: 3.4.0_19f511d6aa08b367b6cb59e8f50291ca + eslint-plugin-prettier: 3.4.1_19f511d6aa08b367b6cb59e8f50291ca eslint-plugin-promise: 5.1.0_eslint@7.31.0 eslint-plugin-unicorn: 34.0.1_eslint@7.31.0 prettier: 2.3.2 @@ -2836,27 +2837,27 @@ packages: lodash.orderby: 4.6.0 lodash.pick: 4.4.0 - /@logto/ts-config-react/0.1.0-rc.18_1457f2a7d92889c1b1eaca634f64e592: - resolution: {integrity: sha512-CNnwTMzpdt8EdrE0EvlqVrBB9GPdFpq6vD+4c2J6pxNS2UWqarh792TfSEDHxTPsmXWV+rz9CIaWB5/TbswsDA==} + /@logto/ts-config-react/0.1.0-rc.24_56e7b91bb27f2374270546bf6b655d4d: + resolution: {integrity: sha512-nwbNoI3XXARR7qg3qCYmeLU3yD4V4BSogXAk6Ge6CIIb0aPoj/27wCknq1edjwaInxPR3J6ZXmicQqHokdZ30g==} engines: {node: '>=14.15.0'} peerDependencies: - '@logto/eslint-config-react': ^0.1.0-rc.18 - '@logto/ts-config': ^0.1.0-rc.18 + '@logto/eslint-config-react': ^0.1.0-rc.24 + '@logto/ts-config': ^0.1.0-rc.24 typescript: ^4.3.5 dependencies: - '@logto/eslint-config-react': 0.1.0-rc.18_8a23604bf110df38aac3ebd7ead305e2 - '@logto/ts-config': 0.1.0-rc.18_54a571252e94826a463f89cda755e2f0 + '@logto/eslint-config-react': 0.1.0-rc.24_3d86d47bd84fdbb75de6533b28633e70 + '@logto/ts-config': 0.1.0-rc.24_43787dd55a198a22e6c455f148105a9c typescript: 4.3.5 dev: true - /@logto/ts-config/0.1.0-rc.18_54a571252e94826a463f89cda755e2f0: - resolution: {integrity: sha512-VskpTMXoUGXaJ8rTdKd/KnmvxujcoT2d5qpQ4NGSJY8ytPIlGM0VRexBh0Bsh1rN2+bklav0D2LvIiaRedvF9A==} + /@logto/ts-config/0.1.0-rc.24_43787dd55a198a22e6c455f148105a9c: + resolution: {integrity: sha512-cjL0oStG1BYJzbT80MgR/XECaoUUyQ44IJavRNETZ8ngmg375HRoM2DQlmlNXwIlGmlbWR21VIohIhd89FANDQ==} engines: {node: '>=14.15.0'} peerDependencies: - '@logto/eslint-config': ^0.1.0-rc.18 + '@logto/eslint-config': ^0.1.0-rc.24 typescript: ^4.3.5 dependencies: - '@logto/eslint-config': 0.1.0-rc.18_2055f56ab8dafa07df5c7ad406c8a4ab + '@logto/eslint-config': 0.1.0-rc.24_2055f56ab8dafa07df5c7ad406c8a4ab typescript: 4.3.5 dev: true @@ -3345,6 +3346,10 @@ packages: resolution: {integrity: sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==} dev: true + /@types/json5/0.0.29: + resolution: {integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4=} + dev: true + /@types/keygrip/1.0.2: resolution: {integrity: sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==} dev: true @@ -3594,8 +3599,8 @@ packages: '@types/yargs-parser': 20.2.1 dev: true - /@typescript-eslint/eslint-plugin/4.28.5_514553717ff968e20f6d1c6e521f8616: - resolution: {integrity: sha512-m31cPEnbuCqXtEZQJOXAHsHvtoDi9OVaeL5wZnO2KZTnkvELk+u6J6jHg+NzvWQxk+87Zjbc4lJS4NHmgImz6Q==} + /@typescript-eslint/eslint-plugin/4.29.3_2bd6bd57372f0c556f3cf56680206192: + resolution: {integrity: sha512-tBgfA3K/3TsZY46ROGvoRxQr1wBkclbVqRQep97MjVHJzcRBURRY3sNFqLk0/Xr//BY5hM9H2p/kp+6qim85SA==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: '@typescript-eslint/parser': ^4.0.0 @@ -3605,9 +3610,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.28.5_eslint@7.31.0+typescript@4.3.5 - '@typescript-eslint/parser': 4.28.5_eslint@7.31.0+typescript@4.3.5 - '@typescript-eslint/scope-manager': 4.28.5 + '@typescript-eslint/experimental-utils': 4.29.3_eslint@7.31.0+typescript@4.3.5 + '@typescript-eslint/parser': 4.29.3_eslint@7.31.0+typescript@4.3.5 + '@typescript-eslint/scope-manager': 4.29.3 debug: 4.3.2 eslint: 7.31.0 functional-red-black-tree: 1.0.1 @@ -3619,16 +3624,16 @@ packages: - supports-color dev: true - /@typescript-eslint/experimental-utils/4.28.5_eslint@7.31.0+typescript@4.3.5: - resolution: {integrity: sha512-bGPLCOJAa+j49hsynTaAtQIWg6uZd8VLiPcyDe4QPULsvQwLHGLSGKKcBN8/lBxIX14F74UEMK2zNDI8r0okwA==} + /@typescript-eslint/experimental-utils/4.29.3_eslint@7.31.0+typescript@4.3.5: + resolution: {integrity: sha512-ffIvbytTVWz+3keg+Sy94FG1QeOvmV9dP2YSdLFHw/ieLXWCa3U1TYu8IRCOpMv2/SPS8XqhM1+ou1YHsdzKrg==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: '*' dependencies: '@types/json-schema': 7.0.8 - '@typescript-eslint/scope-manager': 4.28.5 - '@typescript-eslint/types': 4.28.5 - '@typescript-eslint/typescript-estree': 4.28.5_typescript@4.3.5 + '@typescript-eslint/scope-manager': 4.29.3 + '@typescript-eslint/types': 4.29.3 + '@typescript-eslint/typescript-estree': 4.29.3_typescript@4.3.5 eslint: 7.31.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@7.31.0 @@ -3637,8 +3642,8 @@ packages: - typescript dev: true - /@typescript-eslint/parser/4.28.5_eslint@7.31.0+typescript@4.3.5: - resolution: {integrity: sha512-NPCOGhTnkXGMqTznqgVbA5LqVsnw+i3+XA1UKLnAb+MG1Y1rP4ZSK9GX0kJBmAZTMIktf+dTwXToT6kFwyimbw==} + /@typescript-eslint/parser/4.29.3_eslint@7.31.0+typescript@4.3.5: + resolution: {integrity: sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3647,9 +3652,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 4.28.5 - '@typescript-eslint/types': 4.28.5 - '@typescript-eslint/typescript-estree': 4.28.5_typescript@4.3.5 + '@typescript-eslint/scope-manager': 4.29.3 + '@typescript-eslint/types': 4.29.3 + '@typescript-eslint/typescript-estree': 4.29.3_typescript@4.3.5 debug: 4.3.2 eslint: 7.31.0 typescript: 4.3.5 @@ -3657,21 +3662,21 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/4.28.5: - resolution: {integrity: sha512-PHLq6n9nTMrLYcVcIZ7v0VY1X7dK309NM8ya9oL/yG8syFINIMHxyr2GzGoBYUdv3NUfCOqtuqps0ZmcgnZTfQ==} + /@typescript-eslint/scope-manager/4.29.3: + resolution: {integrity: sha512-x+w8BLXO7iWPkG5mEy9bA1iFRnk36p/goVlYobVWHyDw69YmaH9q6eA+Fgl7kYHmFvWlebUTUfhtIg4zbbl8PA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.28.5 - '@typescript-eslint/visitor-keys': 4.28.5 + '@typescript-eslint/types': 4.29.3 + '@typescript-eslint/visitor-keys': 4.29.3 dev: true - /@typescript-eslint/types/4.28.5: - resolution: {integrity: sha512-MruOu4ZaDOLOhw4f/6iudyks/obuvvZUAHBDSW80Trnc5+ovmViLT2ZMDXhUV66ozcl6z0LJfKs1Usldgi/WCA==} + /@typescript-eslint/types/4.29.3: + resolution: {integrity: sha512-s1eV1lKNgoIYLAl1JUba8NhULmf+jOmmeFO1G5MN/RBCyyzg4TIOfIOICVNC06lor+Xmy4FypIIhFiJXOknhIg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true - /@typescript-eslint/typescript-estree/4.28.5_typescript@4.3.5: - resolution: {integrity: sha512-FzJUKsBX8poCCdve7iV7ShirP8V+ys2t1fvamVeD1rWpiAnIm550a+BX/fmTHrjEpQJ7ZAn+Z7ZZwJjytk9rZw==} + /@typescript-eslint/typescript-estree/4.29.3_typescript@4.3.5: + resolution: {integrity: sha512-45oQJA0bxna4O5TMwz55/TpgjX1YrAPOI/rb6kPgmdnemRZx/dB0rsx+Ku8jpDvqTxcE1C/qEbVHbS3h0hflag==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: typescript: '*' @@ -3679,8 +3684,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 4.28.5 - '@typescript-eslint/visitor-keys': 4.28.5 + '@typescript-eslint/types': 4.29.3 + '@typescript-eslint/visitor-keys': 4.29.3 debug: 4.3.2 globby: 11.0.4 is-glob: 4.0.1 @@ -3691,11 +3696,11 @@ packages: - supports-color dev: true - /@typescript-eslint/visitor-keys/4.28.5: - resolution: {integrity: sha512-dva/7Rr+EkxNWdJWau26xU/0slnFlkh88v3TsyTgRS/IIYFi5iIfpCFM4ikw0vQTFUR9FYSSyqgK4w64gsgxhg==} + /@typescript-eslint/visitor-keys/4.29.3: + resolution: {integrity: sha512-MGGfJvXT4asUTeVs0Q2m+sY63UsfnA+C/FDgBKV3itLBmM9H0u+URcneePtkd0at1YELmZK6HSolCqM4Fzs6yA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.28.5 + '@typescript-eslint/types': 4.29.3 eslint-visitor-keys: 2.1.0 dev: true @@ -6680,7 +6685,7 @@ packages: eslint: 7.31.0 dev: true - /eslint-config-xo-react/0.25.0_d9ce695d054fb5a322f2803e7ac84389: + /eslint-config-xo-react/0.25.0_5f704e3662965de4cfb2bcc40a24fdc0: resolution: {integrity: sha512-YpABFxnoATAYtxsZQChZEbOkWqzCtcQDRdiUqHhLgG7hzbAEzPDmsRUWnTP8oTVLVFWrbgdf913b8kQJaR1cBA==} engines: {node: '>=10'} peerDependencies: @@ -6689,18 +6694,18 @@ packages: eslint-plugin-react-hooks: '>=4.2.0' dependencies: eslint: 7.31.0 - eslint-plugin-react: 7.24.0_eslint@7.31.0 + eslint-plugin-react: 7.25.0_eslint@7.31.0 eslint-plugin-react-hooks: 4.2.0_eslint@7.31.0 dev: true - /eslint-config-xo-typescript/0.43.0_6fd5a9364a943d2d4e6f2a7372de0670: + /eslint-config-xo-typescript/0.43.0_5e94fa9d17795ac650ba73b69f3de816: resolution: {integrity: sha512-8T4O7Dy4c5/TeOPxBOTw7DI8fgS+u5ni0xA6alcJDyiMCuBq7O+FUMsOkz2vAOQ3C3HMkYmkpAXA/gZFX4QUrg==} engines: {node: '>=12'} peerDependencies: '@typescript-eslint/eslint-plugin': '>=4.28.1' eslint: '>=7.30.0' dependencies: - '@typescript-eslint/eslint-plugin': 4.28.5_514553717ff968e20f6d1c6e521f8616 + '@typescript-eslint/eslint-plugin': 4.29.3_2bd6bd57372f0c556f3cf56680206192 eslint: 7.31.0 typescript: 4.3.5 dev: true @@ -6715,15 +6720,33 @@ packages: eslint: 7.31.0 dev: true - /eslint-import-resolver-node/0.3.4: - resolution: {integrity: sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==} + /eslint-import-resolver-node/0.3.6: + resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} dependencies: - debug: 2.6.9 + debug: 3.2.7 resolve: 1.20.0 dev: true - /eslint-module-utils/2.6.1: - resolution: {integrity: sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==} + /eslint-import-resolver-typescript/2.4.0_ad16af91e8fab94a7e22e925abb31583: + resolution: {integrity: sha512-useJKURidCcldRLCNKWemr1fFQL1SzB3G4a0li6lFGvlc5xGe1hY343bvG07cbpCzPuM/lK19FIJB3XGFSkplA==} + engines: {node: '>=4'} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.2 + eslint: 7.31.0 + eslint-plugin-import: 2.24.2_eslint@7.31.0 + glob: 7.1.7 + is-glob: 4.0.1 + resolve: 1.20.0 + tsconfig-paths: 3.10.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils/2.6.2: + resolution: {integrity: sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==} engines: {node: '>=4'} dependencies: debug: 3.2.7 @@ -6752,8 +6775,8 @@ packages: ignore: 5.1.8 dev: true - /eslint-plugin-import/2.23.4_eslint@7.31.0: - resolution: {integrity: sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==} + /eslint-plugin-import/2.24.2_eslint@7.31.0: + resolution: {integrity: sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==} engines: {node: '>=4'} peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 @@ -6763,17 +6786,17 @@ packages: debug: 2.6.9 doctrine: 2.1.0 eslint: 7.31.0 - eslint-import-resolver-node: 0.3.4 - eslint-module-utils: 2.6.1 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.6.2 find-up: 2.1.0 has: 1.0.3 - is-core-module: 2.5.0 + is-core-module: 2.6.0 minimatch: 3.0.4 object.values: 1.1.4 pkg-up: 2.0.0 read-pkg-up: 3.0.0 resolve: 1.20.0 - tsconfig-paths: 3.10.1 + tsconfig-paths: 3.11.0 dev: true /eslint-plugin-no-use-extend-native/0.5.0: @@ -6801,8 +6824,8 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-prettier/3.4.0_19f511d6aa08b367b6cb59e8f50291ca: - resolution: {integrity: sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==} + /eslint-plugin-prettier/3.4.1_19f511d6aa08b367b6cb59e8f50291ca: + resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: eslint: '>=5.0.0' @@ -6836,8 +6859,8 @@ packages: eslint: 7.31.0 dev: true - /eslint-plugin-react/7.24.0_eslint@7.31.0: - resolution: {integrity: sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==} + /eslint-plugin-react/7.25.0_eslint@7.31.0: + resolution: {integrity: sha512-bZL+HeB+Qaimb4ryOc+OYYOX0XnOr6FX30ZXkzL8iSJA3tATTtZ1YgYyjK3jGvVDcZMejfUaeS/5wKDfTgyfVw==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 @@ -6846,6 +6869,7 @@ packages: array.prototype.flatmap: 1.2.4 doctrine: 2.1.0 eslint: 7.31.0 + estraverse: 5.2.0 has: 1.0.3 jsx-ast-utils: 3.2.0 minimatch: 3.0.4 @@ -8734,6 +8758,12 @@ packages: dependencies: has: 1.0.3 + /is-core-module/2.6.0: + resolution: {integrity: sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==} + dependencies: + has: 1.0.3 + dev: true + /is-data-descriptor/0.1.4: resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} engines: {node: '>=0.10.0'} @@ -15670,6 +15700,15 @@ packages: strip-bom: 3.0.0 dev: true + /tsconfig-paths/3.11.0: + resolution: {integrity: sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.1 + minimist: 1.2.5 + strip-bom: 3.0.0 + dev: true + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true