From dd4ef527df90ecd9bc93d184cf720f79ad192126 Mon Sep 17 00:00:00 2001 From: Anton Gunnarsson Date: Tue, 3 Jun 2025 14:26:44 +0000 Subject: [PATCH] Merged in chore/eslint9 (pull request #2029) chore: Update to ESLint 9 * wip: apply codemod and upgrade swc plugin * Update eslint to 9 in scandic-web apply code mod to config fix existing lint issues * Remove uneccessary fixupConfigRules * Update eslint to 9 in design-system * Add lint turbo dependency * Move redis-api to eslint and prettier instead of biome * Simplify eslint configs * Clean up * Apply linting Approved-by: Linus Flood --- apps/redis-api/biome.jsonc | 38 - apps/redis-api/eslint.config.mjs | 41 + apps/redis-api/package.json | 16 +- apps/redis-api/src/index.ts | 14 +- .../src/middleware/apiKeyMiddleware.ts | 3 +- apps/redis-api/src/routes/api/cache.ts | 20 +- apps/redis-api/src/routes/api/index.ts | 4 +- apps/redis-api/src/routes/health.ts | 6 +- .../src/server/sentry.server.config.ts | 4 +- apps/redis-api/src/services/redis.ts | 3 +- apps/redis-api/src/shutdown.ts | 2 +- apps/redis-api/src/utils/logger.ts | 48 +- apps/redis-api/src/utils/mask.test.ts | 63 +- apps/scandic-web/.eslintrc.json | 89 -- .../(standard)/alternative-hotels/page.tsx | 6 +- .../hotelreservation/(standard)/page.tsx | 1 - .../HotelPage/Map/StaticMap/index.tsx | 2 - .../components/ContentType/HotelPage/data.tsx | 3 +- .../HotelReservation/utils/index.tsx | 4 +- .../components/Icons/IconByIconName.tsx | 3 +- apps/scandic-web/components/Modal/modal.ts | 2 +- .../SidePeeks/RoomSidePeek/facilityIcon.tsx | 1 - .../TempDesignSystem/Alert/utils.tsx | 4 +- .../TempDesignSystem/Form/RadioCard/types.ts | 3 +- apps/scandic-web/eslint.config.mjs | 106 +++ apps/scandic-web/package.json | 5 +- apps/scandic-web/turbo.json | 3 + .../types/components/overviewTable.ts | 4 +- apps/scandic-web/types/rte/node.ts | 5 +- .../types/transitionTypes/rte/node.ts | 4 +- biome.jsonc | 16 - package.json | 1 + packages/design-system/.eslintrc.cjs | 19 - packages/design-system/.storybook/main.ts | 2 +- packages/design-system/eslint.config.mjs | 40 + packages/design-system/package.json | 5 +- yarn.lock | 765 ++++++++++++------ 37 files changed, 858 insertions(+), 497 deletions(-) delete mode 100644 apps/redis-api/biome.jsonc create mode 100644 apps/redis-api/eslint.config.mjs delete mode 100644 apps/scandic-web/.eslintrc.json create mode 100644 apps/scandic-web/eslint.config.mjs delete mode 100644 biome.jsonc delete mode 100644 packages/design-system/.eslintrc.cjs create mode 100644 packages/design-system/eslint.config.mjs diff --git a/apps/redis-api/biome.jsonc b/apps/redis-api/biome.jsonc deleted file mode 100644 index f222d0ce3..000000000 --- a/apps/redis-api/biome.jsonc +++ /dev/null @@ -1,38 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", - "vcs": { - "enabled": false, - "clientKind": "git", - "useIgnoreFile": true, - }, - "files": { - "ignoreUnknown": false, - "ignore": ["node_modules"], - }, - "formatter": { - "enabled": true, - "indentStyle": "tab", - }, - "organizeImports": { - "enabled": true, - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "performance": { - "noBarrelFile": "error", - }, - "style": { - "useImportType": "error", - "useExportType": "error", - }, - }, - }, - "javascript": { - "formatter": { - "quoteStyle": "double", - "trailingCommas": "all", - }, - }, -} diff --git a/apps/redis-api/eslint.config.mjs b/apps/redis-api/eslint.config.mjs new file mode 100644 index 000000000..0aac54118 --- /dev/null +++ b/apps/redis-api/eslint.config.mjs @@ -0,0 +1,41 @@ +import { FlatCompat } from "@eslint/eslintrc"; +import js from "@eslint/js"; +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; +import { defineConfig } from "eslint/config"; +import simpleImportSort from "eslint-plugin-simple-import-sort"; + +const compat = new FlatCompat({ + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +export default defineConfig([ + { + extends: compat.extends("plugin:@typescript-eslint/recommended"), + plugins: { + "simple-import-sort": simpleImportSort, + "@typescript-eslint": typescriptEslint, + }, + languageOptions: { + parser: tsParser, + }, + rules: { + "no-unused-vars": "off", + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error", + "@typescript-eslint/no-unused-vars": [ + "error", + { + args: "all", + argsIgnorePattern: "^_", + caughtErrors: "all", + caughtErrorsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, + ], + }, + }, +]); diff --git a/apps/redis-api/package.json b/apps/redis-api/package.json index 5146dd58d..07a31e414 100644 --- a/apps/redis-api/package.json +++ b/apps/redis-api/package.json @@ -1,10 +1,11 @@ { - "name": "redis-api", + "name": "@scandic-hotels/redis-api", "module": "index.ts", "type": "module", "private": true, "scripts": { - "dev": "bun --watch src/index.ts | pino-pretty -o '{if module}[{module}] {end}{msg}' -i pid,hostname" + "dev": "bun --watch src/index.ts | pino-pretty -o '{if module}[{module}] {end}{msg}' -i pid,hostname", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0 && tsc" }, "dependencies": { "@elysiajs/server-timing": "^1.3.0", @@ -17,9 +18,18 @@ "pino": "^9.6.0" }, "devDependencies": { - "@biomejs/biome": "^1.9.4", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.26.0", "@types/bun": "latest", + "@typescript-eslint/eslint-plugin": "^8.32.0", + "@typescript-eslint/parser": "^8.32.0", + "eslint": "^9", + "eslint-plugin-simple-import-sort": "^10.0.0", "pino-pretty": "^13.0.0", + "prettier": "^3.5.3", "typescript": "^5.7.2" + }, + "prettier": { + "tabWidth": 4 } } diff --git a/apps/redis-api/src/index.ts b/apps/redis-api/src/index.ts index 6583ecf4e..b97d323c2 100644 --- a/apps/redis-api/src/index.ts +++ b/apps/redis-api/src/index.ts @@ -1,17 +1,17 @@ import "@/server/sentry.server.config"; + +import serverTiming from "@elysiajs/server-timing"; +import { swagger } from "@elysiajs/swagger"; import * as Sentry from "@sentry/bun"; import { Elysia } from "elysia"; -import { swagger } from "@elysiajs/swagger"; -import { apiRoutes } from "@/routes/api"; -import { healthRoutes } from "@/routes/health"; -import { baseLogger } from "@/utils/logger"; import { env } from "@/env"; -import serverTiming from "@elysiajs/server-timing"; import { AuthenticationError } from "@/errors/AuthenticationError"; import { ModelValidationError } from "@/errors/ModelValidationError"; - +import { apiRoutes } from "@/routes/api"; +import { healthRoutes } from "@/routes/health"; import { setupShutdown } from "@/shutdown"; +import { baseLogger } from "@/utils/logger"; setupShutdown(); @@ -48,7 +48,7 @@ if (env.IS_DEV) { version: "1.0.0", }, }, - }) + }), ); } diff --git a/apps/redis-api/src/middleware/apiKeyMiddleware.ts b/apps/redis-api/src/middleware/apiKeyMiddleware.ts index a7eb9c6b6..15bddaaa6 100644 --- a/apps/redis-api/src/middleware/apiKeyMiddleware.ts +++ b/apps/redis-api/src/middleware/apiKeyMiddleware.ts @@ -1,6 +1,7 @@ -import { AuthenticationError } from "@/errors/AuthenticationError"; import type { Context } from "elysia"; + import { env } from "@/env"; +import { AuthenticationError } from "@/errors/AuthenticationError"; const API_KEY_HEADER = "x-api-key"; diff --git a/apps/redis-api/src/routes/api/cache.ts b/apps/redis-api/src/routes/api/cache.ts index 2416f232e..6f88ffbc3 100644 --- a/apps/redis-api/src/routes/api/cache.ts +++ b/apps/redis-api/src/routes/api/cache.ts @@ -1,11 +1,11 @@ import * as Sentry from "@sentry/bun"; - import { Elysia, t } from "elysia"; -import { redis } from "@/services/redis"; + import { ModelValidationError } from "@/errors/ModelValidationError"; +import { redis } from "@/services/redis"; import { loggerModule } from "@/utils/logger"; -import { truncate } from "@/utils/truncate"; import { timeout } from "@/utils/timeout"; +import { truncate } from "@/utils/truncate"; const MIN_LENGTH = 1; @@ -42,7 +42,7 @@ export const cacheRoutes = new Elysia({ prefix: "/cache" }) { query: QUERY_TYPE, response: { 200: t.Object({ data: t.Any() }), 404: t.String() }, - } + }, ) .put( "/", @@ -52,7 +52,7 @@ export const cacheRoutes = new Elysia({ prefix: "/cache" }) if (!body.ttl || body.ttl < 0) { cacheRouteLogger.warn( - `PUT /cache ${key} with ttl=${body.ttl}, will not cache the data` + `PUT /cache ${key} with ttl=${body.ttl}, will not cache the data`, ); return status("Bad Request", "ttl is required"); } @@ -66,14 +66,14 @@ export const cacheRoutes = new Elysia({ prefix: "/cache" }) body: t.Object({ data: t.Any(), ttl: t.Number() }), query: QUERY_TYPE, response: { 204: t.Undefined(), 400: t.String() }, - } + }, ) .delete( "/", async ({ query: { key, fuzzy } }) => { key = validateKey(key); cacheRouteLogger.debug( - `DELETE /cache ${key} ${fuzzy ? "fuzzy" : ""}` + `DELETE /cache ${key} ${fuzzy ? "fuzzy" : ""}`, ); const deletedKeys: number = fuzzy ? await deleteWithPattern(`*${key}*`) @@ -91,7 +91,7 @@ export const cacheRoutes = new Elysia({ prefix: "/cache" }) 200: t.Object({ deletedKeys: t.Number() }), 400: t.String(), }, - } + }, ); function validateKey(key: string) { @@ -99,7 +99,7 @@ function validateKey(key: string) { if (parsedKey.length < MIN_LENGTH) { throw new ModelValidationError( - "Key has to be at least 1 character long" + "Key has to be at least 1 character long", ); } @@ -122,7 +122,7 @@ async function deleteWithPattern(pattern: string) { "MATCH", pattern, "COUNT", - SCAN_SIZE + SCAN_SIZE, ); cursor = newCursor; diff --git a/apps/redis-api/src/routes/api/index.ts b/apps/redis-api/src/routes/api/index.ts index 4fbbcb6f7..b34119e27 100644 --- a/apps/redis-api/src/routes/api/index.ts +++ b/apps/redis-api/src/routes/api/index.ts @@ -1,7 +1,9 @@ import { Elysia } from "elysia"; -import { cacheRoutes } from "./cache"; + import { apiKeyMiddleware } from "@/middleware/apiKeyMiddleware"; +import { cacheRoutes } from "./cache"; + export const apiRoutes = new Elysia({ prefix: "/api" }) .guard({ beforeHandle: apiKeyMiddleware }) .use(cacheRoutes); diff --git a/apps/redis-api/src/routes/health.ts b/apps/redis-api/src/routes/health.ts index 240eb94cb..92a162c6b 100644 --- a/apps/redis-api/src/routes/health.ts +++ b/apps/redis-api/src/routes/health.ts @@ -1,8 +1,8 @@ import Elysia, { t } from "elysia"; -import { redis } from "@/services/redis"; -import { baseLogger, loggerModule } from "@/utils/logger"; import { env } from "@/env"; +import { redis } from "@/services/redis"; +import { baseLogger } from "@/utils/logger"; const healthLogger = baseLogger.child({ module: "health", @@ -52,5 +52,5 @@ export const healthRoutes = new Elysia().get( duration: t.String(), }), }, - } + }, ); diff --git a/apps/redis-api/src/server/sentry.server.config.ts b/apps/redis-api/src/server/sentry.server.config.ts index b0e5714fe..e410507c2 100644 --- a/apps/redis-api/src/server/sentry.server.config.ts +++ b/apps/redis-api/src/server/sentry.server.config.ts @@ -1,7 +1,9 @@ import "@sentry/tracing"; -import { env } from "@/env"; + import * as Sentry from "@sentry/bun"; +import { env } from "@/env"; + Sentry.init({ dsn: env.SENTRY_DSN, enabled: env.SENTRY_ENABLED, diff --git a/apps/redis-api/src/services/redis.ts b/apps/redis-api/src/services/redis.ts index 4ab4ad76f..54f7b280e 100644 --- a/apps/redis-api/src/services/redis.ts +++ b/apps/redis-api/src/services/redis.ts @@ -1,6 +1,7 @@ -import { redisConfig, env } from "@/env"; import ioredis from "ioredis"; +import { env, redisConfig } from "@/env"; + const redis = new ioredis({ host: redisConfig.host, port: redisConfig.port, diff --git a/apps/redis-api/src/shutdown.ts b/apps/redis-api/src/shutdown.ts index 9f9bbcd3e..1783b3984 100644 --- a/apps/redis-api/src/shutdown.ts +++ b/apps/redis-api/src/shutdown.ts @@ -1,5 +1,5 @@ -import { loggerModule } from "@/utils/logger"; import { redis } from "@/services/redis"; +import { loggerModule } from "@/utils/logger"; const shutdownLogger = loggerModule("shutdown"); diff --git a/apps/redis-api/src/utils/logger.ts b/apps/redis-api/src/utils/logger.ts index 4d532b731..25f1eaa4c 100644 --- a/apps/redis-api/src/utils/logger.ts +++ b/apps/redis-api/src/utils/logger.ts @@ -1,34 +1,36 @@ import pino from "pino"; -import { mask } from "./mask"; + import { env } from "@/env"; -const serializers: { [key: string]: pino.SerializerFn } = { - password: (payload) => { - if (payload) { - return env.IS_DEV - ? mask(payload) - : mask(payload, { - visibleStart: 0, - visibleEnd: 0, - }); - } +import { mask } from "./mask"; - return payload; - }, - email: (payload) => { - if (payload) { - return env.IS_DEV ? payload : mask(payload); - } - return payload; - }, +const serializers: { [key: string]: pino.SerializerFn } = { + password: (payload) => { + if (payload) { + return env.IS_DEV + ? mask(payload) + : mask(payload, { + visibleStart: 0, + visibleEnd: 0, + }); + } + + return payload; + }, + email: (payload) => { + if (payload) { + return env.IS_DEV ? payload : mask(payload); + } + return payload; + }, }; export const baseLogger = pino({ - level: process.env.LOG_LEVEL || "info", - timestamp: pino.stdTimeFunctions.isoTime, - serializers, + level: process.env.LOG_LEVEL || "info", + timestamp: pino.stdTimeFunctions.isoTime, + serializers, }); export const loggerModule = (loggerName: string) => { - return baseLogger.child({ module: loggerName }); + return baseLogger.child({ module: loggerName }); }; diff --git a/apps/redis-api/src/utils/mask.test.ts b/apps/redis-api/src/utils/mask.test.ts index 2238f27b1..350d309e6 100644 --- a/apps/redis-api/src/utils/mask.test.ts +++ b/apps/redis-api/src/utils/mask.test.ts @@ -1,42 +1,43 @@ -import { describe, it, expect } from "bun:test"; +import { describe, expect, it } from "bun:test"; + import { mask } from "./mask"; describe("mask", () => { - it("should return empty string for empty input", () => { - expect(mask("")).toBe(""); - }); + it("should return empty string for empty input", () => { + expect(mask("")).toBe(""); + }); - it("should mask string with default parameters", () => { - expect(mask("1234567890")).toBe("12******90"); - }); + it("should mask string with default parameters", () => { + expect(mask("1234567890")).toBe("12******90"); + }); - it("should show custom number of characters at start", () => { - expect(mask("1234567890", { visibleStart: 3 })).toBe("123*****90"); - }); + it("should show custom number of characters at start", () => { + expect(mask("1234567890", { visibleStart: 3 })).toBe("123*****90"); + }); - it("should show custom number of characters at end", () => { - expect(mask("1234567890", { visibleStart: 2, visibleEnd: 3 })).toBe( - "12*****890", - ); - }); + it("should show custom number of characters at end", () => { + expect(mask("1234567890", { visibleStart: 2, visibleEnd: 3 })).toBe( + "12*****890", + ); + }); - it("should mask entire string when visible parts exceed length", () => { - expect(mask("123", { visibleStart: 2, visibleEnd: 2 })).toBe("***"); - }); + it("should mask entire string when visible parts exceed length", () => { + expect(mask("123", { visibleStart: 2, visibleEnd: 2 })).toBe("***"); + }); - it("should handle undefined end part", () => { - expect(mask("1234567890", { visibleStart: 2, visibleEnd: 0 })).toBe( - "12********", - ); - }); + it("should handle undefined end part", () => { + expect(mask("1234567890", { visibleStart: 2, visibleEnd: 0 })).toBe( + "12********", + ); + }); - it("should handle long strings", () => { - expect(mask("12345678901234567890")).toBe("12**********90"); - }); + it("should handle long strings", () => { + expect(mask("12345678901234567890")).toBe("12**********90"); + }); - it("should handle emails", () => { - expect(mask("test.testsson@scandichotels.com")).toBe( - "te*********on@sc*********ls.com", - ); - }); + it("should handle emails", () => { + expect(mask("test.testsson@scandichotels.com")).toBe( + "te*********on@sc*********ls.com", + ); + }); }); diff --git a/apps/scandic-web/.eslintrc.json b/apps/scandic-web/.eslintrc.json deleted file mode 100644 index e4444adab..000000000 --- a/apps/scandic-web/.eslintrc.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "extends": ["next/core-web-vitals", "plugin:import/typescript"], - "plugins": ["simple-import-sort", "@typescript-eslint", "formatjs"], - "parser": "@typescript-eslint/parser", - "rules": { - "no-unused-vars": "off", - "react/function-component-definition": "error", - "simple-import-sort/imports": [ - "error", - { - "groups": [ - // Side effect imports. - ["^\\u0000"], - // Node.js builtins. - ["^node:"], - // NPM packages. - ["^@?\\w"], - // Internal packages. - ["^@scandic-hotels/(?!.*\u0000$).*$"], - // Local imports (lib, constants, etc.), excl. types. - [ - "^@/constants/?(?!.*\u0000$).*$", - "^@/env/?(?!.*\u0000$).*$", - "^@/lib/?(?!.*\u0000$).*$", - "^@/server/?(?!.*\u0000$).*$", - "^@/stores/?(?!.*\u0000$).*$" - ], - // Local imports (the rest), excl. types. - ["^@/(?!(types|.*\u0000$)).*$"], - // Parent imports. Put `..` last. - // Other relative imports. Put same-folder imports and `.` last. - [ - "^\\.\\.(?!/?$)", - "^\\.\\./?$", - "^\\./(?=.*/)(?!/?$)", - "^\\.(?!/?$)", - "^\\./?$" - ], - // Style imports. - ["^(?!\\u0000).+\\.s?css$"], - // Node.js builtins and NPM packages type imports. - ["^node:.*\\u0000$", "^@?\\w.*\\u0000$"], - // Local type imports. - [ - "^@scandichotels/.*\\u0000$", - "^@/types/.*", - "^@/.*\\u0000$", - "^[^.].*\\u0000$", - "^\\..*\\u0000$" - ] - ] - } - ], - "simple-import-sort/exports": "error", - "import/first": "error", - "import/newline-after-import": "error", - "import/no-duplicates": [ - "error", - { - "prefer-inline": true - } - ], - "@typescript-eslint/consistent-type-imports": "error", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "args": "all", - "argsIgnorePattern": "^_", - "caughtErrors": "all", - "caughtErrorsIgnorePattern": "^_", - "destructuredArrayIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "ignoreRestSiblings": true - } - ], - // "formatjs/enforce-description": ["warn", "anything"], - "formatjs/enforce-default-message": ["error", "literal"], - "formatjs/enforce-placeholders": ["error"], - "formatjs/enforce-plural-rules": ["error"], - "formatjs/no-literal-string-in-jsx": ["error"], - "formatjs/no-multiple-whitespaces": ["error"], - "formatjs/no-multiple-plurals": ["error"], - "formatjs/no-invalid-icu": ["error"], - "formatjs/no-id": ["error"], - "formatjs/no-complex-selectors": ["error"], - "formatjs/no-useless-message": ["error"], - "formatjs/prefer-pound-in-plural": ["error"] - } -} diff --git a/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/alternative-hotels/page.tsx b/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/alternative-hotels/page.tsx index 298cf5e89..b29ce22c0 100644 --- a/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/alternative-hotels/page.tsx +++ b/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/alternative-hotels/page.tsx @@ -15,7 +15,11 @@ import { getIntl } from "@/i18n" import { getHotelSearchDetails } from "@/utils/hotelSearchDetails" import { parseSelectHotelSearchParams } from "@/utils/url" -import type { LangParams, NextSearchParams, PageArgs } from "@/types/params" +import { + type LangParams, + type NextSearchParams, + type PageArgs, +} from "@/types/params" export default async function AlternativeHotelsPage( props: PageArgs diff --git a/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/page.tsx b/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/page.tsx index 0ac06cd77..4d5dbf099 100644 --- a/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/page.tsx +++ b/apps/scandic-web/app/[lang]/(live)/(public)/hotelreservation/(standard)/page.tsx @@ -24,7 +24,6 @@ export default async function HotelReservationPage( } return ( - // eslint-disable-next-line formatjs/no-literal-string-in-jsx
diff --git a/apps/scandic-web/components/ContentType/HotelPage/Map/StaticMap/index.tsx b/apps/scandic-web/components/ContentType/HotelPage/Map/StaticMap/index.tsx index e666866c7..828aad84a 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/Map/StaticMap/index.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/Map/StaticMap/index.tsx @@ -1,5 +1,3 @@ -/* eslint-disable @next/next/no-img-element */ - import { env } from "@/env/server" import HotelMarkerByType from "@/components/Maps/Markers" diff --git a/apps/scandic-web/components/ContentType/HotelPage/data.tsx b/apps/scandic-web/components/ContentType/HotelPage/data.tsx index ae953f103..ebe520a25 100644 --- a/apps/scandic-web/components/ContentType/HotelPage/data.tsx +++ b/apps/scandic-web/components/ContentType/HotelPage/data.tsx @@ -6,11 +6,10 @@ import type { NucleoIconProps, } from "@scandic-hotels/design-system/Icons" import type { MaterialIconSetIconProps } from "@scandic-hotels/design-system/Icons/MaterialIcon" +import type { JSX } from "react" import { FacilityEnum } from "@/types/enums/facilities" -import type { JSX } from "react"; - const facilityToIconMap: Record = { [FacilityEnum.AccessibleBathingControls]: IconName.StarFilled, [FacilityEnum.AccessibleBathtubs]: IconName.StarFilled, diff --git a/apps/scandic-web/components/HotelReservation/utils/index.tsx b/apps/scandic-web/components/HotelReservation/utils/index.tsx index 4a00c021a..7366d9e42 100644 --- a/apps/scandic-web/components/HotelReservation/utils/index.tsx +++ b/apps/scandic-web/components/HotelReservation/utils/index.tsx @@ -5,6 +5,8 @@ import { import { ChildBedTypeEnum } from "@/constants/booking" +import type { JSX } from "react" + import { ChildBedMapEnum } from "@/types/components/bookingWidget/enums" import { RoomPackageCodeEnum, @@ -13,8 +15,6 @@ import { import type { Child } from "@/types/components/hotelReservation/selectRate/selectRate" import type { Packages } from "@/types/requests/packages" -import type { JSX } from "react"; - interface IconForFeatureCodeProps { featureCode: RoomPackageCodes } diff --git a/apps/scandic-web/components/Icons/IconByIconName.tsx b/apps/scandic-web/components/Icons/IconByIconName.tsx index 76b878a0f..c3b249610 100644 --- a/apps/scandic-web/components/Icons/IconByIconName.tsx +++ b/apps/scandic-web/components/Icons/IconByIconName.tsx @@ -30,8 +30,7 @@ import type { IconProps, NucleoIconProps, } from "@scandic-hotels/design-system/Icons" - -import type { JSX } from "react"; +import type { JSX } from "react" interface IconByIconNameProps { iconName: IconName | null diff --git a/apps/scandic-web/components/Modal/modal.ts b/apps/scandic-web/components/Modal/modal.ts index eef41378c..0b8492743 100644 --- a/apps/scandic-web/components/Modal/modal.ts +++ b/apps/scandic-web/components/Modal/modal.ts @@ -1,4 +1,4 @@ -import type { Dispatch, SetStateAction, JSX } from "react"; +import type { Dispatch, JSX, SetStateAction } from "react" export enum AnimationStateEnum { unmounted = "unmounted", diff --git a/apps/scandic-web/components/SidePeeks/RoomSidePeek/facilityIcon.tsx b/apps/scandic-web/components/SidePeeks/RoomSidePeek/facilityIcon.tsx index c058e421a..fc5752613 100644 --- a/apps/scandic-web/components/SidePeeks/RoomSidePeek/facilityIcon.tsx +++ b/apps/scandic-web/components/SidePeeks/RoomSidePeek/facilityIcon.tsx @@ -36,7 +36,6 @@ import type { NucleoIconProps, } from "@scandic-hotels/design-system/Icons" import type { MaterialSymbolProps } from "@scandic-hotels/design-system/Icons/MaterialIcon/MaterialSymbol" - import type { JSX } from "react" interface FacilityIconProps { diff --git a/apps/scandic-web/components/TempDesignSystem/Alert/utils.tsx b/apps/scandic-web/components/TempDesignSystem/Alert/utils.tsx index 205d0f53b..c3c9faa27 100644 --- a/apps/scandic-web/components/TempDesignSystem/Alert/utils.tsx +++ b/apps/scandic-web/components/TempDesignSystem/Alert/utils.tsx @@ -3,11 +3,11 @@ import { type MaterialIconSetIconProps, } from "@scandic-hotels/design-system/Icons/MaterialIcon" +import type { JSX } from "react" + import { AlertTypeEnum } from "@/types/enums/alert" import type { AlertProps } from "./alert" -import type { JSX } from "react"; - interface IconByAlertProps { alertType: AlertTypeEnum variant?: AlertProps["variant"] diff --git a/apps/scandic-web/components/TempDesignSystem/Form/RadioCard/types.ts b/apps/scandic-web/components/TempDesignSystem/Form/RadioCard/types.ts index 02feee74d..e28fee7f0 100644 --- a/apps/scandic-web/components/TempDesignSystem/Form/RadioCard/types.ts +++ b/apps/scandic-web/components/TempDesignSystem/Form/RadioCard/types.ts @@ -1,6 +1,5 @@ import type { IconProps } from "@scandic-hotels/design-system/Icons" - -import type { JSX } from "react"; +import type { JSX } from "react" export interface RadioCardProps extends Omit, "title"> { diff --git a/apps/scandic-web/eslint.config.mjs b/apps/scandic-web/eslint.config.mjs new file mode 100644 index 000000000..6b888587d --- /dev/null +++ b/apps/scandic-web/eslint.config.mjs @@ -0,0 +1,106 @@ +import { FlatCompat } from "@eslint/eslintrc" +import js from "@eslint/js" +import typescriptEslint from "@typescript-eslint/eslint-plugin" +import tsParser from "@typescript-eslint/parser" +import { defineConfig } from "eslint/config" +import formatjs from "eslint-plugin-formatjs" +import simpleImportSort from "eslint-plugin-simple-import-sort" + +const compat = new FlatCompat({ + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}) + +export default defineConfig([ + { + extends: compat.extends("next/core-web-vitals", "plugin:import/typescript"), + plugins: { + "simple-import-sort": simpleImportSort, + "@typescript-eslint": typescriptEslint, + formatjs, + }, + + languageOptions: { + parser: tsParser, + }, + + rules: { + "no-unused-vars": "off", + "react/function-component-definition": "error", + + "simple-import-sort/imports": [ + "error", + { + groups: [ + ["^\\u0000"], + ["^node:"], + ["^@?\\w"], + ["^@scandic-hotels/(?!.*\u0000$).*$"], + [ + "^@/constants/?(?!.*\u0000$).*$", + "^@/env/?(?!.*\u0000$).*$", + "^@/lib/?(?!.*\u0000$).*$", + "^@/server/?(?!.*\u0000$).*$", + "^@/stores/?(?!.*\u0000$).*$", + ], + ["^@/(?!(types|.*\u0000$)).*$"], + [ + "^\\.\\.(?!/?$)", + "^\\.\\./?$", + "^\\./(?=.*/)(?!/?$)", + "^\\.(?!/?$)", + "^\\./?$", + ], + ["^(?!\\u0000).+\\.s?css$"], + ["^node:.*\\u0000$", "^@?\\w.*\\u0000$"], + [ + "^@scandichotels/.*\\u0000$", + "^@/types/.*", + "^@/.*\\u0000$", + "^[^.].*\\u0000$", + "^\\..*\\u0000$", + ], + ], + }, + ], + + "simple-import-sort/exports": "error", + "import/first": "error", + "import/newline-after-import": "error", + + "import/no-duplicates": [ + "error", + { + "prefer-inline": true, + }, + ], + + "@typescript-eslint/consistent-type-imports": "error", + + "@typescript-eslint/no-unused-vars": [ + "error", + { + args: "all", + argsIgnorePattern: "^_", + caughtErrors: "all", + caughtErrorsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, + ], + + "formatjs/enforce-default-message": ["error", "literal"], + "formatjs/enforce-placeholders": ["error"], + "formatjs/enforce-plural-rules": ["error"], + "formatjs/no-literal-string-in-jsx": ["error"], + "formatjs/no-multiple-whitespaces": ["error"], + "formatjs/no-multiple-plurals": ["error"], + "formatjs/no-invalid-icu": ["error"], + "formatjs/no-id": ["error"], + "formatjs/no-complex-selectors": ["error"], + "formatjs/no-useless-message": ["error"], + "formatjs/prefer-pound-in-plural": ["error"], + }, + }, +]) diff --git a/apps/scandic-web/package.json b/apps/scandic-web/package.json index 786a45580..7f608ff39 100644 --- a/apps/scandic-web/package.json +++ b/apps/scandic-web/package.json @@ -114,6 +114,9 @@ "zustand": "^4.5.2" }, "devDependencies": { + "@eslint/compat": "^1.2.9", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.26.0", "@formatjs/cli": "^6.7.1", "@lokalise/node-api": "^14.0.0", "@scandic-hotels/typescript-config": "workspace:*", @@ -134,7 +137,7 @@ "adm-zip": "^0.5.16", "cypress": "^14.3.3", "dotenv": "^16.5.0", - "eslint": "^8", + "eslint": "^9", "eslint-config-next": "15.3.2", "eslint-plugin-formatjs": "^5.3.1", "eslint-plugin-import": "^2.31.0", diff --git a/apps/scandic-web/turbo.json b/apps/scandic-web/turbo.json index 821fdd6a9..5b21c691f 100644 --- a/apps/scandic-web/turbo.json +++ b/apps/scandic-web/turbo.json @@ -9,6 +9,9 @@ }, "test": { "dependsOn": ["@scandic-hotels/design-system#build"] + }, + "lint": { + "dependsOn": ["@scandic-hotels/design-system#build"] } } } diff --git a/apps/scandic-web/types/components/overviewTable.ts b/apps/scandic-web/types/components/overviewTable.ts index a5d56f54c..d63f5be51 100644 --- a/apps/scandic-web/types/components/overviewTable.ts +++ b/apps/scandic-web/types/components/overviewTable.ts @@ -1,9 +1,9 @@ +import type { JSX } from "react" + import type { MembershipLevel } from "@/constants/membershipLevels" import type { LoyaltyLevel } from "@/server/routers/contentstack/loyaltyLevel/output" import type { CMSReward } from "../trpc/routers/contentstack/reward" -import type { JSX } from "react"; - export type OverviewTableClientProps = { activeMembership: MembershipLevel | null levels: ComparisonLevel[] diff --git a/apps/scandic-web/types/rte/node.ts b/apps/scandic-web/types/rte/node.ts index 07f3aa5a8..fc1397e0c 100644 --- a/apps/scandic-web/types/rte/node.ts +++ b/apps/scandic-web/types/rte/node.ts @@ -1,4 +1,4 @@ -import { RTETypeEnum } from "./enums" +import type { JSX } from "react" import type { EmbedByUid } from "../components/deprecatedjsontohtml" import type { @@ -8,10 +8,9 @@ import type { RTEImageVaultAttrs, RTELinkAttrs, } from "./attrs" +import type { RTETypeEnum } from "./enums" import type { RenderOptions } from "./option" -import type { JSX } from "react"; - export interface RTEDefaultNode { attrs: Attributes children: RTENode[] diff --git a/apps/scandic-web/types/transitionTypes/rte/node.ts b/apps/scandic-web/types/transitionTypes/rte/node.ts index fcf96449b..c9d02af61 100644 --- a/apps/scandic-web/types/transitionTypes/rte/node.ts +++ b/apps/scandic-web/types/transitionTypes/rte/node.ts @@ -1,3 +1,5 @@ +import type { JSX } from "react" + import type { EmbedByUid } from "../jsontohtml" import type { Attributes, @@ -9,8 +11,6 @@ import type { import type { RTETypeEnum } from "./enums" import type { RenderOptions } from "./option" -import type { JSX } from "react"; - export interface RTEDefaultNode { attrs: Attributes children: RTENode[] diff --git a/biome.jsonc b/biome.jsonc deleted file mode 100644 index 6a7bd8900..000000000 --- a/biome.jsonc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "linter": { - "enabled": false, - "rules": { - "recommended": true, - }, - }, - "overrides": [ - { - "include": ["apps/redis-api/**"], - "linter": { - "enabled": true, - }, - }, - ], -} diff --git a/package.json b/package.json index 7bfe3b448..246a46121 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "packages/*" ], "devDependencies": { + "@eslint/compat": "^1.2.9", "@types/react": "19.1.0", "@types/react-dom": "19.1.0", "husky": "^9.1.7", diff --git a/packages/design-system/.eslintrc.cjs b/packages/design-system/.eslintrc.cjs deleted file mode 100644 index 0c73148e3..000000000 --- a/packages/design-system/.eslintrc.cjs +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - 'plugin:storybook/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/packages/design-system/.storybook/main.ts b/packages/design-system/.storybook/main.ts index c492c0cb8..74b4c6d6b 100644 --- a/packages/design-system/.storybook/main.ts +++ b/packages/design-system/.storybook/main.ts @@ -16,6 +16,6 @@ const config: StorybookConfig = { } export default config -function getAbsolutePath(value: string): any { +function getAbsolutePath(value: string) { return dirname(require.resolve(join(value, 'package.json'))) } diff --git a/packages/design-system/eslint.config.mjs b/packages/design-system/eslint.config.mjs new file mode 100644 index 000000000..1a48ca537 --- /dev/null +++ b/packages/design-system/eslint.config.mjs @@ -0,0 +1,40 @@ +import { defineConfig, globalIgnores } from 'eslint/config' +import globals from 'globals' +import tsParser from '@typescript-eslint/parser' +import reactRefresh from 'eslint-plugin-react-refresh' +import { FlatCompat } from '@eslint/eslintrc' +import js from '@eslint/js' + +const compat = new FlatCompat({ + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}) + +export default defineConfig([ + { + languageOptions: { + globals: { + ...globals.browser, + }, + parser: tsParser, + }, + extends: compat.extends( + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + 'plugin:storybook/recommended' + ), + plugins: { + 'react-refresh': reactRefresh, + }, + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { + allowConstantExport: true, + }, + ], + }, + }, + globalIgnores(['**/dist', '**/.eslintrc.cjs']), +]) diff --git a/packages/design-system/package.json b/packages/design-system/package.json index 7b3e9e147..13f3eceb3 100644 --- a/packages/design-system/package.json +++ b/packages/design-system/package.json @@ -134,6 +134,8 @@ "react-dom": "^19.1.0" }, "devDependencies": { + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.26.0", "@storybook/addon-essentials": "^8.6.12", "@storybook/addon-interactions": "^8.6.12", "@storybook/addon-links": "^8.6.12", @@ -153,11 +155,12 @@ "colord": "^2.9.3", "copy-to-clipboard": "^3.3.3", "deepmerge-ts": "^7.1.5", - "eslint": "^8", + "eslint": "^9", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "eslint-plugin-storybook": "^0.12.0", "glob": "^11.0.2", + "globals": "^16.1.0", "husky": "^9.1.7", "jiti": "^1.21.0", "lint-staged": "^15.5.2", diff --git a/yarn.lock b/yarn.lock index d96df6053..fac8dc7ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1823,97 +1823,6 @@ __metadata: languageName: node linkType: hard -"@biomejs/biome@npm:^1.9.4": - version: 1.9.4 - resolution: "@biomejs/biome@npm:1.9.4" - dependencies: - "@biomejs/cli-darwin-arm64": "npm:1.9.4" - "@biomejs/cli-darwin-x64": "npm:1.9.4" - "@biomejs/cli-linux-arm64": "npm:1.9.4" - "@biomejs/cli-linux-arm64-musl": "npm:1.9.4" - "@biomejs/cli-linux-x64": "npm:1.9.4" - "@biomejs/cli-linux-x64-musl": "npm:1.9.4" - "@biomejs/cli-win32-arm64": "npm:1.9.4" - "@biomejs/cli-win32-x64": "npm:1.9.4" - dependenciesMeta: - "@biomejs/cli-darwin-arm64": - optional: true - "@biomejs/cli-darwin-x64": - optional: true - "@biomejs/cli-linux-arm64": - optional: true - "@biomejs/cli-linux-arm64-musl": - optional: true - "@biomejs/cli-linux-x64": - optional: true - "@biomejs/cli-linux-x64-musl": - optional: true - "@biomejs/cli-win32-arm64": - optional: true - "@biomejs/cli-win32-x64": - optional: true - bin: - biome: bin/biome - checksum: 10c0/b5655c5aed9a6fffe24f7d04f15ba4444389d0e891c9ed9106fab7388ac9b4be63185852cc2a937b22940dac3e550b71032a4afd306925cfea436c33e5646b3e - languageName: node - linkType: hard - -"@biomejs/cli-darwin-arm64@npm:1.9.4": - version: 1.9.4 - resolution: "@biomejs/cli-darwin-arm64@npm:1.9.4" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@biomejs/cli-darwin-x64@npm:1.9.4": - version: 1.9.4 - resolution: "@biomejs/cli-darwin-x64@npm:1.9.4" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@biomejs/cli-linux-arm64-musl@npm:1.9.4": - version: 1.9.4 - resolution: "@biomejs/cli-linux-arm64-musl@npm:1.9.4" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@biomejs/cli-linux-arm64@npm:1.9.4": - version: 1.9.4 - resolution: "@biomejs/cli-linux-arm64@npm:1.9.4" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@biomejs/cli-linux-x64-musl@npm:1.9.4": - version: 1.9.4 - resolution: "@biomejs/cli-linux-x64-musl@npm:1.9.4" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@biomejs/cli-linux-x64@npm:1.9.4": - version: 1.9.4 - resolution: "@biomejs/cli-linux-x64@npm:1.9.4" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@biomejs/cli-win32-arm64@npm:1.9.4": - version: 1.9.4 - resolution: "@biomejs/cli-win32-arm64@npm:1.9.4" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@biomejs/cli-win32-x64@npm:1.9.4": - version: 1.9.4 - resolution: "@biomejs/cli-win32-x64@npm:1.9.4" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@contentstack/live-preview-utils@npm:^3.2.1": version: 3.2.1 resolution: "@contentstack/live-preview-utils@npm:3.2.1" @@ -2235,34 +2144,90 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": version: 4.12.1 resolution: "@eslint-community/regexpp@npm:4.12.1" checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint/compat@npm:^1.2.9": + version: 1.2.9 + resolution: "@eslint/compat@npm:1.2.9" + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true + checksum: 10c0/e912058f1e3847a1eec654c0c040467b676bd48171e915c730c7215f57cf5f4db8508c4a431ccb470f4a000d94559b41c4fe8de3d71f23eb8ae7acf4959e1c06 + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.20.0": + version: 0.20.0 + resolution: "@eslint/config-array@npm:0.20.0" + dependencies: + "@eslint/object-schema": "npm:^2.1.6" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/94bc5d0abb96dc5295ff559925242ff75a54eacfb3576677e95917e42f7175e1c4b87bf039aa2a872f949b4852ad9724bf2f7529aaea6b98f28bb3fca7f1d659 + languageName: node + linkType: hard + +"@eslint/config-helpers@npm:^0.2.1": + version: 0.2.2 + resolution: "@eslint/config-helpers@npm:0.2.2" + checksum: 10c0/98f7cefe484bb754674585d9e73cf1414a3ab4fd0783c385465288d13eb1a8d8e7d7b0611259fc52b76b396c11a13517be5036d1f48eeb877f6f0a6b9c4f03ad + languageName: node + linkType: hard + +"@eslint/core@npm:^0.13.0": + version: 0.13.0 + resolution: "@eslint/core@npm:0.13.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10c0/ba724a7df7ed9dab387481f11d0d0f708180f40be93acce2c21dacca625c5867de3528760c42f1c457ccefe6a669d525ff87b779017eabc0d33479a36300797b + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.3.1": + version: 3.3.1 + resolution: "@eslint/eslintrc@npm:3.3.1" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" ignore: "npm:^5.2.0" import-fresh: "npm:^3.2.1" js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + checksum: 10c0/b0e63f3bc5cce4555f791a4e487bf999173fcf27c65e1ab6e7d63634d8a43b33c3693e79f192cbff486d7df1be8ebb2bd2edc6e70ddd486cbfa84a359a3e3b41 languageName: node linkType: hard -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 +"@eslint/js@npm:9.26.0, @eslint/js@npm:^9.26.0": + version: 9.26.0 + resolution: "@eslint/js@npm:9.26.0" + checksum: 10c0/89fa45b7ff7f3c2589ea1f04a31b4f6d41ad85ecac98e519195e8b3a908b103c892ac19c4aec0629cfeccefd9e5b63c2f1269183d63016e7de722b97a085dcf4 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.6": + version: 2.1.6 + resolution: "@eslint/object-schema@npm:2.1.6" + checksum: 10c0/b8cdb7edea5bc5f6a96173f8d768d3554a628327af536da2fc6967a93b040f2557114d98dbcdbf389d5a7b290985ad6a9ce5babc547f36fc1fde42e674d11a56 + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.2.8": + version: 0.2.8 + resolution: "@eslint/plugin-kit@npm:0.2.8" + dependencies: + "@eslint/core": "npm:^0.13.0" + levn: "npm:^0.4.1" + checksum: 10c0/554847c8f2b6bfe0e634f317fc43d0b54771eea0015c4f844f75915fdb9e6170c830c004291bad57db949d61771732e459f36ed059f45cf750af223f77357c5c languageName: node linkType: hard @@ -2507,14 +2472,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.13.0": - version: 0.13.0 - resolution: "@humanwhocodes/config-array@npm:0.13.0" +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.3" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 languageName: node linkType: hard @@ -2525,10 +2496,17 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.3": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.2": + version: 0.4.3 + resolution: "@humanwhocodes/retry@npm:0.4.3" + checksum: 10c0/3775bb30087d4440b3f7406d5a057777d90e4b9f435af488a4923ef249e93615fb78565a85f173a186a076c7706a81d0d57d563a2624e4de2c5c9c66c486ce42 languageName: node linkType: hard @@ -3356,6 +3334,24 @@ __metadata: languageName: node linkType: hard +"@modelcontextprotocol/sdk@npm:^1.8.0": + version: 1.11.0 + resolution: "@modelcontextprotocol/sdk@npm:1.11.0" + dependencies: + content-type: "npm:^1.0.5" + cors: "npm:^2.8.5" + cross-spawn: "npm:^7.0.3" + eventsource: "npm:^3.0.2" + express: "npm:^5.0.1" + express-rate-limit: "npm:^7.5.0" + pkce-challenge: "npm:^5.0.0" + raw-body: "npm:^3.0.0" + zod: "npm:^3.23.8" + zod-to-json-schema: "npm:^3.24.1" + checksum: 10c0/10ce5ebe54b238df614051e0f2ef8f037fee6ceda7a870f5892c84efe21cbdcdb7e932d9be25e91982e0eb40e4c8ed33da9b0b2ca01df6baa76eb0cd5cb89ce6 + languageName: node + linkType: hard + "@netlify/blobs@npm:^8.1.0": version: 8.1.1 resolution: "@netlify/blobs@npm:8.1.1" @@ -3548,7 +3544,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -6814,6 +6810,8 @@ __metadata: version: 0.0.0-use.local resolution: "@scandic-hotels/design-system@workspace:packages/design-system" dependencies: + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:^9.26.0" "@storybook/addon-essentials": "npm:^8.6.12" "@storybook/addon-interactions": "npm:^8.6.12" "@storybook/addon-links": "npm:^8.6.12" @@ -6833,11 +6831,12 @@ __metadata: colord: "npm:^2.9.3" copy-to-clipboard: "npm:^3.3.3" deepmerge-ts: "npm:^7.1.5" - eslint: "npm:^8" + eslint: "npm:^9" eslint-plugin-react-hooks: "npm:^5.2.0" eslint-plugin-react-refresh: "npm:^0.4.20" eslint-plugin-storybook: "npm:^0.12.0" glob: "npm:^11.0.2" + globals: "npm:^16.1.0" husky: "npm:^9.1.7" jiti: "npm:^1.21.0" lint-staged: "npm:^15.5.2" @@ -6860,6 +6859,31 @@ __metadata: languageName: unknown linkType: soft +"@scandic-hotels/redis-api@workspace:apps/redis-api": + version: 0.0.0-use.local + resolution: "@scandic-hotels/redis-api@workspace:apps/redis-api" + dependencies: + "@elysiajs/server-timing": "npm:^1.3.0" + "@elysiajs/swagger": "npm:^1.3.0" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:^9.26.0" + "@sentry/bun": "npm:^9.15.0" + "@sentry/tracing": "npm:^7.120.3" + "@t3-oss/env-core": "npm:^0.13.0" + "@types/bun": "npm:latest" + "@typescript-eslint/eslint-plugin": "npm:^8.32.0" + "@typescript-eslint/parser": "npm:^8.32.0" + elysia: "npm:^1.3.0" + eslint: "npm:^9" + eslint-plugin-simple-import-sort: "npm:^10.0.0" + ioredis: "npm:^5.6.1" + pino: "npm:^9.6.0" + pino-pretty: "npm:^13.0.0" + prettier: "npm:^3.5.3" + typescript: "npm:^5.7.2" + languageName: unknown + linkType: soft + "@scandic-hotels/scandic-redirect@workspace:apps/scandic-redirect": version: 0.0.0-use.local resolution: "@scandic-hotels/scandic-redirect@workspace:apps/scandic-redirect" @@ -6874,6 +6898,9 @@ __metadata: dependencies: "@azure/monitor-opentelemetry-exporter": "npm:^1.0.0-beta.31" "@contentstack/live-preview-utils": "npm:^3.2.1" + "@eslint/compat": "npm:^1.2.9" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:^9.26.0" "@formatjs/cli": "npm:^6.7.1" "@formatjs/intl": "npm:^3.1.6" "@hookform/error-message": "npm:^2.0.1" @@ -6935,7 +6962,7 @@ __metadata: downshift: "npm:^9.0.9" embla-carousel: "npm:^8.6.0" embla-carousel-react: "npm:^8.6.0" - eslint: "npm:^8" + eslint: "npm:^9" eslint-config-next: "npm:15.3.2" eslint-plugin-formatjs: "npm:^5.3.1" eslint-plugin-import: "npm:^2.31.0" @@ -8734,7 +8761,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.7": +"@types/estree@npm:1.0.7, @types/estree@npm:^1.0.6": version: 1.0.7 resolution: "@types/estree@npm:1.0.7" checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c @@ -8834,7 +8861,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -9469,13 +9496,6 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.3.0 - resolution: "@ungap/structured-clone@npm:1.3.0" - checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a - languageName: node - linkType: hard - "@unhead/schema@npm:^1.11.11, @unhead/schema@npm:^1.9.5": version: 1.11.20 resolution: "@unhead/schema@npm:1.11.20" @@ -9796,6 +9816,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: "npm:^3.0.0" + negotiator: "npm:^1.0.0" + checksum: 10c0/98374742097e140891546076215f90c32644feacf652db48412329de4c2a529178a81aa500fbb13dd3e6cbf6e68d829037b123ac037fc9a08bcec4b87b358eef + languageName: node + linkType: hard + "acorn-globals@npm:^7.0.0": version: 7.0.1 resolution: "acorn-globals@npm:7.0.1" @@ -9833,7 +9863,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.8.1, acorn@npm:^8.9.0": +"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.8.1": version: 8.14.0 resolution: "acorn@npm:8.14.0" bin: @@ -10585,6 +10615,23 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "body-parser@npm:2.2.0" + dependencies: + bytes: "npm:^3.1.2" + content-type: "npm:^1.0.5" + debug: "npm:^4.4.0" + http-errors: "npm:^2.0.0" + iconv-lite: "npm:^0.6.3" + on-finished: "npm:^2.4.1" + qs: "npm:^6.14.0" + raw-body: "npm:^3.0.0" + type-is: "npm:^2.0.0" + checksum: 10c0/a9ded39e71ac9668e2211afa72e82ff86cc5ef94de1250b7d1ba9cc299e4150408aaa5f1e8b03dd4578472a3ce6d1caa2a23b27a6c18e526e48b4595174c116c + languageName: node + linkType: hard + "boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" @@ -10732,7 +10779,7 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2, bytes@npm:^3.0.0": +"bytes@npm:3.1.2, bytes@npm:^3.0.0, bytes@npm:^3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e @@ -11426,6 +11473,15 @@ __metadata: languageName: node linkType: hard +"content-disposition@npm:^1.0.0": + version: 1.0.0 + resolution: "content-disposition@npm:1.0.0" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10c0/c7b1ba0cea2829da0352ebc1b7f14787c73884bc707c8bc2271d9e3bf447b372270d09f5d3980dc5037c749ceef56b9a13fccd0b0001c87c3f12579967e4dd27 + languageName: node + linkType: hard + "content-disposition@npm:~0.5.2": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" @@ -11435,7 +11491,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:^1.0.4": +"content-type@npm:^1.0.4, content-type@npm:^1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af @@ -11463,6 +11519,20 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:^1.2.1": + version: 1.2.2 + resolution: "cookie-signature@npm:1.2.2" + checksum: 10c0/54e05df1a293b3ce81589b27dddc445f462f6fa6812147c033350cd3561a42bc14481674e05ed14c7bd0ce1e8bb3dc0e40851bad75415733711294ddce0b7bc6 + languageName: node + linkType: hard + +"cookie@npm:^0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 + languageName: node + linkType: hard + "cookie@npm:^1.0.2": version: 1.0.2 resolution: "cookie@npm:1.0.2" @@ -11537,6 +11607,16 @@ __metadata: languageName: node linkType: hard +"cors@npm:^2.8.5": + version: 2.8.5 + resolution: "cors@npm:2.8.5" + dependencies: + object-assign: "npm:^4" + vary: "npm:^1" + checksum: 10c0/373702b7999409922da80de4a61938aabba6929aea5b6fd9096fefb9e8342f626c0ebd7507b0e8b0b311380744cc985f27edebc0a26e0ddb784b54e1085de761 + languageName: node + linkType: hard + "cosmiconfig@npm:^8.1.3": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" @@ -11594,7 +11674,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -12456,6 +12536,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:^2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -13048,6 +13135,15 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-simple-import-sort@npm:^10.0.0": + version: 10.0.0 + resolution: "eslint-plugin-simple-import-sort@npm:10.0.0" + peerDependencies: + eslint: ">=5.0.0" + checksum: 10c0/1ae0814d23816d51d010cfbc5ee0a0dde8d825a3093876b2e8219a0562d53f4d4794508551e503ebe2ea98904cb35204dbe54dfbf9d7fc8b8e3ea25c52aa68ac + languageName: node + linkType: hard + "eslint-plugin-simple-import-sort@npm:^12.1.1": version: 12.1.1 resolution: "eslint-plugin-simple-import-sort@npm:12.1.1" @@ -13070,17 +13166,17 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.3.0": + version: 8.3.0 + resolution: "eslint-scope@npm:8.3.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + checksum: 10c0/23bf54345573201fdf06d29efa345ab508b355492f6c6cc9e2b9f6d02b896f369b6dd5315205be94b8853809776c4d13353b85c6b531997b164ff6c3328ecf5b languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 @@ -13094,62 +13190,66 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8": - version: 8.57.1 - resolution: "eslint@npm:8.57.1" +"eslint@npm:^9": + version: 9.26.0 + resolution: "eslint@npm:9.26.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.1" - "@humanwhocodes/config-array": "npm:^0.13.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.20.0" + "@eslint/config-helpers": "npm:^0.2.1" + "@eslint/core": "npm:^0.13.0" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:9.26.0" + "@eslint/plugin-kit": "npm:^0.2.8" + "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" + "@humanwhocodes/retry": "npm:^0.4.2" + "@modelcontextprotocol/sdk": "npm:^1.8.0" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" + cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.3.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" + zod: "npm:^3.24.2" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + checksum: 10c0/fb5ba6ce2b85a6c26c89bc1ca9b34f0ffa2166ba85d3d007a06bb2350151fb665e9a5f99d7f24051a00dc713203b50ece6e724a29fed7b297e432cdc79482fec languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" dependencies: - acorn: "npm:^8.9.0" + acorn: "npm:^8.14.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 languageName: node linkType: hard @@ -13163,7 +13263,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": +"esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -13211,7 +13311,7 @@ __metadata: languageName: node linkType: hard -"etag@npm:^1.3.0": +"etag@npm:^1.3.0, etag@npm:^1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 @@ -13247,6 +13347,22 @@ __metadata: languageName: node linkType: hard +"eventsource-parser@npm:^3.0.1": + version: 3.0.1 + resolution: "eventsource-parser@npm:3.0.1" + checksum: 10c0/146ce5ae8325d07645a49bbc54d7ac3aef42f5138bfbbe83d5cf96293b50eab2219926d6cf41eed0a0f90132578089652ba9286a19297662900133a9da6c2fd0 + languageName: node + linkType: hard + +"eventsource@npm:^3.0.2": + version: 3.0.6 + resolution: "eventsource@npm:3.0.6" + dependencies: + eventsource-parser: "npm:^3.0.1" + checksum: 10c0/074d865ea1c7e29e3243f85a13306e89fca2d775b982dca03fa6bfa75c56827fa89cf1ab9e730db24bd6b104cbdcae074f2b37ba498874e9dd9710fbff4979bb + languageName: node + linkType: hard + "exact-mirror@npm:0.1.1": version: 0.1.1 resolution: "exact-mirror@npm:0.1.1" @@ -13353,6 +13469,50 @@ __metadata: languageName: node linkType: hard +"express-rate-limit@npm:^7.5.0": + version: 7.5.0 + resolution: "express-rate-limit@npm:7.5.0" + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + checksum: 10c0/3e96afa05b4f577395688ede37e0cb19901f20c350b32575fb076f3d25176209fb88d3648151755c232aaf304147c58531f070757978f376e2f08326449299fd + languageName: node + linkType: hard + +"express@npm:^5.0.1": + version: 5.1.0 + resolution: "express@npm:5.1.0" + dependencies: + accepts: "npm:^2.0.0" + body-parser: "npm:^2.2.0" + content-disposition: "npm:^1.0.0" + content-type: "npm:^1.0.5" + cookie: "npm:^0.7.1" + cookie-signature: "npm:^1.2.1" + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + finalhandler: "npm:^2.1.0" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + merge-descriptors: "npm:^2.0.0" + mime-types: "npm:^3.0.0" + on-finished: "npm:^2.4.1" + once: "npm:^1.4.0" + parseurl: "npm:^1.3.3" + proxy-addr: "npm:^2.0.7" + qs: "npm:^6.14.0" + range-parser: "npm:^1.2.1" + router: "npm:^2.2.0" + send: "npm:^1.1.0" + serve-static: "npm:^2.2.0" + statuses: "npm:^2.0.1" + type-is: "npm:^2.0.1" + vary: "npm:^1.1.2" + checksum: 10c0/80ce7c53c5f56887d759b94c3f2283e2e51066c98d4b72a4cc1338e832b77f1e54f30d0239cc10815a0f849bdb753e6a284d2fa48d4ab56faf9c501f55d751d6 + languageName: node + linkType: hard + "extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -13552,12 +13712,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + flat-cache: "npm:^4.0.0" + checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 languageName: node linkType: hard @@ -13579,6 +13739,20 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:^2.1.0": + version: 2.1.0 + resolution: "finalhandler@npm:2.1.0" + dependencies: + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + on-finished: "npm:^2.4.1" + parseurl: "npm:^1.3.3" + statuses: "npm:^2.0.1" + checksum: 10c0/da0bbca6d03873472ee890564eb2183f4ed377f25f3628a0fc9d16dac40bed7b150a0d82ebb77356e4c6d97d2796ad2dba22948b951dddee2c8768b0d1b9fb1f + languageName: node + linkType: hard + "find-replace@npm:^3.0.0": version: 3.0.0 resolution: "find-replace@npm:3.0.0" @@ -13608,14 +13782,13 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: flatted: "npm:^3.2.9" - keyv: "npm:^4.5.3" - rimraf: "npm:^3.0.2" - checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + keyv: "npm:^4.5.4" + checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc languageName: node linkType: hard @@ -13699,6 +13872,13 @@ __metadata: languageName: node linkType: hard +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 + languageName: node + linkType: hard + "framer-motion@npm:^12.10.0": version: 12.10.0 resolution: "framer-motion@npm:12.10.0" @@ -13721,6 +13901,13 @@ __metadata: languageName: node linkType: hard +"fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "fresh@npm:2.0.0" + checksum: 10c0/0557548194cb9a809a435bf92bcfbc20c89e8b5eb38861b73ced36750437251e39a111fc3a18b98531be9dd91fe1411e4969f229dc579ec0251ce6c5d4900bbc + languageName: node + linkType: hard + "fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -14081,12 +14268,17 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d + languageName: node + linkType: hard + +"globals@npm:^16.1.0": + version: 16.1.0 + resolution: "globals@npm:16.1.0" + checksum: 10c0/51df6319b5b9e679338baf058ecf1125af0d3148b97e57592deabd65fca5c5dcdcca321d7589282bd6afbea9f5a40bc7329c746f46d56780813d7d1c457209a2 languageName: node linkType: hard @@ -14372,7 +14564,7 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:2.0.0": +"http-errors@npm:2.0.0, http-errors@npm:^2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" dependencies: @@ -14783,6 +14975,13 @@ __metadata: languageName: node linkType: hard +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a + languageName: node + linkType: hard + "is-arguments@npm:^1.0.4": version: 1.2.0 resolution: "is-arguments@npm:1.2.0" @@ -15057,7 +15256,7 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.2, is-path-inside@npm:^3.0.3": +"is-path-inside@npm:^3.0.2": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 @@ -15085,6 +15284,13 @@ __metadata: languageName: node linkType: hard +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + "is-reference@npm:1.2.1": version: 1.2.1 resolution: "is-reference@npm:1.2.1" @@ -16207,7 +16413,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.0.0, keyv@npm:^4.5.3": +"keyv@npm:^4.0.0, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -17195,6 +17401,13 @@ __metadata: languageName: node linkType: hard +"media-typer@npm:^1.1.0": + version: 1.1.0 + resolution: "media-typer@npm:1.1.0" + checksum: 10c0/7b4baa40b25964bb90e2121ee489ec38642127e48d0cc2b6baa442688d3fde6262bfdca86d6bbf6ba708784afcac168c06840c71facac70e390f5f759ac121b9 + languageName: node + linkType: hard + "memoizerific@npm:^1.11.3": version: 1.11.3 resolution: "memoizerific@npm:1.11.3" @@ -17211,6 +17424,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-descriptors@npm:2.0.0" + checksum: 10c0/95389b7ced3f9b36fbdcf32eb946dc3dd1774c2fdf164609e55b18d03aa499b12bd3aae3a76c1c7185b96279e9803525550d3eb292b5224866060a288f335cb3 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -17256,6 +17476,13 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:^1.54.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 + languageName: node + linkType: hard + "mime-types@npm:^2.1.12, mime-types@npm:^2.1.18, mime-types@npm:~2.1.18, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" @@ -17265,6 +17492,15 @@ __metadata: languageName: node linkType: hard +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": + version: 3.0.1 + resolution: "mime-types@npm:3.0.1" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10c0/bd8c20d3694548089cf229016124f8f40e6a60bbb600161ae13e45f793a2d5bb40f96bbc61f275836696179c77c1d6bf4967b2a75e0a8ad40fe31f4ed5be4da5 + languageName: node + linkType: hard + "mime@npm:^1.4.1": version: 1.6.0 resolution: "mime@npm:1.6.0" @@ -17325,7 +17561,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -17959,7 +18195,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": +"object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -18055,7 +18291,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:^2.3.0": +"on-finished@npm:^2.3.0, on-finished@npm:^2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -18346,7 +18582,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:^1.3.2, parseurl@npm:~1.3.2": +"parseurl@npm:^1.3.2, parseurl@npm:^1.3.3, parseurl@npm:~1.3.2": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 @@ -18431,6 +18667,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^8.0.0": + version: 8.2.0 + resolution: "path-to-regexp@npm:8.2.0" + checksum: 10c0/ef7d0a887b603c0a142fad16ccebdcdc42910f0b14830517c724466ad676107476bba2fe9fffd28fd4c141391ccd42ea426f32bb44c2c82ecaefe10c37b90f5a + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -18665,6 +18908,13 @@ __metadata: languageName: node linkType: hard +"pkce-challenge@npm:^5.0.0": + version: 5.0.0 + resolution: "pkce-challenge@npm:5.0.0" + checksum: 10c0/c6706d627fdbb6f22bf8cc5d60d96d6b6a7bb481399b336a3d3f4e9bfba3e167a2c32f8ec0b5e74be686a0ba3bcc9894865d4c2dd1b91cea4c05dba1f28602c3 + languageName: node + linkType: hard + "pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -19006,6 +19256,16 @@ __metadata: languageName: node linkType: hard +"proxy-addr@npm:^2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 + languageName: node + linkType: hard + "proxy-from-env@npm:1.0.0": version: 1.0.0 resolution: "proxy-from-env@npm:1.0.0" @@ -19152,6 +19412,13 @@ __metadata: languageName: node linkType: hard +"range-parser@npm:^1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 + languageName: node + linkType: hard + "raw-body@npm:^2.3.3": version: 2.5.2 resolution: "raw-body@npm:2.5.2" @@ -19164,6 +19431,18 @@ __metadata: languageName: node linkType: hard +"raw-body@npm:^3.0.0": + version: 3.0.0 + resolution: "raw-body@npm:3.0.0" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.6.3" + unpipe: "npm:1.0.0" + checksum: 10c0/f8daf4b724064a4811d118745a781ca0fb4676298b8adadfd6591155549cfea0a067523cf7dd3baeb1265fecc9ce5dfb2fc788c12c66b85202a336593ece0f87 + languageName: node + linkType: hard + "rc@npm:1.2.8": version: 1.2.8 resolution: "rc@npm:1.2.8" @@ -19587,25 +19866,6 @@ __metadata: languageName: node linkType: hard -"redis-api@workspace:apps/redis-api": - version: 0.0.0-use.local - resolution: "redis-api@workspace:apps/redis-api" - dependencies: - "@biomejs/biome": "npm:^1.9.4" - "@elysiajs/server-timing": "npm:^1.3.0" - "@elysiajs/swagger": "npm:^1.3.0" - "@sentry/bun": "npm:^9.15.0" - "@sentry/tracing": "npm:^7.120.3" - "@t3-oss/env-core": "npm:^0.13.0" - "@types/bun": "npm:latest" - elysia: "npm:^1.3.0" - ioredis: "npm:^5.6.1" - pino: "npm:^9.6.0" - pino-pretty: "npm:^13.0.0" - typescript: "npm:^5.7.2" - languageName: unknown - linkType: soft - "redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": version: 1.2.0 resolution: "redis-errors@npm:1.2.0" @@ -19978,7 +20238,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:3.0.2, rimraf@npm:^3.0.2": +"rimraf@npm:3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -20172,6 +20432,19 @@ __metadata: languageName: node linkType: hard +"router@npm:^2.2.0": + version: 2.2.0 + resolution: "router@npm:2.2.0" + dependencies: + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + is-promise: "npm:^4.0.0" + parseurl: "npm:^1.3.3" + path-to-regexp: "npm:^8.0.0" + checksum: 10c0/3279de7450c8eae2f6e095e9edacbdeec0abb5cb7249c6e719faa0db2dba43574b4fff5892d9220631c9abaff52dd3cad648cfea2aaace845e1a071915ac8867 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -20303,6 +20576,7 @@ __metadata: version: 0.0.0-use.local resolution: "scandic@workspace:." dependencies: + "@eslint/compat": "npm:^1.2.9" "@types/react": "npm:19.1.0" "@types/react-dom": "npm:19.1.0" husky: "npm:^9.1.7" @@ -20378,6 +20652,25 @@ __metadata: languageName: node linkType: hard +"send@npm:^1.1.0, send@npm:^1.2.0": + version: 1.2.0 + resolution: "send@npm:1.2.0" + dependencies: + debug: "npm:^4.3.5" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + mime-types: "npm:^3.0.1" + ms: "npm:^2.1.3" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + statuses: "npm:^2.0.1" + checksum: 10c0/531bcfb5616948d3468d95a1fd0adaeb0c20818ba4a500f439b800ca2117971489e02074ce32796fd64a6772ea3e7235fe0583d8241dbd37a053dc3378eff9a5 + languageName: node + linkType: hard + "serve-index-75lb@npm:^2.0.1": version: 2.0.1 resolution: "serve-index-75lb@npm:2.0.1" @@ -20393,6 +20686,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:^2.2.0": + version: 2.2.0 + resolution: "serve-static@npm:2.2.0" + dependencies: + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + parseurl: "npm:^1.3.3" + send: "npm:^1.2.0" + checksum: 10c0/30e2ed1dbff1984836cfd0c65abf5d3f3f83bcd696c99d2d3c97edbd4e2a3ff4d3f87108a7d713640d290a7b6fe6c15ddcbc61165ab2eaad48ea8d3b52c7f913 + languageName: node + linkType: hard + "server-only@npm:^0.0.1": version: 0.0.1 resolution: "server-only@npm:0.0.1" @@ -20995,7 +21300,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:2.0.1": +"statuses@npm:2.0.1, statuses@npm:^2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 @@ -21525,13 +21830,6 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c - languageName: node - linkType: hard - "thenify-all@npm:^1.0.0": version: 1.6.0 resolution: "thenify-all@npm:1.6.0" @@ -22022,13 +22320,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -22074,6 +22365,17 @@ __metadata: languageName: node linkType: hard +"type-is@npm:^2.0.0, type-is@npm:^2.0.1": + version: 2.0.1 + resolution: "type-is@npm:2.0.1" + dependencies: + content-type: "npm:^1.0.5" + media-typer: "npm:^1.1.0" + mime-types: "npm:^3.0.0" + checksum: 10c0/7f7ec0a060b16880bdad36824ab37c26019454b67d73e8a465ed5a3587440fbe158bc765f0da68344498235c877e7dbbb1600beccc94628ed05599d667951b99 + languageName: node + linkType: hard + "typed-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-buffer@npm:1.0.3" @@ -22573,7 +22875,7 @@ __metadata: languageName: node linkType: hard -"vary@npm:^1.1.2": +"vary@npm:^1, vary@npm:^1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f @@ -23283,6 +23585,15 @@ __metadata: languageName: node linkType: hard +"zod-to-json-schema@npm:^3.24.1": + version: 3.24.5 + resolution: "zod-to-json-schema@npm:3.24.5" + peerDependencies: + zod: ^3.24.1 + checksum: 10c0/0745b94ba53e652d39f262641cdeb2f75d24339fb6076a38ce55bcf53d82dfaea63adf524ebc5f658681005401687f8e9551c4feca7c4c882e123e66091dfb90 + languageName: node + linkType: hard + "zod@npm:^3.23.8": version: 3.24.2 resolution: "zod@npm:3.24.2" @@ -23290,7 +23601,7 @@ __metadata: languageName: node linkType: hard -"zod@npm:^3.24.4": +"zod@npm:^3.24.2, zod@npm:^3.24.4": version: 3.24.4 resolution: "zod@npm:3.24.4" checksum: 10c0/ab3112f017562180a41a0f83d870b333677f7d6b77f106696c56894567051b91154714a088149d8387a4f50806a2520efcb666f108cd384a35c236a191186d91