diff --git a/src/constants.ts b/src/constants.ts index dd4371d..7c02456 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -6,6 +6,14 @@ export const SUB_INCLUDE_CONFIG = "include"; export const INCLUDE_CONFIG = `${packageJson.name}.${SUB_INCLUDE_CONFIG}`; export const VERSION_STATE = "version"; +export type Languages = { + [key: string]: { + name: string; + scopeName: string; + stripIndent: boolean; + }; +}; + /* eslint sort-keys: ["error", "asc"] */ export const LANGUAGES = { bat: "source.batchfile", @@ -146,12 +154,3 @@ export const LANGUAGES = { xsl: "text.xml.xsl", yaml: "source.yaml", }; -/* eslint-disable sort-keys */ - -export type Languages = { - [key: string]: { - name: string; - scopeName: string; - stripIndent: boolean; - }; -}; diff --git a/src/generate.ts b/src/generate.ts index d101178..a3bf29a 100644 --- a/src/generate.ts +++ b/src/generate.ts @@ -1,9 +1,10 @@ import { LANGUAGES, Languages } from "./constants"; import { InjectionGrammar } from "./injection-grammar"; import { Package } from "./package"; +import { hasBoolKey, hasStringKey } from "./utils"; -const normalizeLanguages = (languages: { [key: string]: unknown }) => { - const normalizedLanguages: Languages = {}; +const parseLanguages = (languages: { [key: string]: unknown }): Languages => { + const parsedLanguages: Languages = {}; for (const id in languages) { let language = languages[id]; if (typeof language === "string") { @@ -11,32 +12,24 @@ const normalizeLanguages = (languages: { [key: string]: unknown }) => { } if (typeof language === "object" && language !== null) { - if (!("scopeName" in language)) { + if (!hasStringKey(language, "scopeName")) { continue; } - if (typeof language.scopeName !== "string") { - continue; - } - - normalizedLanguages[id] = { - name: - "name" in language && typeof language.name === "string" - ? language.name - : id, + parsedLanguages[id] = { + name: hasStringKey(language, "name") ? language.name : id, scopeName: language.scopeName, - stripIndent: - "stripIndent" in language && typeof language.stripIndent === "boolean" - ? language.stripIndent - : false, + stripIndent: hasBoolKey(language, "stripIndent") + ? language.stripIndent + : false, }; } } - return normalizedLanguages; + return parsedLanguages; }; export const generateFiles = (languages = LANGUAGES) => { - const parsedLanguages = normalizeLanguages(languages); + const parsedLanguages = parseLanguages(languages); const grammars = [ new InjectionGrammar("source.yaml", parsedLanguages), new InjectionGrammar("source.github-actions-workflow", parsedLanguages), diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..8c3f95d --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,20 @@ +export function hasKey( + obj: object, + key: K, +): obj is { [P in K]: unknown } { + return key in obj; +} + +export function hasStringKey( + obj: object, + key: K, +): obj is { [P in K]: string } { + return hasKey(obj, key) && typeof obj[key] === "string"; +} + +export function hasBoolKey( + obj: object, + key: K, +): obj is { [P in K]: boolean } { + return hasKey(obj, key) && typeof obj[key] === "boolean"; +}