@@ -2,7 +2,7 @@ import {Position, Source} from "./position";
2
2
import "reflect-metadata" ;
3
3
import { PossiblyNamed , ReferenceByName } from "./naming" ;
4
4
5
- export const NODE_DEFINITION_SYMBOL = Symbol ( "nodeDefinition " ) ;
5
+ export const CONCEPT_SYMBOL = Symbol ( "concept " ) ;
6
6
7
7
export type PackageDescription = {
8
8
name : string ,
@@ -12,14 +12,19 @@ export const NODE_TYPES: { [name: string]: PackageDescription } = {
12
12
"" : { name : "" , nodes : { } }
13
13
} ;
14
14
15
- export type NodeDefinition = {
15
+ export type Concept = {
16
16
package ?: string ,
17
17
name ?: string ,
18
18
features : { [ name : string | symbol ] : Feature } ,
19
19
resolved ?: boolean ;
20
- inheritsFrom ?: NodeDefinition
20
+ inheritsFrom ?: Concept
21
21
} ;
22
22
23
+ /**
24
+ * @deprecated use Concept instead.
25
+ */
26
+ export type NodeDefinition = Concept ;
27
+
23
28
export type Feature = {
24
29
name : string | symbol ,
25
30
child ?: boolean ,
@@ -35,45 +40,52 @@ export type Feature = {
35
40
*/
36
41
export type PropertyDefinition = Feature ;
37
42
43
+ /**
44
+ * @deprecated in favor of getConcept
45
+ */
38
46
export function getNodeDefinition ( node : Node | ( abstract new ( ...args : any [ ] ) => Node ) ) : NodeDefinition {
47
+ return getConcept ( node ) ;
48
+ }
49
+
50
+ export function getConcept ( node : Node | ( abstract new ( ...args : any [ ] ) => Node ) ) : Concept {
39
51
const target = typeof node === "function" ? node : node . constructor ;
40
- let definition : NodeDefinition ;
41
- if ( Object . prototype . hasOwnProperty . call ( target , NODE_DEFINITION_SYMBOL ) ) {
42
- definition = target [ NODE_DEFINITION_SYMBOL ] as NodeDefinition ;
52
+ let concept : Concept ;
53
+ if ( Object . prototype . hasOwnProperty . call ( target , CONCEPT_SYMBOL ) ) {
54
+ concept = target [ CONCEPT_SYMBOL ] as Concept ;
43
55
} else {
44
- const inheritedFeatures = { ...( target [ NODE_DEFINITION_SYMBOL ] ?. features || { } ) } ;
56
+ const inheritedFeatures = { ...( target [ CONCEPT_SYMBOL ] ?. features || { } ) } ;
45
57
for ( const p in inheritedFeatures ) {
46
58
inheritedFeatures [ p ] = { inherited : true , ...inheritedFeatures [ p ] } ;
47
59
}
48
- target [ NODE_DEFINITION_SYMBOL ] = definition = {
60
+ target [ CONCEPT_SYMBOL ] = concept = {
49
61
features : inheritedFeatures ,
50
62
resolved : false
51
63
} ;
52
64
}
53
- if ( definition && definition . features && ! definition . resolved ) {
65
+ if ( concept && concept . features && ! concept . resolved ) {
54
66
try {
55
67
let metadataHolder ;
56
68
try {
57
69
metadataHolder = new ( node as any ) ( ) ;
58
70
} catch {
59
71
metadataHolder = node ;
60
72
}
61
- for ( const p in definition . features ) {
62
- if ( ! definition . features [ p ] . type ) {
73
+ for ( const p in concept . features ) {
74
+ if ( ! concept . features [ p ] . type ) {
63
75
const type = Reflect . getMetadata ( "design:type" , metadataHolder , p ) ;
64
- definition . features [ p ] . type = type ;
76
+ concept . features [ p ] . type = type ;
65
77
if ( type === Array ) {
66
- definition . features [ p ] . arrayType =
78
+ concept . features [ p ] . arrayType =
67
79
Reflect . getMetadata ( "design:arrayElementType" , metadataHolder , p ) ;
68
80
}
69
81
}
70
82
}
71
- definition . resolved = true ;
83
+ concept . resolved = true ;
72
84
} catch {
73
85
//Ignore
74
86
}
75
87
}
76
- return definition ;
88
+ return concept ;
77
89
}
78
90
79
91
export abstract class Origin {
@@ -166,8 +178,13 @@ export abstract class Node extends Origin implements Destination {
166
178
return Object . getOwnPropertyNames ( props ) . filter ( p => props [ p ] . child ) ;
167
179
}
168
180
181
+ get concept ( ) : Concept {
182
+ return getConcept ( this ) ;
183
+ }
184
+
185
+ /** @deprecated use concept */
169
186
get nodeDefinition ( ) : NodeDefinition {
170
- return getNodeDefinition ( this ) ;
187
+ return this . concept ;
171
188
}
172
189
173
190
get features ( ) : FeatureDescription [ ] {
@@ -461,8 +478,8 @@ export function setNodeRedefinitionStrategy(strategy: typeof errorOnRedefinition
461
478
}
462
479
463
480
export function registerNodeDefinition < T extends Node > (
464
- target : abstract new ( ...args : any [ ] ) => T , pkg ?: string , name ?: string ) : NodeDefinition {
465
- let def : NodeDefinition ;
481
+ target : abstract new ( ...args : any [ ] ) => T , pkg ?: string , name ?: string ) : Concept {
482
+ let def : Concept ;
466
483
if ( pkg !== undefined ) {
467
484
if ( ! name ) {
468
485
throw new Error ( "Package name without node name" ) ;
@@ -473,8 +490,8 @@ export function registerNodeDefinition<T extends Node>(
473
490
nodeRedefinitionStrategy ( name , target , existingTarget ) ;
474
491
}
475
492
}
476
- const existingDef = target [ NODE_DEFINITION_SYMBOL ] as NodeDefinition ;
477
- if ( Object . prototype . hasOwnProperty . call ( target , NODE_DEFINITION_SYMBOL ) ) {
493
+ const existingDef = target [ CONCEPT_SYMBOL ] as Concept ;
494
+ if ( Object . prototype . hasOwnProperty . call ( target , CONCEPT_SYMBOL ) ) {
478
495
if ( ( existingDef . package !== undefined && existingDef . package != pkg ) ||
479
496
( existingDef . name !== undefined && existingDef . name != name ) ) {
480
497
throw new Error ( `Type ${ pkg } .${ name } (${ target } ) is already defined as ${ JSON . stringify ( existingDef ) } ` ) ;
@@ -499,22 +516,27 @@ export function registerNodeDefinition<T extends Node>(
499
516
if ( pkg !== undefined && name !== undefined ) {
500
517
NODE_TYPES [ pkg ] . nodes [ name ] = target ;
501
518
}
502
- target [ NODE_DEFINITION_SYMBOL ] = def ;
519
+ target [ CONCEPT_SYMBOL ] = def ;
503
520
return def ;
504
521
}
505
522
506
- export function ensureNodeDefinition ( node : Node | { new ( ...args : any [ ] ) : Node } ) : NodeDefinition {
507
- let definition = getNodeDefinition ( node ) ;
508
- if ( ! definition ) {
523
+ export function ensureConcept ( node : Node | { new ( ...args : any [ ] ) : Node } ) : Concept {
524
+ let concept = getConcept ( node ) ;
525
+ if ( ! concept ) {
509
526
if ( typeof node === 'function' ) {
510
- definition = registerNodeDefinition ( node ) ;
527
+ concept = registerNodeDefinition ( node ) ;
511
528
} else if ( typeof node . constructor === 'function' ) {
512
- definition = registerNodeDefinition ( node . constructor as any ) ;
529
+ concept = registerNodeDefinition ( node . constructor as any ) ;
513
530
} else {
514
531
throw new Error ( "Not a valid node: " + node ) ;
515
532
}
516
533
}
517
- return definition ;
534
+ return concept ;
535
+ }
536
+
537
+ /** @deprecated use ensureConcept */
538
+ export function ensureNodeDefinition ( node : Node | { new ( ...args : any [ ] ) : Node } ) : Concept {
539
+ return ensureConcept ( node ) ;
518
540
}
519
541
520
542
export function registerNodeAttribute < T extends Node > (
@@ -523,7 +545,7 @@ export function registerNodeAttribute<T extends Node>(
523
545
if ( methodName == "parent" || methodName == "children" || methodName == "origin" ) {
524
546
methodName = Symbol ( methodName ) ;
525
547
}
526
- const definition = ensureNodeDefinition ( type ) ;
548
+ const definition = ensureConcept ( type ) ;
527
549
if ( ! definition . features [ methodName ] ) {
528
550
definition . features [ methodName ] = {
529
551
name : methodName
0 commit comments