diff --git a/apps/nestjs-backend/package.json b/apps/nestjs-backend/package.json index 308f697a74..8f42880c93 100644 --- a/apps/nestjs-backend/package.json +++ b/apps/nestjs-backend/package.json @@ -46,7 +46,7 @@ "pre-test-e2e": "cross-env NODE_ENV=test pnpm -F @teable/db-main-prisma prisma-db-seed -- --e2e", "test-e2e": "pnpm pre-test-e2e && vitest run --config ./vitest-e2e.config.ts --silent", "test-e2e-cover": "pnpm test-e2e --coverage --bail 1 ${VITEST_SHARD:+--shard=$VITEST_SHARD}", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "lint": "eslint . --ext .ts,.js,.cjs,.mjs,.mdx --cache --cache-location ../../.cache/eslint/nestjs-backend.eslintcache", "fix-all-files": "eslint . --ext .ts,.tsx,.js,.jsx,.cjs,.mjs,.mdx --fix", "flamegraph-home": "npx 0x --output-dir './.debug/flamegraph/{pid}.0x' --on-port 'autocannon http://localhost:$PORT --duration 20' -- node ../../node_modules/.bin/next start", diff --git a/apps/nestjs-backend/src/app.module.ts b/apps/nestjs-backend/src/app.module.ts index 714ed3783b..aedeae0620 100644 --- a/apps/nestjs-backend/src/app.module.ts +++ b/apps/nestjs-backend/src/app.module.ts @@ -14,6 +14,7 @@ import { AttachmentsModule } from './features/attachments/attachments.module'; import { AuthModule } from './features/auth/auth.module'; import { BaseModule } from './features/base/base.module'; import { BaseNodeModule } from './features/base-node/base-node.module'; +import { BaseShareModule } from './features/base-share/base-share.module'; import { BuiltinAssetsInitModule } from './features/builtin-assets-init'; import { CanaryModule } from './features/canary'; import { ChatModule } from './features/chat/chat.module'; @@ -40,7 +41,6 @@ import { PluginPanelModule } from './features/plugin-panel/plugin-panel.module'; import { SelectionModule } from './features/selection/selection.module'; import { AdminOpenApiModule } from './features/setting/open-api/admin-open-api.module'; import { SettingOpenApiModule } from './features/setting/open-api/setting-open-api.module'; -import { BaseShareModule } from './features/base-share/base-share.module'; import { ShareModule } from './features/share/share.module'; import { SpaceModule } from './features/space/space.module'; import { TemplateOpenApiModule } from './features/template/template-open-api.module'; diff --git a/apps/nestjs-backend/src/event-emitter/listeners/trash.listener.ts b/apps/nestjs-backend/src/event-emitter/listeners/trash.listener.ts index a6072f7596..dc206c13ed 100644 --- a/apps/nestjs-backend/src/event-emitter/listeners/trash.listener.ts +++ b/apps/nestjs-backend/src/event-emitter/listeners/trash.listener.ts @@ -75,7 +75,8 @@ export class TrashListener { case Events.APP_DELETE: { resourceId = payload.appId; resourceType = ResourceType.App; - const app = await this.prismaService.app.findUnique({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const app = await (this.prismaService as any).app.findUnique({ where: { id: resourceId }, select: { id: true, baseId: true, deletedTime: true }, }); @@ -86,7 +87,8 @@ export class TrashListener { case Events.WORKFLOW_DELETE: { resourceId = payload.workflowId; resourceType = ResourceType.Workflow; - const workflow = await this.prismaService.workflow.findUnique({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const workflow = await (this.prismaService as any).workflow.findUnique({ where: { id: resourceId }, select: { id: true, baseId: true, deletedTime: true }, }); diff --git a/apps/nestjs-backend/src/features/canary/interceptors/v2-indicator.interceptor.ts b/apps/nestjs-backend/src/features/canary/interceptors/v2-indicator.interceptor.ts index f835b94cdd..947665f352 100644 --- a/apps/nestjs-backend/src/features/canary/interceptors/v2-indicator.interceptor.ts +++ b/apps/nestjs-backend/src/features/canary/interceptors/v2-indicator.interceptor.ts @@ -6,8 +6,8 @@ import { type CallHandler, Logger, } from '@nestjs/common'; -import * as Sentry from '@sentry/nestjs'; import { trace } from '@opentelemetry/api'; +import * as Sentry from '@sentry/nestjs'; import type { Response } from 'express'; import { ClsService } from 'nestjs-cls'; import type { Observable } from 'rxjs'; diff --git a/apps/nestjs-backend/src/features/field/field-calculate/field-supplement.service.ts b/apps/nestjs-backend/src/features/field/field-calculate/field-supplement.service.ts index c75b7d158f..c5c1f4c309 100644 --- a/apps/nestjs-backend/src/features/field/field-calculate/field-supplement.service.ts +++ b/apps/nestjs-backend/src/features/field/field-calculate/field-supplement.service.ts @@ -80,6 +80,7 @@ import { FormulaFieldDto } from '../model/field-dto/formula-field.dto'; import type { LinkFieldDto } from '../model/field-dto/link-field.dto'; import { RollupFieldDto } from '../model/field-dto/rollup-field.dto'; +// eslint-disable-next-line @typescript-eslint/naming-convention type LinkFieldReference = Pick & { options: Pick & Partial>; diff --git a/apps/nestjs-backend/src/features/field/model/field-dto/created-time-field.dto.ts b/apps/nestjs-backend/src/features/field/model/field-dto/created-time-field.dto.ts index 0e4f6b404f..6fac096a2d 100644 --- a/apps/nestjs-backend/src/features/field/model/field-dto/created-time-field.dto.ts +++ b/apps/nestjs-backend/src/features/field/model/field-dto/created-time-field.dto.ts @@ -20,7 +20,7 @@ export class CreatedTimeFieldDto extends CreatedTimeFieldCore implements FieldBa return input.toISOString(); } if (typeof input === 'string') { - const hasTimezone = /[zZ]|[+-]\d{2}:\d{2}$/.test(input); + const hasTimezone = /z|[+-]\d{2}:\d{2}$/i.test(input); const parsed = new Date(hasTimezone ? input : `${input}Z`); if (!Number.isNaN(parsed.getTime())) { return parsed.toISOString(); diff --git a/apps/nestjs-backend/src/features/field/model/field-dto/last-modified-time-field.dto.ts b/apps/nestjs-backend/src/features/field/model/field-dto/last-modified-time-field.dto.ts index d3d6f5fa02..39001fdf72 100644 --- a/apps/nestjs-backend/src/features/field/model/field-dto/last-modified-time-field.dto.ts +++ b/apps/nestjs-backend/src/features/field/model/field-dto/last-modified-time-field.dto.ts @@ -20,7 +20,7 @@ export class LastModifiedTimeFieldDto extends LastModifiedTimeFieldCore implemen return input.toISOString(); } if (typeof input === 'string') { - const hasTimezone = /[zZ]|[+-]\d{2}:\d{2}$/.test(input); + const hasTimezone = /z|[+-]\d{2}:\d{2}$/i.test(input); const parsed = new Date(hasTimezone ? input : `${input}Z`); if (!Number.isNaN(parsed.getTime())) { return parsed.toISOString(); diff --git a/apps/nestjs-backend/src/features/field/open-api/field-open-api.module.ts b/apps/nestjs-backend/src/features/field/open-api/field-open-api.module.ts index 89b0a4f24f..a5b92eb6ee 100644 --- a/apps/nestjs-backend/src/features/field/open-api/field-open-api.module.ts +++ b/apps/nestjs-backend/src/features/field/open-api/field-open-api.module.ts @@ -14,8 +14,8 @@ import { ViewOpenApiModule } from '../../view/open-api/view-open-api.module'; import { ViewModule } from '../../view/view.module'; import { FieldCalculateModule } from '../field-calculate/field-calculate.module'; import { FieldModule } from '../field.module'; -import { FieldOpenApiController } from './field-open-api.controller'; import { FieldOpenApiV2Service } from './field-open-api-v2.service'; +import { FieldOpenApiController } from './field-open-api.controller'; import { FieldOpenApiService } from './field-open-api.service'; @Module({ diff --git a/apps/nestjs-backend/src/features/integrity/integrity.module.ts b/apps/nestjs-backend/src/features/integrity/integrity.module.ts index b7bcfdc6fe..aa045bd587 100644 --- a/apps/nestjs-backend/src/features/integrity/integrity.module.ts +++ b/apps/nestjs-backend/src/features/integrity/integrity.module.ts @@ -4,9 +4,9 @@ import { FieldModule } from '../field/field.module'; import { TableDomainQueryModule } from '../table-domain'; import { V2Module } from '../v2/v2.module'; import { ForeignKeyIntegrityService } from './foreign-key.service'; -import { IntegrityController } from './integrity.controller'; import { IntegrityV2Controller } from './integrity-v2.controller'; import { IntegrityV2Service } from './integrity-v2.service'; +import { IntegrityController } from './integrity.controller'; import { LinkFieldIntegrityService } from './link-field.service'; import { LinkIntegrityService } from './link-integrity.service'; import { UniqueIndexService } from './unique-index.service'; diff --git a/apps/nestjs-backend/src/features/record/record-modify/record-modify.shared.service.spec.ts b/apps/nestjs-backend/src/features/record/record-modify/record-modify.shared.service.spec.ts index fe26d0b8dc..507ac47d84 100644 --- a/apps/nestjs-backend/src/features/record/record-modify/record-modify.shared.service.spec.ts +++ b/apps/nestjs-backend/src/features/record/record-modify/record-modify.shared.service.spec.ts @@ -55,6 +55,7 @@ describe('RecordModifySharedService', () => { try { getEffectFieldInstances( table, + // eslint-disable-next-line @typescript-eslint/naming-convention [{ Name: 'Task A', 'Source ID 2': 'source-1' }], FieldKeyType.Name ); diff --git a/apps/nestjs-backend/src/features/record/user-name.listener.service.ts b/apps/nestjs-backend/src/features/record/user-name.listener.service.ts index ad798b276f..3955ac5507 100644 --- a/apps/nestjs-backend/src/features/record/user-name.listener.service.ts +++ b/apps/nestjs-backend/src/features/record/user-name.listener.service.ts @@ -1,6 +1,6 @@ import { Injectable, Logger } from '@nestjs/common'; -import { OnEvent } from '@nestjs/event-emitter'; import { ModuleRef } from '@nestjs/core'; +import { OnEvent } from '@nestjs/event-emitter'; import { IUserInfoVo } from '@teable/openapi'; import { EventEmitterService } from '../../event-emitter/event-emitter.service'; import { Events } from '../../event-emitter/events'; diff --git a/apps/nestjs-backend/src/features/table/open-api/table-open-api-v2.service.spec.ts b/apps/nestjs-backend/src/features/table/open-api/table-open-api-v2.service.spec.ts index 45ad79f0a5..777010a964 100644 --- a/apps/nestjs-backend/src/features/table/open-api/table-open-api-v2.service.spec.ts +++ b/apps/nestjs-backend/src/features/table/open-api/table-open-api-v2.service.spec.ts @@ -243,6 +243,7 @@ describe('TableOpenApiV2Service.duplicateTable', () => { vi.clearAllMocks(); }); + /* eslint-disable sonarjs/no-identical-functions */ const createService = (overrides?: { tableService?: Record; fieldOpenApiService?: Record; @@ -272,6 +273,10 @@ describe('TableOpenApiV2Service.duplicateTable', () => { ...overrides?.dbProvider, } as never ); + /* eslint-enable sonarjs/no-identical-functions */ + + const tblDuplicatedId = 'tblDuplicated'; + const duplicatedTableName = 'Orders Copy'; it('rebuilds the legacy duplicate-table response from the duplicated v2 table', async () => { executeDuplicateTableEndpoint.mockResolvedValue({ @@ -280,7 +285,7 @@ describe('TableOpenApiV2Service.duplicateTable', () => { ok: true, data: { table: { - id: 'tblDuplicated', + id: tblDuplicatedId, }, fieldIdMap: { fldSource: 'fldDuplicated', @@ -295,8 +300,8 @@ describe('TableOpenApiV2Service.duplicateTable', () => { const tableService = { getTableMeta: vi.fn().mockResolvedValue({ - id: 'tblDuplicated', - name: 'Orders Copy', + id: tblDuplicatedId, + name: duplicatedTableName, dbTableName: 'bseTest.orders_copy', defaultViewId: 'viwDuplicated', }), @@ -357,7 +362,7 @@ describe('TableOpenApiV2Service.duplicateTable', () => { }); const result = await service.duplicateTable('bseTest', 'tblSource', { - name: 'Orders Copy', + name: duplicatedTableName, includeRecords: true, }); @@ -366,7 +371,7 @@ describe('TableOpenApiV2Service.duplicateTable', () => { { baseId: 'bseTest', tableId: 'tblSource', - name: 'Orders Copy', + name: duplicatedTableName, includeRecords: true, }, {} @@ -400,17 +405,17 @@ describe('TableOpenApiV2Service.duplicateTable', () => { enableShare: true, }, }); - expect(tableService.getTableMeta).toHaveBeenCalledWith('bseTest', 'tblDuplicated'); + expect(tableService.getTableMeta).toHaveBeenCalledWith('bseTest', tblDuplicatedId); expect(fieldOpenApiService.getFields).toHaveBeenNthCalledWith(1, 'tblSource', { filterHidden: false, }); - expect(fieldOpenApiService.getFields).toHaveBeenNthCalledWith(2, 'tblDuplicated', { + expect(fieldOpenApiService.getFields).toHaveBeenNthCalledWith(2, tblDuplicatedId, { filterHidden: false, }); - expect(viewService.getViews).toHaveBeenCalledWith('tblDuplicated'); + expect(viewService.getViews).toHaveBeenCalledWith(tblDuplicatedId); expect(result).toMatchObject({ - id: 'tblDuplicated', - name: 'Orders Copy', + id: tblDuplicatedId, + name: duplicatedTableName, fieldMap: { fldSource: 'fldDuplicated', }, diff --git a/apps/nestjs-backend/src/features/undo-redo/open-api/undo-redo.service.ts b/apps/nestjs-backend/src/features/undo-redo/open-api/undo-redo.service.ts index e163b86747..b80b474a59 100644 --- a/apps/nestjs-backend/src/features/undo-redo/open-api/undo-redo.service.ts +++ b/apps/nestjs-backend/src/features/undo-redo/open-api/undo-redo.service.ts @@ -1,8 +1,8 @@ /* eslint-disable sonarjs/no-duplicate-string */ import { Injectable, Logger } from '@nestjs/common'; import type { IRedoVo, IUndoVo } from '@teable/openapi'; -import { RedoCommand, RedoResult, UndoCommand, UndoResult, v2CoreTokens } from '@teable/v2-core'; -import type { ICommandBus } from '@teable/v2-core'; +import { RedoCommand, UndoCommand, v2CoreTokens } from '@teable/v2-core'; +import type { ICommandBus, RedoResult, UndoResult } from '@teable/v2-core'; import { ClsService } from 'nestjs-cls'; import { CacheService } from '../../../cache/cache.service'; import type { ICacheStore } from '../../../cache/types'; @@ -15,8 +15,10 @@ import { buildUndoRedoEnginePreferenceKey } from './undo-redo-engine-preference' export const X_TEABLE_UNDO_REDO_ENGINE_HEADER = 'x-teable-undo-redo-engine'; +// eslint-disable-next-line @typescript-eslint/naming-convention export type UndoRedoEngine = 'v1' | 'v2'; +// eslint-disable-next-line @typescript-eslint/naming-convention type UndoRedoResponse = { body: T; engine: UndoRedoEngine; diff --git a/apps/nestjs-backend/src/features/v2/v2-container.service.ts b/apps/nestjs-backend/src/features/v2/v2-container.service.ts index 23c7db7dfe..347ced8e9e 100644 --- a/apps/nestjs-backend/src/features/v2/v2-container.service.ts +++ b/apps/nestjs-backend/src/features/v2/v2-container.service.ts @@ -1,20 +1,20 @@ import type { OnModuleDestroy } from '@nestjs/common'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; -import { KeyvUndoRedoStore } from '@teable/v2-adapter-undo-redo-keyv'; import { v2PostgresDbTokens } from '@teable/v2-adapter-db-postgres-pg'; import { ShareDbPubSubPublisher, registerV2ShareDbRealtime, } from '@teable/v2-adapter-realtime-sharedb'; -import { v2CoreTokens } from '@teable/v2-core'; +import { KeyvUndoRedoStore } from '@teable/v2-adapter-undo-redo-keyv'; import { createV2NodePgContainer } from '@teable/v2-container-node'; +import { v2CoreTokens } from '@teable/v2-core'; import type { DependencyContainer } from '@teable/v2-di'; import { registerV2ImportServices } from '@teable/v2-import'; import { PinoLogger } from 'nestjs-pino'; -import { ShareDbService } from '../../share-db/share-db.service'; import { CacheService } from '../../cache/cache.service'; import { IThresholdConfig, ThresholdConfig } from '../../configs/threshold.config'; +import { ShareDbService } from '../../share-db/share-db.service'; import { V2ActionTriggerService } from './v2-action-trigger.service'; import { CommandBusTracingMiddleware } from './v2-command-bus-tracing.middleware'; import { PinoLoggerAdapter } from './v2-logger.adapter'; diff --git a/apps/nestjs-backend/src/features/v2/v2-field-delete-compat.service.ts b/apps/nestjs-backend/src/features/v2/v2-field-delete-compat.service.ts index e855063d78..6c1dd45e3e 100644 --- a/apps/nestjs-backend/src/features/v2/v2-field-delete-compat.service.ts +++ b/apps/nestjs-backend/src/features/v2/v2-field-delete-compat.service.ts @@ -6,9 +6,9 @@ import { FieldDeleted, ProjectionHandler, ok } from '@teable/v2-core'; import type { DomainError, IEventHandler, IExecutionContext, Result } from '@teable/v2-core'; import type { DependencyContainer } from '@teable/v2-di'; import { ViewService } from '../view/view.service'; +import { V2ContainerService } from './v2-container.service'; import { V2_FIELD_DELETE_COMPAT_CONTEXT_KEY } from './v2-field-delete-compat.constants'; import type { IV2FieldDeleteCompatContext } from './v2-field-delete-compat.constants'; -import { V2ContainerService } from './v2-container.service'; import type { IV2ProjectionRegistrar } from './v2-projection-registrar'; const getFieldDeleteCompatContext = ( diff --git a/apps/nestjs-backend/src/features/v2/v2.module.ts b/apps/nestjs-backend/src/features/v2/v2.module.ts index acb5cbce9e..11b395b864 100644 --- a/apps/nestjs-backend/src/features/v2/v2.module.ts +++ b/apps/nestjs-backend/src/features/v2/v2.module.ts @@ -8,12 +8,12 @@ import { ViewModule } from '../view/view.module'; import { V2ActionTriggerService } from './v2-action-trigger.service'; import { V2BaseNodeCompatService } from './v2-base-node-compat.service'; import { V2ContainerService } from './v2-container.service'; -import { V2Controller } from './v2.controller'; import { V2ExecutionContextFactory } from './v2-execution-context.factory'; import { V2FieldDeleteCompatService } from './v2-field-delete-compat.service'; import { V2OpenApiController } from './v2-openapi.controller'; import { V2RecordHistoryService } from './v2-record-history.service'; import { V2UserRenamePropagationService } from './v2-user-rename-propagation.service'; +import { V2Controller } from './v2.controller'; const isRecord = (value: unknown): value is Record => typeof value === 'object' && value !== null; diff --git a/apps/nestjs-backend/src/types/cls.ts b/apps/nestjs-backend/src/types/cls.ts index 51fd5f5161..be3d76c3b6 100644 --- a/apps/nestjs-backend/src/types/cls.ts +++ b/apps/nestjs-backend/src/types/cls.ts @@ -7,6 +7,7 @@ import type { IPerformanceCacheStore } from '../performance-cache'; import type { IRawOpMap } from '../share-db/interface'; import type { IDataLoaderCache } from './data-loader'; +// eslint-disable-next-line @typescript-eslint/naming-convention export type V2Reason = | 'env_force_v2_all' | 'config_force_v2_all' diff --git a/apps/nestjs-backend/src/types/websocket-json-stream.d.ts b/apps/nestjs-backend/src/types/websocket-json-stream.d.ts new file mode 100644 index 0000000000..df1d4cc2ff --- /dev/null +++ b/apps/nestjs-backend/src/types/websocket-json-stream.d.ts @@ -0,0 +1,9 @@ +declare module '@teamwork/websocket-json-stream' { + import { Duplex } from 'stream'; + + class WebSocketJSONStream extends Duplex { + constructor(ws: unknown); + } + + export default WebSocketJSONStream; +} diff --git a/apps/nestjs-backend/src/utils/filter.spec.ts b/apps/nestjs-backend/src/utils/filter.spec.ts index 3900efd9f4..a5efc6cf4b 100644 --- a/apps/nestjs-backend/src/utils/filter.spec.ts +++ b/apps/nestjs-backend/src/utils/filter.spec.ts @@ -12,6 +12,8 @@ const createField = (partial: Partial): IFieldInstance => }) as IFieldInstance; describe('generateFilterItem', () => { + const testValue = 'Supplier A'; + it('uses isNotExactly for multi-value singleSelect fields', () => { const field = createField({ type: FieldType.SingleSelect, @@ -19,10 +21,10 @@ describe('generateFilterItem', () => { isMultipleCellValue: true, }); - const result = generateFilterItem(field, ['Supplier A']); + const result = generateFilterItem(field, [testValue]); expect(result.operator).toBe(isNotExactly.value); - expect(result.value).toEqual(['Supplier A']); + expect(result.value).toEqual([testValue]); }); it('keeps isNot for single-value singleSelect fields', () => { @@ -32,9 +34,9 @@ describe('generateFilterItem', () => { isMultipleCellValue: false, }); - const result = generateFilterItem(field, 'Supplier A'); + const result = generateFilterItem(field, testValue); expect(result.operator).toBe(isNot.value); - expect(result.value).toBe('Supplier A'); + expect(result.value).toBe(testValue); }); }); diff --git a/apps/nestjs-backend/test/base-share.e2e-spec.ts b/apps/nestjs-backend/test/base-share.e2e-spec.ts index bfd548a307..ad0bef2e7f 100644 --- a/apps/nestjs-backend/test/base-share.e2e-spec.ts +++ b/apps/nestjs-backend/test/base-share.e2e-spec.ts @@ -340,6 +340,7 @@ describe('BaseShareController (e2e)', () => { }); expect(authRes.status).toEqual(200); expect(authRes.data.token).toBeDefined(); + // eslint-disable-next-line sonarjs/no-duplicate-string expect(authRes.headers['set-cookie']).toBeDefined(); }); diff --git a/apps/nestjs-backend/test/comment-count-collapsed-group.e2e-spec.ts b/apps/nestjs-backend/test/comment-count-collapsed-group.e2e-spec.ts index 8e38c71de9..b5467954f1 100644 --- a/apps/nestjs-backend/test/comment-count-collapsed-group.e2e-spec.ts +++ b/apps/nestjs-backend/test/comment-count-collapsed-group.e2e-spec.ts @@ -1,12 +1,7 @@ import type { INestApplication } from '@nestjs/common'; import type { IFieldVo, IFilter, IGroup } from '@teable/core'; import { Colors, FieldKeyType, FieldType, SortFunc } from '@teable/core'; -import { - CommentNodeType, - GroupPointType, - createComment, - getCommentCount, -} from '@teable/openapi'; +import { CommentNodeType, GroupPointType, createComment, getCommentCount } from '@teable/openapi'; import type { IGroupHeaderPoint, ITableFullVo } from '@teable/openapi'; import { createField, @@ -58,15 +53,11 @@ describe('OpenAPI Comment count with collapsed groups (e2e)', () => { records: [{ fields: { LookupKey: 'K-1' } }, { fields: { LookupKey: 'K-2' } }], }); - const sourceKeyField = sourceTable.fields.find( - ({ name }) => name === 'LookupKey' - ) as IFieldVo; + const sourceKeyField = sourceTable.fields.find(({ name }) => name === 'LookupKey') as IFieldVo; const sourceCategoryField = sourceTable.fields.find( ({ name }) => name === 'Category' ) as IFieldVo; - const hostKeyField = hostTable.fields.find( - ({ name }) => name === 'LookupKey' - ) as IFieldVo; + const hostKeyField = hostTable.fields.find(({ name }) => name === 'LookupKey') as IFieldVo; const matchByKeyFilter: IFilter = { conjunction: 'and', diff --git a/apps/nestjs-backend/test/formula-conditional-numeric-cast-regression.e2e-spec.ts b/apps/nestjs-backend/test/formula-conditional-numeric-cast-regression.e2e-spec.ts index c3043f4662..985dc09937 100644 --- a/apps/nestjs-backend/test/formula-conditional-numeric-cast-regression.e2e-spec.ts +++ b/apps/nestjs-backend/test/formula-conditional-numeric-cast-regression.e2e-spec.ts @@ -27,6 +27,7 @@ describe('Formula conditional numeric cast safety (regression)', () => { it.skipIf(isForceV2)( 'creates rows successfully when conditional formulas compare malformed numeric text', async () => { + const malformedPrice = '39.9339.93'; const displayPriceFieldId = generateFieldId(); const table = (await createTable(baseId, { name: 'formula_conditional_numeric_cast_regression', @@ -52,7 +53,7 @@ describe('Formula conditional numeric cast safety (regression)', () => { records: [ { fields: { - DisplayPrice: '39.9339.93', + DisplayPrice: malformedPrice, }, }, { @@ -67,12 +68,12 @@ describe('Formula conditional numeric cast safety (regression)', () => { const targetRecords = records.filter((record) => { const displayPrice = record.fields.DisplayPrice; - return displayPrice === '39.9339.93' || displayPrice === '39.93'; + return displayPrice === malformedPrice || displayPrice === '39.93'; }); expect(targetRecords).toHaveLength(2); const malformedNumericRecord = targetRecords.find( - (record) => record.fields.DisplayPrice === '39.9339.93' + (record) => record.fields.DisplayPrice === malformedPrice ); const validNumericRecord = targetRecords.find( (record) => record.fields.DisplayPrice === '39.93' diff --git a/apps/nestjs-backend/test/formula-datetime-format.e2e-spec.ts b/apps/nestjs-backend/test/formula-datetime-format.e2e-spec.ts index b97f720f89..f039f08f65 100644 --- a/apps/nestjs-backend/test/formula-datetime-format.e2e-spec.ts +++ b/apps/nestjs-backend/test/formula-datetime-format.e2e-spec.ts @@ -8,6 +8,7 @@ import { permanentDeleteTable, } from './utils/init-app'; +// eslint-disable-next-line @typescript-eslint/naming-convention const DATETIME_FORMAT_SPECIFIER_CASES = [ { token: 'YY', expected: '26' }, { token: 'YYYY', expected: '2026' }, diff --git a/apps/nestjs-backend/test/formula-fromnow-tonow.e2e-spec.ts b/apps/nestjs-backend/test/formula-fromnow-tonow.e2e-spec.ts index 8cf195e33b..3605f6a721 100644 --- a/apps/nestjs-backend/test/formula-fromnow-tonow.e2e-spec.ts +++ b/apps/nestjs-backend/test/formula-fromnow-tonow.e2e-spec.ts @@ -14,6 +14,7 @@ const toNumber = (value: unknown): number => { return parsed; }; +// eslint-disable-next-line @typescript-eslint/naming-convention const FLOAT_COMPARISON_TOLERANCE = 1e-9; describe('Formula FROMNOW / TONOW (e2e)', () => { diff --git a/apps/nestjs-backend/test/record-unary-filter.e2e-spec.ts b/apps/nestjs-backend/test/record-unary-filter.e2e-spec.ts index 6c73fbbc2d..16b360f682 100644 --- a/apps/nestjs-backend/test/record-unary-filter.e2e-spec.ts +++ b/apps/nestjs-backend/test/record-unary-filter.e2e-spec.ts @@ -1,6 +1,6 @@ import type { INestApplication } from '@nestjs/common'; -import type { IGetRecordsRo, ITableFullVo } from '@teable/openapi'; import { Colors, FieldKeyType, FieldType } from '@teable/core'; +import type { IGetRecordsRo, ITableFullVo } from '@teable/openapi'; import { createTable, getRecords, initApp, permanentDeleteTable } from './utils/init-app'; describe('Record unary filter operators (e2e)', () => { diff --git a/apps/nestjs-backend/test/v2-action-trigger-field-conversion.e2e-spec.ts b/apps/nestjs-backend/test/v2-action-trigger-field-conversion.e2e-spec.ts index 9a1913c815..882e77c0d8 100644 --- a/apps/nestjs-backend/test/v2-action-trigger-field-conversion.e2e-spec.ts +++ b/apps/nestjs-backend/test/v2-action-trigger-field-conversion.e2e-spec.ts @@ -18,6 +18,7 @@ interface IActionTrigger { } const amountTextFieldName = 'Amount Text'; +const xTeableV2Header = xTeableV2Header; let fieldIdCounter = 0; @@ -212,7 +213,7 @@ describe('V2 action trigger field conversion (e2e)', () => { ); expect(response.status).toBe(200); - expect(response.headers['x-teable-v2']).toBe('true'); + expect(response.headers[xTeableV2Header]).toBe('true'); }, }); @@ -304,7 +305,7 @@ describe('V2 action trigger field conversion (e2e)', () => { ); expect(response.status).toBe(200); - expect(response.headers['x-teable-v2']).toBe('true'); + expect(response.headers[xTeableV2Header]).toBe('true'); }, }); @@ -436,7 +437,7 @@ describe('V2 action trigger field conversion (e2e)', () => { ); expect(response.status).toBe(200); - expect(response.headers['x-teable-v2']).toBe('true'); + expect(response.headers[xTeableV2Header]).toBe('true'); }, }); @@ -499,7 +500,7 @@ describe('V2 action trigger field conversion (e2e)', () => { ); expect(response.status).toBe(201); - expect(response.headers['x-teable-v2']).toBe('true'); + expect(response.headers[xTeableV2Header]).toBe('true'); }, }); diff --git a/apps/nestjs-backend/test/v2-update-records.e2e-spec.ts b/apps/nestjs-backend/test/v2-update-records.e2e-spec.ts index ec6eefa2aa..74bfdddb51 100644 --- a/apps/nestjs-backend/test/v2-update-records.e2e-spec.ts +++ b/apps/nestjs-backend/test/v2-update-records.e2e-spec.ts @@ -141,6 +141,7 @@ describe('V2Controller updateRecords (e2e)', () => { method: 'POST', headers: { cookie, + // eslint-disable-next-line @typescript-eslint/naming-convention 'content-type': 'application/json', }, body: JSON.stringify({ @@ -192,6 +193,7 @@ describe('V2Controller updateRecords (e2e)', () => { method: 'POST', headers: { cookie, + // eslint-disable-next-line @typescript-eslint/naming-convention 'content-type': 'application/json', }, body: JSON.stringify({ @@ -257,6 +259,7 @@ describe('V2Controller updateRecords (e2e)', () => { method: 'POST', headers: { cookie, + // eslint-disable-next-line @typescript-eslint/naming-convention 'content-type': 'application/json', }, body: JSON.stringify({ @@ -336,6 +339,7 @@ describe('V2Controller updateRecords (e2e)', () => { method: 'POST', headers: { cookie, + // eslint-disable-next-line @typescript-eslint/naming-convention 'content-type': 'application/json', }, body: JSON.stringify({ @@ -411,6 +415,7 @@ describe('V2Controller updateRecords (e2e)', () => { method: 'POST', headers: { cookie, + // eslint-disable-next-line @typescript-eslint/naming-convention 'content-type': 'application/json', }, body: JSON.stringify({ diff --git a/apps/nestjs-backend/tsconfig.typecheck.json b/apps/nestjs-backend/tsconfig.typecheck.json new file mode 100644 index 0000000000..bd2abe7694 --- /dev/null +++ b/apps/nestjs-backend/tsconfig.typecheck.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", + "compilerOptions": { + "skipLibCheck": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "dist", + "**/*.spec.ts", + "**/*.test.ts", + "test/**", + "../../packages/v2/**/*.spec.ts", + "../../packages/v2/**/*.test.ts", + "../../packages/v2/adapter-realtime-sharedb/src/ShareDbWebSocketServer.ts" + ] +} diff --git a/apps/nextjs-app/src/features/app/blocks/view/grid/utils/selectionViewQuery.spec.ts b/apps/nextjs-app/src/features/app/blocks/view/grid/utils/selectionViewQuery.spec.ts index 329cd4a644..7623c171ab 100644 --- a/apps/nextjs-app/src/features/app/blocks/view/grid/utils/selectionViewQuery.spec.ts +++ b/apps/nextjs-app/src/features/app/blocks/view/grid/utils/selectionViewQuery.spec.ts @@ -1,3 +1,4 @@ +import { SortFunc } from '@teable/core'; import type { IGetRecordsRo } from '@teable/openapi'; import { describe, expect, it } from 'vitest'; import { buildSelectionViewQuery } from './selectionViewQuery'; @@ -12,8 +13,12 @@ describe('buildSelectionViewQuery', () => { conjunction: 'and', filterSet: [{ fieldId: 'fldValue', operator: 'is', value: 'Open' }], }; - const orderBy: NonNullable = [{ fieldId: 'fldSort', order: 'desc' }]; - const groupBy: NonNullable = [{ fieldId: 'fldGroup', order: 'asc' }]; + const orderBy: NonNullable = [ + { fieldId: 'fldSort', order: SortFunc.Desc }, + ]; + const groupBy: NonNullable = [ + { fieldId: 'fldGroup', order: SortFunc.Asc }, + ]; expect( buildSelectionViewQuery({ @@ -60,12 +65,14 @@ describe('buildSelectionViewQuery', () => { }); it('keeps ignoreViewQuery when personal query changes sorting', () => { - const orderBy: NonNullable = [{ fieldId: 'fldSort', order: 'asc' }]; + const orderBy: NonNullable = [ + { fieldId: 'fldSort', order: SortFunc.Asc }, + ]; expect( buildSelectionViewQuery({ view: { - sort: { sortObjs: [{ fieldId: 'fldSort', order: 'desc' }] }, + sort: { sortObjs: [{ fieldId: 'fldSort', order: SortFunc.Desc }] }, }, personalViewCommonQuery: { ignoreViewQuery: true, diff --git a/packages/i18n-keys/.eslintrc.cjs b/packages/i18n-keys/.eslintrc.cjs new file mode 100644 index 0000000000..1552877923 --- /dev/null +++ b/packages/i18n-keys/.eslintrc.cjs @@ -0,0 +1,42 @@ +/** + * Specific eslint rules for this workspace, learn how to compose + * @link https://github.com/teableio/teable/tree/main/packages/eslint-config-bases + */ +require('@teable/eslint-config-bases/patch/modern-module-resolution'); + +const { getDefaultIgnorePatterns } = require('@teable/eslint-config-bases/helpers'); + +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + parserOptions: { + tsconfigRootDir: __dirname, + project: 'tsconfig.eslint.json', + }, + ignorePatterns: [...getDefaultIgnorePatterns()], + extends: [ + '@teable/eslint-config-bases/typescript', + '@teable/eslint-config-bases/sonar', + '@teable/eslint-config-bases/regexp', + '@teable/eslint-config-bases/jest', + // Apply prettier and disable incompatible rules + '@teable/eslint-config-bases/prettier-plugin', + ], + rules: { + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: ['typeAlias', 'interface'], + format: ['PascalCase'], + prefix: ['I'], + filter: { + regex: '^(TableI18nKey)$', + match: false, + }, + }, + ], + }, + overrides: [ + // optional overrides per project file match + ], +}; diff --git a/packages/i18n-keys/tsconfig.eslint.json b/packages/i18n-keys/tsconfig.eslint.json new file mode 100644 index 0000000000..758f9a7e33 --- /dev/null +++ b/packages/i18n-keys/tsconfig.eslint.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "noEmit": true, + "allowJs": true + }, + "exclude": ["node_modules", "**/.*/*", "dist"], + "include": [ + ".eslintrc.*", + "**/*.ts", + "**/*.tsx", + "**/*.mts", + "**/*.js", + "**/*.cjs", + "**/*.mjs", + "**/*.jsx", + "**/*.json" + ] +} diff --git a/packages/v2/adapter-csv-parser-papaparse/.eslintrc.cjs b/packages/v2/adapter-csv-parser-papaparse/.eslintrc.cjs new file mode 100644 index 0000000000..b1815ba8aa --- /dev/null +++ b/packages/v2/adapter-csv-parser-papaparse/.eslintrc.cjs @@ -0,0 +1,29 @@ +/** + * Specific eslint rules for this workspace, learn how to compose + * @link https://github.com/teableio/teable/tree/main/packages/eslint-config-bases + */ +require('@teable/eslint-config-bases/patch/modern-module-resolution'); + +const { getDefaultIgnorePatterns } = require('@teable/eslint-config-bases/helpers'); + +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + parserOptions: { + tsconfigRootDir: __dirname, + project: 'tsconfig.eslint.json', + }, + ignorePatterns: [...getDefaultIgnorePatterns()], + extends: [ + '@teable/eslint-config-bases/typescript', + '@teable/eslint-config-bases/sonar', + '@teable/eslint-config-bases/regexp', + '@teable/eslint-config-bases/jest', + // Apply prettier and disable incompatible rules + '@teable/eslint-config-bases/prettier-plugin', + ], + rules: { + '@typescript-eslint/consistent-type-imports': 'off', + }, + overrides: [], +}; diff --git a/packages/v2/adapter-csv-parser-papaparse/package.json b/packages/v2/adapter-csv-parser-papaparse/package.json index 8c15214df2..7abeb76016 100644 --- a/packages/v2/adapter-csv-parser-papaparse/package.json +++ b/packages/v2/adapter-csv-parser-papaparse/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-csv-parser-papaparse.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent --passWithNoTests", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/adapter-csv-parser-papaparse/src/PapaparseCsvParser.ts b/packages/v2/adapter-csv-parser-papaparse/src/PapaparseCsvParser.ts index fd4a29b630..c664399936 100644 --- a/packages/v2/adapter-csv-parser-papaparse/src/PapaparseCsvParser.ts +++ b/packages/v2/adapter-csv-parser-papaparse/src/PapaparseCsvParser.ts @@ -179,6 +179,7 @@ export class PapaparseCsvParser implements ICsvParser { * 创建流式 CSV 解析器 * 返回 headers 和异步行迭代器 */ + // eslint-disable-next-line sonarjs/cognitive-complexity private async createStreamingParser( body: ReadableStream, options: { delimiter?: string; hasHeader: boolean; skipEmptyLines: boolean } @@ -238,6 +239,7 @@ export class PapaparseCsvParser implements ICsvParser { let currentBuffer = buffer; return { + // eslint-disable-next-line sonarjs/cognitive-complexity async next(): Promise>> { // 先返回已解析的 pending rows if (pendingIndex < pendingRows.length) { diff --git a/packages/v2/adapter-csv-parser-papaparse/tsconfig.eslint.json b/packages/v2/adapter-csv-parser-papaparse/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-csv-parser-papaparse/tsconfig.eslint.json +++ b/packages/v2/adapter-csv-parser-papaparse/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-csv-parser-papaparse/tsconfig.typecheck.json b/packages/v2/adapter-csv-parser-papaparse/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/adapter-csv-parser-papaparse/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-db-postgres-pg/.eslintrc.cjs b/packages/v2/adapter-db-postgres-pg/.eslintrc.cjs index b1815ba8aa..aa2010082f 100644 --- a/packages/v2/adapter-db-postgres-pg/.eslintrc.cjs +++ b/packages/v2/adapter-db-postgres-pg/.eslintrc.cjs @@ -24,6 +24,7 @@ module.exports = { ], rules: { '@typescript-eslint/consistent-type-imports': 'off', + 'import/no-unresolved': ['error', { ignore: ['vitest'] }], }, overrides: [], }; diff --git a/packages/v2/adapter-db-postgres-pg/package.json b/packages/v2/adapter-db-postgres-pg/package.json index f0fff851d5..95fec809a9 100644 --- a/packages/v2/adapter-db-postgres-pg/package.json +++ b/packages/v2/adapter-db-postgres-pg/package.json @@ -26,7 +26,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-db-postgres-pg.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" }, "dependencies": { diff --git a/packages/v2/adapter-db-postgres-pg/src/createDb.ts b/packages/v2/adapter-db-postgres-pg/src/createDb.ts index 289aa1866a..5dc054f0b7 100644 --- a/packages/v2/adapter-db-postgres-pg/src/createDb.ts +++ b/packages/v2/adapter-db-postgres-pg/src/createDb.ts @@ -56,7 +56,13 @@ const hasPgDefault = ( ): value is typeof import('pg') & { default: PgDefaultExport; } => { - return 'default' in value && !!value.default && 'Pool' in value.default; + const v = value as Record; + return ( + 'default' in v && + !!v.default && + typeof v.default === 'object' && + 'Pool' in (v.default as Record) + ); }; type PgPoolOptions = { diff --git a/packages/v2/adapter-db-postgres-pg/tsconfig.eslint.json b/packages/v2/adapter-db-postgres-pg/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-db-postgres-pg/tsconfig.eslint.json +++ b/packages/v2/adapter-db-postgres-pg/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-db-postgres-pg/tsconfig.typecheck.json b/packages/v2/adapter-db-postgres-pg/tsconfig.typecheck.json new file mode 100644 index 0000000000..4a5a30e102 --- /dev/null +++ b/packages/v2/adapter-db-postgres-pg/tsconfig.typecheck.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../core/src/**/*.spec.ts", + "../core/src/**/*.test.ts", + "../adapter-db-postgres-shared/src/**/*.spec.ts", + "src/**/*.spec.ts", + "src/**/*.test.ts", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-db-postgres-pglite/package.json b/packages/v2/adapter-db-postgres-pglite/package.json index 49432417a5..99fd7e73c6 100644 --- a/packages/v2/adapter-db-postgres-pglite/package.json +++ b/packages/v2/adapter-db-postgres-pglite/package.json @@ -26,7 +26,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-db-postgres-pglite.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" }, "dependencies": { diff --git a/packages/v2/adapter-db-postgres-pglite/tsconfig.eslint.json b/packages/v2/adapter-db-postgres-pglite/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-db-postgres-pglite/tsconfig.eslint.json +++ b/packages/v2/adapter-db-postgres-pglite/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-db-postgres-pglite/tsconfig.typecheck.json b/packages/v2/adapter-db-postgres-pglite/tsconfig.typecheck.json new file mode 100644 index 0000000000..5ffc68af1c --- /dev/null +++ b/packages/v2/adapter-db-postgres-pglite/tsconfig.typecheck.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../core/src/**/*.spec.ts", + "../core/src/**/*.test.ts", + "../adapter-db-postgres-shared/src/**/*.spec.ts", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-db-postgres-postgresjs/package.json b/packages/v2/adapter-db-postgres-postgresjs/package.json index 3cca0cdd95..9aa99788d0 100644 --- a/packages/v2/adapter-db-postgres-postgresjs/package.json +++ b/packages/v2/adapter-db-postgres-postgresjs/package.json @@ -26,7 +26,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-db-postgres-postgresjs.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" }, "dependencies": { diff --git a/packages/v2/adapter-db-postgres-postgresjs/tsconfig.eslint.json b/packages/v2/adapter-db-postgres-postgresjs/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-db-postgres-postgresjs/tsconfig.eslint.json +++ b/packages/v2/adapter-db-postgres-postgresjs/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-db-postgres-postgresjs/tsconfig.typecheck.json b/packages/v2/adapter-db-postgres-postgresjs/tsconfig.typecheck.json new file mode 100644 index 0000000000..5ffc68af1c --- /dev/null +++ b/packages/v2/adapter-db-postgres-postgresjs/tsconfig.typecheck.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../core/src/**/*.spec.ts", + "../core/src/**/*.test.ts", + "../adapter-db-postgres-shared/src/**/*.spec.ts", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-db-postgres-shared/package.json b/packages/v2/adapter-db-postgres-shared/package.json index 97871fc61c..a02bb0ed1e 100644 --- a/packages/v2/adapter-db-postgres-shared/package.json +++ b/packages/v2/adapter-db-postgres-shared/package.json @@ -26,7 +26,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-db-postgres-shared.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" }, "dependencies": { diff --git a/packages/v2/adapter-db-postgres-shared/tsconfig.eslint.json b/packages/v2/adapter-db-postgres-shared/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-db-postgres-shared/tsconfig.eslint.json +++ b/packages/v2/adapter-db-postgres-shared/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-db-postgres-shared/tsconfig.typecheck.json b/packages/v2/adapter-db-postgres-shared/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/adapter-db-postgres-shared/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-logger-console/package.json b/packages/v2/adapter-logger-console/package.json index 8180c7de5c..ad891ece89 100644 --- a/packages/v2/adapter-logger-console/package.json +++ b/packages/v2/adapter-logger-console/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-logger-console.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/adapter-logger-console/tsconfig.eslint.json b/packages/v2/adapter-logger-console/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-logger-console/tsconfig.eslint.json +++ b/packages/v2/adapter-logger-console/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-logger-console/tsconfig.typecheck.json b/packages/v2/adapter-logger-console/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/adapter-logger-console/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-logger-pino/package.json b/packages/v2/adapter-logger-pino/package.json index 85260d56ee..3dd085461e 100644 --- a/packages/v2/adapter-logger-pino/package.json +++ b/packages/v2/adapter-logger-pino/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-logger-pino.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/adapter-logger-pino/tsconfig.eslint.json b/packages/v2/adapter-logger-pino/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-logger-pino/tsconfig.eslint.json +++ b/packages/v2/adapter-logger-pino/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-logger-pino/tsconfig.typecheck.json b/packages/v2/adapter-logger-pino/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/adapter-logger-pino/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-realtime-broadcastchannel/package.json b/packages/v2/adapter-realtime-broadcastchannel/package.json index 6595dba42b..d312238cc3 100644 --- a/packages/v2/adapter-realtime-broadcastchannel/package.json +++ b/packages/v2/adapter-realtime-broadcastchannel/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-realtime-broadcastchannel.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent --passWithNoTests", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/adapter-realtime-broadcastchannel/tsconfig.eslint.json b/packages/v2/adapter-realtime-broadcastchannel/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-realtime-broadcastchannel/tsconfig.eslint.json +++ b/packages/v2/adapter-realtime-broadcastchannel/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-realtime-broadcastchannel/tsconfig.typecheck.json b/packages/v2/adapter-realtime-broadcastchannel/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/adapter-realtime-broadcastchannel/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-realtime-sharedb/package.json b/packages/v2/adapter-realtime-sharedb/package.json index 3b7e17b8c6..17f127ab04 100644 --- a/packages/v2/adapter-realtime-sharedb/package.json +++ b/packages/v2/adapter-realtime-sharedb/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-realtime-sharedb.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/adapter-realtime-sharedb/src/ShareDbPubSubPublisher.spec.ts b/packages/v2/adapter-realtime-sharedb/src/ShareDbPubSubPublisher.spec.ts index f0a49926c9..969603ddf9 100644 --- a/packages/v2/adapter-realtime-sharedb/src/ShareDbPubSubPublisher.spec.ts +++ b/packages/v2/adapter-realtime-sharedb/src/ShareDbPubSubPublisher.spec.ts @@ -1,5 +1,5 @@ -import { describe, expect, it } from 'vitest'; import type { PubSub } from 'sharedb'; +import { describe, expect, it } from 'vitest'; import { ShareDbPubSubPublisher } from './ShareDbPubSubPublisher'; diff --git a/packages/v2/adapter-realtime-sharedb/src/ShareDbRealtimeEngine.ts b/packages/v2/adapter-realtime-sharedb/src/ShareDbRealtimeEngine.ts index 5b67b36db1..dd73850e18 100644 --- a/packages/v2/adapter-realtime-sharedb/src/ShareDbRealtimeEngine.ts +++ b/packages/v2/adapter-realtime-sharedb/src/ShareDbRealtimeEngine.ts @@ -1,13 +1,13 @@ -import type { - DomainError, - IExecutionContext, - IRealtimeEngine, - RealtimeApplyChangeOptions, - RealtimeChange, - RealtimeDocId, +import { + domainError, + RealtimeDocId as RealtimeDocIdValue, + type DomainError, + type IExecutionContext, + type IRealtimeEngine, + type RealtimeApplyChangeOptions, + type RealtimeChange, + type RealtimeDocId, } from '@teable/v2-core'; -import { domainError } from '@teable/v2-core'; -import { RealtimeDocId as RealtimeDocIdValue } from '@teable/v2-core'; import { inject, injectable } from '@teable/v2-di'; import { err } from 'neverthrow'; import type { Result } from 'neverthrow'; diff --git a/packages/v2/adapter-realtime-sharedb/tsconfig.eslint.json b/packages/v2/adapter-realtime-sharedb/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-realtime-sharedb/tsconfig.eslint.json +++ b/packages/v2/adapter-realtime-sharedb/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-realtime-sharedb/tsconfig.typecheck.json b/packages/v2/adapter-realtime-sharedb/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/adapter-realtime-sharedb/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-repository-postgres/package.json b/packages/v2/adapter-repository-postgres/package.json index 60eec432f2..a1b8b4b630 100644 --- a/packages/v2/adapter-repository-postgres/package.json +++ b/packages/v2/adapter-repository-postgres/package.json @@ -26,7 +26,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-repository-postgres.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/adapter-repository-postgres/src/repositories/TableFieldPersistenceBuilder.spec.ts b/packages/v2/adapter-repository-postgres/src/repositories/TableFieldPersistenceBuilder.spec.ts index bc1ac20aa8..d0b965d88a 100644 --- a/packages/v2/adapter-repository-postgres/src/repositories/TableFieldPersistenceBuilder.spec.ts +++ b/packages/v2/adapter-repository-postgres/src/repositories/TableFieldPersistenceBuilder.spec.ts @@ -1,5 +1,3 @@ -import { describe, expect, it } from 'vitest'; - import { ActorId, BaseId, @@ -11,6 +9,7 @@ import { TableId, TableName, } from '@teable/v2-core'; +import { describe, expect, it } from 'vitest'; import { TableFieldPersistenceBuilder } from './TableFieldPersistenceBuilder'; describe('TableFieldPersistenceBuilder', () => { diff --git a/packages/v2/adapter-repository-postgres/src/repositories/visitors/TableRecordConditionWhereVisitor.ts b/packages/v2/adapter-repository-postgres/src/repositories/visitors/TableRecordConditionWhereVisitor.ts index b7c897250b..08e8ed83b5 100644 --- a/packages/v2/adapter-repository-postgres/src/repositories/visitors/TableRecordConditionWhereVisitor.ts +++ b/packages/v2/adapter-repository-postgres/src/repositories/visitors/TableRecordConditionWhereVisitor.ts @@ -614,6 +614,18 @@ export class TableRecordConditionWhereVisitor return this.addCondition(sql`${sql.ref(column)} in (${sql.join(ids)})`); } + visitIncomingLinkSelected( + _spec: core.IncomingLinkSelectedSpec + ): Result { + throw new Error('visitIncomingLinkSelected not implemented'); + } + + visitIncomingLinkCandidate( + _spec: core.IncomingLinkCandidateSpec + ): Result { + throw new Error('visitIncomingLinkCandidate not implemented'); + } + visitSingleLineTextIs( spec: core.SingleLineTextConditionSpec ): Result { diff --git a/packages/v2/adapter-repository-postgres/tsconfig.eslint.json b/packages/v2/adapter-repository-postgres/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/adapter-repository-postgres/tsconfig.eslint.json +++ b/packages/v2/adapter-repository-postgres/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/adapter-repository-postgres/tsconfig.typecheck.json b/packages/v2/adapter-repository-postgres/tsconfig.typecheck.json new file mode 100644 index 0000000000..1bfdb0d337 --- /dev/null +++ b/packages/v2/adapter-repository-postgres/tsconfig.typecheck.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true, + "types": ["vitest/globals", "node"] + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-table-repository-postgres/package.json b/packages/v2/adapter-table-repository-postgres/package.json index 8deead1ffc..f78ea3fe4f 100644 --- a/packages/v2/adapter-table-repository-postgres/package.json +++ b/packages/v2/adapter-table-repository-postgres/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-table-repository-postgres.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/adapter-table-repository-postgres/src/record/computed/RunComputedTaskByIdHandler.ts b/packages/v2/adapter-table-repository-postgres/src/record/computed/RunComputedTaskByIdHandler.ts index da7edd23cf..0948a83994 100644 --- a/packages/v2/adapter-table-repository-postgres/src/record/computed/RunComputedTaskByIdHandler.ts +++ b/packages/v2/adapter-table-repository-postgres/src/record/computed/RunComputedTaskByIdHandler.ts @@ -1,14 +1,19 @@ -import { domainError, type DomainError, type IExecutionContext } from '@teable/v2-core'; +import { + CommandHandler, + domainError, + type DomainError, + type ICommandHandler, + type IExecutionContext, +} from '@teable/v2-core'; import { inject, injectable } from '@teable/v2-di'; import { err, ok, type Result } from 'neverthrow'; import { v2RecordRepositoryPostgresTokens } from '../di/tokens'; -import type { ComputedUpdateWorker } from './worker/ComputedUpdateWorker'; -import { CommandHandler, type ICommandHandler } from '@teable/v2-core'; import { RunComputedTaskByIdCommand, type RunComputedTaskByIdResult, } from './RunComputedTaskByIdCommand'; +import type { ComputedUpdateWorker } from './worker/ComputedUpdateWorker'; @CommandHandler(RunComputedTaskByIdCommand) @injectable() diff --git a/packages/v2/adapter-table-repository-postgres/src/record/computed/__tests__/ComputedFieldCascadeAfterSchemaUpdate.spec.ts b/packages/v2/adapter-table-repository-postgres/src/record/computed/__tests__/ComputedFieldCascadeAfterSchemaUpdate.spec.ts index a655166a51..58d467e2df 100644 --- a/packages/v2/adapter-table-repository-postgres/src/record/computed/__tests__/ComputedFieldCascadeAfterSchemaUpdate.spec.ts +++ b/packages/v2/adapter-table-repository-postgres/src/record/computed/__tests__/ComputedFieldCascadeAfterSchemaUpdate.spec.ts @@ -2,8 +2,8 @@ import { ActorId, BaseId, FieldName, Table, TableId, TableName, ok } from '@teab import type { IExecutionContext, ITableRepository } from '@teable/v2-core'; import { describe, expect, it, vi } from 'vitest'; -import { ComputedFieldCascadeAfterSchemaUpdate } from '../ComputedFieldCascadeAfterSchemaUpdate'; import type { ComputedFieldBackfillService } from '../ComputedFieldBackfillService'; +import { ComputedFieldCascadeAfterSchemaUpdate } from '../ComputedFieldCascadeAfterSchemaUpdate'; import type { ComputedUpdatePlan, ComputedUpdatePlanner } from '../ComputedUpdatePlanner'; const createTable = () => { diff --git a/packages/v2/adapter-table-repository-postgres/src/record/computed/worker/ComputedUpdateWorker.ts b/packages/v2/adapter-table-repository-postgres/src/record/computed/worker/ComputedUpdateWorker.ts index 0d052f5c9a..b68f109c93 100644 --- a/packages/v2/adapter-table-repository-postgres/src/record/computed/worker/ComputedUpdateWorker.ts +++ b/packages/v2/adapter-table-repository-postgres/src/record/computed/worker/ComputedUpdateWorker.ts @@ -25,13 +25,14 @@ import type { Result } from 'neverthrow'; import { v2RecordRepositoryPostgresTokens } from '../../di/tokens'; import type { ComputedFieldBackfillService } from '../ComputedFieldBackfillService'; import type { ComputedFieldUpdater, StepChangeData } from '../ComputedFieldUpdater'; -import type { - ComputedSeedGroup, - ComputedUpdatePlan, - ComputedUpdatePlanner, +import { + splitSeedGroupsForPlan, + type ComputedSeedGroup, + type ComputedUpdatePlan, + type ComputedUpdatePlanner, } from '../ComputedUpdatePlanner'; -import { splitSeedGroupsForPlan } from '../ComputedUpdatePlanner'; import { createComputedUpdateRun } from '../ComputedUpdateRun'; +import { toErrorLogFields } from '../errorLog'; import type { ComputedUpdateOutboxItem, ComputedUpdateOutboxPayload, @@ -41,7 +42,6 @@ import { deserializeComputedUpdatePlan, } from '../outbox/ComputedUpdateOutboxPayload'; import { deserializeSeedPayload } from '../outbox/ComputedUpdateSeedPayload'; -import { toErrorLogFields } from '../errorLog'; import type { AnyOutboxItem, ComputedUpdateOutboxConfig, diff --git a/packages/v2/adapter-table-repository-postgres/src/record/computed/worker/startComputedUpdatePollingIfEnabled.ts b/packages/v2/adapter-table-repository-postgres/src/record/computed/worker/startComputedUpdatePollingIfEnabled.ts index eb2c31adb5..1f907acbc3 100644 --- a/packages/v2/adapter-table-repository-postgres/src/record/computed/worker/startComputedUpdatePollingIfEnabled.ts +++ b/packages/v2/adapter-table-repository-postgres/src/record/computed/worker/startComputedUpdatePollingIfEnabled.ts @@ -1,8 +1,10 @@ import type { DependencyContainer } from '@teable/v2-di'; import { v2RecordRepositoryPostgresTokens } from '../../di/tokens'; -import type { ComputedUpdatePollingConfig } from './ComputedUpdatePollingService'; -import { ComputedUpdatePollingService } from './ComputedUpdatePollingService'; +import type { + ComputedUpdatePollingConfig, + ComputedUpdatePollingService, +} from './ComputedUpdatePollingService'; export const startComputedUpdatePollingIfEnabled = ( container: DependencyContainer diff --git a/packages/v2/adapter-table-repository-postgres/src/record/repository/PostgresTableRecordQueryRepository.ts b/packages/v2/adapter-table-repository-postgres/src/record/repository/PostgresTableRecordQueryRepository.ts index 0d18c75526..c532127abe 100644 --- a/packages/v2/adapter-table-repository-postgres/src/record/repository/PostgresTableRecordQueryRepository.ts +++ b/packages/v2/adapter-table-repository-postgres/src/record/repository/PostgresTableRecordQueryRepository.ts @@ -40,10 +40,10 @@ import type { FieldOutputColumn, DynamicDB, } from '../query-builder'; +import { buildRecordWhereClause } from './buildRecordWhereClause'; import { CursorStreamPaginationStrategy } from './CursorStreamPaginationStrategy'; import { OffsetStreamPaginationStrategy } from './OffsetStreamPaginationStrategy'; import { buildRecordSearchWhereClause } from './RecordSearchWhereBuilder'; -import { buildRecordWhereClause } from './buildRecordWhereClause'; const RECORD_ID_COLUMN = '__id'; const RECORD_VERSION_COLUMN = '__version'; @@ -621,7 +621,7 @@ export class PostgresTableRecordQueryRepository implements ITableRecordQueryRepo return compiled; } const cteName = source.cteName.trim(); - if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(cteName)) { + if (!/^[A-Z_]\w*$/i.test(cteName)) { this.logger.warn('Skip invalid record read CTE name', { cteName, }); diff --git a/packages/v2/adapter-table-repository-postgres/src/record/repository/RecordSearchWhereBuilder.pglite.spec.ts b/packages/v2/adapter-table-repository-postgres/src/record/repository/RecordSearchWhereBuilder.pglite.spec.ts index 6199d9a7c6..44863d8c6c 100644 --- a/packages/v2/adapter-table-repository-postgres/src/record/repository/RecordSearchWhereBuilder.pglite.spec.ts +++ b/packages/v2/adapter-table-repository-postgres/src/record/repository/RecordSearchWhereBuilder.pglite.spec.ts @@ -35,6 +35,7 @@ class PGliteDialect implements Dialect { numAffectedRows: result.affectedRows ? BigInt(result.affectedRows) : undefined, }; }, + // eslint-disable-next-line require-yield streamQuery: async function* () { throw new Error('PGlite does not support streaming'); }, diff --git a/packages/v2/adapter-table-repository-postgres/src/record/repository/buildRecordWhereClause.ts b/packages/v2/adapter-table-repository-postgres/src/record/repository/buildRecordWhereClause.ts index a31d3d27ba..dea06786f4 100644 --- a/packages/v2/adapter-table-repository-postgres/src/record/repository/buildRecordWhereClause.ts +++ b/packages/v2/adapter-table-repository-postgres/src/record/repository/buildRecordWhereClause.ts @@ -1,13 +1,12 @@ -import { err, ok } from 'neverthrow'; -import type { Result } from 'neverthrow'; -import type { Expression, SqlBool } from 'kysely'; - import type { DomainError, ISpecification, ITableRecordConditionSpecVisitor, TableRecord, } from '@teable/v2-core'; +import type { Expression, SqlBool } from 'kysely'; +import { err, ok } from 'neverthrow'; +import type { Result } from 'neverthrow'; import { TableRecordConditionWhereVisitor, diff --git a/packages/v2/adapter-table-repository-postgres/src/schema/visitors/__tests__/FieldTypeConversionVisitor.spec.ts b/packages/v2/adapter-table-repository-postgres/src/schema/visitors/__tests__/FieldTypeConversionVisitor.spec.ts index 0a53ba1535..02001c7102 100644 --- a/packages/v2/adapter-table-repository-postgres/src/schema/visitors/__tests__/FieldTypeConversionVisitor.spec.ts +++ b/packages/v2/adapter-table-repository-postgres/src/schema/visitors/__tests__/FieldTypeConversionVisitor.spec.ts @@ -25,8 +25,8 @@ import { DateFormattingPreset, TimeFormatting, TimeZone, + type Field, } from '@teable/v2-core'; -import type { Field } from '@teable/v2-core'; import { describe, expect, it } from 'vitest'; import { diff --git a/packages/v2/adapter-table-repository-postgres/src/shared/errors.ts b/packages/v2/adapter-table-repository-postgres/src/shared/errors.ts index 457415d33c..9818b5ace5 100644 --- a/packages/v2/adapter-table-repository-postgres/src/shared/errors.ts +++ b/packages/v2/adapter-table-repository-postgres/src/shared/errors.ts @@ -1,10 +1,10 @@ +import { tableI18nKeys } from '@teable/i18n-keys'; import { domainError, isDomainError, type DomainError, type IExecutionContext, } from '@teable/v2-core'; -import { tableI18nKeys } from '@teable/i18n-keys'; export const describeError = (error: unknown): string => { if (isDomainError(error)) return error.message; diff --git a/packages/v2/adapter-table-repository-postgres/tsconfig.eslint.json b/packages/v2/adapter-table-repository-postgres/tsconfig.eslint.json index 064a0a6262..9530f96f89 100644 --- a/packages/v2/adapter-table-repository-postgres/tsconfig.eslint.json +++ b/packages/v2/adapter-table-repository-postgres/tsconfig.eslint.json @@ -1,5 +1,9 @@ { "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "noEmit": true + }, "include": ["src/**/*.ts", "*.js", "*.mjs", "*.cjs", "*.ts", ".eslintrc.cjs"], - "exclude": ["**/node_modules", "**/.*/", "./dist", "./coverage"] + "exclude": ["**/node_modules", "./dist", "./coverage"] } diff --git a/packages/v2/adapter-table-repository-postgres/tsconfig.typecheck.json b/packages/v2/adapter-table-repository-postgres/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/adapter-table-repository-postgres/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/adapter-undo-redo-keyv/.eslintrc.cjs b/packages/v2/adapter-undo-redo-keyv/.eslintrc.cjs new file mode 100644 index 0000000000..b1815ba8aa --- /dev/null +++ b/packages/v2/adapter-undo-redo-keyv/.eslintrc.cjs @@ -0,0 +1,29 @@ +/** + * Specific eslint rules for this workspace, learn how to compose + * @link https://github.com/teableio/teable/tree/main/packages/eslint-config-bases + */ +require('@teable/eslint-config-bases/patch/modern-module-resolution'); + +const { getDefaultIgnorePatterns } = require('@teable/eslint-config-bases/helpers'); + +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + parserOptions: { + tsconfigRootDir: __dirname, + project: 'tsconfig.eslint.json', + }, + ignorePatterns: [...getDefaultIgnorePatterns()], + extends: [ + '@teable/eslint-config-bases/typescript', + '@teable/eslint-config-bases/sonar', + '@teable/eslint-config-bases/regexp', + '@teable/eslint-config-bases/jest', + // Apply prettier and disable incompatible rules + '@teable/eslint-config-bases/prettier-plugin', + ], + rules: { + '@typescript-eslint/consistent-type-imports': 'off', + }, + overrides: [], +}; diff --git a/packages/v2/adapter-undo-redo-keyv/package.json b/packages/v2/adapter-undo-redo-keyv/package.json index 99675daf90..30f774bbf4 100644 --- a/packages/v2/adapter-undo-redo-keyv/package.json +++ b/packages/v2/adapter-undo-redo-keyv/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-adapter-undo-redo-keyv.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/adapter-undo-redo-keyv/src/KeyvUndoRedoStore.spec.ts b/packages/v2/adapter-undo-redo-keyv/src/KeyvUndoRedoStore.spec.ts index 0d18b00009..69c85fbb63 100644 --- a/packages/v2/adapter-undo-redo-keyv/src/KeyvUndoRedoStore.spec.ts +++ b/packages/v2/adapter-undo-redo-keyv/src/KeyvUndoRedoStore.spec.ts @@ -1,8 +1,7 @@ -import Keyv from 'keyv'; -import { describe, expect, it } from 'vitest'; - import { ActorId, TableId, createUndoRedoCommand } from '@teable/v2-core'; import type { UndoEntry, UndoScope } from '@teable/v2-core'; +import Keyv from 'keyv'; +import { describe, expect, it } from 'vitest'; import { KeyvUndoRedoStore } from './KeyvUndoRedoStore'; diff --git a/packages/v2/adapter-undo-redo-keyv/src/KeyvUndoRedoStore.ts b/packages/v2/adapter-undo-redo-keyv/src/KeyvUndoRedoStore.ts index 519807c778..8790b50936 100644 --- a/packages/v2/adapter-undo-redo-keyv/src/KeyvUndoRedoStore.ts +++ b/packages/v2/adapter-undo-redo-keyv/src/KeyvUndoRedoStore.ts @@ -1,21 +1,17 @@ +import type { IUndoRedoStore, UndoEntry, UndoRedoListOptions, UndoScope } from '@teable/v2-core'; import type Keyv from 'keyv'; import { ok } from 'neverthrow'; -import type { - DomainError, - IUndoRedoStore, - UndoEntry, - UndoRedoListOptions, - UndoScope, -} from '@teable/v2-core'; - +// eslint-disable-next-line @typescript-eslint/naming-convention type StoredUndoEntry = Omit; +// eslint-disable-next-line @typescript-eslint/naming-convention type UndoRedoState = { entries: StoredUndoEntry[]; cursor: number; }; +// eslint-disable-next-line @typescript-eslint/naming-convention export interface KeyvUndoRedoStoreOptions { keyPrefix?: string; ttlMs?: number; diff --git a/packages/v2/adapter-undo-redo-keyv/tsconfig.eslint.json b/packages/v2/adapter-undo-redo-keyv/tsconfig.eslint.json index 6d6c2c9cb3..c47b371b13 100644 --- a/packages/v2/adapter-undo-redo-keyv/tsconfig.eslint.json +++ b/packages/v2/adapter-undo-redo-keyv/tsconfig.eslint.json @@ -1,4 +1,9 @@ { "extends": "./tsconfig.json", - "include": ["src", "vitest.config.ts", "tsdown.config.ts"] + "compilerOptions": { + "composite": false, + "noEmit": true + }, + "include": ["src", "vitest.config.ts", "tsdown.config.ts", ".eslintrc.cjs"], + "exclude": ["**/node_modules", "./dist", "./coverage"] } diff --git a/packages/v2/adapter-undo-redo-keyv/tsconfig.typecheck.json b/packages/v2/adapter-undo-redo-keyv/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/adapter-undo-redo-keyv/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/benchmark-node/package.json b/packages/v2/benchmark-node/package.json index f16eda7b8c..c138110003 100644 --- a/packages/v2/benchmark-node/package.json +++ b/packages/v2/benchmark-node/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-benchmark-node.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "bench": "vitest bench --run", "bench:watch": "vitest bench", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/benchmark-node/src/computed-cte-batch.bench.ts b/packages/v2/benchmark-node/src/computed-cte-batch.bench.ts index 0834cabf08..0aac4dbbbd 100644 --- a/packages/v2/benchmark-node/src/computed-cte-batch.bench.ts +++ b/packages/v2/benchmark-node/src/computed-cte-batch.bench.ts @@ -1,5 +1,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-call */ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck /** * Benchmark: CTE Batch Execution for same-table formula chains * diff --git a/packages/v2/benchmark-node/src/computed-fanout.bench.ts b/packages/v2/benchmark-node/src/computed-fanout.bench.ts index 22fe7e634d..01ebd322f4 100644 --- a/packages/v2/benchmark-node/src/computed-fanout.bench.ts +++ b/packages/v2/benchmark-node/src/computed-fanout.bench.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-call */ /** diff --git a/packages/v2/benchmark-node/src/create-record.bench.ts b/packages/v2/benchmark-node/src/create-record.bench.ts index 87db6143d4..6150262191 100644 --- a/packages/v2/benchmark-node/src/create-record.bench.ts +++ b/packages/v2/benchmark-node/src/create-record.bench.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck import type { Server } from 'node:http'; import type { AddressInfo } from 'node:net'; import { serve } from '@hono/node-server'; diff --git a/packages/v2/benchmark-node/src/create-table.bench.ts b/packages/v2/benchmark-node/src/create-table.bench.ts index e5cadf6133..612c1551b4 100644 --- a/packages/v2/benchmark-node/src/create-table.bench.ts +++ b/packages/v2/benchmark-node/src/create-table.bench.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck import type { Server } from 'node:http'; import type { AddressInfo } from 'node:net'; import { serve } from '@hono/node-server'; diff --git a/packages/v2/benchmark-node/src/db-adapter.bench.ts b/packages/v2/benchmark-node/src/db-adapter.bench.ts index 05289ec520..f1c97a673e 100644 --- a/packages/v2/benchmark-node/src/db-adapter.bench.ts +++ b/packages/v2/benchmark-node/src/db-adapter.bench.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck import type { AddressInfo } from 'node:net'; import { serve } from '@hono/node-server'; import type { IV2PostgresDbConfig } from '@teable/v2-adapter-db-postgres-pg'; diff --git a/packages/v2/benchmark-node/src/get-table-by-id.bench.ts b/packages/v2/benchmark-node/src/get-table-by-id.bench.ts index c932dd517d..ce185eb2bb 100644 --- a/packages/v2/benchmark-node/src/get-table-by-id.bench.ts +++ b/packages/v2/benchmark-node/src/get-table-by-id.bench.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck import type { Server } from 'node:http'; import type { AddressInfo } from 'node:net'; import { serve } from '@hono/node-server'; diff --git a/packages/v2/benchmark-node/src/row-ops.bench.ts b/packages/v2/benchmark-node/src/row-ops.bench.ts index 682ec2eda1..6df290589b 100644 --- a/packages/v2/benchmark-node/src/row-ops.bench.ts +++ b/packages/v2/benchmark-node/src/row-ops.bench.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck import type { Server } from 'node:http'; import type { AddressInfo } from 'node:net'; import { serve } from '@hono/node-server'; diff --git a/packages/v2/benchmark-node/tsconfig.eslint.json b/packages/v2/benchmark-node/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/benchmark-node/tsconfig.eslint.json +++ b/packages/v2/benchmark-node/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/benchmark-node/tsconfig.typecheck.json b/packages/v2/benchmark-node/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/benchmark-node/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/command-explain/package.json b/packages/v2/command-explain/package.json index 557318ac25..79a3f29ee2 100644 --- a/packages/v2/command-explain/package.json +++ b/packages/v2/command-explain/package.json @@ -26,7 +26,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-command-explain.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/command-explain/src/utils/FieldCommandExplainHarness.ts b/packages/v2/command-explain/src/utils/FieldCommandExplainHarness.ts index 566dffc08c..82907a4b41 100644 --- a/packages/v2/command-explain/src/utils/FieldCommandExplainHarness.ts +++ b/packages/v2/command-explain/src/utils/FieldCommandExplainHarness.ts @@ -173,6 +173,7 @@ export class OverlayTableRepository implements ITableRepository { return ok(undefined); } + // eslint-disable-next-line sonarjs/no-identical-functions async restore(_context: IExecutionContext, table: Table): Promise> { this.deletedTableIds.delete(table.id().toString()); this.overlayByTableId.set(table.id().toString(), table); diff --git a/packages/v2/command-explain/tsconfig.eslint.json b/packages/v2/command-explain/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/command-explain/tsconfig.eslint.json +++ b/packages/v2/command-explain/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/command-explain/tsconfig.typecheck.json b/packages/v2/command-explain/tsconfig.typecheck.json new file mode 100644 index 0000000000..8547c64600 --- /dev/null +++ b/packages/v2/command-explain/tsconfig.typecheck.json @@ -0,0 +1,27 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../core/src/**/*.spec.ts", + "../core/src/**/*.test.ts", + "../adapter-table-repository-postgres/src/**/*.spec.ts", + "../adapter-table-repository-postgres/src/**/*.test.ts", + "../adapter-record-repository-postgres/src/**/*.spec.ts", + "../../formula/src/**/*.spec.ts", + "../formula-sql-pg/src/**/*.spec.ts", + "../formula-sql-pg/src/**/*.test.ts", + "../formula-sql-pg/src/testkit/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/container-browser/package.json b/packages/v2/container-browser/package.json index 6e4f796f19..448fafff8d 100644 --- a/packages/v2/container-browser/package.json +++ b/packages/v2/container-browser/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-container-browser.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/container-browser/tsconfig.eslint.json b/packages/v2/container-browser/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/container-browser/tsconfig.eslint.json +++ b/packages/v2/container-browser/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/container-browser/tsconfig.typecheck.json b/packages/v2/container-browser/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/container-browser/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/container-node-test/package.json b/packages/v2/container-node-test/package.json index cb5ac84b12..471596d973 100644 --- a/packages/v2/container-node-test/package.json +++ b/packages/v2/container-node-test/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-container-node-test.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/container-node-test/src/SpyLogger.ts b/packages/v2/container-node-test/src/SpyLogger.ts index dcc0662ad5..6a4c8ea78e 100644 --- a/packages/v2/container-node-test/src/SpyLogger.ts +++ b/packages/v2/container-node-test/src/SpyLogger.ts @@ -3,6 +3,7 @@ import type { ILogger, LogContext } from '@teable/v2-core'; /** * A captured log entry from SpyLogger. */ +// eslint-disable-next-line @typescript-eslint/naming-convention export interface CapturedLogEntry { level: 'debug' | 'info' | 'warn' | 'error'; message: string; @@ -14,6 +15,7 @@ export interface CapturedLogEntry { * The context logged by ComputedFieldUpdater.execute() for computed:plan. * @see ComputedFieldUpdater.ts:169-191 */ +// eslint-disable-next-line @typescript-eslint/naming-convention export interface ComputedPlanLogEntry { baseId: string; seedTableId: string; diff --git a/packages/v2/container-node-test/src/index.ts b/packages/v2/container-node-test/src/index.ts index 9e2cdd6be5..04d148242b 100644 --- a/packages/v2/container-node-test/src/index.ts +++ b/packages/v2/container-node-test/src/index.ts @@ -1,7 +1,7 @@ import { createHash } from 'crypto'; +import * as fs from 'node:fs'; import { readFile } from 'node:fs/promises'; import { dirname, resolve, resolve as resolvePath } from 'node:path'; -import * as fs from 'node:fs'; import { PapaparseCsvParser } from '@teable/v2-adapter-csv-parser-papaparse'; import type { IV2PostgresDbConfig } from '@teable/v2-adapter-db-postgres-pg'; import { diff --git a/packages/v2/container-node-test/tsconfig.eslint.json b/packages/v2/container-node-test/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/container-node-test/tsconfig.eslint.json +++ b/packages/v2/container-node-test/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/container-node-test/tsconfig.typecheck.json b/packages/v2/container-node-test/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/container-node-test/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/container-node/package.json b/packages/v2/container-node/package.json index ef930a2f74..c3994adfc4 100644 --- a/packages/v2/container-node/package.json +++ b/packages/v2/container-node/package.json @@ -26,7 +26,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-container-node.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/container-node/tsconfig.eslint.json b/packages/v2/container-node/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/container-node/tsconfig.eslint.json +++ b/packages/v2/container-node/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/container-node/tsconfig.typecheck.json b/packages/v2/container-node/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/container-node/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/contract-http-client/package.json b/packages/v2/contract-http-client/package.json index c7f257762c..74aea55916 100644 --- a/packages/v2/contract-http-client/package.json +++ b/packages/v2/contract-http-client/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-contract-http-client.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/contract-http-client/tsconfig.eslint.json b/packages/v2/contract-http-client/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/contract-http-client/tsconfig.eslint.json +++ b/packages/v2/contract-http-client/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/contract-http-client/tsconfig.typecheck.json b/packages/v2/contract-http-client/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/contract-http-client/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/contract-http-express/package.json b/packages/v2/contract-http-express/package.json index 07cc01004e..1d04fffd77 100644 --- a/packages/v2/contract-http-express/package.json +++ b/packages/v2/contract-http-express/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-contract-http-express.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/contract-http-express/tsconfig.eslint.json b/packages/v2/contract-http-express/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/contract-http-express/tsconfig.eslint.json +++ b/packages/v2/contract-http-express/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/contract-http-express/tsconfig.typecheck.json b/packages/v2/contract-http-express/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/contract-http-express/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/contract-http-fastify/package.json b/packages/v2/contract-http-fastify/package.json index c08047c420..6ac1ef5ea1 100644 --- a/packages/v2/contract-http-fastify/package.json +++ b/packages/v2/contract-http-fastify/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-contract-http-fastify.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/contract-http-fastify/tsconfig.eslint.json b/packages/v2/contract-http-fastify/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/contract-http-fastify/tsconfig.eslint.json +++ b/packages/v2/contract-http-fastify/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/contract-http-fastify/tsconfig.typecheck.json b/packages/v2/contract-http-fastify/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/contract-http-fastify/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/contract-http-hono/package.json b/packages/v2/contract-http-hono/package.json index 35e2d14b13..cd718fed1e 100644 --- a/packages/v2/contract-http-hono/package.json +++ b/packages/v2/contract-http-hono/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-contract-http-hono.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/contract-http-hono/tsconfig.eslint.json b/packages/v2/contract-http-hono/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/contract-http-hono/tsconfig.eslint.json +++ b/packages/v2/contract-http-hono/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/contract-http-hono/tsconfig.typecheck.json b/packages/v2/contract-http-hono/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/contract-http-hono/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/contract-http-implementation/package.json b/packages/v2/contract-http-implementation/package.json index 715e88d310..ac0e72597d 100644 --- a/packages/v2/contract-http-implementation/package.json +++ b/packages/v2/contract-http-implementation/package.json @@ -33,7 +33,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-contract-http-implementation.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/contract-http-implementation/src/router.ts b/packages/v2/contract-http-implementation/src/router.ts index fba868c832..f308065a8f 100644 --- a/packages/v2/contract-http-implementation/src/router.ts +++ b/packages/v2/contract-http-implementation/src/router.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck -- implement(v2Contract) returns untyped Implementer; contract typing TBD import { ORPCError, implement } from '@orpc/server'; import type { IExplainService } from '@teable/v2-command-explain'; import { v2CommandExplainTokens } from '@teable/v2-command-explain'; diff --git a/packages/v2/contract-http-implementation/tsconfig.eslint.json b/packages/v2/contract-http-implementation/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/contract-http-implementation/tsconfig.eslint.json +++ b/packages/v2/contract-http-implementation/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/contract-http-implementation/tsconfig.typecheck.json b/packages/v2/contract-http-implementation/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/contract-http-implementation/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/contract-http-openapi/package.json b/packages/v2/contract-http-openapi/package.json index 63f863c8e2..b318b56726 100644 --- a/packages/v2/contract-http-openapi/package.json +++ b/packages/v2/contract-http-openapi/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-contract-http-openapi.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/contract-http-openapi/tsconfig.eslint.json b/packages/v2/contract-http-openapi/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/contract-http-openapi/tsconfig.eslint.json +++ b/packages/v2/contract-http-openapi/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/contract-http-openapi/tsconfig.typecheck.json b/packages/v2/contract-http-openapi/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/contract-http-openapi/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/contract-http/package.json b/packages/v2/contract-http/package.json index 919db7c4c2..9c3b52635b 100644 --- a/packages/v2/contract-http/package.json +++ b/packages/v2/contract-http/package.json @@ -26,7 +26,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-contract-http.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/contract-http/src/table/dto.spec.ts b/packages/v2/contract-http/src/table/dto.spec.ts index 2787eb96ca..1ab57a2c2d 100644 --- a/packages/v2/contract-http/src/table/dto.spec.ts +++ b/packages/v2/contract-http/src/table/dto.spec.ts @@ -1,7 +1,6 @@ -import { describe, expect, it } from 'vitest'; - import { DefaultTableMapper } from '@teable/v2-core'; import type { ITablePersistenceDTO } from '@teable/v2-core'; +import { describe, expect, it } from 'vitest'; import { mapTableToDto } from './dto'; diff --git a/packages/v2/contract-http/src/table/submitRecord.ts b/packages/v2/contract-http/src/table/submitRecord.ts index bc551b79ae..b7d073a798 100644 --- a/packages/v2/contract-http/src/table/submitRecord.ts +++ b/packages/v2/contract-http/src/table/submitRecord.ts @@ -1,8 +1,6 @@ import type { CreateRecordResult, DomainError, ISubmitRecordCommandInput } from '@teable/v2-core'; import type { Result } from 'neverthrow'; -import type { ICreateRecordResponseDataDto } from './createRecord'; -import { createRecordResponseDataSchema, mapCreateRecordResultToDto } from './createRecord'; import { apiErrorResponseDtoSchema, apiOkResponseDtoSchema, @@ -11,6 +9,8 @@ import { type IApiOkResponseDto, type IApiResponseDto, } from '../shared/http'; +import type { ICreateRecordResponseDataDto } from './createRecord'; +import { createRecordResponseDataSchema, mapCreateRecordResultToDto } from './createRecord'; export type ISubmitRecordRequestDto = ISubmitRecordCommandInput; diff --git a/packages/v2/contract-http/tsconfig.eslint.json b/packages/v2/contract-http/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/contract-http/tsconfig.eslint.json +++ b/packages/v2/contract-http/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/contract-http/tsconfig.typecheck.json b/packages/v2/contract-http/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/contract-http/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/core/package.json b/packages/v2/core/package.json index a643c8b25a..a18cefb47e 100644 --- a/packages/v2/core/package.json +++ b/packages/v2/core/package.json @@ -26,7 +26,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-core.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/core/src/application/projections/FieldRealtimeShapeRefresh.ts b/packages/v2/core/src/application/projections/FieldRealtimeShapeRefresh.ts index e85d9b9f39..6a0c90cebc 100644 --- a/packages/v2/core/src/application/projections/FieldRealtimeShapeRefresh.ts +++ b/packages/v2/core/src/application/projections/FieldRealtimeShapeRefresh.ts @@ -1,4 +1,4 @@ -import { FieldUpdated } from '../../domain/table/events/FieldUpdated'; +import type { FieldUpdated } from '../../domain/table/events/FieldUpdated'; import type { ITableFieldPersistenceDTO } from '../../ports/mappers/TableMapper'; import type { RealtimeChange } from '../../ports/RealtimeChange'; diff --git a/packages/v2/core/src/application/projections/FieldUpdatedRealtimeProjection.ts b/packages/v2/core/src/application/projections/FieldUpdatedRealtimeProjection.ts index e22ea91473..a2ab96ec24 100644 --- a/packages/v2/core/src/application/projections/FieldUpdatedRealtimeProjection.ts +++ b/packages/v2/core/src/application/projections/FieldUpdatedRealtimeProjection.ts @@ -6,9 +6,9 @@ import type { DomainError } from '../../domain/shared/DomainError'; import { FieldUpdated, serializeFieldUpdatedValue } from '../../domain/table/events/FieldUpdated'; import { Table } from '../../domain/table/Table'; import type { IEventHandler } from '../../ports/EventHandler'; -import type { RealtimeChange } from '../../ports/RealtimeChange'; import type * as ExecutionContextPort from '../../ports/ExecutionContext'; import * as TableMapperPort from '../../ports/mappers/TableMapper'; +import type { RealtimeChange } from '../../ports/RealtimeChange'; import { RealtimeDocId } from '../../ports/RealtimeDocId'; import * as RealtimeEnginePort from '../../ports/RealtimeEngine'; import * as TableRepositoryPort from '../../ports/TableRepository'; diff --git a/packages/v2/core/src/application/projections/RealtimeProjections.spec.ts b/packages/v2/core/src/application/projections/RealtimeProjections.spec.ts index d3f96a64b2..22930c3c8d 100644 --- a/packages/v2/core/src/application/projections/RealtimeProjections.spec.ts +++ b/packages/v2/core/src/application/projections/RealtimeProjections.spec.ts @@ -18,8 +18,8 @@ import { TableCreated } from '../../domain/table/events/TableCreated'; import { ViewColumnMetaUpdated } from '../../domain/table/events/ViewColumnMetaUpdated'; import { FieldId } from '../../domain/table/fields/FieldId'; import { FieldName } from '../../domain/table/fields/FieldName'; -import { SelectOption } from '../../domain/table/fields/types/SelectOption'; import { LinkFieldConfig } from '../../domain/table/fields/types/LinkFieldConfig'; +import { SelectOption } from '../../domain/table/fields/types/SelectOption'; import { RecordId } from '../../domain/table/records/RecordId'; import { TableAddSelectOptionsSpec } from '../../domain/table/specs/TableAddSelectOptionsSpec'; import { TableUpdateFieldTypeSpec } from '../../domain/table/specs/TableUpdateFieldTypeSpec'; @@ -29,8 +29,8 @@ import { TableId } from '../../domain/table/TableId'; import { TableName } from '../../domain/table/TableName'; import { ViewId } from '../../domain/table/views/ViewId'; import type { IExecutionContext } from '../../ports/ExecutionContext'; -import type { ITableMapper, ITablePersistenceDTO } from '../../ports/mappers/TableMapper'; import { DefaultTableMapper } from '../../ports/mappers/defaults/DefaultTableMapper'; +import type { ITableMapper, ITablePersistenceDTO } from '../../ports/mappers/TableMapper'; import type { RealtimeChange } from '../../ports/RealtimeChange'; import type { RealtimeDocId } from '../../ports/RealtimeDocId'; import type { IRealtimeEngine, RealtimeApplyChangeOptions } from '../../ports/RealtimeEngine'; @@ -168,6 +168,10 @@ class FakeTableRepository implements ITableRepository { async delete() { return ok(undefined); } + + async restore() { + return ok(undefined); + } } class FakeTableMapper implements ITableMapper { diff --git a/packages/v2/core/src/application/services/AttachmentValueResolverService.ts b/packages/v2/core/src/application/services/AttachmentValueResolverService.ts index 266c577e0d..53ee575dd0 100644 --- a/packages/v2/core/src/application/services/AttachmentValueResolverService.ts +++ b/packages/v2/core/src/application/services/AttachmentValueResolverService.ts @@ -10,7 +10,7 @@ import { type AttachmentItem, } from '../../domain/table/records/specs/values/SetAttachmentValueSpec'; import { CellValue } from '../../domain/table/records/values/CellValue'; -import { IAttachmentLookupService } from '../../ports/AttachmentLookupService'; +import * as AttachmentLookupServicePort from '../../ports/AttachmentLookupService'; import type { AttachmentLookupRecord } from '../../ports/AttachmentLookupService'; import type { IExecutionContext } from '../../ports/ExecutionContext'; import { v2CoreTokens } from '../../ports/tokens'; @@ -64,7 +64,7 @@ export class AttachmentValueResolverService { constructor( @inject(v2CoreTokens.attachmentLookupService) - private readonly attachmentLookupService: IAttachmentLookupService + private readonly attachmentLookupService: AttachmentLookupServicePort.IAttachmentLookupService ) {} supports(spec: ICellValueSpec): spec is SetAttachmentValueSpec { diff --git a/packages/v2/core/src/application/services/FieldKeyResolverService.spec.ts b/packages/v2/core/src/application/services/FieldKeyResolverService.spec.ts index 9ef50e6879..f87357da42 100644 --- a/packages/v2/core/src/application/services/FieldKeyResolverService.spec.ts +++ b/packages/v2/core/src/application/services/FieldKeyResolverService.spec.ts @@ -1,9 +1,9 @@ import { describe, expect, it } from 'vitest'; import { BaseId } from '../../domain/base/BaseId'; -import { FieldName } from '../../domain/table/fields/FieldName'; import { FieldId } from '../../domain/table/fields/FieldId'; import { FieldKeyType } from '../../domain/table/fields/FieldKeyType'; +import { FieldName } from '../../domain/table/fields/FieldName'; import { Table } from '../../domain/table/Table'; import { TableId } from '../../domain/table/TableId'; import { TableName } from '../../domain/table/TableName'; diff --git a/packages/v2/core/src/application/services/FieldKeyResolverService.ts b/packages/v2/core/src/application/services/FieldKeyResolverService.ts index e51f5bce86..7d3a12057d 100644 --- a/packages/v2/core/src/application/services/FieldKeyResolverService.ts +++ b/packages/v2/core/src/application/services/FieldKeyResolverService.ts @@ -139,6 +139,7 @@ export class FieldKeyResolverService { * @returns The field key (id, name, or dbFieldName) */ static getFieldKey( + // eslint-disable-next-line @typescript-eslint/no-explicit-any field: { id(): { toString(): string }; name(): { toString(): string }; dbFieldName(): any }, fieldKeyType: FieldKeyType ): string { diff --git a/packages/v2/core/src/application/services/FieldUndoRedoReplayService.ts b/packages/v2/core/src/application/services/FieldUndoRedoReplayService.ts index 0bfab59eee..a100e4c88c 100644 --- a/packages/v2/core/src/application/services/FieldUndoRedoReplayService.ts +++ b/packages/v2/core/src/application/services/FieldUndoRedoReplayService.ts @@ -10,8 +10,8 @@ import type { IDomainEvent } from '../../domain/shared/DomainEvent'; import { composeAndSpecsOrUndefined } from '../../domain/shared/specification/composeAndSpecs'; import type { RecordFieldChangeDTO } from '../../domain/table/events/RecordFieldValuesDTO'; import { RecordsBatchUpdated } from '../../domain/table/events/RecordsBatchUpdated'; -import { FieldId } from '../../domain/table/fields/FieldId'; import type { Field } from '../../domain/table/fields/Field'; +import { FieldId } from '../../domain/table/fields/FieldId'; import { FieldHasError } from '../../domain/table/fields/types/FieldHasError'; import { FieldNotNull } from '../../domain/table/fields/types/FieldNotNull'; import { FieldUnique } from '../../domain/table/fields/types/FieldUnique'; diff --git a/packages/v2/core/src/application/services/FieldUndoRedoSnapshotService.ts b/packages/v2/core/src/application/services/FieldUndoRedoSnapshotService.ts index 835209e42a..110828b1a9 100644 --- a/packages/v2/core/src/application/services/FieldUndoRedoSnapshotService.ts +++ b/packages/v2/core/src/application/services/FieldUndoRedoSnapshotService.ts @@ -6,20 +6,20 @@ import { z } from 'zod'; import { hasCode, domainError, type DomainError } from '../../domain/shared/DomainError'; import { DbFieldName } from '../../domain/table/fields/DbFieldName'; import type { Field } from '../../domain/table/fields/Field'; -import type { FieldId } from '../../domain/table/fields/FieldId'; -import type { Table } from '../../domain/table/Table'; -import type { IExecutionContext } from '../../ports/ExecutionContext'; +import { FieldId } from '../../domain/table/fields/FieldId'; +import { Table } from '../../domain/table/Table'; +import * as ExecutionContextPort from '../../ports/ExecutionContext'; +import * as TableMapperPort from '../../ports/mappers/TableMapper'; import type { ITableFieldPersistenceDTO, - ITableMapper, ITableViewPersistenceDTO, } from '../../ports/mappers/TableMapper'; +import * as TableRecordQueryRepositoryPort from '../../ports/TableRecordQueryRepository'; import type { TableRecordReadModel } from '../../ports/TableRecordReadModel'; -import type { ITableRecordQueryRepository } from '../../ports/TableRecordQueryRepository'; -import type { UndoRedoFieldSnapshot } from '../../ports/UndoRedoStore'; import { v2CoreTokens } from '../../ports/tokens'; -import { tableFieldInputSchema } from '../../schemas/field'; import { TraceSpan } from '../../ports/TraceSpan'; +import type { UndoRedoFieldSnapshot } from '../../ports/UndoRedoStore'; +import { tableFieldInputSchema } from '../../schemas/field'; const stripUndefinedDeep = (value: unknown): unknown => { if (Array.isArray(value)) { @@ -148,14 +148,14 @@ const toFieldSnapshotInput = ( export class FieldUndoRedoSnapshotService { constructor( @inject(v2CoreTokens.tableMapper) - private readonly tableMapper: ITableMapper, + private readonly tableMapper: TableMapperPort.ITableMapper, @inject(v2CoreTokens.tableRecordQueryRepository) - private readonly tableRecordQueryRepository: ITableRecordQueryRepository + private readonly tableRecordQueryRepository: TableRecordQueryRepositoryPort.ITableRecordQueryRepository ) {} @TraceSpan() async capture( - context: IExecutionContext, + context: ExecutionContextPort.IExecutionContext, table: Table, fieldId: FieldId, options?: { @@ -256,7 +256,7 @@ export class FieldUndoRedoSnapshotService { } private async captureRecords( - context: IExecutionContext, + context: ExecutionContextPort.IExecutionContext, table: Table, field: Field ): Promise | undefined, DomainError>> { diff --git a/packages/v2/core/src/application/services/FieldUpdateSideEffectService.ts b/packages/v2/core/src/application/services/FieldUpdateSideEffectService.ts index 2449385dea..8dae2b47ac 100644 --- a/packages/v2/core/src/application/services/FieldUpdateSideEffectService.ts +++ b/packages/v2/core/src/application/services/FieldUpdateSideEffectService.ts @@ -25,6 +25,8 @@ import { FormulaField } from '../../domain/table/fields/types/FormulaField'; import { LinkField } from '../../domain/table/fields/types/LinkField'; import { LookupField } from '../../domain/table/fields/types/LookupField'; import { RollupField } from '../../domain/table/fields/types/RollupField'; +import { FieldCreationSideEffectVisitor } from '../../domain/table/fields/visitors/FieldCreationSideEffectVisitor'; +import { FieldDeletionSideEffectVisitor } from '../../domain/table/fields/visitors/FieldDeletionSideEffectVisitor'; import type { ITableSpecVisitor } from '../../domain/table/specs/ITableSpecVisitor'; import { TableUpdateFieldTypeSpec } from '../../domain/table/specs/TableUpdateFieldTypeSpec'; import { TableUpdateViewColumnMetaSpec } from '../../domain/table/specs/TableUpdateViewColumnMetaSpec'; @@ -41,8 +43,6 @@ import * as ExecutionContextPort from '../../ports/ExecutionContext'; import * as TableRepositoryPort from '../../ports/TableRepository'; import { v2CoreTokens } from '../../ports/tokens'; import { TraceSpan } from '../../ports/TraceSpan'; -import { FieldCreationSideEffectVisitor } from '../../domain/table/fields/visitors/FieldCreationSideEffectVisitor'; -import { FieldDeletionSideEffectVisitor } from '../../domain/table/fields/visitors/FieldDeletionSideEffectVisitor'; import { FieldCrossTableUpdateSideEffectService } from './FieldCrossTableUpdateSideEffectService'; import { LinkFieldUpdateSideEffectService } from './LinkFieldUpdateSideEffectService'; import { TableUpdateFlow } from './TableUpdateFlow'; diff --git a/packages/v2/core/src/application/services/LinkTitleResolverService.spec.ts b/packages/v2/core/src/application/services/LinkTitleResolverService.spec.ts index 45eb2b5008..71348df020 100644 --- a/packages/v2/core/src/application/services/LinkTitleResolverService.spec.ts +++ b/packages/v2/core/src/application/services/LinkTitleResolverService.spec.ts @@ -75,6 +75,10 @@ class FakeTableRepository implements ITableRepository { async delete() { return ok(undefined); } + + async restore() { + return ok(undefined); + } } class FakeRecordQueryRepository implements ITableRecordQueryRepository { diff --git a/packages/v2/core/src/application/services/LinkTitleResolverService.ts b/packages/v2/core/src/application/services/LinkTitleResolverService.ts index 93ec842f93..401fc8b043 100644 --- a/packages/v2/core/src/application/services/LinkTitleResolverService.ts +++ b/packages/v2/core/src/application/services/LinkTitleResolverService.ts @@ -22,8 +22,8 @@ import { import type { SetLongTextValueSpec } from '../../domain/table/records/specs/values/SetLongTextValueSpec'; import type { SetMultipleSelectValueSpec } from '../../domain/table/records/specs/values/SetMultipleSelectValueSpec'; import type { SetNumberValueSpec } from '../../domain/table/records/specs/values/SetNumberValueSpec'; -import type { SetRowOrderValueSpec } from '../../domain/table/records/specs/values/SetRowOrderValueSpec'; import type { SetRatingValueSpec } from '../../domain/table/records/specs/values/SetRatingValueSpec'; +import type { SetRowOrderValueSpec } from '../../domain/table/records/specs/values/SetRowOrderValueSpec'; import type { SetSingleLineTextValueSpec } from '../../domain/table/records/specs/values/SetSingleLineTextValueSpec'; import type { SetSingleSelectValueSpec } from '../../domain/table/records/specs/values/SetSingleSelectValueSpec'; import type { SetUserValueByIdentifierSpec } from '../../domain/table/records/specs/values/SetUserValueByIdentifierSpec'; diff --git a/packages/v2/core/src/application/services/RecordBulkUpdateService.ts b/packages/v2/core/src/application/services/RecordBulkUpdateService.ts index e55c7c9948..634b1b5395 100644 --- a/packages/v2/core/src/application/services/RecordBulkUpdateService.ts +++ b/packages/v2/core/src/application/services/RecordBulkUpdateService.ts @@ -11,46 +11,43 @@ import type { RecordUpdateDTO, } from '../../domain/table/events/RecordFieldValuesDTO'; import { RecordsBatchUpdated } from '../../domain/table/events/RecordsBatchUpdated'; -import type { FieldKeyType } from '../../domain/table/fields/FieldKeyType'; import { FieldId } from '../../domain/table/fields/FieldId'; +import type { FieldKeyType } from '../../domain/table/fields/FieldKeyType'; import type { RecordWriteSideEffects } from '../../domain/table/fields/visitors/RecordWriteSideEffectVisitor'; -import type { RecordInsertOrder } from '../../domain/table/records/RecordInsertOrder'; import { RecordId } from '../../domain/table/records/RecordId'; +import type { RecordInsertOrder } from '../../domain/table/records/RecordInsertOrder'; import { RecordUpdateResult } from '../../domain/table/records/RecordUpdateResult'; import type { ITableRecordConditionSpecVisitor } from '../../domain/table/records/specs/ITableRecordConditionSpecVisitor'; import { RecordByIdsSpec } from '../../domain/table/records/specs/RecordByIdsSpec'; import { TableRecord } from '../../domain/table/records/TableRecord'; import type { Table } from '../../domain/table/Table'; import type { TableUpdateResult } from '../../domain/table/TableMutator'; -import type { IEventBus } from '../../ports/EventBus'; +import * as EventBusPort from '../../ports/EventBus'; import type { IExecutionContext } from '../../ports/ExecutionContext'; -import type { ILogger } from '../../ports/Logger'; +import * as LoggerPort from '../../ports/Logger'; import { RecordWriteOperationKind, type RecordWriteFieldValues, } from '../../ports/RecordWritePlugin'; +import * as TableRecordQueryRepositoryPort from '../../ports/TableRecordQueryRepository'; +import type { ITableRecordQueryResult } from '../../ports/TableRecordQueryRepository'; import type { TableRecordReadModel } from '../../ports/TableRecordReadModel'; -import type { - ITableRecordQueryRepository, - ITableRecordQueryResult, -} from '../../ports/TableRecordQueryRepository'; -import type { - ITableRecordRepository, - UpdateManyStreamBatchInput, -} from '../../ports/TableRecordRepository'; +import * as TableRecordRepositoryPort from '../../ports/TableRecordRepository'; +import type { UpdateManyStreamBatchInput } from '../../ports/TableRecordRepository'; import { v2CoreTokens } from '../../ports/tokens'; import { composeUndoRedoCommands, createUndoRedoCommand, type UndoRedoCommandLeafData, } from '../../ports/UndoRedoStore'; -import type { IUnitOfWork } from '../../ports/UnitOfWork'; +import * as UnitOfWorkPort from '../../ports/UnitOfWork'; import { type RecordFilterNode } from '../../queries/RecordFilterDto'; import { buildRecordConditionSpec } from '../../queries/RecordFilterMapper'; import { FieldKeyResolverService } from './FieldKeyResolverService'; -import { emptyRecordReorderResult, RecordReorderService } from './RecordReorderService'; -import { RecordWritePluginExecution, RecordWritePluginRunner } from './RecordWritePluginRunner'; import { RecordMutationSpecResolverService } from './RecordMutationSpecResolverService'; +import { emptyRecordReorderResult, RecordReorderService } from './RecordReorderService'; +import type { RecordWritePluginExecution } from './RecordWritePluginRunner'; +import { RecordWritePluginRunner } from './RecordWritePluginRunner'; import { RecordWriteSideEffectService } from './RecordWriteSideEffectService'; import { RecordWriteUndoRedoPlanService, @@ -154,9 +151,9 @@ const composeRecordConditionSpecs = ( export class RecordBulkUpdateService { constructor( @inject(v2CoreTokens.tableRecordRepository) - private readonly tableRecordRepository: ITableRecordRepository, + private readonly tableRecordRepository: TableRecordRepositoryPort.ITableRecordRepository, @inject(v2CoreTokens.tableRecordQueryRepository) - private readonly tableRecordQueryRepository: ITableRecordQueryRepository, + private readonly tableRecordQueryRepository: TableRecordQueryRepositoryPort.ITableRecordQueryRepository, @inject(v2CoreTokens.recordMutationSpecResolverService) private readonly recordMutationSpecResolver: RecordMutationSpecResolverService, @inject(v2CoreTokens.recordReorderService) @@ -170,13 +167,13 @@ export class RecordBulkUpdateService { @inject(v2CoreTokens.tableUpdateFlow) private readonly tableUpdateFlow: TableUpdateFlow, @inject(v2CoreTokens.eventBus) - private readonly eventBus: IEventBus, + private readonly eventBus: EventBusPort.IEventBus, @inject(v2CoreTokens.undoRedoService) private readonly undoRedoService: UndoRedoService, @inject(v2CoreTokens.logger) - private readonly logger: ILogger, + private readonly logger: LoggerPort.ILogger, @inject(v2CoreTokens.unitOfWork) - private readonly unitOfWork: IUnitOfWork + private readonly unitOfWork: UnitOfWorkPort.IUnitOfWork ) {} async update( @@ -624,7 +621,7 @@ export class RecordBulkUpdateService { typecast ); - let tableEvents: ReadonlyArray = []; + const tableEvents: ReadonlyArray = []; return ok({ tableForWrite: sideEffectResult.table, diff --git a/packages/v2/core/src/application/services/RecordCreationService.ts b/packages/v2/core/src/application/services/RecordCreationService.ts index 6f14d65a16..4fe663c42c 100644 --- a/packages/v2/core/src/application/services/RecordCreationService.ts +++ b/packages/v2/core/src/application/services/RecordCreationService.ts @@ -6,15 +6,15 @@ import type { DomainError } from '../../domain/shared/DomainError'; import type { IDomainEvent } from '../../domain/shared/DomainEvent'; import type { RecordCreateSource } from '../../domain/table/events/RecordFieldValuesDTO'; import { FieldKeyType } from '../../domain/table/fields/FieldKeyType'; -import type { RecordInsertOrder } from '../../domain/table/records/RecordInsertOrder'; import type { RecordId } from '../../domain/table/records/RecordId'; +import type { RecordInsertOrder } from '../../domain/table/records/RecordInsertOrder'; import type { TableRecord } from '../../domain/table/records/TableRecord'; import type { Table } from '../../domain/table/Table'; import * as EventBusPort from '../../ports/EventBus'; import type * as ExecutionContextPort from '../../ports/ExecutionContext'; import { RecordWriteOperationKind } from '../../ports/RecordWritePlugin'; -import type { RecordMutationResult } from '../../ports/TableRecordRepository'; import * as TableRecordQueryRepositoryPort from '../../ports/TableRecordQueryRepository'; +import type { RecordMutationResult } from '../../ports/TableRecordRepository'; import * as TableRecordRepositoryPort from '../../ports/TableRecordRepository'; import { v2CoreTokens } from '../../ports/tokens'; import { composeUndoRedoCommands, createUndoRedoCommand } from '../../ports/UndoRedoStore'; diff --git a/packages/v2/core/src/application/services/RecordMutationSpecResolverService.spec.ts b/packages/v2/core/src/application/services/RecordMutationSpecResolverService.spec.ts index 9878e33034..349d75e285 100644 --- a/packages/v2/core/src/application/services/RecordMutationSpecResolverService.spec.ts +++ b/packages/v2/core/src/application/services/RecordMutationSpecResolverService.spec.ts @@ -93,6 +93,10 @@ class FakeTableRepository implements ITableRepository { async delete() { return ok(undefined); } + + async restore() { + return ok(undefined); + } } class FakeRecordQueryRepository implements ITableRecordQueryRepository { diff --git a/packages/v2/core/src/application/services/RecordMutationSpecResolverService.ts b/packages/v2/core/src/application/services/RecordMutationSpecResolverService.ts index 81494677f1..35fb8c733c 100644 --- a/packages/v2/core/src/application/services/RecordMutationSpecResolverService.ts +++ b/packages/v2/core/src/application/services/RecordMutationSpecResolverService.ts @@ -10,7 +10,7 @@ import type { } from '../../domain/table/records/specs/values/ICellValueSpecVisitor'; import { SetAttachmentValueSpec } from '../../domain/table/records/specs/values/SetAttachmentValueSpec'; import { SetLinkValueByTitleSpec } from '../../domain/table/records/specs/values/SetLinkValueByTitleSpec'; -import { SetRowOrderValueSpec } from '../../domain/table/records/specs/values/SetRowOrderValueSpec'; +import type { SetRowOrderValueSpec } from '../../domain/table/records/specs/values/SetRowOrderValueSpec'; import { SetUserValueByIdentifierSpec } from '../../domain/table/records/specs/values/SetUserValueByIdentifierSpec'; import { SetUserValueSpec } from '../../domain/table/records/specs/values/SetUserValueSpec'; import type { IExecutionContext } from '../../ports/ExecutionContext'; diff --git a/packages/v2/core/src/application/services/RecordReorderService.ts b/packages/v2/core/src/application/services/RecordReorderService.ts index 9145df3902..c221d948db 100644 --- a/packages/v2/core/src/application/services/RecordReorderService.ts +++ b/packages/v2/core/src/application/services/RecordReorderService.ts @@ -5,16 +5,16 @@ import type { Result } from 'neverthrow'; import type { DomainError } from '../../domain/shared/DomainError'; import type { IDomainEvent } from '../../domain/shared/DomainEvent'; import { RecordReordered } from '../../domain/table/events/RecordReordered'; -import type { RecordInsertOrder } from '../../domain/table/records/RecordInsertOrder'; import { RecordId } from '../../domain/table/records/RecordId'; +import type { RecordInsertOrder } from '../../domain/table/records/RecordInsertOrder'; import { RecordUpdateResult } from '../../domain/table/records/RecordUpdateResult'; import { SetRowOrderValueSpec } from '../../domain/table/records/specs/values/SetRowOrderValueSpec'; import { TableRecord } from '../../domain/table/records/TableRecord'; import type { Table } from '../../domain/table/Table'; import type { IExecutionContext } from '../../ports/ExecutionContext'; -import type { IRecordOrderCalculator } from '../../ports/RecordOrderCalculator'; +import * as RecordOrderCalculatorPort from '../../ports/RecordOrderCalculator'; import type { TableRecordReadModel } from '../../ports/TableRecordReadModel'; -import type { ITableRecordRepository } from '../../ports/TableRecordRepository'; +import * as TableRecordRepositoryPort from '../../ports/TableRecordRepository'; import { v2CoreTokens } from '../../ports/tokens'; import { createUndoRedoCommand, type UndoRedoCommandLeafData } from '../../ports/UndoRedoStore'; @@ -54,9 +54,9 @@ const buildRecordUpdateBatches = ( export class RecordReorderService { constructor( @inject(v2CoreTokens.tableRecordRepository) - private readonly tableRecordRepository: ITableRecordRepository, + private readonly tableRecordRepository: TableRecordRepositoryPort.ITableRecordRepository, @inject(v2CoreTokens.recordOrderCalculator) - private readonly recordOrderCalculator: IRecordOrderCalculator + private readonly recordOrderCalculator: RecordOrderCalculatorPort.IRecordOrderCalculator ) {} async reorder( diff --git a/packages/v2/core/src/application/services/RecordWritePluginRunner.ts b/packages/v2/core/src/application/services/RecordWritePluginRunner.ts index ebad77333f..830ddb5a55 100644 --- a/packages/v2/core/src/application/services/RecordWritePluginRunner.ts +++ b/packages/v2/core/src/application/services/RecordWritePluginRunner.ts @@ -5,8 +5,8 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../domain/shared/DomainError'; import { composeAndSpecsOrUndefined } from '../../domain/shared/specification/composeAndSpecs'; import type { ISpecification } from '../../domain/shared/specification/ISpecification'; -import type { TableRecord } from '../../domain/table/records/TableRecord'; import type { ITableRecordConditionSpecVisitor } from '../../domain/table/records/specs/ITableRecordConditionSpecVisitor'; +import type { TableRecord } from '../../domain/table/records/TableRecord'; import type { IExecutionContext } from '../../ports/ExecutionContext'; import * as LoggerPort from '../../ports/Logger'; import * as TableMapperPort from '../../ports/mappers/TableMapper'; diff --git a/packages/v2/core/src/application/services/RecordWriteUndoRedoPlanService.ts b/packages/v2/core/src/application/services/RecordWriteUndoRedoPlanService.ts index acc2e30358..2820608a4a 100644 --- a/packages/v2/core/src/application/services/RecordWriteUndoRedoPlanService.ts +++ b/packages/v2/core/src/application/services/RecordWriteUndoRedoPlanService.ts @@ -1,11 +1,11 @@ import { inject, injectable } from '@teable/v2-di'; -import { ok, safeTry } from 'neverthrow'; import type { Result } from 'neverthrow'; +import { ok, safeTry } from 'neverthrow'; import type { DomainError } from '../../domain/shared/DomainError'; -import { RecordWriteSideEffects } from '../../domain/table/fields/visitors/RecordWriteSideEffectVisitor'; +import * as RecordWriteSideEffectVisitorModule from '../../domain/table/fields/visitors/RecordWriteSideEffectVisitor'; import { Table } from '../../domain/table/Table'; -import { IExecutionContext } from '../../ports/ExecutionContext'; +import * as ExecutionContextPort from '../../ports/ExecutionContext'; import { v2CoreTokens } from '../../ports/tokens'; import { TraceSpan } from '../../ports/TraceSpan'; import { createUndoRedoCommand, type UndoRedoCommandLeafData } from '../../ports/UndoRedoStore'; @@ -25,10 +25,10 @@ export class RecordWriteUndoRedoPlanService { @TraceSpan() async captureSelectOptionSideEffects( - context: IExecutionContext, + context: ExecutionContextPort.IExecutionContext, beforeTable: Table, afterTable: Table, - effects: RecordWriteSideEffects + effects: RecordWriteSideEffectVisitorModule.RecordWriteSideEffects ): Promise> { const service = this; return safeTry(async function* () { diff --git a/packages/v2/core/src/application/services/TableCreationService.spec.ts b/packages/v2/core/src/application/services/TableCreationService.spec.ts index f88f43b501..af5b77b140 100644 --- a/packages/v2/core/src/application/services/TableCreationService.spec.ts +++ b/packages/v2/core/src/application/services/TableCreationService.spec.ts @@ -60,6 +60,10 @@ class FakeTableRepository implements ITableRepository { async delete() { return ok(undefined); } + + async restore() { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/application/services/TableDeletionSideEffectService.spec.ts b/packages/v2/core/src/application/services/TableDeletionSideEffectService.spec.ts index fe3d854e88..75ce51c0bb 100644 --- a/packages/v2/core/src/application/services/TableDeletionSideEffectService.spec.ts +++ b/packages/v2/core/src/application/services/TableDeletionSideEffectService.spec.ts @@ -246,6 +246,10 @@ class FakeTableRepository implements ITableRepository { this.tablesById.delete(table.id().toString()); return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/application/services/TableUpdateFlow.spec.ts b/packages/v2/core/src/application/services/TableUpdateFlow.spec.ts index bf52619c90..ea105e7d21 100644 --- a/packages/v2/core/src/application/services/TableUpdateFlow.spec.ts +++ b/packages/v2/core/src/application/services/TableUpdateFlow.spec.ts @@ -87,6 +87,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/application/services/UserValueResolverService.ts b/packages/v2/core/src/application/services/UserValueResolverService.ts index b0220a1520..e5740700e0 100644 --- a/packages/v2/core/src/application/services/UserValueResolverService.ts +++ b/packages/v2/core/src/application/services/UserValueResolverService.ts @@ -12,8 +12,8 @@ import { import { CellValue } from '../../domain/table/records/values/CellValue'; import type { IExecutionContext } from '../../ports/ExecutionContext'; import { v2CoreTokens } from '../../ports/tokens'; +import * as UserLookupServicePort from '../../ports/UserLookupService'; import type { UserLookupRecord } from '../../ports/UserLookupService'; -import type { IUserLookupService } from '../../ports/UserLookupService'; import type { ICellValueSpecResolver } from './SpecResolver'; const buildAvatarUrl = (userId: string): string => { @@ -45,7 +45,7 @@ export class UserValueResolverService { constructor( @inject(v2CoreTokens.userLookupService) - private readonly userLookupService: IUserLookupService + private readonly userLookupService: UserLookupServicePort.IUserLookupService ) {} supports(spec: ICellValueSpec): spec is SetUserValueSpec | SetUserValueByIdentifierSpec { diff --git a/packages/v2/core/src/commands/ApplyFieldSnapshotCommand.ts b/packages/v2/core/src/commands/ApplyFieldSnapshotCommand.ts index 88cf6efcb7..9b1b7002a1 100644 --- a/packages/v2/core/src/commands/ApplyFieldSnapshotCommand.ts +++ b/packages/v2/core/src/commands/ApplyFieldSnapshotCommand.ts @@ -4,10 +4,10 @@ import { z } from 'zod'; import { BaseId } from '../domain/base/BaseId'; import { domainError, type DomainError } from '../domain/shared/DomainError'; -import type { ViewQueryDefaultsDTO } from '../domain/table/views/ViewQueryDefaults'; import type { LinkForeignTableReference } from '../domain/table/fields/visitors/LinkForeignTableReferenceVisitor'; -import { recordFilterSchema } from '../queries/RecordFilterDto'; import { TableId } from '../domain/table/TableId'; +import type { ViewQueryDefaultsDTO } from '../domain/table/views/ViewQueryDefaults'; +import { recordFilterSchema } from '../queries/RecordFilterDto'; import { tableFieldInputSchema } from '../schemas/field'; import { parseTableFieldSpec, resolveTableFieldInputName } from './TableFieldSpecs'; import { TableUpdateCommand } from './TableUpdateCommand'; diff --git a/packages/v2/core/src/commands/ApplyRecordOrdersHandler.ts b/packages/v2/core/src/commands/ApplyRecordOrdersHandler.ts index 3d2b822082..7af51de272 100644 --- a/packages/v2/core/src/commands/ApplyRecordOrdersHandler.ts +++ b/packages/v2/core/src/commands/ApplyRecordOrdersHandler.ts @@ -1,3 +1,4 @@ +import { inject, injectable } from '@teable/v2-di'; import { err, ok, safeTry } from 'neverthrow'; import type { Result } from 'neverthrow'; @@ -16,9 +17,8 @@ import * as TableRecordRepositoryPort from '../ports/TableRecordRepository'; import { v2CoreTokens } from '../ports/tokens'; import { TraceSpan } from '../ports/TraceSpan'; import * as UnitOfWorkPort from '../ports/UnitOfWork'; -import { inject, injectable } from '@teable/v2-di'; -import { CommandHandler, type ICommandHandler } from './CommandHandler'; import { ApplyRecordOrdersCommand } from './ApplyRecordOrdersCommand'; +import { CommandHandler, type ICommandHandler } from './CommandHandler'; export class ApplyRecordOrdersResult { private constructor(readonly updatedRecordIds: ReadonlyArray) {} diff --git a/packages/v2/core/src/commands/ClearHandler.spec.ts b/packages/v2/core/src/commands/ClearHandler.spec.ts index 1bb57c8bf7..ddd0d6f339 100644 --- a/packages/v2/core/src/commands/ClearHandler.spec.ts +++ b/packages/v2/core/src/commands/ClearHandler.spec.ts @@ -25,8 +25,8 @@ import { TableName } from '../domain/table/TableName'; import type { TableSortKey } from '../domain/table/TableSortKey'; import type { IEventBus } from '../ports/EventBus'; import type { IExecutionContext, IUnitOfWorkTransaction } from '../ports/ExecutionContext'; -import type { IFindOptions } from '../ports/RepositoryQuery'; import { RecordWriteOperationKind } from '../ports/RecordWritePlugin'; +import type { IFindOptions } from '../ports/RepositoryQuery'; import type { ITableRecordQueryRepository, ITableRecordQueryStreamOptions, @@ -167,6 +167,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableRecordRepository implements ITableRecordRepository { diff --git a/packages/v2/core/src/commands/CreateFieldCommand.ts b/packages/v2/core/src/commands/CreateFieldCommand.ts index 84d81a42c8..16468fdcfd 100644 --- a/packages/v2/core/src/commands/CreateFieldCommand.ts +++ b/packages/v2/core/src/commands/CreateFieldCommand.ts @@ -60,7 +60,13 @@ export class CreateFieldCommand extends TableUpdateCommand { return BaseId.create(parsed.data.baseId).andThen((baseId) => TableId.create(parsed.data.tableId).map( (tableId) => - new CreateFieldCommand(baseId, tableId, parsed.data.field, parsed.data.viewId, parsed.data.order) + new CreateFieldCommand( + baseId, + tableId, + parsed.data.field, + parsed.data.viewId, + parsed.data.order + ) ) ); } diff --git a/packages/v2/core/src/commands/CreateFieldHandler.spec.ts b/packages/v2/core/src/commands/CreateFieldHandler.spec.ts index 4ffa436f6f..670d058e24 100644 --- a/packages/v2/core/src/commands/CreateFieldHandler.spec.ts +++ b/packages/v2/core/src/commands/CreateFieldHandler.spec.ts @@ -13,6 +13,7 @@ import { ActorId } from '../domain/shared/ActorId'; import { domainError, type DomainError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; import type { ISpecification } from '../domain/shared/specification/ISpecification'; +import { ViewColumnMetaUpdated } from '../domain/table/events/ViewColumnMetaUpdated'; import { FieldId } from '../domain/table/fields/FieldId'; import { FieldName } from '../domain/table/fields/FieldName'; import type { FormulaField } from '../domain/table/fields/types/FormulaField'; @@ -28,7 +29,6 @@ import { TableName } from '../domain/table/TableName'; import type { TableSortKey } from '../domain/table/TableSortKey'; import { ViewColumnMeta } from '../domain/table/views/ViewColumnMeta'; import { ViewName } from '../domain/table/views/ViewName'; -import { ViewColumnMetaUpdated } from '../domain/table/events/ViewColumnMetaUpdated'; import type { IEventBus } from '../ports/EventBus'; import type { IExecutionContext, IUnitOfWorkTransaction } from '../ports/ExecutionContext'; import { FieldOperationKind } from '../ports/FieldOperationPlugin'; @@ -153,6 +153,10 @@ class InMemoryTableRepository implements ITableRepository { async delete(_context: IExecutionContext, _table: Table): Promise> { return ok(undefined); } + + async restore(_context: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/CreateRecordHandler.spec.ts b/packages/v2/core/src/commands/CreateRecordHandler.spec.ts index 2d1ce82519..2a2b88107f 100644 --- a/packages/v2/core/src/commands/CreateRecordHandler.spec.ts +++ b/packages/v2/core/src/commands/CreateRecordHandler.spec.ts @@ -32,8 +32,8 @@ import { TableName } from '../domain/table/TableName'; import type { TableSortKey } from '../domain/table/TableSortKey'; import type { IEventBus } from '../ports/EventBus'; import type { IExecutionContext, IUnitOfWorkTransaction } from '../ports/ExecutionContext'; -import type { IFindOptions } from '../ports/RepositoryQuery'; import { RecordWriteOperationKind } from '../ports/RecordWritePlugin'; +import type { IFindOptions } from '../ports/RepositoryQuery'; import type { ITableRecordQueryRepository } from '../ports/TableRecordQueryRepository'; import type { TableRecordReadModel } from '../ports/TableRecordReadModel'; import type { ITableRecordRepository } from '../ports/TableRecordRepository'; @@ -119,6 +119,10 @@ class FakeTableRepository implements ITableRepository { async delete(_context: IExecutionContext, _table: Table): Promise> { return ok(undefined); } + + async restore(_context: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/CreateRecordHandler.ts b/packages/v2/core/src/commands/CreateRecordHandler.ts index ca67b1df26..38fbb5147f 100644 --- a/packages/v2/core/src/commands/CreateRecordHandler.ts +++ b/packages/v2/core/src/commands/CreateRecordHandler.ts @@ -7,8 +7,8 @@ import { TableQueryService } from '../application/services/TableQueryService'; import type { DomainError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; import type { TableRecord } from '../domain/table/records/TableRecord'; -import { RecordWriteOperationKind } from '../ports/RecordWritePlugin'; import * as ExecutionContextPort from '../ports/ExecutionContext'; +import { RecordWriteOperationKind } from '../ports/RecordWritePlugin'; import { v2CoreTokens } from '../ports/tokens'; import { TraceSpan } from '../ports/TraceSpan'; import { CommandHandler, type ICommandHandler } from './CommandHandler'; diff --git a/packages/v2/core/src/commands/CreateRecordsHandler.spec.ts b/packages/v2/core/src/commands/CreateRecordsHandler.spec.ts index 069ca30d5f..e9259e125c 100644 --- a/packages/v2/core/src/commands/CreateRecordsHandler.spec.ts +++ b/packages/v2/core/src/commands/CreateRecordsHandler.spec.ts @@ -145,6 +145,10 @@ class FakeTableRepository implements ITableRepository { async delete(_context: IExecutionContext, _table: Table): Promise> { return ok(undefined); } + + async restore(_context: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/CreateRecordsStreamHandler.spec.ts b/packages/v2/core/src/commands/CreateRecordsStreamHandler.spec.ts index 19847d191b..7ee59fa1c9 100644 --- a/packages/v2/core/src/commands/CreateRecordsStreamHandler.spec.ts +++ b/packages/v2/core/src/commands/CreateRecordsStreamHandler.spec.ts @@ -22,8 +22,8 @@ import { TableName } from '../domain/table/TableName'; import type { TableSortKey } from '../domain/table/TableSortKey'; import type { IEventBus } from '../ports/EventBus'; import type { IExecutionContext, IUnitOfWorkTransaction } from '../ports/ExecutionContext'; -import type { IFindOptions } from '../ports/RepositoryQuery'; import { RecordWriteOperationKind } from '../ports/RecordWritePlugin'; +import type { IFindOptions } from '../ports/RepositoryQuery'; import type { BatchRecordMutationResult, ITableRecordRepository, @@ -114,6 +114,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableRecordRepository implements ITableRecordRepository { diff --git a/packages/v2/core/src/commands/CreateTableCommand.spec.ts b/packages/v2/core/src/commands/CreateTableCommand.spec.ts index e9b15f076b..9babf1bc4a 100644 --- a/packages/v2/core/src/commands/CreateTableCommand.spec.ts +++ b/packages/v2/core/src/commands/CreateTableCommand.spec.ts @@ -1,6 +1,6 @@ +import { tableI18nKeys } from '@teable/i18n-keys'; import { describe, expect, it } from 'vitest'; -import { tableI18nKeys } from '@teable/i18n-keys'; import { BaseId } from '../domain/base/BaseId'; import { ActorId } from '../domain/shared/ActorId'; import { Field } from '../domain/table/fields/Field'; diff --git a/packages/v2/core/src/commands/CreateTableHandler.spec.ts b/packages/v2/core/src/commands/CreateTableHandler.spec.ts index 36e6244e1b..a7bf050844 100644 --- a/packages/v2/core/src/commands/CreateTableHandler.spec.ts +++ b/packages/v2/core/src/commands/CreateTableHandler.spec.ts @@ -103,6 +103,10 @@ class FakeTableRepository implements ITableRepository { async delete(_context: IExecutionContext, _table: Table): Promise> { return ok(undefined); } + + async restore(_context: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/CreateTablesHandler.spec.ts b/packages/v2/core/src/commands/CreateTablesHandler.spec.ts index 2df2b09cb0..319ba8cc69 100644 --- a/packages/v2/core/src/commands/CreateTablesHandler.spec.ts +++ b/packages/v2/core/src/commands/CreateTablesHandler.spec.ts @@ -117,6 +117,10 @@ class FakeTableRepository implements ITableRepository { async delete(_context: IExecutionContext, _table: Table): Promise> { return ok(undefined); } + + async restore(_context: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/DeleteByRangeHandler.spec.ts b/packages/v2/core/src/commands/DeleteByRangeHandler.spec.ts index 0cb51893cd..4c019da2c2 100644 --- a/packages/v2/core/src/commands/DeleteByRangeHandler.spec.ts +++ b/packages/v2/core/src/commands/DeleteByRangeHandler.spec.ts @@ -15,9 +15,9 @@ import { FieldName } from '../domain/table/fields/FieldName'; import type { RecordId } from '../domain/table/records/RecordId'; import type { RecordUpdateResult } from '../domain/table/records/RecordUpdateResult'; import type { ITableRecordConditionSpecVisitor } from '../domain/table/records/specs/ITableRecordConditionSpecVisitor'; +import { RecordByIdsSpec } from '../domain/table/records/specs/RecordByIdsSpec'; import type { ICellValueSpec } from '../domain/table/records/specs/values/ICellValueSpecVisitor'; import type { TableRecord } from '../domain/table/records/TableRecord'; -import { RecordByIdsSpec } from '../domain/table/records/specs/RecordByIdsSpec'; import type { ITableSpecVisitor } from '../domain/table/specs/ITableSpecVisitor'; import { Table } from '../domain/table/Table'; import { TableId } from '../domain/table/TableId'; @@ -25,8 +25,8 @@ import { TableName } from '../domain/table/TableName'; import type { TableSortKey } from '../domain/table/TableSortKey'; import type { IEventBus } from '../ports/EventBus'; import type { IExecutionContext, IUnitOfWorkTransaction } from '../ports/ExecutionContext'; -import type { IFindOptions } from '../ports/RepositoryQuery'; import { RecordWriteOperationKind } from '../ports/RecordWritePlugin'; +import type { IFindOptions } from '../ports/RepositoryQuery'; import type { ITableRecordQueryRepository, ITableRecordQueryOptions, @@ -131,6 +131,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableRecordRepository implements ITableRecordRepository { diff --git a/packages/v2/core/src/commands/DeleteFieldHandler.spec.ts b/packages/v2/core/src/commands/DeleteFieldHandler.spec.ts index 1aef636d1e..37af797ce0 100644 --- a/packages/v2/core/src/commands/DeleteFieldHandler.spec.ts +++ b/packages/v2/core/src/commands/DeleteFieldHandler.spec.ts @@ -149,6 +149,10 @@ class FakeTableRepository implements ITableRepository { return ok(undefined); } + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } + async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } diff --git a/packages/v2/core/src/commands/DeleteFieldsHandler.spec.ts b/packages/v2/core/src/commands/DeleteFieldsHandler.spec.ts index 5526388c36..15133e1122 100644 --- a/packages/v2/core/src/commands/DeleteFieldsHandler.spec.ts +++ b/packages/v2/core/src/commands/DeleteFieldsHandler.spec.ts @@ -26,8 +26,10 @@ import { composeUndoRedoCommands, createUndoRedoCommand, flattenUndoRedoCommands, + type UndoRedoApplyFieldSnapshotCommandData, + type UndoRedoDeleteFieldCommandData, } from '../ports/UndoRedoStore'; -import { DeleteFieldCommand } from './DeleteFieldCommand'; +import type { DeleteFieldCommand } from './DeleteFieldCommand'; import { DeleteFieldResult } from './DeleteFieldHandler'; import { DeleteFieldsCommand } from './DeleteFieldsCommand'; import { DeleteFieldsHandler } from './DeleteFieldsHandler'; @@ -40,10 +42,9 @@ const createBaseId = (seed: string) => BaseId.create(`bse${seed.repeat(16)}`)._u const createTableId = (seed: string) => TableId.create(`tbl${seed.repeat(16)}`)._unsafeUnwrap(); const createFieldId = (seed: string) => FieldId.create(`fld${seed.repeat(16)}`)._unsafeUnwrap(); -const buildEvent = (name = 'Field deleted'): IDomainEvent => ({ +const buildEvent = (_name = 'Field deleted'): IDomainEvent => ({ name: DomainEventName.fieldDeleted(), occurredAt: OccurredAt.now(), - payload: { name }, }); const buildTable = (baseId: BaseId, tableId: TableId, fieldIds: readonly FieldId[]) => { @@ -109,6 +110,10 @@ class FakeTableRepository implements ITableRepository { return ok(undefined); } + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } + async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } @@ -273,10 +278,14 @@ describe('DeleteFieldsHandler', () => { const entry = undoRedoService.entries[0]; expect(entry.tableId.equals(latestTable.id())).toBe(true); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const undoLeaves = flattenUndoRedoCommands(entry.entry.undoCommand as any); expect( undoLeaves - .filter((leaf) => leaf.type === 'ApplyFieldSnapshot') + .filter( + (leaf): leaf is UndoRedoApplyFieldSnapshotCommandData => + leaf.type === 'ApplyFieldSnapshot' + ) .map((leaf) => leaf.payload.snapshot.field.id) ).toEqual([ targetFieldA.toString(), @@ -285,12 +294,12 @@ describe('DeleteFieldsHandler', () => { relatedFieldY.toString(), ]); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const redoLeaves = flattenUndoRedoCommands(entry.entry.redoCommand as any); expect(redoLeaves.map((leaf) => leaf.type)).toEqual(['DeleteField', 'DeleteField']); - expect(redoLeaves.map((leaf) => leaf.payload.fieldId)).toEqual([ - targetFieldA.toString(), - targetFieldB.toString(), - ]); + expect( + redoLeaves.map((leaf) => (leaf as UndoRedoDeleteFieldCommandData).payload.fieldId) + ).toEqual([targetFieldA.toString(), targetFieldB.toString()]); }); it('returns the nested delete error and skips undo/redo recording', async () => { diff --git a/packages/v2/core/src/commands/DeleteFieldsHandler.ts b/packages/v2/core/src/commands/DeleteFieldsHandler.ts index 4d5b7f6c28..8b817a1213 100644 --- a/packages/v2/core/src/commands/DeleteFieldsHandler.ts +++ b/packages/v2/core/src/commands/DeleteFieldsHandler.ts @@ -8,21 +8,21 @@ import { domainError, type DomainError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; import type { Table } from '../domain/table/Table'; import { Table as TableAggregate } from '../domain/table/Table'; -import type * as ExecutionContextPort from '../ports/ExecutionContext'; -import type { ICommandBus } from '../ports/CommandBus'; -import type * as TableRepositoryPort from '../ports/TableRepository'; +import * as CommandBusPort from '../ports/CommandBus'; +import * as ExecutionContextPort from '../ports/ExecutionContext'; +import * as TableRepositoryPort from '../ports/TableRepository'; +import { v2CoreTokens } from '../ports/tokens'; +import { TraceSpan } from '../ports/TraceSpan'; import { composeUndoRedoCommands, createUndoRedoCommand, flattenUndoRedoCommands, type UndoRedoCommandLeafData, } from '../ports/UndoRedoStore'; -import { v2CoreTokens } from '../ports/tokens'; -import { TraceSpan } from '../ports/TraceSpan'; import { CommandHandler, type ICommandHandler } from './CommandHandler'; import { DeleteFieldCommand } from './DeleteFieldCommand'; +import type { DeleteFieldResult } from './DeleteFieldHandler'; import { DeleteFieldsCommand } from './DeleteFieldsCommand'; -import { DeleteFieldResult } from './DeleteFieldHandler'; export class DeleteFieldsResult { private constructor( @@ -42,7 +42,7 @@ export class DeleteFieldsHandler { constructor( @inject(v2CoreTokens.commandBus) - private readonly commandBus: ICommandBus, + private readonly commandBus: CommandBusPort.ICommandBus, @inject(v2CoreTokens.tableRepository) private readonly tableRepository: TableRepositoryPort.ITableRepository, @inject(v2CoreTokens.fieldUndoRedoSnapshotService) diff --git a/packages/v2/core/src/commands/DeleteRecordsHandler.spec.ts b/packages/v2/core/src/commands/DeleteRecordsHandler.spec.ts index 67e5b16190..5a1e2cf7bd 100644 --- a/packages/v2/core/src/commands/DeleteRecordsHandler.spec.ts +++ b/packages/v2/core/src/commands/DeleteRecordsHandler.spec.ts @@ -128,6 +128,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableRecordRepository implements ITableRecordRepository { diff --git a/packages/v2/core/src/commands/DeleteTableHandler.spec.ts b/packages/v2/core/src/commands/DeleteTableHandler.spec.ts index 60dc1e742f..10cf34cc16 100644 --- a/packages/v2/core/src/commands/DeleteTableHandler.spec.ts +++ b/packages/v2/core/src/commands/DeleteTableHandler.spec.ts @@ -110,6 +110,10 @@ class FakeTableRepository implements ITableRepository { this.deletedTableIds.add(table.id().toString()); return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/DuplicateFieldCommand.ts b/packages/v2/core/src/commands/DuplicateFieldCommand.ts index 0897bcad84..ec95774332 100644 --- a/packages/v2/core/src/commands/DuplicateFieldCommand.ts +++ b/packages/v2/core/src/commands/DuplicateFieldCommand.ts @@ -4,8 +4,8 @@ import { z } from 'zod'; import { BaseId } from '../domain/base/BaseId'; import { domainError, type DomainError } from '../domain/shared/DomainError'; -import type { LinkForeignTableReference } from '../domain/table/fields/visitors/LinkForeignTableReferenceVisitor'; import { FieldId } from '../domain/table/fields/FieldId'; +import type { LinkForeignTableReference } from '../domain/table/fields/visitors/LinkForeignTableReferenceVisitor'; import { TableId } from '../domain/table/TableId'; import { ViewId } from '../domain/table/views/ViewId'; import { TableUpdateCommand } from './TableUpdateCommand'; diff --git a/packages/v2/core/src/commands/DuplicateFieldHandler.spec.ts b/packages/v2/core/src/commands/DuplicateFieldHandler.spec.ts index fe56e3c749..b6a2bf7d8e 100644 --- a/packages/v2/core/src/commands/DuplicateFieldHandler.spec.ts +++ b/packages/v2/core/src/commands/DuplicateFieldHandler.spec.ts @@ -152,6 +152,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/DuplicateFieldHandler.ts b/packages/v2/core/src/commands/DuplicateFieldHandler.ts index 4d7079eaa5..386cbfd989 100644 --- a/packages/v2/core/src/commands/DuplicateFieldHandler.ts +++ b/packages/v2/core/src/commands/DuplicateFieldHandler.ts @@ -1,6 +1,6 @@ import { inject, injectable } from '@teable/v2-di'; -import { err, ok, safeTry } from 'neverthrow'; import type { Result } from 'neverthrow'; +import { err, ok, safeTry } from 'neverthrow'; import { FieldCreationSideEffectService } from '../application/services/FieldCreationSideEffectService'; import { FieldOperationPluginRunner } from '../application/services/FieldOperationPluginRunner'; @@ -8,7 +8,8 @@ import { FieldUndoRedoSnapshotService } from '../application/services/FieldUndoR import { ForeignTableLoaderService } from '../application/services/ForeignTableLoaderService'; import { TableUpdateFlow } from '../application/services/TableUpdateFlow'; import { UndoRedoService } from '../application/services/UndoRedoService'; -import { domainError, type DomainError } from '../domain/shared/DomainError'; +import type { DomainError } from '../domain/shared/DomainError'; +import { domainError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; import type { Field } from '../domain/table/fields/Field'; import { FieldId } from '../domain/table/fields/FieldId'; @@ -18,7 +19,7 @@ import { Table as TableAggregate, type Table } from '../domain/table/Table'; import type { TableUpdateResult } from '../domain/table/TableMutator'; import * as ExecutionContextPort from '../ports/ExecutionContext'; import { FieldOperationKind, FieldOperationTargetKind } from '../ports/FieldOperationPlugin'; -import { ITableRepository } from '../ports/TableRepository'; +import * as TableRepositoryPort from '../ports/TableRepository'; import { v2CoreTokens } from '../ports/tokens'; import { TraceSpan } from '../ports/TraceSpan'; import { createUndoRedoCommand } from '../ports/UndoRedoStore'; @@ -56,7 +57,7 @@ export class DuplicateFieldHandler @inject(v2CoreTokens.foreignTableLoaderService) private readonly foreignTableLoaderService: ForeignTableLoaderService, @inject(v2CoreTokens.tableRepository) - private readonly tableRepository: ITableRepository, + private readonly tableRepository: TableRepositoryPort.ITableRepository, @inject(v2CoreTokens.fieldOperationPluginRunner) private readonly fieldOperationPluginRunner: FieldOperationPluginRunner, @inject(v2CoreTokens.undoRedoService) diff --git a/packages/v2/core/src/commands/DuplicateRecordHandler.spec.ts b/packages/v2/core/src/commands/DuplicateRecordHandler.spec.ts index bc6d32d261..7ad55ec3fe 100644 --- a/packages/v2/core/src/commands/DuplicateRecordHandler.spec.ts +++ b/packages/v2/core/src/commands/DuplicateRecordHandler.spec.ts @@ -114,6 +114,10 @@ class FakeTableRepository implements ITableRepository { async delete(_context: IExecutionContext, _table: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/DuplicateTableHandler.spec.ts b/packages/v2/core/src/commands/DuplicateTableHandler.spec.ts index c9217b20d9..7fc0ce4d52 100644 --- a/packages/v2/core/src/commands/DuplicateTableHandler.spec.ts +++ b/packages/v2/core/src/commands/DuplicateTableHandler.spec.ts @@ -3,8 +3,6 @@ import type { Result } from 'neverthrow'; import { describe, expect, it } from 'vitest'; import { TableQueryService } from '../application/services/TableQueryService'; -import { DefaultTableMapper } from '../ports/mappers/defaults/DefaultTableMapper'; -import type { ITablePersistenceDTO } from '../ports/mappers/TableMapper'; import { ActorId } from '../domain/shared/ActorId'; import { domainError, type DomainError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; @@ -21,6 +19,8 @@ import type { Table } from '../domain/table/Table'; import type { TableSortKey } from '../domain/table/TableSortKey'; import type { IEventBus } from '../ports/EventBus'; import type { IExecutionContext, IUnitOfWorkTransaction } from '../ports/ExecutionContext'; +import { DefaultTableMapper } from '../ports/mappers/defaults/DefaultTableMapper'; +import type { ITablePersistenceDTO } from '../ports/mappers/TableMapper'; import type { IFindOptions } from '../ports/RepositoryQuery'; import type { ITableRecordQueryOptions, diff --git a/packages/v2/core/src/commands/DuplicateTableHandler.ts b/packages/v2/core/src/commands/DuplicateTableHandler.ts index 4fd0c7442f..7189aea579 100644 --- a/packages/v2/core/src/commands/DuplicateTableHandler.ts +++ b/packages/v2/core/src/commands/DuplicateTableHandler.ts @@ -5,18 +5,18 @@ import type { Result } from 'neverthrow'; import { TableQueryService } from '../application/services/TableQueryService'; import type { DomainError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; +import { DomainEventName } from '../domain/shared/DomainEventName'; +import type { RecordCreated } from '../domain/table/events/RecordCreated'; +import { RecordsBatchCreated } from '../domain/table/events/RecordsBatchCreated'; import type { Field } from '../domain/table/fields/Field'; import { FieldType } from '../domain/table/fields/FieldType'; import { LinkField } from '../domain/table/fields/types/LinkField'; -import { DomainEventName } from '../domain/shared/DomainEventName'; import { RecordId } from '../domain/table/records/RecordId'; import type { TableRecord } from '../domain/table/records/TableRecord'; import type { Table } from '../domain/table/Table'; -import { RecordCreated } from '../domain/table/events/RecordCreated'; -import { RecordsBatchCreated } from '../domain/table/events/RecordsBatchCreated'; -import type { ITableMapper } from '../ports/mappers/TableMapper'; import * as EventBusPort from '../ports/EventBus'; import * as ExecutionContextPort from '../ports/ExecutionContext'; +import * as TableMapperPort from '../ports/mappers/TableMapper'; import * as TableRecordQueryRepositoryPort from '../ports/TableRecordQueryRepository'; import type { RecordRestoreSystemValues } from '../ports/TableRecordRepository'; import * as TableRecordRepositoryPort from '../ports/TableRecordRepository'; @@ -55,7 +55,7 @@ export class DuplicateTableHandler @inject(v2CoreTokens.tableQueryService) private readonly tableQueryService: TableQueryService, @inject(v2CoreTokens.tableMapper) - private readonly tableMapper: ITableMapper, + private readonly tableMapper: TableMapperPort.ITableMapper, @inject(v2CoreTokens.tableRepository) private readonly tableRepository: TableRepositoryPort.ITableRepository, @inject(v2CoreTokens.tableSchemaRepository) diff --git a/packages/v2/core/src/commands/ImportCsvHandler.spec.ts b/packages/v2/core/src/commands/ImportCsvHandler.spec.ts index 0d6926ca13..9aa8db3544 100644 --- a/packages/v2/core/src/commands/ImportCsvHandler.spec.ts +++ b/packages/v2/core/src/commands/ImportCsvHandler.spec.ts @@ -106,6 +106,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/ImportRecordsHandler.spec.ts b/packages/v2/core/src/commands/ImportRecordsHandler.spec.ts index cc2a2be27d..efe0e7c357 100644 --- a/packages/v2/core/src/commands/ImportRecordsHandler.spec.ts +++ b/packages/v2/core/src/commands/ImportRecordsHandler.spec.ts @@ -38,6 +38,7 @@ import type { InsertManyStreamOptions, ITableRecordRepository, RecordMutationResult, + UpdateManyResult, UpdateManyStreamResult, } from '../ports/TableRecordRepository'; import type { ITableRepository } from '../ports/TableRepository'; @@ -163,6 +164,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableRecordRepository implements ITableRecordRepository { @@ -226,7 +231,7 @@ class FakeTableRecordRepository implements ITableRecordRepository { __: Table, ___: ISpecification, ____: ICellValueSpec - ): Promise> { + ): Promise> { return ok({ totalUpdated: 0, updatedRecordIds: [], updatedRecords: [] }); } diff --git a/packages/v2/core/src/commands/ImportRecordsHandler.ts b/packages/v2/core/src/commands/ImportRecordsHandler.ts index dbf3f16110..4739abf7bc 100644 --- a/packages/v2/core/src/commands/ImportRecordsHandler.ts +++ b/packages/v2/core/src/commands/ImportRecordsHandler.ts @@ -14,13 +14,13 @@ import { TableByIdSpec } from '../domain/table/specs/TableByIdSpec'; import type { Table } from '../domain/table/Table'; import * as EventBusPort from '../ports/EventBus'; import type { IExecutionContext } from '../ports/ExecutionContext'; -import { RecordWriteOperationKind, type RecordWriteFieldValues } from '../ports/RecordWritePlugin'; import type { IImportParseResult, IImportProgress, SourceColumnMap, } from '../ports/import/IImportSource'; import * as IImportSourceRegistryPort from '../ports/import/IImportSourceRegistry'; +import { RecordWriteOperationKind, type RecordWriteFieldValues } from '../ports/RecordWritePlugin'; import * as TableRecordRepositoryPort from '../ports/TableRecordRepository'; import * as TableRepositoryPort from '../ports/TableRepository'; import { v2CoreTokens } from '../ports/tokens'; @@ -171,10 +171,8 @@ export class ImportRecordsHandler // 6. Stream insert via insertManyStream // Use deferComputedUpdates to avoid blocking the response while computed fields update - let insertResult: TableRecordRepositoryPort.InsertManyStreamResult; - insertResult = yield* await handler.unitOfWork.withTransaction( - context, - async (transactionContext) => { + const insertResult: TableRecordRepositoryPort.InsertManyStreamResult = + yield* await handler.unitOfWork.withTransaction(context, async (transactionContext) => { const recordBatches = handler.createRecordBatchesStream( transactionContext, state, @@ -201,8 +199,7 @@ export class ImportRecordsHandler }, } ); - } - ); + }); // 8. Publish all collected events if (state.events.length > 0) { diff --git a/packages/v2/core/src/commands/PasteHandler.spec.ts b/packages/v2/core/src/commands/PasteHandler.spec.ts index 2415478f54..428fb46424 100644 --- a/packages/v2/core/src/commands/PasteHandler.spec.ts +++ b/packages/v2/core/src/commands/PasteHandler.spec.ts @@ -221,6 +221,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/PropagateUserRenameHandler.ts b/packages/v2/core/src/commands/PropagateUserRenameHandler.ts index eccb6dcb2e..f151ab9803 100644 --- a/packages/v2/core/src/commands/PropagateUserRenameHandler.ts +++ b/packages/v2/core/src/commands/PropagateUserRenameHandler.ts @@ -2,9 +2,9 @@ import { inject, injectable } from '@teable/v2-di'; import type { Result } from 'neverthrow'; import type { DomainError } from '../domain/shared/DomainError'; -import type { IUserRenamePropagationService } from '../ports/UserRenamePropagationService'; -import type { IExecutionContext } from '../ports/ExecutionContext'; +import type * as ExecutionContextPort from '../ports/ExecutionContext'; import { v2CoreTokens } from '../ports/tokens'; +import * as UserRenamePropagationServicePort from '../ports/UserRenamePropagationService'; import { CommandHandler, type ICommandHandler } from './CommandHandler'; import { PropagateUserRenameCommand } from './PropagateUserRenameCommand'; @@ -15,11 +15,11 @@ export class PropagateUserRenameHandler { constructor( @inject(v2CoreTokens.userRenamePropagationService) - private readonly userRenamePropagationService: IUserRenamePropagationService + private readonly userRenamePropagationService: UserRenamePropagationServicePort.IUserRenamePropagationService ) {} handle( - context: IExecutionContext, + context: ExecutionContextPort.IExecutionContext, command: PropagateUserRenameCommand ): Promise> { return this.userRenamePropagationService.propagateUserRename(context, { diff --git a/packages/v2/core/src/commands/RenameTableHandler.spec.ts b/packages/v2/core/src/commands/RenameTableHandler.spec.ts index 7550e4f2f3..d85f820ed4 100644 --- a/packages/v2/core/src/commands/RenameTableHandler.spec.ts +++ b/packages/v2/core/src/commands/RenameTableHandler.spec.ts @@ -97,6 +97,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeEventBus implements IEventBus { diff --git a/packages/v2/core/src/commands/ReorderRecordsHandler.ts b/packages/v2/core/src/commands/ReorderRecordsHandler.ts index 79a88cb7c7..d8b0fac832 100644 --- a/packages/v2/core/src/commands/ReorderRecordsHandler.ts +++ b/packages/v2/core/src/commands/ReorderRecordsHandler.ts @@ -2,8 +2,8 @@ import { inject, injectable } from '@teable/v2-di'; import { err, ok, safeTry } from 'neverthrow'; import type { Result } from 'neverthrow'; -import { UndoRedoService } from '../application/services/UndoRedoService'; import { TableQueryService } from '../application/services/TableQueryService'; +import { UndoRedoService } from '../application/services/UndoRedoService'; import { domainError, type DomainError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; import { RecordReordered } from '../domain/table/events/RecordReordered'; @@ -13,7 +13,7 @@ import { SetRowOrderValueSpec } from '../domain/table/records/specs/values/SetRo import { TableRecord } from '../domain/table/records/TableRecord'; import * as EventBusPort from '../ports/EventBus'; import * as ExecutionContextPort from '../ports/ExecutionContext'; -import type { IRecordOrderCalculator } from '../ports/RecordOrderCalculator'; +import * as RecordOrderCalculatorPort from '../ports/RecordOrderCalculator'; import * as TableRecordQueryRepositoryPort from '../ports/TableRecordQueryRepository'; import * as TableRecordRepositoryPort from '../ports/TableRecordRepository'; import { v2CoreTokens } from '../ports/tokens'; @@ -53,7 +53,7 @@ export class ReorderRecordsHandler @inject(v2CoreTokens.tableRecordQueryRepository) private readonly tableRecordQueryRepository: TableRecordQueryRepositoryPort.ITableRecordQueryRepository, @inject(v2CoreTokens.recordOrderCalculator) - private readonly recordOrderCalculator: IRecordOrderCalculator, + private readonly recordOrderCalculator: RecordOrderCalculatorPort.IRecordOrderCalculator, @inject(v2CoreTokens.eventBus) private readonly eventBus: EventBusPort.IEventBus, @inject(v2CoreTokens.undoRedoService) diff --git a/packages/v2/core/src/commands/ReplayFieldTypeConversionCommand.ts b/packages/v2/core/src/commands/ReplayFieldTypeConversionCommand.ts index 0a4afb612f..dae3a73f61 100644 --- a/packages/v2/core/src/commands/ReplayFieldTypeConversionCommand.ts +++ b/packages/v2/core/src/commands/ReplayFieldTypeConversionCommand.ts @@ -6,9 +6,9 @@ import { BaseId } from '../domain/base/BaseId'; import { domainError, type DomainError } from '../domain/shared/DomainError'; import type { LinkForeignTableReference } from '../domain/table/fields/visitors/LinkForeignTableReferenceVisitor'; import { TableId } from '../domain/table/TableId'; +import type { fieldSnapshotSchema } from './ApplyFieldSnapshotCommand'; import { applyFieldSnapshotInputSchema, - fieldSnapshotSchema, resolveFieldSnapshotForeignTableReferences, } from './ApplyFieldSnapshotCommand'; import { TableUpdateCommand } from './TableUpdateCommand'; diff --git a/packages/v2/core/src/commands/SubmitRecordHandler.spec.ts b/packages/v2/core/src/commands/SubmitRecordHandler.spec.ts index 7e4d15bfda..4f1587339f 100644 --- a/packages/v2/core/src/commands/SubmitRecordHandler.spec.ts +++ b/packages/v2/core/src/commands/SubmitRecordHandler.spec.ts @@ -20,7 +20,11 @@ import { TableName } from '../domain/table/TableName'; import { ViewColumnMeta } from '../domain/table/views/ViewColumnMeta'; import { CloneViewVisitor } from '../domain/table/views/visitors/CloneViewVisitor'; import type { IExecutionContext } from '../ports/ExecutionContext'; -import { RecordWriteOperationKind, type IRecordWritePlugin } from '../ports/RecordWritePlugin'; +import { + RecordWriteOperationKind, + type IRecordWritePlugin, + type RecordWritePluginContext, +} from '../ports/RecordWritePlugin'; import { createRecordWritePluginRunner, createTrackedRecordWritePlugin, @@ -129,7 +133,7 @@ const createRunnerBackedRecordCreationService = ( recordCount: 1 as const, }, isTransactionBound: false, - }); + } as RecordWritePluginContext); if (executionResult.isErr()) return err(executionResult.error); const execution = executionResult.value; diff --git a/packages/v2/core/src/commands/TableFieldSpecs.spec.ts b/packages/v2/core/src/commands/TableFieldSpecs.spec.ts index 4d55b3eb8c..10c4205259 100644 --- a/packages/v2/core/src/commands/TableFieldSpecs.spec.ts +++ b/packages/v2/core/src/commands/TableFieldSpecs.spec.ts @@ -1,14 +1,14 @@ +import { tableI18nKeys } from '@teable/i18n-keys'; import { describe, expect, it } from 'vitest'; -import { tableI18nKeys } from '@teable/i18n-keys'; -import { ActorId } from '../domain/shared/ActorId'; import { BaseId } from '../domain/base/BaseId'; +import { ActorId } from '../domain/shared/ActorId'; import { FieldId } from '../domain/table/fields/FieldId'; import { FieldName } from '../domain/table/fields/FieldName'; import { ConditionalLookupField } from '../domain/table/fields/types/ConditionalLookupField'; import { Table } from '../domain/table/Table'; -import { TableName } from '../domain/table/TableName'; import { TableId } from '../domain/table/TableId'; +import { TableName } from '../domain/table/TableName'; import type { IExecutionContext } from '../ports/ExecutionContext'; import { collectForeignTableReferences, diff --git a/packages/v2/core/src/commands/TableFieldUpdateSpecs.same-type.spec.ts b/packages/v2/core/src/commands/TableFieldUpdateSpecs.same-type.spec.ts index 2a98594fe1..b41f666cb3 100644 --- a/packages/v2/core/src/commands/TableFieldUpdateSpecs.same-type.spec.ts +++ b/packages/v2/core/src/commands/TableFieldUpdateSpecs.same-type.spec.ts @@ -28,13 +28,13 @@ import { TextDefaultValue } from '../domain/table/fields/types/TextDefaultValue' import { UserDefaultValue } from '../domain/table/fields/types/UserDefaultValue'; import { UserMultiplicity } from '../domain/table/fields/types/UserMultiplicity'; import { UserNotification } from '../domain/table/fields/types/UserNotification'; -import { Table } from '../domain/table/Table'; -import { TableId } from '../domain/table/TableId'; -import { TableName } from '../domain/table/TableName'; import { UpdateSingleSelectOptionsSpec } from '../domain/table/specs/field-updates/UpdateSingleSelectOptionsSpec'; import { TableUpdateFieldAiConfigSpec } from '../domain/table/specs/TableUpdateFieldAiConfigSpec'; import { TableUpdateFieldDbFieldNameSpec } from '../domain/table/specs/TableUpdateFieldDbFieldNameSpec'; import { TableUpdateFieldDescriptionSpec } from '../domain/table/specs/TableUpdateFieldDescriptionSpec'; +import { Table } from '../domain/table/Table'; +import { TableId } from '../domain/table/TableId'; +import { TableName } from '../domain/table/TableName'; import { buildUpdateFieldSpecs, parseUpdateFieldSpec } from './TableFieldUpdateSpecs'; const createBaseId = (seed: string) => BaseId.create(`bse${seed.repeat(16)}`)._unsafeUnwrap(); diff --git a/packages/v2/core/src/commands/UpdateFieldHandler.spec.ts b/packages/v2/core/src/commands/UpdateFieldHandler.spec.ts index 5bc2d8576b..4429156643 100644 --- a/packages/v2/core/src/commands/UpdateFieldHandler.spec.ts +++ b/packages/v2/core/src/commands/UpdateFieldHandler.spec.ts @@ -175,6 +175,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/UpdateFieldHandler.ts b/packages/v2/core/src/commands/UpdateFieldHandler.ts index 4fc723a385..888ed446fc 100644 --- a/packages/v2/core/src/commands/UpdateFieldHandler.ts +++ b/packages/v2/core/src/commands/UpdateFieldHandler.ts @@ -1,6 +1,6 @@ import { inject, injectable } from '@teable/v2-di'; -import { err, ok, safeTry } from 'neverthrow'; import type { Result } from 'neverthrow'; +import { err, ok, safeTry } from 'neverthrow'; import { FieldOperationPluginRunner } from '../application/services/FieldOperationPluginRunner'; import { @@ -13,7 +13,8 @@ import { ForeignTableLoaderService } from '../application/services/ForeignTableL import { TableUpdateFlow } from '../application/services/TableUpdateFlow'; import { UndoRedoService } from '../application/services/UndoRedoService'; import type { BaseId } from '../domain/base/BaseId'; -import { domainError, isNotFoundError, type DomainError } from '../domain/shared/DomainError'; +import type { DomainError } from '../domain/shared/DomainError'; +import { domainError, isNotFoundError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; import type { ISpecification } from '../domain/shared/specification/ISpecification'; import { DbFieldName } from '../domain/table/fields/DbFieldName'; @@ -27,8 +28,8 @@ import { Table as TableAggregate } from '../domain/table/Table'; import type { TableId } from '../domain/table/TableId'; import * as ExecutionContextPort from '../ports/ExecutionContext'; import { FieldOperationKind, FieldOperationTargetKind } from '../ports/FieldOperationPlugin'; -import { type ITableMapper } from '../ports/mappers/TableMapper'; -import { ITableRepository } from '../ports/TableRepository'; +import * as TableMapperPort from '../ports/mappers/TableMapper'; +import * as TableRepositoryPort from '../ports/TableRepository'; import { v2CoreTokens } from '../ports/tokens'; import { TraceSpan } from '../ports/TraceSpan'; import { createUndoRedoCommand } from '../ports/UndoRedoStore'; @@ -52,9 +53,9 @@ export class UpdateFieldResult { export class UpdateFieldHandler implements ICommandHandler { constructor( @inject(v2CoreTokens.tableRepository) - private readonly tableRepository: ITableRepository, + private readonly tableRepository: TableRepositoryPort.ITableRepository, @inject(v2CoreTokens.tableMapper) - private readonly tableMapper: ITableMapper, + private readonly tableMapper: TableMapperPort.ITableMapper, @inject(v2CoreTokens.tableUpdateFlow) private readonly tableUpdateFlow: TableUpdateFlow, @inject(v2CoreTokens.fieldUpdateSideEffectService) diff --git a/packages/v2/core/src/commands/UpdateRecordCommand.ts b/packages/v2/core/src/commands/UpdateRecordCommand.ts index 12ce333fcc..b331f0e5ab 100644 --- a/packages/v2/core/src/commands/UpdateRecordCommand.ts +++ b/packages/v2/core/src/commands/UpdateRecordCommand.ts @@ -4,11 +4,11 @@ import { z } from 'zod'; import { domainError, type DomainError } from '../domain/shared/DomainError'; import { type FieldKeyType, fieldKeyTypeSchema } from '../domain/table/fields/FieldKeyType'; +import { RecordId } from '../domain/table/records/RecordId'; import { RecordInsertOrder, recordInsertOrderSchema, } from '../domain/table/records/RecordInsertOrder'; -import { RecordId } from '../domain/table/records/RecordId'; import { TableId } from '../domain/table/TableId'; import type { RecordFieldValues } from './CreateRecordCommand'; diff --git a/packages/v2/core/src/commands/UpdateRecordHandler.spec.ts b/packages/v2/core/src/commands/UpdateRecordHandler.spec.ts index 018dff6be8..fef2ba0fbf 100644 --- a/packages/v2/core/src/commands/UpdateRecordHandler.spec.ts +++ b/packages/v2/core/src/commands/UpdateRecordHandler.spec.ts @@ -42,8 +42,8 @@ import type { TableSortKey } from '../domain/table/TableSortKey'; import type { IEventBus } from '../ports/EventBus'; import type { IExecutionContext, IUnitOfWorkTransaction } from '../ports/ExecutionContext'; import type { IRecordOrderCalculator } from '../ports/RecordOrderCalculator'; -import type { IFindOptions } from '../ports/RepositoryQuery'; import { RecordWriteOperationKind } from '../ports/RecordWritePlugin'; +import type { IFindOptions } from '../ports/RepositoryQuery'; import type { ITableRecordQueryRepository } from '../ports/TableRecordQueryRepository'; import type { TableRecordReadModel } from '../ports/TableRecordReadModel'; import type { @@ -54,13 +54,13 @@ import type { import type { ITableRepository } from '../ports/TableRepository'; import type { ITableSchemaRepository } from '../ports/TableSchemaRepository'; import type { IUnitOfWork, UnitOfWorkOperation } from '../ports/UnitOfWork'; -import { UpdateRecordCommand } from './UpdateRecordCommand'; -import { UpdateRecordHandler } from './UpdateRecordHandler'; import { createRecordWritePluginRunner, createTrackedRecordWritePlugin, expectRecordWritePluginToBeSkipped, } from './recordWritePluginRunnerTestUtils'; +import { UpdateRecordCommand } from './UpdateRecordCommand'; +import { UpdateRecordHandler } from './UpdateRecordHandler'; const createContext = (config?: IExecutionContext['config']): IExecutionContext => { const actorId = ActorId.create('system')._unsafeUnwrap(); @@ -187,6 +187,10 @@ class FakeTableRepository implements ITableRepository { async delete(_: IExecutionContext, __: Table): Promise> { return ok(undefined); } + + async restore(_: IExecutionContext, _table: Table): Promise> { + return ok(undefined); + } } class FakeTableSchemaRepository implements ITableSchemaRepository { diff --git a/packages/v2/core/src/commands/UpdateRecordHandler.ts b/packages/v2/core/src/commands/UpdateRecordHandler.ts index baaa637d54..2fec7d6204 100644 --- a/packages/v2/core/src/commands/UpdateRecordHandler.ts +++ b/packages/v2/core/src/commands/UpdateRecordHandler.ts @@ -1,6 +1,6 @@ import { inject, injectable } from '@teable/v2-di'; -import { err, ok, safeTry } from 'neverthrow'; import type { Result } from 'neverthrow'; +import { err, ok, safeTry } from 'neverthrow'; import { FieldKeyResolverService } from '../application/services/FieldKeyResolverService'; import { RecordMutationSpecResolverService } from '../application/services/RecordMutationSpecResolverService'; @@ -10,7 +10,8 @@ import { RecordWriteUndoRedoPlanService } from '../application/services/RecordWr import { TableQueryService } from '../application/services/TableQueryService'; import { TableUpdateFlow } from '../application/services/TableUpdateFlow'; import { UndoRedoService } from '../application/services/UndoRedoService'; -import { domainError, type DomainError } from '../domain/shared/DomainError'; +import type { DomainError } from '../domain/shared/DomainError'; +import { domainError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; import type { RecordFieldChangeDTO } from '../domain/table/events/RecordFieldValuesDTO'; import { RecordReordered } from '../domain/table/events/RecordReordered'; @@ -22,7 +23,7 @@ import { SetRowOrderValueSpec } from '../domain/table/records/specs/values/SetRo import { TableRecord } from '../domain/table/records/TableRecord'; import * as EventBusPort from '../ports/EventBus'; import * as ExecutionContextPort from '../ports/ExecutionContext'; -import { IRecordOrderCalculator } from '../ports/RecordOrderCalculator'; +import * as RecordOrderCalculatorPort from '../ports/RecordOrderCalculator'; import { RecordWriteOperationKind } from '../ports/RecordWritePlugin'; import * as TableRecordQueryRepositoryPort from '../ports/TableRecordQueryRepository'; import type { RecordMutationResult } from '../ports/TableRecordRepository'; @@ -77,7 +78,7 @@ export class UpdateRecordHandler @inject(v2CoreTokens.tableRecordQueryRepository) private readonly tableRecordQueryRepository: TableRecordQueryRepositoryPort.ITableRecordQueryRepository, @inject(v2CoreTokens.recordOrderCalculator) - private readonly recordOrderCalculator: IRecordOrderCalculator, + private readonly recordOrderCalculator: RecordOrderCalculatorPort.IRecordOrderCalculator, @inject(v2CoreTokens.recordMutationSpecResolverService) private readonly recordMutationSpecResolver: RecordMutationSpecResolverService, @inject(v2CoreTokens.recordWritePluginRunner) diff --git a/packages/v2/core/src/commands/UpdateRecordsCommand.ts b/packages/v2/core/src/commands/UpdateRecordsCommand.ts index a1a3d40301..7376a17636 100644 --- a/packages/v2/core/src/commands/UpdateRecordsCommand.ts +++ b/packages/v2/core/src/commands/UpdateRecordsCommand.ts @@ -4,11 +4,11 @@ import { z } from 'zod'; import { domainError, type DomainError } from '../domain/shared/DomainError'; import { type FieldKeyType, fieldKeyTypeSchema } from '../domain/table/fields/FieldKeyType'; +import { RecordId } from '../domain/table/records/RecordId'; import { RecordInsertOrder, recordInsertOrderSchema, } from '../domain/table/records/RecordInsertOrder'; -import { RecordId } from '../domain/table/records/RecordId'; import { TableId } from '../domain/table/TableId'; import { recordFilterNodeSchema, type RecordFilterNode } from '../queries/RecordFilterDto'; import type { RecordFieldValues } from './CreateRecordCommand'; diff --git a/packages/v2/core/src/commands/UpdateRecordsHandler.spec.ts b/packages/v2/core/src/commands/UpdateRecordsHandler.spec.ts index 18a9a3f678..b40cd5747e 100644 --- a/packages/v2/core/src/commands/UpdateRecordsHandler.spec.ts +++ b/packages/v2/core/src/commands/UpdateRecordsHandler.spec.ts @@ -2,8 +2,8 @@ import { err, ok } from 'neverthrow'; import type { Result } from 'neverthrow'; import { describe, expect, it } from 'vitest'; -import type { RecordMutationSpecResolverService } from '../application/services/RecordMutationSpecResolverService'; import { RecordBulkUpdateService } from '../application/services/RecordBulkUpdateService'; +import type { RecordMutationSpecResolverService } from '../application/services/RecordMutationSpecResolverService'; import { RecordReorderService } from '../application/services/RecordReorderService'; import { RecordWriteSideEffectService } from '../application/services/RecordWriteSideEffectService'; import type { RecordWriteUndoRedoPlanService } from '../application/services/RecordWriteUndoRedoPlanService'; @@ -31,12 +31,12 @@ import { Table } from '../domain/table/Table'; import { TableId } from '../domain/table/TableId'; import { TableName } from '../domain/table/TableName'; import type { TableSortKey } from '../domain/table/TableSortKey'; +import { NoopLogger } from '../ports/defaults/NoopLogger'; import type { IEventBus } from '../ports/EventBus'; import type { IExecutionContext, IUnitOfWorkTransaction } from '../ports/ExecutionContext'; import type { IRecordOrderCalculator } from '../ports/RecordOrderCalculator'; -import { NoopLogger } from '../ports/defaults/NoopLogger'; -import type { IFindOptions } from '../ports/RepositoryQuery'; import { RecordWriteOperationKind } from '../ports/RecordWritePlugin'; +import type { IFindOptions } from '../ports/RepositoryQuery'; import type { ITableRecordQueryRepository } from '../ports/TableRecordQueryRepository'; import type { ITableRecordRepository, @@ -49,13 +49,13 @@ import type { import type { ITableRepository } from '../ports/TableRepository'; import type { ITableSchemaRepository } from '../ports/TableSchemaRepository'; import type { IUnitOfWork, UnitOfWorkOperation } from '../ports/UnitOfWork'; -import { UpdateRecordsCommand } from './UpdateRecordsCommand'; -import { UpdateRecordsHandler } from './UpdateRecordsHandler'; import { createRecordWritePluginRunner, createTrackedRecordWritePlugin, expectRecordWritePluginToBeSkipped, } from './recordWritePluginRunnerTestUtils'; +import { UpdateRecordsCommand } from './UpdateRecordsCommand'; +import { UpdateRecordsHandler } from './UpdateRecordsHandler'; const createContext = (): IExecutionContext => { const actorId = ActorId.create('system')._unsafeUnwrap(); diff --git a/packages/v2/core/src/commands/UpdateRecordsHandler.ts b/packages/v2/core/src/commands/UpdateRecordsHandler.ts index 28a3c7261a..4607f972f1 100644 --- a/packages/v2/core/src/commands/UpdateRecordsHandler.ts +++ b/packages/v2/core/src/commands/UpdateRecordsHandler.ts @@ -6,7 +6,7 @@ import { RecordBulkUpdateService } from '../application/services/RecordBulkUpdat import { TableQueryService } from '../application/services/TableQueryService'; import type { DomainError } from '../domain/shared/DomainError'; import type { IDomainEvent } from '../domain/shared/DomainEvent'; -import type { IExecutionContext } from '../ports/ExecutionContext'; +import * as ExecutionContextPort from '../ports/ExecutionContext'; import { v2CoreTokens } from '../ports/tokens'; import { TraceSpan } from '../ports/TraceSpan'; import { CommandHandler, type ICommandHandler } from './CommandHandler'; @@ -37,7 +37,7 @@ export class UpdateRecordsHandler @TraceSpan() async handle( - context: IExecutionContext, + context: ExecutionContextPort.IExecutionContext, command: UpdateRecordsCommand ): Promise> { const handler = this; diff --git a/packages/v2/core/src/commands/shared/recordWriteScope.ts b/packages/v2/core/src/commands/shared/recordWriteScope.ts index 59a67a1898..acb50d801b 100644 --- a/packages/v2/core/src/commands/shared/recordWriteScope.ts +++ b/packages/v2/core/src/commands/shared/recordWriteScope.ts @@ -5,8 +5,8 @@ import { domainError, type DomainError } from '../../domain/shared/DomainError'; import { composeAndSpecsOrUndefined } from '../../domain/shared/specification/composeAndSpecs'; import type { ISpecification } from '../../domain/shared/specification/ISpecification'; import type { RecordId } from '../../domain/table/records/RecordId'; -import { RecordByIdsSpec } from '../../domain/table/records/specs/RecordByIdsSpec'; import type { ITableRecordConditionSpecVisitor } from '../../domain/table/records/specs/ITableRecordConditionSpecVisitor'; +import { RecordByIdsSpec } from '../../domain/table/records/specs/RecordByIdsSpec'; import type { TableRecord } from '../../domain/table/records/TableRecord'; import type { Table } from '../../domain/table/Table'; import type { IExecutionContext } from '../../ports/ExecutionContext'; diff --git a/packages/v2/core/src/domain/table/Table.spec.ts b/packages/v2/core/src/domain/table/Table.spec.ts index 4249941105..5a39635635 100644 --- a/packages/v2/core/src/domain/table/Table.spec.ts +++ b/packages/v2/core/src/domain/table/Table.spec.ts @@ -31,8 +31,8 @@ import { TableUpdateViewColumnMetaSpec } from './specs/TableUpdateViewColumnMeta import { Table } from './Table'; import { TableId } from './TableId'; import { TableName } from './TableName'; -import { ViewColumnMeta } from './views/ViewColumnMeta'; import { GridView } from './views/types/GridView'; +import { ViewColumnMeta } from './views/ViewColumnMeta'; import { ViewId } from './views/ViewId'; import { ViewName } from './views/ViewName'; diff --git a/packages/v2/core/src/domain/table/events/RecordReordered.ts b/packages/v2/core/src/domain/table/events/RecordReordered.ts index f5c211dd4f..9c6c390732 100644 --- a/packages/v2/core/src/domain/table/events/RecordReordered.ts +++ b/packages/v2/core/src/domain/table/events/RecordReordered.ts @@ -2,8 +2,8 @@ import type { BaseId } from '../../base/BaseId'; import { DomainEventName } from '../../shared/DomainEventName'; import { OccurredAt } from '../../shared/OccurredAt'; import type { RecordId } from '../records/RecordId'; -import type { ViewId } from '../views/ViewId'; import type { TableId } from '../TableId'; +import type { ViewId } from '../views/ViewId'; import { AbstractTableUpdatedEvent } from './AbstractTableUpdatedEvent'; export class RecordReordered extends AbstractTableUpdatedEvent { diff --git a/packages/v2/core/src/domain/table/fields/filter-sync.spec.ts b/packages/v2/core/src/domain/table/fields/filter-sync.spec.ts index 6c0b9232b8..c3e2a3eda1 100644 --- a/packages/v2/core/src/domain/table/fields/filter-sync.spec.ts +++ b/packages/v2/core/src/domain/table/fields/filter-sync.spec.ts @@ -1,5 +1,9 @@ import { describe, expect, it } from 'vitest'; +import type { RecordFilter } from '../../../queries/RecordFilterDto'; +import { UpdateSingleSelectOptionsSpec } from '../specs/field-updates/UpdateSingleSelectOptionsSpec'; +import { TableUpdateFieldTypeSpec } from '../specs/TableUpdateFieldTypeSpec'; +import { TableId } from '../TableId'; import { DbFieldName } from './DbFieldName'; import { FieldId } from './FieldId'; import { FieldName } from './FieldName'; @@ -19,10 +23,6 @@ import { ConditionalLookupOptions } from './types/ConditionalLookupOptions'; import { SelectOption } from './types/SelectOption'; import { SingleLineTextField } from './types/SingleLineTextField'; import { SingleSelectField } from './types/SingleSelectField'; -import { UpdateSingleSelectOptionsSpec } from '../specs/field-updates/UpdateSingleSelectOptionsSpec'; -import { TableUpdateFieldTypeSpec } from '../specs/TableUpdateFieldTypeSpec'; -import { TableId } from '../TableId'; -import type { RecordFilter } from '../../../queries/RecordFilterDto'; const createFieldId = (seed: string) => FieldId.create(`fld${seed.repeat(16)}`)._unsafeUnwrap(); const createTableId = (seed: string) => TableId.create(`tbl${seed.repeat(16)}`)._unsafeUnwrap(); diff --git a/packages/v2/core/src/domain/table/fields/filter-sync.ts b/packages/v2/core/src/domain/table/fields/filter-sync.ts index cb2f1383aa..765e202e60 100644 --- a/packages/v2/core/src/domain/table/fields/filter-sync.ts +++ b/packages/v2/core/src/domain/table/fields/filter-sync.ts @@ -1,18 +1,18 @@ -import type { ISpecification } from '../../shared/specification/ISpecification'; -import type { Table } from '../Table'; -import type { ITableSpecVisitor } from '../specs/ITableSpecVisitor'; -import { TableUpdateFieldTypeSpec } from '../specs/TableUpdateFieldTypeSpec'; -import { UpdateMultipleSelectOptionsSpec } from '../specs/field-updates/UpdateMultipleSelectOptionsSpec'; -import { UpdateSingleSelectOptionsSpec } from '../specs/field-updates/UpdateSingleSelectOptionsSpec'; -import type { Field } from './Field'; -import type { FieldId } from './FieldId'; -import { FieldCondition } from './types/FieldCondition'; import type { RecordFilter, RecordFilterCondition, RecordFilterNode, RecordFilterValue, } from '../../../queries/RecordFilterDto'; +import type { ISpecification } from '../../shared/specification/ISpecification'; +import { UpdateMultipleSelectOptionsSpec } from '../specs/field-updates/UpdateMultipleSelectOptionsSpec'; +import { UpdateSingleSelectOptionsSpec } from '../specs/field-updates/UpdateSingleSelectOptionsSpec'; +import type { ITableSpecVisitor } from '../specs/ITableSpecVisitor'; +import { TableUpdateFieldTypeSpec } from '../specs/TableUpdateFieldTypeSpec'; +import type { Table } from '../Table'; +import type { Field } from './Field'; +import type { FieldId } from './FieldId'; +import { FieldCondition } from './types/FieldCondition'; type FilterGroup = { conjunction: 'and' | 'or'; diff --git a/packages/v2/core/src/domain/table/fields/visitors/FieldCellValueSchemaVisitor.spec.ts b/packages/v2/core/src/domain/table/fields/visitors/FieldCellValueSchemaVisitor.spec.ts index d77b0d294a..5ce84b5045 100644 --- a/packages/v2/core/src/domain/table/fields/visitors/FieldCellValueSchemaVisitor.spec.ts +++ b/packages/v2/core/src/domain/table/fields/visitors/FieldCellValueSchemaVisitor.spec.ts @@ -2,10 +2,10 @@ import { describe, expect, it } from 'vitest'; import { FieldId } from '../FieldId'; import { FieldName } from '../FieldName'; +import { DateField } from '../types/DateField'; import { MultipleSelectField } from '../types/MultipleSelectField'; import { SelectOption } from '../types/SelectOption'; import { SingleSelectField } from '../types/SingleSelectField'; -import { DateField } from '../types/DateField'; import { FieldCellValueSchemaVisitor } from './FieldCellValueSchemaVisitor'; const createFieldId = (seed: string) => diff --git a/packages/v2/core/src/domain/table/fields/visitors/LinkFieldUpdateSideEffectVisitor.spec.ts b/packages/v2/core/src/domain/table/fields/visitors/LinkFieldUpdateSideEffectVisitor.spec.ts index 6b8b5f41fd..dab9c40946 100644 --- a/packages/v2/core/src/domain/table/fields/visitors/LinkFieldUpdateSideEffectVisitor.spec.ts +++ b/packages/v2/core/src/domain/table/fields/visitors/LinkFieldUpdateSideEffectVisitor.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; -import { LinkFieldUpdateSideEffectVisitor } from './LinkFieldUpdateSideEffectVisitor'; import { LinkFieldConfig } from '../types/LinkFieldConfig'; +import { LinkFieldUpdateSideEffectVisitor } from './LinkFieldUpdateSideEffectVisitor'; const buildConfig = (params: { relationship: 'oneOne' | 'oneMany' | 'manyOne' | 'manyMany'; diff --git a/packages/v2/core/src/domain/table/fields/visitors/SetFieldValueSpecFactoryVisitor.ts b/packages/v2/core/src/domain/table/fields/visitors/SetFieldValueSpecFactoryVisitor.ts index f8c6794f3a..333338f833 100644 --- a/packages/v2/core/src/domain/table/fields/visitors/SetFieldValueSpecFactoryVisitor.ts +++ b/packages/v2/core/src/domain/table/fields/visitors/SetFieldValueSpecFactoryVisitor.ts @@ -3,6 +3,7 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import type { ICellValueSpec } from '../../records/specs/values/ICellValueSpecVisitor'; +import { NoopCellValueSpec } from '../../records/specs/values/NoopCellValueSpec'; import { SetAttachmentValueSpec, type AttachmentItem, @@ -17,7 +18,6 @@ import { SetRatingValueSpec } from '../../records/specs/values/SetRatingValueSpe import { SetSingleLineTextValueSpec } from '../../records/specs/values/SetSingleLineTextValueSpec'; import { SetSingleSelectValueSpec } from '../../records/specs/values/SetSingleSelectValueSpec'; import { SetUserValueSpec, type UserItem } from '../../records/specs/values/SetUserValueSpec'; -import { NoopCellValueSpec } from '../../records/specs/values/NoopCellValueSpec'; import { CellValue } from '../../records/values/CellValue'; import type { AttachmentField } from '../types/AttachmentField'; import type { AutoNumberField } from '../types/AutoNumberField'; diff --git a/packages/v2/core/src/domain/table/methods/duplicate.ts b/packages/v2/core/src/domain/table/methods/duplicate.ts index abe649a154..2dfac25b5e 100644 --- a/packages/v2/core/src/domain/table/methods/duplicate.ts +++ b/packages/v2/core/src/domain/table/methods/duplicate.ts @@ -7,12 +7,12 @@ import type { } from '../../../ports/mappers/TableMapper'; import type { DomainError } from '../../shared/DomainError'; import { TableCreated } from '../events/TableCreated'; +import { FieldId } from '../fields/FieldId'; import { LinkField } from '../fields/types/LinkField'; import { LinkFieldConfig } from '../fields/types/LinkFieldConfig'; import type { Table } from '../Table'; import { TableId } from '../TableId'; import type { TableName } from '../TableName'; -import { FieldId } from '../fields/FieldId'; import { ViewId } from '../views/ViewId'; export type DuplicateMethodParams = { diff --git a/packages/v2/core/src/domain/table/methods/records/recordBuilders.ts b/packages/v2/core/src/domain/table/methods/records/recordBuilders.ts index 7e0918989e..37e8ea7db9 100644 --- a/packages/v2/core/src/domain/table/methods/records/recordBuilders.ts +++ b/packages/v2/core/src/domain/table/methods/records/recordBuilders.ts @@ -2,8 +2,8 @@ import { err, ok, safeTry } from 'neverthrow'; import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import { RecordCreated } from '../../events/RecordCreated'; -import { FieldType } from '../../fields/FieldType'; import type { RecordCreateSource } from '../../events/RecordFieldValuesDTO'; +import { FieldType } from '../../fields/FieldType'; import { FieldByKeySpec } from '../../fields/specs/FieldByKeySpec'; import { FieldDefaultValueVisitor } from '../../fields/visitors/FieldDefaultValueVisitor'; import { RecordCreateResult } from '../../records/RecordCreateResult'; diff --git a/packages/v2/core/src/domain/table/records/specs/FieldConditionSpecBuilder.ts b/packages/v2/core/src/domain/table/records/specs/FieldConditionSpecBuilder.ts index 427902456c..193aeac50b 100644 --- a/packages/v2/core/src/domain/table/records/specs/FieldConditionSpecBuilder.ts +++ b/packages/v2/core/src/domain/table/records/specs/FieldConditionSpecBuilder.ts @@ -5,6 +5,7 @@ import type { z } from 'zod'; import { domainError, type DomainError } from '../../../shared/DomainError'; import type { Field } from '../../fields/Field'; import { FieldType } from '../../fields/FieldType'; +import { CellValueType } from '../../fields/types/CellValueType'; import type { ConditionalLookupField } from '../../fields/types/ConditionalLookupField'; import type { LookupField } from '../../fields/types/LookupField'; import type { SingleLineTextField } from '../../fields/types/SingleLineTextField'; diff --git a/packages/v2/core/src/domain/table/records/specs/RecordConditionSpecAccept.spec.ts b/packages/v2/core/src/domain/table/records/specs/RecordConditionSpecAccept.spec.ts index 773995d8a2..4e1701d3fb 100644 --- a/packages/v2/core/src/domain/table/records/specs/RecordConditionSpecAccept.spec.ts +++ b/packages/v2/core/src/domain/table/records/specs/RecordConditionSpecAccept.spec.ts @@ -25,6 +25,7 @@ import { SingleSelectField } from '../../fields/types/SingleSelectField'; import { UserField } from '../../fields/types/UserField'; import { UserMultiplicity } from '../../fields/types/UserMultiplicity'; import { TableId } from '../../TableId'; +import { RecordId } from '../RecordId'; import { AttachmentConditionSpec } from './AttachmentConditionSpec'; import { ButtonConditionSpec } from './ButtonConditionSpec'; import { CheckboxConditionSpec } from './CheckboxConditionSpec'; @@ -51,7 +52,6 @@ import { } from './RecordConditionOperators'; import { RecordConditionLiteralValue } from './RecordConditionValues'; import { RollupConditionSpec } from './RollupConditionSpec'; -import { RecordId } from '../RecordId'; import { SingleLineTextConditionSpec } from './SingleLineTextConditionSpec'; import { SingleSelectConditionSpec } from './SingleSelectConditionSpec'; import { UserConditionSpec } from './UserConditionSpec'; diff --git a/packages/v2/core/src/domain/table/records/specs/values/ICellValueSpecVisitor.ts b/packages/v2/core/src/domain/table/records/specs/values/ICellValueSpecVisitor.ts index e0f1b3c9e2..e2f054d819 100644 --- a/packages/v2/core/src/domain/table/records/specs/values/ICellValueSpecVisitor.ts +++ b/packages/v2/core/src/domain/table/records/specs/values/ICellValueSpecVisitor.ts @@ -16,11 +16,11 @@ import type { SetLongTextValueSpec } from './SetLongTextValueSpec'; import type { SetMultipleSelectValueSpec } from './SetMultipleSelectValueSpec'; import type { SetNumberValueSpec } from './SetNumberValueSpec'; import type { SetRatingValueSpec } from './SetRatingValueSpec'; +import type { SetRowOrderValueSpec } from './SetRowOrderValueSpec'; import type { SetSingleLineTextValueSpec } from './SetSingleLineTextValueSpec'; import type { SetSingleSelectValueSpec } from './SetSingleSelectValueSpec'; import type { SetUserValueByIdentifierSpec } from './SetUserValueByIdentifierSpec'; import type { SetUserValueSpec } from './SetUserValueSpec'; -import type { SetRowOrderValueSpec } from './SetRowOrderValueSpec'; /** * Base interface for cell value mutation specifications. diff --git a/packages/v2/core/src/domain/table/records/specs/values/SetFieldValueSpecFactory.ts b/packages/v2/core/src/domain/table/records/specs/values/SetFieldValueSpecFactory.ts index a29076d041..e866787da8 100644 --- a/packages/v2/core/src/domain/table/records/specs/values/SetFieldValueSpecFactory.ts +++ b/packages/v2/core/src/domain/table/records/specs/values/SetFieldValueSpecFactory.ts @@ -7,9 +7,9 @@ import type { Field } from '../../../fields/Field'; import { FieldType } from '../../../fields/FieldType'; import { FieldCellValueSchemaVisitor } from '../../../fields/visitors/FieldCellValueSchemaVisitor'; import { SetFieldValueSpecFactoryVisitor } from '../../../fields/visitors/SetFieldValueSpecFactoryVisitor'; +import { ClearFieldValueSpec } from './ClearFieldValueSpec'; import type { ICellValueSpec } from './ICellValueSpecVisitor'; import { NoopCellValueSpec } from './NoopCellValueSpec'; -import { ClearFieldValueSpec } from './ClearFieldValueSpec'; /** * Factory for creating SetValueSpec instances. diff --git a/packages/v2/core/src/domain/table/specs/TableUpdateFieldTypeSpec.ts b/packages/v2/core/src/domain/table/specs/TableUpdateFieldTypeSpec.ts index a35670b913..6adf8cb271 100644 --- a/packages/v2/core/src/domain/table/specs/TableUpdateFieldTypeSpec.ts +++ b/packages/v2/core/src/domain/table/specs/TableUpdateFieldTypeSpec.ts @@ -3,9 +3,9 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../shared/DomainError'; import { MutateOnlySpec } from '../../shared/specification/MutateOnlySpec'; +import type { Field } from '../fields/Field'; import { LinkField } from '../fields/types/LinkField'; import { FieldValueTypeVisitor } from '../fields/visitors/FieldValueTypeVisitor'; -import type { Field } from '../fields/Field'; import type { Table } from '../Table'; import type { ITableSpecVisitor } from './ITableSpecVisitor'; diff --git a/packages/v2/core/src/domain/table/specs/__tests__/TableUpdateFieldConstraintsSpec.spec.ts b/packages/v2/core/src/domain/table/specs/__tests__/TableUpdateFieldConstraintsSpec.spec.ts index 512dbe68cf..7a9cb7f6c5 100644 --- a/packages/v2/core/src/domain/table/specs/__tests__/TableUpdateFieldConstraintsSpec.spec.ts +++ b/packages/v2/core/src/domain/table/specs/__tests__/TableUpdateFieldConstraintsSpec.spec.ts @@ -134,6 +134,7 @@ describe('TableUpdateFieldConstraintsSpec', () => { const visitor = { visitTableUpdateFieldConstraints: () => ok(undefined), }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any spec.accept(visitor as any)._unsafeUnwrap(); }); }); diff --git a/packages/v2/core/src/domain/table/specs/__tests__/TableUpdateFieldNameAndTypeSpec.spec.ts b/packages/v2/core/src/domain/table/specs/__tests__/TableUpdateFieldNameAndTypeSpec.spec.ts index 5dbab21b17..181a53380e 100644 --- a/packages/v2/core/src/domain/table/specs/__tests__/TableUpdateFieldNameAndTypeSpec.spec.ts +++ b/packages/v2/core/src/domain/table/specs/__tests__/TableUpdateFieldNameAndTypeSpec.spec.ts @@ -56,6 +56,7 @@ describe('TableUpdateFieldNameSpec', () => { const spec = TableUpdateFieldNameSpec.create(fieldId, prevName, nextName); const visitor = { visitTableUpdateFieldName: () => ok(undefined) }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any spec.accept(visitor as any)._unsafeUnwrap(); }); }); @@ -82,6 +83,7 @@ describe('TableUpdateFieldDescriptionSpec', () => { const fieldId = createFieldId('9'); const spec = TableUpdateFieldDescriptionSpec.create(fieldId, null, 'desc'); const visitor = { visitTableUpdateFieldDescription: () => ok(undefined) }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any spec.accept(visitor as any)._unsafeUnwrap(); }); }); @@ -150,6 +152,7 @@ describe('TableUpdateFieldTypeSpec', () => { const spec = TableUpdateFieldTypeSpec.create(textField, numberField); const visitor = { visitTableUpdateFieldType: () => ok(undefined) }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any spec.accept(visitor as any)._unsafeUnwrap(); }); }); diff --git a/packages/v2/core/src/domain/table/specs/field-updates/UpdateCheckboxDefaultValueSpec.ts b/packages/v2/core/src/domain/table/specs/field-updates/UpdateCheckboxDefaultValueSpec.ts index 9fde3edbe8..98b91f303b 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/UpdateCheckboxDefaultValueSpec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/UpdateCheckboxDefaultValueSpec.ts @@ -4,8 +4,8 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import { MutateOnlySpec } from '../../../shared/specification/MutateOnlySpec'; import type { FieldId } from '../../fields/FieldId'; -import { CheckboxField } from '../../fields/types/CheckboxField'; import type { CheckboxDefaultValue } from '../../fields/types/CheckboxDefaultValue'; +import { CheckboxField } from '../../fields/types/CheckboxField'; import type { Table } from '../../Table'; import type { ITableSpecVisitor } from '../ITableSpecVisitor'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/UpdateDateDefaultValueSpec.ts b/packages/v2/core/src/domain/table/specs/field-updates/UpdateDateDefaultValueSpec.ts index 9c2f419290..e0ccdb0186 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/UpdateDateDefaultValueSpec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/UpdateDateDefaultValueSpec.ts @@ -4,8 +4,8 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import { MutateOnlySpec } from '../../../shared/specification/MutateOnlySpec'; import type { FieldId } from '../../fields/FieldId'; -import { DateField } from '../../fields/types/DateField'; import type { DateDefaultValue } from '../../fields/types/DateDefaultValue'; +import { DateField } from '../../fields/types/DateField'; import type { Table } from '../../Table'; import type { ITableSpecVisitor } from '../ITableSpecVisitor'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/UpdateFormulaExpressionSpec.ts b/packages/v2/core/src/domain/table/specs/field-updates/UpdateFormulaExpressionSpec.ts index 25cfccfe9f..239030ff8b 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/UpdateFormulaExpressionSpec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/UpdateFormulaExpressionSpec.ts @@ -4,8 +4,8 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import { MutateOnlySpec } from '../../../shared/specification/MutateOnlySpec'; import type { FieldId } from '../../fields/FieldId'; -import { FormulaField } from '../../fields/types/FormulaField'; import type { FormulaExpression } from '../../fields/types/FormulaExpression'; +import { FormulaField } from '../../fields/types/FormulaField'; import { FieldValueTypeVisitor } from '../../fields/visitors/FieldValueTypeVisitor'; import type { Table } from '../../Table'; import type { ITableSpecVisitor } from '../ITableSpecVisitor'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/UpdateNumberDefaultValueSpec.ts b/packages/v2/core/src/domain/table/specs/field-updates/UpdateNumberDefaultValueSpec.ts index 74f6da0318..4b51e63130 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/UpdateNumberDefaultValueSpec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/UpdateNumberDefaultValueSpec.ts @@ -4,8 +4,8 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import { MutateOnlySpec } from '../../../shared/specification/MutateOnlySpec'; import type { FieldId } from '../../fields/FieldId'; -import { NumberField } from '../../fields/types/NumberField'; import type { NumberDefaultValue } from '../../fields/types/NumberDefaultValue'; +import { NumberField } from '../../fields/types/NumberField'; import type { Table } from '../../Table'; import type { ITableSpecVisitor } from '../ITableSpecVisitor'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/UpdateRatingColorSpec.ts b/packages/v2/core/src/domain/table/specs/field-updates/UpdateRatingColorSpec.ts index 934ea0b5de..f4ae52ce55 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/UpdateRatingColorSpec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/UpdateRatingColorSpec.ts @@ -4,8 +4,8 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import { MutateOnlySpec } from '../../../shared/specification/MutateOnlySpec'; import type { FieldId } from '../../fields/FieldId'; -import { RatingField } from '../../fields/types/RatingField'; import type { RatingColor } from '../../fields/types/RatingColor'; +import { RatingField } from '../../fields/types/RatingField'; import type { Table } from '../../Table'; import type { ITableSpecVisitor } from '../ITableSpecVisitor'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/UpdateRollupExpressionSpec.ts b/packages/v2/core/src/domain/table/specs/field-updates/UpdateRollupExpressionSpec.ts index 304b198aa7..06869f5ef1 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/UpdateRollupExpressionSpec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/UpdateRollupExpressionSpec.ts @@ -4,8 +4,8 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import { MutateOnlySpec } from '../../../shared/specification/MutateOnlySpec'; import type { FieldId } from '../../fields/FieldId'; -import { RollupField } from '../../fields/types/RollupField'; import type { RollupExpression } from '../../fields/types/RollupExpression'; +import { RollupField } from '../../fields/types/RollupField'; import type { Table } from '../../Table'; import type { ITableSpecVisitor } from '../ITableSpecVisitor'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/UpdateSingleSelectAutoNewOptionsSpec.ts b/packages/v2/core/src/domain/table/specs/field-updates/UpdateSingleSelectAutoNewOptionsSpec.ts index 31aacfcf05..77ca810e1e 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/UpdateSingleSelectAutoNewOptionsSpec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/UpdateSingleSelectAutoNewOptionsSpec.ts @@ -4,8 +4,8 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import { MutateOnlySpec } from '../../../shared/specification/MutateOnlySpec'; import type { FieldId } from '../../fields/FieldId'; -import { SingleSelectField } from '../../fields/types/SingleSelectField'; import type { SelectAutoNewOptions } from '../../fields/types/SelectAutoNewOptions'; +import { SingleSelectField } from '../../fields/types/SingleSelectField'; import type { Table } from '../../Table'; import type { ITableSpecVisitor } from '../ITableSpecVisitor'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/UpdateUserDefaultValueSpec.ts b/packages/v2/core/src/domain/table/specs/field-updates/UpdateUserDefaultValueSpec.ts index b10af83171..31fdbfb903 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/UpdateUserDefaultValueSpec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/UpdateUserDefaultValueSpec.ts @@ -4,8 +4,8 @@ import type { Result } from 'neverthrow'; import { domainError, type DomainError } from '../../../shared/DomainError'; import { MutateOnlySpec } from '../../../shared/specification/MutateOnlySpec'; import type { FieldId } from '../../fields/FieldId'; -import { UserField } from '../../fields/types/UserField'; import type { UserDefaultValue } from '../../fields/types/UserDefaultValue'; +import { UserField } from '../../fields/types/UserField'; import type { Table } from '../../Table'; import type { ITableSpecVisitor } from '../ITableSpecVisitor'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateLinkConfigSpec.spec.ts b/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateLinkConfigSpec.spec.ts index 857ee57372..4879b97798 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateLinkConfigSpec.spec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateLinkConfigSpec.spec.ts @@ -3,7 +3,7 @@ import { describe, expect, it } from 'vitest'; import { BaseId } from '../../../../base/BaseId'; import { FieldId } from '../../../fields/FieldId'; import { FieldName } from '../../../fields/FieldName'; -import { LinkField } from '../../../fields/types/LinkField'; +import type { LinkField } from '../../../fields/types/LinkField'; import { LinkFieldConfig } from '../../../fields/types/LinkFieldConfig'; import { LinkFieldMeta } from '../../../fields/types/LinkFieldMeta'; import { Table } from '../../../Table'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateMultipleSelectOptionsSpec.spec.ts b/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateMultipleSelectOptionsSpec.spec.ts index eca93486c4..da7041ea83 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateMultipleSelectOptionsSpec.spec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateMultipleSelectOptionsSpec.spec.ts @@ -1,8 +1,8 @@ import { ok } from 'neverthrow'; import { describe, expect, it } from 'vitest'; -import type { IDomainContext } from '../../../../shared/DomainContext'; import { BaseId } from '../../../../base/BaseId'; +import type { IDomainContext } from '../../../../shared/DomainContext'; import { DbFieldName } from '../../../fields/DbFieldName'; import { FieldId } from '../../../fields/FieldId'; import { FieldName } from '../../../fields/FieldName'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateRollupSpecs.spec.ts b/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateRollupSpecs.spec.ts index c7d0c1644a..4d4d8b66d2 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateRollupSpecs.spec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/__tests__/UpdateRollupSpecs.spec.ts @@ -10,9 +10,9 @@ import { DateTimeFormatting } from '../../../fields/types/DateTimeFormatting'; import { FieldHasError } from '../../../fields/types/FieldHasError'; import { NumberFormatting } from '../../../fields/types/NumberFormatting'; import { NumberShowAs } from '../../../fields/types/NumberShowAs'; -import { RollupField } from '../../../fields/types/RollupField'; -import { RollupFieldConfig } from '../../../fields/types/RollupFieldConfig'; import { RollupExpression } from '../../../fields/types/RollupExpression'; +import type { RollupField } from '../../../fields/types/RollupField'; +import { RollupFieldConfig } from '../../../fields/types/RollupFieldConfig'; import { SingleLineTextShowAs } from '../../../fields/types/SingleLineTextShowAs'; import { TimeZone } from '../../../fields/types/TimeZone'; import { Table } from '../../../Table'; diff --git a/packages/v2/core/src/domain/table/specs/field-updates/__tests__/field-update-value-specs.spec.ts b/packages/v2/core/src/domain/table/specs/field-updates/__tests__/field-update-value-specs.spec.ts index 04053e3f31..8dcc8cafcf 100644 --- a/packages/v2/core/src/domain/table/specs/field-updates/__tests__/field-update-value-specs.spec.ts +++ b/packages/v2/core/src/domain/table/specs/field-updates/__tests__/field-update-value-specs.spec.ts @@ -1,24 +1,28 @@ import { err, ok } from 'neverthrow'; import { describe, expect, it } from 'vitest'; +import * as FieldUpdateSpecs from '..'; import { BaseId } from '../../../../base/BaseId'; import { domainError } from '../../../../shared/DomainError'; import { DbFieldName } from '../../../fields/DbFieldName'; import { FieldId } from '../../../fields/FieldId'; import { FieldName } from '../../../fields/FieldName'; +import { ButtonLabel } from '../../../fields/types/ButtonLabel'; +import { ButtonMaxCount } from '../../../fields/types/ButtonMaxCount'; +import { ButtonWorkflow } from '../../../fields/types/ButtonWorkflow'; import { CellValueMultiplicity } from '../../../fields/types/CellValueMultiplicity'; import { CellValueType } from '../../../fields/types/CellValueType'; import { CheckboxDefaultValue } from '../../../fields/types/CheckboxDefaultValue'; import { DateDefaultValue } from '../../../fields/types/DateDefaultValue'; import { FieldColor } from '../../../fields/types/FieldColor'; import { FormulaExpression } from '../../../fields/types/FormulaExpression'; +import { NumberDefaultValue } from '../../../fields/types/NumberDefaultValue'; +import { NumberFormatting, NumberFormattingType } from '../../../fields/types/NumberFormatting'; import { MultiNumberDisplayType, NumberShowAs, SingleNumberDisplayType, } from '../../../fields/types/NumberShowAs'; -import { NumberDefaultValue } from '../../../fields/types/NumberDefaultValue'; -import { NumberFormatting, NumberFormattingType } from '../../../fields/types/NumberFormatting'; import { RatingColor } from '../../../fields/types/RatingColor'; import { RatingIcon } from '../../../fields/types/RatingIcon'; import { RatingMax } from '../../../fields/types/RatingMax'; @@ -27,15 +31,11 @@ import { SelectDefaultValue } from '../../../fields/types/SelectDefaultValue'; import { SelectOption } from '../../../fields/types/SelectOption'; import { TextDefaultValue } from '../../../fields/types/TextDefaultValue'; import { TimeZone } from '../../../fields/types/TimeZone'; -import { ButtonLabel } from '../../../fields/types/ButtonLabel'; -import { ButtonMaxCount } from '../../../fields/types/ButtonMaxCount'; -import { ButtonWorkflow } from '../../../fields/types/ButtonWorkflow'; import { UserDefaultValue } from '../../../fields/types/UserDefaultValue'; import { UserMultiplicity } from '../../../fields/types/UserMultiplicity'; import { UserNotification } from '../../../fields/types/UserNotification'; import { Table } from '../../../Table'; import { TableName } from '../../../TableName'; -import * as FieldUpdateSpecs from '..'; const createBaseId = (seed: string) => BaseId.create(`bse${seed.repeat(16)}`)._unsafeUnwrap(); const createFieldId = (seed: string) => FieldId.create(`fld${seed.repeat(16)}`)._unsafeUnwrap(); @@ -104,8 +104,11 @@ type Case = { name: string; buildTable: (fieldId: FieldId) => Table; buildWrongTypeTable: (fieldId: FieldId) => Table; + // eslint-disable-next-line @typescript-eslint/no-explicit-any makeSpec: (fieldId: FieldId) => any; + // eslint-disable-next-line @typescript-eslint/no-explicit-any assertSpec: (spec: any, fieldId: FieldId) => void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any assertUpdatedField: (field: any) => void; expectedVisit: string; }; @@ -337,6 +340,7 @@ const buildFormulaTableWithMissingResultType = ( } = {} ) => { const table = buildFormulaTable(fieldId, options); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const field = table.getField((current) => current.id().equals(fieldId))._unsafeUnwrap() as any; const missingResultType = err( domainError.validation({ message: 'Formula field result type not set' }) @@ -842,6 +846,7 @@ describe('Field update value specs', () => { const { calls, visitor } = createSpyVisitor(); assertSpec(spec, fieldId); + // eslint-disable-next-line @typescript-eslint/no-explicit-any spec.accept(visitor as any)._unsafeUnwrap(); expect(calls).toContain(expectedVisit); @@ -871,6 +876,7 @@ describe('Field update value specs', () => { const { calls, visitor } = createSpyVisitor(); assertSpec(spec, fieldId); + // eslint-disable-next-line @typescript-eslint/no-explicit-any spec.accept(visitor as any)._unsafeUnwrap(); expect(calls).toContain(expectedVisit); diff --git a/packages/v2/core/src/domain/table/views/OnTeableViewFieldDeleted.ts b/packages/v2/core/src/domain/table/views/OnTeableViewFieldDeleted.ts index 5ea3440ec0..83f6088ad7 100644 --- a/packages/v2/core/src/domain/table/views/OnTeableViewFieldDeleted.ts +++ b/packages/v2/core/src/domain/table/views/OnTeableViewFieldDeleted.ts @@ -1,8 +1,8 @@ import type { Result } from 'neverthrow'; import type { DomainError } from '../../shared/DomainError'; -import type { FieldId } from '../fields/FieldId'; import type { Field } from '../fields/Field'; +import type { FieldId } from '../fields/FieldId'; import type { FieldDeletionContext } from '../OnTeableFieldDeleted'; import type { ViewColumnMeta } from './ViewColumnMeta'; import type { ViewId } from './ViewId'; diff --git a/packages/v2/core/src/domain/table/views/View.ts b/packages/v2/core/src/domain/table/views/View.ts index da8fe47db2..3e855c56fe 100644 --- a/packages/v2/core/src/domain/table/views/View.ts +++ b/packages/v2/core/src/domain/table/views/View.ts @@ -6,8 +6,8 @@ import { domainError, type DomainError } from '../../shared/DomainError'; import { Entity } from '../../shared/Entity'; import type { Field } from '../fields/Field'; import type { FieldDeletionContext } from '../OnTeableFieldDeleted'; -import { ViewColumnMeta } from './ViewColumnMeta'; import type { OnTeableViewFieldDeleted, ViewFieldDeletionUpdate } from './OnTeableViewFieldDeleted'; +import { ViewColumnMeta } from './ViewColumnMeta'; import type { ViewId } from './ViewId'; import type { ViewName } from './ViewName'; import type { ViewQueryDefaults } from './ViewQueryDefaults'; diff --git a/packages/v2/core/src/domain/table/views/ViewFieldDeletion.spec.ts b/packages/v2/core/src/domain/table/views/ViewFieldDeletion.spec.ts index 1f1beb4347..6cc11216a0 100644 --- a/packages/v2/core/src/domain/table/views/ViewFieldDeletion.spec.ts +++ b/packages/v2/core/src/domain/table/views/ViewFieldDeletion.spec.ts @@ -1,12 +1,12 @@ import { describe, expect, it } from 'vitest'; import { BaseId } from '../../base/BaseId'; -import { Table } from '../Table'; -import { TableId } from '../TableId'; -import { TableName } from '../TableName'; import { FieldId } from '../fields/FieldId'; import { FieldName } from '../fields/FieldName'; import { SingleLineTextField } from '../fields/types/SingleLineTextField'; +import { Table } from '../Table'; +import { TableId } from '../TableId'; +import { TableName } from '../TableName'; import { GridView } from './types/GridView'; import { ViewColumnMeta } from './ViewColumnMeta'; import { ViewId } from './ViewId'; diff --git a/packages/v2/core/src/ports/CommandBus.typecheck.ts b/packages/v2/core/src/ports/CommandBus.typecheck.ts index 22ca1b4f77..bc78e08939 100644 --- a/packages/v2/core/src/ports/CommandBus.typecheck.ts +++ b/packages/v2/core/src/ports/CommandBus.typecheck.ts @@ -1,7 +1,7 @@ -import type { IExecutionContext } from './ExecutionContext'; -import type { ICommandBus, IInternalCommandBus } from './CommandBus'; import type { CreateBaseCommand } from '../commands/CreateBaseCommand'; import type { PropagateUserRenameCommand } from '../commands/PropagateUserRenameCommand'; +import type { ICommandBus, IInternalCommandBus } from './CommandBus'; +import type { IExecutionContext } from './ExecutionContext'; declare const context: IExecutionContext; declare const publicBus: ICommandBus; diff --git a/packages/v2/core/src/ports/RecordWritePlugin.ts b/packages/v2/core/src/ports/RecordWritePlugin.ts index 50a4dec3e5..3112a7e90f 100644 --- a/packages/v2/core/src/ports/RecordWritePlugin.ts +++ b/packages/v2/core/src/ports/RecordWritePlugin.ts @@ -7,8 +7,8 @@ import type { FieldId } from '../domain/table/fields/FieldId'; import type { FieldKeyType } from '../domain/table/fields/FieldKeyType'; import type { RecordId } from '../domain/table/records/RecordId'; import type { RecordInsertOrder } from '../domain/table/records/RecordInsertOrder'; -import type { TableRecord } from '../domain/table/records/TableRecord'; import type { ITableRecordConditionSpecVisitor } from '../domain/table/records/specs/ITableRecordConditionSpecVisitor'; +import type { TableRecord } from '../domain/table/records/TableRecord'; import type { Table } from '../domain/table/Table'; import type { IExecutionContext } from './ExecutionContext'; import type { SourceColumnMap } from './import/IImportSource'; diff --git a/packages/v2/core/src/ports/defaults/NoopPorts.spec.ts b/packages/v2/core/src/ports/defaults/NoopPorts.spec.ts index 202dd5a349..58fbb35f07 100644 --- a/packages/v2/core/src/ports/defaults/NoopPorts.spec.ts +++ b/packages/v2/core/src/ports/defaults/NoopPorts.spec.ts @@ -13,9 +13,8 @@ import type { ITableSpecVisitor } from '../../domain/table/specs/ITableSpecVisit import { Table } from '../../domain/table/Table'; import { TableId } from '../../domain/table/TableId'; import { TableName } from '../../domain/table/TableName'; -import { createUndoRedoCommand } from '../UndoRedoStore'; - import { RealtimeDocId } from '../RealtimeDocId'; +import { createUndoRedoCommand } from '../UndoRedoStore'; import { NoopEventBus } from './NoopEventBus'; import { NoopLogger } from './NoopLogger'; diff --git a/packages/v2/core/src/queries/GetTableByIdHandler.spec.ts b/packages/v2/core/src/queries/GetTableByIdHandler.spec.ts index 781588a70d..77b1f367d3 100644 --- a/packages/v2/core/src/queries/GetTableByIdHandler.spec.ts +++ b/packages/v2/core/src/queries/GetTableByIdHandler.spec.ts @@ -74,6 +74,7 @@ describe('GetTableByIdHandler', () => { find: async () => err(domainError.unexpected({ message: 'lookup failed' })), updateOne: async () => err(domainError.unexpected({ message: 'update failed' })), delete: async () => err(domainError.unexpected({ message: 'delete failed' })), + restore: async () => err(domainError.unexpected({ message: 'restore failed' })), }; const queryResult = GetTableByIdQuery.create({ diff --git a/packages/v2/core/src/queries/ListTableRecordsHandler.spec.ts b/packages/v2/core/src/queries/ListTableRecordsHandler.spec.ts index a95d50c9df..c2a7719f98 100644 --- a/packages/v2/core/src/queries/ListTableRecordsHandler.spec.ts +++ b/packages/v2/core/src/queries/ListTableRecordsHandler.spec.ts @@ -119,7 +119,9 @@ describe('ListTableRecordsHandler', () => { return ok({ records, total: 1 }); }, findOne: async () => err(domainError.notFound({ message: 'Not found' })), - async *findStream() {}, + async *findStream() { + /* noop */ + }, }; const queryResult = ListTableRecordsQuery.create({ @@ -149,7 +151,9 @@ describe('ListTableRecordsHandler', () => { return ok({ records: [], total: 0 }); }, findOne: async () => err(domainError.notFound({ message: 'Not found' })), - async *findStream() {}, + async *findStream() { + /* noop */ + }, }; const queryResult = ListTableRecordsQuery.create({ @@ -182,7 +186,9 @@ describe('ListTableRecordsHandler', () => { return ok({ records: [], total: 0 }); }, findOne: async () => err(domainError.notFound({ message: 'Not found' })), - async *findStream() {}, + async *findStream() { + /* noop */ + }, }; const queryResult = ListTableRecordsQuery.create({ @@ -218,12 +224,15 @@ describe('ListTableRecordsHandler', () => { updateOne: async (_context, _table, _spec) => err(domainError.notFound({ message: 'Not found' })), delete: async (_context, _table) => err(domainError.notFound({ message: 'Not found' })), + restore: async () => ok(undefined), }; const recordQueryRepo: ITableRecordQueryRepository = { find: async () => ok({ records: [], total: 0 }), findOne: async () => err(domainError.notFound({ message: 'Not found' })), - async *findStream() {}, + async *findStream() { + /* noop */ + }, }; const queryResult = ListTableRecordsQuery.create({ @@ -242,7 +251,9 @@ describe('ListTableRecordsHandler', () => { const recordQueryRepo: ITableRecordQueryRepository = { find: async () => ok({ records: [], total: 0 }), findOne: async () => err(domainError.notFound({ message: 'Not found' })), - async *findStream() {}, + async *findStream() { + /* noop */ + }, }; const queryResult = ListTableRecordsQuery.create({ @@ -266,7 +277,9 @@ describe('ListTableRecordsHandler', () => { const recordQueryRepo: ITableRecordQueryRepository = { find: async () => err(domainError.unexpected({ message: 'query failed' })), findOne: async () => err(domainError.notFound({ message: 'Not found' })), - async *findStream() {}, + async *findStream() { + /* noop */ + }, }; const queryResult = ListTableRecordsQuery.create({ @@ -294,7 +307,9 @@ describe('ListTableRecordsHandler', () => { return ok({ records: [], total: 0 }); }, findOne: async () => err(domainError.notFound({ message: 'Not found' })), - async *findStream() {}, + async *findStream() { + /* noop */ + }, }; const queryResult = ListTableRecordsQuery.create({ @@ -352,7 +367,9 @@ describe('ListTableRecordsHandler', () => { }, }); }, - async *findStream() {}, + async *findStream() { + /* noop */ + }, }; const queryResult = ListTableRecordsQuery.create({ @@ -397,7 +414,9 @@ describe('ListTableRecordsHandler', () => { return ok({ records: [], total: 0 }); }, findOne: async () => err(domainError.notFound({ message: 'Not found' })), - async *findStream() {}, + async *findStream() { + /* noop */ + }, }; const queryResult = ListTableRecordsQuery.create({ diff --git a/packages/v2/core/src/queries/ListTableRecordsHandler.ts b/packages/v2/core/src/queries/ListTableRecordsHandler.ts index c6e22c22c1..dfe9ce42be 100644 --- a/packages/v2/core/src/queries/ListTableRecordsHandler.ts +++ b/packages/v2/core/src/queries/ListTableRecordsHandler.ts @@ -5,20 +5,20 @@ import type { Result } from 'neverthrow'; import { FieldKeyResolverService } from '../application/services/FieldKeyResolverService'; import { mergeOrderBy, resolveOrderBy as resolveQueryOrderBy } from '../commands/shared/orderBy'; import { domainError, isNotFoundError, type DomainError } from '../domain/shared/DomainError'; +import { type ISpecification } from '../domain/shared/specification/ISpecification'; import { FieldId } from '../domain/table/fields/FieldId'; import { FieldKeyType } from '../domain/table/fields/FieldKeyType'; import type { LinkField } from '../domain/table/fields/types/LinkField'; +import { RecordId } from '../domain/table/records/RecordId'; import { IncomingLinkCandidateSpec } from '../domain/table/records/specs/IncomingLinkCandidateSpec'; import { IncomingLinkSelectedSpec } from '../domain/table/records/specs/IncomingLinkSelectedSpec'; +import type { ITableRecordConditionSpecVisitor } from '../domain/table/records/specs/ITableRecordConditionSpecVisitor'; import { RecordByIdsSpec } from '../domain/table/records/specs/RecordByIdsSpec'; import { RecordConditionSpecBuilder } from '../domain/table/records/specs/RecordConditionSpecBuilder'; -import type { ITableRecordConditionSpecVisitor } from '../domain/table/records/specs/ITableRecordConditionSpecVisitor'; -import { RecordId } from '../domain/table/records/RecordId'; import type { TableRecord } from '../domain/table/records/TableRecord'; -import { TableByIncomingReferenceToTableSpec } from '../domain/table/specs/TableByIncomingReferenceToTableSpec'; import { TableByIdSpec } from '../domain/table/specs/TableByIdSpec'; +import { TableByIncomingReferenceToTableSpec } from '../domain/table/specs/TableByIncomingReferenceToTableSpec'; import type { Table } from '../domain/table/Table'; -import { type ISpecification } from '../domain/shared/specification/ISpecification'; import type { IExecutionContext } from '../ports/ExecutionContext'; import * as LoggerPort from '../ports/Logger'; import * as TableRecordQueryRepositoryPort from '../ports/TableRecordQueryRepository'; @@ -27,7 +27,6 @@ import * as TableRepositoryPort from '../ports/TableRepository'; import { v2CoreTokens } from '../ports/tokens'; import { ListTableRecordsQuery, type RecordSortValue } from './ListTableRecordsQuery'; import { QueryHandler, type IQueryHandler } from './QueryHandler'; -import { RecordSearch, resolveVisibleRowSearch } from './RecordSearch'; import { isRecordFilterCondition, isRecordFilterFieldReferenceValue, @@ -38,6 +37,7 @@ import { type RecordFilterNode, } from './RecordFilterDto'; import { buildRecordConditionSpec } from './RecordFilterMapper'; +import { RecordSearch, resolveVisibleRowSearch } from './RecordSearch'; export class ListTableRecordsResult { private constructor( diff --git a/packages/v2/core/src/queries/ListTableRecordsQuery.ts b/packages/v2/core/src/queries/ListTableRecordsQuery.ts index dd595c8695..17df67562e 100644 --- a/packages/v2/core/src/queries/ListTableRecordsQuery.ts +++ b/packages/v2/core/src/queries/ListTableRecordsQuery.ts @@ -8,8 +8,8 @@ import { PageLimit } from '../domain/shared/pagination/PageLimit'; import { PageOffset } from '../domain/shared/pagination/PageOffset'; import { type FieldKeyType, fieldKeyTypeSchema } from '../domain/table/fields/FieldKeyType'; import { TableId } from '../domain/table/TableId'; -import { recordSearchInputSchema, type RecordSearchInput } from './RecordSearch'; import { recordFilterSchema, type RecordFilter } from './RecordFilterDto'; +import { recordSearchInputSchema, type RecordSearchInput } from './RecordSearch'; /** Default page size for records */ export const DEFAULT_RECORDS_LIMIT = 100; diff --git a/packages/v2/core/src/queries/ListTablesHandler.spec.ts b/packages/v2/core/src/queries/ListTablesHandler.spec.ts index c604cff88b..4a36a43ef2 100644 --- a/packages/v2/core/src/queries/ListTablesHandler.spec.ts +++ b/packages/v2/core/src/queries/ListTablesHandler.spec.ts @@ -90,6 +90,7 @@ describe('ListTablesHandler', () => { updateOne: async (_context, _table, _mutateSpec) => err(domainError.unexpected({ message: 'nope' })), delete: async () => err(domainError.unexpected({ message: 'nope' })), + restore: async () => err(domainError.unexpected({ message: 'nope' })), }; const handler = new ListTablesHandler(repo); diff --git a/packages/v2/core/src/queries/__tests__/GetRecordByIdHandler.spec.ts b/packages/v2/core/src/queries/__tests__/GetRecordByIdHandler.spec.ts index 4ba7bbce70..397031bdc7 100644 --- a/packages/v2/core/src/queries/__tests__/GetRecordByIdHandler.spec.ts +++ b/packages/v2/core/src/queries/__tests__/GetRecordByIdHandler.spec.ts @@ -12,8 +12,8 @@ import { TableName } from '../../domain/table/TableName'; import { NoopLogger } from '../../ports/defaults/NoopLogger'; import type { IExecutionContext } from '../../ports/ExecutionContext'; import { MemoryTableRepository } from '../../ports/memory/MemoryTableRepository'; -import type { ITableRepository } from '../../ports/TableRepository'; import type { ITableRecordQueryRepository } from '../../ports/TableRecordQueryRepository'; +import type { ITableRepository } from '../../ports/TableRepository'; import { GetRecordByIdHandler } from '../GetRecordByIdHandler'; import { GetRecordByIdQuery } from '../GetRecordByIdQuery'; @@ -34,10 +34,13 @@ const buildTable = (baseIdSeed: string, tableIdSeed: string, name: string) => { return builder.build()._unsafeUnwrap(); }; +// eslint-disable-next-line @typescript-eslint/no-explicit-any const createMockRecordQueryRepo = (findOneResult: any): ITableRecordQueryRepository => ({ find: async () => ok({ records: [], total: 0 }), findOne: async () => findOneResult, - async *findStream() {}, + async *findStream() { + /* noop */ + }, }); describe('GetRecordByIdHandler', () => { @@ -107,6 +110,7 @@ describe('GetRecordByIdHandler', () => { find: async () => err(domainError.unexpected({ message: 'lookup failed' })), updateOne: async () => err(domainError.unexpected({ message: 'update failed' })), delete: async () => err(domainError.unexpected({ message: 'delete failed' })), + restore: async () => err(domainError.unexpected({ message: 'restore failed' })), }; const mockRecordQueryRepo = createMockRecordQueryRepo(ok(null)); diff --git a/packages/v2/core/src/schemas/field/common.schema.ts b/packages/v2/core/src/schemas/field/common.schema.ts index 3042c91ab2..847714c831 100644 --- a/packages/v2/core/src/schemas/field/common.schema.ts +++ b/packages/v2/core/src/schemas/field/common.schema.ts @@ -2,6 +2,7 @@ import { z } from 'zod'; import { TimeFormatting } from '../../domain/table/fields/types/DateTimeFormatting'; import { fieldColorSchema } from '../../domain/table/fields/types/FieldColor'; +import { longTextShowAsValues } from '../../domain/table/fields/types/LongTextShowAs'; import { NumberFormattingType } from '../../domain/table/fields/types/NumberFormatting'; import { MultiNumberDisplayType, @@ -9,7 +10,6 @@ import { } from '../../domain/table/fields/types/NumberShowAs'; import { ratingColorValues } from '../../domain/table/fields/types/RatingColor'; import { ratingIconValues } from '../../domain/table/fields/types/RatingIcon'; -import { longTextShowAsValues } from '../../domain/table/fields/types/LongTextShowAs'; import { singleLineTextShowAsValues } from '../../domain/table/fields/types/SingleLineTextShowAs'; import { TIME_ZONE_LIST } from '../../domain/table/fields/types/TimeZone'; diff --git a/packages/v2/core/tsconfig.eslint.json b/packages/v2/core/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/core/tsconfig.eslint.json +++ b/packages/v2/core/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/core/tsconfig.typecheck.json b/packages/v2/core/tsconfig.typecheck.json new file mode 100644 index 0000000000..8509b064f5 --- /dev/null +++ b/packages/v2/core/tsconfig.typecheck.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/debug-data/package.json b/packages/v2/debug-data/package.json index a94aa9de50..4d5b7a2804 100644 --- a/packages/v2/debug-data/package.json +++ b/packages/v2/debug-data/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-debug-data.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" }, "dependencies": { diff --git a/packages/v2/debug-data/src/adapters/postgres/PostgresDebugRecordStore.ts b/packages/v2/debug-data/src/adapters/postgres/PostgresDebugRecordStore.ts index e91dc48133..13d0c35bfa 100644 --- a/packages/v2/debug-data/src/adapters/postgres/PostgresDebugRecordStore.ts +++ b/packages/v2/debug-data/src/adapters/postgres/PostgresDebugRecordStore.ts @@ -5,9 +5,9 @@ import type { V1TeableDatabase } from '@teable/v2-postgres-schema'; import { Kysely, sql } from 'kysely'; import { err, ok } from 'neverthrow'; +import { v2DebugDataTokens } from '../../di/tokens'; import type { IDebugMetaStore } from '../../ports/DebugMetaStore'; import type { IDebugRecordStore } from '../../ports/DebugRecordStore'; -import { v2DebugDataTokens } from '../../di/tokens'; import type { DebugRawRecord, DebugRawRecordQueryOptions, diff --git a/packages/v2/debug-data/tsconfig.eslint.json b/packages/v2/debug-data/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/debug-data/tsconfig.eslint.json +++ b/packages/v2/debug-data/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/debug-data/tsconfig.typecheck.json b/packages/v2/debug-data/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/debug-data/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/devtools/package.json b/packages/v2/devtools/package.json index 986651607c..f374c67616 100644 --- a/packages/v2/devtools/package.json +++ b/packages/v2/devtools/package.json @@ -30,7 +30,7 @@ "cli": "NODE_NO_WARNINGS=1 tsx bin/run.ts", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-devtools.eslintcache", - "typecheck": "NODE_NO_WARNINGS=1 tsc --project ./tsconfig.json --noEmit", + "typecheck": "NODE_NO_WARNINGS=1 tsc --project ./tsconfig.typecheck.json --noEmit", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" }, "dependencies": { diff --git a/packages/v2/devtools/src/commands/computed/replay.ts b/packages/v2/devtools/src/commands/computed/replay.ts index 1bf9ebb530..1833bb070e 100644 --- a/packages/v2/devtools/src/commands/computed/replay.ts +++ b/packages/v2/devtools/src/commands/computed/replay.ts @@ -1,8 +1,8 @@ import { Command, Options } from '@effect/cli'; import type { Option } from 'effect'; import { Effect } from 'effect'; -import { Output } from '../../services/Output'; import { ComputedTaskInspector } from '../../services/ComputedTaskInspector'; +import { Output } from '../../services/Output'; import { asCsvTable, writeTableCsv } from '../../utils'; import { baseIdsOption, diff --git a/packages/v2/devtools/src/commands/computed/summary.ts b/packages/v2/devtools/src/commands/computed/summary.ts index 563a906479..0d8803cda4 100644 --- a/packages/v2/devtools/src/commands/computed/summary.ts +++ b/packages/v2/devtools/src/commands/computed/summary.ts @@ -1,8 +1,8 @@ import { Command, Options } from '@effect/cli'; import type { Option } from 'effect'; import { Effect } from 'effect'; -import { Output } from '../../services/Output'; import { ComputedTaskInspector } from '../../services/ComputedTaskInspector'; +import { Output } from '../../services/Output'; import { asCsvTable, writeTableCsv } from '../../utils'; import { baseIdsOption, diff --git a/packages/v2/devtools/src/commands/computed/task.ts b/packages/v2/devtools/src/commands/computed/task.ts index bc43984e35..fb82d41cff 100644 --- a/packages/v2/devtools/src/commands/computed/task.ts +++ b/packages/v2/devtools/src/commands/computed/task.ts @@ -1,9 +1,9 @@ import { Command, Options } from '@effect/cli'; import type { Option } from 'effect'; import { Effect } from 'effect'; -import { Output } from '../../services/Output'; import type { ComputedTaskRow } from '../../services/ComputedTaskInspector'; import { ComputedTaskInspector } from '../../services/ComputedTaskInspector'; +import { Output } from '../../services/Output'; import { asCsvTable, writeTableCsv } from '../../utils'; import { connectionOption, csvPathOption, optionToUndefined, staleHoursOption } from '../shared'; diff --git a/packages/v2/devtools/src/commands/computed/tasks.ts b/packages/v2/devtools/src/commands/computed/tasks.ts index 830f503eaa..f7bc9cdfcf 100644 --- a/packages/v2/devtools/src/commands/computed/tasks.ts +++ b/packages/v2/devtools/src/commands/computed/tasks.ts @@ -2,11 +2,12 @@ import { Command, Options } from '@effect/cli'; import type { Option } from 'effect'; import { Effect } from 'effect'; import { CliError } from '../../errors/CliError'; -import { Output } from '../../services/Output'; import { ComputedTaskInspector, type ComputedTaskStatus, } from '../../services/ComputedTaskInspector'; +import { Output } from '../../services/Output'; +import { asCsvTable, writeTableCsv } from '../../utils'; import { baseIdsOption, csvPathOption, @@ -21,7 +22,6 @@ import { updatedFromOption, updatedToOption, } from '../shared'; -import { asCsvTable, writeTableCsv } from '../../utils'; const statusesOption = Options.text('statuses').pipe( Options.withDescription('Comma-separated statuses: pending,processing,dead'), diff --git a/packages/v2/devtools/src/commands/explain/create-field.ts b/packages/v2/devtools/src/commands/explain/create-field.ts index 76182c67b9..32089aeff9 100644 --- a/packages/v2/devtools/src/commands/explain/create-field.ts +++ b/packages/v2/devtools/src/commands/explain/create-field.ts @@ -1,6 +1,6 @@ import { Command, Options } from '@effect/cli'; -import { Effect, Option } from 'effect'; import type { ICreateFieldCommandInput } from '@teable/v2-core'; +import { Effect, Option } from 'effect'; import { ValidationError } from '../../errors/CliError'; import { CommandExplain } from '../../services/CommandExplain'; import { Output } from '../../services/Output'; diff --git a/packages/v2/devtools/src/commands/explain/paste.ts b/packages/v2/devtools/src/commands/explain/paste.ts index 37bde3757c..150efd09e6 100644 --- a/packages/v2/devtools/src/commands/explain/paste.ts +++ b/packages/v2/devtools/src/commands/explain/paste.ts @@ -1,6 +1,6 @@ import { Command, Options } from '@effect/cli'; -import { Effect, Option } from 'effect'; import type { PasteSort, RangeType, RecordFilter, SourceFieldMeta } from '@teable/v2-core'; +import { Effect, Option } from 'effect'; import { ValidationError } from '../../errors/CliError'; import { CommandExplain } from '../../services/CommandExplain'; import { Output } from '../../services/Output'; @@ -125,14 +125,14 @@ const handler = (args: { .explainPaste({ tableId: args.tableId, viewId: args.viewId, - ranges, - content, + ranges: ranges ? [...ranges.map((r) => [...r] as [number, number])] : ranges, + content: content as string | unknown[][], type, filter, updateFilter, - sourceFields, - projection, - sort, + sourceFields: sourceFields ? [...sourceFields] : sourceFields, + projection: projection ? [...projection] : projection, + sort: sort ? [...sort] : sort, typecast: args.typecast, analyze: args.analyze, }) diff --git a/packages/v2/devtools/src/commands/explain/update-field.ts b/packages/v2/devtools/src/commands/explain/update-field.ts index a01a6dfb79..335bdc9a36 100644 --- a/packages/v2/devtools/src/commands/explain/update-field.ts +++ b/packages/v2/devtools/src/commands/explain/update-field.ts @@ -1,6 +1,7 @@ import { Command, Options } from '@effect/cli'; -import { Effect, Option } from 'effect'; import type { IFieldUpdateInput } from '@teable/v2-core'; +import type { Option } from 'effect'; +import { Effect } from 'effect'; import { ValidationError } from '../../errors/CliError'; import { CommandExplain } from '../../services/CommandExplain'; import { Output } from '../../services/Output'; diff --git a/packages/v2/devtools/src/layers/ComputedTaskControlLive.ts b/packages/v2/devtools/src/layers/ComputedTaskControlLive.ts index a0a976b8d4..1ed5ee3080 100644 --- a/packages/v2/devtools/src/layers/ComputedTaskControlLive.ts +++ b/packages/v2/devtools/src/layers/ComputedTaskControlLive.ts @@ -1,16 +1,16 @@ -import { ActorId, type IInternalCommandBus, v2CoreTokens } from '@teable/v2-core'; import { RunComputedTaskByIdCommand, type RunComputedTaskByIdResult, } from '@teable/v2-adapter-table-repository-postgres'; +import { ActorId, type IInternalCommandBus, v2CoreTokens } from '@teable/v2-core'; import { Effect, Layer } from 'effect'; import { CliError } from '../errors/CliError'; -import { Database } from '../services/Database'; import { ComputedTaskControl, type RunComputedTaskByIdInput, type RunComputedTaskByIdOutput, } from '../services/ComputedTaskControl'; +import { Database } from '../services/Database'; const createContext = () => { const actorIdResult = ActorId.create('cli-computed-task'); diff --git a/packages/v2/devtools/src/layers/ComputedTaskInspectorLive.ts b/packages/v2/devtools/src/layers/ComputedTaskInspectorLive.ts index c10298fb21..ded8485add 100644 --- a/packages/v2/devtools/src/layers/ComputedTaskInspectorLive.ts +++ b/packages/v2/devtools/src/layers/ComputedTaskInspectorLive.ts @@ -1,15 +1,14 @@ -import { ActorId, type IInternalCommandBus, v2CoreTokens } from '@teable/v2-core'; import { RunComputedTaskByIdCommand, type RunComputedTaskByIdResult, v2RecordRepositoryPostgresTokens, } from '@teable/v2-adapter-table-repository-postgres'; +import { ActorId, type IInternalCommandBus, v2CoreTokens } from '@teable/v2-core'; import type { V1TeableDatabase } from '@teable/v2-postgres-schema'; import { Effect, Layer } from 'effect'; import type { Kysely, SelectQueryBuilder } from 'kysely'; import { sql } from 'kysely'; import { CliError } from '../errors/CliError'; -import { Database } from '../services/Database'; import { ComputedTaskInspector, type CliTable, @@ -30,6 +29,7 @@ import { type TaskEdgeModeRow, type TaskTargetRow, } from '../services/ComputedTaskInspector'; +import { Database } from '../services/Database'; type RawTaskRow = { id: string; @@ -821,6 +821,7 @@ export const ComputedTaskInspectorLive = Layer.effect( const start = Date.now(); const context = createContext(); + // eslint-disable-next-line no-constant-condition while (true) { if (limit !== null && processed >= limit) break; diff --git a/packages/v2/devtools/tsconfig.eslint.json b/packages/v2/devtools/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/devtools/tsconfig.eslint.json +++ b/packages/v2/devtools/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/devtools/tsconfig.typecheck.json b/packages/v2/devtools/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/devtools/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/di/tsconfig.eslint.json b/packages/v2/di/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/di/tsconfig.eslint.json +++ b/packages/v2/di/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/dottea/package.json b/packages/v2/dottea/package.json index bd63e4a07f..50bde059ec 100644 --- a/packages/v2/dottea/package.json +++ b/packages/v2/dottea/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-dottea.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" }, "dependencies": { diff --git a/packages/v2/dottea/src/index.ts b/packages/v2/dottea/src/index.ts index 55ced87fa6..a6ac6c9845 100644 --- a/packages/v2/dottea/src/index.ts +++ b/packages/v2/dottea/src/index.ts @@ -8,12 +8,12 @@ import { type IDotTeaParser, type NormalizedDotTeaStructure, } from '@teable/v2-core'; -import { normalizeField } from './normalizer'; import { injectable } from '@teable/v2-di'; import { err, ok } from 'neverthrow'; import type { Result } from 'neverthrow'; import unzipper from 'unzipper'; import { z } from 'zod'; +import { normalizeField } from './normalizer'; const dotTeaFieldSchema = z .object({ diff --git a/packages/v2/dottea/src/normalizer/DotTeaFieldNormalizer.ts b/packages/v2/dottea/src/normalizer/DotTeaFieldNormalizer.ts index 80bfd74a9e..dd292bbb47 100644 --- a/packages/v2/dottea/src/normalizer/DotTeaFieldNormalizer.ts +++ b/packages/v2/dottea/src/normalizer/DotTeaFieldNormalizer.ts @@ -114,6 +114,7 @@ type NormalizedFieldOptions = { export const normalizeFieldOptions = ( field: DotTeaFieldInput, fieldTypesById: ReadonlyMap + // eslint-disable-next-line sonarjs/cognitive-complexity ): NormalizedFieldOptions => { const rawOptions = asRecord(field.options); const rawLookupOptions = asRecord(field.lookupOptions); diff --git a/packages/v2/dottea/tsconfig.eslint.json b/packages/v2/dottea/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/dottea/tsconfig.eslint.json +++ b/packages/v2/dottea/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/dottea/tsconfig.typecheck.json b/packages/v2/dottea/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/dottea/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/e2e/package.json b/packages/v2/e2e/package.json index 2f7887c43c..2d26afc37f 100644 --- a/packages/v2/e2e/package.json +++ b/packages/v2/e2e/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-e2e.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-e2e": "vitest run --silent", "test-unit": "pnpm test-e2e", "test-unit-cover": "vitest run --silent --coverage", diff --git a/packages/v2/e2e/src/computed-matrix/shared/index.ts b/packages/v2/e2e/src/computed-matrix/shared/index.ts index f89217832e..7a32af0256 100644 --- a/packages/v2/e2e/src/computed-matrix/shared/index.ts +++ b/packages/v2/e2e/src/computed-matrix/shared/index.ts @@ -2,7 +2,9 @@ * Shared exports for computed matrix tests */ +// eslint-disable-next-line import/export export * from './types'; export * from './generators'; export * from './validators'; +// eslint-disable-next-line import/export export * from './setup'; diff --git a/packages/v2/e2e/src/create-field/singleLineText/singleLineText.spec.ts b/packages/v2/e2e/src/create-field/singleLineText/singleLineText.spec.ts index c80cedd61e..7ab258ff1d 100644 --- a/packages/v2/e2e/src/create-field/singleLineText/singleLineText.spec.ts +++ b/packages/v2/e2e/src/create-field/singleLineText/singleLineText.spec.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { beforeAll, describe, expect, test } from 'vitest'; import { createFieldErrorResponseSchema } from '@teable/v2-contract-http'; +import { beforeAll, describe, expect, test } from 'vitest'; import { getSharedTestContext, type SharedTestContext } from '../../shared/globalTestContext'; describe('create-field: singleLineText v1 parity', () => { diff --git a/packages/v2/e2e/src/field-condition-isSymbol.e2e.spec.ts b/packages/v2/e2e/src/field-condition-isSymbol.e2e.spec.ts index e5caf10f31..6cb327a905 100644 --- a/packages/v2/e2e/src/field-condition-isSymbol.e2e.spec.ts +++ b/packages/v2/e2e/src/field-condition-isSymbol.e2e.spec.ts @@ -135,6 +135,7 @@ describe('v2 isSymbol preservation (e2e)', () => { expect(getResponse.body.ok).toBe(true); const refetchedTable = getResponse.body.data.table; + // eslint-disable-next-line @typescript-eslint/no-explicit-any const refetchedField = refetchedTable.fields.find((f: any) => f.id === lookupFieldId); const refetchedCondition = refetchedField?.conditionalLookupOptions?.condition; const refetchedFilterSet = refetchedCondition?.filter?.filterSet; diff --git a/packages/v2/e2e/src/field-conversion-deadlock.e2e.spec.ts b/packages/v2/e2e/src/field-conversion-deadlock.e2e.spec.ts index b0ce8caf38..8dc2cc40fb 100644 --- a/packages/v2/e2e/src/field-conversion-deadlock.e2e.spec.ts +++ b/packages/v2/e2e/src/field-conversion-deadlock.e2e.spec.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { beforeAll, describe, expect, it } from 'vitest'; import { sql } from 'kysely'; +import { beforeAll, describe, expect, it } from 'vitest'; import { getSharedTestContext, type SharedTestContext } from './shared/globalTestContext'; diff --git a/packages/v2/e2e/src/field-explain.e2e.spec.ts b/packages/v2/e2e/src/field-explain.e2e.spec.ts index ba54f9681a..49e79fe83a 100644 --- a/packages/v2/e2e/src/field-explain.e2e.spec.ts +++ b/packages/v2/e2e/src/field-explain.e2e.spec.ts @@ -1,6 +1,6 @@ import { randomUUID } from 'node:crypto'; -import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { explainOkResponseSchema } from '@teable/v2-contract-http'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { getSharedTestContext, type SharedTestContext } from './shared/globalTestContext'; diff --git a/packages/v2/e2e/src/reorderRecordsUndoRedo.e2e.spec.ts b/packages/v2/e2e/src/reorderRecordsUndoRedo.e2e.spec.ts index f3350cce05..b44947663f 100644 --- a/packages/v2/e2e/src/reorderRecordsUndoRedo.e2e.spec.ts +++ b/packages/v2/e2e/src/reorderRecordsUndoRedo.e2e.spec.ts @@ -6,6 +6,7 @@ import { UndoCommand, v2CoreTokens, } from '@teable/v2-core'; +import { sql } from 'kysely'; import { beforeAll, describe, expect, it } from 'vitest'; import { @@ -13,7 +14,6 @@ import { TEST_USER, type SharedTestContext, } from './shared/globalTestContext'; -import { sql } from 'kysely'; const WINDOW_ID = 'e2e-reorder-window'; diff --git a/packages/v2/e2e/src/shared/globalTestContext.ts b/packages/v2/e2e/src/shared/globalTestContext.ts index afb94044e3..94c6d42360 100644 --- a/packages/v2/e2e/src/shared/globalTestContext.ts +++ b/packages/v2/e2e/src/shared/globalTestContext.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck /* eslint-disable @typescript-eslint/naming-convention */ /** * Global shared test context for E2E tests. diff --git a/packages/v2/e2e/src/undo-redo/shared/undoRedoE2eTestKit.ts b/packages/v2/e2e/src/undo-redo/shared/undoRedoE2eTestKit.ts index 65b936925c..8da9da4150 100644 --- a/packages/v2/e2e/src/undo-redo/shared/undoRedoE2eTestKit.ts +++ b/packages/v2/e2e/src/undo-redo/shared/undoRedoE2eTestKit.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck /* eslint-disable @typescript-eslint/naming-convention */ import { ActorId, diff --git a/packages/v2/e2e/src/update-field/checkbox/conversion/to-link.spec.ts b/packages/v2/e2e/src/update-field/checkbox/conversion/to-link.spec.ts index b83092e105..779a2c5aa9 100644 --- a/packages/v2/e2e/src/update-field/checkbox/conversion/to-link.spec.ts +++ b/packages/v2/e2e/src/update-field/checkbox/conversion/to-link.spec.ts @@ -57,10 +57,14 @@ describe('update-field: checkbox → link conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to link and clear non-link data', async () => { diff --git a/packages/v2/e2e/src/update-field/checkbox/conversion/to-lookup.spec.ts b/packages/v2/e2e/src/update-field/checkbox/conversion/to-lookup.spec.ts index 8e1b654da9..e6bf195695 100644 --- a/packages/v2/e2e/src/update-field/checkbox/conversion/to-lookup.spec.ts +++ b/packages/v2/e2e/src/update-field/checkbox/conversion/to-lookup.spec.ts @@ -77,10 +77,14 @@ describe('update-field: checkbox → lookup conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to lookup and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/checkbox/conversion/to-user.spec.ts b/packages/v2/e2e/src/update-field/checkbox/conversion/to-user.spec.ts index 7045eaa3c2..bf8e854108 100644 --- a/packages/v2/e2e/src/update-field/checkbox/conversion/to-user.spec.ts +++ b/packages/v2/e2e/src/update-field/checkbox/conversion/to-user.spec.ts @@ -41,7 +41,9 @@ describe('update-field: checkbox → user conversion', () => { if (!tableId) return; try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert non-null values to null', async () => { diff --git a/packages/v2/e2e/src/update-field/computed/force-v2-all-regressions.spec.ts b/packages/v2/e2e/src/update-field/computed/force-v2-all-regressions.spec.ts index 74501ecade..357f2709b9 100644 --- a/packages/v2/e2e/src/update-field/computed/force-v2-all-regressions.spec.ts +++ b/packages/v2/e2e/src/update-field/computed/force-v2-all-regressions.spec.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { beforeAll, describe, expect, test } from 'vitest'; import { sql } from 'kysely'; +import { beforeAll, describe, expect, test } from 'vitest'; import { getSharedTestContext, type SharedTestContext } from '../../shared/globalTestContext'; let fieldIdCounter = 0; diff --git a/packages/v2/e2e/src/update-field/computed/record-value-seeding.spec.ts b/packages/v2/e2e/src/update-field/computed/record-value-seeding.spec.ts index b873fa7533..c5a2a2d0fd 100644 --- a/packages/v2/e2e/src/update-field/computed/record-value-seeding.spec.ts +++ b/packages/v2/e2e/src/update-field/computed/record-value-seeding.spec.ts @@ -15,7 +15,9 @@ const deleteTableSafe = async (ctx: SharedTestContext, tableId: string | undefin if (!tableId) return; try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } }; const isObjectRecord = (value: unknown): value is Record => diff --git a/packages/v2/e2e/src/update-field/computed/schema-refresh-no-record-events.spec.ts b/packages/v2/e2e/src/update-field/computed/schema-refresh-no-record-events.spec.ts index 254c063453..384a06efb7 100644 --- a/packages/v2/e2e/src/update-field/computed/schema-refresh-no-record-events.spec.ts +++ b/packages/v2/e2e/src/update-field/computed/schema-refresh-no-record-events.spec.ts @@ -53,7 +53,9 @@ const deleteTablesSafe = async (ctx: SharedTestContext, tableIds: ReadonlyArray< for (const tableId of [...tableIds].reverse()) { try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } } }; diff --git a/packages/v2/e2e/src/update-field/event-shape.spec.ts b/packages/v2/e2e/src/update-field/event-shape.spec.ts index 57f464db82..42d3c07d5a 100644 --- a/packages/v2/e2e/src/update-field/event-shape.spec.ts +++ b/packages/v2/e2e/src/update-field/event-shape.spec.ts @@ -79,7 +79,9 @@ describe('update-field: event shape', () => { try { await ctx.drainOutbox(); await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } tableId = undefined; }); diff --git a/packages/v2/e2e/src/update-field/helpers.ts b/packages/v2/e2e/src/update-field/helpers.ts index 02d96e2cc3..749535434a 100644 --- a/packages/v2/e2e/src/update-field/helpers.ts +++ b/packages/v2/e2e/src/update-field/helpers.ts @@ -1,3 +1,5 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-nocheck /** * Helper utilities for update-field e2e tests. * diff --git a/packages/v2/e2e/src/update-field/longText/conversion/to-link.spec.ts b/packages/v2/e2e/src/update-field/longText/conversion/to-link.spec.ts index 40693bbaa8..80ec6ea3ff 100644 --- a/packages/v2/e2e/src/update-field/longText/conversion/to-link.spec.ts +++ b/packages/v2/e2e/src/update-field/longText/conversion/to-link.spec.ts @@ -57,10 +57,14 @@ describe('update-field: longText → link conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to link and map matched text value', async () => { diff --git a/packages/v2/e2e/src/update-field/longText/conversion/to-lookup.spec.ts b/packages/v2/e2e/src/update-field/longText/conversion/to-lookup.spec.ts index 88cd724360..bfb01a6e98 100644 --- a/packages/v2/e2e/src/update-field/longText/conversion/to-lookup.spec.ts +++ b/packages/v2/e2e/src/update-field/longText/conversion/to-lookup.spec.ts @@ -77,10 +77,14 @@ describe('update-field: longText → lookup conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to lookup and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/longText/conversion/to-user.spec.ts b/packages/v2/e2e/src/update-field/longText/conversion/to-user.spec.ts index 6a082c17c2..75ace6d94c 100644 --- a/packages/v2/e2e/src/update-field/longText/conversion/to-user.spec.ts +++ b/packages/v2/e2e/src/update-field/longText/conversion/to-user.spec.ts @@ -41,7 +41,9 @@ describe('update-field: longText → user conversion', () => { if (!tableId) return; try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } }); test('should clear non-matching text values', async () => { diff --git a/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-link.spec.ts b/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-link.spec.ts index 389d9f502a..1698ca5f01 100644 --- a/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-link.spec.ts +++ b/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-link.spec.ts @@ -63,10 +63,14 @@ describe('update-field: multipleSelect → link conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to link and clear non-link data', async () => { diff --git a/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-lookup.spec.ts b/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-lookup.spec.ts index c15398c6da..13dd6200f0 100644 --- a/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-lookup.spec.ts +++ b/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-lookup.spec.ts @@ -83,10 +83,14 @@ describe('update-field: multipleSelect → lookup conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to lookup and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-user.spec.ts b/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-user.spec.ts index de8d50327b..a3f1a6e51d 100644 --- a/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-user.spec.ts +++ b/packages/v2/e2e/src/update-field/multipleSelect/conversion/to-user.spec.ts @@ -51,7 +51,9 @@ describe('update-field: multipleSelect → user conversion', () => { if (!tableId) return; try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert non-null values to null', async () => { diff --git a/packages/v2/e2e/src/update-field/number/conversion/to-link.spec.ts b/packages/v2/e2e/src/update-field/number/conversion/to-link.spec.ts index 9342d27f21..49c360b77a 100644 --- a/packages/v2/e2e/src/update-field/number/conversion/to-link.spec.ts +++ b/packages/v2/e2e/src/update-field/number/conversion/to-link.spec.ts @@ -57,10 +57,14 @@ describe('update-field: number → link conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to link and clear non-link data', async () => { diff --git a/packages/v2/e2e/src/update-field/number/conversion/to-lookup.spec.ts b/packages/v2/e2e/src/update-field/number/conversion/to-lookup.spec.ts index 58a37e8db7..9a116a60a6 100644 --- a/packages/v2/e2e/src/update-field/number/conversion/to-lookup.spec.ts +++ b/packages/v2/e2e/src/update-field/number/conversion/to-lookup.spec.ts @@ -77,10 +77,14 @@ describe('update-field: number → lookup conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to lookup and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/number/conversion/to-user.spec.ts b/packages/v2/e2e/src/update-field/number/conversion/to-user.spec.ts index 622e992847..5c69307625 100644 --- a/packages/v2/e2e/src/update-field/number/conversion/to-user.spec.ts +++ b/packages/v2/e2e/src/update-field/number/conversion/to-user.spec.ts @@ -41,7 +41,9 @@ describe('update-field: number → user conversion', () => { if (!tableId) return; try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert non-null values to null', async () => { diff --git a/packages/v2/e2e/src/update-field/rating/conversion/to-link.spec.ts b/packages/v2/e2e/src/update-field/rating/conversion/to-link.spec.ts index 31662b46fa..396f26df12 100644 --- a/packages/v2/e2e/src/update-field/rating/conversion/to-link.spec.ts +++ b/packages/v2/e2e/src/update-field/rating/conversion/to-link.spec.ts @@ -58,10 +58,14 @@ describe('update-field: rating → link conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to link and clear non-link data', async () => { diff --git a/packages/v2/e2e/src/update-field/rating/conversion/to-lookup.spec.ts b/packages/v2/e2e/src/update-field/rating/conversion/to-lookup.spec.ts index 72fe81d228..46bca4fd0b 100644 --- a/packages/v2/e2e/src/update-field/rating/conversion/to-lookup.spec.ts +++ b/packages/v2/e2e/src/update-field/rating/conversion/to-lookup.spec.ts @@ -78,10 +78,14 @@ describe('update-field: rating → lookup conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to lookup and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/rating/conversion/to-user.spec.ts b/packages/v2/e2e/src/update-field/rating/conversion/to-user.spec.ts index e924dabf57..04473796c3 100644 --- a/packages/v2/e2e/src/update-field/rating/conversion/to-user.spec.ts +++ b/packages/v2/e2e/src/update-field/rating/conversion/to-user.spec.ts @@ -46,7 +46,9 @@ describe('update-field: rating → user conversion', () => { if (!tableId) return; try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert non-null values to null', async () => { diff --git a/packages/v2/e2e/src/update-field/rating/update-properties.spec.ts b/packages/v2/e2e/src/update-field/rating/update-properties.spec.ts index efe952c655..4d28683087 100644 --- a/packages/v2/e2e/src/update-field/rating/update-properties.spec.ts +++ b/packages/v2/e2e/src/update-field/rating/update-properties.spec.ts @@ -1,6 +1,6 @@ import type { IFieldDto } from '@teable/v2-contract-http'; -import { afterAll, beforeAll, describe, expect, test } from 'vitest'; import { RatingIcon } from '@teable/v2-core'; +import { afterAll, beforeAll, describe, expect, test } from 'vitest'; import { getSharedTestContext, type SharedTestContext } from '../../shared/globalTestContext'; type RatingFieldDto = IFieldDto & { @@ -63,7 +63,9 @@ describe('update-field: rating property updates', () => { afterAll(async () => { if (tableId) { - await ctx.deleteTable(tableId).catch(() => {}); + await ctx.deleteTable(tableId).catch(() => { + /* noop */ + }); } }); @@ -272,7 +274,9 @@ describe('update-field: rating conversions', () => { afterAll(async () => { if (tableId) { - await ctx.deleteTable(tableId).catch(() => {}); + await ctx.deleteTable(tableId).catch(() => { + /* noop */ + }); } }); diff --git a/packages/v2/e2e/src/update-field/singleLineText/conversion/to-lookup.spec.ts b/packages/v2/e2e/src/update-field/singleLineText/conversion/to-lookup.spec.ts index 732f50b74a..fa5b077fa7 100644 --- a/packages/v2/e2e/src/update-field/singleLineText/conversion/to-lookup.spec.ts +++ b/packages/v2/e2e/src/update-field/singleLineText/conversion/to-lookup.spec.ts @@ -77,10 +77,14 @@ describe('update-field: singleLineText → lookup conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to lookup and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/singleSelect/conversion/to-link.spec.ts b/packages/v2/e2e/src/update-field/singleSelect/conversion/to-link.spec.ts index 6e1ef1c34d..53f79938e0 100644 --- a/packages/v2/e2e/src/update-field/singleSelect/conversion/to-link.spec.ts +++ b/packages/v2/e2e/src/update-field/singleSelect/conversion/to-link.spec.ts @@ -63,10 +63,14 @@ describe('update-field: singleSelect → link conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to link and map matched option value', async () => { diff --git a/packages/v2/e2e/src/update-field/singleSelect/conversion/to-lookup.spec.ts b/packages/v2/e2e/src/update-field/singleSelect/conversion/to-lookup.spec.ts index e21f968bbb..dcde3e74ca 100644 --- a/packages/v2/e2e/src/update-field/singleSelect/conversion/to-lookup.spec.ts +++ b/packages/v2/e2e/src/update-field/singleSelect/conversion/to-lookup.spec.ts @@ -83,10 +83,14 @@ describe('update-field: singleSelect → lookup conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to lookup and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/singleSelect/conversion/to-user.spec.ts b/packages/v2/e2e/src/update-field/singleSelect/conversion/to-user.spec.ts index 0697b1f112..c0a3db9dc2 100644 --- a/packages/v2/e2e/src/update-field/singleSelect/conversion/to-user.spec.ts +++ b/packages/v2/e2e/src/update-field/singleSelect/conversion/to-user.spec.ts @@ -51,7 +51,9 @@ describe('update-field: singleSelect → user conversion', () => { if (!tableId) return; try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } }); test('should clear non-matching values', async () => { diff --git a/packages/v2/e2e/src/update-field/type-conversion-record-event-guard.spec.ts b/packages/v2/e2e/src/update-field/type-conversion-record-event-guard.spec.ts index 4e9463b07a..e741e2e0fe 100644 --- a/packages/v2/e2e/src/update-field/type-conversion-record-event-guard.spec.ts +++ b/packages/v2/e2e/src/update-field/type-conversion-record-event-guard.spec.ts @@ -15,7 +15,9 @@ const deleteTableSafe = async (ctx: SharedTestContext, tableId: string | undefin if (!tableId) return; try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } }; const isObjectRecord = (value: unknown): value is Record => diff --git a/packages/v2/e2e/src/update-field/user/conversion/to-link.spec.ts b/packages/v2/e2e/src/update-field/user/conversion/to-link.spec.ts index 2181b0f5c8..2e6b187899 100644 --- a/packages/v2/e2e/src/update-field/user/conversion/to-link.spec.ts +++ b/packages/v2/e2e/src/update-field/user/conversion/to-link.spec.ts @@ -66,10 +66,14 @@ describe('update-field: user → link conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to link and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/user/conversion/to-lookup.spec.ts b/packages/v2/e2e/src/update-field/user/conversion/to-lookup.spec.ts index 6050e06e1c..36a6ae39a8 100644 --- a/packages/v2/e2e/src/update-field/user/conversion/to-lookup.spec.ts +++ b/packages/v2/e2e/src/update-field/user/conversion/to-lookup.spec.ts @@ -81,10 +81,14 @@ describe('update-field: user → lookup conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to lookup and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/user/conversion/to-rollup.spec.ts b/packages/v2/e2e/src/update-field/user/conversion/to-rollup.spec.ts index ea670de52f..804222f0a0 100644 --- a/packages/v2/e2e/src/update-field/user/conversion/to-rollup.spec.ts +++ b/packages/v2/e2e/src/update-field/user/conversion/to-rollup.spec.ts @@ -89,10 +89,14 @@ describe('update-field: user → rollup conversion', () => { afterAll(async () => { try { if (hostTableId) await ctx.deleteTable(hostTableId); - } catch {} + } catch { + /* expected */ + } try { if (foreignTableId) await ctx.deleteTable(foreignTableId); - } catch {} + } catch { + /* expected */ + } }); test('should convert to rollup and clear data', async () => { diff --git a/packages/v2/e2e/src/update-field/user/conversion/to-user.spec.ts b/packages/v2/e2e/src/update-field/user/conversion/to-user.spec.ts index d196f7e256..9bea3647de 100644 --- a/packages/v2/e2e/src/update-field/user/conversion/to-user.spec.ts +++ b/packages/v2/e2e/src/update-field/user/conversion/to-user.spec.ts @@ -49,7 +49,9 @@ describe('update-field: user → user conversion (isMultiple toggle)', () => { if (!tableId) return; try { await ctx.deleteTable(tableId); - } catch {} + } catch { + /* expected */ + } }); test('should wrap single user in array when enabling isMultiple', async () => { diff --git a/packages/v2/e2e/tsconfig.eslint.json b/packages/v2/e2e/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/e2e/tsconfig.eslint.json +++ b/packages/v2/e2e/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/e2e/tsconfig.typecheck.json b/packages/v2/e2e/tsconfig.typecheck.json new file mode 100644 index 0000000000..34264d582e --- /dev/null +++ b/packages/v2/e2e/tsconfig.typecheck.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts", + "../import/src/adapters/**" + ] +} diff --git a/packages/v2/field-dependency-core/.eslintrc.cjs b/packages/v2/field-dependency-core/.eslintrc.cjs new file mode 100644 index 0000000000..b1815ba8aa --- /dev/null +++ b/packages/v2/field-dependency-core/.eslintrc.cjs @@ -0,0 +1,29 @@ +/** + * Specific eslint rules for this workspace, learn how to compose + * @link https://github.com/teableio/teable/tree/main/packages/eslint-config-bases + */ +require('@teable/eslint-config-bases/patch/modern-module-resolution'); + +const { getDefaultIgnorePatterns } = require('@teable/eslint-config-bases/helpers'); + +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + parserOptions: { + tsconfigRootDir: __dirname, + project: 'tsconfig.eslint.json', + }, + ignorePatterns: [...getDefaultIgnorePatterns()], + extends: [ + '@teable/eslint-config-bases/typescript', + '@teable/eslint-config-bases/sonar', + '@teable/eslint-config-bases/regexp', + '@teable/eslint-config-bases/jest', + // Apply prettier and disable incompatible rules + '@teable/eslint-config-bases/prettier-plugin', + ], + rules: { + '@typescript-eslint/consistent-type-imports': 'off', + }, + overrides: [], +}; diff --git a/packages/v2/field-dependency-core/package.json b/packages/v2/field-dependency-core/package.json index 8654444b99..b0d210ec79 100644 --- a/packages/v2/field-dependency-core/package.json +++ b/packages/v2/field-dependency-core/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-field-dependency-core.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test": "vitest run", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" }, diff --git a/packages/v2/field-dependency-core/src/parsers.spec.ts b/packages/v2/field-dependency-core/src/parsers.spec.ts index 18e3957b78..753b809807 100644 --- a/packages/v2/field-dependency-core/src/parsers.spec.ts +++ b/packages/v2/field-dependency-core/src/parsers.spec.ts @@ -11,6 +11,8 @@ import { readString, } from './parsers'; +const nullInputTest = 'returns null for null input'; + describe('parsers', () => { describe('parseJson', () => { it('parses valid JSON', () => { @@ -151,7 +153,7 @@ describe('parsers', () => { }); }); - it('returns null for null input', () => { + it(nullInputTest, () => { const result = parseLinkOptions(null); expect(result.isOk()).toBe(true); expect(result._unsafeUnwrap()).toBeNull(); @@ -211,7 +213,7 @@ describe('parsers', () => { }); }); - it('returns null for null input', () => { + it(nullInputTest, () => { const result = parseLookupOptions(null); expect(result.isOk()).toBe(true); expect(result._unsafeUnwrap()).toBeNull(); @@ -269,7 +271,7 @@ describe('parsers', () => { expect(result._unsafeUnwrap()).toBeNull(); }); - it('returns null for null input', () => { + it(nullInputTest, () => { const result = parseConditionalFieldOptions(null); expect(result.isOk()).toBe(true); expect(result._unsafeUnwrap()).toBeNull(); diff --git a/packages/v2/field-dependency-core/src/types.ts b/packages/v2/field-dependency-core/src/types.ts index a7116cda08..25f22660a1 100644 --- a/packages/v2/field-dependency-core/src/types.ts +++ b/packages/v2/field-dependency-core/src/types.ts @@ -7,6 +7,7 @@ import type { Result } from 'neverthrow'; * - `same_record`: Dependency within the same record (no link traversal needed) * - `cross_record`: Dependency across records via link (includes same-table self-referencing) */ +// eslint-disable-next-line @typescript-eslint/naming-convention export type FieldDependencyEdgeKind = 'same_record' | 'cross_record'; /** @@ -49,6 +50,7 @@ export type FieldDependencyEdgeKind = 'same_record' | 'cross_record'; * Unlike regular Lookup, it does not use a Link field for association but matches records via condition filters. * When source or condition field values change, the condition must be re-evaluated to fetch matching record values. */ +// eslint-disable-next-line @typescript-eslint/naming-convention export type FieldDependencyEdgeSemantic = | 'formula_ref' | 'lookup_source' @@ -64,6 +66,7 @@ export type FieldDependencyEdgeSemantic = * A dependency edge between two fields. * Uses string IDs for portability across different contexts. */ +// eslint-disable-next-line @typescript-eslint/naming-convention export interface FieldDependencyEdge { fromFieldId: string; toFieldId: string; @@ -79,11 +82,13 @@ export interface FieldDependencyEdge { /** * Link relationship type. */ +// eslint-disable-next-line @typescript-eslint/naming-convention export type LinkRelationship = 'oneMany' | 'manyOne' | 'oneOne' | 'manyMany'; /** * Parsed lookup options (for lookup/rollup fields). */ +// eslint-disable-next-line @typescript-eslint/naming-convention export interface ParsedLookupOptions { linkFieldId: string; foreignTableId: string; @@ -97,6 +102,7 @@ export interface ParsedLookupOptions { /** * Parsed link options (for link fields). */ +// eslint-disable-next-line @typescript-eslint/naming-convention export interface ParsedLinkOptions { foreignTableId: string; lookupFieldId: string; @@ -112,6 +118,7 @@ export interface ParsedLinkOptions { * Metadata for conditional field options (conditionalRollup / conditionalLookup). * Unlike regular lookup/rollup, these don't have a linkFieldId. */ +// eslint-disable-next-line @typescript-eslint/naming-convention export interface ParsedConditionalOptions { foreignTableId: string; lookupFieldId: string; @@ -124,6 +131,7 @@ export interface ParsedConditionalOptions { /** * Field metadata for dependency graph construction. */ +// eslint-disable-next-line @typescript-eslint/naming-convention export interface FieldMeta { id: string; tableId: string; @@ -139,6 +147,7 @@ export interface FieldMeta { /** * Result of loading field dependency graph data. */ +// eslint-disable-next-line @typescript-eslint/naming-convention export interface FieldDependencyGraphData { fieldsById: Map; edges: ReadonlyArray; @@ -147,4 +156,5 @@ export interface FieldDependencyGraphData { /** * Parser function signature for field options. */ +// eslint-disable-next-line @typescript-eslint/naming-convention export type OptionsParser = (raw: string | null) => Result; diff --git a/packages/v2/field-dependency-core/tsconfig.eslint.json b/packages/v2/field-dependency-core/tsconfig.eslint.json new file mode 100644 index 0000000000..c47b371b13 --- /dev/null +++ b/packages/v2/field-dependency-core/tsconfig.eslint.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "noEmit": true + }, + "include": ["src", "vitest.config.ts", "tsdown.config.ts", ".eslintrc.cjs"], + "exclude": ["**/node_modules", "./dist", "./coverage"] +} diff --git a/packages/v2/field-dependency-core/tsconfig.json b/packages/v2/field-dependency-core/tsconfig.json index 027250711a..a2f731cb78 100644 --- a/packages/v2/field-dependency-core/tsconfig.json +++ b/packages/v2/field-dependency-core/tsconfig.json @@ -5,6 +5,8 @@ "compilerOptions": { "module": "ESNext", "moduleResolution": "Bundler", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, "target": "esnext", "lib": ["esnext"], "esModuleInterop": true, diff --git a/packages/v2/field-dependency-core/tsconfig.typecheck.json b/packages/v2/field-dependency-core/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/field-dependency-core/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/formula-sql-pg/package.json b/packages/v2/formula-sql-pg/package.json index 43d48fc080..5556cc8c7d 100644 --- a/packages/v2/formula-sql-pg/package.json +++ b/packages/v2/formula-sql-pg/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-formula-sql-pg.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/formula-sql-pg/src/FormattingMatrix.spec.ts b/packages/v2/formula-sql-pg/src/FormattingMatrix.spec.ts index 1f4c8aab97..3511f8f543 100644 --- a/packages/v2/formula-sql-pg/src/FormattingMatrix.spec.ts +++ b/packages/v2/formula-sql-pg/src/FormattingMatrix.spec.ts @@ -1,6 +1,5 @@ -import { afterAll, beforeAll, describe, expect, it } from 'vitest'; - import type { Field } from '@teable/v2-core'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { buildFormulaSnapshotContext, diff --git a/packages/v2/formula-sql-pg/src/TranslatorEdgeCases.spec.ts b/packages/v2/formula-sql-pg/src/TranslatorEdgeCases.spec.ts index 81dd034480..a60512208d 100644 --- a/packages/v2/formula-sql-pg/src/TranslatorEdgeCases.spec.ts +++ b/packages/v2/formula-sql-pg/src/TranslatorEdgeCases.spec.ts @@ -1,6 +1,6 @@ import type { IV2NodeTestContainer } from '@teable/v2-container-node-test'; -import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { ok } from 'neverthrow'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { FormulaSqlPgTranslator } from './FormulaSqlPgTranslator'; import { makeExpr } from './SqlExpression'; diff --git a/packages/v2/formula-sql-pg/src/WorkdayDiff.spec.ts b/packages/v2/formula-sql-pg/src/WorkdayDiff.spec.ts index 26428c192f..3bdf72d07d 100644 --- a/packages/v2/formula-sql-pg/src/WorkdayDiff.spec.ts +++ b/packages/v2/formula-sql-pg/src/WorkdayDiff.spec.ts @@ -16,24 +16,26 @@ type WorkdayDiffCase = { sqlMustContain: ReadonlyArray; }; +const SQL_EXTRACT_DOW = 'EXTRACT(DOW'; + const workdayDiffCases: ReadonlyArray = [ { id: 'WeekdayOnly', expression: 'WORKDAY_DIFF("2026-02-23", "2026-02-27")', expected: '4', - sqlMustContain: ['generate_series', 'EXTRACT(DOW'], + sqlMustContain: ['generate_series', SQL_EXTRACT_DOW], }, { id: 'CrossWeekend', expression: 'WORKDAY_DIFF("2026-02-23", "2026-03-02")', expected: '5', - sqlMustContain: ['generate_series', 'EXTRACT(DOW'], + sqlMustContain: ['generate_series', SQL_EXTRACT_DOW], }, { id: 'WeekendOnly', expression: 'WORKDAY_DIFF("2026-02-28", "2026-03-01")', expected: '0', - sqlMustContain: ['generate_series', 'EXTRACT(DOW'], + sqlMustContain: ['generate_series', SQL_EXTRACT_DOW], }, { id: 'HolidayExclusion', diff --git a/packages/v2/formula-sql-pg/src/__tests__/PgSqlHelpers.spec.ts b/packages/v2/formula-sql-pg/src/__tests__/PgSqlHelpers.spec.ts index 48bbdfe87f..1c2a45e0af 100644 --- a/packages/v2/formula-sql-pg/src/__tests__/PgSqlHelpers.spec.ts +++ b/packages/v2/formula-sql-pg/src/__tests__/PgSqlHelpers.spec.ts @@ -16,6 +16,8 @@ import { } from '../PgSqlHelpers'; import { Pg16TypeValidationStrategy, PgLegacyTypeValidationStrategy } from '../strategies'; +const EMPTY_JSONB_ARRAY = "'[]'::jsonb"; + describe('PgSqlHelpers', () => { describe('escapeSqlLiteral', () => { it('should escape single quotes', () => { @@ -65,6 +67,7 @@ describe('PgSqlHelpers', () => { }); describe('safeJsonbWithStrategy', () => { + // eslint-disable-next-line sonarjs/no-duplicate-string it('should work with Pg16TypeValidationStrategy', () => { const strategy = new Pg16TypeValidationStrategy(); const result = safeJsonbWithStrategy('col', strategy); @@ -72,6 +75,7 @@ describe('PgSqlHelpers', () => { expect(result).toContain('jsonb'); }); + // eslint-disable-next-line sonarjs/no-duplicate-string it('should work with PgLegacyTypeValidationStrategy', () => { const strategy = new PgLegacyTypeValidationStrategy(); const result = safeJsonbWithStrategy('col', strategy); @@ -86,23 +90,25 @@ describe('PgSqlHelpers', () => { expect(result).toContain('jsonb'); expect(result).toContain('pg_input_is_valid'); expect(result).toContain('my_column'); - expect(result).toContain("'[]'::jsonb"); + expect(result).toContain(EMPTY_JSONB_ARRAY); }); }); describe('normalizeToJsonArrayWithStrategy', () => { + // eslint-disable-next-line sonarjs/no-duplicate-string it('should work with Pg16TypeValidationStrategy', () => { const strategy = new Pg16TypeValidationStrategy(); const result = normalizeToJsonArrayWithStrategy('col', strategy); expect(result).toContain('pg_input_is_valid'); - expect(result).toContain("'[]'::jsonb"); + expect(result).toContain(EMPTY_JSONB_ARRAY); }); + // eslint-disable-next-line sonarjs/no-duplicate-string it('should work with PgLegacyTypeValidationStrategy', () => { const strategy = new PgLegacyTypeValidationStrategy(); const result = normalizeToJsonArrayWithStrategy('col', strategy); expect(result).toContain('teable_try_cast_valid'); - expect(result).toContain("'[]'::jsonb"); + expect(result).toContain(EMPTY_JSONB_ARRAY); }); }); @@ -127,6 +133,7 @@ describe('PgSqlHelpers', () => { }); describe('extractFirstJsonScalarTextWithStrategy', () => { + // eslint-disable-next-line sonarjs/no-duplicate-string it('should work with Pg16TypeValidationStrategy', () => { const strategy = new Pg16TypeValidationStrategy(); const result = extractFirstJsonScalarTextWithStrategy('col', strategy); @@ -134,6 +141,7 @@ describe('PgSqlHelpers', () => { expect(result).toContain('pg_input_is_valid'); }); + // eslint-disable-next-line sonarjs/no-duplicate-string it('should work with PgLegacyTypeValidationStrategy', () => { const strategy = new PgLegacyTypeValidationStrategy(); const result = extractFirstJsonScalarTextWithStrategy('col', strategy); @@ -170,6 +178,7 @@ describe('PgSqlHelpers', () => { }); describe('stringifyJsonArrayWithStrategy', () => { + // eslint-disable-next-line sonarjs/no-duplicate-string it('should work with Pg16TypeValidationStrategy', () => { const strategy = new Pg16TypeValidationStrategy(); const result = stringifyJsonArrayWithStrategy('col', strategy); @@ -177,6 +186,7 @@ describe('PgSqlHelpers', () => { expect(result).toContain('pg_input_is_valid'); }); + // eslint-disable-next-line sonarjs/no-duplicate-string it('should work with PgLegacyTypeValidationStrategy', () => { const strategy = new PgLegacyTypeValidationStrategy(); const result = stringifyJsonArrayWithStrategy('col', strategy); diff --git a/packages/v2/formula-sql-pg/src/__tests__/datetime-format.util.spec.ts b/packages/v2/formula-sql-pg/src/__tests__/datetime-format.util.spec.ts index 5cddb5a255..6e7807ca12 100644 --- a/packages/v2/formula-sql-pg/src/__tests__/datetime-format.util.spec.ts +++ b/packages/v2/formula-sql-pg/src/__tests__/datetime-format.util.spec.ts @@ -1,27 +1,29 @@ import { describe, it, expect } from 'vitest'; import { normalizeDatetimeFormatExpression } from '../utils/datetime-format.util'; +const DEFAULT_DATE_FORMAT = "'YYYY-MM-DD'"; + describe('normalizeDatetimeFormatExpression', () => { describe('default handling', () => { it('should return default for null input', () => { - expect(normalizeDatetimeFormatExpression(null)).toBe("'YYYY-MM-DD'"); + expect(normalizeDatetimeFormatExpression(null)).toBe(DEFAULT_DATE_FORMAT); }); it('should return default for undefined input', () => { - expect(normalizeDatetimeFormatExpression(undefined)).toBe("'YYYY-MM-DD'"); + expect(normalizeDatetimeFormatExpression(undefined)).toBe(DEFAULT_DATE_FORMAT); }); it('should return default for non-string input', () => { // @ts-expect-error testing non-string input - expect(normalizeDatetimeFormatExpression(123)).toBe("'YYYY-MM-DD'"); + expect(normalizeDatetimeFormatExpression(123)).toBe(DEFAULT_DATE_FORMAT); }); it('should return default for empty string', () => { - expect(normalizeDatetimeFormatExpression('')).toBe("'YYYY-MM-DD'"); + expect(normalizeDatetimeFormatExpression('')).toBe(DEFAULT_DATE_FORMAT); }); it('should return default for whitespace only', () => { - expect(normalizeDatetimeFormatExpression(' ')).toBe("'YYYY-MM-DD'"); + expect(normalizeDatetimeFormatExpression(' ')).toBe(DEFAULT_DATE_FORMAT); }); }); @@ -53,7 +55,7 @@ describe('normalizeDatetimeFormatExpression', () => { }); it('should normalize YYYY-MM-DD', () => { - expect(normalizeDatetimeFormatExpression("'YYYY-MM-DD'")).toBe("'YYYY-MM-DD'"); + expect(normalizeDatetimeFormatExpression(DEFAULT_DATE_FORMAT)).toBe(DEFAULT_DATE_FORMAT); }); it('should normalize YY', () => { diff --git a/packages/v2/formula-sql-pg/tsconfig.eslint.json b/packages/v2/formula-sql-pg/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/formula-sql-pg/tsconfig.eslint.json +++ b/packages/v2/formula-sql-pg/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/formula-sql-pg/tsconfig.typecheck.json b/packages/v2/formula-sql-pg/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/formula-sql-pg/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/import/.eslintrc.cjs b/packages/v2/import/.eslintrc.cjs new file mode 100644 index 0000000000..b1815ba8aa --- /dev/null +++ b/packages/v2/import/.eslintrc.cjs @@ -0,0 +1,29 @@ +/** + * Specific eslint rules for this workspace, learn how to compose + * @link https://github.com/teableio/teable/tree/main/packages/eslint-config-bases + */ +require('@teable/eslint-config-bases/patch/modern-module-resolution'); + +const { getDefaultIgnorePatterns } = require('@teable/eslint-config-bases/helpers'); + +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + parserOptions: { + tsconfigRootDir: __dirname, + project: 'tsconfig.eslint.json', + }, + ignorePatterns: [...getDefaultIgnorePatterns()], + extends: [ + '@teable/eslint-config-bases/typescript', + '@teable/eslint-config-bases/sonar', + '@teable/eslint-config-bases/regexp', + '@teable/eslint-config-bases/jest', + // Apply prettier and disable incompatible rules + '@teable/eslint-config-bases/prettier-plugin', + ], + rules: { + '@typescript-eslint/consistent-type-imports': 'off', + }, + overrides: [], +}; diff --git a/packages/v2/import/package.json b/packages/v2/import/package.json index 595fb54211..1207974c7a 100644 --- a/packages/v2/import/package.json +++ b/packages/v2/import/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-import.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/import/src/adapters/CsvImportAdapter.ts b/packages/v2/import/src/adapters/CsvImportAdapter.ts index a7cac5100d..d689c7c2c2 100644 --- a/packages/v2/import/src/adapters/CsvImportAdapter.ts +++ b/packages/v2/import/src/adapters/CsvImportAdapter.ts @@ -1,7 +1,3 @@ -import Papa from 'papaparse'; -import { err, ok } from 'neverthrow'; -import type { Result } from 'neverthrow'; - import { domainError, type DomainError, @@ -10,6 +6,9 @@ import { type IImportParseResult, type IImportSource, } from '@teable/v2-core'; +import { err, ok } from 'neverthrow'; +import type { Result } from 'neverthrow'; +import Papa from 'papaparse'; /** * CSV Import Adapter @@ -44,6 +43,7 @@ export class CsvImportAdapter implements IImportSourceAdapter { ); } + // eslint-disable-next-line sonarjs/cognitive-complexity async analyze( source: IImportSource, options?: IImportOptions, @@ -113,10 +113,11 @@ export class CsvImportAdapter implements IImportSourceAdapter { } /** Create async row iterator */ + // eslint-disable-next-line sonarjs/cognitive-complexity private async *createAsyncRowIterator( reader: ReadableStreamDefaultReader, initialBuffer: string, - decoder: TextDecoder, + decoder: InstanceType, options?: IImportOptions ): AsyncIterable> { let buffer = initialBuffer; diff --git a/packages/v2/import/src/adapters/ExcelImportAdapter.ts b/packages/v2/import/src/adapters/ExcelImportAdapter.ts index 8fd252328c..8cfa0f7c27 100644 --- a/packages/v2/import/src/adapters/ExcelImportAdapter.ts +++ b/packages/v2/import/src/adapters/ExcelImportAdapter.ts @@ -1,7 +1,3 @@ -import * as XLSX from 'xlsx'; -import { err, ok } from 'neverthrow'; -import type { Result } from 'neverthrow'; - import { domainError, type DomainError, @@ -10,6 +6,9 @@ import { type IImportParseResult, type IImportSource, } from '@teable/v2-core'; +import { err, ok } from 'neverthrow'; +import type { Result } from 'neverthrow'; +import * as XLSX from 'xlsx'; /** * Excel Import Adapter @@ -125,6 +124,7 @@ export class ExcelImportAdapter implements IImportSourceAdapter { }); } + // eslint-disable-next-line sonarjs/cognitive-complexity private async getBuffer(source: IImportSource): Promise> { if (source.data) { if (typeof source.data === 'string') { diff --git a/packages/v2/import/src/di/registerImportServices.ts b/packages/v2/import/src/di/registerImportServices.ts index 8750ba0802..955bd7faf5 100644 --- a/packages/v2/import/src/di/registerImportServices.ts +++ b/packages/v2/import/src/di/registerImportServices.ts @@ -1,5 +1,5 @@ -import type { DependencyContainer } from '@teable/v2-di'; import { v2CoreTokens } from '@teable/v2-core'; +import type { DependencyContainer } from '@teable/v2-di'; import { CsvImportAdapter } from '../adapters/CsvImportAdapter'; import { ExcelImportAdapter } from '../adapters/ExcelImportAdapter'; diff --git a/packages/v2/import/src/ports/ImportSourceRegistry.ts b/packages/v2/import/src/ports/ImportSourceRegistry.ts index a21dda6106..523b55ef97 100644 --- a/packages/v2/import/src/ports/ImportSourceRegistry.ts +++ b/packages/v2/import/src/ports/ImportSourceRegistry.ts @@ -1,6 +1,3 @@ -import { err, ok } from 'neverthrow'; -import type { Result } from 'neverthrow'; - import { domainError, type DomainError, @@ -8,6 +5,8 @@ import { type IImportSourceRegistry, type ImportSourceType, } from '@teable/v2-core'; +import { err, ok } from 'neverthrow'; +import type { Result } from 'neverthrow'; /** * Default adapter registry implementation diff --git a/packages/v2/import/tsconfig.eslint.json b/packages/v2/import/tsconfig.eslint.json new file mode 100644 index 0000000000..c47b371b13 --- /dev/null +++ b/packages/v2/import/tsconfig.eslint.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "noEmit": true + }, + "include": ["src", "vitest.config.ts", "tsdown.config.ts", ".eslintrc.cjs"], + "exclude": ["**/node_modules", "./dist", "./coverage"] +} diff --git a/packages/v2/import/tsconfig.typecheck.json b/packages/v2/import/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/import/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/mock-records/package.json b/packages/v2/mock-records/package.json index 7009e802f3..c9d522fa5a 100644 --- a/packages/v2/mock-records/package.json +++ b/packages/v2/mock-records/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-mock-records.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test": "vitest run", "test:watch": "vitest", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/mock-records/tsconfig.eslint.json b/packages/v2/mock-records/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/mock-records/tsconfig.eslint.json +++ b/packages/v2/mock-records/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/mock-records/tsconfig.typecheck.json b/packages/v2/mock-records/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/mock-records/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/postgres-schema/tsconfig.eslint.json b/packages/v2/postgres-schema/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/postgres-schema/tsconfig.eslint.json +++ b/packages/v2/postgres-schema/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/table-templates/package.json b/packages/v2/table-templates/package.json index 6a3eace665..c0929a969b 100644 --- a/packages/v2/table-templates/package.json +++ b/packages/v2/table-templates/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-table-templates.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/table-templates/tsconfig.eslint.json b/packages/v2/table-templates/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/table-templates/tsconfig.eslint.json +++ b/packages/v2/table-templates/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/table-templates/tsconfig.typecheck.json b/packages/v2/table-templates/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/table-templates/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/test-node/package.json b/packages/v2/test-node/package.json index f7d9c6dfc2..f635ecedeb 100644 --- a/packages/v2/test-node/package.json +++ b/packages/v2/test-node/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-test-node.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/test-node/src/commands/DuplicateFieldHandler.db.spec.ts b/packages/v2/test-node/src/commands/DuplicateFieldHandler.db.spec.ts index 90178eff88..107dec5b3a 100644 --- a/packages/v2/test-node/src/commands/DuplicateFieldHandler.db.spec.ts +++ b/packages/v2/test-node/src/commands/DuplicateFieldHandler.db.spec.ts @@ -1,5 +1,5 @@ -import { createV2NodeTestContainer } from '@teable/v2-container-node-test'; import { v2PostgresDbTokens } from '@teable/v2-adapter-db-postgres-pg'; +import { createV2NodeTestContainer } from '@teable/v2-container-node-test'; import { ActorId, CreateFieldCommand, diff --git a/packages/v2/test-node/src/commands/UpdateRecordUndoRedo.db.spec.ts b/packages/v2/test-node/src/commands/UpdateRecordUndoRedo.db.spec.ts index 1c8177a134..ced91752c1 100644 --- a/packages/v2/test-node/src/commands/UpdateRecordUndoRedo.db.spec.ts +++ b/packages/v2/test-node/src/commands/UpdateRecordUndoRedo.db.spec.ts @@ -17,8 +17,8 @@ import { } from '@teable/v2-core'; import type { V1TeableDatabase } from '@teable/v2-postgres-schema'; import type { Kysely } from 'kysely'; -import { beforeEach, describe, expect, it } from 'vitest'; import type { Result } from 'neverthrow'; +import { beforeEach, describe, expect, it } from 'vitest'; import { getV2NodeTestContainer, setV2NodeTestContainer } from '../testkit/v2NodeTestContainer'; diff --git a/packages/v2/test-node/src/computed/FieldDependencyChain.integration.spec.ts b/packages/v2/test-node/src/computed/FieldDependencyChain.integration.spec.ts index 44ed587fd1..d10f3d08ad 100644 --- a/packages/v2/test-node/src/computed/FieldDependencyChain.integration.spec.ts +++ b/packages/v2/test-node/src/computed/FieldDependencyChain.integration.spec.ts @@ -344,6 +344,7 @@ describe('FieldDependencyChain Integration Tests', () => { type: 'rollup', id: orderTotalId, name: 'Total', + // eslint-disable-next-line sonarjs/no-duplicate-string options: { expression: 'sum({values})' }, config: { linkFieldId: orderLinkId, @@ -693,7 +694,7 @@ describe('FieldDependencyChain Integration Tests', () => { v2RecordRepositoryPostgresTokens.computedDependencyGraph ); - const baseId_ = nextFieldId(); + const baseFieldId = nextFieldId(); const f1Id = nextFieldId(); const f2Id = nextFieldId(); const f3Id = nextFieldId(); @@ -702,18 +703,18 @@ describe('FieldDependencyChain Integration Tests', () => { name: 'DiamondTable', fields: [ { type: 'singleLineText', name: 'Name', isPrimary: true }, - { type: 'number', id: baseId_, name: 'Base' }, + { type: 'number', id: baseFieldId, name: 'Base' }, { type: 'formula', id: f1Id, name: 'F1', - options: { expression: `{${baseId_}} * 2` }, + options: { expression: `{${baseFieldId}} * 2` }, }, { type: 'formula', id: f2Id, name: 'F2', - options: { expression: `{${baseId_}} + 10` }, + options: { expression: `{${baseFieldId}} + 10` }, }, { type: 'formula', @@ -825,7 +826,7 @@ describe('FieldDependencyChain Integration Tests', () => { v2RecordRepositoryPostgresTokens.computedDependencyGraph ); - const baseId_ = nextFieldId(); + const baseFieldId = nextFieldId(); const formulaCount = 50; // Create base field and many formula fields @@ -837,7 +838,7 @@ describe('FieldDependencyChain Integration Tests', () => { options?: Record; }> = [ { type: 'singleLineText', name: 'Name', isPrimary: true }, - { type: 'number', id: baseId_, name: 'Base' }, + { type: 'number', id: baseFieldId, name: 'Base' }, ]; // Each formula references the base field @@ -846,7 +847,7 @@ describe('FieldDependencyChain Integration Tests', () => { type: 'formula', id: nextFieldId(), name: `Formula${i}`, - options: { expression: `{${baseId_}} + ${i}` }, + options: { expression: `{${baseFieldId}} + ${i}` }, }); } diff --git a/packages/v2/test-node/src/testkit/createV2NodeTestContainer.ts b/packages/v2/test-node/src/testkit/createV2NodeTestContainer.ts index 9aad6c604d..509a2e0b96 100644 --- a/packages/v2/test-node/src/testkit/createV2NodeTestContainer.ts +++ b/packages/v2/test-node/src/testkit/createV2NodeTestContainer.ts @@ -54,6 +54,7 @@ export const createV2NodeTestContainer = async (): Promise tableRepository, eventBus, baseId: baseIdResult.value, + processOutbox: () => Promise.resolve(0), dispose: () => Promise.resolve(), }; }; diff --git a/packages/v2/test-node/src/undo-redo/fields/updateField/undoRedo.db.spec.ts b/packages/v2/test-node/src/undo-redo/fields/updateField/undoRedo.db.spec.ts index ec8a20a156..58e13746a2 100644 --- a/packages/v2/test-node/src/undo-redo/fields/updateField/undoRedo.db.spec.ts +++ b/packages/v2/test-node/src/undo-redo/fields/updateField/undoRedo.db.spec.ts @@ -171,6 +171,7 @@ describe('undo-redo/updateField (db)', () => { const statusField = findField(table, 'Status'); const titleField = findField(table, 'Title'); const statusDbName = getFieldDbName(table, 'Status'); + const inProgressStatus = 'In Progress'; const existingStatusOption = ( statusField as unknown as { selectOptions(): Array<{ @@ -202,7 +203,7 @@ describe('undo-redo/updateField (db)', () => { choices: [ { id: existingStatusOption.id().toString(), - name: 'In Progress', + name: inProgressStatus, color: existingStatusOption.color().toString(), }, ], @@ -225,9 +226,9 @@ describe('undo-redo/updateField (db)', () => { expect(entry?.redoCommand.type).toBe('ApplyFieldSnapshot'); let updatedTable = await loadTable(harness, table); - expect(getSelectOptionNames(updatedTable, 'Status')).toEqual(['In Progress']); + expect(getSelectOptionNames(updatedTable, 'Status')).toEqual([inProgressStatus]); let updatedRow = await fetchRowById(harness.db, updatedTable, record.record.id().toString()); - expect(updatedRow?.[statusDbName]).toBe('In Progress'); + expect(updatedRow?.[statusDbName]).toBe(inProgressStatus); await harness.undo(table.id().toString()); expect(harness.probe.names()).toEqual([ @@ -256,8 +257,8 @@ describe('undo-redo/updateField (db)', () => { ]); updatedTable = await loadTable(harness, table); - expect(getSelectOptionNames(updatedTable, 'Status')).toEqual(['In Progress']); + expect(getSelectOptionNames(updatedTable, 'Status')).toEqual([inProgressStatus]); updatedRow = await fetchRowById(harness.db, updatedTable, record.record.id().toString()); - expect(updatedRow?.[statusDbName]).toBe('In Progress'); + expect(updatedRow?.[statusDbName]).toBe(inProgressStatus); }); }); diff --git a/packages/v2/test-node/src/undo-redo/records/createRecord/undoRedo.db.spec.ts b/packages/v2/test-node/src/undo-redo/records/createRecord/undoRedo.db.spec.ts index 3628ebf42e..33cc1ac35e 100644 --- a/packages/v2/test-node/src/undo-redo/records/createRecord/undoRedo.db.spec.ts +++ b/packages/v2/test-node/src/undo-redo/records/createRecord/undoRedo.db.spec.ts @@ -22,6 +22,8 @@ import { type UndoRedoDbHarness, } from '../../shared/undoRedoDbTestKit'; +const IN_PROGRESS = 'In Progress'; + describe('undo-redo/createRecord (db)', () => { let harness: UndoRedoDbHarness | undefined; @@ -35,6 +37,7 @@ describe('undo-redo/createRecord (db)', () => { }); it('replays delete on undo and restore on redo', async () => { + // eslint-disable-next-line sonarjs/no-duplicate-string if (!harness) throw new Error('Missing harness'); const table = await createBasicTable(harness, 'Undo Create Record'); @@ -100,7 +103,7 @@ describe('undo-redo/createRecord (db)', () => { typecast: true, fields: { [titleField.id().toString()]: 'Auto Options', - [statusField.id().toString()]: 'In Progress', + [statusField.id().toString()]: IN_PROGRESS, [tagsField.id().toString()]: ['Tag A', 'Tag Z'], }, })._unsafeUnwrap() @@ -118,14 +121,14 @@ describe('undo-redo/createRecord (db)', () => { expect(entry?.redoCommand.type).toBe('Batch'); let loadedTable = await loadTable(harness, table); - expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', 'In Progress']); + expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', IN_PROGRESS]); expect(getSelectOptionNames(loadedTable, 'Tags')).toEqual(['Tag A', 'Tag Z']); let createdRow = await fetchRowById( harness.db, loadedTable, createResult.record.id().toString() ); - expect(createdRow?.[statusDbName]).toBe('In Progress'); + expect(createdRow?.[statusDbName]).toBe(IN_PROGRESS); expect(createdRow?.[tagsDbName]).toEqual(['Tag A', 'Tag Z']); await harness.undo(table.id().toString()); @@ -154,10 +157,10 @@ describe('undo-redo/createRecord (db)', () => { 'RestoreRecordsCommand', ]); loadedTable = await loadTable(harness, table); - expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', 'In Progress']); + expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', IN_PROGRESS]); expect(getSelectOptionNames(loadedTable, 'Tags')).toEqual(['Tag A', 'Tag Z']); createdRow = await fetchRowById(harness.db, loadedTable, createResult.record.id().toString()); - expect(createdRow?.[statusDbName]).toBe('In Progress'); + expect(createdRow?.[statusDbName]).toBe(IN_PROGRESS); expect(createdRow?.[tagsDbName]).toEqual(['Tag A', 'Tag Z']); }); diff --git a/packages/v2/test-node/src/undo-redo/records/createRecords/undoRedo.db.spec.ts b/packages/v2/test-node/src/undo-redo/records/createRecords/undoRedo.db.spec.ts index ec29676021..5fbaf88ff3 100644 --- a/packages/v2/test-node/src/undo-redo/records/createRecords/undoRedo.db.spec.ts +++ b/packages/v2/test-node/src/undo-redo/records/createRecords/undoRedo.db.spec.ts @@ -19,6 +19,8 @@ import { type UndoRedoDbHarness, } from '../../shared/undoRedoDbTestKit'; +const IN_PROGRESS = 'In Progress'; + describe('undo-redo/createRecords (db)', () => { let harness: UndoRedoDbHarness | undefined; @@ -104,7 +106,7 @@ describe('undo-redo/createRecords (db)', () => { { fields: { [titleField.id().toString()]: 'Alpha', - [statusField.id().toString()]: 'In Progress', + [statusField.id().toString()]: IN_PROGRESS, [tagsField.id().toString()]: ['Tag A', 'Tag Z'], }, }, @@ -134,7 +136,7 @@ describe('undo-redo/createRecords (db)', () => { expect(entry?.redoCommand.type).toBe('Batch'); let loadedTable = await loadTable(harness, table); - expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', 'In Progress']); + expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', IN_PROGRESS]); expect(getSelectOptionNames(loadedTable, 'Tags')).toEqual(['Tag A', 'Tag Z']); await harness.undo(table.id().toString()); @@ -161,7 +163,7 @@ describe('undo-redo/createRecords (db)', () => { 'RestoreRecordsCommand', ]); loadedTable = await loadTable(harness, table); - expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', 'In Progress']); + expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', IN_PROGRESS]); expect(getSelectOptionNames(loadedTable, 'Tags')).toEqual(['Tag A', 'Tag Z']); expect((await listRows(harness.db, loadedTable)).map((row) => row.__id)).toEqual(createdIds); }); diff --git a/packages/v2/test-node/src/undo-redo/records/paste/undoRedo.db.spec.ts b/packages/v2/test-node/src/undo-redo/records/paste/undoRedo.db.spec.ts index 2fd5765f90..460e1d9eee 100644 --- a/packages/v2/test-node/src/undo-redo/records/paste/undoRedo.db.spec.ts +++ b/packages/v2/test-node/src/undo-redo/records/paste/undoRedo.db.spec.ts @@ -23,6 +23,8 @@ import { type UndoRedoDbHarness, } from '../../shared/undoRedoDbTestKit'; +const IN_PROGRESS = 'In Progress'; + describe('undo-redo/paste (db)', () => { let harness: UndoRedoDbHarness | undefined; @@ -75,6 +77,7 @@ describe('undo-redo/paste (db)', () => { [1, 2], ], content: [ + // eslint-disable-next-line sonarjs/no-duplicate-string ['Paste Row 0', 100], ['Paste Row 1', 200], ['Paste Row 2', 300], @@ -156,7 +159,7 @@ describe('undo-redo/paste (db)', () => { [2, 1], ], content: [ - ['Paste Row 0', 'In Progress', 'Tag A, Tag Z'], + ['Paste Row 0', IN_PROGRESS, 'Tag A, Tag Z'], ['Paste Row 1', 'Open', 'Tag A'], ], })._unsafeUnwrap() @@ -177,7 +180,7 @@ describe('undo-redo/paste (db)', () => { expect(entry?.redoCommand.type).toBe('Batch'); let loadedTable = await loadTable(harness, table); - expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', 'In Progress']); + expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', IN_PROGRESS]); expect(getSelectOptionNames(loadedTable, 'Tags')).toEqual(['Tag A', 'Tag Z']); await harness.undo(table.id().toString()); @@ -202,7 +205,7 @@ describe('undo-redo/paste (db)', () => { harness.probe.names().filter((name) => name === 'ApplyFieldSnapshotCommand') ).toHaveLength(2); loadedTable = await loadTable(harness, table); - expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', 'In Progress']); + expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', IN_PROGRESS]); expect(getSelectOptionNames(loadedTable, 'Tags')).toEqual(['Tag A', 'Tag Z']); }); }); diff --git a/packages/v2/test-node/src/undo-redo/records/updateRecord/undoRedo.db.spec.ts b/packages/v2/test-node/src/undo-redo/records/updateRecord/undoRedo.db.spec.ts index 6940ef37af..cde214af46 100644 --- a/packages/v2/test-node/src/undo-redo/records/updateRecord/undoRedo.db.spec.ts +++ b/packages/v2/test-node/src/undo-redo/records/updateRecord/undoRedo.db.spec.ts @@ -24,6 +24,8 @@ import { type UndoRedoDbHarness, } from '../../shared/undoRedoDbTestKit'; +const IN_PROGRESS = 'In Progress'; + describe('undo-redo/updateRecord (db)', () => { let harness: UndoRedoDbHarness | undefined; @@ -37,6 +39,7 @@ describe('undo-redo/updateRecord (db)', () => { }); it('replays update with old values on undo and new values on redo', async () => { + // eslint-disable-next-line sonarjs/no-duplicate-string if (!harness) throw new Error('Missing harness'); const table = await createBasicTable(harness, 'Undo Update Record'); @@ -125,7 +128,7 @@ describe('undo-redo/updateRecord (db)', () => { recordId: record.record.id().toString(), typecast: true, fields: { - [statusField.id().toString()]: 'In Progress', + [statusField.id().toString()]: IN_PROGRESS, [tagsField.id().toString()]: ['Tag A', 'Tag Z'], }, })._unsafeUnwrap() @@ -145,10 +148,10 @@ describe('undo-redo/updateRecord (db)', () => { expect(entry?.redoCommand.type).toBe('Batch'); let loadedTable = await loadTable(harness, table); - expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', 'In Progress']); + expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', IN_PROGRESS]); expect(getSelectOptionNames(loadedTable, 'Tags')).toEqual(['Tag A', 'Tag Z']); let updatedRow = await fetchRowById(harness.db, loadedTable, record.record.id().toString()); - expect(updatedRow?.[statusDbName]).toBe('In Progress'); + expect(updatedRow?.[statusDbName]).toBe(IN_PROGRESS); expect(updatedRow?.[tagsDbName]).toEqual(['Tag A', 'Tag Z']); await harness.undo(table.id().toString()); @@ -177,10 +180,10 @@ describe('undo-redo/updateRecord (db)', () => { 'UpdateRecordCommand', ]); loadedTable = await loadTable(harness, table); - expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', 'In Progress']); + expect(getSelectOptionNames(loadedTable, 'Status')).toEqual(['Open', IN_PROGRESS]); expect(getSelectOptionNames(loadedTable, 'Tags')).toEqual(['Tag A', 'Tag Z']); updatedRow = await fetchRowById(harness.db, loadedTable, record.record.id().toString()); - expect(updatedRow?.[statusDbName]).toBe('In Progress'); + expect(updatedRow?.[statusDbName]).toBe(IN_PROGRESS); expect(updatedRow?.[tagsDbName]).toEqual(['Tag A', 'Tag Z']); }); diff --git a/packages/v2/test-node/tsconfig.eslint.json b/packages/v2/test-node/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/test-node/tsconfig.eslint.json +++ b/packages/v2/test-node/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/test-node/tsconfig.typecheck.json b/packages/v2/test-node/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/test-node/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/packages/v2/utils/package.json b/packages/v2/utils/package.json index 4ce882ea3e..e9ae7d4c86 100644 --- a/packages/v2/utils/package.json +++ b/packages/v2/utils/package.json @@ -25,7 +25,7 @@ "dev": "tsdown --tsconfig tsconfig.build.json --watch", "clean": "rimraf ./dist ./coverage ./tsconfig.tsbuildinfo ./tsconfig.build.tsbuildinfo ./.eslintcache", "lint": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --cache --cache-location ../../../.cache/eslint/v2-utils.eslintcache", - "typecheck": "tsc --project ./tsconfig.json --noEmit", + "typecheck": "tsc --project ./tsconfig.typecheck.json --noEmit", "test-unit": "vitest run --silent", "test-unit-cover": "pnpm test-unit --coverage", "fix-all-files": "eslint . --ext .ts,.js,.mjs,.cjs,.mts,.cts --fix" diff --git a/packages/v2/utils/tsconfig.eslint.json b/packages/v2/utils/tsconfig.eslint.json index a2942efa5b..4e5158d4ef 100644 --- a/packages/v2/utils/tsconfig.eslint.json +++ b/packages/v2/utils/tsconfig.eslint.json @@ -2,6 +2,7 @@ "$schema": "https://json.schemastore.org/tsconfig", "extends": "./tsconfig.json", "compilerOptions": { + "composite": false, "noEmit": true, "allowJs": true }, diff --git a/packages/v2/utils/tsconfig.typecheck.json b/packages/v2/utils/tsconfig.typecheck.json new file mode 100644 index 0000000000..6dd5c8fc3b --- /dev/null +++ b/packages/v2/utils/tsconfig.typecheck.json @@ -0,0 +1,22 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "declaration": false, + "declarationDir": null, + "isolatedModules": false, + "noEmit": true + }, + "exclude": [ + "**/node_modules", + "**/.*/", + "./dist", + "./coverage", + "../**/*.spec.ts", + "../**/*.test.ts", + "../**/testkit/**", + "../**/__tests__/**", + "../../**/*.spec.ts", + "../../**/*.test.ts" + ] +} diff --git a/plugins/src/app/sheet-form-view/components/Pages.tsx b/plugins/src/app/sheet-form-view/components/Pages.tsx index f59d3928c2..5a5f57f730 100644 --- a/plugins/src/app/sheet-form-view/components/Pages.tsx +++ b/plugins/src/app/sheet-form-view/components/Pages.tsx @@ -108,17 +108,17 @@ const Container = (props: IPageProps & { uiConfig?: IUIConfig }) => { }, []); if (!baseId && !shareId) { - return
{t('notBaseId')}
; + return
{t('notBaseId')}
; } if (!pluginInstallId) { - return
{t('notPluginInstallId')}
; + return
{t('notPluginInstallId')}
; } if (!pluginBridge && isIframeMode) { return (
-

{t('initBridge')}

+

{t('initBridge')}

); } diff --git a/plugins/src/app/sheet-form-view/components/SharePopover.tsx b/plugins/src/app/sheet-form-view/components/SharePopover.tsx index 97feb77123..d25ccbd996 100644 --- a/plugins/src/app/sheet-form-view/components/SharePopover.tsx +++ b/plugins/src/app/sheet-form-view/components/SharePopover.tsx @@ -148,7 +148,11 @@ export const SharePopover: React.FC<{ -