@liquidcommercedev/rmn-sdk 1.5.0-beta.41 → 1.5.0-beta.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/dist/index.cjs +505 -201
  2. package/dist/index.esm.js +505 -201
  3. package/dist/types/modules/element/component/spot/spot.component.d.ts +4 -0
  4. package/dist/types/modules/element/element.interface.d.ts +6 -1
  5. package/dist/types/modules/selection/selection.interface.d.ts +7 -0
  6. package/dist/types/modules/spot-template/rb-template.interface.d.ts +75 -48
  7. package/dist/types/modules/spot-template/reservebar/homepage-hero-full-image.template.d.ts +2 -0
  8. package/dist/types/modules/spot-template/reservebar/homepage-hero-three-tile.template.d.ts +2 -0
  9. package/dist/types/modules/spot-template/reservebar/homepage-hero-two-tile.template.d.ts +2 -0
  10. package/dist/types/modules/spot-template/reservebar/large-category-image-tout.template.d.ts +2 -0
  11. package/dist/types/modules/spot-template/reservebar/long-tout-short.template.d.ts +2 -0
  12. package/dist/types/modules/spot-template/reservebar/long-tout-tall.template.d.ts +2 -0
  13. package/dist/types/modules/spot-template/reservebar/navigation-banner.template.d.ts +2 -0
  14. package/dist/types/modules/spot-template/reservebar/small-category-image-tout.template.d.ts +2 -0
  15. package/dist/types/modules/spot-template/reservebar/small-discover-tout.template.d.ts +1 -0
  16. package/dist/types/modules/spot-template/spot-template.constant.d.ts +5 -0
  17. package/dist/types/modules/spot-template/spot-template.interface.d.ts +1 -0
  18. package/dist/types/modules/spot-template/utils.d.ts +2 -0
  19. package/package.json +13 -11
  20. package/umd/liquidcommerce-rmn-sdk.min.js +1 -1
@@ -4,6 +4,8 @@ declare const BaseElement: typeof HTMLElement;
4
4
  export declare abstract class BaseSpotComponent<TData extends ISpotTemplateBaseData = ISpotTemplateBaseData, TConfig extends ICreateSpotConfig = ICreateSpotConfig> extends BaseElement {
5
5
  private initialized;
6
6
  private dataInitialized;
7
+ protected reRenderOnDeviceChange: boolean;
8
+ protected _isMobileDevice: boolean;
7
9
  protected readonly _data: TData;
8
10
  protected readonly _config: TConfig;
9
11
  protected _container: HTMLElement | ShadowRoot;
@@ -11,10 +13,12 @@ export declare abstract class BaseSpotComponent<TData extends ISpotTemplateBaseD
11
13
  initializeData(data: TData, config: TConfig): void;
12
14
  private render;
13
15
  private baseStyles;
16
+ private setupDeviceDetection;
14
17
  protected abstract template(): HTMLElement | string;
15
18
  protected abstract styles(): string;
16
19
  protected connected?(): void;
17
20
  protected disconnected?(): void;
21
+ protected onDeviceChange?(isMobile: boolean): void;
18
22
  connectedCallback(): void;
19
23
  disconnectedCallback(): void;
20
24
  }
@@ -2,7 +2,7 @@ import type { RMN_FILTER_PROPERTIES, RMN_SPOT_TYPE } from 'enums';
2
2
  import type { ICarouselOptions, ICreateCarouselElementParams } from 'modules/element/component/carousel';
3
3
  import type { ICreateSkeletonElementParams } from 'modules/element/component/skeleton';
4
4
  import type { ICreateSpotElementParams } from 'modules/element/component/spot';
