@coolon/i18n-resource-generator 2.0.2 → 2.0.3
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/CHANGELOG.md +5 -0
- package/build/main/lib/arguments.class.d.ts +6 -8
- package/build/main/lib/arguments.class.js +9 -2
- package/build/main/lib/ast/abstractContainerElement.d.ts +4 -4
- package/build/main/lib/ast/abstractContainerElement.js +3 -2
- package/build/main/lib/ast/abstractElement.d.ts +2 -2
- package/build/main/lib/ast/abstractElement.js +1 -1
- package/build/main/lib/ast/containerElement.class.d.ts +11 -10
- package/build/main/lib/ast/jsonModule.class.d.ts +8 -0
- package/build/main/lib/ast/jsonModule.class.js +21 -0
- package/build/main/lib/ast/namespaceDef.class.d.ts +1 -0
- package/build/main/lib/ast/namespaceDef.class.js +8 -1
- package/build/main/lib/ast/objectDef.class.d.ts +9 -8
- package/build/main/lib/ast/objectDef.class.js +11 -7
- package/build/main/lib/ast/statementDef.class.d.ts +7 -0
- package/build/main/lib/ast/statementDef.class.js +14 -0
- package/build/main/lib/bin/cli.js +21 -17
- package/build/main/lib/customTypeArrayNode.class.d.ts +6 -6
- package/build/main/lib/customTypeArrayNode.class.js +8 -11
- package/build/main/lib/customTypeNode.class.d.ts +6 -20
- package/build/main/lib/customTypeNode.class.js +18 -20
- package/build/main/lib/enumNode.class.d.ts +6 -6
- package/build/main/lib/enumNode.class.js +28 -45
- package/build/main/lib/i18nGenerator.d.ts +2 -10
- package/build/main/lib/i18nGenerator.js +39 -78
- package/build/main/lib/i18nNode.class.d.ts +10 -12
- package/build/main/lib/i18nNode.class.js +30 -44
- package/build/main/lib/namespaceNode.class.d.ts +5 -4
- package/build/main/lib/namespaceNode.class.js +4 -4
- package/build/main/lib/nodeName.d.ts +13 -0
- package/build/main/lib/nodeName.js +90 -0
- package/build/main/lib/rootNode.class.d.ts +10 -1
- package/build/main/lib/rootNode.class.js +42 -6
- package/build/main/lib/textArrayNode.class.d.ts +4 -3
- package/build/main/lib/textArrayNode.class.js +6 -5
- package/build/main/lib/textNode.class.d.ts +4 -2
- package/build/main/lib/textNode.class.js +9 -13
- package/build/main/lib/valueNode.class.d.ts +5 -4
- package/build/main/lib/valueNode.class.js +5 -5
- package/build/main/lib/writer.class.js +2 -2
- package/build/module/lib/arguments.class.d.ts +6 -8
- package/build/module/lib/arguments.class.js +10 -3
- package/build/module/lib/ast/abstractContainerElement.d.ts +4 -4
- package/build/module/lib/ast/abstractContainerElement.js +4 -3
- package/build/module/lib/ast/abstractElement.d.ts +2 -2
- package/build/module/lib/ast/abstractElement.js +1 -1
- package/build/module/lib/ast/containerElement.class.d.ts +11 -10
- package/build/module/lib/ast/jsonModule.class.d.ts +8 -0
- package/build/module/lib/ast/jsonModule.class.js +18 -0
- package/build/module/lib/ast/namespaceDef.class.d.ts +1 -0
- package/build/module/lib/ast/namespaceDef.class.js +8 -1
- package/build/module/lib/ast/objectDef.class.d.ts +9 -8
- package/build/module/lib/ast/objectDef.class.js +12 -8
- package/build/module/lib/ast/statementDef.class.d.ts +7 -0
- package/build/module/lib/ast/statementDef.class.js +11 -0
- package/build/module/lib/bin/cli.js +21 -17
- package/build/module/lib/customTypeArrayNode.class.d.ts +6 -6
- package/build/module/lib/customTypeArrayNode.class.js +9 -12
- package/build/module/lib/customTypeNode.class.d.ts +6 -20
- package/build/module/lib/customTypeNode.class.js +18 -20
- package/build/module/lib/enumNode.class.d.ts +6 -6
- package/build/module/lib/enumNode.class.js +30 -47
- package/build/module/lib/i18nGenerator.d.ts +2 -10
- package/build/module/lib/i18nGenerator.js +49 -87
- package/build/module/lib/i18nNode.class.d.ts +10 -12
- package/build/module/lib/i18nNode.class.js +30 -41
- package/build/module/lib/namespaceNode.class.d.ts +5 -4
- package/build/module/lib/namespaceNode.class.js +5 -5
- package/build/module/lib/nodeName.d.ts +13 -0
- package/build/module/lib/nodeName.js +77 -0
- package/build/module/lib/rootNode.class.d.ts +10 -1
- package/build/module/lib/rootNode.class.js +42 -6
- package/build/module/lib/textArrayNode.class.d.ts +4 -3
- package/build/module/lib/textArrayNode.class.js +7 -6
- package/build/module/lib/textNode.class.d.ts +4 -2
- package/build/module/lib/textNode.class.js +9 -13
- package/build/module/lib/valueNode.class.d.ts +5 -4
- package/build/module/lib/valueNode.class.js +5 -5
- package/build/module/lib/writer.class.js +2 -2
- package/fixtures/config.json +1 -0
- package/fixtures/ui.alarms.en.yml +108 -0
- package/fixtures/ui.common.en.yml +23 -0
- package/fixtures/ui.date_time.en.yml +94 -0
- package/fixtures/ui.devices.en.yml +288 -0
- package/fixtures/ui.lux.en.yml +44 -0
- package/fixtures/ui.notification.en.yml +238 -0
- package/fixtures/ui.places.en.yml +104 -0
- package/fixtures/ui.reports.en.yml +138 -0
- package/fixtures/ui.scene.en.yml +11 -0
- package/fixtures/ui.schedule.en.yml +7 -0
- package/fixtures/ui.search.en.yml +73 -0
- package/fixtures/ui.validation.en.yml +63 -0
- package/fixtures/ui.zones.en.yml +121 -0
- package/package.json +7 -4
- package/fixtures/test.yml +0 -20
|
@@ -1,99 +1,66 @@
|
|
|
1
1
|
/* tslint:disable */
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as yaml from 'js-yaml';
|
|
4
|
-
import { Module } from
|
|
5
|
-
import { CustomTypeArrayNode } from
|
|
6
|
-
import { CustomTypeNode } from
|
|
7
|
-
import { EnumNode } from
|
|
8
|
-
import { NameSpaceNode } from
|
|
9
|
-
import { RootNode } from
|
|
10
|
-
import { TextArrayNode } from
|
|
11
|
-
import { TextNode } from
|
|
12
|
-
import { ValueNode } from
|
|
13
|
-
import { RootWriter } from
|
|
4
|
+
import { Module } from './ast/moduleDef.class';
|
|
5
|
+
import { CustomTypeArrayNode } from './customTypeArrayNode.class';
|
|
6
|
+
import { CustomTypeNode } from './customTypeNode.class';
|
|
7
|
+
import { EnumNode } from './enumNode.class';
|
|
8
|
+
import { NameSpaceNode } from './namespaceNode.class';
|
|
9
|
+
import { RootNode } from './rootNode.class';
|
|
10
|
+
import { TextArrayNode } from './textArrayNode.class';
|
|
11
|
+
import { TextNode } from './textNode.class';
|
|
12
|
+
import { ValueNode } from './valueNode.class';
|
|
13
|
+
import { RootWriter } from './writer.class';
|
|
14
14
|
// TODO: use factories
|
|
15
15
|
// interface NodeFactory<T extends Node> {
|
|
16
16
|
// matches(data:any):boolean;
|
|
17
17
|
// create(name:string, data:any):T;
|
|
18
18
|
// }
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class CustomTypeArrayContainer {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
}
|
|
19
|
+
//
|
|
20
|
+
// class EnumResourceContainer {
|
|
21
|
+
// constructor(public readonly content: any) {
|
|
22
|
+
// }
|
|
23
|
+
// }
|
|
24
|
+
//
|
|
25
|
+
// class CustomTypeContainer {
|
|
26
|
+
// constructor(public readonly customType: NodeName, public readonly content: any) {
|
|
27
|
+
// }
|
|
28
|
+
// }
|
|
29
|
+
//
|
|
30
|
+
// class CustomTypeArrayContainer {
|
|
31
|
+
// constructor(public readonly customType: NodeName, public readonly content: any) {
|
|
32
|
+
// }
|
|
33
|
+
// }
|
|
36
34
|
// TODO: merge this with nodes, so nodes become a type, not sure if this will be easy to do or not as
|
|
37
35
|
// we don't have the key name at this point. Might have to put it all in the factory so it can be called
|
|
38
36
|
// to embed a marker in the data and use that when checking the node type.
|
|
39
|
-
const EnumResourceType = new yaml.Type('!Enum', {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
this.className = className;
|
|
52
|
-
this.importDeclaration = importDeclaration;
|
|
53
|
-
}
|
|
54
|
-
asYamlType() {
|
|
55
|
-
const self = this;
|
|
56
|
-
return new yaml.Type(`!${this.className}`, {
|
|
57
|
-
kind: 'mapping',
|
|
58
|
-
construct: function (data) {
|
|
59
|
-
data = data || {}; // in case of empty node
|
|
60
|
-
return new CustomTypeContainer(self, data);
|
|
61
|
-
},
|
|
62
|
-
instanceOf: CustomTypeContainer
|
|
63
|
-
// `represent` is omitted here. So, Space objects will be dumped as is.
|
|
64
|
-
// That is regular mapping with three key-value pairs but with !space tag.
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
asYamlListType() {
|
|
68
|
-
const self = this;
|
|
69
|
-
return new yaml.Type(`!List(${this.className})`, {
|
|
70
|
-
kind: 'mapping',
|
|
71
|
-
construct: function (data) {
|
|
72
|
-
data = data || {}; // in case of empty node
|
|
73
|
-
return new CustomTypeArrayContainer(self, data);
|
|
74
|
-
},
|
|
75
|
-
instanceOf: CustomTypeArrayContainer
|
|
76
|
-
// `represent` is omitted here. So, Space objects will be dumped as is.
|
|
77
|
-
// That is regular mapping with three key-value pairs but with !space tag.
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
37
|
+
// const EnumResourceType = new yaml.Type('!Enum', {
|
|
38
|
+
// kind: 'mapping',
|
|
39
|
+
// construct: function (data) {
|
|
40
|
+
// data = data || {}; // in case of empty node
|
|
41
|
+
// return new EnumResourceContainer(data);
|
|
42
|
+
// },
|
|
43
|
+
// instanceOf: EnumResourceContainer
|
|
44
|
+
// // `represent` is omitted here. So, Space objects will be dumped as is.
|
|
45
|
+
// // That is regular mapping with three key-value pairs but with !space tag.
|
|
46
|
+
// });
|
|
47
|
+
//
|
|
48
|
+
//
|
|
81
49
|
// TODO: replace custom gulp task with https://www.npmjs.com/package/gulp-reduce-file
|
|
82
50
|
export class I18nGenerator {
|
|
83
51
|
constructor() {
|
|
84
|
-
this.customTypes = [];
|
|
85
52
|
this.rootNode = new RootNode();
|
|
86
53
|
this.rootNode.registerNodeTypes([
|
|
87
|
-
CustomTypeArrayNode, CustomTypeNode,
|
|
54
|
+
EnumNode, CustomTypeArrayNode, CustomTypeNode, TextNode, TextArrayNode, ValueNode, NameSpaceNode
|
|
88
55
|
]);
|
|
89
56
|
}
|
|
90
57
|
registerType(typeName, importDeclaration) {
|
|
91
|
-
this.
|
|
58
|
+
this.rootNode.registerCustomType({ typeName, importDeclaration });
|
|
92
59
|
}
|
|
93
60
|
readFile(fileName) {
|
|
94
|
-
let options = {
|
|
61
|
+
// let options = {schema: this.getSchema()};
|
|
95
62
|
console.log(`Loading: ${fileName}`);
|
|
96
|
-
const yamlData = yaml.safeLoad(fs.readFileSync(fileName, 'utf8')
|
|
63
|
+
const yamlData = yaml.safeLoad(fs.readFileSync(fileName, 'utf8'));
|
|
97
64
|
try {
|
|
98
65
|
this.rootNode.parse(yamlData);
|
|
99
66
|
}
|
|
@@ -101,22 +68,17 @@ export class I18nGenerator {
|
|
|
101
68
|
throw new Error(`Failed to parse file:${fileName}\n-> ${e.message}\n-> ${e.stack}`);
|
|
102
69
|
}
|
|
103
70
|
}
|
|
104
|
-
|
|
105
|
-
if (!this._schema) {
|
|
106
|
-
let types = [].concat(EnumResourceType, this.customTypes.map(type => type.asYamlType()), this.customTypes.map(type => type.asYamlListType()));
|
|
107
|
-
this._schema = yaml.Schema.create(types);
|
|
108
|
-
}
|
|
109
|
-
return this._schema;
|
|
110
|
-
}
|
|
111
|
-
toString() {
|
|
71
|
+
getApiContent() {
|
|
112
72
|
const writer = new RootWriter();
|
|
113
73
|
const module = new Module();
|
|
114
|
-
this.
|
|
115
|
-
module.addImport(type.importDeclaration);
|
|
116
|
-
});
|
|
117
|
-
this.rootNode.compile(module);
|
|
74
|
+
this.rootNode.generateApi(module);
|
|
118
75
|
module.writeBody(writer);
|
|
119
76
|
return writer.toString();
|
|
120
77
|
}
|
|
78
|
+
getDefaultBundleContent() {
|
|
79
|
+
const json = {};
|
|
80
|
+
this.rootNode.generateMessageBundle(json);
|
|
81
|
+
return JSON.stringify(json, null, 3);
|
|
82
|
+
}
|
|
121
83
|
}
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bkdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaTE4bkdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJNUMsc0JBQXNCO0FBQ3RCLDBDQUEwQztBQUMxQyxpQ0FBaUM7QUFDakMsdUNBQXVDO0FBQ3ZDLElBQUk7QUFDSixFQUFFO0FBQ0YsZ0NBQWdDO0FBQ2hDLGdEQUFnRDtBQUNoRCxNQUFNO0FBQ04sSUFBSTtBQUNKLEVBQUU7QUFDRiw4QkFBOEI7QUFDOUIsc0ZBQXNGO0FBQ3RGLE1BQU07QUFDTixJQUFJO0FBQ0osRUFBRTtBQUNGLG1DQUFtQztBQUNuQyxzRkFBc0Y7QUFDdEYsTUFBTTtBQUNOLElBQUk7QUFFSixxR0FBcUc7QUFDckcseUdBQXlHO0FBQ3pHLDBFQUEwRTtBQUMxRSxvREFBb0Q7QUFDcEQscUJBQXFCO0FBQ3JCLGlDQUFpQztBQUNqQyxrREFBa0Q7QUFDbEQsOENBQThDO0FBQzlDLE9BQU87QUFDUCxzQ0FBc0M7QUFDdEMsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSxNQUFNO0FBQ04sRUFBRTtBQUNGLEVBQUU7QUFFRixxRkFBcUY7QUFDckYsTUFBTSxPQUFPLGFBQWE7SUFNeEI7UUFDRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztZQUM5QixRQUFRLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLGFBQWE7U0FDakcsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxRQUFnQixFQUFFLGlCQUF5QjtRQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsUUFBUSxDQUFDLFFBQWdCO1FBQ3ZCLDRDQUE0QztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSTtZQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQy9CO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixRQUFRLFFBQVEsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNyRjtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBRUYifQ==
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { Arguments } from './arguments.class';
|
|
2
2
|
import { ContainerElement } from './ast/containerElement.class';
|
|
3
3
|
import { Constructor } from './constructor.class';
|
|
4
|
+
import { NodeName } from './nodeName';
|
|
4
5
|
export declare type NodeConstructor<T extends I18nNode> = {
|
|
5
|
-
matches(data: any): boolean;
|
|
6
|
+
matches(name: NodeName, data: any): boolean;
|
|
6
7
|
new (...args: any[]): T;
|
|
7
8
|
prototype: T;
|
|
8
9
|
};
|
|
9
10
|
export declare class I18nNode {
|
|
10
11
|
protected parent: I18nNode;
|
|
11
|
-
readonly name:
|
|
12
|
+
readonly name: NodeName;
|
|
12
13
|
private childNodes;
|
|
13
14
|
private templateArgs;
|
|
14
|
-
constructor(parent: I18nNode, name:
|
|
15
|
+
constructor(parent: I18nNode, name: NodeName);
|
|
15
16
|
readonly key: string;
|
|
16
17
|
/**
|
|
17
18
|
* Returns the full path to this nodes namespace as used in code. Doesn't include the I18n prefix.
|
|
@@ -21,23 +22,20 @@ export declare class I18nNode {
|
|
|
21
22
|
isRoot(): boolean;
|
|
22
23
|
pathToRoot(): I18nNode[];
|
|
23
24
|
parse(yamlData: any): void;
|
|
24
|
-
protected
|
|
25
|
-
getOrCreatNode(name:
|
|
25
|
+
protected parseChild<T extends I18nNode>(name: NodeName, data: any, defaultNodeType: Constructor<T>): I18nNode;
|
|
26
|
+
getOrCreatNode(name: NodeName, type: typeof I18nNode): I18nNode;
|
|
26
27
|
rootNode(): I18nNode;
|
|
27
28
|
nodeTypes(): NodeConstructor<any>[];
|
|
28
|
-
protected computeNodeTypeOf(data: any): NodeConstructor<any>;
|
|
29
|
+
protected computeNodeTypeOf(name: NodeName, data: any): NodeConstructor<any>;
|
|
29
30
|
protected supportedChildNodeTypes(): NodeConstructor<any>[];
|
|
30
|
-
protected withEachProperty(yamlData: any, cb: (name:
|
|
31
|
+
protected withEachProperty(yamlData: any, cb: (name: NodeName, data: any) => void): void;
|
|
31
32
|
protected readonly children: I18nNode[];
|
|
32
33
|
protected eachChild(cb: (node: I18nNode) => void): void;
|
|
33
34
|
getArgs(): Arguments;
|
|
34
35
|
hasArgs(): boolean;
|
|
35
|
-
readonly safeName: string;
|
|
36
|
-
readonly javaScriptName: string;
|
|
37
|
-
readonly camelCaseName: string;
|
|
38
36
|
readonly namespaceName: string;
|
|
39
37
|
readonly className: string;
|
|
40
38
|
readonly fqClassName: string;
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
generateApi(parent: ContainerElement): void;
|
|
40
|
+
generateMessageBundle(parent: {}): void;
|
|
43
41
|
}
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import * as _ from 'lodash';
|
|
2
|
-
import S from 'string';
|
|
3
2
|
import { Arguments } from './arguments.class';
|
|
4
|
-
|
|
5
|
-
function safeName(name) {
|
|
6
|
-
return _.includes(reservedWords, name) ? `${name}_` : name;
|
|
7
|
-
}
|
|
8
|
-
function camelize(text) {
|
|
9
|
-
return S(text).camelize().toString();
|
|
10
|
-
}
|
|
3
|
+
import { NodeName } from './nodeName';
|
|
11
4
|
export class I18nNode {
|
|
12
5
|
constructor(parent, name) {
|
|
13
6
|
this.parent = parent;
|
|
@@ -16,7 +9,7 @@ export class I18nNode {
|
|
|
16
9
|
this.templateArgs = new Arguments();
|
|
17
10
|
}
|
|
18
11
|
get key() {
|
|
19
|
-
return this.pathToRoot().slice(1).map(a => a.name).join('.');
|
|
12
|
+
return this.pathToRoot().slice(1).map(a => a.name.asJsIdentifier).join('.');
|
|
20
13
|
}
|
|
21
14
|
/**
|
|
22
15
|
* Returns the full path to this nodes namespace as used in code. Doesn't include the I18n prefix.
|
|
@@ -37,29 +30,29 @@ export class I18nNode {
|
|
|
37
30
|
}
|
|
38
31
|
parse(yamlData) {
|
|
39
32
|
this.withEachProperty(yamlData, (name, data) => {
|
|
40
|
-
this.
|
|
33
|
+
this.parseChild(name, data, this.computeNodeTypeOf(name, data));
|
|
41
34
|
});
|
|
42
35
|
}
|
|
43
|
-
|
|
44
|
-
const
|
|
36
|
+
parseChild(name, data, defaultNodeType) {
|
|
37
|
+
const child = this.getOrCreatNode(name, defaultNodeType);
|
|
45
38
|
if (this.constructor['acceptsChildNodesOfType']) {
|
|
46
39
|
const types = this.constructor['acceptsChildNodesOfType']();
|
|
47
|
-
if (!_.find(types, type =>
|
|
40
|
+
if (!_.find(types, type => child instanceof type)) {
|
|
48
41
|
throw new Error(`Unsupported child type, must be one of ${types.map(t => t.name).join()}, got ${defaultNodeType.name}.`);
|
|
49
42
|
}
|
|
50
43
|
}
|
|
51
|
-
|
|
52
|
-
return
|
|
44
|
+
child.parse(data);
|
|
45
|
+
return child;
|
|
53
46
|
}
|
|
54
47
|
getOrCreatNode(name, type) {
|
|
55
|
-
let node = this.childNodes.get(name);
|
|
48
|
+
let node = this.childNodes.get(name.asJsIdentifier);
|
|
56
49
|
if (node && node.constructor != type) {
|
|
57
|
-
throw new Error(`Existing node named ${name} has different type, expected ${type['
|
|
50
|
+
throw new Error(`Existing node named ${name} has different type, expected ${type['nodeName']}, got ${node.constructor['nodeName']}`);
|
|
58
51
|
}
|
|
59
|
-
// console.log(`--> getOrCreateNode(${
|
|
52
|
+
// console.log(`--> getOrCreateNode(${nodeName}, ${type}) ${node ? 'found' : 'created'}`);
|
|
60
53
|
if (!node) {
|
|
61
54
|
node = new type(this, name);
|
|
62
|
-
this.childNodes.set(name, node);
|
|
55
|
+
this.childNodes.set(name.asJsIdentifier, node);
|
|
63
56
|
}
|
|
64
57
|
return node;
|
|
65
58
|
}
|
|
@@ -69,8 +62,8 @@ export class I18nNode {
|
|
|
69
62
|
nodeTypes() {
|
|
70
63
|
return this.rootNode().nodeTypes();
|
|
71
64
|
}
|
|
72
|
-
computeNodeTypeOf(data) {
|
|
73
|
-
const type = _.find(this.supportedChildNodeTypes(), it => it.matches(data));
|
|
65
|
+
computeNodeTypeOf(name, data) {
|
|
66
|
+
const type = _.find(this.supportedChildNodeTypes(), it => it.matches(name, data));
|
|
74
67
|
if (!type) {
|
|
75
68
|
throw new Error(`no matching node type found for ${this.accessor}`);
|
|
76
69
|
}
|
|
@@ -82,10 +75,11 @@ export class I18nNode {
|
|
|
82
75
|
withEachProperty(yamlData, cb) {
|
|
83
76
|
if (yamlData) {
|
|
84
77
|
Object.getOwnPropertyNames(yamlData).forEach(unsafeKey => {
|
|
85
|
-
|
|
86
|
-
|
|
78
|
+
const name = NodeName.parse(unsafeKey);
|
|
79
|
+
if (name.isReserved()) {
|
|
80
|
+
console.log(`Warning: Yaml key '${unsafeKey}' in ${this.key} is a reserved word, converting to '${name.safeName}'`);
|
|
87
81
|
}
|
|
88
|
-
cb(
|
|
82
|
+
cb(name, yamlData[unsafeKey]);
|
|
89
83
|
});
|
|
90
84
|
}
|
|
91
85
|
}
|
|
@@ -101,32 +95,27 @@ export class I18nNode {
|
|
|
101
95
|
hasArgs() {
|
|
102
96
|
return this.getArgs().any();
|
|
103
97
|
}
|
|
104
|
-
get safeName() {
|
|
105
|
-
return safeName(this.name);
|
|
106
|
-
}
|
|
107
|
-
get javaScriptName() {
|
|
108
|
-
const name = this.camelCaseName;
|
|
109
|
-
return reservedWords.includes(this.name) ? `${name}_` : name;
|
|
110
|
-
}
|
|
111
|
-
get camelCaseName() {
|
|
112
|
-
return camelize(this.name);
|
|
113
|
-
}
|
|
114
98
|
get namespaceName() {
|
|
115
|
-
return this.
|
|
99
|
+
return this.name.asJsIdentifier;
|
|
116
100
|
}
|
|
117
101
|
get className() {
|
|
118
|
-
return this.
|
|
102
|
+
return this.name.asClassName;
|
|
119
103
|
}
|
|
120
104
|
get fqClassName() {
|
|
121
105
|
// the root node has no className and the second one is the language
|
|
122
106
|
let parents = this.pathToRoot().slice(2);
|
|
123
107
|
return parents.map(n => n.className).join('');
|
|
124
108
|
}
|
|
125
|
-
|
|
126
|
-
return this.name;
|
|
127
|
-
}
|
|
128
|
-
compile(parent) {
|
|
109
|
+
generateApi(parent) {
|
|
129
110
|
throw new Error('abstract method');
|
|
130
111
|
}
|
|
112
|
+
generateMessageBundle(parent) {
|
|
113
|
+
const me = {};
|
|
114
|
+
parent[this.namespaceName] = me;
|
|
115
|
+
this.eachChild(child => {
|
|
116
|
+
// console.log({child: child.constructor});
|
|
117
|
+
return child.generateMessageBundle(me);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
131
120
|
}
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bk5vZGUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2kxOG5Ob2RlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUc5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBU3RDLE1BQU0sT0FBTyxRQUFRO0lBS25CLFlBQXNCLE1BQWdCLEVBQWtCLElBQWM7UUFBaEQsV0FBTSxHQUFOLE1BQU0sQ0FBVTtRQUFrQixTQUFJLEdBQUosSUFBSSxDQUFVO1FBSDlELGVBQVUsR0FBMEIsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFDaEUsaUJBQVksR0FBYyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBR2xELENBQUM7SUFHRCxJQUFJLEdBQUc7UUFDTCxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1YsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQW1CO1FBQ25DLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdEIsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFhO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFjLEVBQUUsSUFBUyxFQUFFLEVBQUU7WUFDNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxVQUFVLENBQXFCLElBQWMsRUFBRSxJQUFTLEVBQUUsZUFBK0I7UUFDakcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDekQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLHlCQUF5QixDQUFDLEVBQUU7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFnQixDQUFDO1lBQzFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsRUFBRTtnQkFDakQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxlQUFlLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzthQUMxSDtTQUNGO1FBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBYyxFQUFFLElBQXFCO1FBQ2xELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQWEsQ0FBQztRQUNoRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixJQUFJLGlDQUFpQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEk7UUFDRCwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNoRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRCxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxJQUFjLEVBQUUsSUFBUztRQUNuRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDckU7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFUyx1QkFBdUI7UUFDL0IsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVTLGdCQUFnQixDQUFDLFFBQWEsRUFBRSxFQUF1QztRQUMvRSxJQUFJLFFBQVEsRUFBRTtZQUNaLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3ZELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixTQUFTLFFBQVEsSUFBSSxDQUFDLEdBQUcsdUNBQXVDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2lCQUNySDtnQkFDRCxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsSUFBYyxRQUFRO1FBQ3BCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVTLFNBQVMsQ0FBQyxFQUE0QjtRQUM5QyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixvRUFBb0U7UUFDcEUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxXQUFXLENBQUMsTUFBd0I7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxNQUFVO1FBQzlCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDckIsMkNBQTJDO1lBQzNDLE9BQU8sS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIn0=
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { ContainerElement } from './ast/containerElement.class';
|
|
2
|
+
import { I18nNode } from './i18nNode.class';
|
|
3
|
+
import { NodeName } from './nodeName';
|
|
3
4
|
export declare class NameSpaceNode extends I18nNode {
|
|
4
|
-
static matches(yamlData: any): boolean;
|
|
5
|
-
|
|
5
|
+
static matches(name: NodeName, yamlData: any): boolean;
|
|
6
|
+
generateApi(parent: ContainerElement): void;
|
|
6
7
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { I18nNode } from
|
|
1
|
+
import { I18nNode } from './i18nNode.class';
|
|
2
2
|
export class NameSpaceNode extends I18nNode {
|
|
3
|
-
static matches(yamlData) {
|
|
3
|
+
static matches(name, yamlData) {
|
|
4
4
|
// we're fallback so we're greedy, just make sure I'm last in the list of matchers
|
|
5
5
|
return true;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
generateApi(parent) {
|
|
8
8
|
parent.nestedContainer(this.namespaceName, namespace => {
|
|
9
|
-
this.eachChild(child => child.
|
|
9
|
+
this.eachChild(child => child.generateApi(namespace));
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZXNwYWNlTm9kZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbmFtZXNwYWNlTm9kZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHNUMsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBRXpDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBYyxFQUFFLFFBQWE7UUFDMUMsbUZBQW1GO1FBQ25GLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUF3QjtRQUNsQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLEVBQUU7WUFDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FFRiJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class NodeName {
|
|
2
|
+
private name;
|
|
3
|
+
readonly customTypeName?: string;
|
|
4
|
+
readonly isArray?: boolean;
|
|
5
|
+
constructor(name: string, customTypeName?: string, isArray?: boolean);
|
|
6
|
+
isReserved(): boolean;
|
|
7
|
+
readonly safeName: string;
|
|
8
|
+
readonly asJsIdentifier: string;
|
|
9
|
+
readonly asClassName: string;
|
|
10
|
+
}
|
|
11
|
+
export declare namespace NodeName {
|
|
12
|
+
function parse(name: string): NodeName;
|
|
13
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Memoize } from '@typescript-plus/fast-memoize-decorator/dist/src';
|
|
11
|
+
import * as _ from 'lodash';
|
|
12
|
+
import S from 'string';
|
|
13
|
+
function safeName(name) {
|
|
14
|
+
return _.includes(reservedWords, name) ? `${name}_` : name;
|
|
15
|
+
}
|
|
16
|
+
function camelize(text) {
|
|
17
|
+
return S(text).camelize().toString();
|
|
18
|
+
}
|
|
19
|
+
const reservedWords = ['default', 'switch', 'if', 'else'];
|
|
20
|
+
export class NodeName {
|
|
21
|
+
constructor(name, customTypeName, isArray) {
|
|
22
|
+
this.name = name;
|
|
23
|
+
this.customTypeName = customTypeName;
|
|
24
|
+
this.isArray = isArray;
|
|
25
|
+
}
|
|
26
|
+
isReserved() {
|
|
27
|
+
return reservedWords.includes(this.name);
|
|
28
|
+
}
|
|
29
|
+
get safeName() {
|
|
30
|
+
let camelName = camelize(this.name);
|
|
31
|
+
let safeName = reservedWords.includes(camelName) ? `${camelName}_` : camelName;
|
|
32
|
+
// console.log({ safeName });
|
|
33
|
+
return safeName;
|
|
34
|
+
}
|
|
35
|
+
get asJsIdentifier() {
|
|
36
|
+
return this.safeName;
|
|
37
|
+
}
|
|
38
|
+
get asClassName() {
|
|
39
|
+
return this.asJsIdentifier[0].toUpperCase() + this.asJsIdentifier.slice(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
__decorate([
|
|
43
|
+
Memoize(),
|
|
44
|
+
__metadata("design:type", Function),
|
|
45
|
+
__metadata("design:paramtypes", []),
|
|
46
|
+
__metadata("design:returntype", Boolean)
|
|
47
|
+
], NodeName.prototype, "isReserved", null);
|
|
48
|
+
__decorate([
|
|
49
|
+
Memoize(),
|
|
50
|
+
__metadata("design:type", String),
|
|
51
|
+
__metadata("design:paramtypes", [])
|
|
52
|
+
], NodeName.prototype, "safeName", null);
|
|
53
|
+
__decorate([
|
|
54
|
+
Memoize(),
|
|
55
|
+
__metadata("design:type", String),
|
|
56
|
+
__metadata("design:paramtypes", [])
|
|
57
|
+
], NodeName.prototype, "asJsIdentifier", null);
|
|
58
|
+
__decorate([
|
|
59
|
+
Memoize(),
|
|
60
|
+
__metadata("design:type", String),
|
|
61
|
+
__metadata("design:paramtypes", [])
|
|
62
|
+
], NodeName.prototype, "asClassName", null);
|
|
63
|
+
(function (NodeName) {
|
|
64
|
+
const CUSTOM_TYPE_NAME_REGEX = /^([^\(]*)\(([^\[)]*)(\[\])?\)\s*$/;
|
|
65
|
+
function parse(name) {
|
|
66
|
+
const match = CUSTOM_TYPE_NAME_REGEX.exec(name);
|
|
67
|
+
if (match) {
|
|
68
|
+
// console.log(match);
|
|
69
|
+
return new NodeName(match[1], match[2], !!match[3]);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return new NodeName(name);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
NodeName.parse = parse;
|
|
76
|
+
})(NodeName || (NodeName = {}));
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZU5hbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL25vZGVOYW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUMzRSxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsU0FBUyxRQUFRLENBQUMsSUFBWTtJQUM1QixPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDN0QsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLElBQVk7SUFDNUIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUVELE1BQU0sYUFBYSxHQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFcEUsTUFBTSxPQUFPLFFBQVE7SUFFbkIsWUFBb0IsSUFBWSxFQUNYLGNBQXVCLEVBQ3ZCLE9BQWlCO1FBRmxCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWCxtQkFBYyxHQUFkLGNBQWMsQ0FBUztRQUN2QixZQUFPLEdBQVAsT0FBTyxDQUFVO0lBQ3RDLENBQUM7SUFHRCxVQUFVO1FBQ1IsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBR0QsSUFBSSxRQUFRO1FBQ1YsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDL0UsNkJBQTZCO1FBQzdCLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFHRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFHRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztDQUVGO0FBdEJDO0lBREMsT0FBTyxFQUFFOzs7OzBDQUdUO0FBR0Q7SUFEQyxPQUFPLEVBQUU7Ozt3Q0FNVDtBQUdEO0lBREMsT0FBTyxFQUFFOzs7OENBR1Q7QUFHRDtJQURDLE9BQU8sRUFBRTs7OzJDQUdUO0FBSUgsV0FBaUIsUUFBUTtJQUN2QixNQUFNLHNCQUFzQixHQUFHLG1DQUFtQyxDQUFDO0lBRW5FLFNBQWdCLEtBQUssQ0FBQyxJQUFZO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxJQUFJLEtBQUssRUFBRTtZQUNULHNCQUFzQjtZQUN0QixPQUFPLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDTCxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQVJlLGNBQUssUUFRcEIsQ0FBQTtBQUNILENBQUMsRUFaZ0IsUUFBUSxLQUFSLFFBQVEsUUFZeEIifQ==
|
|
@@ -2,6 +2,7 @@ import { Module } from './ast/moduleDef.class';
|
|
|
2
2
|
import { I18nNode, NodeConstructor } from './i18nNode.class';
|
|
3
3
|
export declare class RootNode extends I18nNode {
|
|
4
4
|
private _nodeTypes;
|
|
5
|
+
private readonly customTypesImports;
|
|
5
6
|
constructor();
|
|
6
7
|
registerNodeTypes(nodeTypes: NodeConstructor<any>[]): void;
|
|
7
8
|
nodeTypes(): NodeConstructor<any>[];
|
|
@@ -10,5 +11,13 @@ export declare class RootNode extends I18nNode {
|
|
|
10
11
|
/*********
|
|
11
12
|
*
|
|
12
13
|
********/
|
|
13
|
-
|
|
14
|
+
generateApi(module: Module): void;
|
|
15
|
+
/*********
|
|
16
|
+
*
|
|
17
|
+
********/
|
|
18
|
+
generateMessageBundle(object: {}): void;
|
|
19
|
+
registerCustomType(customType: {
|
|
20
|
+
typeName: string;
|
|
21
|
+
importDeclaration: string;
|
|
22
|
+
}): void;
|
|
14
23
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { Arguments } from './arguments.class';
|
|
1
2
|
import { I18nNode } from './i18nNode.class';
|
|
3
|
+
import { NodeName } from './nodeName';
|
|
2
4
|
export class RootNode extends I18nNode {
|
|
3
5
|
constructor() {
|
|
4
|
-
super(null, '');
|
|
6
|
+
super(null, new NodeName(''));
|
|
5
7
|
this._nodeTypes = [];
|
|
8
|
+
this.customTypesImports = new Map();
|
|
6
9
|
}
|
|
7
10
|
registerNodeTypes(nodeTypes) {
|
|
8
11
|
this._nodeTypes = nodeTypes;
|
|
@@ -12,7 +15,7 @@ export class RootNode extends I18nNode {
|
|
|
12
15
|
}
|
|
13
16
|
parse(yamlData) {
|
|
14
17
|
this.withEachProperty(yamlData, (name, data) => {
|
|
15
|
-
const node = this.getOrCreatNode(name, this.computeNodeTypeOf(data));
|
|
18
|
+
const node = this.getOrCreatNode(name, this.computeNodeTypeOf(name, data));
|
|
16
19
|
node.parse(data);
|
|
17
20
|
});
|
|
18
21
|
}
|
|
@@ -22,19 +25,52 @@ export class RootNode extends I18nNode {
|
|
|
22
25
|
/*********
|
|
23
26
|
*
|
|
24
27
|
********/
|
|
25
|
-
|
|
28
|
+
generateApi(module) {
|
|
26
29
|
module.addHeader(`/******** IMPORTANT *********`);
|
|
27
30
|
module.addHeader(` * `);
|
|
28
31
|
module.addHeader(` * This file is automatically generated. Any edits will be lost.`);
|
|
29
32
|
module.addHeader(` * `);
|
|
30
33
|
module.addHeader(' ****/');
|
|
31
34
|
module.addHeader('/* tslint:disable:no-shadowed-variable */');
|
|
32
|
-
module.addImport(`import
|
|
35
|
+
module.addImport(`import MessageFormat from 'message-format'`);
|
|
36
|
+
this.customTypesImports.forEach((importDeclaration, className) => {
|
|
37
|
+
module.addImport(importDeclaration);
|
|
38
|
+
});
|
|
39
|
+
module.addImport('import defaultBundle from \'./locales/en.json\'');
|
|
33
40
|
module.nestedContainer('I18n', namespace => {
|
|
41
|
+
namespace.createStatement('let _locale:string = "en"');
|
|
42
|
+
namespace.createStatement('let _activeBundle:any = null');
|
|
43
|
+
namespace.createStatement('const _bundles = new Map<string,any>()');
|
|
44
|
+
const args = Arguments.createAll({
|
|
45
|
+
locale: 'string',
|
|
46
|
+
bundle: 'any'
|
|
47
|
+
});
|
|
48
|
+
namespace.createFunction('registerBundle', args, 'void', writer => {
|
|
49
|
+
writer.println(`if (_bundles.has(locale)) { throw new Error("bundle already registered for: " + locale)}`);
|
|
50
|
+
writer.println(`_bundles.set(locale, bundle);`);
|
|
51
|
+
});
|
|
52
|
+
namespace.createFunction('setLanguage', Arguments.createSingle('locale', 'string'), 'void', writer => {
|
|
53
|
+
writer.println(`if (!_bundles.has(locale)) { throw new Error("No bundle registered for: " + locale)}`);
|
|
54
|
+
writer.println(`_locale = locale;`);
|
|
55
|
+
writer.println(`_activeBundle = _bundles.get(_locale);`);
|
|
56
|
+
});
|
|
57
|
+
namespace.createStatement('registerBundle("en", defaultBundle)');
|
|
58
|
+
namespace.createStatement('setLanguage("en")');
|
|
34
59
|
this.eachChild(child => {
|
|
35
|
-
child.
|
|
60
|
+
child.generateApi(namespace);
|
|
36
61
|
});
|
|
37
62
|
});
|
|
38
63
|
}
|
|
64
|
+
/*********
|
|
65
|
+
*
|
|
66
|
+
********/
|
|
67
|
+
generateMessageBundle(object) {
|
|
68
|
+
this.eachChild(child => {
|
|
69
|
+
child.generateMessageBundle(object);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
registerCustomType(customType) {
|
|
73
|
+
this.customTypesImports.set(customType.typeName, customType.importDeclaration);
|
|
74
|
+
}
|
|
39
75
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdE5vZGUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Jvb3ROb2RlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUc5QyxPQUFPLEVBQUUsUUFBUSxFQUFtQixNQUFNLGtCQUFrQixDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEMsTUFBTSxPQUFPLFFBQVMsU0FBUSxRQUFRO0lBS3BDO1FBQ0UsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBSnhCLGVBQVUsR0FBMkIsRUFBRSxDQUFDO1FBQy9CLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBSWhFLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxTQUFpQztRQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQWE7UUFDakIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLElBQWMsRUFBRSxJQUFTLEVBQUUsRUFBRTtZQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxTQUFtQjtRQUNuQyxRQUFRO0lBQ1YsQ0FBQztJQUVEOztjQUVVO0lBQ1YsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxD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
|