diff --git a/.prettierignore b/.prettierignore index b43d9013d..d39eaad34 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,7 +7,6 @@ __generated__/ /.husky/_/ /.turbo/ /integration-tests/testkit/gql/ -/packages/services/storage/src/db/types.ts /packages/libraries/cli/src/sdk.ts /packages/libraries/cli/src/gql/ /packages/web/app/src/gql/** diff --git a/deployment/utils/observability.ts b/deployment/utils/observability.ts index 294c459fc..5ef5f7379 100644 --- a/deployment/utils/observability.ts +++ b/deployment/utils/observability.ts @@ -15,7 +15,10 @@ export type ObservabilityConfig = { }; }; export class Observability { - constructor(private envName: string, private config: ObservabilityConfig) {} + constructor( + private envName: string, + private config: ObservabilityConfig, + ) {} deploy() { const ns = new k8s.core.v1.Namespace('observability', { diff --git a/integration-tests/tests/api/schema/check.spec.ts b/integration-tests/tests/api/schema/check.spec.ts index 4e317db07..91f7c0c86 100644 --- a/integration-tests/tests/api/schema/check.spec.ts +++ b/integration-tests/tests/api/schema/check.spec.ts @@ -43,28 +43,24 @@ test.concurrent('can check a schema with target:registry:read access', async () // Check schema with no read and write rights const checkResultErrors = await noAccessToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: String - foo: String - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: String + foo: String + } + `) .then(r => r.expectGraphQLErrors()); expect(checkResultErrors).toHaveLength(1); expect(checkResultErrors[0].message).toMatch('target:registry:read'); // Check schema with read rights const checkResultValid = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: String - foo: String - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: String + foo: String + } + `) .then(r => r.expectNoGraphQLErrors()); expect(checkResultValid.schemaCheck.__typename).toBe('SchemaCheckSuccess'); }); @@ -107,18 +103,16 @@ test.concurrent('should match indentation of previous description', async () => // Check schema with read rights const checkResult = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - """ - ping-ping - """ - ping: String - " pong-pong " - pong: String - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + """ + ping-ping + """ + ping: String + " pong-pong " + pong: String + } + `) .then(r => r.expectNoGraphQLErrors()); const check = checkResult.schemaCheck; @@ -272,14 +266,12 @@ test.concurrent('successful check without previously published schema is persist // Check schema with read rights const checkResult = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: String - pong: String - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: String + pong: String + } + `) .then(r => r.expectNoGraphQLErrors()); const check = checkResult.schemaCheck; @@ -358,14 +350,12 @@ test.concurrent('successful check with previously published schema is persisted' // Check schema with read rights const checkResult = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: String - pong: String - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: String + pong: String + } + `) .then(r => r.expectNoGraphQLErrors()); const check = checkResult.schemaCheck; @@ -421,13 +411,11 @@ test.concurrent('failed check due to graphql validation is persisted', async () // Check schema with read rights const checkResult = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: Str - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: Str + } + `) .then(r => r.expectNoGraphQLErrors()); const check = checkResult.schemaCheck; @@ -512,13 +500,11 @@ test.concurrent('failed check due to breaking change is persisted', async () => // Check schema with read rights const checkResult = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: Float - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: Float + } + `) .then(r => r.expectNoGraphQLErrors()); const check = checkResult.schemaCheck; @@ -610,14 +596,12 @@ test.concurrent('failed check due to policy error is persisted', async () => { // Check schema with read rights const checkResult = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: String - foo: String - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: String + foo: String + } + `) .then(r => r.expectNoGraphQLErrors()); const check = checkResult.schemaCheck; @@ -661,13 +645,13 @@ test.concurrent('failed check due to policy error is persisted', async () => { { node: { end: { - column: 19, + column: 17, line: 2, }, message: 'Description is required for type "Query"', ruleId: 'require-description', start: { - column: 14, + column: 12, line: 2, }, }, @@ -721,14 +705,12 @@ test.concurrent('successful check with warnings and safe changes is persisted', // Check schema with read rights const checkResult = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: String - foo: String - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: String + foo: String + } + `) .then(r => r.expectNoGraphQLErrors()); const check = checkResult.schemaCheck; @@ -770,13 +752,13 @@ test.concurrent('successful check with warnings and safe changes is persisted', { node: { end: { - column: 19, + column: 17, line: 2, }, message: 'Description is required for type "Query"', ruleId: 'require-description', start: { - column: 14, + column: 12, line: 2, }, }, @@ -810,14 +792,12 @@ test.concurrent( // Check schema with read rights const checkResult = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: String - foo: String - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: String + foo: String + } + `) .then(r => r.expectNoGraphQLErrors()); const check = checkResult.schemaCheck; @@ -937,13 +917,11 @@ test('approve failed schema check that has breaking changes succeeds', async () // Check schema with read rights const checkResult = await readToken - .checkSchema( - /* GraphQL */ ` - type Query { - ping: Float - } - `, - ) + .checkSchema(/* GraphQL */ ` + type Query { + ping: Float + } + `) .then(r => r.expectNoGraphQLErrors()); const check = checkResult.schemaCheck; diff --git a/package.json b/package.json index 04a8ce3ab..401bc23c0 100644 --- a/package.json +++ b/package.json @@ -68,8 +68,8 @@ "@next/eslint-plugin-next": "13.5.6", "@sentry/cli": "2.21.2", "@swc/core": "1.3.96", - "@theguild/eslint-config": "0.11.0", - "@theguild/prettier-config": "1.2.0", + "@theguild/eslint-config": "0.11.1", + "@theguild/prettier-config": "2.0.2", "@types/node": "18.18.8", "bob-the-bundler": "7.0.1", "cypress": "13.4.0", @@ -84,9 +84,9 @@ "jest-snapshot-serializer-raw": "2.0.0", "lint-staged": "15.0.2", "pg": "8.11.3", - "prettier": "2.8.8", + "prettier": "3.0.3", "prettier-plugin-sql": "0.15.1", - "prettier-plugin-tailwindcss": "0.4.1", + "prettier-plugin-tailwindcss": "0.5.6", "pretty-quick": "3.1.3", "rimraf": "4.4.1", "ts-node": "10.9.1", diff --git a/packages/libraries/cli/src/commands/introspect.ts b/packages/libraries/cli/src/commands/introspect.ts index 6f7c7f7e6..0aa4a30f5 100644 --- a/packages/libraries/cli/src/commands/introspect.ts +++ b/packages/libraries/cli/src/commands/introspect.ts @@ -30,14 +30,17 @@ export default class Introspect extends Command { async run() { const { flags, args } = await this.parse(Introspect); - const headers = flags.header?.reduce((acc, header) => { - const [key, ...values] = header.split(':'); + const headers = flags.header?.reduce( + (acc, header) => { + const [key, ...values] = header.split(':'); - return { - ...acc, - [key]: values.join(':'), - }; - }, {} as Record); + return { + ...acc, + [key]: values.join(':'), + }; + }, + {} as Record, + ); const schema = await loadSchema(args.location, { headers, diff --git a/packages/libraries/cli/src/helpers/operations.ts b/packages/libraries/cli/src/helpers/operations.ts index b050b375b..cd221dd74 100644 --- a/packages/libraries/cli/src/helpers/operations.ts +++ b/packages/libraries/cli/src/helpers/operations.ts @@ -10,11 +10,10 @@ export async function loadOperations( file: string, options?: { normalize?: boolean; - pluckModules?: - | { - name: string; - identifier?: string; - }[]; + pluckModules?: { + name: string; + identifier?: string; + }[]; pluckGlobalGqlIdentifierName?: string[]; }, ): Promise< diff --git a/packages/services/api/src/context.ts b/packages/services/api/src/context.ts index 31daefc67..8334fe72b 100644 --- a/packages/services/api/src/context.ts +++ b/packages/services/api/src/context.ts @@ -8,7 +8,6 @@ export interface RegistryContext { declare global { namespace GraphQLModules { - // eslint-disable-next-line @typescript-eslint/no-empty-interface interface GlobalContext extends RegistryContext {} } } diff --git a/packages/services/api/src/modules/activity/providers/activity-manager.ts b/packages/services/api/src/modules/activity/providers/activity-manager.ts index d1bd017e3..e9b043a79 100644 --- a/packages/services/api/src/modules/activity/providers/activity-manager.ts +++ b/packages/services/api/src/modules/activity/providers/activity-manager.ts @@ -23,7 +23,11 @@ interface PaginationSelector { export class ActivityManager { private logger: Logger; - constructor(logger: Logger, private authManager: AuthManager, private storage: Storage) { + constructor( + logger: Logger, + private authManager: AuthManager, + private storage: Storage, + ) { this.logger = logger.child({ source: 'ActivityManager', }); diff --git a/packages/services/api/src/modules/alerts/providers/adapters/slack.ts b/packages/services/api/src/modules/alerts/providers/adapters/slack.ts index 0ab0d68c0..5d7c902b5 100644 --- a/packages/services/api/src/modules/alerts/providers/adapters/slack.ts +++ b/packages/services/api/src/modules/alerts/providers/adapters/slack.ts @@ -15,7 +15,10 @@ import { export class SlackCommunicationAdapter implements CommunicationAdapter { private logger: Logger; - constructor(logger: Logger, @Inject(WEB_APP_URL) private appBaseUrl: string) { + constructor( + logger: Logger, + @Inject(WEB_APP_URL) private appBaseUrl: string, + ) { this.logger = logger.child({ service: 'SlackCommunicationAdapter' }); } diff --git a/packages/services/api/src/modules/auth/providers/project-access.ts b/packages/services/api/src/modules/auth/providers/project-access.ts index 1b4d6189f..29be851e4 100644 --- a/packages/services/api/src/modules/auth/providers/project-access.ts +++ b/packages/services/api/src/modules/auth/providers/project-access.ts @@ -41,7 +41,10 @@ export class ProjectAccess { private tokenAccess: Dataloader; private scopes: Dataloader; - constructor(logger: Logger, private organizationAccess: OrganizationAccess) { + constructor( + logger: Logger, + private organizationAccess: OrganizationAccess, + ) { this.logger = logger.child({ source: 'ProjectAccess', }); diff --git a/packages/services/api/src/modules/auth/providers/target-access.ts b/packages/services/api/src/modules/auth/providers/target-access.ts index d13c9c188..e2d9e0dbf 100644 --- a/packages/services/api/src/modules/auth/providers/target-access.ts +++ b/packages/services/api/src/modules/auth/providers/target-access.ts @@ -43,7 +43,10 @@ export class TargetAccess { private tokenAccess: Dataloader; private scopes: Dataloader; - constructor(logger: Logger, private organizationAccess: OrganizationAccess) { + constructor( + logger: Logger, + private organizationAccess: OrganizationAccess, + ) { this.logger = logger.child({ source: 'TargetAccess', }); diff --git a/packages/services/api/src/modules/auth/providers/user-manager.ts b/packages/services/api/src/modules/auth/providers/user-manager.ts index bd53e1f46..00f61d2ea 100644 --- a/packages/services/api/src/modules/auth/providers/user-manager.ts +++ b/packages/services/api/src/modules/auth/providers/user-manager.ts @@ -22,7 +22,10 @@ export const fullNameLengthBoundaries = { export class UserManager { private logger: Logger; - constructor(logger: Logger, private storage: Storage) { + constructor( + logger: Logger, + private storage: Storage, + ) { this.logger = logger.child({ source: 'UserManager', }); diff --git a/packages/services/api/src/modules/collection/providers/collection.provider.ts b/packages/services/api/src/modules/collection/providers/collection.provider.ts index e6fbc1570..43942c205 100644 --- a/packages/services/api/src/modules/collection/providers/collection.provider.ts +++ b/packages/services/api/src/modules/collection/providers/collection.provider.ts @@ -11,7 +11,11 @@ import type { CollectionModule } from './../__generated__/types'; export class CollectionProvider { private logger: Logger; - constructor(logger: Logger, private storage: Storage, private authManager: AuthManager) { + constructor( + logger: Logger, + private storage: Storage, + private authManager: AuthManager, + ) { this.logger = logger.child({ source: 'CollectionProvider' }); } diff --git a/packages/services/api/src/modules/operations/providers/operations-reader.ts b/packages/services/api/src/modules/operations/providers/operations-reader.ts index 27b602ad1..076011d45 100644 --- a/packages/services/api/src/modules/operations/providers/operations-reader.ts +++ b/packages/services/api/src/modules/operations/providers/operations-reader.ts @@ -65,7 +65,10 @@ function ensureNumber(value: number | string): number { global: true, }) export class OperationsReader { - constructor(private clickHouse: ClickHouse, private logger: Logger) {} + constructor( + private clickHouse: ClickHouse, + private logger: Logger, + ) {} private pickQueryByPeriod( queryMap: { diff --git a/packages/services/api/src/modules/schema/resolvers.ts b/packages/services/api/src/modules/schema/resolvers.ts index 81fb449bb..5c530724b 100644 --- a/packages/services/api/src/modules/schema/resolvers.ts +++ b/packages/services/api/src/modules/schema/resolvers.ts @@ -1735,7 +1735,7 @@ export const resolvers: SchemaModule.Resolvers = { organization: usage.organization, project: usage.project, target: usage.target, - } as const); + }) as const; for (const typeDefinition of sdl.definitions) { if (typeDefinition.kind === Kind.OBJECT_TYPE_DEFINITION) { diff --git a/packages/services/api/src/modules/shared/lib/task-runner.ts b/packages/services/api/src/modules/shared/lib/task-runner.ts index b2e189189..996a6be5a 100644 --- a/packages/services/api/src/modules/shared/lib/task-runner.ts +++ b/packages/services/api/src/modules/shared/lib/task-runner.ts @@ -19,7 +19,7 @@ export const createTaskRunner = (args: { logger: args.logger, name: 'schema-purge', }); - task.done.finally(() => { + void task.done.finally(() => { if (!isStopped) { loop(); } diff --git a/packages/services/api/src/modules/shared/providers/distributed-cache.ts b/packages/services/api/src/modules/shared/providers/distributed-cache.ts index d429abac9..c90193894 100644 --- a/packages/services/api/src/modules/shared/providers/distributed-cache.ts +++ b/packages/services/api/src/modules/shared/providers/distributed-cache.ts @@ -9,7 +9,10 @@ import { REDIS_INSTANCE } from '../../shared/providers/redis'; }) export class DistributedCache { private logger: Logger; - constructor(logger: Logger, @Inject(REDIS_INSTANCE) private redis: Redis) { + constructor( + logger: Logger, + @Inject(REDIS_INSTANCE) private redis: Redis, + ) { this.logger = logger.child({ service: 'DistributedCache' }); } diff --git a/packages/services/api/src/modules/shared/providers/id-translator.ts b/packages/services/api/src/modules/shared/providers/id-translator.ts index d5d94aa48..85ce156a2 100644 --- a/packages/services/api/src/modules/shared/providers/id-translator.ts +++ b/packages/services/api/src/modules/shared/providers/id-translator.ts @@ -9,7 +9,10 @@ import { Storage } from './storage'; }) export class IdTranslator { private logger: Logger; - constructor(private storage: Storage, logger: Logger) { + constructor( + private storage: Storage, + logger: Logger, + ) { this.logger = logger.child({ service: 'IdTranslator' }); } diff --git a/packages/services/api/src/modules/shared/providers/storage.ts b/packages/services/api/src/modules/shared/providers/storage.ts index 83e9dd557..7698b4d47 100644 --- a/packages/services/api/src/modules/shared/providers/storage.ts +++ b/packages/services/api/src/modules/shared/providers/storage.ts @@ -59,6 +59,7 @@ export interface TargetSelector extends ProjectSelector { target: string; } +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export interface Storage { destroy(): Promise; isReady(): Promise; @@ -744,4 +745,5 @@ export interface Storage { } @Injectable() +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class Storage implements Storage {} diff --git a/packages/services/rate-limit/src/emails.ts b/packages/services/rate-limit/src/emails.ts index 48bc2761c..545989b58 100644 --- a/packages/services/rate-limit/src/emails.ts +++ b/packages/services/rate-limit/src/emails.ts @@ -68,15 +68,15 @@ export function createEmailScheduler(config?: { endpoint: string }) { input.organization.name } has reached over 100% of the operations limit quota. Used ${numberFormatter.format(input.usage.current)} of ${numberFormatter.format( - input.usage.quota, - )}. + input.usage.quota, + )}. . We recommend to increase the limit. + input.organization.cleanId + }/view/subscription"> Manage your subscription @@ -132,15 +132,15 @@ export function createEmailScheduler(config?: { endpoint: string }) { input.organization.name } is approaching its operations limit quota. Used ${numberFormatter.format(input.usage.current)} of ${numberFormatter.format( - input.usage.quota, - )}. + input.usage.quota, + )}. . We recommend to increase the limit. + input.organization.cleanId + }/view/subscription"> Manage your subscription diff --git a/packages/services/storage/package.json b/packages/services/storage/package.json index 6f7ea26b4..714eab1f0 100644 --- a/packages/services/storage/package.json +++ b/packages/services/storage/package.json @@ -13,7 +13,7 @@ }, "scripts": { "build": "tsx ../../../scripts/runify.ts", - "db:generate": "schemats generate --config schemats.cjs -o src/db/types.ts" + "db:generate": "schemats generate --config schemats.cjs -o src/db/types.ts && prettier --write src/db/types.ts" }, "devDependencies": { "@sentry/node": "7.77.0", diff --git a/packages/services/storage/schemats.cjs b/packages/services/storage/schemats.cjs index 368fb5fb9..51891dded 100644 --- a/packages/services/storage/schemats.cjs +++ b/packages/services/storage/schemats.cjs @@ -3,6 +3,7 @@ const cn = require('../../migrations/tools/db-connection-string.cjs'); module.exports = { conn: cn('registry'), - prettier: true, + // Prettier v3 is not supported here yet, but we don't really need it. + prettier: false, skipPrefix: ['supertokens_'], }; diff --git a/packages/services/storage/src/db/types.ts b/packages/services/storage/src/db/types.ts index 1da2cf674..855974d4e 100644 --- a/packages/services/storage/src/db/types.ts +++ b/packages/services/storage/src/db/types.ts @@ -7,10 +7,10 @@ * */ -export type alert_channel_type = "SLACK" | "WEBHOOK"; -export type alert_type = "SCHEMA_CHANGE_NOTIFICATIONS"; -export type schema_policy_resource = "ORGANIZATION" | "PROJECT"; -export type user_role = "ADMIN" | "MEMBER"; +export type alert_channel_type = 'SLACK' | 'WEBHOOK'; +export type alert_type = 'SCHEMA_CHANGE_NOTIFICATIONS'; +export type schema_policy_resource = 'ORGANIZATION' | 'PROJECT'; +export type user_role = 'ADMIN' | 'MEMBER'; export interface activities { activity_metadata: any; diff --git a/packages/services/storage/src/index.ts b/packages/services/storage/src/index.ts index d871e9cbe..9519b388c 100644 --- a/packages/services/storage/src/index.ts +++ b/packages/services/storage/src/index.ts @@ -1604,9 +1604,9 @@ export async function createStorage(connection: string, maximumPoolSize: number) return trx.one(sql` UPDATE public.targets as t SET validation_percentage = ${percentage}, validation_period = ${period}, validation_excluded_clients = ${sql.array( - excludedClients, - 'text', - )} + excludedClients, + 'text', + )} FROM ( SELECT it.id, @@ -1745,8 +1745,8 @@ export async function createStorage(connection: string, maximumPoolSize: number) LEFT JOIN public.targets as t ON (t.id = sv.target_id) LEFT JOIN public.schema_log as sl ON (sl.id = sv.action_id) WHERE t.id = ${target} AND t.project_id = ${project} AND ${ - onlyComposable ? sql`sv.is_composable IS TRUE` : true - } + onlyComposable ? sql`sv.is_composable IS TRUE` : true + } ORDER BY sv.created_at DESC LIMIT 1 `); @@ -1829,8 +1829,8 @@ export async function createStorage(connection: string, maximumPoolSize: number) SELECT sv.id FROM public.schema_versions as sv WHERE sv.created_at < ( SELECT svi.created_at FROM public.schema_versions as svi WHERE svi.id = ${version} ) AND sv.target_id = ${target} AND ${ - onlyComposable ? sql`sv.is_composable IS TRUE` : true - } ORDER BY sv.created_at DESC LIMIT 1 + onlyComposable ? sql`sv.is_composable IS TRUE` : true + } ORDER BY sv.created_at DESC LIMIT 1 ) AND sl.action = 'PUSH' ORDER BY sl.created_at DESC `, @@ -2333,8 +2333,8 @@ export async function createStorage(connection: string, maximumPoolSize: number) ("name", "type", "project_id", "slack_channel", "webhook_endpoint") VALUES (${name}, ${type}, ${project}, ${slack?.channel ?? null}, ${ - webhook?.endpoint ?? null - }) + webhook?.endpoint ?? null + }) RETURNING * `, ), @@ -2930,8 +2930,8 @@ export async function createStorage(connection: string, maximumPoolSize: number) INSERT INTO "public"."schema_policy_config" ("resource_type", "resource_id", "config", "allow_overriding") VALUES ('ORGANIZATION', ${input.organizationId}, ${sql.jsonb(input.policy)}, ${ - input.allowOverrides - }) + input.allowOverrides + }) ON CONFLICT (resource_type, resource_id) DO UPDATE diff --git a/packages/services/storage/src/tokens.ts b/packages/services/storage/src/tokens.ts index be5656a84..cf576bf9f 100644 --- a/packages/services/storage/src/tokens.ts +++ b/packages/services/storage/src/tokens.ts @@ -64,9 +64,9 @@ export async function createTokenStorage(connection: string, maximumPoolSize: nu (name, token, token_alias, target_id, project_id, organization_id, scopes) VALUES (${name}, ${token}, ${tokenAlias}, ${target}, ${project}, ${organization}, ${sql.array( - scopes, - 'text', - )}) + scopes, + 'text', + )}) RETURNING * `, ); diff --git a/packages/web/app/pages/404.tsx b/packages/web/app/pages/404.tsx index 690a07bae..d7eb5f68a 100644 --- a/packages/web/app/pages/404.tsx +++ b/packages/web/app/pages/404.tsx @@ -22,8 +22,10 @@ const NotFoundPage = () => {