5
- import type { RmnFilterType } from 'modules/selection';
5
+ import type { ISpots, RmnFilterType } from 'modules/selection';
6
6
  export interface ISpotColors {
7
7
  textColor?: string;
8
8
  backgroundColor?: string;
@@ -44,6 +44,11 @@ export interface IInjectSpotElementParams {
44
44
  inject: IInjectSpotElement[];
45
45
  config?: IInjectSpotElementConfig;
46
46
  filter?: Partial<RmnFilterType>;
47
+ /**
48
+ * By using this object, the sdk service will not fetch the spots data from the API.
49
+ * Instead, it will use the provided spots data to render the spot elements.
50
+ */
51
+ customSpots?: ISpots;
47
52
  }
48
53
  export interface IElementService {
49
54
  createSpotElement(params: ICreateSpotElementParams): HTMLElement | null;
@@ -27,6 +27,10 @@ export interface ISpot {
27
27
  header?: string;
28
28
  description?: string;
29
29
  ctaText?: string;
30
+ mobilePreHeader?: string;
31
+ mobileHeader?: string;
32
+ mobileDescription?: string;
33
+ mobileCtaText?: string;
30
34
  textBlockPosition?: ENUM_TEXT_BLOCK_POSITION;
31
35
  mobileTextBlockPosition?: ENUM_TEXT_BLOCK_POSITION;
32
36
  textColor?: string;
@@ -37,12 +41,15 @@ export interface ISpot {
37
41
  secondaryImage?: string;
38
42
  mobilePrimaryImage?: string;
39
43
  mobileSecondaryImage?: string;
44
+ enableMobileTexts?: boolean;
40
45
  productIds?: Array<string | number>;
41
46
  video?: {
42
47
  url?: string;
43
48
  poster?: string;
44
49
  posterTitle?: string;
45
50
  posterDescription?: string;
51
+ mobilePosterTitle?: string;
52
+ mobilePosterDescription?: string;
46
53
  autoplay?: boolean;
47
54
  mute?: boolean;
48
55
  loop?: boolean;
@@ -5,25 +5,32 @@ export interface ICollectionBannerWithoutTextBlockRbSpot extends ISpotTemplateBa
5
5
  mobilePrimaryImage?: string;
6
6
  }
7
7
  export interface IHomepageHeroFullImageRbSpot extends ISpotTemplateBaseData {
8
- preHeader: string;
9
- header: string;
10
- description: string;
11
- ctaText: string;
12
- textColor: string;
13
- ctaTextColor: string;
14
- ctaBorderColor: string;
8
+ preHeader?: string;
9
+ header?: string;
10
+ description?: string;
11
+ ctaText?: string;
12
+ mobilePreHeader?: string;
13
+ mobileHeader?: string;
14
+ mobileDescription?: string;
15
+ mobileCtaText?: string;
16
+ textColor?: string;
17
+ ctaTextColor?: string;
18
+ ctaBorderColor?: string;
15
19
  primaryImage: string;
16
20
  mobilePrimaryImage?: string;
17
21
  textBlockPosition?: ENUM_TEXT_BLOCK_POSITION.TOP_LEFT | ENUM_TEXT_BLOCK_POSITION.TOP_RIGHT | ENUM_TEXT_BLOCK_POSITION.BOTTOM_LEFT | ENUM_TEXT_BLOCK_POSITION.BOTTOM_RIGHT | ENUM_TEXT_BLOCK_POSITION.MIDDLE_LEFT | ENUM_TEXT_BLOCK_POSITION.MIDDLE_RIGHT;
18
22
  mobileTextBlockPosition?: ENUM_TEXT_BLOCK_POSITION.TOP_LEFT | ENUM_TEXT_BLOCK_POSITION.TOP_RIGHT | ENUM_TEXT_BLOCK_POSITION.BOTTOM_LEFT | ENUM_TEXT_BLOCK_POSITION.BOTTOM_RIGHT | ENUM_TEXT_BLOCK_POSITION.MIDDLE_LEFT | ENUM_TEXT_BLOCK_POSITION.MIDDLE_RIGHT;
19
23
  }
20
24
  export interface IHomepageHeroThreeTileRbSpot extends ISpotTemplateBaseData {
21
- header: string;
22
- description: string;
23
- ctaText: string;
24
- textColor: string;
25
- backgroundColor: string;
26
- ctaTextColor: string;
25
+ header?: string;
26
+ description?: string;
27
+ ctaText?: string;
28
+ mobileHeader?: string;
29
+ mobileDescription?: string;
30
+ mobileCtaText?: string;
31
+ textColor?: string;
32
+ backgroundColor?: string;
33
+ ctaTextColor?: string;
27
34
  primaryImage: string;
28
35
  mobilePrimaryImage?: string;
29
36
  secondaryImage: string;
@@ -32,12 +39,15 @@ export interface IHomepageHeroThreeTileRbSpot extends ISpotTemplateBaseData {
32
39
  mobileTextBlockPosition?: ENUM_TEXT_BLOCK_POSITION.LEFT | ENUM_TEXT_BLOCK_POSITION.RIGHT;
33
40
  }
34
41
  export interface IHomepageHeroTwoTileRbSpot extends ISpotTemplateBaseData {
35
- header: string;
36
- description: string;
37
- ctaText: string;
38
- textColor: string;
39
- backgroundColor: string;
40
- ctaTextColor: string;
42
+ header?: string;
43
+ description?: string;
44
+ ctaText?: string;
45
+ mobileHeader?: string;
46
+ mobileDescription?: string;
47
+ mobileCtaText?: string;
48
+ textColor?: string;
49
+ backgroundColor?: string;
50
+ ctaTextColor?: string;
41
51
  primaryImage: string;
42
52
  mobilePrimaryImage?: string;
43
53
  textBlockPosition?: ENUM_TEXT_BLOCK_POSITION.LEFT | ENUM_TEXT_BLOCK_POSITION.RIGHT;
@@ -45,58 +55,73 @@ export interface IHomepageHeroTwoTileRbSpot extends ISpotTemplateBaseData {
45
55
  }
46
56
  export interface IInTextRbSpot extends ISpotTemplateBaseData {
47
57
  header: string;
48
- textColor: string;
49
- backgroundColor: string;
58
+ mobileHeader?: string;
59
+ textColor?: string;
60
+ backgroundColor?: string;
50
61
  }
51
62
  export interface ILargeCategoryImageToutRbSpot extends ISpotTemplateBaseData {
52
- header: string;
53
- description: string;
54
- ctaText: string;
55
- textColor: string;
56
- ctaTextColor: string;
57
- ctaBorderColor: string;
63
+ header?: string;
64
+ description?: string;
65
+ ctaText?: string;
66
+ mobileHeader?: string;
67
+ mobileDescription?: string;
68
+ mobileCtaText?: string;
69
+ textColor?: string;
70
+ ctaTextColor?: string;
71
+ ctaBorderColor?: string;
58
72
  primaryImage: string;
59
73
  mobilePrimaryImage?: string;
60
74
  textBlockPosition?: ENUM_TEXT_BLOCK_POSITION.LEFT | ENUM_TEXT_BLOCK_POSITION.RIGHT;
61
75
  }
62
76
  export interface INavigationBannerRbSpot extends ISpotTemplateBaseData {
63
- header: string;
64
- textColor: string;
77
+ header?: string;
78
+ mobileHeader?: string;
79
+ textColor?: string;
65
80
  primaryImage: string;
66
81
  mobilePrimaryImage?: string;
67
82
  }
68
83
  export interface ISmallCategoryImageToutRbSpot extends ISpotTemplateBaseData {
69
- header: string;
70
- textColor: string;
84
+ header?: string;
85
+ mobileHeader?: string;
86
+ textColor?: string;
71
87
  primaryImage: string;
72
88
  mobilePrimaryImage?: string;
73
89
  }
74
90
  export interface ISmallDiscoverToutRbSpot extends ISpotTemplateBaseData {
75
- header: string;
76
- textColor: string;
77
- backgroundColor: string;
91
+ header?: string;
92
+ mobileHeader?: string;
93
+ textColor?: string;
94
+ backgroundColor?: string;
78
95
  primaryImage: string;
79
96
  mobilePrimaryImage?: string;
80
97
  }
81
98
  export interface ILongToutShortRbSpot extends ISpotTemplateBaseData {
82
- preHeader: string;
83
- header: string;
84
- description: string;
85
- ctaText: string;
86
- textColor: string;
87
- ctaTextColor: string;
88
- ctaBorderColor: string;
99
+ preHeader?: string;
100
+ header?: string;
101
+ description?: string;
102
+ ctaText?: string;
103
+ mobilePreHeader?: string;
104
+ mobileHeader?: string;
105
+ mobileDescription?: string;
106
+ mobileCtaText?: string;
107
+ textColor?: string;
108
+ ctaTextColor?: string;
109
+ ctaBorderColor?: string;
89
110
  primaryImage: string;
90
111
  mobilePrimaryImage?: string;
91
112
  }
92
113
  export interface ILongToutTallRbSpot extends ISpotTemplateBaseData {
93
- preHeader: string;
94
- header: string;
95
- description: string;
96
- ctaText: string;
97
- textColor: string;
98
- ctaTextColor: string;
99
- ctaBorderColor: string;
114
+ preHeader?: string;
115
+ header?: string;
116
+ description?: string;
117
+ ctaText?: string;
118
+ mobilePreHeader?: string;
119
+ mobileHeader?: string;
120
+ mobileDescription?: string;
121
+ mobileCtaText?: string;
122
+ textColor?: string;
123
+ ctaTextColor?: string;
124
+ ctaBorderColor?: string;
100
125
  primaryImage: string;
101
126
  mobilePrimaryImage?: string;
102
127
  textBlockPosition?: ENUM_TEXT_BLOCK_POSITION.TOP_LEFT | ENUM_TEXT_BLOCK_POSITION.TOP_RIGHT | ENUM_TEXT_BLOCK_POSITION.BOTTOM_LEFT | ENUM_TEXT_BLOCK_POSITION.BOTTOM_RIGHT | ENUM_TEXT_BLOCK_POSITION.MIDDLE_LEFT | ENUM_TEXT_BLOCK_POSITION.MIDDLE_RIGHT;
@@ -108,6 +133,8 @@ export interface IVideoPlayerRbSpot extends ISpotTemplateBaseData {
108
133
  poster?: string;
109
134
  posterTitle?: string;
110
135
  posterDescription?: string;
136
+ mobilePosterTitle?: string;
137
+ mobilePosterDescription?: string;
111
138
  autoplay?: boolean;
112
139
  mute?: boolean;
113
140
  loop?: boolean;
@@ -1,8 +1,10 @@
1
1
  import { BaseSpotComponent } from 'modules/element/component/spot';
2
2
  import type { IHomepageHeroFullImageRbSpot } from '../rb-template.interface';
3
3
  export declare class RbHomepageHeroFullImageSE extends BaseSpotComponent<IHomepageHeroFullImageRbSpot> {
4
+ protected reRenderOnDeviceChange: boolean;
4
5
  constructor();
5
6
  private getGradientDirection;
6
7
  protected template(): string;
7
8
  protected styles(): string;
9
+ private get hasContent();
8
10
  }
@@ -1,7 +1,9 @@
1
1
  import { BaseSpotComponent } from 'modules/element/component/spot';
2
2
  import type { IHomepageHeroThreeTileRbSpot } from '../rb-template.interface';
3
3
  export declare class RbHomepageHeroThreeTileSE extends BaseSpotComponent<IHomepageHeroThreeTileRbSpot> {
4
+ protected reRenderOnDeviceChange: boolean;
4
5
  constructor();
5
6
  protected template(): string;
6
7
  protected styles(): string;
8
+ private get hasContent();
7
9
  }
@@ -1,7 +1,9 @@
1
1
  import { BaseSpotComponent } from 'modules/element/component/spot';
2
2
  import type { IHomepageHeroTwoTileRbSpot } from '../rb-template.interface';
3
3
  export declare class RbHomepageHeroTwoTileSE extends BaseSpotComponent<IHomepageHeroTwoTileRbSpot> {
4
+ protected reRenderOnDeviceChange: boolean;
4
5
  constructor();
5
6
  protected template(): string;
6
7
  protected styles(): string;
8
+ private get hasContent();
7
9
  }
@@ -1,7 +1,9 @@
1
1
  import { BaseSpotComponent } from 'modules/element/component/spot';
2
2
  import type { ILargeCategoryImageToutRbSpot } from '../rb-template.interface';
3
3
  export declare class RbLargeCategoryImageToutSE extends BaseSpotComponent<ILargeCategoryImageToutRbSpot> {
4
+ protected reRenderOnDeviceChange: boolean;
4
5
  constructor();
5
6
  protected template(): string;
6
7
  protected styles(): string;
8
+ private get hasContent();
7
9
  }
@@ -1,7 +1,9 @@
1
1
  import { BaseSpotComponent } from 'modules/element/component/spot';
2
2
  import type { ILongToutShortRbSpot } from '../rb-template.interface';
3
3
  export declare class RbLongToutShortSE extends BaseSpotComponent<ILongToutShortRbSpot> {
4
+ protected reRenderOnDeviceChange: boolean;
4
5
  constructor();
5
6
  protected template(): string;
6
7
  protected styles(): string;
8
+ private get hasContent();
7
9
  }
@@ -1,8 +1,10 @@
1
1
  import { BaseSpotComponent } from 'modules/element/component/spot';
2
2
  import type { ILongToutTallRbSpot } from '../rb-template.interface';
3
3
  export declare class RbLongToutTallSE extends BaseSpotComponent<ILongToutTallRbSpot> {
4
+ protected reRenderOnDeviceChange: boolean;
4
5
  constructor();
5
6
  private getGradientDirection;
6
7
  protected template(): string;
7
8
  protected styles(): string;
9
+ private get hasContent();
8
10
  }
@@ -1,7 +1,9 @@
1
1
  import { BaseSpotComponent } from 'modules/element/component/spot';
2
2
  import type { INavigationBannerRbSpot } from '../rb-template.interface';
3
3
  export declare class RbNavigationBannerSE extends BaseSpotComponent<INavigationBannerRbSpot> {
4
+ protected reRenderOnDeviceChange: boolean;
4
5
  constructor();
5
6
  protected template(): string;
6
7
  protected styles(): string;
8
+ private get hasContent();
7
9
  }
@@ -1,7 +1,9 @@
1
1
  import { BaseSpotComponent } from 'modules/element/component/spot';
2
2
  import type { ISmallCategoryImageToutRbSpot } from '../rb-template.interface';
3
3
  export declare class RbSmallCategoryImageToutSE extends BaseSpotComponent<ISmallCategoryImageToutRbSpot> {
4
+ protected reRenderOnDeviceChange: boolean;
4
5
  constructor();
5
6
  protected template(): string;
6
7
  protected styles(): string;
8
+ private get hasContent();
7
9
  }
@@ -1,6 +1,7 @@
1
1
  import { BaseSpotComponent } from 'modules/element/component/spot';
2
2
  import type { ISmallDiscoverToutRbSpot } from '../rb-template.interface';
3
3
  export declare class RbSmallDiscoverToutSE extends BaseSpotComponent<ISmallDiscoverToutRbSpot> {
4
+ protected reRenderOnDeviceChange: boolean;
4
5
  constructor();
5
6
  protected template(): string;
6
7
  protected styles(): string;
@@ -1,3 +1,8 @@
1
1
  export declare const GFONT_PRECONNECT = "\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n";
2
2
  export declare const GFONT_SOURCE_SANS_3 = "\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Source+Sans+3:ital,wght@0,200..900;1,200..900&display=swap\">\n";
3
3
  export declare const GFONT_CORMORANT = "\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Cormorant:ital,wght@0,300..700;1,300..700&family=Source+Sans+3:ital,wght@0,200..900;1,200..900&display=swap\">\n";
4
+ export declare const FONTS: {
5
+ readonly preconnect: "\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n";
6
+ readonly sourceSans: "\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Source+Sans+3:ital,wght@0,200..900;1,200..900&display=swap\">\n";
7
+ readonly cormorant: "\n <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Cormorant:ital,wght@0,300..700;1,300..700&family=Source+Sans+3:ital,wght@0,200..900;1,200..900&display=swap\">\n";
8
+ };
@@ -10,4 +10,5 @@ export interface ISpotTemplateBaseData {
10
10
  variant: SpotVariantType;
11
11
  width: number;
12
12
  height: number;
13
+ enableMobileTexts?: boolean;
13
14
  }
@@ -1,3 +1,5 @@
1
1
  import type { ISpotOverlay } from 'types';
2
2
  export declare function convertHexToRgba(hex: string, opacity?: number): string;
3
3
  export declare function generateGradientColor(overlay?: ISpotOverlay, fallback?: string): string;
4
+ export declare function importFonts(...fonts: Array<'sourceSans' | 'cormorant'>): string;
5
+ export declare function renderElement(tag: string, className: string, content?: string): string;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@liquidcommercedev/rmn-sdk",
3
3
  "description": "LiquidCommerce RMN SDK",
4
4
  "author": "LiquidCommerce Tech",
5
- "version": "1.5.0-beta.41",
5
+ "version": "1.5.0-beta.43",
6
6
  "homepage": "https://docs.liquidcommerce.co/rmn-sdk",
7
7
  "main": "./dist/index.cjs",
8
8
  "module": "./dist/index.esm.js",
@@ -41,6 +41,8 @@
41
41
  "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
42
42
  "lint": "eslint \"src/**/*.ts\"",
43
43
  "format": "prettier --write \"src/**/*.ts\"",
44
+ "clean": "rm -rf dist",
45
+ "clean:hard": "rm -rf dist node_modules && pnpm install",
44
46
  "docs": "typedoc --out docs src",
45
47
  "prepublishOnly": "pnpm run build"
46
48
  },
@@ -65,7 +67,7 @@
65
67
  "@commitlint/cli": "^19.6.1",
66
68
  "@commitlint/config-conventional": "^19.6.0",
67
69
  "@eslint/eslintrc": "^3.2.0",
68
- "@eslint/js": "^9.17.0",
70
+ "@eslint/js": "^9.19.0",
69
71
  "@rollup/plugin-commonjs": "^28.0.2",
70
72
  "@rollup/plugin-json": "^6.1.0",
71
73
  "@rollup/plugin-node-resolve": "^15.3.1",
@@ -78,32 +80,32 @@
78
80
  "@types/core-js": "^2.5.8",
79
81
  "@types/crypto-js": "^4.2.2",
80
82
  "@types/eslint__js": "^8.42.3",
81
- "@types/node": "^22.10.2",
82
- "@typescript-eslint/eslint-plugin": "^8.18.1",
83
- "@typescript-eslint/parser": "^8.18.1",
83
+ "@types/node": "^22.10.10",
84
+ "@typescript-eslint/eslint-plugin": "^8.21.0",
85
+ "@typescript-eslint/parser": "^8.21.0",
84
86
  "@vitest/coverage-v8": "^2.1.8",
85
87
  "conventional-changelog-cli": "^5.0.0",
86
88
  "crypto-js": "^4.2.0",
87
- "eslint": "^9.17.0",
89
+ "eslint": "^9.19.0",
88
90
  "eslint-config-prettier": "^9.1.0",
89
91
  "eslint-import-resolver-typescript": "^3.7.0",
90
92
  "eslint-plugin-import": "^2.31.0",
91
93
  "eslint-plugin-import-helpers": "^2.0.1",
92
- "eslint-plugin-prettier": "^5.2.1",
94
+ "eslint-plugin-prettier": "^5.2.3",
93
95
  "eslint-plugin-simple-import-sort": "^12.1.1",
94
96
  "eslint-plugin-sonarjs": "^2.0.4",
95
97
  "eslint-plugin-unicorn": "^56.0.1",
96
98
  "events": "^3.3.0",
97
99
  "prettier": "^3.4.2",
98
100
  "process": "^0.11.10",
99
- "rollup": "^4.28.1",
101
+ "rollup": "^4.32.0",
100
102
  "rollup-plugin-polyfill-node": "^0.13.0",
101
103
  "rollup-plugin-typescript2": "^0.36.0",
102
- "semantic-release": "^24.2.0",
104
+ "semantic-release": "^24.2.1",
103
105
  "ts-node": "^10.9.2",
104
106
  "typedoc": "^0.26.11",
105
- "typescript": "^5.7.2",
106
- "typescript-eslint": "^8.18.1"
107
+ "typescript": "^5.7.3",
108
+ "typescript-eslint": "^8.21.0"
107
109
  },
108
110
  "engines": {
109
111
  "node": ">=20"