-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutilities.ts
115 lines (104 loc) · 3.49 KB
/
utilities.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { Emoji } from "./mod.ts";
export interface FormatOptions {
useTabs: boolean;
indentSize: number;
map: boolean;
minimal: boolean;
}
const defaultFormatOptions: FormatOptions = {
useTabs: false,
indentSize: 2,
map: false,
minimal: false,
};
// deno-lint-ignore no-empty-interface
export interface JSONFileOptions extends FormatOptions {}
export interface TypeScriptFileOptions extends FormatOptions {
singleQuotes: boolean;
semicolon: boolean;
jsDocs: boolean;
defaultExport: boolean;
exportName?: string; // not implemented
}
export const defaultJSONFileOptions: JSONFileOptions = {
...defaultFormatOptions,
};
export const defaultTypeScriptFileOptions: TypeScriptFileOptions = {
...defaultFormatOptions,
singleQuotes: false,
semicolon: true,
jsDocs: true,
defaultExport: true,
};
export function makeJSONFileContent(
emoji: Emoji[],
options: Partial<JSONFileOptions> = {},
): string {
const opts: JSONFileOptions = { ...defaultJSONFileOptions, ...options };
const indent = opts.useTabs ? "\t" : " ".repeat(opts.indentSize);
if (opts.map) {
const entries = emoji.map((emoji) => [
emoji.identifier,
opts.minimal ? emoji.emoji : emoji,
]);
const output = Object.fromEntries(entries);
return JSON.stringify(output, null, indent);
} else {
const output = emoji.map((emoji) => {
return opts.minimal
? { identifier: emoji.identifier, emoji: emoji.emoji }
: emoji;
});
return JSON.stringify(output, null, indent);
}
}
export function makeTypeScriptFileContent(
emoji: Emoji[],
options: Partial<TypeScriptFileOptions> = {},
): string {
const opts: TypeScriptFileOptions = {
...defaultTypeScriptFileOptions,
...options,
};
if (!opts.defaultExport && opts.exportName == null) {
throw new Error(
"Must specify a 'exportName' if 'defaultExport' is false.",
);
}
const indent = opts.useTabs ? "\t" : " ".repeat(opts.indentSize);
const quote = opts.singleQuotes ? "'" : '"';
const semicolon = opts.semicolon ? ";" : "";
if (opts.map) {
const list = emoji.map((e) => {
const key = `${quote}${e.identifier}${quote}`;
const value = opts.minimal
? `${quote}${e.emoji}${quote}`
: "{\n" + JSON.stringify(e, null, indent)
.split("\n")
.slice(1, -1)
.map((line) => indent + line)
.join("\n") +
`\n${indent}}`;
const line = `${indent}${key}: ${value},`;
const docs = opts.jsDocs
? `${indent}/** ${e.emoji} ${e.name} */\n`
: "";
return docs + "\n" + line;
}).join("\n");
const exportStatement = opts.defaultExport
? `export default {`
: `export const ${opts.exportName} = {`;
return `${exportStatement}\n${list}\n}${semicolon}\n`;
} else {
const exportStatement = opts.defaultExport
? `export default `
: `export const ${opts.exportName} = `;
const output = emoji.map((emoji) => {
return opts.minimal
? { identifier: emoji.identifier, emoji: emoji.emoji }
: emoji;
});
const list = JSON.stringify(output, null, indent);
return `${exportStatement}${list}${semicolon}\n`;
}
}