@@ -8,7 +8,7 @@ const { SourceFile, FileRepository, Buffer, Path } = require('./file')
8
8
const { FlatInlineDeclarationResolver, StructuredInlineDeclarationResolver } = require ( './components/inline' )
9
9
const { Resolver } = require ( './resolution/resolver' )
10
10
const { LOG } = require ( './logging' )
11
- const { docify, createPromiseOf, createUnionOf, createKeysOf, createElementsOf } = require ( './components/wrappers' )
11
+ const { docify, createPromiseOf, createUnionOf, createKeysOf, createElementsOf, stringIdent } = require ( './components/wrappers' )
12
12
const { csnToEnumPairs, propertyToInlineEnumName, isInlineEnumType, stringifyEnumType } = require ( './components/enum' )
13
13
const { isReferenceType } = require ( './components/reference' )
14
14
const { empty } = require ( './components/typescript' )
@@ -17,6 +17,7 @@ const { EntityRepository, asIdentifier } = require('./resolution/entity')
17
17
const { last } = require ( './components/identifier' )
18
18
const { getPropertyModifiers } = require ( './components/property' )
19
19
const { configuration } = require ( './config' )
20
+ const { createMember } = require ( './components/class' )
20
21
21
22
/** @typedef {import('./file').File } File */
22
23
/** @typedef {import('./typedefs').visitor.Context } Context */
@@ -155,7 +156,12 @@ class Visitor {
155
156
} , '}'
156
157
) // end of actions
157
158
} else {
158
- buffer . add ( `declare static readonly actions: ${ inherited } ${ empty } ` )
159
+ buffer . add ( createMember ( {
160
+ name : 'actions' ,
161
+ type : `${ inherited } ${ empty } ` ,
162
+ isStatic : true ,
163
+ isReadonly : true
164
+ } ) )
159
165
}
160
166
}
161
167
@@ -164,15 +170,27 @@ class Visitor {
164
170
* @param {string } clean - the clean name of the entity
165
171
*/
166
172
#printStaticKeys( buffer , clean ) {
167
- buffer . add ( `declare static readonly keys: ${ createKeysOf ( clean ) } ` )
173
+ buffer . add ( createMember ( {
174
+ name : 'keys' ,
175
+ type : createKeysOf ( clean ) ,
176
+ isDeclare : true ,
177
+ isStatic : true ,
178
+ isReadonly : true ,
179
+ } ) )
168
180
}
169
181
170
182
/**
171
183
* @param {Buffer } buffer - the buffer to write the elements into
172
184
* @param {string } clean - the clean name of the entity
173
185
*/
174
186
#printStaticElements( buffer , clean ) {
175
- buffer . add ( `declare static readonly elements: ${ createElementsOf ( clean ) } ` )
187
+ buffer . add ( createMember ( {
188
+ name : 'elements' ,
189
+ type : createElementsOf ( clean ) ,
190
+ isDeclare : true ,
191
+ isStatic : true ,
192
+ isReadonly : true
193
+ } ) )
176
194
}
177
195
178
196
/**
@@ -280,13 +298,25 @@ class Visitor {
280
298
281
299
for ( const e of enums ) {
282
300
const eDoc = docify ( e . doc )
283
- eDoc . forEach ( d => { buffer . add ( d ) } )
284
- buffer . add ( `static ${ e . name } = ${ propertyToInlineEnumName ( clean , e . name ) } ` )
301
+ buffer . add ( eDoc )
302
+ buffer . add ( createMember ( {
303
+ name : e . name ,
304
+ initialiser : propertyToInlineEnumName ( clean , e . name ) ,
305
+ isStatic : true ,
306
+ } ) )
285
307
file . addInlineEnum ( clean , fq , e . name , csnToEnumPairs ( e , { unwrapVals : true } ) , eDoc )
286
308
}
287
309
288
310
if ( 'kind' in entity ) {
289
- buffer . add ( `static readonly kind: 'entity' | 'type' | 'aspect' = '${ entity . kind } ';` )
311
+ buffer . add ( createMember ( {
312
+ name : 'kind' ,
313
+ type : '"entity" | "type" | "aspect"' ,
314
+ isStatic : true ,
315
+ isReadonly : true ,
316
+ isDeclare : false ,
317
+ isOverride : ancestorInfos . some ( ancestor => ancestor . csn . kind ) ,
318
+ initialiser : stringIdent ( entity . kind )
319
+ } ) )
290
320
}
291
321
this . #printStaticKeys( buffer , clean )
292
322
this . #printStaticElements( buffer , clean )
@@ -296,7 +326,7 @@ class Visitor {
296
326
297
327
// CLASS WITH ADDED ASPECTS
298
328
file . addImport ( baseDefinitions . path )
299
- docify ( entity . doc ) . forEach ( d => { buffer . add ( d ) } )
329
+ buffer . add ( docify ( entity . doc ) )
300
330
buffer . add ( `export class ${ identSingular ( clean ) } extends ${ identAspect ( toLocalIdent ( { clean, fq} ) ) } (${ baseDefinitions . path . asIdentifier ( ) } .Entity) {${ this . #staticClassContents( clean , entity ) . join ( '\n' ) } }` )
301
331
this . contexts . pop ( )
302
332
}
@@ -382,11 +412,11 @@ class Visitor {
382
412
// so it can get passed as value to CQL functions.
383
413
const additionalProperties = this . #staticClassContents( singular , entity )
384
414
additionalProperties . push ( '$count?: number' )
385
- docify ( entity . doc ) . forEach ( d => { buffer . add ( d ) } )
415
+ buffer . add ( docify ( entity . doc ) )
386
416
buffer . add ( `export class ${ plural } extends Array<${ singular } > {${ additionalProperties . join ( '\n' ) } }` )
387
417
buffer . add ( overrideNameProperty ( plural , entity . name ) )
388
418
}
389
- buffer . add ( '' )
419
+ buffer . blankLine ( )
390
420
}
391
421
392
422
/**
@@ -531,12 +561,12 @@ class Visitor {
531
561
// file.addImport(new Path(['cds'], '')) TODO make sap/cds import work
532
562
buffer . addIndentedBlock ( `export class ${ serviceNameSimple } extends cds.Service {` , ( ) => {
533
563
Object . entries ( service . operations ?? { } ) . forEach ( ( [ name , { doc} ] ) => {
534
- docify ( doc ) . forEach ( d => { buffer . add ( d ) } )
564
+ buffer . add ( docify ( doc ) )
535
565
buffer . add ( `declare ${ name } : typeof ${ name } ` )
536
566
} )
537
567
} , '}' )
538
568
buffer . add ( `export default ${ serviceNameSimple } ` )
539
- buffer . add ( '' )
569
+ buffer . blankLine ( )
540
570
file . addService ( service . name )
541
571
}
542
572
0 commit comments