slifer 0.1.9 → 0.2.0
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.
- package/LICENSE +21 -21
- package/README.md +66 -66
- package/bun.lockb +0 -0
- package/index.ts +3 -3
- package/libs/libSDL2.so +0 -0
- package/libs/libSDL2_image.so +0 -0
- package/libs/libSDL2_ttf.so +0 -0
- package/package.json +14 -14
- package/src/color.ts +15 -0
- package/src/engine/rectangle.ts +25 -0
- package/src/engine/vector.ts +49 -0
- package/src/engine.ts +24 -0
- package/src/ffi.ts +242 -242
- package/src/global.ts +10 -10
- package/src/modules/graphics.ts +210 -176
- package/src/modules/keyboard.ts +79 -79
- package/src/modules/mouse.ts +101 -101
- package/src/slifer.test.ts +8 -0
- package/src/slifer.ts +175 -225
- package/tsconfig.json +28 -28
package/src/modules/mouse.ts
CHANGED
@@ -1,102 +1,102 @@
|
|
1
|
-
import { libsdl } from "../ffi";
|
2
|
-
import { ptr } from 'bun:ffi';
|
3
|
-
|
4
|
-
/** @internal */
|
5
|
-
class Mouse {
|
6
|
-
|
7
|
-
static downKeyMap = new Map<string, boolean>();
|
8
|
-
static pressedKeyMap = new Map<string, boolean>();
|
9
|
-
static releasedKeyMap = new Map<string, boolean>();
|
10
|
-
|
11
|
-
static setButtonDown(button: number) {
|
12
|
-
|
13
|
-
let key : string = '';
|
14
|
-
if (button == 1) {
|
15
|
-
key = "left";
|
16
|
-
} else if (button == 2) {
|
17
|
-
key = "middle";
|
18
|
-
} else {
|
19
|
-
key = "right";
|
20
|
-
}
|
21
|
-
|
22
|
-
this.downKeyMap.set(key, true);
|
23
|
-
this.releasedKeyMap.set(key, false);
|
24
|
-
}
|
25
|
-
|
26
|
-
static setButtonUp(button: number) {
|
27
|
-
|
28
|
-
let key : string = '';
|
29
|
-
if (button == 1) {
|
30
|
-
key = "left";
|
31
|
-
} else if (button == 2) {
|
32
|
-
key = "middle";
|
33
|
-
} else {
|
34
|
-
key = "right";
|
35
|
-
}
|
36
|
-
|
37
|
-
this.downKeyMap.set(key, false);
|
38
|
-
this.pressedKeyMap.set(key, false);
|
39
|
-
}
|
40
|
-
|
41
|
-
/**
|
42
|
-
*
|
43
|
-
* @param button string of button
|
44
|
-
* @returns if the button is being held down
|
45
|
-
*/
|
46
|
-
isDown(button: buttons) {
|
47
|
-
const _state = Mouse.downKeyMap.get(button);
|
48
|
-
if (_state == undefined) return false
|
49
|
-
|
50
|
-
return _state;
|
51
|
-
}
|
52
|
-
|
53
|
-
/**
|
54
|
-
*
|
55
|
-
* @param button string of button
|
56
|
-
* @returns if button is pressed. Returns only once
|
57
|
-
*/
|
58
|
-
isPressed(button: buttons) {
|
59
|
-
const _pressedState = Mouse.pressedKeyMap.get(button);
|
60
|
-
const _downState = Mouse.downKeyMap.get(button);
|
61
|
-
|
62
|
-
if (_downState == true) {
|
63
|
-
if (_pressedState == false || _pressedState == undefined) {
|
64
|
-
Mouse.pressedKeyMap.set(button, true);
|
65
|
-
return true;
|
66
|
-
}
|
67
|
-
}
|
68
|
-
|
69
|
-
return false;
|
70
|
-
}
|
71
|
-
|
72
|
-
/**
|
73
|
-
*
|
74
|
-
* @param button string of button
|
75
|
-
* @returns if button is released. Returns only once
|
76
|
-
*/
|
77
|
-
isReleased(button: buttons) {
|
78
|
-
const _releasedState = Mouse.releasedKeyMap.get(button);
|
79
|
-
const _downState = Mouse.downKeyMap.get(button);
|
80
|
-
|
81
|
-
if (_downState == false) {
|
82
|
-
if (_releasedState == false || undefined) {
|
83
|
-
Mouse.releasedKeyMap.set(button, true);
|
84
|
-
return true;
|
85
|
-
}
|
86
|
-
}
|
87
|
-
|
88
|
-
return false;
|
89
|
-
}
|
90
|
-
|
91
|
-
getPosition() {
|
92
|
-
const xArr = new Uint32Array(1);
|
93
|
-
const yArr = new Uint32Array(1);
|
94
|
-
libsdl.symbols.SDL_GetMouseState(ptr(xArr), ptr(yArr));
|
95
|
-
return {x: xArr[0], y: yArr[0]};
|
96
|
-
}
|
97
|
-
}
|
98
|
-
|
99
|
-
type buttons = 'left' | 'middle' | 'right';
|
100
|
-
|
101
|
-
/** @internal */
|
1
|
+
import { libsdl } from "../ffi";
|
2
|
+
import { ptr } from 'bun:ffi';
|
3
|
+
|
4
|
+
/** @internal */
|
5
|
+
class Mouse {
|
6
|
+
|
7
|
+
static downKeyMap = new Map<string, boolean>();
|
8
|
+
static pressedKeyMap = new Map<string, boolean>();
|
9
|
+
static releasedKeyMap = new Map<string, boolean>();
|
10
|
+
|
11
|
+
static setButtonDown(button: number) {
|
12
|
+
|
13
|
+
let key : string = '';
|
14
|
+
if (button == 1) {
|
15
|
+
key = "left";
|
16
|
+
} else if (button == 2) {
|
17
|
+
key = "middle";
|
18
|
+
} else {
|
19
|
+
key = "right";
|
20
|
+
}
|
21
|
+
|
22
|
+
this.downKeyMap.set(key, true);
|
23
|
+
this.releasedKeyMap.set(key, false);
|
24
|
+
}
|
25
|
+
|
26
|
+
static setButtonUp(button: number) {
|
27
|
+
|
28
|
+
let key : string = '';
|
29
|
+
if (button == 1) {
|
30
|
+
key = "left";
|
31
|
+
} else if (button == 2) {
|
32
|
+
key = "middle";
|
33
|
+
} else {
|
34
|
+
key = "right";
|
35
|
+
}
|
36
|
+
|
37
|
+
this.downKeyMap.set(key, false);
|
38
|
+
this.pressedKeyMap.set(key, false);
|
39
|
+
}
|
40
|
+
|
41
|
+
/**
|
42
|
+
*
|
43
|
+
* @param button string of button
|
44
|
+
* @returns if the button is being held down
|
45
|
+
*/
|
46
|
+
isDown(button: buttons) {
|
47
|
+
const _state = Mouse.downKeyMap.get(button);
|
48
|
+
if (_state == undefined) return false
|
49
|
+
|
50
|
+
return _state;
|
51
|
+
}
|
52
|
+
|
53
|
+
/**
|
54
|
+
*
|
55
|
+
* @param button string of button
|
56
|
+
* @returns if button is pressed. Returns only once
|
57
|
+
*/
|
58
|
+
isPressed(button: buttons) {
|
59
|
+
const _pressedState = Mouse.pressedKeyMap.get(button);
|
60
|
+
const _downState = Mouse.downKeyMap.get(button);
|
61
|
+
|
62
|
+
if (_downState == true) {
|
63
|
+
if (_pressedState == false || _pressedState == undefined) {
|
64
|
+
Mouse.pressedKeyMap.set(button, true);
|
65
|
+
return true;
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
return false;
|
70
|
+
}
|
71
|
+
|
72
|
+
/**
|
73
|
+
*
|
74
|
+
* @param button string of button
|
75
|
+
* @returns if button is released. Returns only once
|
76
|
+
*/
|
77
|
+
isReleased(button: buttons) {
|
78
|
+
const _releasedState = Mouse.releasedKeyMap.get(button);
|
79
|
+
const _downState = Mouse.downKeyMap.get(button);
|
80
|
+
|
81
|
+
if (_downState == false) {
|
82
|
+
if (_releasedState == false || undefined) {
|
83
|
+
Mouse.releasedKeyMap.set(button, true);
|
84
|
+
return true;
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
return false;
|
89
|
+
}
|
90
|
+
|
91
|
+
getPosition() {
|
92
|
+
const xArr = new Uint32Array(1);
|
93
|
+
const yArr = new Uint32Array(1);
|
94
|
+
libsdl.symbols.SDL_GetMouseState(ptr(xArr), ptr(yArr));
|
95
|
+
return {x: xArr[0], y: yArr[0]};
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
type buttons = 'left' | 'middle' | 'right';
|
100
|
+
|
101
|
+
/** @internal */
|
102
102
|
export default Mouse;
|
package/src/slifer.ts
CHANGED
@@ -1,225 +1,175 @@
|
|
1
|
-
import { libimage, libsdl, libttf } from "./ffi";
|
2
|
-
import
|
3
|
-
import
|
4
|
-
import
|
5
|
-
import
|
6
|
-
import
|
7
|
-
import
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
case 1025:
|
177
|
-
const _dbtn = eventArray[8] - 256;
|
178
|
-
Mouse.setButtonDown(_dbtn);
|
179
|
-
break;
|
180
|
-
// Mouse up event
|
181
|
-
case 1026:
|
182
|
-
const _ubtn = eventArray[8];
|
183
|
-
Mouse.setButtonUp(_ubtn);
|
184
|
-
break;
|
185
|
-
}
|
186
|
-
}
|
187
|
-
|
188
|
-
return !this.isRunning;
|
189
|
-
}
|
190
|
-
|
191
|
-
/**
|
192
|
-
* Slifers quit method
|
193
|
-
*/
|
194
|
-
quit() {
|
195
|
-
libttf.symbols.TTF_CloseFont(Global.ptrFont);
|
196
|
-
libsdl.symbols.SDL_DestroyRenderer(Global.ptrRenderer);
|
197
|
-
libsdl.symbols.SDL_DestroyWindow(Global.ptrWindow);
|
198
|
-
libsdl.symbols.SDL_Quit();
|
199
|
-
}
|
200
|
-
|
201
|
-
getVersion() {
|
202
|
-
return version;
|
203
|
-
}
|
204
|
-
}
|
205
|
-
|
206
|
-
export class Rectangle {
|
207
|
-
private readonly pointer;
|
208
|
-
readonly x;
|
209
|
-
readonly y;
|
210
|
-
readonly width;
|
211
|
-
readonly height;
|
212
|
-
|
213
|
-
constructor(x: number, y: number, width: number, height: number) {
|
214
|
-
const arr = new Uint32Array(4);
|
215
|
-
arr[0] = x;
|
216
|
-
arr[1] = y;
|
217
|
-
arr[2] = width;
|
218
|
-
arr[3] = height;
|
219
|
-
this.pointer = ptr(arr);
|
220
|
-
this.x = x;
|
221
|
-
this.y = y;
|
222
|
-
this.width = width;
|
223
|
-
this.height = height;
|
224
|
-
}
|
225
|
-
}
|
1
|
+
import { libimage, libsdl, libttf } from "./ffi";
|
2
|
+
import { initLibraries } from "./engine";
|
3
|
+
import Global from "./global";
|
4
|
+
import { ptr } from "bun:ffi";
|
5
|
+
import Graphics from "./modules/graphics";
|
6
|
+
import Keyboard from "./modules/keyboard";
|
7
|
+
import Mouse from "./modules/mouse";
|
8
|
+
import { version } from "../package.json";
|
9
|
+
|
10
|
+
/** @internal */
|
11
|
+
class Window {
|
12
|
+
public width: number;
|
13
|
+
public height: number;
|
14
|
+
public title: string;
|
15
|
+
|
16
|
+
constructor(title: string, width: number, height: number) {
|
17
|
+
this.width = width;
|
18
|
+
this.height = height;
|
19
|
+
this.title = title;
|
20
|
+
}
|
21
|
+
|
22
|
+
setSize(width: number, height: number): void {
|
23
|
+
libsdl.symbols.SDL_SetWindowSize(Global.ptrWindow, width, height);
|
24
|
+
}
|
25
|
+
|
26
|
+
setTitle(title: string): void {
|
27
|
+
libsdl.symbols.SDL_SetWindowTitle(
|
28
|
+
Global.ptrWindow,
|
29
|
+
Buffer.from(title + "\x00")
|
30
|
+
);
|
31
|
+
}
|
32
|
+
|
33
|
+
setFullscreen(flag: boolean): void {
|
34
|
+
libsdl.symbols.SDL_SetWindowFullscreen(Global.ptrWindow, Number(flag));
|
35
|
+
}
|
36
|
+
|
37
|
+
centerWindow(): void {
|
38
|
+
libsdl.symbols.SDL_SetWindowPosition(
|
39
|
+
Global.ptrWindow,
|
40
|
+
0x2fff0000,
|
41
|
+
0x2fff0000
|
42
|
+
);
|
43
|
+
}
|
44
|
+
|
45
|
+
setPosition(x: number, y: number): void {
|
46
|
+
libsdl.symbols.SDL_SetWindowPosition(Global.ptrWindow, x, y);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
/** @interal */
|
51
|
+
export class SliferClass {
|
52
|
+
private isRunning: boolean = true;
|
53
|
+
private lastFrame: number = 0;
|
54
|
+
private firstFrame: number = 0;
|
55
|
+
|
56
|
+
// Modules
|
57
|
+
Graphics = new Graphics();
|
58
|
+
Keyboard = new Keyboard();
|
59
|
+
Mouse = new Mouse();
|
60
|
+
|
61
|
+
// Public Variables
|
62
|
+
public dt: number = 0;
|
63
|
+
|
64
|
+
constructor() {
|
65
|
+
initLibraries();
|
66
|
+
}
|
67
|
+
|
68
|
+
/**
|
69
|
+
* @param title Title of window
|
70
|
+
* @param width Width of window
|
71
|
+
* @param height Height of window
|
72
|
+
*/
|
73
|
+
createWindow(title: string, width: number, height: number): Window {
|
74
|
+
// Creating cstring buffer from string
|
75
|
+
const _title = Buffer.from(title + "\x00");
|
76
|
+
|
77
|
+
// Creating window pointer
|
78
|
+
const _win = libsdl.symbols.SDL_CreateWindow(
|
79
|
+
_title,
|
80
|
+
0x2fff0000,
|
81
|
+
0x2fff0000,
|
82
|
+
width,
|
83
|
+
height,
|
84
|
+
0
|
85
|
+
);
|
86
|
+
if (_win == null) throw `Window creation failed`;
|
87
|
+
Global.ptrWindow = _win;
|
88
|
+
|
89
|
+
// Creating renderer pointer
|
90
|
+
const vsyncHint = 0x00000004;
|
91
|
+
const _ren = libsdl.symbols.SDL_CreateRenderer(
|
92
|
+
Global.ptrWindow,
|
93
|
+
-1,
|
94
|
+
vsyncHint
|
95
|
+
);
|
96
|
+
if (_ren == null) throw `Renderer Creation failed`;
|
97
|
+
Global.ptrRenderer = _ren;
|
98
|
+
|
99
|
+
this.firstFrame = Number(libsdl.symbols.SDL_GetPerformanceCounter());
|
100
|
+
|
101
|
+
return new Window(title, width, height);
|
102
|
+
}
|
103
|
+
|
104
|
+
/**
|
105
|
+
* @returns if the window should close
|
106
|
+
*/
|
107
|
+
shouldClose(): boolean {
|
108
|
+
// Clear the renderer
|
109
|
+
libsdl.symbols.SDL_RenderClear(Global.ptrRenderer);
|
110
|
+
|
111
|
+
// Setup deltatime
|
112
|
+
this.lastFrame = this.firstFrame;
|
113
|
+
this.firstFrame = Number(libsdl.symbols.SDL_GetPerformanceCounter());
|
114
|
+
|
115
|
+
this.dt =
|
116
|
+
((this.firstFrame - this.lastFrame) * 1000) /
|
117
|
+
Number(libsdl.symbols.SDL_GetPerformanceFrequency());
|
118
|
+
|
119
|
+
// Poll Events
|
120
|
+
const eventArray = new Uint16Array(32);
|
121
|
+
const isEvent = libsdl.symbols.SDL_PollEvent(ptr(eventArray));
|
122
|
+
|
123
|
+
if (isEvent) {
|
124
|
+
switch (eventArray[0]) {
|
125
|
+
// Quit event
|
126
|
+
case 256:
|
127
|
+
this.isRunning = false;
|
128
|
+
break;
|
129
|
+
// Keydown event
|
130
|
+
case 768:
|
131
|
+
const _dscancode = eventArray[8];
|
132
|
+
const _dkey =
|
133
|
+
libsdl.symbols.SDL_GetKeyFromScancode(_dscancode);
|
134
|
+
const _dname = libsdl.symbols.SDL_GetKeyName(_dkey);
|
135
|
+
Keyboard.setKeyDown(_dname.toString().toLowerCase());
|
136
|
+
break;
|
137
|
+
// Keyup event
|
138
|
+
case 769:
|
139
|
+
const _uscancode = eventArray[8];
|
140
|
+
const _ukey =
|
141
|
+
libsdl.symbols.SDL_GetKeyFromScancode(_uscancode);
|
142
|
+
const _uname = libsdl.symbols.SDL_GetKeyName(_ukey);
|
143
|
+
Keyboard.setKeyUp(_uname.toString().toLowerCase());
|
144
|
+
break;
|
145
|
+
// Mouse down event
|
146
|
+
case 1025:
|
147
|
+
const _dbtn = eventArray[8] - 256;
|
148
|
+
Mouse.setButtonDown(_dbtn);
|
149
|
+
break;
|
150
|
+
// Mouse up event
|
151
|
+
case 1026:
|
152
|
+
const _ubtn = eventArray[8];
|
153
|
+
Mouse.setButtonUp(_ubtn);
|
154
|
+
break;
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
158
|
+
return !this.isRunning;
|
159
|
+
}
|
160
|
+
|
161
|
+
/**
|
162
|
+
* Slifers quit method
|
163
|
+
*/
|
164
|
+
quit() {
|
165
|
+
libttf.symbols.TTF_CloseFont(Global.ptrFont);
|
166
|
+
libsdl.symbols.SDL_DestroyRenderer(Global.ptrRenderer);
|
167
|
+
libsdl.symbols.SDL_DestroyWindow(Global.ptrWindow);
|
168
|
+
libsdl.symbols.SDL_Quit();
|
169
|
+
}
|
170
|
+
|
171
|
+
getVersion() {
|
172
|
+
return version;
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
package/tsconfig.json
CHANGED
@@ -1,28 +1,28 @@
|
|
1
|
-
{
|
2
|
-
"compilerOptions": {
|
3
|
-
// Enable latest features
|
4
|
-
"lib": ["ESNext", "DOM"],
|
5
|
-
"target": "ESNext",
|
6
|
-
"module": "ESNext",
|
7
|
-
"moduleDetection": "force",
|
8
|
-
"jsx": "react-jsx",
|
9
|
-
"allowJs": true,
|
10
|
-
|
11
|
-
// Bundler mode
|
12
|
-
"moduleResolution": "bundler",
|
13
|
-
"allowImportingTsExtensions": true,
|
14
|
-
"verbatimModuleSyntax": true,
|
15
|
-
"noEmit": true,
|
16
|
-
|
17
|
-
// Best practices
|
18
|
-
"strict": true,
|
19
|
-
"skipLibCheck": true,
|
20
|
-
"noFallthroughCasesInSwitch": true,
|
21
|
-
"stripInternal": true,
|
22
|
-
|
23
|
-
// Some stricter flags (disabled by default)
|
24
|
-
"noUnusedLocals": false,
|
25
|
-
"noUnusedParameters": false,
|
26
|
-
"noPropertyAccessFromIndexSignature": false
|
27
|
-
}
|
28
|
-
}
|
1
|
+
{
|
2
|
+
"compilerOptions": {
|
3
|
+
// Enable latest features
|
4
|
+
"lib": ["ESNext", "DOM"],
|
5
|
+
"target": "ESNext",
|
6
|
+
"module": "ESNext",
|
7
|
+
"moduleDetection": "force",
|
8
|
+
"jsx": "react-jsx",
|
9
|
+
"allowJs": true,
|
10
|
+
|
11
|
+
// Bundler mode
|
12
|
+
"moduleResolution": "bundler",
|
13
|
+
"allowImportingTsExtensions": true,
|
14
|
+
"verbatimModuleSyntax": true,
|
15
|
+
"noEmit": true,
|
16
|
+
|
17
|
+
// Best practices
|
18
|
+
"strict": true,
|
19
|
+
"skipLibCheck": true,
|
20
|
+
"noFallthroughCasesInSwitch": true,
|
21
|
+
"stripInternal": true,
|
22
|
+
|
23
|
+
// Some stricter flags (disabled by default)
|
24
|
+
"noUnusedLocals": false,
|
25
|
+
"noUnusedParameters": false,
|
26
|
+
"noPropertyAccessFromIndexSignature": false
|
27
|
+
}
|
28
|
+
}
|