-
Notifications
You must be signed in to change notification settings - Fork 54
/
Copy pathjavascript.ts
82 lines (76 loc) · 2.66 KB
/
javascript.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import { Answers, QuestionCollection } from 'inquirer';
import { ModuleKind, ScriptTarget, transpileModule } from 'typescript';
import { SegmentAPI } from '../api';
import { getLanguageMetadata } from './quicktype-utils';
import { FileGenerateResult, GeneratorOptions, LanguageGenerator, TemplateContext } from './types';
import { typescript } from './typescript';
class JavascriptGenerator implements LanguageGenerator {
id: string;
name: string;
extension: string;
advancedOptions?: QuestionCollection<Answers> | undefined;
supportedSDKs = typescript.supportedSDKs;
defaultQuicktypeOptions = {
'just-types': true,
};
constructor() {
const data = getLanguageMetadata('javascript');
this.name = data.name;
this.id = data.id;
this.extension = data.extension;
this.advancedOptions = [
{
type: 'list',
name: 'target',
message: 'Target',
choices: [
{ name: 'ES3', value: ScriptTarget.ES3 },
{ name: 'ES5', value: ScriptTarget.ES5 },
{ name: 'ES2015', value: ScriptTarget.ES2015 },
{ name: 'ES2016', value: ScriptTarget.ES2016 },
{ name: 'ES2017', value: ScriptTarget.ES2017 },
{ name: 'ES2018', value: ScriptTarget.ES2018 },
{ name: 'ES2019', value: ScriptTarget.ES2019 },
{ name: 'ESNext', value: ScriptTarget.ESNext },
{ name: 'Latest', value: ScriptTarget.Latest },
],
default: ScriptTarget.ESNext,
},
{
type: 'list',
name: 'module',
message: 'Module',
choices: [
{ name: 'CommonJS', value: ModuleKind.CommonJS },
{ name: 'AMD', value: ModuleKind.AMD },
{ name: 'UMD', value: ModuleKind.UMD },
{ name: 'System', value: ModuleKind.System },
{ name: 'ES2015', value: ModuleKind.ES2015 },
{ name: 'ESNext', value: ModuleKind.ESNext },
],
default: ModuleKind.ESNext,
},
];
}
generate = async (
rules: SegmentAPI.RuleMetadata[],
context: TemplateContext,
options: GeneratorOptions,
): Promise<FileGenerateResult> => {
const files = await typescript.generate(rules, context, options);
const transpiledFiles = new Map<string, string>();
for (const [name, contents] of files.entries()) {
const { outputText } = transpileModule(contents, {
compilerOptions: {
target: options.target as ScriptTarget,
module: options.module as ModuleKind,
esModuleInterop: true,
},
});
transpiledFiles.set(name, outputText);
}
// TODO: Prettier
return transpiledFiles;
};
}
export const javascript = new JavascriptGenerator();