From 03da1ba1087d47a3a175a89c7e54ebf9f61c19d0 Mon Sep 17 00:00:00 2001 From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Date: Tue, 18 Aug 2026 17:55:26 +0200 Subject: [PATCH] chore: single line block comments (#30852) --- e2e/eslint.config.mjs | 1 + e2e/src/specs/server/api/user.e2e-spec.ts | 4 +- packages/cli/eslint.config.mjs | 1 + server/eslint.config.mjs | 1 + .../system-config.controller.spec.ts | 4 +- server/src/decorators.ts | 20 +--- server/src/dtos/asset-ids.response.dto.ts | 12 +- server/src/dtos/asset-media.dto.ts | 4 +- server/src/dtos/system-config.dto.ts | 4 +- server/src/enum.ts | 104 +++++------------- server/src/middleware/auth.guard.ts | 4 +- server/src/repositories/event.repository.ts | 28 ++--- server/src/repositories/job.repository.ts | 4 +- server/src/repositories/media.repository.ts | 4 +- server/src/repositories/search.repository.ts | 4 +- server/src/schema/tables/memory.table.ts | 12 +- server/src/services/auth.service.ts | 4 +- server/src/services/metadata.service.ts | 4 +- server/src/types.ts | 40 ++----- server/src/utils/asset.util.ts | 4 +- server/src/utils/database.ts | 4 +- server/src/utils/mime-types.ts | 4 +- server/src/utils/workflow.ts | 4 +- server/test/fixtures/media.stub.ts | 4 +- web/eslint.config.js | 1 + web/src/lib/actions/focus.ts | 4 +- .../components/album-page/AlbumsList.svelte | 12 +- .../PhotoSphereViewerAdapter.svelte | 4 +- .../lib/components/timeline/Scrubber.svelte | 48 ++------ web/src/lib/utils/album-utils.ts | 24 +--- web/src/lib/utils/invocationTracker.ts | 8 +- web/src/lib/utils/navigation.ts | 4 +- web/src/params/id.ts | 4 +- .../routes/(user)/places/PlacesList.svelte | 8 +- 34 files changed, 102 insertions(+), 294 deletions(-) diff --git a/e2e/eslint.config.mjs b/e2e/eslint.config.mjs index 3d69d1f503..1e57910b01 100644 --- a/e2e/eslint.config.mjs +++ b/e2e/eslint.config.mjs @@ -45,6 +45,7 @@ export default typescriptEslint.config([ 'unicorn/prefer-promise-with-resolvers': 'off', 'unicorn/no-declarations-before-early-exit': 'off', 'unicorn/prefer-simple-condition-first': 'off', + 'unicorn/single-line-block-comment-style': ['error', 'single-line'], curly: 2, 'prettier/prettier': 0, 'unicorn/name-replacements': 'off', diff --git a/e2e/src/specs/server/api/user.e2e-spec.ts b/e2e/src/specs/server/api/user.e2e-spec.ts index c92246dc4b..0e62672f36 100644 --- a/e2e/src/specs/server/api/user.e2e-spec.ts +++ b/e2e/src/specs/server/api/user.e2e-spec.ts @@ -29,9 +29,7 @@ describe('/users', () => { }); describe('PUT /users/me', () => { - /** - @deprecated - */ + /** @deprecated */ it('should allow a user to change their password (deprecated)', async () => { const user = await getMyUser({ headers: asBearerAuth(nonAdmin.accessToken) }); diff --git a/packages/cli/eslint.config.mjs b/packages/cli/eslint.config.mjs index cd32bf6023..d6f32a9abc 100644 --- a/packages/cli/eslint.config.mjs +++ b/packages/cli/eslint.config.mjs @@ -42,6 +42,7 @@ export default typescriptEslint.config([ 'unicorn/import-style': 'off', 'unicorn/consistent-class-member-order': 'off', 'unicorn/prefer-simple-condition-first': 'off', + 'unicorn/single-line-block-comment-style': ['error', 'single-line'], curly: 2, // prefer the typescript-eslint type-aware version 'unicorn/require-array-sort-compare': 'off', diff --git a/server/eslint.config.mjs b/server/eslint.config.mjs index 949acaf139..241d8fd532 100644 --- a/server/eslint.config.mjs +++ b/server/eslint.config.mjs @@ -51,6 +51,7 @@ export default typescriptEslint.config([ 'unicorn/max-nested-calls': 'off', 'unicorn/no-declarations-before-early-exit': 'off', 'unicorn/no-unreadable-object-destructuring': 'off', + 'unicorn/single-line-block-comment-style': ['error', 'single-line'], // maybe we do want to enable this later. TBD 'unicorn/prefer-await': 'off', 'unicorn/consistent-class-member-order': 'off', diff --git a/server/src/controllers/system-config.controller.spec.ts b/server/src/controllers/system-config.controller.spec.ts index 862a448791..7d40f12583 100644 --- a/server/src/controllers/system-config.controller.spec.ts +++ b/server/src/controllers/system-config.controller.spec.ts @@ -7,9 +7,7 @@ import request from 'supertest'; import { errorDto } from 'test/medium/responses'; import { ControllerContext, controllerSetup, mockBaseService } from 'test/utils'; -/** -Returns a full config that passes Zod validation (required URLs and min lengths). -*/ +/** Returns a full config that passes Zod validation (required URLs and min lengths). */ function validConfig() { const config = _.cloneDeep(defaults) as typeof defaults & { oauth: { mobileRedirectUri: string }; diff --git a/server/src/decorators.ts b/server/src/decorators.ts index 322c6c2d38..b8556be41c 100644 --- a/server/src/decorators.ts +++ b/server/src/decorators.ts @@ -136,24 +136,16 @@ export interface GenerateSqlQueries { export const Telemetry = (options: { enabled?: boolean }) => SetMetadata(MetadataKey.TelemetryEnabled, options?.enabled ?? true); -/** -Decorator to enable versioning/tracking of generated Sql -*/ +/** Decorator to enable versioning/tracking of generated Sql */ export const GenerateSql = (...options: GenerateSqlQueries[]) => SetMetadata(GENERATE_SQL_KEY, options); export type EventConfig = { name: EmitEvent; - /** - handle socket.io server events as well - */ + /** handle socket.io server events as well */ server?: boolean; - /** - lower value has higher priority, defaults to 0 - */ + /** lower value has higher priority, defaults to 0 */ priority?: number; - /** - register events for these workers, defaults to all workers - */ + /** register events for these workers, defaults to all workers */ workers?: ImmichWorker[]; }; export const OnEvent = (config: EventConfig) => SetMetadata(MetadataKey.EventConfig, config); @@ -191,9 +183,7 @@ type HistoryEntry = { }; type DeprecatedOptions = { - /** - replacement operationId - */ + /** replacement operationId */ replacementId?: string; }; diff --git a/server/src/dtos/asset-ids.response.dto.ts b/server/src/dtos/asset-ids.response.dto.ts index 92c73a68cf..e86eee0973 100644 --- a/server/src/dtos/asset-ids.response.dto.ts +++ b/server/src/dtos/asset-ids.response.dto.ts @@ -1,9 +1,7 @@ import { createZodDto } from 'nestjs-zod'; import z from 'zod'; -/** -@deprecated Use `BulkIdResponseDto` instead -*/ +/** @deprecated Use `BulkIdResponseDto` instead */ export enum AssetIdErrorReason { DUPLICATE = 'duplicate', NO_PERMISSION = 'no_permission', @@ -15,9 +13,7 @@ const AssetIdErrorReasonSchema = z .describe('Error reason if failed') .meta({ id: 'AssetIdErrorReason' }); -/** -@deprecated Use `BulkIdResponseDto` instead -*/ +/** @deprecated Use `BulkIdResponseDto` instead */ const AssetIdsResponseSchema = z .object({ assetId: z.uuidv4().describe('Asset ID'), @@ -54,9 +50,7 @@ const BulkIdResponseSchema = z }) .meta({ id: 'BulkIdResponseDto' }); -/** -@deprecated Use `BulkIdResponseDto` instead -*/ +/** @deprecated Use `BulkIdResponseDto` instead */ export class AssetIdsResponseDto extends createZodDto(AssetIdsResponseSchema) {} export class BulkIdsDto extends createZodDto(BulkIdsSchema) {} export class BulkIdResponseDto extends createZodDto(BulkIdResponseSchema) {} diff --git a/server/src/dtos/asset-media.dto.ts b/server/src/dtos/asset-media.dto.ts index 8393d0bce2..c378a7c74d 100644 --- a/server/src/dtos/asset-media.dto.ts +++ b/server/src/dtos/asset-media.dto.ts @@ -40,9 +40,7 @@ const AssetMediaBaseSchema = z.object({ fileModifiedAt: isoDatetimeToDate.describe('File modification date'), duration: z.coerce.number().int().min(0).optional().describe('Duration in milliseconds (for videos)'), filename: z.string().optional().describe('Filename'), - /** - The properties below are added to correctly generate the API docs and client SDKs. Validation should be handled in the controller. - */ + /** The properties below are added to correctly generate the API docs and client SDKs. Validation should be handled in the controller. */ [UploadFieldName.ASSET_DATA]: z.any().describe('Asset file data').meta({ type: 'string', format: 'binary' }), }); diff --git a/server/src/dtos/system-config.dto.ts b/server/src/dtos/system-config.dto.ts index b92445aecb..a50b7abe87 100644 --- a/server/src/dtos/system-config.dto.ts +++ b/server/src/dtos/system-config.dto.ts @@ -23,9 +23,7 @@ import { } from 'src/enum'; import z from 'zod'; -/** -Coerces 'true'/'false' strings to boolean, but also allows booleans. -*/ +/** Coerces 'true'/'false' strings to boolean, but also allows booleans. */ const configBool = z .preprocess((val) => { if (val === 'true') { diff --git a/server/src/enum.ts b/server/src/enum.ts index 1c41da9eb4..e88a9a667c 100644 --- a/server/src/enum.ts +++ b/server/src/enum.ts @@ -45,13 +45,9 @@ export enum AssetType { export const AssetTypeSchema = z.enum(AssetType).describe('Asset type').meta({ id: 'AssetTypeEnum' }); export enum ChecksumAlgorithm { - /** - sha1 checksum of the whole file contents - */ + /** sha1 checksum of the whole file contents */ sha1File = 'sha1', - /** - sha1 checksum of "path:" plus the file path, currently used in external libraries, deprecated - */ + /** sha1 checksum of "path:" plus the file path, currently used in external libraries, deprecated */ sha1Path = 'sha1-path', } @@ -89,9 +85,7 @@ export enum AssetOrderBy { export const AssetOrderBySchema = z.enum(AssetOrderBy).describe('Asset sorting property').meta({ id: 'AssetOrderBy' }); export enum MemoryType { - /** - pictures taken on this day X years ago - */ + /** pictures taken on this day X years ago */ OnThisDay = 'on_this_day', } @@ -101,9 +95,7 @@ export enum AssetOrderWithRandom { // Include existing values Asc = AssetOrder.Asc, Desc = AssetOrder.Desc, - /** - Randomly Ordered - */ + /** Randomly Ordered */ Random = 'random', } @@ -650,9 +642,7 @@ export enum ExifOrientation { Rotate270CW = 8, } -/** -ITU-T H.273 colour primaries codes. -*/ +/** ITU-T H.273 colour primaries codes. */ export enum ColorPrimaries { Reserved = 0, Bt709 = 1, @@ -669,9 +659,7 @@ export enum ColorPrimaries { Ebu3213 = 22, } -/** -ITU-T H.273 transfer characteristics codes. -*/ +/** ITU-T H.273 transfer characteristics codes. */ export enum ColorTransfer { Reserved = 0, Bt709 = 1, @@ -693,9 +681,7 @@ export enum ColorTransfer { AribStdB67 = 18, } -/** -ITU-T H.273 matrix coefficients codes. -*/ +/** ITU-T H.273 matrix coefficients codes. */ export enum ColorMatrix { Gbr = 0, Bt709 = 1, @@ -714,9 +700,7 @@ export enum ColorMatrix { Ictcp = 14, } -/** -H.264 `profile_idc` values. -*/ +/** H.264 `profile_idc` values. */ // H.264 has a few profiles that have the same value but different names, included so lookup by name works export enum H264Profile { ConstrainedBaseline = 66, @@ -734,9 +718,7 @@ export enum H264Profile { High444Predictive = 244, } -/** -HEVC `profile_idc` values. -*/ +/** HEVC `profile_idc` values. */ export enum HevcProfile { Main = 1, Main10 = 2, @@ -744,18 +726,14 @@ export enum HevcProfile { Rext = 4, } -/** -AV1 `seq_profile` values. -*/ +/** AV1 `seq_profile` values. */ export enum Av1Profile { Main = 0, High = 1, Professional = 2, } -/** -MPEG-4 Audio Object Type values for AAC. -*/ +/** MPEG-4 Audio Object Type values for AAC. */ export enum AacProfile { Main = 1, Lc = 2, @@ -768,9 +746,7 @@ export enum AacProfile { XheAac = 42, } -/** -Dolby Vision bitstream profile numbers from the DOVI configuration record. -*/ +/** Dolby Vision bitstream profile numbers from the DOVI configuration record. */ export enum DvProfile { Dvhe03 = 3, Dvhe04 = 4, @@ -946,21 +922,13 @@ export const JobNameSchema = z.enum(JobName).describe('Job name').meta({ id: 'Jo export enum QueueCommand { Start = 'start', - /** - @deprecated Use `updateQueue` instead - */ + /** @deprecated Use `updateQueue` instead */ Pause = 'pause', - /** - @deprecated Use `updateQueue` instead - */ + /** @deprecated Use `updateQueue` instead */ Resume = 'resume', - /** - @deprecated Use `emptyQueue` instead - */ + /** @deprecated Use `emptyQueue` instead */ Empty = 'empty', - /** - @deprecated Use `emptyQueue` instead - */ + /** @deprecated Use `emptyQueue` instead */ ClearFailed = 'clear-failed', } @@ -1025,15 +993,11 @@ export enum SyncRequestType { AlbumsV2 = 'AlbumsV2', AlbumUsersV1 = 'AlbumUsersV1', AlbumToAssetsV1 = 'AlbumToAssetsV1', - /** - @deprecated - */ + /** @deprecated */ AlbumAssetsV1 = 'AlbumAssetsV1', AlbumAssetsV2 = 'AlbumAssetsV2', AlbumAssetExifsV1 = 'AlbumAssetExifsV1', - /** - @deprecated - */ + /** @deprecated */ AssetsV1 = 'AssetsV1', AssetsV2 = 'AssetsV2', AssetExifsV1 = 'AssetExifsV1', @@ -1044,9 +1008,7 @@ export enum SyncRequestType { MemoriesV1 = 'MemoriesV1', MemoryToAssetsV1 = 'MemoryToAssetsV1', PartnersV1 = 'PartnersV1', - /** - @deprecated - */ + /** @deprecated */ PartnerAssetsV1 = 'PartnerAssetsV1', PartnerAssetsV2 = 'PartnerAssetsV2', PartnerAssetExifsV1 = 'PartnerAssetExifsV1', @@ -1054,9 +1016,7 @@ export enum SyncRequestType { StacksV1 = 'StacksV1', UsersV1 = 'UsersV1', PeopleV1 = 'PeopleV1', - /** - @deprecated - */ + /** @deprecated */ AssetFacesV1 = 'AssetFacesV1', AssetFacesV2 = 'AssetFacesV2', UserMetadataV1 = 'UserMetadataV1', @@ -1073,9 +1033,7 @@ export enum SyncEntityType { UserV1 = 'UserV1', UserDeleteV1 = 'UserDeleteV1', - /** - @deprecated - */ + /** @deprecated */ AssetV1 = 'AssetV1', AssetV2 = 'AssetV2', AssetDeleteV1 = 'AssetDeleteV1', @@ -1090,14 +1048,10 @@ export enum SyncEntityType { PartnerV1 = 'PartnerV1', PartnerDeleteV1 = 'PartnerDeleteV1', - /** - @deprecated - */ + /** @deprecated */ PartnerAssetV1 = 'PartnerAssetV1', PartnerAssetV2 = 'PartnerAssetV2', - /** - @deprecated - */ + /** @deprecated */ PartnerAssetBackfillV1 = 'PartnerAssetBackfillV1', PartnerAssetBackfillV2 = 'PartnerAssetBackfillV2', PartnerAssetDeleteV1 = 'PartnerAssetDeleteV1', @@ -1115,19 +1069,13 @@ export enum SyncEntityType { AlbumUserBackfillV1 = 'AlbumUserBackfillV1', AlbumUserDeleteV1 = 'AlbumUserDeleteV1', - /** - @deprecated - */ + /** @deprecated */ AlbumAssetCreateV1 = 'AlbumAssetCreateV1', AlbumAssetCreateV2 = 'AlbumAssetCreateV2', - /** - @deprecated - */ + /** @deprecated */ AlbumAssetUpdateV1 = 'AlbumAssetUpdateV1', AlbumAssetUpdateV2 = 'AlbumAssetUpdateV2', - /** - @deprecated - */ + /** @deprecated */ AlbumAssetBackfillV1 = 'AlbumAssetBackfillV1', AlbumAssetBackfillV2 = 'AlbumAssetBackfillV2', AlbumAssetExifCreateV1 = 'AlbumAssetExifCreateV1', diff --git a/server/src/middleware/auth.guard.ts b/server/src/middleware/auth.guard.ts index 2a1f30220d..93bcfe26e7 100644 --- a/server/src/middleware/auth.guard.ts +++ b/server/src/middleware/auth.guard.ts @@ -25,9 +25,7 @@ export type AuthenticatedOptions = AuthorizedRoute | PublicRoute; type ReflectorTarget = Parameters[1]; -/** -Resolves the `@Authenticated()` options of a route handler, with the defaults applied. -*/ +/** Resolves the `@Authenticated()` options of a route handler, with the defaults applied. */ export const getAuthenticatedOptions = (reflector: Reflector, target: ReflectorTarget) => { const options = reflector.getAllAndOverride(MetadataKey.AuthRoute, [target]); return options && { sharedLink: false, admin: false, public: false, setup: false, ...options }; diff --git a/server/src/repositories/event.repository.ts b/server/src/repositories/event.repository.ts index ab83cdaf04..7fedc4eb3a 100644 --- a/server/src/repositories/event.repository.ts +++ b/server/src/repositories/event.repository.ts @@ -56,25 +56,15 @@ type EventMap = { AssetDeleteAll: [{ assetIds: string[]; userId: string }]; AssetRestoreAll: [{ assetIds: string[]; userId: string }]; - /** - a worker receives a job and emits this event to run it - */ + /** a worker receives a job and emits this event to run it */ JobRun: [QueueName, JobItem]; - /** - job pre-hook - */ + /** job pre-hook */ JobStart: [QueueName, JobItem]; - /** - job post-hook - */ + /** job post-hook */ JobComplete: [QueueName, JobItem]; - /** - job finishes without error - */ + /** job finishes without error */ JobSuccess: [JobSuccessEvent]; - /** - job finishes with error - */ + /** job finishes with error */ JobError: [JobErrorEvent]; // queue events @@ -94,13 +84,9 @@ type EventMap = { // user events UserSignup: [{ notify: boolean; id: string; password?: string }]; UserCreate: [UserEvent]; - /** - user is soft deleted - */ + /** user is soft deleted */ UserTrash: [UserEvent]; - /** - user is permanently deleted - */ + /** user is permanently deleted */ UserDelete: [UserEvent]; UserRestore: [UserEvent]; diff --git a/server/src/repositories/job.repository.ts b/server/src/repositories/job.repository.ts index 8902556eac..e925bd5030 100644 --- a/server/src/repositories/job.repository.ts +++ b/server/src/repositories/job.repository.ts @@ -287,9 +287,7 @@ export class JobRepository { return this.moduleRef.get(getQueueToken(queue), { strict: false }); } - /** - @deprecated - */ + /** @deprecated */ // todo: remove this when asset notifications no longer need it. public async removeJob(name: JobName, jobID: string): Promise { const existingJob = await this.getQueue(this.getQueueName(name)).getJob(jobID); diff --git a/server/src/repositories/media.repository.ts b/server/src/repositories/media.repository.ts index 6b9fa757ce..c1e8cfd234 100644 --- a/server/src/repositories/media.repository.ts +++ b/server/src/repositories/media.repository.ts @@ -464,9 +464,7 @@ export class MediaRepository { return value ? ((enumObj[pascalCase(value)] as Extract | undefined) ?? null) : null; } - /** - Parse a rational like "60000/1001" or "1/600" into `{ num, den }`. - */ + /** Parse a rational like "60000/1001" or "1/600" into `{ num, den }`. */ private parseRational(value: string | undefined): { num: number; den: number } | null { if (value) { const [num, den = 1] = value.split('/').map(Number); diff --git a/server/src/repositories/search.repository.ts b/server/src/repositories/search.repository.ts index 8db06f7557..4bde10f165 100644 --- a/server/src/repositories/search.repository.ts +++ b/server/src/repositories/search.repository.ts @@ -135,9 +135,7 @@ export type AssetSearchBuilderOptions = Omit; - /** - unless set to true, will be automatically deleted in the future - */ + /** unless set to true, will be automatically deleted in the future */ @Column({ type: 'boolean', default: false }) isSaved!: Generated; - /** - memories are sorted in ascending order by this value - */ + /** memories are sorted in ascending order by this value */ @Column({ type: 'timestamp with time zone' }) memoryAt!: Timestamp; - /** - when the user last viewed the memory - */ + /** when the user last viewed the memory */ @Column({ type: 'timestamp with time zone', nullable: true }) seenAt!: Timestamp | null; diff --git a/server/src/services/auth.service.ts b/server/src/services/auth.service.ts index 379f0d64fb..5603819212 100644 --- a/server/src/services/auth.service.ts +++ b/server/src/services/auth.service.ts @@ -48,9 +48,7 @@ export type ValidateRequest = { metadata: { sharedLinkRoute: boolean; adminRoute: boolean; - /** - `false` explicitly means no permission is required, which otherwise defaults to `all` - */ + /** `false` explicitly means no permission is required, which otherwise defaults to `all` */ permission?: Permission | false; uri: string; }; diff --git a/server/src/services/metadata.service.ts b/server/src/services/metadata.service.ts index 983ad62be5..a95d1f1497 100644 --- a/server/src/services/metadata.service.ts +++ b/server/src/services/metadata.service.ts @@ -42,9 +42,7 @@ import { Tasks } from 'src/utils/tasks'; const POSTGRES_INT_MAX = 2_147_483_647; const POSTGRES_INT_MIN = -2_147_483_648; -/** -look for a date from these tags (in order) -*/ +/** look for a date from these tags (in order) */ const EXIF_DATE_TAGS: Array = [ 'SubSecDateTimeOriginal', 'SubSecCreateDate', diff --git a/server/src/types.ts b/server/src/types.ts index 7cb1cd34a2..d31841ffd3 100644 --- a/server/src/types.ts +++ b/server/src/types.ts @@ -105,33 +105,19 @@ export interface AudioStreamInfo { bitrate: number; } -/** -Packet-derived video data needed for accurate HLS playlists. -*/ +/** Packet-derived video data needed for accurate HLS playlists. */ export interface VideoPacketInfo { - /** - Sum of source packet duration across all packets (includes discard). - */ + /** Sum of source packet duration across all packets (includes discard). */ totalDuration: number; - /** - Post-discard packet count. - */ + /** Post-discard packet count. */ packetCount: number; - /** - Output CFR frame count at `packetCount / format.duration`. - */ + /** Output CFR frame count at `packetCount / format.duration`. */ outputFrames: number; - /** - All keyframe PTS in source ticks, including pre-roll discard keyframes. - */ + /** All keyframe PTS in source ticks, including pre-roll discard keyframes. */ keyframePts: number[]; - /** - Cumulative packet duration through each keyframe, inclusive. - */ + /** Cumulative packet duration through each keyframe, inclusive. */ keyframeAccDuration: number[]; - /** - Each keyframe's own packet duration (needed for VFR). - */ + /** Each keyframe's own packet duration (needed for VFR). */ keyframeOwnDuration: number[]; } @@ -224,9 +210,7 @@ export interface IBaseJob { } export interface IDelayedJob extends IBaseJob { - /** - The minimum time to wait to execute this job, in milliseconds. - */ + /** The minimum time to wait to execute this job, in milliseconds. */ delay?: number; } @@ -468,9 +452,7 @@ export interface ExtensionVersion { export interface ImmichFile extends Express.Multer.File { uuid: string; - /** - sha1 hash of file - */ + /** sha1 hash of file */ checksum: Buffer; } @@ -540,9 +522,7 @@ export type SystemFlags = { mountChecks: Record }; export type MaintenanceModeState = { isMaintenanceMode: true; secret: string; action?: SetMaintenanceModeDto } | { isMaintenanceMode: false }; export type MemoriesState = { - /** - memories have already been created through this date - */ + /** memories have already been created through this date */ lastOnThisDayDate: string; }; export type MediaLocation = { location: string }; diff --git a/server/src/utils/asset.util.ts b/server/src/utils/asset.util.ts index 04270781af..5420e60361 100644 --- a/server/src/utils/asset.util.ts +++ b/server/src/utils/asset.util.ts @@ -113,9 +113,7 @@ export const removeAssets = async ( export type PartnerIdOptions = { userId: string; repository: PartnerRepository; - /** - only include partners with `inTimeline: true` - */ + /** only include partners with `inTimeline: true` */ timelineEnabled?: boolean; }; export const getMyPartnerIds = async ({ userId, repository, timelineEnabled }: PartnerIdOptions) => { diff --git a/server/src/utils/database.ts b/server/src/utils/database.ts index 74e38fad89..5122b0a9d4 100644 --- a/server/src/utils/database.ts +++ b/server/src/utils/database.ts @@ -391,9 +391,7 @@ export function withEdits(eb: ExpressionBuilder): AliasedEditAction } const joinDeduplicationPlugin = new DeduplicateJoinsPlugin(); -/** -TODO: This should only be used for search-related queries, not as a general purpose query builder -*/ +/** TODO: This should only be used for search-related queries, not as a general purpose query builder */ export function searchAssetBuilderLegacy(kysely: Kysely, options: AssetSearchBuilderOptions) { options.withDeleted ||= !!(options.trashedAfter || options.trashedBefore || options.isOffline); diff --git a/server/src/utils/mime-types.ts b/server/src/utils/mime-types.ts index f5a39b4733..bb5e7be95b 100644 --- a/server/src/utils/mime-types.ts +++ b/server/src/utils/mime-types.ts @@ -164,9 +164,7 @@ export const mimeTypes = { transparentCapableExtensions.has(getFilenameExtension(filename).toLowerCase()), isRaw: (filename: string) => isType(filename, raw), lookup, - /** - return an extension (including a leading `.`) for a mime-type - */ + /** return an extension (including a leading `.`) for a mime-type */ toExtension, assetType: (filename: string) => { const contentType = lookup(filename); diff --git a/server/src/utils/workflow.ts b/server/src/utils/workflow.ts index a2517381c4..a3a9d56c42 100644 --- a/server/src/utils/workflow.ts +++ b/server/src/utils/workflow.ts @@ -12,9 +12,7 @@ export const triggerMap: Record = { export const getWorkflowTriggers = () => Object.entries(triggerMap).map(([trigger, types]) => ({ trigger: trigger as WorkflowTrigger, types })); -/** -some types extend other types and have implied compatibility -*/ +/** some types extend other types and have implied compatibility */ const inferredMap: Record = { [WorkflowType.AssetV1]: [], // [WorkflowType.AssetPersonV1]: [WorkflowType.AssetV1], diff --git a/server/test/fixtures/media.stub.ts b/server/test/fixtures/media.stub.ts index 6f20b0a427..4421a09801 100644 --- a/server/test/fixtures/media.stub.ts +++ b/server/test/fixtures/media.stub.ts @@ -48,9 +48,7 @@ const probeStubDefault: VideoInfo = { audioStreams: probeStubDefaultAudioStream, }; -/** -Fixtures in the shape `mediaRepository.probe()` returns (arrays of streams, raw ffprobe format). -*/ +/** Fixtures in the shape `mediaRepository.probe()` returns (arrays of streams, raw ffprobe format). */ export const videoInfoStub = { noVideoStreams: Object.freeze({ ...probeStubDefault, videoStreams: [] }), noAudioStreams: Object.freeze({ ...probeStubDefault, audioStreams: [] }), diff --git a/web/eslint.config.js b/web/eslint.config.js index f7fd82d751..c7075db443 100644 --- a/web/eslint.config.js +++ b/web/eslint.config.js @@ -146,6 +146,7 @@ export default typescriptEslint.config( 'unicorn/prefer-minimal-ternary': 'off', 'unicorn/no-empty-file': 'off', 'unicorn/prefer-simple-condition-first': 'off', + 'unicorn/single-line-block-comment-style': ['error', 'single-line'], // prefer the typescript-eslint type-aware version 'unicorn/require-array-sort-compare': 'off', '@typescript-eslint/require-array-sort-compare': 'error', diff --git a/web/src/lib/actions/focus.ts b/web/src/lib/actions/focus.ts index 3b2d70dbbf..3b6049f247 100644 --- a/web/src/lib/actions/focus.ts +++ b/web/src/lib/actions/focus.ts @@ -1,6 +1,4 @@ -/** -Focus the given element when it is mounted. -*/ +/** Focus the given element when it is mounted. */ export const initInput = (element: HTMLInputElement) => { element.focus(); }; diff --git a/web/src/lib/components/album-page/AlbumsList.svelte b/web/src/lib/components/album-page/AlbumsList.svelte index 318e501b9d..69ba212c19 100644 --- a/web/src/lib/components/album-page/AlbumsList.svelte +++ b/web/src/lib/components/album-page/AlbumsList.svelte @@ -55,9 +55,7 @@ } const groupOptions: AlbumGroupOption = { - /** - No grouping - */ + /** No grouping */ [AlbumGroupBy.None]: (order, albums): AlbumGroup[] => { return [ { @@ -68,9 +66,7 @@ ]; }, - /** - Group by year - */ + /** Group by year */ [AlbumGroupBy.Year]: (order, albums): AlbumGroup[] => { const unknownYear = $t('unknown_year'); const useStartDate = userSettings.sortBy === AlbumSortBy.OldestPhoto; @@ -96,9 +92,7 @@ })); }, - /** - Group by owner - */ + /** Group by owner */ [AlbumGroupBy.Owner]: (order, albums): AlbumGroup[] => { const currentUserId = authManager.user.id; const groupedByOwnerIds = groupBy(albums, (album) => album.albumUsers[0].user.id); diff --git a/web/src/lib/components/asset-viewer/PhotoSphereViewerAdapter.svelte b/web/src/lib/components/asset-viewer/PhotoSphereViewerAdapter.svelte index 76dedff6c5..a98418d65a 100644 --- a/web/src/lib/components/asset-viewer/PhotoSphereViewerAdapter.svelte +++ b/web/src/lib/components/asset-viewer/PhotoSphereViewerAdapter.svelte @@ -108,9 +108,7 @@ updateOcrBoxes(ocrManager.showOverlay, ocrManager.data); }); - /** - Use updateOnly=true on zoom, pan, or resize. - */ + /** Use updateOnly=true on zoom, pan, or resize. */ const updateOcrBoxes = (showOverlay: boolean, ocrData: OcrBoundingBox[], updateOnly = false) => { if (!viewer || !viewer.state.textureData || !viewer.getPlugin(MarkersPlugin)) { return; diff --git a/web/src/lib/components/timeline/Scrubber.svelte b/web/src/lib/components/timeline/Scrubber.svelte index bdac1823da..67ec87ff7d 100644 --- a/web/src/lib/components/timeline/Scrubber.svelte +++ b/web/src/lib/components/timeline/Scrubber.svelte @@ -11,54 +11,30 @@ import { fade, fly } from 'svelte/transition'; interface Props { - /** - Offset from the top of the timeline (e.g., for headers) - */ + /** Offset from the top of the timeline (e.g., for headers) */ timelineTopOffset?: number; - /** - Offset from the bottom of the timeline (e.g., for footers) - */ + /** Offset from the bottom of the timeline (e.g., for footers) */ timelineBottomOffset?: number; - /** - Total height of the scrubber component - */ + /** Total height of the scrubber component */ height?: number; - /** - Timeline manager instance that controls the timeline state - */ + /** Timeline manager instance that controls the timeline state */ timelineManager: TimelineManager; - /** - Overall scroll percentage through the entire timeline (0-1), used when no specific month is targeted - */ + /** Overall scroll percentage through the entire timeline (0-1), used when no specific month is targeted */ timelineScrollPercent?: number; - /** - The percentage of scroll through the month that is currently intersecting the top boundary of the viewport - */ + /** The percentage of scroll through the month that is currently intersecting the top boundary of the viewport */ viewportTopMonthScrollPercent?: number; - /** - The year/month of the timeline month at the top of the viewport - */ + /** The year/month of the timeline month at the top of the viewport */ viewportTopMonth?: ViewportTopMonth; - /** - Width of the scrubber component in pixels (bindable for parent component margin adjustments) - */ + /** Width of the scrubber component in pixels (bindable for parent component margin adjustments) */ scrubberWidth?: number; - /** - Callback fired when user interacts with the scrubber to navigate - */ + /** Callback fired when user interacts with the scrubber to navigate */ onScrub?: ScrubberListener; - /** - Callback fired when keyboard events occur on the scrubber - */ + /** Callback fired when keyboard events occur on the scrubber */ onScrubKeyDown?: (event: KeyboardEvent, element: HTMLElement) => void; - /** - Callback fired when scrubbing starts - */ + /** Callback fired when scrubbing starts */ startScrub?: ScrubberListener; - /** - Callback fired when scrubbing stops - */ + /** Callback fired when scrubbing stops */ stopScrub?: ScrubberListener; } diff --git a/web/src/lib/utils/album-utils.ts b/web/src/lib/utils/album-utils.ts index cfd090818c..97546f0b00 100644 --- a/web/src/lib/utils/album-utils.ts +++ b/web/src/lib/utils/album-utils.ts @@ -223,46 +223,34 @@ export const stringToSortOrder = (order: string) => { }; const sortOptions: AlbumSortOption = { - /** - Sort by album title - */ + /** Sort by album title */ [AlbumSortBy.Title]: (order, albums) => { const sortSign = order === SortOrder.Desc ? -1 : 1; return albums.slice().sort((a, b) => a.albumName.localeCompare(b.albumName, get(locale)) * sortSign); }, - /** - Sort by asset count - */ + /** Sort by asset count */ [AlbumSortBy.ItemCount]: (order, albums) => { return orderBy(albums, 'assetCount', [order]); }, - /** - Sort by last modified - */ + /** Sort by last modified */ [AlbumSortBy.DateModified]: (order, albums) => { return orderBy(albums, [({ updatedAt }) => new Date(updatedAt)], [order]); }, - /** - Sort by creation date - */ + /** Sort by creation date */ [AlbumSortBy.DateCreated]: (order, albums) => { return orderBy(albums, [({ createdAt }) => new Date(createdAt)], [order]); }, - /** - Sort by the most recent photo date - */ + /** Sort by the most recent photo date */ [AlbumSortBy.MostRecentPhoto]: (order, albums) => { albums = orderBy(albums, [({ endDate }) => (endDate ? new Date(endDate) : '')], [order]); return albums.sort(sortUnknownYearAlbums); }, - /** - Sort by the oldest photo date - */ + /** Sort by the oldest photo date */ [AlbumSortBy.OldestPhoto]: (order, albums) => { albums = orderBy(albums, [({ startDate }) => (startDate ? new Date(startDate) : '')], [order]); return albums.sort(sortUnknownYearAlbums); diff --git a/web/src/lib/utils/invocationTracker.ts b/web/src/lib/utils/invocationTracker.ts index 9f2501be83..ada3b12d0e 100644 --- a/web/src/lib/utils/invocationTracker.ts +++ b/web/src/lib/utils/invocationTracker.ts @@ -6,13 +6,9 @@ import { handleError } from '$lib/utils/handle-error'; * and allowing operations to check if they're still valid. */ export class InvocationTracker { - /** - Counter for the number of invocations that have been started - */ + /** Counter for the number of invocations that have been started */ invocationsStarted = 0; - /** - Counter for the number of invocations that have been completed - */ + /** Counter for the number of invocations that have been completed */ invocationsEnded = 0; constructor() {} diff --git a/web/src/lib/utils/navigation.ts b/web/src/lib/utils/navigation.ts index 22678fd5fa..9bba61d915 100644 --- a/web/src/lib/utils/navigation.ts +++ b/web/src/lib/utils/navigation.ts @@ -92,9 +92,7 @@ interface AssetGridRoute extends Route { type ImmichRoute = AssetRoute | AssetGridRoute; type NavOptions = { - /* - navigate even if url is the same - */ + /* navigate even if url is the same */ forceNavigate?: boolean | undefined; replaceState?: boolean | undefined; noScroll?: boolean | undefined; diff --git a/web/src/params/id.ts b/web/src/params/id.ts index 73e8eec866..440d4532a9 100644 --- a/web/src/params/id.ts +++ b/web/src/params/id.ts @@ -1,9 +1,7 @@ import type { ParamMatcher } from '@sveltejs/kit'; import { UUID_REGEX } from '$lib/constants'; -/* -Returns true if the given param matches UUID format -*/ +/* Returns true if the given param matches UUID format */ export const match: ParamMatcher = (param: string) => { return UUID_REGEX.test(param); }; diff --git a/web/src/routes/(user)/places/PlacesList.svelte b/web/src/routes/(user)/places/PlacesList.svelte index 7ac9b287ba..2f2dfed9ca 100644 --- a/web/src/routes/(user)/places/PlacesList.svelte +++ b/web/src/routes/(user)/places/PlacesList.svelte @@ -33,9 +33,7 @@ } const groupOptions: PlacesGroupOption = { - /** - No grouping - */ + /** No grouping */ [PlacesGroupBy.None]: (places): PlacesGroup[] => { return [ { @@ -46,9 +44,7 @@ ]; }, - /** - Group by year - */ + /** Group by year */ [PlacesGroupBy.Country]: (places): PlacesGroup[] => { const unknownCountry = $t('unknown_country');