diff --git a/build.js b/build.js deleted file mode 100644 index 809ce05..0000000 --- a/build.js +++ /dev/null @@ -1,52 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const tinycolor = require('tinycolor2'); -const yaml = require('js-yaml'); - -const THEME_DIR = path.join(__dirname, 'theme'); -const THEME_YAML_FILE = path.join(__dirname, 'src', 'dracula.yml'); - -if (!fs.existsSync(THEME_DIR)) { - fs.mkdirSync(THEME_DIR); -} - -const withAlphaType = new yaml.Type('!alpha', { - kind: 'sequence', - construct: data => { - return data[0] + data[1]; - }, - represent: data => { - return [data[0], data[1]]; - }, -}); -const schema = yaml.Schema.create([withAlphaType]); -const standard = fs.readFileSync(THEME_YAML_FILE, 'utf8'); - -yamlObj = yaml.load(standard, { schema }); - -yamlObj.colors = Object.keys(yamlObj.colors).reduce((obj, key) => { - if (yamlObj.colors[key] === null) { - return obj; - } - return Object.assign({}, obj, { [key]: yamlObj.colors[key] }); -}, {}); - -const brightColors = [...yamlObj.dracula.ansi, ...yamlObj.dracula.brightOther]; - -const soft = standard.replace(/'(#[0-9A-Z]{6})/g, (match, hex) => { - if (brightColors.indexOf(hex) > -1) { - return `'${tinycolor(hex) - .desaturate(20) - .toHexString()}`; - } - return `'${tinycolor(hex).toHexString()}`; -}); - -fs.writeFileSync( - path.join(THEME_DIR, 'dracula.json'), - JSON.stringify(yaml.load(standard, { schema }), null, 4) -); -fs.writeFileSync( - path.join(THEME_DIR, 'dracula-soft.json'), - JSON.stringify(yaml.load(soft, { schema }), null, 4) -); diff --git a/package.json b/package.json index b1ee879..44debe1 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "license": "MIT", "scripts": { "attach": "./bootstrap.sh attach", - "build": "node ./build.js", + "build": "node ./scripts/build.js", + "lint": "node ./scripts/lint.js", "eject": "./bootstrap.sh eject", "package": "vsce package -o ./bin/dracula.vsix", "vscode:prepublish": "npm run build" diff --git a/scripts/build.js b/scripts/build.js new file mode 100644 index 0000000..e18f696 --- /dev/null +++ b/scripts/build.js @@ -0,0 +1,27 @@ +'use strict'; + +const path = require('path'); +const fsp = require('./fsp'); +const loadThemes = require('./loadThemes'); + +const THEME_DIR = path.join(__dirname, '..', 'theme'); +const THEME_YAML_FILE = path.join(__dirname, '..', 'src', 'dracula.yml'); + +function toJSON(theme) { + return JSON.stringify(theme, null, 4); +} + +(async () => { + if (!(await fsp.exists(THEME_DIR))) { + await fsp.mkdir(THEME_DIR); + } + + const { standardTheme, softTheme } = await loadThemes(THEME_YAML_FILE); + const standardThemePath = path.join(THEME_DIR, 'dracula.json'); + const softThemePath = path.join(THEME_DIR, 'dracula-soft.json'); + + await Promise.all([ + fsp.writeFile(standardThemePath, toJSON(standardTheme)), + fsp.writeFile(softThemePath, toJSON(softTheme)), + ]); +})(); diff --git a/scripts/fsp.js b/scripts/fsp.js new file mode 100644 index 0000000..f685388 --- /dev/null +++ b/scripts/fsp.js @@ -0,0 +1,11 @@ +'use strict'; + +const fs = require('fs'); +const util = require('util'); + +module.exports = { + exists: util.promisify(fs.exists), + mkdir: util.promisify(fs.mkdir), + readFile: util.promisify(fs.readFile), + writeFile: util.promisify(fs.writeFile), +}; diff --git a/lint.js b/scripts/lint.js similarity index 72% rename from lint.js rename to scripts/lint.js index 368f315..19a7833 100644 --- a/lint.js +++ b/scripts/lint.js @@ -1,8 +1,8 @@ 'use strict'; const https = require('https'); -const fs = require('fs'); -const util = require('util'); +const path = require('path'); +const loadThemes = require('./loadThemes'); const get = url => new Promise((resolve, reject) => { @@ -15,8 +15,6 @@ const get = url => }); }); -const readFile = util.promisify(fs.readFile); - const THEME_COLOR_REFERENCE_URL = 'https://code.visualstudio.com/docs/getstarted/theme-color-reference'; @@ -25,6 +23,8 @@ const NOT_THEME_KEYS = [ 'editor.tokenColorCustomizations', ]; +const THEME_YAML_FILE = path.join(__dirname, '..', 'src', 'dracula.yml'); + async function scrapeThemeAvailableKeys() { const data = await get(THEME_COLOR_REFERENCE_URL); @@ -47,32 +47,19 @@ async function scrapeThemeAvailableKeys() { return availableKeys; } -async function getTheme(fileToLint) { - const fileContent = await readFile(fileToLint, 'utf8'); - const theme = JSON.parse(fileContent); - return theme; -} - (async () => { - const fileToLint = process.argv[2]; - - if (!fileToLint) { - throw new Error('You need to specify the path of the theme to lint'); - } - - const [availableKeys, theme] = await Promise.all([ + const [availableKeys, { standardTheme }] = await Promise.all([ scrapeThemeAvailableKeys(), - getTheme(fileToLint), + loadThemes(THEME_YAML_FILE), ]); - - Object.keys(theme.colors).forEach(key => { + Object.keys(standardTheme.colors).forEach(key => { if (!availableKeys.includes(key)) { console.warn(`Unsupported key "${key}", probably deprecated?`); } }); availableKeys.forEach(key => { - if (!Object.keys(theme.colors).includes(key)) { + if (!Object.keys(standardTheme.colors).includes(key)) { console.warn(`Missing key "${key}" in theme`); } }); diff --git a/scripts/loadThemes.js b/scripts/loadThemes.js new file mode 100644 index 0000000..018e189 --- /dev/null +++ b/scripts/loadThemes.js @@ -0,0 +1,33 @@ +'use strict'; + +const tinycolor = require('tinycolor2'); +const fsp = require('./fsp'); +const { loadYAML } = require('./yaml'); + +async function loadTheme(yamlFilePath) { + const standardThemeYAML = await fsp.readFile(yamlFilePath, 'utf8'); + const standardTheme = await loadYAML(standardThemeYAML); + + const softThemeYAML = getSoftThemeYAML(standardThemeYAML, standardTheme); + const softTheme = await loadYAML(softThemeYAML); + + return { standardTheme, softTheme }; +} + +function getSoftThemeYAML(fileContent, standardTheme) { + const brightColors = [ + ...standardTheme.dracula.ansi, + ...standardTheme.dracula.brightOther, + ]; + + return fileContent.replace(/#[0-9A-F]{6}/g, color => { + if (brightColors.includes(color)) { + return tinycolor(color) + .desaturate(20) + .toHexString(); + } + return color; + }); +} + +module.exports = loadTheme; diff --git a/scripts/yaml.js b/scripts/yaml.js new file mode 100644 index 0000000..2828289 --- /dev/null +++ b/scripts/yaml.js @@ -0,0 +1,19 @@ +'use strict'; + +const { Type, Schema, load } = require('js-yaml'); + +const withAlphaType = new Type('!alpha', { + kind: 'sequence', + construct: ([hexRGB, alpha]) => hexRGB + alpha, + represent: ([hexRGB, alpha]) => hexRGB + alpha, +}); + +const schema = Schema.create([withAlphaType]); + +async function loadYAML(file) { + return load(file, { schema }); +} + +module.exports = { + loadYAML, +};