@cap-js/cds-types 0.0.1

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.
@@ -0,0 +1,391 @@
1
+ import { SELECT, INSERT, UPDATE, DELETE, Query, ConstructedQuery, UPSERT } from './ql'
2
+ import { Awaitable } from './ql'
3
+ import { ArrayConstructable, Constructable } from './internal/inference'
4
+ import { LinkedCSN, LinkedDefinition, Definitions, LinkedEntity } from './linked'
5
+ import { CSN } from './csn'
6
+ import { EventContext } from './events'
7
+ import { Request } from './events'
8
+
9
+ export class QueryAPI {
10
+
11
+ entities : LinkedCSN['entities']
12
+
13
+ /**
14
+ * @see [docs](https://cap.cloud.sap/docs/node.js/core-services#crud-style-api)
15
+ */
16
+ read: {
17
+ <T extends ArrayConstructable<any>>(entity: T, key?: any): Awaitable<SELECT<T>, InstanceType<T>>
18
+ <T>(entity: LinkedDefinition | string, key?: any): SELECT<T>
19
+ }
20
+
21
+ /**
22
+ * @see [docs](https://cap.cloud.sap/docs/node.js/core-services#crud-style-api)
23
+ */
24
+ create: {
25
+ <T extends ArrayConstructable<any>>(entity: T, key?: any): INSERT<T>
26
+ <T>(entity: LinkedDefinition | string, key?: any): INSERT<T>
27
+ }
28
+
29
+ /**
30
+ * @see [docs](https://cap.cloud.sap/docs/node.js/core-services#crud-style-api)
31
+ */
32
+ insert: {
33
+ <T extends ArrayConstructable<any>>(data: T): INSERT<T>
34
+ <T>(data: object | object[]): INSERT<T>
35
+ }
36
+
37
+ /**
38
+ * @see [docs](https://cap.cloud.sap/docs/node.js/core-services#crud-style-api)
39
+ */
40
+ upsert: {
41
+ <T extends ArrayConstructable<any>>(data: T): UPSERT<T>
42
+ <T>(data: object | object[]): UPSERT<T>
43
+ }
44
+
45
+ /**
46
+ * @see [docs](https://cap.cloud.sap/docs/node.js/core-services#crud-style-api)
47
+ */
48
+ update: {
49
+ <T extends ArrayConstructable<any>>(entity: T, key?: any): UPDATE<T>
50
+ <T>(entity: LinkedDefinition | string, key?: any): UPDATE<T>
51
+ }
52
+
53
+ /**
54
+ * @see [docs](https://cap.cloud.sap/docs/node.js/core-services#crud-style-api)
55
+ */
56
+ run: {
57
+ (query: ConstructedQuery | ConstructedQuery[]): Promise<ResultSet | any>
58
+ (query: Query): Promise<ResultSet | any>
59
+ (query: string, args?: any[] | object): Promise<ResultSet | any>
60
+ }
61
+
62
+ /**
63
+ * @see [docs](https://cap.cloud.sap/docs/node.js/core-services#crud-style-api)
64
+ */
65
+ delete<T>(entity: LinkedDefinition | string, key?: any): DELETE<T>
66
+
67
+ /**
68
+ * @see [docs](https://cap.cloud.sap/docs/node.js/core-services#srv-foreach-entity)
69
+ */
70
+ foreach(query: Query, callback: (row: object) => void): this
71
+
72
+ /**
73
+ * @see [docs](https://cap.cloud.sap/docs/node.js/core-services#srv-stream-column)
74
+ */
75
+ stream: {
76
+ (column: string): {
77
+ from(entity: LinkedDefinition | string): {
78
+ where(filter: any): ReadableStream
79
+ }
80
+ }
81
+ (query: Query): Promise<ReadableStream>
82
+ }
83
+
84
+ /**
85
+ * Starts or joins a transaction
86
+ * @see [docs](https://cap.cloud.sap/docs/node.js/cds-tx)
87
+ */
88
+
89
+ tx: {
90
+ (fn: (tx: Transaction) => {}): Promise<unknown>
91
+ (context?: object): Transaction
92
+ (context: object, fn: (tx: Transaction) => {}): Promise<unknown>
93
+ }
94
+
95
+ transaction: {
96
+ (fn: (tx: Transaction) => {}): Promise<unknown>
97
+ (context?: object): Transaction
98
+ (context: object, fn: (tx: Transaction) => {}): Promise<unknown>
99
+ }
100
+
101
+ /**
102
+ * @see [docs](https://cap.cloud.sap/docs/node.js/cds-tx#cds-spawn)
103
+ */
104
+ spawn(options: {
105
+ [key: string]: any
106
+ every?: number
107
+ after?: number
108
+ }, fn: (tx: Transaction) => {}): SpawnEventEmitter
109
+
110
+ /**
111
+ * @see [docs](https://cap.cloud.sap/docs/node.js/cds-tx#event-contexts
112
+ */
113
+ context?: EventContext
114
+
115
+ db: DatabaseService
116
+ }
117
+
118
+
119
+ /**
120
+ * Class cds.Service
121
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services)
122
+ */
123
+ export class Service extends QueryAPI {
124
+ constructor(
125
+ name?: string,
126
+ model?: CSN,
127
+ options?: {
128
+ kind: string
129
+ impl: string | ServiceImpl
130
+ }
131
+ )
132
+
133
+ /**
134
+ * The name of the service
135
+ */
136
+ name: string
137
+
138
+ /**
139
+ * The kind of the service
140
+ */
141
+ kind: string
142
+
143
+ /**
144
+ * The model from which the service's definition was loaded
145
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services)
146
+ */
147
+ model: LinkedCSN
148
+
149
+ /**
150
+ * Provides access to the entities exposed by a service
151
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services)
152
+ */
153
+ entities: Definitions & ((namespace: string) => Definitions)
154
+
155
+ /**
156
+ * Provides access to the events declared by a service
157
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services)
158
+ */
159
+ events: Definitions & ((namespace: string) => Definitions)
160
+
161
+ /**
162
+ * Provides access to the types exposed by a service
163
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services)
164
+ */
165
+ types: Definitions & ((namespace: string) => Definitions)
166
+
167
+ /**
168
+ * Provides access to the operations, i.e. actions and functions, exposed by a service
169
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services)
170
+ */
171
+ operations: Definitions & ((namespace: string) => Definitions)
172
+
173
+ /**
174
+ * Acts like a parameter-less constructor. Ensure to call `await super.init()` to have the base class’s handlers added.
175
+ * You may register own handlers before the base class’s ones, to intercept requests before the default handlers snap in.
176
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services#srv-init)
177
+ */
178
+ init(): Promise<void>
179
+
180
+ /**
181
+ * Constructs and emits an asynchronous event.
182
+ * @see [capire docs](https://cap.cloud.sap/docs/core-services#srv-emit-event)
183
+ */
184
+ emit: {
185
+ <T = any>(details: { event: types.event; data?: object; headers?: object }): Promise<T>
186
+ <T = any>(event: types.event, data?: object, headers?: object): Promise<T>
187
+ }
188
+
189
+ /**
190
+ * Constructs and sends a synchronous request.
191
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services#srv-send-request)
192
+ */
193
+ send: {
194
+ <T = any>(event: types.event, path: string, data?: object, headers?: object): Promise<T>
195
+ <T = any>(event: types.event, data?: object, headers?: object): Promise<T>
196
+ <T = any>(details: { event: types.event; data?: object; headers?: object }): Promise<T>
197
+ <T = any>(details: { query: ConstructedQuery; data?: object; headers?: object }): Promise<T>
198
+ <T = any>(details: { method: types.eventName; path: string; data?: object; headers?: object }): Promise<T>
199
+ <T = any>(details: { event: types.eventName; entity: LinkedDefinition | string; data?: object; params?: object }): Promise<T>
200
+ }
201
+
202
+ /**
203
+ * Constructs and sends a GET request.
204
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services#rest-style-api)
205
+ */
206
+ get<T = any>(entityOrPath: types.target, data?: object): Promise<T>
207
+ /**
208
+ * Constructs and sends a POST request.
209
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services#rest-style-api)
210
+ */
211
+ post<T = any>(entityOrPath: types.target, data?: object): Promise<T>
212
+ /**
213
+ * Constructs and sends a PUT request.
214
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services#rest-style-api)
215
+ */
216
+ put<T = any>(entityOrPath: types.target, data?: object): Promise<T>
217
+ /**
218
+ * Constructs and sends a PATCH request.
219
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services#rest-style-api)
220
+ */
221
+ patch<T = any>(entityOrPath: types.target, data?: object): Promise<T>
222
+ /**
223
+ * Constructs and sends a DELETE request.
224
+ */
225
+ delete: {
226
+ <T = any>(entityOrPath: types.target, data?: object): DELETE<T>
227
+ <T extends ArrayConstructable<any>>(entity: T, key?: any): DELETE<T>
228
+ <T>(entity: LinkedDefinition | string, key?: any): DELETE<T>
229
+ }
230
+
231
+ // The central method to dispatch events
232
+ dispatch(msg: types.event): Promise<any>
233
+
234
+ // Provider API
235
+ prepend(fn: ServiceImpl): Promise<this>
236
+ on<T extends Constructable>(eve: types.event, entity: T, handler: CRUDEventHandler.On<InstanceType<T>, InstanceType<T> | void | Error>): this
237
+ on<F extends CdsFunction>(boundAction: F, service: string, handler: ActionEventHandler<F['__parameters'], void | Error | F['__returns']>): this
238
+ on<F extends CdsFunction>(unboundAction: F, handler: ActionEventHandler<F['__parameters'], void | Error | F['__returns']>): this
239
+ on(eve: types.event, entity: types.target, handler: OnEventHandler): this
240
+ on(eve: types.event, handler: OnEventHandler): this
241
+
242
+
243
+ // onSucceeded (eve: types.Events, entity: types.Target, handler: types.EventHandler): this
244
+ // onSucceeded (eve: types.Events, handler: types.EventHandler): this
245
+ // onFailed (eve: types.Events, entity: types.Target, handler: types.EventHandler): this
246
+ // onFailed (eve: types.Events, handler: types.EventHandler): this
247
+ before<T extends Constructable>(eve: types.event, entity: T, handler: CRUDEventHandler.Before<InstanceType<T>, InstanceType<T> | void | Error>): this
248
+ before(eve: types.event, entity: types.target, handler: EventHandler): this
249
+ before(eve: types.event, handler: EventHandler): this
250
+ after<T extends Constructable>(eve: types.event, entity: T, handler: CRUDEventHandler.After<InstanceType<T>, InstanceType<T> | void | Error>): this
251
+ after(eve: types.event, entity: types.target, handler: ResultsHandler): this
252
+ after(eve: types.event, handler: ResultsHandler): this
253
+ reject(eves: types.event, ...entity: types.target[]): this
254
+ }
255
+
256
+ export class ApplicationService extends Service {}
257
+ export class MessagingService extends Service {}
258
+ export class RemoteService extends Service {}
259
+ export class DatabaseService extends Service {
260
+ deploy(model?: CSN | string): Promise<CSN>
261
+ begin(): Promise<void>
262
+ commit(): Promise<void>
263
+ rollback(): Promise<void>
264
+ }
265
+
266
+
267
+ export default class cds {
268
+ /**
269
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/core-services)
270
+ */
271
+ Service: typeof Service
272
+
273
+ /**
274
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/app-services)
275
+ */
276
+ ApplicationService: typeof ApplicationService
277
+
278
+ /**
279
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/remote-services)
280
+ */
281
+ RemoteService: typeof RemoteService
282
+
283
+ /**
284
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/messaging)
285
+ */
286
+ MessagingService: typeof MessagingService
287
+
288
+ /**
289
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/databases)
290
+ */
291
+ DatabaseService: typeof DatabaseService
292
+ }
293
+
294
+
295
+ interface Transaction extends Service {
296
+ commit(): Promise<void>
297
+ rollback(): Promise<void>
298
+ }
299
+
300
+ interface ResultSet extends Array<{}> {}
301
+
302
+ interface ServiceImpl {
303
+ (this: Service, srv: Service): any
304
+ }
305
+
306
+ interface EventHandler {
307
+ // (msg : types.EventMessage) : Promise<any> | any | void
308
+ (req: Request): Promise<any> | any | void
309
+ }
310
+
311
+ interface OnEventHandler {
312
+ (req: Request, next: Function): Promise<any> | any | void
313
+ }
314
+
315
+ // `Partial` wraps any type and allows all properties to be undefined
316
+ // in addition to their actual type.
317
+ // This is important in the context of CRUD events, where
318
+ // entities could be lacking any properties, like a non-existing ID
319
+ // or when DB fields are corrupted, etc.
320
+ type Partial<T> = { [Key in keyof T]: undefined | T[Key] }
321
+
322
+ // Naming the first parameter in a handler `each` has special voodoo
323
+ // semantic which makes it impossible for us to infer the exact behaviour on a type level.
324
+ // So we always have to expect scalars as well as arrays in some callbacks.
325
+ type OneOrMany<T> = T | T[];
326
+
327
+ // functions generated by cds-typer explicitly carry types for
328
+ // parameters and return type, as their names are not accessible from
329
+ // function signatures to the type system.
330
+ // This meta information is required in .on action handlers.
331
+ type CdsFunction = {
332
+ (...args: any[]): any,
333
+ __parameters: object,
334
+ __returns: unknown
335
+ }
336
+
337
+ type TypedRequest<T> = Omit<Request, 'data'> & { data: T }
338
+
339
+ // https://cap.cloud.sap/docs/node.js/core-services#srv-on-before-after
340
+ declare namespace CRUDEventHandler {
341
+ type Before<P,R> = (req: TypedRequest<P>) => Promise<R> | R
342
+ type On<P,R> = (req: TypedRequest<P>, next: (...args: any) => Promise<R> | R) => Promise<R> | R
343
+ type After<P,R> = (data: undefined | P, req: TypedRequest<P>) => Promise<R> | R
344
+ }
345
+
346
+ // Handlers for actions try to infer the passed .data property
347
+ // as strictly as possible and therefore have to remove
348
+ // { data: any } (inherited EventMessage} with a more restricted
349
+ // type, based on the parameters of the action.
350
+ interface ActionEventHandler<P,R> {
351
+ (req: Omit<Request, 'data'> & { data: P }, next: Function): Promise<R> | R
352
+ }
353
+
354
+ // Note: the behaviour of ResultsHandler changes based on the name of the parameter.
355
+ // If the parameter in the hook is called "each", it is called once for each row in the result,
356
+ // otherwise it gets called exactly one time with the entire result.
357
+ // This runtime behaviour can not be described on type level
358
+ // (in a way that would benefit the user).
359
+ // The user will therefore receive "any" as their result/ each. If we could some day differentiate,
360
+ // we may want to add a generic to ResultsHandler which is passed from the EventHandlers down below.
361
+ interface ResultsHandler {
362
+ (results: any[], req: Request): void
363
+ (each: any, req: Request): void
364
+ }
365
+
366
+ interface SpawnEvents {
367
+ 'succeeded': (res: any) => void
368
+ 'failed': (error: any) => void
369
+ 'done': () => void
370
+ }
371
+
372
+ declare class SpawnEventEmitter {
373
+ on<U extends keyof SpawnEvents>(
374
+ event: U, listener: SpawnEvents[U]
375
+ ): this;
376
+
377
+ emit<U extends keyof SpawnEvents>(
378
+ event: U, ...args: Parameters<SpawnEvents[U]>
379
+ ): boolean;
380
+ timer: any
381
+ }
382
+
383
+ declare namespace types {
384
+ type event = eventName | eventName[]
385
+ type eventName = (string & {})
386
+ | 'CREATE' | 'READ' | 'UPDATE' | 'DELETE'
387
+ | 'NEW' | 'EDIT' | 'PATCH' | 'SAVE'
388
+ | 'GET' | 'PUT' | 'POST' | 'PATCH' | 'DELETE'
389
+ | 'COMMIT' | 'ROLLBACK'
390
+ type target = string | LinkedDefinition | LinkedEntity | (string | LinkedDefinition | LinkedEntity)[] | ArrayConstructable<any>
391
+ }
package/apis/test.d.ts ADDED
@@ -0,0 +1,81 @@
1
+ import { AxiosInstance } from 'axios';
2
+ import * as chai from 'chai';
3
+ import * as http from 'http';
4
+ import { Service } from './services';
5
+
6
+ declare class Axios {
7
+ get axios(): AxiosInstance;
8
+
9
+ get : AxiosInstance['get'];
10
+ put : AxiosInstance['put'];
11
+ post : AxiosInstance['post'];
12
+ patch : AxiosInstance['patch'];
13
+ delete : AxiosInstance['delete'];
14
+ options : AxiosInstance['options'];
15
+
16
+ get GET() : Axios['get'];
17
+ get PUT() : Axios['put'];
18
+ get POST() : Axios['post'];
19
+ get PATCH() : Axios['patch'];
20
+ get DELETE() : Axios['delete'];
21
+ get OPTIONS() : Axios['options'];
22
+ }
23
+
24
+ declare class DataUtil {
25
+ delete(db?: Service): Promise<void>;
26
+ reset(db?: Service): Promise<void>;
27
+ /** @deprecated */ autoReset(enabled: boolean): this;
28
+ }
29
+
30
+ declare class Test extends Axios {
31
+
32
+ test : Test
33
+
34
+ run(cmd: string, ...args: string[]): this;
35
+ in(...paths: string[]): this;
36
+ silent(): this;
37
+ /** @deprecated */ verbose(v: boolean): this;
38
+
39
+ get chai(): typeof chai;
40
+ get expect(): typeof chai.expect;
41
+ get assert(): typeof chai.assert;
42
+ get data(): DataUtil;
43
+ get cds(): typeof import('./cds')
44
+
45
+ log() : {
46
+ output: string
47
+ clear(): void
48
+ release(): void
49
+ }
50
+
51
+ then(r: (args: { server: http.Server, url: string }) => void): void;
52
+
53
+ // get sleep(): (ms: number) => Promise<void>;
54
+ // get spy(): <T, K extends keyof T>(o: T, f: K) => T[K] extends (...args: infer TArgs) => infer TReturnValue
55
+ // ? Spy<TArgs, TReturnValue>
56
+ // : Spy;
57
+ }
58
+
59
+ // typings for spy inspired by @types/sinon
60
+ // interface Spy<TArgs extends any[] = any[], TReturnValue = any> {
61
+ // (...args: TArgs): TReturnValue;
62
+ // called: number;
63
+ // restore(): (...args: TArgs) => TReturnValue;
64
+ // }
65
+
66
+ export = cds
67
+
68
+ declare class cds {
69
+ test: {
70
+ Test: typeof Test
71
+ /**
72
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/cds-test?q=cds.test#run)
73
+ */
74
+ (projectDir: string): Test;
75
+ /**
76
+ * @see [capire docs](https://cap.cloud.sap/docs/node.js/cds-test?q=cds.test#run-2)
77
+ */
78
+ (command: string, ...args: string[]): Test;
79
+ in (string) : Test
80
+ }
81
+ }
@@ -0,0 +1,95 @@
1
+ export = cds
2
+
3
+ import * as fs from 'node:fs'
4
+
5
+ declare class cds {
6
+
7
+ /**
8
+ * Provides a set of utility functionss
9
+ */
10
+ utils : {
11
+ /**
12
+ * Generates a new v4 UUID
13
+ * @see https://cap.cloud.sap/docs/node.js/cds-facade#cds-utils
14
+ */
15
+ uuid () : string
16
+
17
+ /**
18
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#decodeuri
19
+ */
20
+ decodeURI(input: string): string
21
+
22
+ /**
23
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#decodeuricomponent
24
+ */
25
+ decodeURIComponent(input: string): string
26
+
27
+ /**
28
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#local-filename
29
+ */
30
+ local(filename: string): string
31
+
32
+ /**
33
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#exists-file
34
+ */
35
+ exist(file: string): boolean
36
+
37
+ /**
38
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#isdir-file
39
+ */
40
+ isdir(file: string): string
41
+
42
+ /**
43
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#isdir-file
44
+ */
45
+ isfile(file: string): string
46
+
47
+ /**
48
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#async-read-file
49
+ */
50
+ read(file: string): Promise<Buffer | {}>
51
+
52
+ /**
53
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#async-write-data-to-file
54
+ */
55
+ write: {
56
+ (data: Object): {
57
+ to(...file: string[]): Promise<ReturnType<typeof fs.promises.writeFile>>
58
+ }
59
+ (file: string, data: Object): Promise<ReturnType<typeof fs.promises.writeFile>>
60
+ }
61
+
62
+ /**
63
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#async-copy-src-to-dst
64
+ */
65
+ copy: {
66
+ (src: string): {
67
+ to(...dst: string[]): Promise<ReturnType<typeof fs.promises.copyFile>>
68
+ }
69
+ (dst: string, src: string): Promise<ReturnType<typeof fs.promises.copyFile>>
70
+ }
71
+
72
+ /**
73
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#async-mkdirp-path
74
+ */
75
+ mkdirp: (...path: string[]) => Promise<string>
76
+
77
+ /**
78
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#async-rmdir-path
79
+ */
80
+ rmdir: (...path: string[]) => Promise<ReturnType<typeof fs.promises.rm>>
81
+
82
+
83
+ /**
84
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#async-rimraf-path
85
+ */
86
+ rimraf: (...path: string[]) => Promise<ReturnType<typeof fs.promises.rm>>
87
+
88
+
89
+ /**
90
+ * @see https://cap.cloud.sap/docs/node.js/cds-utils#async-rm-path
91
+ */
92
+ rm: (...path: string[]) => Promise<ReturnType<typeof fs.promises.rm>>
93
+
94
+ }
95
+ }
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@cap-js/cds-types",
3
+ "version": "0.0.1",
4
+ "description": "Type definitions for main packages of CAP, like `@sap/cds`",
5
+ "repository": "github:cap-js/cds-types",
6
+ "homepage": "https://cap.cloud.sap/",
7
+ "keywords": [
8
+ "CAP",
9
+ "CDS",
10
+ "Node.js"
11
+ ],
12
+ "author": "SAP SE (https://www.sap.com)",
13
+ "license": "SEE LICENSE IN LICENSE",
14
+ "typings": "apis/cds.d.ts",
15
+ "files": [
16
+ "apis/",
17
+ "LICENSE",
18
+ "README.md"
19
+ ],
20
+ "scripts": {
21
+ "test": "jest --silent"
22
+ },
23
+ "peerDependencies": {
24
+ "@sap/cds": ">=7"
25
+ },
26
+ "devDependencies": {
27
+ "@sap/cds": "^7.4.0",
28
+ "axios": "^1.6.2",
29
+ "chai": "^4.3.10",
30
+ "jest": "^29.7.0",
31
+ "ts-jest": "^29.1.1",
32
+ "typescript": "^5.3.2",
33
+ "winston": "^3.11.0"
34
+ },
35
+ "jest": {
36
+ "transform": {
37
+ "^.+\\.(ts|tsx)$": "ts-jest"
38
+ }
39
+ }
40
+ }