@@ -12,9 +12,72 @@ const log = getLogger("@ui5/dts-generator/constructor-settings-interfaces");
12
12
import { splitName } from "./base-utils.js" ;
13
13
import { TypeReference } from "../types/ast.js" ;
14
14
15
- export function makeSettingsName ( fqn : string ) {
16
- const [ pkgname , basename ] = splitName ( fqn ) ;
17
- return `${ pkgname } .\$${ basename } Settings` ;
15
+ /*
16
+ * Calculates the name for the $Settings interface, the basename of the name
17
+ * (last name segment) and the assumed export name under which the settings
18
+ * are exported from the containing module.
19
+ *
20
+ * Examples:
21
+ * (1) sap.m.Button -->
22
+ * name: "sap.m.$ButtonSettings"
23
+ * basename: "$ButtonSettings"
24
+ * exportName: "$ButtonSettings"
25
+ *
26
+ * (2) module:my/lib//NotificationListGroupItem -->
27
+ * name: "module:my/lib/NotificationListGroupItem.$NotificationListGroupItemSettings"
28
+ * basename: "$NotificationListGroupItemSettings"
29
+ * exportName: "$NotificationListGroupItemSettings"
30
+ *
31
+ * (3) module:my/lib/SegmentedButton.Item
32
+ * name: "module:my/lib/SegmentedButton.$ItemSettings"
33
+ * basename: "$ItemSettings"
34
+ * exportName: "$ItemSettings"
35
+ *
36
+ * (4) module:my/lib/SegmentedButton.Item.SubItem
37
+ * name: "module:my/lib/SegmentedButton.Item.$SubItemSettings"
38
+ * basename: "$SubItemSettings"
39
+ * exportName: "Item.$SubItemSettings"
40
+ */
41
+ export function makeSettingsNames ( fqn : string ) {
42
+ const makeNameAndBasename = ( fqn : string ) => {
43
+ const [ prefix , basename ] = splitName ( fqn ) ;
44
+ const settings = `\$${ basename } Settings` ;
45
+ return [ `${ prefix } ${ prefix ? "." : "" } ${ settings } ` , settings ] ;
46
+ } ;
47
+
48
+ if ( fqn . startsWith ( "module:" ) ) {
49
+ const [ pkgname , moduleAndExport ] = splitName (
50
+ fqn . slice ( "module:" . length ) ,
51
+ "/" ,
52
+ ) ;
53
+ const pos = moduleAndExport . indexOf ( "." ) ;
54
+ if ( pos < 0 ) {
55
+ // case (2), default export
56
+ const [ , settingsName ] = makeNameAndBasename ( moduleAndExport ) ;
57
+ return {
58
+ name : `${ fqn } .${ settingsName } ` ,
59
+ basename : settingsName ,
60
+ exportName : settingsName ,
61
+ } ;
62
+ }
63
+ // case (3) and (4), named export
64
+ const moduleBaseName = moduleAndExport . slice ( 0 , pos ) ;
65
+ const exportName = moduleAndExport . slice ( pos + 1 ) ;
66
+ const [ settingsNameWithPrefix , settingsName ] =
67
+ makeNameAndBasename ( exportName ) ;
68
+ return {
69
+ name : `module:${ pkgname } ${ pkgname ? "/" : "" } ${ moduleBaseName } .${ settingsNameWithPrefix } ` ,
70
+ basename : settingsName ,
71
+ exportName : settingsNameWithPrefix ,
72
+ } ;
73
+ }
74
+ // case (1), global name
75
+ const [ fqSettingsName , settingsName ] = makeNameAndBasename ( fqn ) ;
76
+ return {
77
+ name : fqSettingsName ,
78
+ basename : settingsName ,
79
+ exportName : settingsName ,
80
+ } ;
18
81
}
19
82
20
83
export function isA (
@@ -383,13 +446,14 @@ function createConstructorSettingsInterfaces(
383
446
symbols . forEach ( ( symbol ) => {
384
447
if ( isManagedObject ( symbol ) ) {
385
448
log . verbose ( `adding settings interface for ${ symbol . name } ` ) ;
449
+ const { name, basename, exportName } = makeSettingsNames ( symbol . name ) ;
386
450
const settings : InterfaceSymbol = {
387
451
kind : "interface" ,
388
- name : makeSettingsName ( symbol . name ) ,
389
- basename : `\$ ${ symbol . basename } Settings` ,
452
+ name,
453
+ basename,
390
454
module : symbol . module ,
391
455
resource : symbol . resource ,
392
- export : `\$ ${ symbol . basename } Settings` ,
456
+ export : exportName ,
393
457
properties : addDetails
394
458
? dedup ( [
395
459
...settingsForProperties ( symbol ) ,
@@ -402,7 +466,7 @@ function createConstructorSettingsInterfaces(
402
466
__isNotAMarkerInterface : true ,
403
467
} ;
404
468
if ( isManagedObject ( symbol . extends ) ) {
405
- settings . extends = makeSettingsName ( symbol . extends ) ;
469
+ settings . extends = makeSettingsNames ( symbol . extends ) . name ;
406
470
}
407
471
settings . description = `Describes the settings that can be provided to the ${ symbol . basename } constructor.` ;
408
472
if ( symbol . deprecated ) {
0 commit comments